USB: usb-storage: add BAD_SENSE flag
[safe/jmp/linux-2.6] / drivers / usb / storage / usb.c
index 7835484..f5c0264 100644 (file)
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#ifdef CONFIG_USB_STORAGE_DEBUG
+#define DEBUG
+#endif
+
 #include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/freezer.h>
@@ -459,6 +463,9 @@ static void adjust_quirks(struct us_data *us)
                case 'a':
                        f |= US_FL_SANE_SENSE;
                        break;
+               case 'b':
+                       f |= US_FL_BAD_SENSE;
+                       break;
                case 'c':
                        f |= US_FL_FIX_CAPACITY;
                        break;
@@ -808,14 +815,13 @@ static int usb_stor_scan_thread(void * __us)
 {
        struct us_data *us = (struct us_data *)__us;
 
-       printk(KERN_DEBUG
-               "usb-storage: device found at %d\n", us->pusb_dev->devnum);
+       dev_dbg(&us->pusb_intf->dev, "device found\n");
 
        set_freezable();
        /* Wait for the timeout to expire or for a disconnect */
        if (delay_use > 0) {
-               printk(KERN_DEBUG "usb-storage: waiting for device "
-                               "to settle before scanning\n");
+               dev_dbg(&us->pusb_intf->dev, "waiting for device to settle "
+                               "before scanning\n");
                wait_event_freezable_timeout(us->delay_wait,
                                test_bit(US_FLIDX_DONT_SCAN, &us->dflags),
                                delay_use * HZ);
@@ -832,7 +838,7 @@ static int usb_stor_scan_thread(void * __us)
                        mutex_unlock(&us->dev_mutex);
                }
                scsi_scan_host(us_to_host(us));
-               printk(KERN_DEBUG "usb-storage: device scan complete\n");
+               dev_dbg(&us->pusb_intf->dev, "scan complete\n");
 
                /* Should we unbind if no devices were detected? */
        }
@@ -840,6 +846,15 @@ static int usb_stor_scan_thread(void * __us)
        complete_and_exit(&us->scanning_done, 0);
 }
 
+static unsigned int usb_stor_sg_tablesize(struct usb_interface *intf)
+{
+       struct usb_device *usb_dev = interface_to_usbdev(intf);
+
+       if (usb_dev->bus->sg_tablesize) {
+               return usb_dev->bus->sg_tablesize;
+       }
+       return SG_ALL;
+}
 
 /* First part of general USB mass-storage probing */
 int usb_stor_probe1(struct us_data **pus,
@@ -868,6 +883,7 @@ int usb_stor_probe1(struct us_data **pus,
         * Allow 16-byte CDBs and thus > 2TB
         */
        host->max_cmd_len = 16;
+       host->sg_tablesize = usb_stor_sg_tablesize(intf);
        *pus = us = host_to_us(host);
        memset(us, 0, sizeof(struct us_data));
        mutex_init(&(us->dev_mutex));