OSDN Git Service

net: usb: don't write directly to netdev->dev_addr
authorJakub Kicinski <kuba@kernel.org>
Thu, 21 Oct 2021 13:12:06 +0000 (06:12 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 22 Oct 2021 17:16:01 +0000 (10:16 -0700)
Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
of VLANs...") introduced a rbtree for faster Ethernet address look
up. To maintain netdev->dev_addr in this tree we need to make all
the writes to it got through appropriate helpers.

Manually fix all net/usb drivers without separate maintainers.

v2: catc does DMA to the buffer, leave the conversion to Oliver

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/usb/ch9200.c
drivers/net/usb/cx82310_eth.c
drivers/net/usb/kaweth.c
drivers/net/usb/mcs7830.c
drivers/net/usb/sierra_net.c
drivers/net/usb/sr9700.c
drivers/net/usb/sr9800.c
drivers/net/usb/usbnet.c

index d7f3b70..f69d9b9 100644 (file)
@@ -336,6 +336,7 @@ static int ch9200_bind(struct usbnet *dev, struct usb_interface *intf)
 {
        int retval = 0;
        unsigned char data[2];
+       u8 addr[ETH_ALEN];
 
        retval = usbnet_get_endpoints(dev, intf);
        if (retval)
@@ -383,7 +384,8 @@ static int ch9200_bind(struct usbnet *dev, struct usb_interface *intf)
        retval = control_write(dev, REQUEST_WRITE, 0, MAC_REG_CTRL, data, 0x02,
                               CONTROL_TIMEOUT_MS);
 
-       retval = get_mac_address(dev, dev->net->dev_addr);
+       retval = get_mac_address(dev, addr);
+       eth_hw_addr_set(dev->net, addr);
 
        return retval;
 }
index c4568a4..79a47e2 100644 (file)
@@ -146,6 +146,7 @@ static int cx82310_bind(struct usbnet *dev, struct usb_interface *intf)
        u8 link[3];
        int timeout = 50;
        struct cx82310_priv *priv;
+       u8 addr[ETH_ALEN];
 
        /* avoid ADSL modems - continue only if iProduct is "USB NET CARD" */
        if (usb_string(udev, udev->descriptor.iProduct, buf, sizeof(buf)) > 0
@@ -202,12 +203,12 @@ static int cx82310_bind(struct usbnet *dev, struct usb_interface *intf)
                goto err;
 
        /* get the MAC address */
-       ret = cx82310_cmd(dev, CMD_GET_MAC_ADDR, true, NULL, 0,
-                         dev->net->dev_addr, ETH_ALEN);
+       ret = cx82310_cmd(dev, CMD_GET_MAC_ADDR, true, NULL, 0, addr, ETH_ALEN);
        if (ret) {
                netdev_err(dev->net, "unable to read MAC address: %d\n", ret);
                goto err;
        }
+       eth_hw_addr_set(dev->net, addr);
 
        /* start (does not seem to have any effect?) */
        ret = cx82310_cmd(dev, CMD_START, false, NULL, 0, NULL, 0);
index 144c686..9b2bc19 100644 (file)
@@ -1044,8 +1044,7 @@ err_fw:
                goto err_all_but_rxbuf;
 
        memcpy(netdev->broadcast, &bcast_addr, sizeof(bcast_addr));
-       memcpy(netdev->dev_addr, &kaweth->configuration.hw_addr,
-               sizeof(kaweth->configuration.hw_addr));
+       eth_hw_addr_set(netdev, (u8 *)&kaweth->configuration.hw_addr);
 
        netdev->netdev_ops = &kaweth_netdev_ops;
        netdev->watchdog_timeo = KAWETH_TX_TIMEOUT;
index 5f42db2..326cc4e 100644 (file)
@@ -473,17 +473,19 @@ static const struct net_device_ops mcs7830_netdev_ops = {
 static int mcs7830_bind(struct usbnet *dev, struct usb_interface *udev)
 {
        struct net_device *net = dev->net;
+       u8 addr[ETH_ALEN];
        int ret;
        int retry;
 
        /* Initial startup: Gather MAC address setting from EEPROM */
        ret = -EINVAL;
        for (retry = 0; retry < 5 && ret; retry++)
-               ret = mcs7830_hif_get_mac_address(dev, net->dev_addr);
+               ret = mcs7830_hif_get_mac_address(dev, addr);
        if (ret) {
                dev_warn(&dev->udev->dev, "Cannot read MAC address\n");
                goto out;
        }
+       eth_hw_addr_set(net, addr);
 
        mcs7830_data_set_multicast(net);
 
index 5502520..bb4cbe8 100644 (file)
@@ -669,6 +669,7 @@ static int sierra_net_bind(struct usbnet *dev, struct usb_interface *intf)
                0x00, 0x00, SIERRA_NET_HIP_MSYNC_ID, 0x00};
        static const u8 shdwn_tmplate[sizeof(priv->shdwn_msg)] = {
                0x00, 0x00, SIERRA_NET_HIP_SHUTD_ID, 0x00};
+       u8 mod[2];
 
        dev_dbg(&dev->udev->dev, "%s", __func__);
 
@@ -698,8 +699,9 @@ static int sierra_net_bind(struct usbnet *dev, struct usb_interface *intf)
        dev->net->netdev_ops = &sierra_net_device_ops;
 
        /* change MAC addr to include, ifacenum, and to be unique */
-       dev->net->dev_addr[ETH_ALEN-2] = atomic_inc_return(&iface_counter);
-       dev->net->dev_addr[ETH_ALEN-1] = ifacenum;
+       mod[0] = atomic_inc_return(&iface_counter);
+       mod[1] = ifacenum;
+       dev_addr_mod(dev->net, ETH_ALEN - 2, mod, 2);
 
        /* prepare shutdown message template */
        memcpy(priv->shdwn_msg, shdwn_tmplate, sizeof(priv->shdwn_msg));
index 15209de..b658510 100644 (file)
@@ -320,6 +320,7 @@ static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf)
 {
        struct net_device *netdev;
        struct mii_if_info *mii;
+       u8 addr[ETH_ALEN];
        int ret;
 
        ret = usbnet_get_endpoints(dev, intf);
@@ -350,11 +351,12 @@ static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf)
         * EEPROM automatically to PAR. In case there is no EEPROM externally,
         * a default MAC address is stored in PAR for making chip work properly.
         */
-       if (sr_read(dev, SR_PAR, ETH_ALEN, netdev->dev_addr) < 0) {
+       if (sr_read(dev, SR_PAR, ETH_ALEN, addr) < 0) {
                netdev_err(netdev, "Error reading MAC address\n");
                ret = -ENODEV;
                goto out;
        }
+       eth_hw_addr_set(netdev, addr);
 
        /* power up and reset phy */
        sr_write_reg(dev, SR_PRR, PRR_PHY_RST);
index 838f4e9..f5e19f3 100644 (file)
@@ -731,6 +731,7 @@ static int sr9800_bind(struct usbnet *dev, struct usb_interface *intf)
        struct sr_data *data = (struct sr_data *)&dev->data;
        u16 led01_mux, led23_mux;
        int ret, embd_phy;
+       u8 addr[ETH_ALEN];
        u32 phyid;
        u16 rx_ctl;
 
@@ -754,12 +755,12 @@ static int sr9800_bind(struct usbnet *dev, struct usb_interface *intf)
        }
 
        /* Get the MAC address */
-       ret = sr_read_cmd(dev, SR_CMD_READ_NODE_ID, 0, 0, ETH_ALEN,
-                         dev->net->dev_addr);
+       ret = sr_read_cmd(dev, SR_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, addr);
        if (ret < 0) {
                netdev_dbg(dev->net, "Failed to read MAC address: %d\n", ret);
                return ret;
        }
+       eth_hw_addr_set(dev->net, addr);
        netdev_dbg(dev->net, "mac addr : %pM\n", dev->net->dev_addr);
 
        /* Initialize MII structure */
index 80432ee..350bae6 100644 (file)
@@ -165,12 +165,13 @@ EXPORT_SYMBOL_GPL(usbnet_get_endpoints);
 
 int usbnet_get_ethernet_addr(struct usbnet *dev, int iMACAddress)
 {
+       u8              addr[ETH_ALEN];
        int             tmp = -1, ret;
        unsigned char   buf [13];
 
        ret = usb_string(dev->udev, iMACAddress, buf, sizeof buf);
        if (ret == 12)
-               tmp = hex2bin(dev->net->dev_addr, buf, 6);
+               tmp = hex2bin(addr, buf, 6);
        if (tmp < 0) {
                dev_dbg(&dev->udev->dev,
                        "bad MAC string %d fetch, %d\n", iMACAddress, tmp);
@@ -178,6 +179,7 @@ int usbnet_get_ethernet_addr(struct usbnet *dev, int iMACAddress)
                        ret = -EINVAL;
                return ret;
        }
+       eth_hw_addr_set(dev->net, addr);
        return 0;
 }
 EXPORT_SYMBOL_GPL(usbnet_get_ethernet_addr);
@@ -1726,7 +1728,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 
        dev->net = net;
        strscpy(net->name, "usb%d", sizeof(net->name));
-       memcpy (net->dev_addr, node_id, sizeof node_id);
+       eth_hw_addr_set(net, node_id);
 
        /* rx and tx sides can use different message sizes;
         * bind() should set rx_urb_size in that case.