scsi_scan.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:28k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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