]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/scsi_scan.c
Merge branch 'linux-next' of git://git.infradead.org/~dedekind/ubi-2.6
[linux-2.6-omap-h63xx.git] / drivers / scsi / scsi_scan.c
index 334862e26a1b75d3d7cb01f9cff9811ecfa81046..18486b51668da7a3591c3112e4eb18ca123a0c8b 100644 (file)
@@ -216,7 +216,7 @@ static void scsi_unlock_floptical(struct scsi_device *sdev,
        scsi_cmd[4] = 0x2a;     /* size */
        scsi_cmd[5] = 0;
        scsi_execute_req(sdev, scsi_cmd, DMA_FROM_DEVICE, result, 0x2a, NULL,
-                        SCSI_TIMEOUT, 3);
+                        SCSI_TIMEOUT, 3, NULL);
 }
 
 /**
@@ -419,6 +419,7 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
        dev->type = &scsi_target_type;
        starget->id = id;
        starget->channel = channel;
+       starget->can_queue = 0;
        INIT_LIST_HEAD(&starget->siblings);
        INIT_LIST_HEAD(&starget->devices);
        starget->state = STARGET_CREATED;
@@ -572,6 +573,8 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
 
        /* Each pass gets up to three chances to ignore Unit Attention */
        for (count = 0; count < 3; ++count) {
+               int resid;
+
                memset(scsi_cmd, 0, 6);
                scsi_cmd[0] = INQUIRY;
                scsi_cmd[4] = (unsigned char) try_inquiry_len;
@@ -580,7 +583,8 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
 
                result = scsi_execute_req(sdev,  scsi_cmd, DMA_FROM_DEVICE,
                                          inq_result, try_inquiry_len, &sshdr,
-                                         HZ / 2 + HZ * scsi_inq_timeout, 3);
+                                         HZ / 2 + HZ * scsi_inq_timeout, 3,
+                                         &resid);
 
                SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO "scsi scan: INQUIRY %s "
                                "with code 0x%x\n",
@@ -601,6 +605,14 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
                                    (sshdr.ascq == 0))
                                        continue;
                        }
+               } else {
+                       /*
+                        * if nothing was transferred, we try
+                        * again. It's a workaround for some USB
+                        * devices.
+                        */
+                       if (resid == try_inquiry_len)
+                               continue;
                }
                break;
        }
@@ -1389,7 +1401,7 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags,
 
                result = scsi_execute_req(sdev, scsi_cmd, DMA_FROM_DEVICE,
                                          lun_data, length, &sshdr,
-                                         SCSI_TIMEOUT + 4 * HZ, 3);
+                                         SCSI_TIMEOUT + 4 * HZ, 3, NULL);
 
                SCSI_LOG_SCAN_BUS(3, printk (KERN_INFO "scsi scan: REPORT LUNS"
                                " %s (try %d) result 0x%x\n", result