As the CDC-ECM specification states the host MAC address must be sent to the host as an uppercase hexadecimal string: The Unicode character is chosen from the set of values 30h through 39h and 41h through 46h (0-9 and A-F). However, snprintf(.., "%pm", ..) generates a lowercase MAC address string. While most host drivers are tolerant to this, UsbNcm.sys on Windows 10 is not. Instead it uses a different MAC address with all bytes set to zero including and after the first byte containing a lowercase letter. On Windows 11 Microsoft fixed it, but apparently they did not backport the fix. This change fixes the issue by upper-casing the MAC to comply with the specification. Signed-off-by: Konrad Gräfe <k.graefe@xxxxxxxxxxx> --- drivers/usb/gadget/function/u_ether.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 6956ad8ba8dd..250734e090fc 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c @@ -958,6 +958,7 @@ EXPORT_SYMBOL_GPL(gether_get_host_addr); int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len) { struct eth_dev *dev; + int i, slen; if (len < 13) return -EINVAL; @@ -965,7 +966,13 @@ int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len) dev = netdev_priv(net); snprintf(host_addr, len, "%pm", dev->host_mac); - return strlen(host_addr); + + slen = strlen(host_addr); + + for (i = 0; i < slen; i++) + host_addr[i] = toupper(host_addr[i]); + + return slen; } EXPORT_SYMBOL_GPL(gether_get_host_addr_cdc);