lkml.org 
[lkml]   [2010]   [Dec]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/5] uas: Ensure we only bind to a UAS interface
    Date
    From: Matthew Wilcox <matthew@wil.cx>

    While all existing UAS devices use alternate interface 1, this is not
    guaranteed, and it has caused confusion with people trying to bind the
    uas driver to non-uas devices.

    Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
    ---
    drivers/usb/storage/uas.c | 37 ++++++++++++++++++++++++++++++-------
    1 files changed, 30 insertions(+), 7 deletions(-)

    diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
    index f82787f..0ebe7f6 100644
    --- a/drivers/usb/storage/uas.c
    +++ b/drivers/usb/storage/uas.c
    @@ -581,6 +581,34 @@ static struct usb_device_id uas_usb_ids[] = {
    };
    MODULE_DEVICE_TABLE(usb, uas_usb_ids);

    +static int uas_is_interface(struct usb_host_interface *intf)
    +{
    + return (intf->desc.bInterfaceClass == USB_CLASS_MASS_STORAGE &&
    + intf->desc.bInterfaceSubClass == USB_SC_SCSI &&
    + intf->desc.bInterfaceProtocol == USB_PR_UAS);
    +}
    +
    +static int uas_switch_interface(struct usb_device *udev,
    + struct usb_interface *intf)
    +{
    + int i;
    +
    + if (uas_is_interface(intf->cur_altsetting))
    + return 0;
    +
    + for (i = 0; i < intf->num_altsetting; i++) {
    + struct usb_host_interface *alt = &intf->altsetting[i];
    + if (alt == intf->cur_altsetting)
    + continue;
    + if (uas_is_interface(alt))
    + return usb_set_interface(udev,
    + alt->desc.bInterfaceNumber,
    + alt->desc.bAlternateSetting);
    + }
    +
    + return -ENODEV;
    +}
    +
    static void uas_configure_endpoints(struct uas_dev_info *devinfo)
    {
    struct usb_host_endpoint *eps[4] = { };
    @@ -654,13 +682,8 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
    struct uas_dev_info *devinfo;
    struct usb_device *udev = interface_to_usbdev(intf);

    - if (id->bInterfaceProtocol == 0x50) {
    - int ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
    -/* XXX: Shouldn't assume that 1 is the alternative we want */
    - int ret = usb_set_interface(udev, ifnum, 1);
    - if (ret)
    - return -ENODEV;
    - }
    + if (uas_switch_interface(udev, intf))
    + return -ENODEV;

    devinfo = kmalloc(sizeof(struct uas_dev_info), GFP_KERNEL);
    if (!devinfo)
    --
    1.7.2.3


    \
     
     \ /
      Last update: 2010-12-15 21:57    [W:0.044 / U:62.552 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site