lkml.org 
[lkml]   [2012]   [May]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 28/54] cdc_ether: Ignore bogus union descriptor for RNDIS devices
    3.0-stable review patch.  If anyone has any objections, please let me know.

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

    From: Bjørn Mork <bjorn@mork.no>

    commit 6eddcb4c82883451aec3be1240f17793370fa62f upstream.

    Some RNDIS devices include a bogus CDC Union descriptor pointing
    to non-existing interfaces. The RNDIS code is already prepared
    to handle devices without a CDC Union descriptor by hardwiring
    the driver to use interfaces 0 and 1, which is correct for the
    devices with the bogus descriptor as well. So we can reuse the
    existing workaround.

    Cc: Markus Kolb <linux-201011@tower-net.de>
    Cc: Iker Salmón San Millán <shaola@esdebian.org>
    Cc: Jonathan Nieder <jrnieder@gmail.com>
    Cc: Oliver Neukum <oliver@neukum.org>
    Cc: 655387@bugs.debian.org
    Signed-off-by: Bjørn Mork <bjorn@mork.no>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/net/usb/cdc_ether.c | 14 ++++++++++++--
    1 file changed, 12 insertions(+), 2 deletions(-)

    --- a/drivers/net/usb/cdc_ether.c
    +++ b/drivers/net/usb/cdc_ether.c
    @@ -83,6 +83,7 @@ int usbnet_generic_cdc_bind(struct usbne
    struct cdc_state *info = (void *) &dev->data;
    int status;
    int rndis;
    + bool android_rndis_quirk = false;
    struct usb_driver *driver = driver_of(intf);
    struct usb_cdc_mdlm_desc *desc = NULL;
    struct usb_cdc_mdlm_detail_desc *detail = NULL;
    @@ -195,6 +196,11 @@ int usbnet_generic_cdc_bind(struct usbne
    info->control,
    info->u->bSlaveInterface0,
    info->data);
    + /* fall back to hard-wiring for RNDIS */
    + if (rndis) {
    + android_rndis_quirk = true;
    + goto next_desc;
    + }
    goto bad_desc;
    }
    if (info->control != intf) {
    @@ -271,11 +277,15 @@ next_desc:
    /* Microsoft ActiveSync based and some regular RNDIS devices lack the
    * CDC descriptors, so we'll hard-wire the interfaces and not check
    * for descriptors.
    + *
    + * Some Android RNDIS devices have a CDC Union descriptor pointing
    + * to non-existing interfaces. Ignore that and attempt the same
    + * hard-wired 0 and 1 interfaces.
    */
    - if (rndis && !info->u) {
    + if (rndis && (!info->u || android_rndis_quirk)) {
    info->control = usb_ifnum_to_if(dev->udev, 0);
    info->data = usb_ifnum_to_if(dev->udev, 1);
    - if (!info->control || !info->data) {
    + if (!info->control || !info->data || info->control != intf) {
    dev_dbg(&intf->dev,
    "rndis: master #0/%p slave #1/%p\n",
    info->control,

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2012-05-19 02:21    [W:3.117 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site