diff options
| -rw-r--r-- | drivers/usb/storage/sddr09.c | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c index 74acfb08d9ed..ee1da8029fd1 100644 --- a/drivers/usb/storage/sddr09.c +++ b/drivers/usb/storage/sddr09.c @@ -1443,36 +1443,27 @@ int sddr09_transport(Scsi_Cmnd *srb, struct us_data *us) } if (srb->cmnd[0] == MODE_SENSE) { + int modepage = (srb->cmnd[2] & 0x3F); + int len; - // Read-write error recovery page: there needs to - // be a check for write-protect here + /* They ask for the Read/Write error recovery page, + or for all pages. Give as much as they have room for. */ + if (modepage == 0x01 || modepage == 0x3F) { - if ( (srb->cmnd[2] & 0x3F) == 0x01 ) { - - US_DEBUGP( - "SDDR09: Dummy up request for mode page 1\n"); + US_DEBUGP("SDDR09: Dummy up request for " + "mode page 0x%x\n", modepage); - if (ptr == NULL || - srb->request_bufflen<sizeof(mode_page_01)) + if (ptr == NULL) return USB_STOR_TRANSPORT_ERROR; + len = srb->request_bufflen; + if (len > sizeof(mode_page_01)) + len = sizeof(mode_page_01); + mode_page_01[0] = sizeof(mode_page_01) - 1; mode_page_01[2] = (info->flags & SDDR09_WP) ? 0x80 : 0; - memcpy(ptr, mode_page_01, sizeof(mode_page_01)); + memcpy(ptr, mode_page_01, len); return USB_STOR_TRANSPORT_GOOD; - - } else if ( (srb->cmnd[2] & 0x3F) == 0x3F ) { - - US_DEBUGP("SDDR09: Dummy up request for " - "all mode pages\n"); - - if (ptr == NULL || - srb->request_bufflen<sizeof(mode_page_01)) - return USB_STOR_TRANSPORT_ERROR; - - memcpy(ptr, mode_page_01, sizeof(mode_page_01)); - return USB_STOR_TRANSPORT_GOOD; - } return USB_STOR_TRANSPORT_ERROR; |
