|
@@ -84,6 +84,7 @@ static void init_device_slot_control(unsigned char *dest_desc,
|
|
|
static int ses_recv_diag(struct scsi_device *sdev, int page_code,
|
|
|
void *buf, int bufflen)
|
|
|
{
|
|
|
+ int ret;
|
|
|
unsigned char cmd[] = {
|
|
|
RECEIVE_DIAGNOSTIC,
|
|
|
1, /* Set PCV bit */
|
|
@@ -92,9 +93,26 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
|
|
|
bufflen & 0xff,
|
|
|
0
|
|
|
};
|
|
|
+ unsigned char recv_page_code;
|
|
|
|
|
|
- return scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
|
|
|
+ ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
|
|
|
NULL, SES_TIMEOUT, SES_RETRIES, NULL);
|
|
|
+ if (unlikely(!ret))
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ recv_page_code = ((unsigned char *)buf)[0];
|
|
|
+
|
|
|
+ if (likely(recv_page_code == page_code))
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ /* successful diagnostic but wrong page code. This happens to some
|
|
|
+ * USB devices, just print a message and pretend there was an error */
|
|
|
+
|
|
|
+ sdev_printk(KERN_ERR, sdev,
|
|
|
+ "Wrong diagnostic page; asked for %d got %u\n",
|
|
|
+ page_code, recv_page_code);
|
|
|
+
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
static int ses_send_diag(struct scsi_device *sdev, int page_code,
|