Re: [RFC 1/4] Add usb_get_address and usb_set_address support
From: Greg KH <gregkh@linuxfoundation.org>
Date: 2019-08-20 22:26:12
Also in:
linux-acpi, linux-usb
On Tue, Aug 20, 2019 at 10:18:42PM +0000, Charles.Hyde@dellteam.com wrote:
quoted hunk ↗ jump to hunk
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 <redacted> Cc: Mario Limonciello <redacted> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> 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 -
trailing whitespace? No description of what the function does?
+ * @dev: device whose endpoint is halted + * @mac: buffer for containing
Trailing whitespace?
+ * 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);This is a VERY cdc-net-specific function. It is not a "generic" USB function at all. Why does it belong in the USB core? Shouldn't it live in the code that handles the other cdc-net-specific logic? thanks, greg k-h