kirkwood: update patches and configuration (3.10)
[openwrt/svn-archive/archive.git] / target / linux / kirkwood / patches-3.10 / 0029-net-mv643xx_eth-do-not-use-port-number-as-platform-d.patch
diff --git a/target/linux/kirkwood/patches-3.10/0029-net-mv643xx_eth-do-not-use-port-number-as-platform-d.patch b/target/linux/kirkwood/patches-3.10/0029-net-mv643xx_eth-do-not-use-port-number-as-platform-d.patch
new file mode 100644 (file)
index 0000000..84ac779
--- /dev/null
@@ -0,0 +1,62 @@
+From dc4eff91629aa5132f9c0737ef6d9ef013d4f8ce Mon Sep 17 00:00:00 2001
+From: Jonas Gorski <jogo@openwrt.org>
+Date: Mon, 8 Jul 2013 00:44:55 +0200
+Subject: [PATCH 29/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>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/marvell/mv643xx_eth.c | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+--- 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_por
+       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_por
+               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_por
+               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_por
+       if (ret)
+               goto port_err;
+-      port_platdev[ppd.port_number] = ppdev;
++      port_platdev[dev_num] = ppdev;
+       return 0;