]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: fman: Use physical address for userspace interfaces
authorSean Anderson <sean.anderson@seco.com>
Thu, 20 Oct 2022 15:50:41 +0000 (11:50 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Oct 2022 09:45:14 +0000 (10:45 +0100)
Before 262f2b782e25 ("net: fman: Map the base address once"), the
physical address of the MAC was exposed to userspace in two places: via
sysfs and via SIOCGIFMAP. While this is not best practice, it is an
external ABI which is in use by userspace software.

The aforementioned commit inadvertently modified these addresses and
made them virtual. This constitutes and ABI break.  Additionally, it
leaks the kernel's memory layout to userspace. Partially revert that
commit, reintroducing the resource back into struct mac_device, while
keeping the intended changes (the rework of the address mapping).

Fixes: 262f2b782e25 ("net: fman: Map the base address once")
Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
Acked-by: Madalin Bucur <madalin.bucur@oss.nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c
drivers/net/ethernet/freescale/fman/mac.c
drivers/net/ethernet/freescale/fman/mac.h

index 31cfa121333df3554f41366aa0437b1a20539d7c..fc68a32ce2f7183735b69cac91d9bfa5fddcac91 100644 (file)
@@ -221,8 +221,8 @@ static int dpaa_netdev_init(struct net_device *net_dev,
        net_dev->netdev_ops = dpaa_ops;
        mac_addr = mac_dev->addr;
 
-       net_dev->mem_start = (unsigned long)mac_dev->vaddr;
-       net_dev->mem_end = (unsigned long)mac_dev->vaddr_end;
+       net_dev->mem_start = (unsigned long)priv->mac_dev->res->start;
+       net_dev->mem_end = (unsigned long)priv->mac_dev->res->end;
 
        net_dev->min_mtu = ETH_MIN_MTU;
        net_dev->max_mtu = dpaa_get_max_mtu();
index 258eb6c8f4c060f85576bb357ad5ab734f8d3cae..4fee74c024bd74022f90826e6920b16f6ae27799 100644 (file)
@@ -18,7 +18,7 @@ static ssize_t dpaa_eth_show_addr(struct device *dev,
 
        if (mac_dev)
                return sprintf(buf, "%llx",
-                               (unsigned long long)mac_dev->vaddr);
+                               (unsigned long long)mac_dev->res->start);
        else
                return sprintf(buf, "none");
 }
index 7b7526fd7da3289299022d8e1d3c1a45d4191703..65df308bad97e71edfcff63691684d0f62fdeae4 100644 (file)
@@ -279,7 +279,6 @@ static int mac_probe(struct platform_device *_of_dev)
        struct device_node      *mac_node, *dev_node;
        struct mac_device       *mac_dev;
        struct platform_device  *of_dev;
-       struct resource         *res;
        struct mac_priv_s       *priv;
        struct fman_mac_params   params;
        u32                      val;
@@ -338,24 +337,25 @@ static int mac_probe(struct platform_device *_of_dev)
        of_node_put(dev_node);
 
        /* Get the address of the memory mapped registers */
-       res = platform_get_mem_or_io(_of_dev, 0);
-       if (!res) {
+       mac_dev->res = platform_get_mem_or_io(_of_dev, 0);
+       if (!mac_dev->res) {
                dev_err(dev, "could not get registers\n");
                return -EINVAL;
        }
 
-       err = devm_request_resource(dev, fman_get_mem_region(priv->fman), res);
+       err = devm_request_resource(dev, fman_get_mem_region(priv->fman),
+                                   mac_dev->res);
        if (err) {
                dev_err_probe(dev, err, "could not request resource\n");
                return err;
        }
 
-       mac_dev->vaddr = devm_ioremap(dev, res->start, resource_size(res));
+       mac_dev->vaddr = devm_ioremap(dev, mac_dev->res->start,
+                                     resource_size(mac_dev->res));
        if (!mac_dev->vaddr) {
                dev_err(dev, "devm_ioremap() failed\n");
                return -EIO;
        }
-       mac_dev->vaddr_end = mac_dev->vaddr + resource_size(res);
 
        if (!of_device_is_available(mac_node))
                return -ENODEV;
index b95d384271bd621919d4190853a08453c429cf79..13b69ca5f00c292f9cedf125291ba3eba87f53d2 100644 (file)
@@ -20,8 +20,8 @@ struct mac_priv_s;
 
 struct mac_device {
        void __iomem            *vaddr;
-       void __iomem            *vaddr_end;
        struct device           *dev;
+       struct resource         *res;
        u8                       addr[ETH_ALEN];
        struct fman_port        *port[2];
        u32                      if_support;