67 lines
2 KiB
Diff
67 lines
2 KiB
Diff
|
From eac92acae29cfab34785d61cbb3218e88e487b77 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonas Gorski <jogo@openwrt.org>
|
||
|
Date: Mon, 8 Jul 2013 00:35:12 +0200
|
||
|
Subject: [PATCH 27/29] 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>
|
||
|
---
|
||
|
drivers/net/ethernet/marvell/mv643xx_eth.c | 13 +++++++++++--
|
||
|
1 file changed, 11 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c
|
||
|
index 004a250..e57d292 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;
|
||
|
|
||
|
--
|
||
|
1.8.4.rc1
|
||
|
|