From patchwork Tue Aug 20 22:18:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charles.Hyde@dellteam.com X-Patchwork-Id: 1150416 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=pass (p=none dis=none) header.from=dellteam.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=dellteam.com header.i=@dellteam.com header.b="VutQFxB9"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46ClZ91C4Vz9s3Z for ; Wed, 21 Aug 2019 08:18:56 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730944AbfHTWSz (ORCPT ); Tue, 20 Aug 2019 18:18:55 -0400 Received: from mx0b-00154904.pphosted.com ([148.163.137.20]:16864 "EHLO mx0b-00154904.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727358AbfHTWSz (ORCPT ); Tue, 20 Aug 2019 18:18:55 -0400 Received: from pps.filterd (m0170394.ppops.net [127.0.0.1]) by mx0b-00154904.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x7KMFHj8004945; Tue, 20 Aug 2019 18:18:53 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dellteam.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=smtpout1; bh=t1ntUWnyKU7vtk8aQ3sHa2w2l3X2idBxHhft0DoTAhE=; b=VutQFxB9oue4jcCDC4Y3nkkfwgyD2kzLQSGECgot99xO4xmj/vKf1tHu+Fxwyjc8Lzt0 xiW+DvaV+w3lXLvyeCvuq4HFv2MWt7DuX18EcXXlweu63CXJlOZVAaYxJwY6kN2BjQ6Z KDpfIrBQIq5zTxbGfLK7OEvP2NtOcYZKBhfDhIbSccKtu2Dzv4xrIQEdJbxfJndtQAv4 7Q9L3eHaFVdrKNhV2taPO2+ZGZLw3w2uC0SdE0qrAlT5ouJ21tmzgOkVyRPquJ3+UiVf eavWsdfINFmNs8iTDHO7/VpTEK2fIviKt+5/7U9HL8Fofen1F8KhcEMZMsXPBFKO4kSM Mw== Received: from mx0b-00154901.pphosted.com (mx0b-00154901.pphosted.com [67.231.157.37]) by mx0b-00154904.pphosted.com with ESMTP id 2ugh3g2h3j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 20 Aug 2019 18:18:53 -0400 Received: from pps.filterd (m0144102.ppops.net [127.0.0.1]) by mx0b-00154901.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x7KMHQ2g022625; Tue, 20 Aug 2019 18:18:52 -0400 Received: from ausxippc110.us.dell.com (AUSXIPPC110.us.dell.com [143.166.85.200]) by mx0b-00154901.pphosted.com with ESMTP id 2ugsex8221-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 20 Aug 2019 18:18:52 -0400 X-LoopCount0: from 10.166.132.133 X-PREM-Routing: D-Outbound X-IronPort-AV: E=Sophos;i="5.60,349,1549951200"; d="scan'208";a="846157333" From: To: , CC: , , , , Subject: [RFC 1/4] Add usb_get_address and usb_set_address support Thread-Topic: [RFC 1/4] Add usb_get_address and usb_set_address support Thread-Index: AQHVV6TlN6JhPmp8+EufEIlfFi8+LA== Date: Tue, 20 Aug 2019 22:18:42 +0000 Message-ID: <1566339522507.45056@Dellteam.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.177.90.69] MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2019-08-20_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1906280000 definitions=main-1908200205 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1906280000 definitions=main-1908200204 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The core USB driver message.c is missing get/set address functionality that stops ifconfig from being able to push MAC addresses out to USB based ethernet devices. Without this functionality, some USB devices stop responding to ethernet packets when using ifconfig to change MAC addresses. This has been tested with a Dell Universal Dock D6000. Signed-off-by: Charles Hyde Cc: Mario Limonciello Cc: Greg Kroah-Hartman Cc: linux-usb@vger.kernel.org --- drivers/usb/core/message.c | 59 ++++++++++++++++++++++++++++++++++++++ include/linux/usb.h | 3 ++ 2 files changed, 62 insertions(+) diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 5adf489428aa..eea775234b09 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -1085,6 +1085,65 @@ int usb_clear_halt(struct usb_device *dev, int pipe) } EXPORT_SYMBOL_GPL(usb_clear_halt); +/** + * usb_get_address - + * @dev: device whose endpoint is halted + * @mac: buffer for containing + * Context: !in_interrupt () + * + * This will attempt to get the six byte MAC address from a USB device's + * ethernet controller using GET_NET_ADDRESS command. + * + * This call is synchronous, and may not be used in an interrupt context. + * + * Return: Zero on success, or else the status code returned by the + * underlying usb_control_msg() call. + */ +int usb_get_address(struct usb_device *dev, unsigned char * mac) +{ + int ret = -ENOMEM; + unsigned char *tbuf = kmalloc(256, GFP_NOIO); + + if (!tbuf) + return -ENOMEM; + + ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + USB_CDC_GET_NET_ADDRESS, + USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, USB_REQ_SET_ADDRESS, tbuf, 256, + USB_CTRL_GET_TIMEOUT); + if (ret == 6) + memcpy(mac, tbuf, 6); + + kfree(tbuf); + return ret; +} +EXPORT_SYMBOL_GPL(usb_get_address); + +/** + * usb_set_address - + * @dev: device whose endpoint is halted + * @mac: desired MAC address in network address order + * Context: !in_interrupt () + * + * This will attempt to set a six byte MAC address to the USB device's ethernet + * controller using SET_NET_ADDRESS command. + * + * This call is synchronous, and may not be used in an interrupt context. + * + * Return: Zero on success, or else the status code returned by the + * underlying usb_control_msg() call. + */ +int usb_set_address(struct usb_device *dev, unsigned char *mac) +{ + return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + USB_CDC_SET_NET_ADDRESS, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, USB_REQ_SET_ADDRESS, mac, 6, + USB_CTRL_SET_TIMEOUT); +} +EXPORT_SYMBOL_GPL(usb_set_address); + static int create_intf_ep_devs(struct usb_interface *intf) { struct usb_device *udev = interface_to_usbdev(intf); diff --git a/include/linux/usb.h b/include/linux/usb.h index e87826e23d59..862c979d9821 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -1806,6 +1806,9 @@ static inline int usb_get_ptm_status(struct usb_device *dev, void *data) extern int usb_string(struct usb_device *dev, int index, char *buf, size_t size); +extern int usb_get_address(struct usb_device *dev, unsigned char * mac); +extern int usb_set_address(struct usb_device *dev, unsigned char * mac); + /* wrappers that also update important state inside usbcore */ extern int usb_clear_halt(struct usb_device *dev, int pipe); extern int usb_reset_configuration(struct usb_device *dev);