| From eeb324703e408ee8cca365f53f8e89be7079e0b9 Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Opasiak <k.opasiak@samsung.com> |
| Date: Tue, 20 Dec 2016 19:52:16 +0100 |
| Subject: [PATCH] usb: gadget: composite: Test get_alt() presence instead of |
| set_alt() |
| |
| commit 7e4da3fcf7c9fe042f2f7cb7bf23861a899b4a8f upstream. |
| |
| By convention (according to doc) if function does not provide |
| get_alt() callback composite framework should assume that it has only |
| altsetting 0 and should respond with error if host tries to set |
| other one. |
| |
| After commit dd4dff8b035f ("USB: composite: Fix bug: should test |
| set_alt function pointer before use it") |
| we started checking set_alt() callback instead of get_alt(). |
| This check is useless as we check if set_alt() is set inside |
| usb_add_function() and fail if it's NULL. |
| |
| Let's fix this check and move comment about why we check the get |
| method instead of set a little bit closer to prevent future false |
| fixes. |
| |
| Fixes: dd4dff8b035f ("USB: composite: Fix bug: should test set_alt function pointer before use it") |
| Cc: stable <stable@vger.kernel.org> |
| Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c |
| index e2abaa7943d9..ae4620d96eac 100644 |
| --- a/drivers/usb/gadget/composite.c |
| +++ b/drivers/usb/gadget/composite.c |
| @@ -1694,9 +1694,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) |
| value = min(w_length, (u16) 1); |
| break; |
| |
| - /* function drivers must handle get/set altsetting; if there's |
| - * no get() method, we know only altsetting zero works. |
| - */ |
| + /* function drivers must handle get/set altsetting */ |
| case USB_REQ_SET_INTERFACE: |
| if (ctrl->bRequestType != USB_RECIP_INTERFACE) |
| goto unknown; |
| @@ -1705,7 +1703,13 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) |
| f = cdev->config->interface[intf]; |
| if (!f) |
| break; |
| - if (w_value && !f->set_alt) |
| + |
| + /* |
| + * If there's no get_alt() method, we know only altsetting zero |
| + * works. There is no need to check if set_alt() is not NULL |
| + * as we check this in usb_add_function(). |
| + */ |
| + if (w_value && !f->get_alt) |
| break; |
| value = f->set_alt(f, w_index, w_value); |
| if (value == USB_GADGET_DELAYED_STATUS) { |
| -- |
| 2.10.1 |
| |