| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Tue, 16 May 2017 11:47:42 -0400 |
| Subject: USB: ene_usb6250: fix first command execution |
| |
| From: Alan Stern <stern@rowland.harvard.edu> |
| |
| |
| [ Upstream commit 4b309f1c4972c8f09e03ac64fc63510dbf5591a4 ] |
| |
| In the ene_usb6250 sub-driver for usb-storage, the ene_transport() |
| routine is supposed to initialize the driver before executing the |
| current command, if the initialization has not already been performed. |
| However, a bug in the routine causes it to skip the command after |
| doing the initialization. Also, the routine does not return an |
| appropriate error code if either the initialization or the command |
| fails. |
| |
| As a result of the first bug, the first command (a SCSI INQUIRY) is |
| not carried out. The results can be seen in the system log, in the |
| form of a warning message and empty or garbage INQUIRY data: |
| |
| Apr 18 22:40:08 notebook2 kernel: scsi host6: scsi scan: INQUIRY result too short (5), using 36 |
| Apr 18 22:40:08 notebook2 kernel: scsi 6:0:0:0: Direct-Access PQ: 0 ANSI: 0 |
| |
| This patch fixes both errors. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| Reported-and-tested-by: Andreas Hartmann <andihartmann@01019freenet.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/storage/ene_ub6250.c | 9 +++++---- |
| 1 file changed, 5 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/usb/storage/ene_ub6250.c |
| +++ b/drivers/usb/storage/ene_ub6250.c |
| @@ -2295,21 +2295,22 @@ static int ms_scsi_irp(struct us_data *u |
| |
| static int ene_transport(struct scsi_cmnd *srb, struct us_data *us) |
| { |
| - int result = 0; |
| + int result = USB_STOR_XFER_GOOD; |
| struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra); |
| |
| /*US_DEBUG(usb_stor_show_command(us, srb)); */ |
| scsi_set_resid(srb, 0); |
| - if (unlikely(!(info->SD_Status.Ready || info->MS_Status.Ready))) { |
| + if (unlikely(!(info->SD_Status.Ready || info->MS_Status.Ready))) |
| result = ene_init(us); |
| - } else { |
| + if (result == USB_STOR_XFER_GOOD) { |
| + result = USB_STOR_TRANSPORT_ERROR; |
| if (info->SD_Status.Ready) |
| result = sd_scsi_irp(us, srb); |
| |
| if (info->MS_Status.Ready) |
| result = ms_scsi_irp(us, srb); |
| } |
| - return 0; |
| + return result; |
| } |
| |
| static struct scsi_host_template ene_ub6250_host_template; |