aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-10-29 03:54:48 -0400
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2014-03-04 18:38:17 -0500
commit34f11e59c3d5d025ad9162d8fd126e0b7ca54f40 (patch)
tree9d9c12d8a347d549daf065d1d1f42098595a1874
parent97172a660cfc744996112eb625a77282a4b627b7 (diff)
uas: Add uas_find_endpoints() helper function
This is a preparation patch for adding better descriptor validation. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
-rw-r--r--drivers/usb/storage/uas.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index e817e72d8673..1ac66f290fbf 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -898,16 +898,11 @@ static int uas_switch_interface(struct usb_device *udev,
898 intf->altsetting[0].desc.bInterfaceNumber, alt); 898 intf->altsetting[0].desc.bInterfaceNumber, alt);
899} 899}
900 900
901static void uas_configure_endpoints(struct uas_dev_info *devinfo) 901static int uas_find_endpoints(struct usb_host_interface *alt,
902 struct usb_host_endpoint *eps[])
902{ 903{
903 struct usb_host_endpoint *eps[4] = { }; 904 struct usb_host_endpoint *endpoint = alt->endpoint;
904 struct usb_interface *intf = devinfo->intf; 905 unsigned i, n_endpoints = alt->desc.bNumEndpoints;
905 struct usb_device *udev = devinfo->udev;
906 struct usb_host_endpoint *endpoint = intf->cur_altsetting->endpoint;
907 unsigned i, n_endpoints = intf->cur_altsetting->desc.bNumEndpoints;
908
909 devinfo->uas_sense_old = 0;
910 devinfo->cmnd = NULL;
911 906
912 for (i = 0; i < n_endpoints; i++) { 907 for (i = 0; i < n_endpoints; i++) {
913 unsigned char *extra = endpoint[i].extra; 908 unsigned char *extra = endpoint[i].extra;
@@ -924,12 +919,29 @@ static void uas_configure_endpoints(struct uas_dev_info *devinfo)
924 } 919 }
925 } 920 }
926 921
922 if (!eps[0] || !eps[1] || !eps[2] || !eps[3])
923 return -ENODEV;
924
925 return 0;
926}
927
928static void uas_configure_endpoints(struct uas_dev_info *devinfo)
929{
930 struct usb_host_endpoint *eps[4] = { };
931 struct usb_device *udev = devinfo->udev;
932 int r;
933
934 devinfo->uas_sense_old = 0;
935 devinfo->cmnd = NULL;
936
937 r = uas_find_endpoints(devinfo->intf->cur_altsetting, eps);
938
927 /* 939 /*
928 * Assume that if we didn't find a control pipe descriptor, we're 940 * Assume that if we didn't find a proper set of descriptors, we're
929 * using a device with old firmware that happens to be set up like 941 * using a device with old firmware that happens to be set up like
930 * this. 942 * this.
931 */ 943 */
932 if (!eps[0]) { 944 if (r != 0) {
933 devinfo->cmd_pipe = usb_sndbulkpipe(udev, 1); 945 devinfo->cmd_pipe = usb_sndbulkpipe(udev, 1);
934 devinfo->status_pipe = usb_rcvbulkpipe(udev, 1); 946 devinfo->status_pipe = usb_rcvbulkpipe(udev, 1);
935 devinfo->data_in_pipe = usb_rcvbulkpipe(udev, 2); 947 devinfo->data_in_pipe = usb_rcvbulkpipe(udev, 2);