From patchwork Wed Sep 27 21:31:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Aleksander Morgado X-Patchwork-Id: 819317 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=aleksander-es.20150623.gappssmtp.com header.i=@aleksander-es.20150623.gappssmtp.com header.b="Q6zaXd6i"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3y2WGZ0GnVz9t5l for ; Thu, 28 Sep 2017 07:31:18 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752067AbdI0VbP (ORCPT ); Wed, 27 Sep 2017 17:31:15 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:33006 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751969AbdI0VbN (ORCPT ); Wed, 27 Sep 2017 17:31:13 -0400 Received: by mail-wr0-f195.google.com with SMTP id 97so807457wrb.0 for ; Wed, 27 Sep 2017 14:31:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aleksander-es.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=z2878vAdksRZAOB26qwmOpCa5rkpW2CrEGGqD131/QQ=; b=Q6zaXd6iG8UBtwUzA3x6+ueLpFaFciEbKetzsUs6Qnd6/vgEUeR6Wbof+ZGvrVT1xn Zqv7slPGuP79IU64MKm+mjcOnLbICqenaFt85A3zFSQ3xHSSsd9DFADI+2RDt4al8ELD tCWCnVc5v/mA694UQW3zClFTwgFtdwzlucz0kXV2fm1eqe3lhtyF7mbxdjoDH9+bEVrU o4H2w9P1lWCz69RkXMwgQTidx05t16XDY/a6TQb3NiGTWK/fH6VyjyL9C2yQrO6s14hx MRug28tRB8fIYEXHUX/ABmB174KSg78jZfzMqtvDbuFbp7MsZygN1GSZrlHlgll/MxCH XccQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=z2878vAdksRZAOB26qwmOpCa5rkpW2CrEGGqD131/QQ=; b=DzEMbVw9aVNAtJSvMYACFudOhYc09MQNkLj4Spdjk+dSPfRTpIiXSvcqdQApMrRrYW I3ZB6uu0+X5s5H5UPWGY+zkhzhb3gK0llRqynKc7KT2E1m6Ac11ZgZEPy/SPFp5EmBe4 VIlSBn/YOZMf58fQ7dmm0b7nXFxMBYolk8pBD34oTBLZVvfuRA9BJy1kSsP+udpAg0hu cXd8xWQMehM/Whl0I23eM/UdB88mPJRx+XF1DJqDQZYoS0y6JBaz0itB0Wc6kHmPg0du gdkP+tsMOdOeqCAspKd83lEYOqsGoNFvm1VJyB0EQWPs/6GsAAgARxBcjVxWLS36Pk9a TmbA== X-Gm-Message-State: AHPjjUhBI6Ws2fd6Mc+/voIJ27Q0d6FaoE7djh9nHZB1aFJ0R1ZluJBQ HUTfDB4glbyUjUi9PrSQBDWhXQ== X-Google-Smtp-Source: AOwi7QDfLEGwQL9B7uWHdho9Db0lvoZAJ5iHIl2DWOVb/qFMUOBL3fENyylGFRlVC3jCgs/y1rd5lw== X-Received: by 10.223.175.217 with SMTP id y25mr2859172wrd.255.1506547872248; Wed, 27 Sep 2017 14:31:12 -0700 (PDT) Received: from athena.lan (116.red-83-40-186.dynamicip.rima-tde.net. [83.40.186.116]) by smtp.gmail.com with ESMTPSA id 10sm293335wmy.35.2017.09.27.14.31.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Sep 2017 14:31:11 -0700 (PDT) From: Aleksander Morgado To: oliver@neukum.org Cc: davem@davemloft.net, linux-usb@vger.kernel.org, netdev@vger.kernel.org, Aleksander Morgado Subject: [PATCH] rndis_host: support Novatel Verizon USB730L Date: Wed, 27 Sep 2017 23:31:03 +0200 Message-Id: <20170927213103.11987-1-aleksander@aleksander.es> X-Mailer: git-send-email 2.14.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Treat the ef/04/01 interface class/subclass/protocol combination used by the Novatel Verizon USB730L (1410:9030) as a possible RNDIS interface. T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 17 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 3 P: Vendor=1410 ProdID=9030 Rev=03.10 S: Manufacturer=Novatel Wireless S: Product=MiFi USB730L S: SerialNumber=0123456789ABCDEF C: #Ifs= 3 Cfg#= 1 Atr=80 MxPwr=500mA I: If#= 0 Alt= 0 #EPs= 1 Cls=ef(misc ) Sub=04 Prot=01 Driver=rndis_host I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host I: If#= 2 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid Once the network interface is brought up, the user just needs to run a DHCP client to get IP address and routing setup. As a side note, other Novatel Verizon USB730L models with the same vid:pid end up exposing a standard ECM interface which doesn't require any other kernel update to make it work. Signed-off-by: Aleksander Morgado Reviewed-by: Bjørn Mork --- Hey, I'm not sure if binding this logic to a specific vid:pid (1410:9030) would be more appropriate here, or if it's ok to just bind class/subclass/protocol (as in the activesync case). Let me know what you think. --- drivers/net/usb/cdc_ether.c | 11 ++++++++++- drivers/net/usb/rndis_host.c | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) -- 2.14.1 diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 8ab281b478f2..2df0bcc6d30b 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -54,11 +54,19 @@ static int is_wireless_rndis(struct usb_interface_descriptor *desc) desc->bInterfaceProtocol == 3); } +static int is_novatel_rndis(struct usb_interface_descriptor *desc) +{ + return (desc->bInterfaceClass == USB_CLASS_MISC && + desc->bInterfaceSubClass == 4 && + desc->bInterfaceProtocol == 1); +} + #else #define is_rndis(desc) 0 #define is_activesync(desc) 0 #define is_wireless_rndis(desc) 0 +#define is_novatel_rndis(desc) 0 #endif @@ -150,7 +158,8 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) */ rndis = (is_rndis(&intf->cur_altsetting->desc) || is_activesync(&intf->cur_altsetting->desc) || - is_wireless_rndis(&intf->cur_altsetting->desc)); + is_wireless_rndis(&intf->cur_altsetting->desc) || + is_novatel_rndis(&intf->cur_altsetting->desc)); memset(info, 0, sizeof(*info)); info->control = intf; diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index a151f267aebb..b807c91abe1d 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c @@ -632,6 +632,10 @@ static const struct usb_device_id products [] = { /* RNDIS for tethering */ USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3), .driver_info = (unsigned long) &rndis_info, +}, { + /* Novatel Verizon USB730L */ + USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1), + .driver_info = (unsigned long) &rndis_info, }, { }, // END };