Skip to content

Commit c99f0f7

Browse files
sean-anderson-secodavem330
authored andcommitted
net: fman: Use physical address for userspace interfaces
Before 262f2b7 ("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: 262f2b7 ("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>
1 parent f812747 commit c99f0f7

File tree

4 files changed

+10
-10
lines changed

4 files changed

+10
-10
lines changed

drivers/net/ethernet/freescale/dpaa/dpaa_eth.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ static int dpaa_netdev_init(struct net_device *net_dev,
221221
net_dev->netdev_ops = dpaa_ops;
222222
mac_addr = mac_dev->addr;
223223

224-
net_dev->mem_start = (unsigned long)mac_dev->vaddr;
225-
net_dev->mem_end = (unsigned long)mac_dev->vaddr_end;
224+
net_dev->mem_start = (unsigned long)priv->mac_dev->res->start;
225+
net_dev->mem_end = (unsigned long)priv->mac_dev->res->end;
226226

227227
net_dev->min_mtu = ETH_MIN_MTU;
228228
net_dev->max_mtu = dpaa_get_max_mtu();

drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ static ssize_t dpaa_eth_show_addr(struct device *dev,
1818

1919
if (mac_dev)
2020
return sprintf(buf, "%llx",
21-
(unsigned long long)mac_dev->vaddr);
21+
(unsigned long long)mac_dev->res->start);
2222
else
2323
return sprintf(buf, "none");
2424
}

drivers/net/ethernet/freescale/fman/mac.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ static int mac_probe(struct platform_device *_of_dev)
279279
struct device_node *mac_node, *dev_node;
280280
struct mac_device *mac_dev;
281281
struct platform_device *of_dev;
282-
struct resource *res;
283282
struct mac_priv_s *priv;
284283
struct fman_mac_params params;
285284
u32 val;
@@ -338,24 +337,25 @@ static int mac_probe(struct platform_device *_of_dev)
338337
of_node_put(dev_node);
339338

340339
/* Get the address of the memory mapped registers */
341-
res = platform_get_mem_or_io(_of_dev, 0);
342-
if (!res) {
340+
mac_dev->res = platform_get_mem_or_io(_of_dev, 0);
341+
if (!mac_dev->res) {
343342
dev_err(dev, "could not get registers\n");
344343
return -EINVAL;
345344
}
346345

347-
err = devm_request_resource(dev, fman_get_mem_region(priv->fman), res);
346+
err = devm_request_resource(dev, fman_get_mem_region(priv->fman),
347+
mac_dev->res);
348348
if (err) {
349349
dev_err_probe(dev, err, "could not request resource\n");
350350
return err;
351351
}
352352

353-
mac_dev->vaddr = devm_ioremap(dev, res->start, resource_size(res));
353+
mac_dev->vaddr = devm_ioremap(dev, mac_dev->res->start,
354+
resource_size(mac_dev->res));
354355
if (!mac_dev->vaddr) {
355356
dev_err(dev, "devm_ioremap() failed\n");
356357
return -EIO;
357358
}
358-
mac_dev->vaddr_end = mac_dev->vaddr + resource_size(res);
359359

360360
if (!of_device_is_available(mac_node))
361361
return -ENODEV;

drivers/net/ethernet/freescale/fman/mac.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ struct mac_priv_s;
2020

2121
struct mac_device {
2222
void __iomem *vaddr;
23-
void __iomem *vaddr_end;
2423
struct device *dev;
24+
struct resource *res;
2525
u8 addr[ETH_ALEN];
2626
struct fman_port *port[2];
2727
u32 if_support;

0 commit comments

Comments
 (0)