Skip to content

Commit

Permalink
net: qmi_wwan: prevent duplicate mac address on link (firmware bug wo…
Browse files Browse the repository at this point in the history
…rkaround)

We normally trust and use the CDC functional descriptors provided by a
number of devices.  But some of these will erroneously list the address
reserved for the device end of the link.  Attempting to use this on
both the device and host side will naturally not work.

Work around this bug by ignoring the functional descriptor and assign a
random address instead in this case.

Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Bjørn Mork authored and David S. Miller committed Apr 19, 2013
1 parent 6483bdc commit cc6ba5f
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions drivers/net/usb/qmi_wwan.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ struct qmi_wwan_state {
struct usb_interface *data;
};

/* default ethernet address used by the modem */
static const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3};

/* Make up an ethernet header if the packet doesn't have one.
*
* A firmware bug common among several devices cause them to send raw
Expand Down Expand Up @@ -317,6 +320,12 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)
usb_driver_release_interface(driver, info->data);
}

/* Never use the same address on both ends of the link, even
* if the buggy firmware told us to.
*/
if (!compare_ether_addr(dev->net->dev_addr, default_modem_addr))
eth_hw_addr_random(dev->net);

/* make MAC addr easily distinguishable from an IP header */
if (possibly_iphdr(dev->net->dev_addr)) {
dev->net->dev_addr[0] |= 0x02; /* set local assignment bit */
Expand Down

0 comments on commit cc6ba5f

Please sign in to comment.