|
|
|
@ -916,6 +916,28 @@ static int usb_read_10(ccb *srb,struct us_data *ss, unsigned long start, unsigne |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_USB_BIN_FIXUP |
|
|
|
|
/*
|
|
|
|
|
* Some USB storage devices queried for SCSI identification data respond with |
|
|
|
|
* binary strings, which if output to the console freeze the terminal. The |
|
|
|
|
* workaround is to modify the vendor and product strings read from such |
|
|
|
|
* device with proper values (as reported by 'usb info'). |
|
|
|
|
* |
|
|
|
|
* Vendor and product length limits are taken from the definition of |
|
|
|
|
* block_dev_desc_t in include/part.h. |
|
|
|
|
*/ |
|
|
|
|
static void usb_bin_fixup(struct usb_device_descriptor descriptor, |
|
|
|
|
unsigned char vendor[], |
|
|
|
|
unsigned char product[]) { |
|
|
|
|
const unsigned char max_vendor_len = 40; |
|
|
|
|
const unsigned char max_product_len = 20; |
|
|
|
|
if (descriptor.idVendor == 0x0424 && descriptor.idProduct == 0x223a) { |
|
|
|
|
strncpy(vendor, "SMSC", max_vendor_len); |
|
|
|
|
strncpy(product, "Flash Media Cntrller", max_product_len); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif /* CONFIG_USB_BIN_FIXUP */ |
|
|
|
|
|
|
|
|
|
#define USB_MAX_READ_BLK 20 |
|
|
|
|
|
|
|
|
|
unsigned long usb_stor_read(int device, unsigned long blknr, unsigned long blkcnt, unsigned long *buffer) |
|
|
|
@ -1171,6 +1193,9 @@ int usb_stor_get_info(struct usb_device *dev,struct us_data *ss,block_dev_desc_t |
|
|
|
|
dev_desc->vendor[8] = 0; |
|
|
|
|
dev_desc->product[16] = 0; |
|
|
|
|
dev_desc->revision[4] = 0; |
|
|
|
|
#ifdef CONFIG_USB_BIN_FIXUP |
|
|
|
|
usb_bin_fixup(dev->descriptor, dev_desc->vendor, dev_desc->product); |
|
|
|
|
#endif /* CONFIG_USB_BIN_FIXUP */ |
|
|
|
|
USB_STOR_PRINTF("ISO Vers %X, Response Data %X\n",usb_stor_buf[2],usb_stor_buf[3]); |
|
|
|
|
if(usb_test_unit_ready(pccb,ss)) { |
|
|
|
|
printf("Device NOT ready\n Request Sense returned %02X %02X %02X\n",pccb->sense_buf[2],pccb->sense_buf[12],pccb->sense_buf[13]); |
|
|
|
|