lkml.org 
[lkml]   [2017]   [Jan]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 017/101] usb: gadget: composite: Test get_alt() presence instead of set_alt()
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Krzysztof Opasiak <k.opasiak@samsung.com>

    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")
    Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
    Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/usb/gadget/composite.c | 12 ++++++++----
    1 file changed, 8 insertions(+), 4 deletions(-)

    --- a/drivers/usb/gadget/composite.c
    +++ b/drivers/usb/gadget/composite.c
    @@ -1601,9 +1601,7 @@ composite_setup(struct usb_gadget *gadge
    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;
    @@ -1612,7 +1610,13 @@ composite_setup(struct usb_gadget *gadge
    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) {

    \
     
     \ /
      Last update: 2017-01-10 16:20    [W:4.866 / U:0.296 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site