From patchwork Wed Dec 7 13:07:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Daniele Palmas X-Patchwork-Id: 703573 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3tYf1x43JBz9t3N for ; Thu, 8 Dec 2016 00:08:21 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="vCkFqjeB"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752867AbcLGNIT (ORCPT ); Wed, 7 Dec 2016 08:08:19 -0500 Received: from mail-pf0-f196.google.com ([209.85.192.196]:35433 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752814AbcLGNIR (ORCPT ); Wed, 7 Dec 2016 08:08:17 -0500 Received: by mail-pf0-f196.google.com with SMTP id i88so11205832pfk.2; Wed, 07 Dec 2016 05:08:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qEGtg0QYMUfDUeYVP3cPvo6TIGoYlMACq3JDU/d7PD8=; b=vCkFqjeB0PzE7b4oZXhEmTWpMPR/V3lVuUjm8NaTbZediYb0P6oLNT9p2l1N72ViTo Ua///HBlxmv3RIlgA5cuT9IKB/N9QjWeLdZp1pXJGEAD77ygtN2cp4HgFLlM+ozmYDz2 0r9AzHkY5GIvzajQy0ttcsvyGuBX+XSLVh2biw9lPvW+6+4KFLMYW8PfuHoUqbOgcBXi 4FJTsGStBxUzzUDBwE5gFMfXlnDj46pBRn9fi2P9dcD5CXnDP6Q0kBHy6BUpm6OcJIqi GP+1Hv+e+yZQ1lRk7tujIvQ3OwykxQiTtc8wLnb1XgJm6XwmjSpA0YYWNaxMbsGn+4bx 1ByA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qEGtg0QYMUfDUeYVP3cPvo6TIGoYlMACq3JDU/d7PD8=; b=j1Dji4/mGewYMm+pZL6DB5MVOlNAuSqeMxsxn+/EsnJtzytGtHgHyoqS1Um2wgnbTk VVADtPfWrtAnNs0auH8i0FI3usUCOOUMcFH488us6LSJjQHmrS7i8MRAbFPkKi7+KHHC Cr4SQK+PU0V54Exk4GSI0MjLZCIlXPhk5DF3pa5GMJymbEsBG0kfB3B3mPROWdg5CRvX mhRz71esm38rQvq7RBgLJmzBB/glwSaVuFHyWlsNGSmM35likI0zGKRlkrE+rYVoxfA4 TRCfCS124Hjy2TNJ6mtqlEIRW85XKCoiYwDQDfU5+hGXpabR3Wqwpo+qwneWWLfIJvml Cb1w== X-Gm-Message-State: AKaTC02wZVuKB4VaXg6IU1Gd5L530m9YLunDow3cPKaA08HjfEhKv5/8o+56bYIaIofjxA== X-Received: by 10.99.196.70 with SMTP id m6mr123253401pgg.118.1481116091438; Wed, 07 Dec 2016 05:08:11 -0800 (PST) Received: from L2122.tmt.telital.com ([213.205.6.117]) by smtp.gmail.com with ESMTPSA id 4sm42854616pgd.32.2016.12.07.05.08.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 07 Dec 2016 05:08:10 -0800 (PST) From: Daniele Palmas To: =?UTF-8?q?Bj=C3=B8rn=20Mork?= , Oliver Neukum Cc: netdev@vger.kernel.org, linux-usb@vger.kernel.org, Daniele Palmas Subject: [PATCH 1/1] NET: usb: cdc_mbim: add quirk for supporting Telit LE922A Date: Wed, 7 Dec 2016 14:07:48 +0100 Message-Id: <1481116068-32691-2-git-send-email-dnlplm@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1481116068-32691-1-git-send-email-dnlplm@gmail.com> References: <1481116068-32691-1-git-send-email-dnlplm@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Telit LE922A MBIM based composition does not work properly with altsetting toggle done in cdc_ncm_bind_common. This patch adds CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE quirk to avoid this procedure that, instead, is mandatory for other modems. Signed-off-by: Daniele Palmas Reviewed-by: Bjørn Mork --- drivers/net/usb/cdc_mbim.c | 21 +++++++++++++++++++++ drivers/net/usb/cdc_ncm.c | 14 +++++++++----- include/linux/usb/cdc_ncm.h | 3 ++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c index 96a5028..3a98f37 100644 --- a/drivers/net/usb/cdc_mbim.c +++ b/drivers/net/usb/cdc_mbim.c @@ -602,6 +602,21 @@ static const struct driver_info cdc_mbim_info_ndp_to_end = { .data = CDC_NCM_FLAG_NDP_TO_END, }; +/* Some modems (e.g. Telit LE922A6) do not work properly with altsetting + * toggle done in cdc_ncm_bind_common. CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE + * flag is used to avoid this procedure. + */ +static const struct driver_info cdc_mbim_info_avoid_altsetting_toggle = { + .description = "CDC MBIM", + .flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN, + .bind = cdc_mbim_bind, + .unbind = cdc_mbim_unbind, + .manage_power = cdc_mbim_manage_power, + .rx_fixup = cdc_mbim_rx_fixup, + .tx_fixup = cdc_mbim_tx_fixup, + .data = CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE, +}; + static const struct usb_device_id mbim_devs[] = { /* This duplicate NCM entry is intentional. MBIM devices can * be disguised as NCM by default, and this is necessary to @@ -626,6 +641,12 @@ static const struct usb_device_id mbim_devs[] = { { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), .driver_info = (unsigned long)&cdc_mbim_info_ndp_to_end, }, + + /* Telit LE922A6 in MBIM composition */ + { USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1041, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), + .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle, + }, + /* default entry */ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), .driver_info = (unsigned long)&cdc_mbim_info_zlp, diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 877c951..afbfc0f 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -839,11 +839,18 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; + /* Device-specific flags */ + ctx->drvflags = drvflags; + /* Reset data interface. Some devices will not reset properly * unless they are configured first. Toggle the altsetting to - * force a reset + * force a reset. + * Some other devices do not work properly with this procedure + * that can be avoided using quirk CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE */ - usb_set_interface(dev->udev, iface_no, data_altsetting); + if (!(ctx->drvflags & CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE)) + usb_set_interface(dev->udev, iface_no, data_altsetting); + temp = usb_set_interface(dev->udev, iface_no, 0); if (temp) { dev_dbg(&intf->dev, "set interface failed\n"); @@ -890,9 +897,6 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ /* finish setting up the device specific data */ cdc_ncm_setup(dev); - /* Device-specific flags */ - ctx->drvflags = drvflags; - /* Allocate the delayed NDP if needed. */ if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) { ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL); diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h index 3a375d0..00d2324 100644 --- a/include/linux/usb/cdc_ncm.h +++ b/include/linux/usb/cdc_ncm.h @@ -81,7 +81,8 @@ #define CDC_NCM_TIMER_INTERVAL_MAX (U32_MAX / NSEC_PER_USEC) /* Driver flags */ -#define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */ +#define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */ +#define CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE 0x04 /* Avoid altsetting toggle during init */ #define cdc_ncm_comm_intf_is_mbim(x) ((x)->desc.bInterfaceSubClass == USB_CDC_SUBCLASS_MBIM && \ (x)->desc.bInterfaceProtocol == USB_CDC_PROTO_NONE)