summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Gorski <jogo@openwrt.org>2013-07-08 00:44:55 +0200
committerDavid S. Miller <davem@davemloft.net>2013-07-09 12:51:47 -0700
commit785bf6f7904352242d187ff6087d523a4ce1b3ac (patch)
treeac6398593dc4eb29b24d7ff590237e2bf9b1941d
parent8c2f414ad1b3aa3af05791cd7312eb8ff9d80e0d (diff)
downloadop-kernel-dev-785bf6f7904352242d187ff6087d523a4ce1b3ac.zip
op-kernel-dev-785bf6f7904352242d187ff6087d523a4ce1b3ac.tar.gz
net: mv643xx_eth: do not use port number as platform device id
The port number is only local to the ethernet block, not global, so there can be two ethernet blocks both using the same port, like kirkwood with both using port 0. Fix this by using the array index offset for the allocated platform devices as the id. Signed-off-by: Jonas Gorski <jogo@openwrt.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/marvell/mv643xx_eth.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c
index 6495bea..c35db73 100644
--- a/drivers/net/ethernet/marvell/mv643xx_eth.c
+++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
@@ -2483,6 +2483,7 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,
struct resource res;
const char *mac_addr;
int ret;
+ int dev_num = 0;
memset(&ppd, 0, sizeof(ppd));
ppd.shared = pdev;
@@ -2503,6 +2504,14 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,
return -EINVAL;
}
+ while (dev_num < 3 && port_platdev[dev_num])
+ dev_num++;
+
+ if (dev_num == 3) {
+ dev_err(&pdev->dev, "too many ports registered\n");
+ return -EINVAL;
+ }
+
mac_addr = of_get_mac_address(pnp);
if (mac_addr)
memcpy(ppd.mac_addr, mac_addr, 6);
@@ -2521,7 +2530,7 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,
of_property_read_u32(pnp, "duplex", &ppd.duplex);
}
- ppdev = platform_device_alloc(MV643XX_ETH_NAME, ppd.port_number);
+ ppdev = platform_device_alloc(MV643XX_ETH_NAME, dev_num);
if (!ppdev)
return -ENOMEM;
ppdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
@@ -2538,7 +2547,7 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,
if (ret)
goto port_err;
- port_platdev[ppd.port_number] = ppdev;
+ port_platdev[dev_num] = ppdev;
return 0;
OpenPOWER on IntegriCloud