diff options
-rw-r--r-- | drivers/scsi/ses.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index dcb0d76d7312..7d9cec50b77d 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c | |||
@@ -84,6 +84,7 @@ static void init_device_slot_control(unsigned char *dest_desc, | |||
84 | static int ses_recv_diag(struct scsi_device *sdev, int page_code, | 84 | static int ses_recv_diag(struct scsi_device *sdev, int page_code, |
85 | void *buf, int bufflen) | 85 | void *buf, int bufflen) |
86 | { | 86 | { |
87 | int ret; | ||
87 | unsigned char cmd[] = { | 88 | unsigned char cmd[] = { |
88 | RECEIVE_DIAGNOSTIC, | 89 | RECEIVE_DIAGNOSTIC, |
89 | 1, /* Set PCV bit */ | 90 | 1, /* Set PCV bit */ |
@@ -92,9 +93,26 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code, | |||
92 | bufflen & 0xff, | 93 | bufflen & 0xff, |
93 | 0 | 94 | 0 |
94 | }; | 95 | }; |
96 | unsigned char recv_page_code; | ||
95 | 97 | ||
96 | return scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen, | 98 | ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen, |
97 | NULL, SES_TIMEOUT, SES_RETRIES, NULL); | 99 | NULL, SES_TIMEOUT, SES_RETRIES, NULL); |
100 | if (unlikely(!ret)) | ||
101 | return ret; | ||
102 | |||
103 | recv_page_code = ((unsigned char *)buf)[0]; | ||
104 | |||
105 | if (likely(recv_page_code == page_code)) | ||
106 | return ret; | ||
107 | |||
108 | /* successful diagnostic but wrong page code. This happens to some | ||
109 | * USB devices, just print a message and pretend there was an error */ | ||
110 | |||
111 | sdev_printk(KERN_ERR, sdev, | ||
112 | "Wrong diagnostic page; asked for %d got %u\n", | ||
113 | page_code, recv_page_code); | ||
114 | |||
115 | return -EINVAL; | ||
98 | } | 116 | } |
99 | 117 | ||
100 | static int ses_send_diag(struct scsi_device *sdev, int page_code, | 118 | static int ses_send_diag(struct scsi_device *sdev, int page_code, |