aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/storage/uas.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-10-17 19:00:45 +0200
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2014-03-04 15:38:07 -0800
commit6ce8213b3328ae4a1db34339c282144740ac1ec6 (patch)
tree3d7c49e93f795913264840d714f851c501dcc94f /drivers/usb/storage/uas.c
parentd5f808d3f88e90b13a4839e07b3dc6e715e2ba88 (diff)
downloadlinux-6ce8213b3328ae4a1db34339c282144740ac1ec6.tar.gz
uas: Properly set interface to altsetting 0 on probe failure
- Rename labels to properly reflect this - Don't skip free-ing the streams when scsi_init_shared_tag_map fails Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers/usb/storage/uas.c')
-rw-r--r--drivers/usb/storage/uas.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 059ce62de4b091..ec1b22d295019f 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -993,8 +993,8 @@ static void uas_free_streams(struct uas_dev_info *devinfo)
*/
static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
- int result;
- struct Scsi_Host *shost;
+ int result = -ENOMEM;
+ struct Scsi_Host *shost = NULL;
struct uas_dev_info *devinfo;
struct usb_device *udev = interface_to_usbdev(intf);
@@ -1003,12 +1003,11 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
devinfo = kmalloc(sizeof(struct uas_dev_info), GFP_KERNEL);
if (!devinfo)
- return -ENOMEM;
+ goto set_alt0;
- result = -ENOMEM;
shost = scsi_host_alloc(&uas_host_template, sizeof(void *));
if (!shost)
- goto free;
+ goto set_alt0;
shost->max_cmd_len = 16 + 252;
shost->max_id = 1;
@@ -1030,11 +1029,11 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
result = scsi_init_shared_tag_map(shost, devinfo->qdepth - 3);
if (result)
- goto free;
+ goto free_streams;
result = scsi_add_host(shost, &intf->dev);
if (result)
- goto deconfig_eps;
+ goto free_streams;
shost->hostdata[0] = (unsigned long)devinfo;
@@ -1042,9 +1041,10 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
usb_set_intfdata(intf, shost);
return result;
-deconfig_eps:
+free_streams:
uas_free_streams(devinfo);
- free:
+set_alt0:
+ usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
kfree(devinfo);
if (shost)
scsi_host_put(shost);