kernel: bgmac: move bgmac patches already applied in mainline kernel to generic
authorHauke Mehrtens <hauke@hauke-m.de>
Wed, 2 Oct 2013 22:24:01 +0000 (22:24 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Wed, 2 Oct 2013 22:24:01 +0000 (22:24 +0000)
The bgmac driver will be used on the brcm47xx and the bcm53xx target.
These are only the patches already applied in current net-next/master
branch.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
SVN-Revision: 38288

13 files changed:
target/linux/bcm53xx/patches-3.10/203-bgmac-register-phy.patch
target/linux/bcm53xx/patches-3.10/204-bgmac-add-supprot-for-BCM4707.patch
target/linux/bcm53xx/patches-3.10/205-bgmac-add-srab-switch.patch
target/linux/bcm53xx/patches-3.10/210-bgmac_fix_internal_switch_initialization.patch [deleted file]
target/linux/bcm53xx/patches-3.10/211-bgmac_fix_parsing_of_et_swtype.patch [deleted file]
target/linux/bcm53xx/patches-3.10/212-bgmac_implement_unaligned_addressing.patch [deleted file]
target/linux/bcm53xx/patches-3.10/213-bgmac-add-support-for-Byte-Queue-Limits.patch [deleted file]
target/linux/brcm47xx/patches-3.10/710-bgmac_fix_internal_switch_initialization.patch [deleted file]
target/linux/brcm47xx/patches-3.10/711-bgmac_fix_parsing_of_et_swtype.patch [deleted file]
target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch [deleted file]
target/linux/brcm47xx/patches-3.10/740-bgmac-add-support-for-Byte-Queue-Limits.patch [deleted file]
target/linux/brcm47xx/patches-3.10/770-bgmac-phylib.patch
target/linux/generic/patches-3.10/770-bgmac-backport.patch [new file with mode: 0644]

index 6a00cdf0fb4bc41b7f41b018e95692223910d9ca..7bf66dfaf470ff2edca8d743c5d02fe48a89ac2a 100644 (file)
@@ -1,16 +1,6 @@
---- a/drivers/net/ethernet/broadcom/Kconfig
-+++ b/drivers/net/ethernet/broadcom/Kconfig
-@@ -133,6 +133,7 @@ config BNX2X_SRIOV
- config BGMAC
-       tristate "BCMA bus GBit core support"
-       depends on BCMA_HOST_SOC && HAS_DMA
-+      select PHYLIB
-       ---help---
-         This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
-         They can be found on BCM47xx SoCs and provide gigabit ethernet.
 --- a/drivers/net/ethernet/broadcom/bgmac.c
 +++ b/drivers/net/ethernet/broadcom/bgmac.c
 --- a/drivers/net/ethernet/broadcom/bgmac.c
 +++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1205,27 +1205,14 @@ static int bgmac_set_mac_address(struct
+@@ -1233,27 +1233,14 @@ static int bgmac_set_mac_address(struct
  static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
  {
        struct bgmac *bgmac = netdev_priv(net_dev);
  static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
  {
        struct bgmac *bgmac = netdev_priv(net_dev);
@@ -45,7 +35,7 @@
  }
  
  static const struct net_device_ops bgmac_netdev_ops = {
  }
  
  static const struct net_device_ops bgmac_netdev_ops = {
-@@ -1247,61 +1234,16 @@ static int bgmac_get_settings(struct net
+@@ -1275,61 +1262,16 @@ static int bgmac_get_settings(struct net
  {
        struct bgmac *bgmac = netdev_priv(net_dev);
  
  {
        struct bgmac *bgmac = netdev_priv(net_dev);
  
  
  static void bgmac_get_drvinfo(struct net_device *net_dev,
                              struct ethtool_drvinfo *info)
  
  static void bgmac_get_drvinfo(struct net_device *net_dev,
                              struct ethtool_drvinfo *info)
-@@ -1312,6 +1254,7 @@ static void bgmac_get_drvinfo(struct net
+@@ -1340,6 +1282,7 @@ static void bgmac_get_drvinfo(struct net
  
  static const struct ethtool_ops bgmac_ethtool_ops = {
        .get_settings           = bgmac_get_settings,
  
  static const struct ethtool_ops bgmac_ethtool_ops = {
        .get_settings           = bgmac_get_settings,
        .get_drvinfo            = bgmac_get_drvinfo,
  };
  
        .get_drvinfo            = bgmac_get_drvinfo,
  };
  
-@@ -1330,10 +1273,36 @@ static int bgmac_mii_write(struct mii_bu
+@@ -1358,10 +1301,36 @@ static int bgmac_mii_write(struct mii_bu
        return bgmac_phy_write(bus->priv, mii_id, regnum, value);
  }
  
        return bgmac_phy_write(bus->priv, mii_id, regnum, value);
  }
  
  
        mii_bus = mdiobus_alloc();
        if (!mii_bus)
  
        mii_bus = mdiobus_alloc();
        if (!mii_bus)
-@@ -1364,7 +1333,28 @@ static int bgmac_mii_register(struct bgm
+@@ -1392,7 +1361,28 @@ static int bgmac_mii_register(struct bgm
  
        bgmac->mii_bus = mii_bus;
  
  
        bgmac->mii_bus = mii_bus;
  
        kfree(mii_bus->irq);
 --- a/drivers/net/ethernet/broadcom/bgmac.h
 +++ b/drivers/net/ethernet/broadcom/bgmac.h
        kfree(mii_bus->irq);
 --- a/drivers/net/ethernet/broadcom/bgmac.h
 +++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -399,7 +399,10 @@ struct bgmac {
+@@ -401,7 +401,10 @@ struct bgmac {
        struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
        struct net_device *net_dev;
        struct napi_struct napi;
        struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
        struct net_device *net_dev;
        struct napi_struct napi;
index a14b57c60238f7d64f2651d1083f2b806b678c67..63959a957013ab427e4710f95ecb1045836fe229 100644 (file)
@@ -9,7 +9,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
 
 --- a/drivers/net/ethernet/broadcom/bgmac.c
 +++ b/drivers/net/ethernet/broadcom/bgmac.c
 
 --- a/drivers/net/ethernet/broadcom/bgmac.c
 +++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -842,6 +842,8 @@ static void bgmac_speed(struct bgmac *bg
+@@ -868,6 +868,8 @@ static void bgmac_speed(struct bgmac *bg
                set |= BGMAC_CMDCFG_ES_100;
        if (speed & BGMAC_SPEED_1000)
                set |= BGMAC_CMDCFG_ES_1000;
                set |= BGMAC_CMDCFG_ES_100;
        if (speed & BGMAC_SPEED_1000)
                set |= BGMAC_CMDCFG_ES_1000;
@@ -18,7 +18,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
        if (!bgmac->full_duplex)
                set |= BGMAC_CMDCFG_HD;
        bgmac_cmdcfg_maskset(bgmac, mask, set, true);
        if (!bgmac->full_duplex)
                set |= BGMAC_CMDCFG_HD;
        bgmac_cmdcfg_maskset(bgmac, mask, set, true);
-@@ -849,13 +851,28 @@ static void bgmac_speed(struct bgmac *bg
+@@ -875,13 +877,28 @@ static void bgmac_speed(struct bgmac *bg
  
  static void bgmac_miiconfig(struct bgmac *bgmac)
  {
  
  static void bgmac_miiconfig(struct bgmac *bgmac)
  {
@@ -53,7 +53,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
        }
  }
  
        }
  }
  
-@@ -901,7 +918,8 @@ static void bgmac_chip_reset(struct bgma
+@@ -927,7 +944,8 @@ static void bgmac_chip_reset(struct bgma
  
        bcma_core_enable(core, flags);
  
  
        bcma_core_enable(core, flags);
  
@@ -63,7 +63,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
                bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
                bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
                                 1000);
                bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
                bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
                                 1000);
-@@ -922,10 +940,13 @@ static void bgmac_chip_reset(struct bgma
+@@ -948,10 +966,13 @@ static void bgmac_chip_reset(struct bgma
                        et_swtype &= 0x0f;
                        et_swtype <<= 4;
                        sw_type = et_swtype;
                        et_swtype &= 0x0f;
                        et_swtype <<= 4;
                        sw_type = et_swtype;
@@ -80,7 +80,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
                        sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
                                  BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
                }
                        sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
                                  BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
                }
-@@ -1030,12 +1051,15 @@ static void bgmac_enable(struct bgmac *b
+@@ -1058,12 +1079,15 @@ static void bgmac_enable(struct bgmac *b
                break;
        }
  
                break;
        }
  
index 195336b716a3af2b1591a996340d0fdd71277343..cb498154a4e48c2c8e815a7b970dfa68c4f3c7e1 100644 (file)
@@ -8,7 +8,7 @@
  #ifdef CONFIG_BCM47XX
  #include <bcm47xx_nvram.h>
  #else
  #ifdef CONFIG_BCM47XX
  #include <bcm47xx_nvram.h>
  #else
-@@ -1396,6 +1397,17 @@ static void bgmac_mii_unregister(struct
+@@ -1424,6 +1425,17 @@ static void bgmac_mii_unregister(struct
        mdiobus_free(mii_bus);
  }
  
        mdiobus_free(mii_bus);
  }
  
@@ -26,7 +26,7 @@
  /**************************************************
   * BCMA bus ops
   **************************************************/
  /**************************************************
   * BCMA bus ops
   **************************************************/
-@@ -1495,6 +1507,16 @@ static int bgmac_probe(struct bcma_devic
+@@ -1523,6 +1535,16 @@ static int bgmac_probe(struct bcma_devic
                goto err_dma_free;
        }
  
                goto err_dma_free;
        }
  
@@ -43,7 +43,7 @@
        err = register_netdev(bgmac->net_dev);
        if (err) {
                bgmac_err(bgmac, "Cannot register net device\n");
        err = register_netdev(bgmac->net_dev);
        if (err) {
                bgmac_err(bgmac, "Cannot register net device\n");
-@@ -1524,6 +1546,10 @@ static void bgmac_remove(struct bcma_dev
+@@ -1552,6 +1574,10 @@ static void bgmac_remove(struct bcma_dev
  {
        struct bgmac *bgmac = bcma_get_drvdata(core);
  
  {
        struct bgmac *bgmac = bcma_get_drvdata(core);
  
@@ -56,7 +56,7 @@
        bgmac_mii_unregister(bgmac);
 --- a/drivers/net/ethernet/broadcom/bgmac.h
 +++ b/drivers/net/ethernet/broadcom/bgmac.h
        bgmac_mii_unregister(bgmac);
 --- a/drivers/net/ethernet/broadcom/bgmac.h
 +++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -428,6 +428,9 @@ struct bgmac {
+@@ -430,6 +430,9 @@ struct bgmac {
        bool has_robosw;
  
        bool loopback;
        bool has_robosw;
  
        bool loopback;
diff --git a/target/linux/bcm53xx/patches-3.10/210-bgmac_fix_internal_switch_initialization.patch b/target/linux/bcm53xx/patches-3.10/210-bgmac_fix_internal_switch_initialization.patch
deleted file mode 100644 (file)
index a5ace95..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-bgmac: fix internal switch initialization
-
-Some devices (BCM4749, BCM5357, BCM53572) have internal switch that
-requires initialization. We already have code for this, but because
-of the typo in code it was never working. This resulted in network not
-working for some routers and possibility of soft-bricking them.
-
-Use correct bit for switch initialization and fix typo in the define.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -931,7 +931,7 @@ static void bgmac_chip_reset(struct bgma
-               struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
-               u8 et_swtype = 0;
-               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
--                           BGMAC_CHIPCTL_1_IF_TYPE_RMII;
-+                           BGMAC_CHIPCTL_1_IF_TYPE_MII;
-               char buf[2];
-               if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) {
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -334,7 +334,7 @@
- #define BGMAC_CHIPCTL_1_IF_TYPE_MASK          0x00000030
- #define BGMAC_CHIPCTL_1_IF_TYPE_RMII          0x00000000
--#define BGMAC_CHIPCTL_1_IF_TYPE_MI            0x00000010
-+#define BGMAC_CHIPCTL_1_IF_TYPE_MII           0x00000010
- #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII         0x00000020
- #define BGMAC_CHIPCTL_1_SW_TYPE_MASK          0x000000C0
- #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY          0x00000000
diff --git a/target/linux/bcm53xx/patches-3.10/211-bgmac_fix_parsing_of_et_swtype.patch b/target/linux/bcm53xx/patches-3.10/211-bgmac_fix_parsing_of_et_swtype.patch
deleted file mode 100644 (file)
index 2f79b8d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -932,9 +932,9 @@ static void bgmac_chip_reset(struct bgma
-               u8 et_swtype = 0;
-               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
-                            BGMAC_CHIPCTL_1_IF_TYPE_MII;
--              char buf[2];
-+              char buf[4];
--              if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) {
-+              if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
-                       if (kstrtou8(buf, 0, &et_swtype))
-                               bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n",
-                                         buf);
diff --git a/target/linux/bcm53xx/patches-3.10/212-bgmac_implement_unaligned_addressing.patch b/target/linux/bcm53xx/patches-3.10/212-bgmac_implement_unaligned_addressing.patch
deleted file mode 100644 (file)
index 4987e5e..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-bgmac: implement unaligned addressing for DMA rings that support it
-
-This is important patch for new devices that support unaligned
-addressing. That devices suffer from the backward-compatibility bug in
-DMA engine. In theory we should be able to use old mechanism, but in
-practice DMA address seems to be randomly copied into status register
-when hardware reaches end of a ring. This breaks reading slot number
-from status register and we can't use DMA anymore.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -162,6 +162,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
-       if (++ring->end >= BGMAC_TX_RING_SLOTS)
-               ring->end = 0;
-       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX,
-+                  ring->index_base +
-                   ring->end * sizeof(struct bgmac_dma_desc));
-       /* Always keep one slot free to allow detecting bugged calls. */
-@@ -186,6 +187,8 @@ static void bgmac_dma_tx_free(struct bgm
-       /* The last slot that hardware didn't consume yet */
-       empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
-       empty_slot &= BGMAC_DMA_TX_STATDPTR;
-+      empty_slot -= ring->index_base;
-+      empty_slot &= BGMAC_DMA_TX_STATDPTR;
-       empty_slot /= sizeof(struct bgmac_dma_desc);
-       while (ring->start != empty_slot) {
-@@ -279,6 +282,8 @@ static int bgmac_dma_rx_read(struct bgma
-       end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS);
-       end_slot &= BGMAC_DMA_RX_STATDPTR;
-+      end_slot -= ring->index_base;
-+      end_slot &= BGMAC_DMA_RX_STATDPTR;
-       end_slot /= sizeof(struct bgmac_dma_desc);
-       ring->end = end_slot;
-@@ -423,9 +428,6 @@ static int bgmac_dma_alloc(struct bgmac
-               ring = &bgmac->tx_ring[i];
-               ring->num_slots = BGMAC_TX_RING_SLOTS;
-               ring->mmio_base = ring_base[i];
--              if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX))
--                      bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
--                                 ring->mmio_base);
-               /* Alloc ring of descriptors */
-               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
-@@ -440,6 +442,13 @@ static int bgmac_dma_alloc(struct bgmac
-               if (ring->dma_base & 0xC0000000)
-                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
-+              ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
-+                                                    BGMAC_DMA_RING_TX);
-+              if (ring->unaligned)
-+                      ring->index_base = lower_32_bits(ring->dma_base);
-+              else
-+                      ring->index_base = 0;
-+
-               /* No need to alloc TX slots yet */
-       }
-@@ -449,9 +458,6 @@ static int bgmac_dma_alloc(struct bgmac
-               ring = &bgmac->rx_ring[i];
-               ring->num_slots = BGMAC_RX_RING_SLOTS;
-               ring->mmio_base = ring_base[i];
--              if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX))
--                      bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
--                                 ring->mmio_base);
-               /* Alloc ring of descriptors */
-               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
-@@ -467,6 +473,13 @@ static int bgmac_dma_alloc(struct bgmac
-               if (ring->dma_base & 0xC0000000)
-                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
-+              ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
-+                                                    BGMAC_DMA_RING_RX);
-+              if (ring->unaligned)
-+                      ring->index_base = lower_32_bits(ring->dma_base);
-+              else
-+                      ring->index_base = 0;
-+
-               /* Alloc RX slots */
-               for (j = 0; j < ring->num_slots; j++) {
-                       err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
-@@ -494,12 +507,14 @@ static void bgmac_dma_init(struct bgmac
-       for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
-               ring = &bgmac->tx_ring[i];
--              /* We don't implement unaligned addressing, so enable first */
--              bgmac_dma_tx_enable(bgmac, ring);
-+              if (!ring->unaligned)
-+                      bgmac_dma_tx_enable(bgmac, ring);
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO,
-                           lower_32_bits(ring->dma_base));
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI,
-                           upper_32_bits(ring->dma_base));
-+              if (ring->unaligned)
-+                      bgmac_dma_tx_enable(bgmac, ring);
-               ring->start = 0;
-               ring->end = 0;  /* Points the slot that should *not* be read */
-@@ -510,12 +525,14 @@ static void bgmac_dma_init(struct bgmac
-               ring = &bgmac->rx_ring[i];
--              /* We don't implement unaligned addressing, so enable first */
--              bgmac_dma_rx_enable(bgmac, ring);
-+              if (!ring->unaligned)
-+                      bgmac_dma_rx_enable(bgmac, ring);
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO,
-                           lower_32_bits(ring->dma_base));
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI,
-                           upper_32_bits(ring->dma_base));
-+              if (ring->unaligned)
-+                      bgmac_dma_rx_enable(bgmac, ring);
-               for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots;
-                    j++, dma_desc++) {
-@@ -536,6 +553,7 @@ static void bgmac_dma_init(struct bgmac
-               }
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
-+                          ring->index_base +
-                           ring->num_slots * sizeof(struct bgmac_dma_desc));
-               ring->start = 0;
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -386,6 +386,8 @@ struct bgmac_dma_ring {
-       u16 mmio_base;
-       struct bgmac_dma_desc *cpu_base;
-       dma_addr_t dma_base;
-+      u32 index_base; /* Used for unaligned rings only, otherwise 0 */
-+      bool unaligned;
-       struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];
- };
diff --git a/target/linux/bcm53xx/patches-3.10/213-bgmac-add-support-for-Byte-Queue-Limits.patch b/target/linux/bcm53xx/patches-3.10/213-bgmac-add-support-for-Byte-Queue-Limits.patch
deleted file mode 100644 (file)
index 440461a..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Hauke Mehrtens <hauke@hauke-m.de>
-bgmac: add support for Byte Queue Limits
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -183,6 +183,7 @@ static void bgmac_dma_tx_free(struct bgm
-       struct device *dma_dev = bgmac->core->dma_dev;
-       int empty_slot;
-       bool freed = false;
-+      unsigned bytes_compl = 0, pkts_compl = 0;
-       /* The last slot that hardware didn't consume yet */
-       empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
-@@ -200,6 +201,9 @@ static void bgmac_dma_tx_free(struct bgm
-                                        slot->skb->len, DMA_TO_DEVICE);
-                       slot->dma_addr = 0;
-+                      bytes_compl += slot->skb->len;
-+                      pkts_compl++;
-+
-                       /* Free memory! :) */
-                       dev_kfree_skb(slot->skb);
-                       slot->skb = NULL;
-@@ -213,6 +217,8 @@ static void bgmac_dma_tx_free(struct bgm
-               freed = true;
-       }
-+      netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl);
-+
-       if (freed && netif_queue_stopped(bgmac->net_dev))
-               netif_wake_queue(bgmac->net_dev);
- }
-@@ -1013,6 +1019,8 @@ static void bgmac_chip_reset(struct bgma
-               bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE);
-       bgmac_miiconfig(bgmac);
-       bgmac_phy_init(bgmac);
-+      
-+      netdev_reset_queue(bgmac->net_dev);
-       bgmac->int_status = 0;
- }
-@@ -1227,6 +1235,8 @@ static netdev_tx_t bgmac_start_xmit(stru
-       struct bgmac *bgmac = netdev_priv(net_dev);
-       struct bgmac_dma_ring *ring;
-+      netdev_sent_queue(net_dev, skb->len);
-+
-       /* No QOS support yet */
-       ring = &bgmac->tx_ring[0];
-       return bgmac_dma_tx_add(bgmac, ring, skb);
diff --git a/target/linux/brcm47xx/patches-3.10/710-bgmac_fix_internal_switch_initialization.patch b/target/linux/brcm47xx/patches-3.10/710-bgmac_fix_internal_switch_initialization.patch
deleted file mode 100644 (file)
index 8601888..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-bgmac: fix internal switch initialization
-
-Some devices (BCM4749, BCM5357, BCM53572) have internal switch that
-requires initialization. We already have code for this, but because
-of the typo in code it was never working. This resulted in network not
-working for some routers and possibility of soft-bricking them.
-
-Use correct bit for switch initialization and fix typo in the define.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -908,7 +908,7 @@ static void bgmac_chip_reset(struct bgma
-               struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
-               u8 et_swtype = 0;
-               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
--                           BGMAC_CHIPCTL_1_IF_TYPE_RMII;
-+                           BGMAC_CHIPCTL_1_IF_TYPE_MII;
-               char buf[2];
-               if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) {
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -333,7 +333,7 @@
- #define BGMAC_CHIPCTL_1_IF_TYPE_MASK          0x00000030
- #define BGMAC_CHIPCTL_1_IF_TYPE_RMII          0x00000000
--#define BGMAC_CHIPCTL_1_IF_TYPE_MI            0x00000010
-+#define BGMAC_CHIPCTL_1_IF_TYPE_MII           0x00000010
- #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII         0x00000020
- #define BGMAC_CHIPCTL_1_SW_TYPE_MASK          0x000000C0
- #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY          0x00000000
diff --git a/target/linux/brcm47xx/patches-3.10/711-bgmac_fix_parsing_of_et_swtype.patch b/target/linux/brcm47xx/patches-3.10/711-bgmac_fix_parsing_of_et_swtype.patch
deleted file mode 100644 (file)
index 21342ff..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -909,9 +909,9 @@ static void bgmac_chip_reset(struct bgma
-               u8 et_swtype = 0;
-               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
-                            BGMAC_CHIPCTL_1_IF_TYPE_MII;
--              char buf[2];
-+              char buf[4];
--              if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) {
-+              if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
-                       if (kstrtou8(buf, 0, &et_swtype))
-                               bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n",
-                                         buf);
diff --git a/target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch b/target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch
deleted file mode 100644 (file)
index 939ae11..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-bgmac: implement unaligned addressing for DMA rings that support it
-
-This is important patch for new devices that support unaligned
-addressing. That devices suffer from the backward-compatibility bug in
-DMA engine. In theory we should be able to use old mechanism, but in
-practice DMA address seems to be randomly copied into status register
-when hardware reaches end of a ring. This breaks reading slot number
-from status register and we can't use DMA anymore.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -157,6 +157,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
-       if (++ring->end >= BGMAC_TX_RING_SLOTS)
-               ring->end = 0;
-       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX,
-+                  ring->index_base +
-                   ring->end * sizeof(struct bgmac_dma_desc));
-       /* Always keep one slot free to allow detecting bugged calls. */
-@@ -181,6 +182,8 @@ static void bgmac_dma_tx_free(struct bgm
-       /* The last slot that hardware didn't consume yet */
-       empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
-       empty_slot &= BGMAC_DMA_TX_STATDPTR;
-+      empty_slot -= ring->index_base;
-+      empty_slot &= BGMAC_DMA_TX_STATDPTR;
-       empty_slot /= sizeof(struct bgmac_dma_desc);
-       while (ring->start != empty_slot) {
-@@ -274,6 +277,8 @@ static int bgmac_dma_rx_read(struct bgma
-       end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS);
-       end_slot &= BGMAC_DMA_RX_STATDPTR;
-+      end_slot -= ring->index_base;
-+      end_slot &= BGMAC_DMA_RX_STATDPTR;
-       end_slot /= sizeof(struct bgmac_dma_desc);
-       ring->end = end_slot;
-@@ -418,9 +423,6 @@ static int bgmac_dma_alloc(struct bgmac
-               ring = &bgmac->tx_ring[i];
-               ring->num_slots = BGMAC_TX_RING_SLOTS;
-               ring->mmio_base = ring_base[i];
--              if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX))
--                      bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
--                                 ring->mmio_base);
-               /* Alloc ring of descriptors */
-               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
-@@ -435,6 +437,13 @@ static int bgmac_dma_alloc(struct bgmac
-               if (ring->dma_base & 0xC0000000)
-                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
-+              ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
-+                                                    BGMAC_DMA_RING_TX);
-+              if (ring->unaligned)
-+                      ring->index_base = lower_32_bits(ring->dma_base);
-+              else
-+                      ring->index_base = 0;
-+
-               /* No need to alloc TX slots yet */
-       }
-@@ -444,9 +453,6 @@ static int bgmac_dma_alloc(struct bgmac
-               ring = &bgmac->rx_ring[i];
-               ring->num_slots = BGMAC_RX_RING_SLOTS;
-               ring->mmio_base = ring_base[i];
--              if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX))
--                      bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
--                                 ring->mmio_base);
-               /* Alloc ring of descriptors */
-               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
-@@ -462,6 +468,13 @@ static int bgmac_dma_alloc(struct bgmac
-               if (ring->dma_base & 0xC0000000)
-                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
-+              ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
-+                                                    BGMAC_DMA_RING_RX);
-+              if (ring->unaligned)
-+                      ring->index_base = lower_32_bits(ring->dma_base);
-+              else
-+                      ring->index_base = 0;
-+
-               /* Alloc RX slots */
-               for (j = 0; j < ring->num_slots; j++) {
-                       err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
-@@ -489,12 +502,14 @@ static void bgmac_dma_init(struct bgmac
-       for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
-               ring = &bgmac->tx_ring[i];
--              /* We don't implement unaligned addressing, so enable first */
--              bgmac_dma_tx_enable(bgmac, ring);
-+              if (!ring->unaligned)
-+                      bgmac_dma_tx_enable(bgmac, ring);
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO,
-                           lower_32_bits(ring->dma_base));
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI,
-                           upper_32_bits(ring->dma_base));
-+              if (ring->unaligned)
-+                      bgmac_dma_tx_enable(bgmac, ring);
-               ring->start = 0;
-               ring->end = 0;  /* Points the slot that should *not* be read */
-@@ -505,12 +520,14 @@ static void bgmac_dma_init(struct bgmac
-               ring = &bgmac->rx_ring[i];
--              /* We don't implement unaligned addressing, so enable first */
--              bgmac_dma_rx_enable(bgmac, ring);
-+              if (!ring->unaligned)
-+                      bgmac_dma_rx_enable(bgmac, ring);
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO,
-                           lower_32_bits(ring->dma_base));
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI,
-                           upper_32_bits(ring->dma_base));
-+              if (ring->unaligned)
-+                      bgmac_dma_rx_enable(bgmac, ring);
-               for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots;
-                    j++, dma_desc++) {
-@@ -531,6 +548,7 @@ static void bgmac_dma_init(struct bgmac
-               }
-               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
-+                          ring->index_base +
-                           ring->num_slots * sizeof(struct bgmac_dma_desc));
-               ring->start = 0;
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -384,6 +384,8 @@ struct bgmac_dma_ring {
-       u16 mmio_base;
-       struct bgmac_dma_desc *cpu_base;
-       dma_addr_t dma_base;
-+      u32 index_base; /* Used for unaligned rings only, otherwise 0 */
-+      bool unaligned;
-       struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];
- };
diff --git a/target/linux/brcm47xx/patches-3.10/740-bgmac-add-support-for-Byte-Queue-Limits.patch b/target/linux/brcm47xx/patches-3.10/740-bgmac-add-support-for-Byte-Queue-Limits.patch
deleted file mode 100644 (file)
index 68d1bc9..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Hauke Mehrtens <hauke@hauke-m.de>
-bgmac: add support for Byte Queue Limits
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -178,6 +178,7 @@ static void bgmac_dma_tx_free(struct bgm
-       struct device *dma_dev = bgmac->core->dma_dev;
-       int empty_slot;
-       bool freed = false;
-+      unsigned bytes_compl = 0, pkts_compl = 0;
-       /* The last slot that hardware didn't consume yet */
-       empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
-@@ -195,6 +196,9 @@ static void bgmac_dma_tx_free(struct bgm
-                                        slot->skb->len, DMA_TO_DEVICE);
-                       slot->dma_addr = 0;
-+                      bytes_compl += slot->skb->len;
-+                      pkts_compl++;
-+
-                       /* Free memory! :) */
-                       dev_kfree_skb(slot->skb);
-                       slot->skb = NULL;
-@@ -208,6 +212,8 @@ static void bgmac_dma_tx_free(struct bgm
-               freed = true;
-       }
-+      netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl);
-+
-       if (freed && netif_queue_stopped(bgmac->net_dev))
-               netif_wake_queue(bgmac->net_dev);
- }
-@@ -987,6 +993,8 @@ static void bgmac_chip_reset(struct bgma
-               bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE);
-       bgmac_miiconfig(bgmac);
-       bgmac_phy_init(bgmac);
-+      
-+      netdev_reset_queue(bgmac->net_dev);
-       bgmac->int_status = 0;
- }
-@@ -1198,6 +1206,8 @@ static netdev_tx_t bgmac_start_xmit(stru
-       struct bgmac *bgmac = netdev_priv(net_dev);
-       struct bgmac_dma_ring *ring;
-+      netdev_sent_queue(net_dev, skb->len);
-+
-       /* No QOS support yet */
-       ring = &bgmac->tx_ring[0];
-       return bgmac_dma_tx_add(bgmac, ring, skb);
index 13a7ea5d3a5d19afa7c676c62804daefcd7e631e..50aaeaa14d44d507b5ac6110c9668cb5911f4f37 100644 (file)
@@ -1,13 +1,3 @@
---- a/drivers/net/ethernet/broadcom/Kconfig
-+++ b/drivers/net/ethernet/broadcom/Kconfig
-@@ -133,6 +133,7 @@ config BNX2X_SRIOV
- config BGMAC
-       tristate "BCMA bus GBit core support"
-       depends on BCMA_HOST_SOC && HAS_DMA
-+      select PHYLIB
-       ---help---
-         This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
-         They can be found on BCM47xx SoCs and provide gigabit ethernet.
 --- a/drivers/net/ethernet/broadcom/bgmac.c
 +++ b/drivers/net/ethernet/broadcom/bgmac.c
 @@ -1229,27 +1229,14 @@ static int bgmac_set_mac_address(struct
 --- a/drivers/net/ethernet/broadcom/bgmac.c
 +++ b/drivers/net/ethernet/broadcom/bgmac.c
 @@ -1229,27 +1229,14 @@ static int bgmac_set_mac_address(struct
diff --git a/target/linux/generic/patches-3.10/770-bgmac-backport.patch b/target/linux/generic/patches-3.10/770-bgmac-backport.patch
new file mode 100644 (file)
index 0000000..3651be7
--- /dev/null
@@ -0,0 +1,208 @@
+patches for bgmac backported from net-next/master
+
+--- a/drivers/net/ethernet/broadcom/Kconfig
++++ b/drivers/net/ethernet/broadcom/Kconfig
+@@ -132,7 +132,8 @@ config BNX2X_SRIOV
+ config BGMAC
+       tristate "BCMA bus GBit core support"
+-      depends on BCMA_HOST_SOC && HAS_DMA
++      depends on BCMA_HOST_SOC && HAS_DMA && BCM47XX
++      select PHYLIB
+       ---help---
+         This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
+         They can be found on BCM47xx SoCs and provide gigabit ethernet.
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -149,6 +149,8 @@ static netdev_tx_t bgmac_dma_tx_add(stru
+       dma_desc->ctl0 = cpu_to_le32(ctl0);
+       dma_desc->ctl1 = cpu_to_le32(ctl1);
++      netdev_sent_queue(net_dev, skb->len);
++
+       wmb();
+       /* Increase ring->end to point empty slot. We tell hardware the first
+@@ -157,6 +159,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
+       if (++ring->end >= BGMAC_TX_RING_SLOTS)
+               ring->end = 0;
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX,
++                  ring->index_base +
+                   ring->end * sizeof(struct bgmac_dma_desc));
+       /* Always keep one slot free to allow detecting bugged calls. */
+@@ -177,10 +180,13 @@ static void bgmac_dma_tx_free(struct bgm
+       struct device *dma_dev = bgmac->core->dma_dev;
+       int empty_slot;
+       bool freed = false;
++      unsigned bytes_compl = 0, pkts_compl = 0;
+       /* The last slot that hardware didn't consume yet */
+       empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
+       empty_slot &= BGMAC_DMA_TX_STATDPTR;
++      empty_slot -= ring->index_base;
++      empty_slot &= BGMAC_DMA_TX_STATDPTR;
+       empty_slot /= sizeof(struct bgmac_dma_desc);
+       while (ring->start != empty_slot) {
+@@ -192,6 +198,9 @@ static void bgmac_dma_tx_free(struct bgm
+                                        slot->skb->len, DMA_TO_DEVICE);
+                       slot->dma_addr = 0;
++                      bytes_compl += slot->skb->len;
++                      pkts_compl++;
++
+                       /* Free memory! :) */
+                       dev_kfree_skb(slot->skb);
+                       slot->skb = NULL;
+@@ -205,6 +214,8 @@ static void bgmac_dma_tx_free(struct bgm
+               freed = true;
+       }
++      netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl);
++
+       if (freed && netif_queue_stopped(bgmac->net_dev))
+               netif_wake_queue(bgmac->net_dev);
+ }
+@@ -274,6 +285,8 @@ static int bgmac_dma_rx_read(struct bgma
+       end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS);
+       end_slot &= BGMAC_DMA_RX_STATDPTR;
++      end_slot -= ring->index_base;
++      end_slot &= BGMAC_DMA_RX_STATDPTR;
+       end_slot /= sizeof(struct bgmac_dma_desc);
+       ring->end = end_slot;
+@@ -418,9 +431,6 @@ static int bgmac_dma_alloc(struct bgmac
+               ring = &bgmac->tx_ring[i];
+               ring->num_slots = BGMAC_TX_RING_SLOTS;
+               ring->mmio_base = ring_base[i];
+-              if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX))
+-                      bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
+-                                 ring->mmio_base);
+               /* Alloc ring of descriptors */
+               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
+@@ -435,6 +445,13 @@ static int bgmac_dma_alloc(struct bgmac
+               if (ring->dma_base & 0xC0000000)
+                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
++              ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
++                                                    BGMAC_DMA_RING_TX);
++              if (ring->unaligned)
++                      ring->index_base = lower_32_bits(ring->dma_base);
++              else
++                      ring->index_base = 0;
++
+               /* No need to alloc TX slots yet */
+       }
+@@ -444,9 +461,6 @@ static int bgmac_dma_alloc(struct bgmac
+               ring = &bgmac->rx_ring[i];
+               ring->num_slots = BGMAC_RX_RING_SLOTS;
+               ring->mmio_base = ring_base[i];
+-              if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX))
+-                      bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
+-                                 ring->mmio_base);
+               /* Alloc ring of descriptors */
+               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
+@@ -462,6 +476,13 @@ static int bgmac_dma_alloc(struct bgmac
+               if (ring->dma_base & 0xC0000000)
+                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
++              ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
++                                                    BGMAC_DMA_RING_RX);
++              if (ring->unaligned)
++                      ring->index_base = lower_32_bits(ring->dma_base);
++              else
++                      ring->index_base = 0;
++
+               /* Alloc RX slots */
+               for (j = 0; j < ring->num_slots; j++) {
+                       err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
+@@ -489,12 +510,14 @@ static void bgmac_dma_init(struct bgmac
+       for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
+               ring = &bgmac->tx_ring[i];
+-              /* We don't implement unaligned addressing, so enable first */
+-              bgmac_dma_tx_enable(bgmac, ring);
++              if (!ring->unaligned)
++                      bgmac_dma_tx_enable(bgmac, ring);
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO,
+                           lower_32_bits(ring->dma_base));
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI,
+                           upper_32_bits(ring->dma_base));
++              if (ring->unaligned)
++                      bgmac_dma_tx_enable(bgmac, ring);
+               ring->start = 0;
+               ring->end = 0;  /* Points the slot that should *not* be read */
+@@ -505,12 +528,14 @@ static void bgmac_dma_init(struct bgmac
+               ring = &bgmac->rx_ring[i];
+-              /* We don't implement unaligned addressing, so enable first */
+-              bgmac_dma_rx_enable(bgmac, ring);
++              if (!ring->unaligned)
++                      bgmac_dma_rx_enable(bgmac, ring);
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO,
+                           lower_32_bits(ring->dma_base));
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI,
+                           upper_32_bits(ring->dma_base));
++              if (ring->unaligned)
++                      bgmac_dma_rx_enable(bgmac, ring);
+               for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots;
+                    j++, dma_desc++) {
+@@ -531,6 +556,7 @@ static void bgmac_dma_init(struct bgmac
+               }
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
++                          ring->index_base +
+                           ring->num_slots * sizeof(struct bgmac_dma_desc));
+               ring->start = 0;
+@@ -908,10 +934,10 @@ static void bgmac_chip_reset(struct bgma
+               struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
+               u8 et_swtype = 0;
+               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
+-                           BGMAC_CHIPCTL_1_IF_TYPE_RMII;
+-              char buf[2];
++                           BGMAC_CHIPCTL_1_IF_TYPE_MII;
++              char buf[4];
+-              if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) {
++              if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
+                       if (kstrtou8(buf, 0, &et_swtype))
+                               bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n",
+                                         buf);
+@@ -970,6 +996,8 @@ static void bgmac_chip_reset(struct bgma
+       bgmac_miiconfig(bgmac);
+       bgmac_phy_init(bgmac);
++      netdev_reset_queue(bgmac->net_dev);
++
+       bgmac->int_status = 0;
+ }
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -333,7 +333,7 @@
+ #define BGMAC_CHIPCTL_1_IF_TYPE_MASK          0x00000030
+ #define BGMAC_CHIPCTL_1_IF_TYPE_RMII          0x00000000
+-#define BGMAC_CHIPCTL_1_IF_TYPE_MI            0x00000010
++#define BGMAC_CHIPCTL_1_IF_TYPE_MII           0x00000010
+ #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII         0x00000020
+ #define BGMAC_CHIPCTL_1_SW_TYPE_MASK          0x000000C0
+ #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY          0x00000000
+@@ -384,6 +384,8 @@ struct bgmac_dma_ring {
+       u16 mmio_base;
+       struct bgmac_dma_desc *cpu_base;
+       dma_addr_t dma_base;
++      u32 index_base; /* Used for unaligned rings only, otherwise 0 */
++      bool unaligned;
+       struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];
+ };