OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [scsi/] [scsi_scan.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *  scsi_scan.c Copyright (C) 2000 Eric Youngdale
3
 *
4
 *  Bus scan logic.
5
 *
6
 *  This used to live in scsi.c, but that file was just a laundry basket
7
 *  full of misc stuff.  This got separated out in order to make things
8
 *  clearer.
9
 */
10
 
11
#define __NO_VERSION__
12
#include <linux/config.h>
13
#include <linux/module.h>
14
#include <linux/init.h>
15
 
16
#include <linux/blk.h>
17
 
18
#include "scsi.h"
19
#include "hosts.h"
20
#include "constants.h"
21
 
22
#ifdef CONFIG_KMOD
23
#include <linux/kmod.h>
24
#endif
25
 
26
/*
27
 * Flags for irregular SCSI devices that need special treatment
28
 */
29
#define BLIST_NOLUN             0x001   /* Don't scan for LUNs */
30
#define BLIST_FORCELUN          0x002   /* Known to have LUNs, force sanning */
31
#define BLIST_BORKEN            0x004   /* Flag for broken handshaking */
32
#define BLIST_KEY               0x008   /* Needs to be unlocked by special command */
33
#define BLIST_SINGLELUN         0x010   /* LUNs should better not be used in parallel */
34
#define BLIST_NOTQ              0x020   /* Buggy Tagged Command Queuing */
35
#define BLIST_SPARSELUN         0x040   /* Non consecutive LUN numbering */
36
#define BLIST_MAX5LUN           0x080   /* Avoid LUNS >= 5 */
37
#define BLIST_ISDISK            0x100   /* Treat as (removable) disk */
38
#define BLIST_ISROM             0x200   /* Treat as (removable) CD-ROM */
39
#define BLIST_LARGELUN          0x400   /* LUNs larger than 7 despite reporting as SCSI 2 */
40
#define BLIST_NOSTARTONADD      0x1000  /* do not do automatic start on add */
41
 
42
 
43
static void print_inquiry(unsigned char *data);
44
static int scan_scsis_single(unsigned int channel, unsigned int dev,
45
                unsigned int lun, int lun0_scsi_level,
46
                unsigned int *max_scsi_dev, unsigned int *sparse_lun,
47
                Scsi_Device ** SDpnt, struct Scsi_Host *shpnt,
48
                char *scsi_result);
49
static int find_lun0_scsi_level(unsigned int channel, unsigned int dev,
50
                                struct Scsi_Host *shpnt);
51
 
52
struct dev_info {
53
        const char *vendor;
54
        const char *model;
55
        const char *revision;   /* Latest revision known to be bad.  Not used yet */
56
        unsigned flags;
57
};
58
 
59
/*
60
 * This is what was previously known as the blacklist.  The concept
61
 * has been expanded so that we can specify other types of things we
62
 * need to be aware of.
63
 */
64
static struct dev_info device_list[] =
65
{
66
/* The following devices are known not to tolerate a lun != 0 scan for
67
 * one reason or another.  Some will respond to all luns, others will
68
 * lock up.
69
 */
70
        {"Aashima", "IMAGERY 2400SP", "1.03", BLIST_NOLUN},     /* Locks up if polled for lun != 0 */
71
        {"CHINON", "CD-ROM CDS-431", "H42", BLIST_NOLUN},       /* Locks up if polled for lun != 0 */
72
        {"CHINON", "CD-ROM CDS-535", "Q14", BLIST_NOLUN},       /* Locks up if polled for lun != 0 */
73
        {"DENON", "DRD-25X", "V", BLIST_NOLUN},                 /* Locks up if probed for lun != 0 */
74
        {"HITACHI", "DK312C", "CM81", BLIST_NOLUN},             /* Responds to all lun - dtg */
75
        {"HITACHI", "DK314C", "CR21", BLIST_NOLUN},             /* responds to all lun */
76
        {"IMS", "CDD521/10", "2.06", BLIST_NOLUN},              /* Locks-up when LUN>0 polled. */
77
        {"MAXTOR", "XT-3280", "PR02", BLIST_NOLUN},             /* Locks-up when LUN>0 polled. */
78
        {"MAXTOR", "XT-4380S", "B3C", BLIST_NOLUN},             /* Locks-up when LUN>0 polled. */
79
        {"MAXTOR", "MXT-1240S", "I1.2", BLIST_NOLUN},           /* Locks up when LUN>0 polled */
80
        {"MAXTOR", "XT-4170S", "B5A", BLIST_NOLUN},             /* Locks-up sometimes when LUN>0 polled. */
81
        {"MAXTOR", "XT-8760S", "B7B", BLIST_NOLUN},             /* guess what? */
82
        {"MEDIAVIS", "RENO CD-ROMX2A", "2.03", BLIST_NOLUN},    /*Responds to all lun */
83
        {"NEC", "CD-ROM DRIVE:841", "1.0", BLIST_NOLUN},        /* Locks-up when LUN>0 polled. */
84
        {"PHILIPS", "PCA80SC", "V4-2", BLIST_NOLUN},            /* Responds to all lun */
85
        {"RODIME", "RO3000S", "2.33", BLIST_NOLUN},             /* Locks up if polled for lun != 0 */
86
        {"SANYO", "CRD-250S", "1.20", BLIST_NOLUN},             /* causes failed REQUEST SENSE on lun 1
87
                                                                 * for aha152x controller, which causes
88
                                                                 * SCSI code to reset bus.*/
89
        {"SEAGATE", "ST157N", "\004|j", BLIST_NOLUN},           /* causes failed REQUEST SENSE on lun 1
90
                                                                 * for aha152x controller, which causes
91
                                                                 * SCSI code to reset bus.*/
92
        {"SEAGATE", "ST296", "921", BLIST_NOLUN},               /* Responds to all lun */
93
        {"SEAGATE", "ST1581", "6538", BLIST_NOLUN},             /* Responds to all lun */
94
        {"SONY", "CD-ROM CDU-541", "4.3d", BLIST_NOLUN},
95
        {"SONY", "CD-ROM CDU-55S", "1.0i", BLIST_NOLUN},
96
        {"SONY", "CD-ROM CDU-561", "1.7x", BLIST_NOLUN},
97
        {"SONY", "CD-ROM CDU-8012", "*", BLIST_NOLUN},
98
        {"TANDBERG", "TDC 3600", "U07", BLIST_NOLUN},           /* Locks up if polled for lun != 0 */
99
        {"TEAC", "CD-R55S", "1.0H", BLIST_NOLUN},               /* Locks up if polled for lun != 0 */
100
        {"TEAC", "CD-ROM", "1.06", BLIST_NOLUN},                /* causes failed REQUEST SENSE on lun 1
101
                                                                 * for seagate controller, which causes
102
                                                                 * SCSI code to reset bus.*/
103
        {"TEAC", "MT-2ST/45S2-27", "RV M", BLIST_NOLUN},        /* Responds to all lun */
104
        {"TEXEL", "CD-ROM", "1.06", BLIST_NOLUN},               /* causes failed REQUEST SENSE on lun 1
105
                                                                 * for seagate controller, which causes
106
                                                                 * SCSI code to reset bus.*/
107
        {"QUANTUM", "LPS525S", "3110", BLIST_NOLUN},            /* Locks sometimes if polled for lun != 0 */
108
        {"QUANTUM", "PD1225S", "3110", BLIST_NOLUN},            /* Locks sometimes if polled for lun != 0 */
109
        {"QUANTUM", "FIREBALL ST4.3S", "0F0C", BLIST_NOLUN},    /* Locks up when polled for lun != 0 */
110
        {"MEDIAVIS", "CDR-H93MV", "1.31", BLIST_NOLUN},         /* Locks up if polled for lun != 0 */
111
        {"SANKYO", "CP525", "6.64", BLIST_NOLUN},               /* causes failed REQ SENSE, extra reset */
112
        {"HP", "C1750A", "3226", BLIST_NOLUN},                  /* scanjet iic */
113
        {"HP", "C1790A", "", BLIST_NOLUN},                      /* scanjet iip */
114
        {"HP", "C2500A", "", BLIST_NOLUN},                      /* scanjet iicx */
115
        {"HP", "A6188A", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7100 Array */
116
        {"HP", "A6189A", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7400 Array */
117
        {"HP", "A6189B", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7110 Array */
118
        {"HP", "A6218A", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7410 Array */
119
        {"YAMAHA", "CDR100", "1.00", BLIST_NOLUN},              /* Locks up if polled for lun != 0 */
120
        {"YAMAHA", "CDR102", "1.00", BLIST_NOLUN},              /* Locks up if polled for lun != 0
121
                                                                 * extra reset */
122
        {"YAMAHA", "CRW8424S", "1.0", BLIST_NOLUN},             /* Locks up if polled for lun != 0 */
123
        {"YAMAHA", "CRW6416S", "1.0c", BLIST_NOLUN},            /* Locks up if polled for lun != 0 */
124
        {"MITSUMI", "CD-R CR-2201CS", "6119", BLIST_NOLUN},     /* Locks up if polled for lun != 0 */
125
        {"RELISYS", "Scorpio", "*", BLIST_NOLUN},               /* responds to all LUN */
126
        {"RELISYS", "VM3530+", "*", BLIST_NOLUN},               /* responds to all LUN */
127
        {"ACROSS", "", "*", BLIST_NOLUN},                       /* responds to all LUN */
128
        {"MICROTEK", "ScanMaker II", "5.61", BLIST_NOLUN},      /* responds to all LUN */
129
 
130
/*
131
 * Other types of devices that have special flags.
132
 */
133
        {"SONY", "CD-ROM CDU-8001", "*", BLIST_BORKEN},
134
        {"TEXEL", "CD-ROM", "1.06", BLIST_BORKEN},
135
        {"IOMEGA", "Io20S         *F", "*", BLIST_KEY},
136
        {"INSITE", "Floptical   F*8I", "*", BLIST_KEY},
137
        {"INSITE", "I325VM", "*", BLIST_KEY},
138
        {"LASOUND","CDX7405","3.10", BLIST_MAX5LUN | BLIST_SINGLELUN},
139
        {"MICROP", "4110", "*", BLIST_NOTQ},                    /* Buggy Tagged Queuing */
140
        {"NRC", "MBR-7", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
141
        {"NRC", "MBR-7.4", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
142
        {"REGAL", "CDC-4X", "*", BLIST_MAX5LUN | BLIST_SINGLELUN},
143
        {"NAKAMICH", "MJ-4.8S", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
144
        {"NAKAMICH", "MJ-5.16S", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
145
        {"PIONEER", "CD-ROM DRM-600", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
146
        {"PIONEER", "CD-ROM DRM-602X", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
147
        {"PIONEER", "CD-ROM DRM-604X", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
148
        {"EMULEX", "MD21/S2     ESDI", "*", BLIST_SINGLELUN},
149
        {"CANON", "IPUBJD", "*", BLIST_SPARSELUN},
150
        {"nCipher", "Fastness Crypto", "*", BLIST_FORCELUN},
151
        {"DEC","HSG80","*", BLIST_FORCELUN | BLIST_NOSTARTONADD},
152
        {"COMPAQ","LOGICAL VOLUME","*", BLIST_FORCELUN},
153
        {"COMPAQ","CR3500","*", BLIST_FORCELUN},
154
        {"NEC", "PD-1 ODX654P", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
155
        {"MATSHITA", "PD-1", "*", BLIST_FORCELUN | BLIST_SINGLELUN},
156
        {"iomega", "jaz 1GB", "J.86", BLIST_NOTQ | BLIST_NOLUN},
157
        {"TOSHIBA","CDROM","*", BLIST_ISROM},
158
        {"TOSHIBA","CD-ROM","*", BLIST_ISROM},
159
        {"MegaRAID", "LD", "*", BLIST_FORCELUN},
160
        {"DGC",  "RAID",      "*", BLIST_SPARSELUN | BLIST_LARGELUN}, // Dell PV 650F (tgt @ LUN 0)
161
        {"DGC",  "DISK",      "*", BLIST_SPARSELUN | BLIST_LARGELUN}, // Dell PV 650F (no tgt @ LUN 0) 
162
        {"DELL", "PV660F",   "*", BLIST_SPARSELUN | BLIST_LARGELUN},
163
        {"DELL", "PV660F   PSEUDO",   "*", BLIST_SPARSELUN | BLIST_LARGELUN},
164
        {"DELL", "PSEUDO DEVICE .",   "*", BLIST_SPARSELUN | BLIST_LARGELUN}, // Dell PV 530F
165
        {"DELL", "PV530F",    "*", BLIST_SPARSELUN | BLIST_LARGELUN}, // Dell PV 530F
166
        {"EMC", "SYMMETRIX", "*", BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN},
167
        {"HP", "A6189A", "*", BLIST_SPARSELUN |  BLIST_LARGELUN}, // HP VA7400, by Alar Aun
168
        {"HP", "OPEN-", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, /* HP XP Arrays */
169
        {"CMD", "CRA-7280", "*", BLIST_SPARSELUN | BLIST_LARGELUN},   // CMD RAID Controller
170
        {"CNSI", "G7324", "*", BLIST_SPARSELUN | BLIST_LARGELUN},     // Chaparral G7324 RAID
171
        {"CNSi", "G8324", "*", BLIST_SPARSELUN | BLIST_LARGELUN},     // Chaparral G8324 RAID
172
        {"Zzyzx", "RocketStor 500S", "*", BLIST_SPARSELUN},
173
        {"Zzyzx", "RocketStor 2000", "*", BLIST_SPARSELUN},
174
        {"SONY", "TSL",       "*", BLIST_FORCELUN},  // DDS3 & DDS4 autoloaders
175
        {"DELL", "PERCRAID", "*", BLIST_FORCELUN},
176
        {"HP", "NetRAID-4M", "*", BLIST_FORCELUN},
177
        {"ADAPTEC", "AACRAID", "*", BLIST_FORCELUN},
178
        {"ADAPTEC", "Adaptec 5400S", "*", BLIST_FORCELUN},
179
        {"APPLE", "Xserve", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
180
        {"COMPAQ", "MSA1000", "*", BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_NOSTARTONADD},
181
        {"COMPAQ", "MSA1000 VOLUME", "*", BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_NOSTARTONADD},
182
        {"COMPAQ", "HSV110", "*", BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_NOSTARTONADD},
183
        {"HP", "HSV100", "*", BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_NOSTARTONADD},
184
        {"HP", "C1557A", "*", BLIST_FORCELUN},
185
        {"IBM", "AuSaV1S2", "*", BLIST_FORCELUN},
186
        {"FSC", "CentricStor", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
187
        {"DDN", "SAN DataDirector", "*", BLIST_SPARSELUN},
188
        {"HITACHI", "DF400", "*", BLIST_SPARSELUN},
189
        {"HITACHI", "DF500", "*", BLIST_SPARSELUN},
190
        {"HITACHI", "DF600", "*", BLIST_SPARSELUN},
191
        {"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
192
        {"HITACHI", "OPEN-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},  /* HITACHI XP Arrays */
193
        {"HITACHI", "DISK-SUBSYSTEM", "*", BLIST_SPARSELUN | BLIST_LARGELUN},  /* HITACHI 9960 */
194
        {"WINSYS","FLASHDISK G6", "*", BLIST_SPARSELUN},
195
        {"DotHill","SANnet RAID X300", "*", BLIST_SPARSELUN},
196
        {"SUN", "T300", "*", BLIST_SPARSELUN},
197
        {"SUN", "T4", "*", BLIST_SPARSELUN},
198
        {"SGI", "RAID3", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
199
        {"SGI", "RAID5", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
200
        {"SGI", "TP9100", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
201
        {"SGI", "TP9300", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
202
        {"SGI", "TP9400", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
203
        {"SGI", "TP9500", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
204
        {"MYLEX", "DACARMRB", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
205
        {"PLATYPUS", "CX5", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
206
        {"Raidtec", "FCR", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
207
        {"HP", "C7200", "*", BLIST_SPARSELUN},                  /* Medium Changer */
208
        {"SMSC", "USB 2 HS", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
209
        {"XYRATEX", "RS", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
210
        {"NEC", "iStorage", "*", BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN},
211
 
212
        /*
213
         * Must be at end of list...
214
         */
215
        {NULL, NULL, NULL}
216
};
217
 
218
#define MAX_SCSI_LUNS 0xFFFFFFFF
219
 
220
#ifdef CONFIG_SCSI_MULTI_LUN
221
static unsigned int max_scsi_luns = MAX_SCSI_LUNS;
222
#else
223
static unsigned int max_scsi_luns = 1;
224
#endif
225
 
226
static unsigned int scsi_allow_ghost_devices = 0;
227
 
228
#ifdef MODULE
229
 
230
MODULE_PARM(max_scsi_luns, "i");
231
MODULE_PARM_DESC(max_scsi_luns, "last scsi LUN (should be between 1 and 2^32-1)");
232
MODULE_PARM(scsi_allow_ghost_devices, "i");
233
MODULE_PARM_DESC(scsi_allow_ghost_devices, "allow devices marked as being offline to be accessed anyway (0 = off, else allow ghosts on lun 0 through scsi_allow_ghost_devices - 1");
234
 
235
#else
236
 
237
static int __init scsi_luns_setup(char *str)
238
{
239
        unsigned int tmp;
240
 
241
        if (get_option(&str, &tmp) == 1) {
242
                max_scsi_luns = tmp;
243
                return 1;
244
        } else {
245
                printk("scsi_luns_setup : usage max_scsi_luns=n "
246
                       "(n should be between 1 and 2^32-1)\n");
247
                return 0;
248
        }
249
}
250
 
251
__setup("max_scsi_luns=", scsi_luns_setup);
252
 
253
static int __init scsi_allow_ghost_devices_setup(char *str)
254
{
255
        unsigned int tmp;
256
 
257
        if (get_option(&str, &tmp) == 1) {
258
                scsi_allow_ghost_devices = tmp;
259
                return 1;
260
        } else {
261
                printk("scsi_allow_ghost_devices_setup: usage scsi_allow_ghost_devices=n (0: off else\nallow ghost devices (ghost devices are devices that report themselves as\nbeing offline but which we allow access to anyway) on lun 0 through n - 1.\n");
262
                return 0;
263
        }
264
}
265
 
266
__setup("scsi_allow_ghost_devices=", scsi_allow_ghost_devices_setup);
267
 
268
#endif
269
 
270
static void print_inquiry(unsigned char *data)
271
{
272
        int i;
273
 
274
        printk("  Vendor: ");
275
        for (i = 8; i < 16; i++) {
276
                if (data[i] >= 0x20 && i < data[4] + 5)
277
                        printk("%c", data[i]);
278
                else
279
                        printk(" ");
280
        }
281
 
282
        printk("  Model: ");
283
        for (i = 16; i < 32; i++) {
284
                if (data[i] >= 0x20 && i < data[4] + 5)
285
                        printk("%c", data[i]);
286
                else
287
                        printk(" ");
288
        }
289
 
290
        printk("  Rev: ");
291
        for (i = 32; i < 36; i++) {
292
                if (data[i] >= 0x20 && i < data[4] + 5)
293
                        printk("%c", data[i]);
294
                else
295
                        printk(" ");
296
        }
297
 
298
        printk("\n");
299
 
300
        i = data[0] & 0x1f;
301
 
302
        printk("  Type:   %s ",
303
               i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] : "Unknown          ");
304
        printk("                 ANSI SCSI revision: %02x", data[2] & 0x07);
305
        if ((data[2] & 0x07) == 1 && (data[3] & 0x0f) == 1)
306
                printk(" CCS\n");
307
        else
308
                printk("\n");
309
}
310
 
311
static int get_device_flags(unsigned char *response_data)
312
{
313
        int i = 0;
314
        unsigned char *pnt;
315
        for (i = 0; 1; i++) {
316
                if (device_list[i].vendor == NULL)
317
                        return 0;
318
                pnt = &response_data[8];
319
                while (*pnt && *pnt == ' ')
320
                        pnt++;
321
                if (memcmp(device_list[i].vendor, pnt,
322
                           strlen(device_list[i].vendor)))
323
                        continue;
324
                pnt = &response_data[16];
325
                while (*pnt && *pnt == ' ')
326
                        pnt++;
327
                if (memcmp(device_list[i].model, pnt,
328
                           strlen(device_list[i].model)))
329
                        continue;
330
                return device_list[i].flags;
331
        }
332
        return 0;
333
}
334
 
335
/*
336
 *  Detecting SCSI devices :
337
 *  We scan all present host adapter's busses,  from ID 0 to ID (max_id).
338
 *  We use the INQUIRY command, determine device type, and pass the ID /
339
 *  lun address of all sequential devices to the tape driver, all random
340
 *  devices to the disk driver.
341
 */
342
void scan_scsis(struct Scsi_Host *shpnt,
343
                       uint hardcoded,
344
                       uint hchannel,
345
                       uint hid,
346
                       uint hlun)
347
{
348
        uint channel;
349
        unsigned int dev;
350
        unsigned int lun;
351
        unsigned int max_dev_lun;
352
        unsigned char *scsi_result;
353
        unsigned char scsi_result0[256];
354
        Scsi_Device *SDpnt;
355
        Scsi_Device *SDtail;
356
        unsigned int sparse_lun;
357
        int lun0_sl;
358
 
359
        scsi_result = NULL;
360
 
361
        SDpnt = (Scsi_Device *) kmalloc(sizeof(Scsi_Device),
362
                                        GFP_ATOMIC);
363
        if (SDpnt) {
364
                memset(SDpnt, 0, sizeof(Scsi_Device));
365
                /*
366
                 * Register the queue for the device.  All I/O requests will
367
                 * come in through here.  We also need to register a pointer to
368
                 * ourselves, since the queue handler won't know what device
369
                 * the queue actually represents.   We could look it up, but it
370
                 * is pointless work.
371
                 */
372
                scsi_initialize_queue(SDpnt, shpnt);
373
                SDpnt->request_queue.queuedata = (void *) SDpnt;
374
                /* Make sure we have something that is valid for DMA purposes */
375
                scsi_result = ((!shpnt->unchecked_isa_dma)
376
                               ? &scsi_result0[0] : kmalloc(512, GFP_DMA));
377
        }
378
 
379
        if (scsi_result == NULL) {
380
                printk("Unable to obtain scsi_result buffer\n");
381
                goto leave;
382
        }
383
        /*
384
         * We must chain ourself in the host_queue, so commands can time out
385
         */
386
        SDpnt->queue_depth = 1;
387
        SDpnt->host = shpnt;
388
        SDpnt->online = TRUE;
389
 
390
        initialize_merge_fn(SDpnt);
391
 
392
        /*
393
         * Initialize the object that we will use to wait for command blocks.
394
         */
395
        init_waitqueue_head(&SDpnt->scpnt_wait);
396
 
397
        /*
398
         * Next, hook the device to the host in question.
399
         */
400
        SDpnt->prev = NULL;
401
        SDpnt->next = NULL;
402
        if (shpnt->host_queue != NULL) {
403
                SDtail = shpnt->host_queue;
404
                while (SDtail->next != NULL)
405
                        SDtail = SDtail->next;
406
 
407
                SDtail->next = SDpnt;
408
                SDpnt->prev = SDtail;
409
        } else {
410
                shpnt->host_queue = SDpnt;
411
        }
412
 
413
        /*
414
         * We need to increment the counter for this one device so we can track
415
         * when things are quiet.
416
         */
417
        if (hardcoded == 1) {
418
                Scsi_Device *oldSDpnt = SDpnt;
419
                struct Scsi_Device_Template *sdtpnt;
420
                channel = hchannel;
421
                if (channel > shpnt->max_channel)
422
                        goto leave;
423
                dev = hid;
424
                if (dev >= shpnt->max_id)
425
                        goto leave;
426
                lun = hlun;
427
                if (lun >= shpnt->max_lun)
428
                        goto leave;
429
                if ((0 == lun) || (lun > 7))
430
                        lun0_sl = SCSI_3; /* actually don't care for 0 == lun */
431
                else
432
                        lun0_sl = find_lun0_scsi_level(channel, dev, shpnt);
433
                scan_scsis_single(channel, dev, lun, lun0_sl, &max_dev_lun,
434
                                  &sparse_lun, &SDpnt, shpnt, scsi_result);
435
                if (SDpnt != oldSDpnt) {
436
 
437
                        /* it could happen the blockdevice hasn't yet been inited */
438
                        /* queue_depth() moved from scsi_proc_info() so that
439
                           it is called before scsi_build_commandblocks() */
440
                        if (shpnt->select_queue_depths != NULL)
441
                                (shpnt->select_queue_depths)(shpnt,
442
                                                             shpnt->host_queue);
443
 
444
                        for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
445
                                if (sdtpnt->init && sdtpnt->dev_noticed)
446
                                        (*sdtpnt->init) ();
447
 
448
                        for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next) {
449
                                if (sdtpnt->attach) {
450
                                        (*sdtpnt->attach) (oldSDpnt);
451
                                        if (oldSDpnt->attached) {
452
                                                scsi_build_commandblocks(oldSDpnt);
453
                                                if (0 == oldSDpnt->has_cmdblocks) {
454
                                                        printk("scan_scsis: DANGER, no command blocks\n");
455
                                                        /* What to do now ?? */
456
                                                }
457
                                        }
458
                                }
459
                        }
460
                        scsi_resize_dma_pool();
461
 
462
                        for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next) {
463
                                if (sdtpnt->finish && sdtpnt->nr_dev) {
464
                                        (*sdtpnt->finish) ();
465
                                }
466
                        }
467
                }
468
        } else {
469
                /* Actual LUN. PC ordering is 0->n IBM/spec ordering is n->0 */
470
                int order_dev;
471
 
472
                for (channel = 0; channel <= shpnt->max_channel; channel++) {
473
                        for (dev = 0; dev < shpnt->max_id; ++dev) {
474
                                if (shpnt->reverse_ordering)
475
                                        /* Shift to scanning 15,14,13... or 7,6,5,4, */
476
                                        order_dev = shpnt->max_id - dev - 1;
477
                                else
478
                                        order_dev = dev;
479
 
480
                                if (shpnt->this_id != order_dev) {
481
 
482
                                        /*
483
                                         * We need the for so our continue, etc. work fine. We put this in
484
                                         * a variable so that we can override it during the scan if we
485
                                         * detect a device *KNOWN* to have multiple logical units.
486
                                         */
487
                                        max_dev_lun = (max_scsi_luns < shpnt->max_lun ?
488
                                         max_scsi_luns : shpnt->max_lun);
489
                                        sparse_lun = 0;
490
                                        for (lun = 0, lun0_sl = SCSI_2; lun < max_dev_lun; ++lun) {
491
                                                /* don't probe further for luns > 7 for targets <= SCSI_2 */
492
                                                if ((lun0_sl < SCSI_3) && (lun > 7))
493
                                                        break;
494
 
495
                                                if (!scan_scsis_single(channel, order_dev, lun, lun0_sl,
496
                                                                       &max_dev_lun, &sparse_lun, &SDpnt, shpnt,
497
                                                                       scsi_result)
498
                                                    && !sparse_lun)
499
                                                        break;  /* break means don't probe further for luns!=0 */
500
                                                if (SDpnt && (0 == lun)) {
501
                                                        int bflags = get_device_flags (scsi_result);
502
                                                        if (bflags & BLIST_LARGELUN)
503
                                                                lun0_sl = SCSI_3; /* treat as SCSI 3 */
504
                                                        else
505
                                                                lun0_sl = SDpnt->scsi_level;
506
                                                }
507
                                        }       /* for lun ends */
508
                                }       /* if this_id != id ends */
509
                        }       /* for dev ends */
510
                }               /* for channel ends */
511
        }                       /* if/else hardcoded */
512
 
513
      leave:
514
 
515
        {                       /* Unchain SRpnt from host_queue */
516
                Scsi_Device *prev, *next;
517
                Scsi_Device *dqptr;
518
 
519
                for (dqptr = shpnt->host_queue; dqptr != SDpnt; dqptr = dqptr->next)
520
                        continue;
521
                if (dqptr) {
522
                        prev = dqptr->prev;
523
                        next = dqptr->next;
524
                        if (prev)
525
                                prev->next = next;
526
                        else
527
                                shpnt->host_queue = next;
528
                        if (next)
529
                                next->prev = prev;
530
                }
531
        }
532
 
533
        /* Last device block does not exist.  Free memory. */
534
        if (SDpnt != NULL) {
535
                blk_cleanup_queue(&SDpnt->request_queue);
536
                kfree((char *) SDpnt);
537
        }
538
 
539
        /* If we allocated a buffer so we could do DMA, free it now */
540
        if (scsi_result != &scsi_result0[0] && scsi_result != NULL) {
541
                kfree(scsi_result);
542
        } {
543
                Scsi_Device *sdev;
544
                Scsi_Cmnd *scmd;
545
 
546
                SCSI_LOG_SCAN_BUS(4, printk("Host status for host %p:\n", shpnt));
547
                for (sdev = shpnt->host_queue; sdev; sdev = sdev->next) {
548
                        SCSI_LOG_SCAN_BUS(4, printk("Device %d %p: ", sdev->id, sdev));
549
                        for (scmd = sdev->device_queue; scmd; scmd = scmd->next) {
550
                                SCSI_LOG_SCAN_BUS(4, printk("%p ", scmd));
551
                        }
552
                        SCSI_LOG_SCAN_BUS(4, printk("\n"));
553
                }
554
        }
555
}
556
 
557
/*
558
 * The worker for scan_scsis.
559
 * Returning 0 means Please don't ask further for lun!=0, 1 means OK go on.
560
 * Global variables used : scsi_devices(linked list)
561
 */
562
static int scan_scsis_single(unsigned int channel, unsigned int dev,
563
                unsigned int lun, int lun0_scsi_level,
564
                unsigned int *max_dev_lun, unsigned int *sparse_lun,
565
                Scsi_Device ** SDpnt2, struct Scsi_Host *shpnt,
566
                char *scsi_result)
567
{
568
        char devname[64];
569
        unsigned char scsi_cmd[MAX_COMMAND_SIZE];
570
        struct Scsi_Device_Template *sdtpnt;
571
        Scsi_Device *SDtail, *SDpnt = *SDpnt2;
572
        Scsi_Request * SRpnt;
573
        int bflags, type = -1;
574
        extern devfs_handle_t scsi_devfs_handle;
575
        int scsi_level;
576
 
577
        SDpnt->host = shpnt;
578
        SDpnt->id = dev;
579
        SDpnt->lun = lun;
580
        SDpnt->channel = channel;
581
        SDpnt->online = TRUE;
582
 
583
        scsi_build_commandblocks(SDpnt);
584
 
585
        /* Some low level driver could use device->type (DB) */
586
        SDpnt->type = -1;
587
 
588
        /*
589
         * Assume that the device will have handshaking problems, and then fix
590
         * this field later if it turns out it doesn't
591
         */
592
        SDpnt->borken = 1;
593
        SDpnt->was_reset = 0;
594
        SDpnt->expecting_cc_ua = 0;
595
        SDpnt->starved = 0;
596
 
597
        if (NULL == (SRpnt = scsi_allocate_request(SDpnt))) {
598
                printk("scan_scsis_single: no memory\n");
599
                return 0;
600
        }
601
 
602
        /*
603
         * We used to do a TEST_UNIT_READY before the INQUIRY but that was
604
         * not really necessary.  Spec recommends using INQUIRY to scan for
605
         * devices (and TEST_UNIT_READY to poll for media change). - Paul G.
606
         */
607
 
608
        SCSI_LOG_SCAN_BUS(3, printk("scsi: performing INQUIRY\n"));
609
        /*
610
         * Build an INQUIRY command block.
611
         */
612
        scsi_cmd[0] = INQUIRY;
613
        if ((lun > 0) && (lun0_scsi_level <= SCSI_2))
614
                scsi_cmd[1] = (lun << 5) & 0xe0;
615
        else
616
                scsi_cmd[1] = 0; /* SCSI_3 and higher, don't touch */
617
        scsi_cmd[2] = 0;
618
        scsi_cmd[3] = 0;
619
        scsi_cmd[4] = 255;
620
        scsi_cmd[5] = 0;
621
        SRpnt->sr_cmd_len = 0;
622
        SRpnt->sr_data_direction = SCSI_DATA_READ;
623
 
624
        scsi_wait_req (SRpnt, (void *) scsi_cmd,
625
                  (void *) scsi_result,
626
                  256, SCSI_TIMEOUT+4*HZ, 3);
627
 
628
        SCSI_LOG_SCAN_BUS(3, printk("scsi: INQUIRY %s with code 0x%x\n",
629
                SRpnt->sr_result ? "failed" : "successful", SRpnt->sr_result));
630
 
631
        /*
632
         * Now that we don't do TEST_UNIT_READY anymore, we must be prepared
633
         * for media change conditions here, so cannot require zero result.
634
         */
635
        if (SRpnt->sr_result) {
636
                if ((driver_byte(SRpnt->sr_result) & DRIVER_SENSE) != 0 &&
637
                    (SRpnt->sr_sense_buffer[2] & 0xf) == UNIT_ATTENTION &&
638
                    SRpnt->sr_sense_buffer[12] == 0x28 &&
639
                    SRpnt->sr_sense_buffer[13] == 0) {
640
                        /* not-ready to ready transition - good */
641
                } else {
642
                        /* assume no peripheral if any other sort of error */
643
                        scsi_release_request(SRpnt);
644
                        scsi_release_commandblocks(SDpnt);
645
                        return 0;
646
                }
647
        }
648
 
649
        /*
650
         * Check for SPARSELUN before checking the peripheral qualifier,
651
         * so sparse lun devices are completely scanned.
652
         */
653
 
654
        /*
655
         * If we are offline and we are on a LUN != 0, then skip this entry.
656
         * If we are on a BLIST_FORCELUN device this will stop the scan at
657
         * the first offline LUN (typically the correct thing to do).  If
658
         * we are on a BLIST_SPARSELUN device then this won't stop the scan,
659
         * but it will keep us from having false entries in our device
660
         * array. DL
661
         *
662
         * NOTE: Need to test this to make sure it doesn't cause problems
663
         * with tape autoloaders, multidisc CD changers, and external
664
         * RAID chassis that might use sparse luns or multiluns... DL
665
         */
666
        if (lun != 0 && (scsi_result[0] >> 5) == 1) {
667
                scsi_release_request(SRpnt);
668
                scsi_release_commandblocks(SDpnt);
669
                return 0;
670
        }
671
 
672
        /*
673
         * Get any flags for this device.
674
         */
675
        bflags = get_device_flags (scsi_result);
676
 
677
        if (bflags & BLIST_SPARSELUN) {
678
          *sparse_lun = 1;
679
        }
680
        /*
681
         * Check the peripheral qualifier field - this tells us whether LUNS
682
         * are supported here or not.
683
         */
684
        if ((scsi_result[0] >> 5) == 3) {
685
                scsi_release_request(SRpnt);
686
                return 0;        /* assume no peripheral if any sort of error */
687
        }
688
         /*   The Toshiba ROM was "gender-changed" here as an inline hack.
689
              This is now much more generic.
690
              This is a mess: What we really want is to leave the scsi_result
691
              alone, and just change the SDpnt structure. And the SDpnt is what
692
              we want print_inquiry to print.  -- REW
693
         */
694
        if (bflags & BLIST_ISDISK) {
695
                scsi_result[0] = TYPE_DISK;
696
                scsi_result[1] |= 0x80;     /* removable */
697
        }
698
 
699
        if (bflags & BLIST_ISROM) {
700
                scsi_result[0] = TYPE_ROM;
701
                scsi_result[1] |= 0x80;     /* removable */
702
        }
703
 
704
        memcpy(SDpnt->vendor, scsi_result + 8, 8);
705
        memcpy(SDpnt->model, scsi_result + 16, 16);
706
        memcpy(SDpnt->rev, scsi_result + 32, 4);
707
 
708
        SDpnt->removable = (0x80 & scsi_result[1]) >> 7;
709
        /* Use the peripheral qualifier field to determine online/offline */
710
        if ((((scsi_result[0] >> 5) & 7) == 1) &&
711
            (lun >= scsi_allow_ghost_devices))
712
                SDpnt->online = FALSE;
713
        else
714
                SDpnt->online = TRUE;
715
        SDpnt->lockable = SDpnt->removable;
716
        SDpnt->changed = 0;
717
        SDpnt->access_count = 0;
718
        SDpnt->busy = 0;
719
        SDpnt->has_cmdblocks = 0;
720
        /*
721
         * Currently, all sequential devices are assumed to be tapes, all random
722
         * devices disk, with the appropriate read only flags set for ROM / WORM
723
         * treated as RO.
724
         */
725
        switch (type = (scsi_result[0] & 0x1f)) {
726
        case TYPE_TAPE:
727
        case TYPE_DISK:
728
        case TYPE_PRINTER:
729
        case TYPE_MOD:
730
        case TYPE_PROCESSOR:
731
        case TYPE_SCANNER:
732
        case TYPE_MEDIUM_CHANGER:
733
        case TYPE_ENCLOSURE:
734
        case TYPE_COMM:
735
                SDpnt->writeable = 1;
736
                break;
737
        case TYPE_WORM:
738
        case TYPE_ROM:
739
                SDpnt->writeable = 0;
740
                break;
741
        default:
742
                printk("scsi: unknown type %d\n", type);
743
        }
744
 
745
        SDpnt->device_blocked = FALSE;
746
        SDpnt->device_busy = 0;
747
        SDpnt->single_lun = 0;
748
        SDpnt->soft_reset =
749
            (scsi_result[7] & 1) && ((scsi_result[3] & 7) == 2);
750
        SDpnt->random = (type == TYPE_TAPE) ? 0 : 1;
751
        SDpnt->type = (type & 0x1f);
752
 
753
        print_inquiry(scsi_result);
754
 
755
        sprintf (devname, "host%d/bus%d/target%d/lun%d",
756
                 SDpnt->host->host_no, SDpnt->channel, SDpnt->id, SDpnt->lun);
757
        if (SDpnt->de) printk ("DEBUG: dir: \"%s\" already exists\n", devname);
758
        else SDpnt->de = devfs_mk_dir (scsi_devfs_handle, devname, NULL);
759
 
760
        for (sdtpnt = scsi_devicelist; sdtpnt;
761
             sdtpnt = sdtpnt->next)
762
                if (sdtpnt->detect)
763
                        SDpnt->attached +=
764
                            (*sdtpnt->detect) (SDpnt);
765
 
766
        SDpnt->scsi_level = scsi_result[2] & 0x07;
767
        if (SDpnt->scsi_level >= 2 ||
768
            (SDpnt->scsi_level == 1 &&
769
             (scsi_result[3] & 0x0f) == 1))
770
                SDpnt->scsi_level++;
771
        scsi_level = SDpnt->scsi_level;
772
 
773
        /*
774
         * Accommodate drivers that want to sleep when they should be in a polling
775
         * loop.
776
         */
777
        SDpnt->disconnect = 0;
778
 
779
 
780
        /*
781
         * Set the tagged_queue flag for SCSI-II devices that purport to support
782
         * tagged queuing in the INQUIRY data.
783
         */
784
        SDpnt->tagged_queue = 0;
785
        if ((SDpnt->scsi_level >= SCSI_2) &&
786
            (scsi_result[7] & 2) &&
787
            !(bflags & BLIST_NOTQ)) {
788
                SDpnt->tagged_supported = 1;
789
                SDpnt->current_tag = 0;
790
        }
791
        /*
792
         * Some revisions of the Texel CD ROM drives have handshaking problems when
793
         * used with the Seagate controllers.  Before we know what type of device
794
         * we're talking to, we assume it's borken and then change it here if it
795
         * turns out that it isn't a TEXEL drive.
796
         */
797
        if ((bflags & BLIST_BORKEN) == 0)
798
                SDpnt->borken = 0;
799
 
800
        /*
801
         * Some devices may not want to have a start command automatically
802
         * issued when a device is added.
803
         */
804
        if (bflags & BLIST_NOSTARTONADD)
805
                SDpnt->no_start_on_add = 1;
806
 
807
        /*
808
         * If we want to only allow I/O to one of the luns attached to this device
809
         * at a time, then we set this flag.
810
         */
811
        if (bflags & BLIST_SINGLELUN)
812
                SDpnt->single_lun = 1;
813
 
814
        /*
815
         * These devices need this "key" to unlock the devices so we can use it
816
         */
817
        if ((bflags & BLIST_KEY) != 0) {
818
                printk("Unlocked floptical drive.\n");
819
                SDpnt->lockable = 0;
820
                scsi_cmd[0] = MODE_SENSE;
821
                if (shpnt->max_lun <= 8)
822
                        scsi_cmd[1] = (lun << 5) & 0xe0;
823
                else    scsi_cmd[1] = 0; /* any other idea? */
824
                scsi_cmd[2] = 0x2e;
825
                scsi_cmd[3] = 0;
826
                scsi_cmd[4] = 0x2a;
827
                scsi_cmd[5] = 0;
828
                SRpnt->sr_cmd_len = 0;
829
                SRpnt->sr_data_direction = SCSI_DATA_READ;
830
                scsi_wait_req (SRpnt, (void *) scsi_cmd,
831
                        (void *) scsi_result, 0x2a,
832
                        SCSI_TIMEOUT, 3);
833
        }
834
 
835
        scsi_release_request(SRpnt);
836
        SRpnt = NULL;
837
 
838
        scsi_release_commandblocks(SDpnt);
839
 
840
        /*
841
         * This device was already hooked up to the host in question,
842
         * so at this point we just let go of it and it should be fine.  We do need to
843
         * allocate a new one and attach it to the host so that we can further scan the bus.
844
         */
845
        SDpnt = (Scsi_Device *) kmalloc(sizeof(Scsi_Device), GFP_ATOMIC);
846
        if (!SDpnt) {
847
                printk("scsi: scan_scsis_single: Cannot malloc\n");
848
                return 0;
849
        }
850
        memset(SDpnt, 0, sizeof(Scsi_Device));
851
 
852
        *SDpnt2 = SDpnt;
853
        SDpnt->queue_depth = 1;
854
        SDpnt->host = shpnt;
855
        SDpnt->online = TRUE;
856
        SDpnt->scsi_level = scsi_level;
857
 
858
        /*
859
         * Register the queue for the device.  All I/O requests will come
860
         * in through here.  We also need to register a pointer to
861
         * ourselves, since the queue handler won't know what device
862
         * the queue actually represents.   We could look it up, but it
863
         * is pointless work.
864
         */
865
        scsi_initialize_queue(SDpnt, shpnt);
866
        SDpnt->host = shpnt;
867
        initialize_merge_fn(SDpnt);
868
 
869
        /*
870
         * Mark this device as online, or otherwise we won't be able to do much with it.
871
         */
872
        SDpnt->online = TRUE;
873
 
874
        /*
875
         * Initialize the object that we will use to wait for command blocks.
876
         */
877
        init_waitqueue_head(&SDpnt->scpnt_wait);
878
 
879
        /*
880
         * Since we just found one device, there had damn well better be one in the list
881
         * already.
882
         */
883
        if (shpnt->host_queue == NULL)
884
                panic("scan_scsis_single: Host queue == NULL\n");
885
 
886
        SDtail = shpnt->host_queue;
887
        while (SDtail->next) {
888
                SDtail = SDtail->next;
889
        }
890
 
891
        /* Add this device to the linked list at the end */
892
        SDtail->next = SDpnt;
893
        SDpnt->prev = SDtail;
894
        SDpnt->next = NULL;
895
 
896
        /*
897
         * Some scsi devices cannot be polled for lun != 0 due to firmware bugs
898
         */
899
        if (bflags & BLIST_NOLUN)
900
                return 0;        /* break; */
901
 
902
        /*
903
         * If this device is known to support sparse multiple units, override the
904
         * other settings, and scan all of them.
905
         */
906
        if (bflags & BLIST_SPARSELUN) {
907
                *max_dev_lun = shpnt->max_lun;
908
                *sparse_lun = 1;
909
                return 1;
910
        }
911
        /*
912
         * If this device is known to support multiple units, override the other
913
         * settings, and scan all of them.
914
         */
915
        if (bflags & BLIST_FORCELUN) {
916
                /*
917
                 * Scanning MAX_SCSI_LUNS units would be a bad idea.
918
                 * Any better idea?
919
                 * I think we need REPORT LUNS in future to avoid scanning
920
                 * of unused LUNs. But, that is another item.
921
                 */
922
                /*
923
                if (*max_dev_lun < shpnt->max_lun)
924
                        *max_dev_lun = shpnt->max_lun;
925
                else    if ((max_scsi_luns >> 1) >= *max_dev_lun)
926
                                *max_dev_lun += shpnt->max_lun;
927
                        else    *max_dev_lun = max_scsi_luns;
928
                */
929
                /*
930
                 * Blech...the above code is broken.  When you have a device
931
                 * that is present, and it is a FORCELUN device, then we
932
                 * need to scan *all* the luns on that device.  Besides,
933
                 * skipping the scanning of LUNs is a false optimization.
934
                 * Scanning for a LUN on a present device is a very fast
935
                 * operation, it's scanning for devices that don't exist that
936
                 * is expensive and slow (although if you are truly scanning
937
                 * through MAX_SCSI_LUNS devices that would be bad, I hope
938
                 * all of the controllers out there set a reasonable value
939
                 * in shpnt->max_lun).  DL
940
                 */
941
                *max_dev_lun = shpnt->max_lun;
942
                return 1;
943
        }
944
        /*
945
         * REGAL CDC-4X: avoid hang after LUN 4
946
         */
947
        if (bflags & BLIST_MAX5LUN) {
948
                *max_dev_lun = 5;
949
                return 1;
950
        }
951
 
952
        /*
953
         * We assume the device can't handle lun!=0 if: - it reports scsi-0
954
         * (ANSI SCSI Revision 0) (old drives like MAXTOR XT-3280) or - it
955
         * reports scsi-1 (ANSI SCSI Revision 1) and Response Data Format 0
956
         */
957
        if (((scsi_result[2] & 0x07) == 0)
958
            ||
959
            ((scsi_result[2] & 0x07) == 1 &&
960
             (scsi_result[3] & 0x0f) == 0))
961
                return 0;
962
        return 1;
963
}
964
 
965
/*
966
 * The worker for scan_scsis.
967
 * Returns the scsi_level of lun0 on this host, channel and dev (if already
968
 * known), otherwise returns SCSI_2.
969
 */
970
static int find_lun0_scsi_level(unsigned int channel, unsigned int dev,
971
                                struct Scsi_Host *shpnt)
972
{
973
        int res = SCSI_2;
974
        Scsi_Device *SDpnt;
975
 
976
        for (SDpnt = shpnt->host_queue; SDpnt; SDpnt = SDpnt->next)
977
        {
978
                if ((0 == SDpnt->lun) && (dev == SDpnt->id) &&
979
                    (channel == SDpnt->channel))
980
                        return (int)SDpnt->scsi_level;
981
        }
982
        /* haven't found lun0, should send INQUIRY but take easy route */
983
        return res;
984
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.