kernel: update bgmac by adding Florian's upstream changes
authorRafał Miłecki <rafal@milecki.pl>
Tue, 16 Aug 2016 15:40:32 +0000 (17:40 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Tue, 16 Aug 2016 20:42:00 +0000 (22:42 +0200)
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/773-bgmac-add-srab-switch.patch

diff --git a/target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch b/target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch
new file mode 100644 (file)
index 0000000..17fbea0
--- /dev/null
@@ -0,0 +1,105 @@
+From b21fcb259313bcf7d4f73ecd5e44948995c8957c Mon Sep 17 00:00:00 2001
+From: Philippe Reynes <tremyfr@gmail.com>
+Date: Sun, 19 Jun 2016 22:37:05 +0200
+Subject: [PATCH 1/2] net: ethernet: bgmac: use phydev from struct net_device
+
+The private structure contain a pointer to phydev, but the structure
+net_device already contain such pointer. So we can remove the pointer
+phydev in the private structure, and update the driver to use the
+one contained in struct net_device.
+
+Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 17 ++++++-----------
+ drivers/net/ethernet/broadcom/bgmac.h |  1 -
+ 2 files changed, 6 insertions(+), 12 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1320,7 +1320,7 @@ static int bgmac_open(struct net_device
+       }
+       napi_enable(&bgmac->napi);
+-      phy_start(bgmac->phy_dev);
++      phy_start(net_dev->phydev);
+       netif_carrier_on(net_dev);
+       return 0;
+@@ -1332,7 +1332,7 @@ static int bgmac_stop(struct net_device
+       netif_carrier_off(net_dev);
+-      phy_stop(bgmac->phy_dev);
++      phy_stop(net_dev->phydev);
+       napi_disable(&bgmac->napi);
+       bgmac_chip_intrs_off(bgmac);
+@@ -1370,12 +1370,10 @@ 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);
+-
+       if (!netif_running(net_dev))
+               return -EINVAL;
+-      return phy_mii_ioctl(bgmac->phy_dev, ifr, cmd);
++      return phy_mii_ioctl(net_dev->phydev, ifr, cmd);
+ }
+ static const struct net_device_ops bgmac_netdev_ops = {
+@@ -1518,7 +1516,7 @@ static int bgmac_get_settings(struct net
+ {
+       struct bgmac *bgmac = netdev_priv(net_dev);
+-      return phy_ethtool_gset(bgmac->phy_dev, cmd);
++      return phy_ethtool_gset(net_dev->phydev, cmd);
+ }
+ static int bgmac_set_settings(struct net_device *net_dev,
+@@ -1526,7 +1524,7 @@ static int bgmac_set_settings(struct net
+ {
+       struct bgmac *bgmac = netdev_priv(net_dev);
+-      return phy_ethtool_sset(bgmac->phy_dev, cmd);
++      return phy_ethtool_sset(net_dev->phydev, cmd);
+ }
+ static void bgmac_get_drvinfo(struct net_device *net_dev,
+@@ -1563,7 +1561,7 @@ static int bgmac_mii_write(struct mii_bu
+ static void bgmac_adjust_link(struct net_device *net_dev)
+ {
+       struct bgmac *bgmac = netdev_priv(net_dev);
+-      struct phy_device *phy_dev = bgmac->phy_dev;
++      struct phy_device *phy_dev = net_dev->phydev;
+       bool update = false;
+       if (phy_dev->link) {
+@@ -1607,8 +1605,6 @@ static int bgmac_fixed_phy_register(stru
+               return err;
+       }
+-      bgmac->phy_dev = phy_dev;
+-
+       return err;
+ }
+@@ -1661,7 +1657,6 @@ static int bgmac_mii_register(struct bgm
+               err = PTR_ERR(phy_dev);
+               goto err_unregister_bus;
+       }
+-      bgmac->phy_dev = phy_dev;
+       return err;
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -441,7 +441,6 @@ struct bgmac {
+       struct net_device *net_dev;
+       struct napi_struct napi;
+       struct mii_bus *mii_bus;
+-      struct phy_device *phy_dev;
+       /* DMA */
+       struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
diff --git a/target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch b/target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch
new file mode 100644 (file)
index 0000000..ea73fda
--- /dev/null
@@ -0,0 +1,37 @@
+From d2b13233879ca1268a1c027d4573109e5a777811 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 23 Jun 2016 14:23:12 -0700
+Subject: [PATCH 1/3] net: bgmac: Fix SOF bit checking
+
+We are checking for the Start of Frame bit in the ctl1 word, while this
+bit is set in the ctl0 word instead. Read the ctl0 word and update the
+check to verify that.
+
+Fixes: 9cde94506eac ("bgmac: implement scatter/gather support")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -269,15 +269,16 @@ static void bgmac_dma_tx_free(struct bgm
+       while (ring->start != ring->end) {
+               int slot_idx = ring->start % BGMAC_TX_RING_SLOTS;
+               struct bgmac_slot_info *slot = &ring->slots[slot_idx];
+-              u32 ctl1;
++              u32 ctl0, ctl1;
+               int len;
+               if (slot_idx == empty_slot)
+                       break;
++              ctl0 = le32_to_cpu(ring->cpu_base[slot_idx].ctl0);
+               ctl1 = le32_to_cpu(ring->cpu_base[slot_idx].ctl1);
+               len = ctl1 & BGMAC_DESC_CTL1_LEN;
+-              if (ctl1 & BGMAC_DESC_CTL0_SOF)
++              if (ctl0 & BGMAC_DESC_CTL0_SOF)
+                       /* Unmap no longer used buffer */
+                       dma_unmap_single(dma_dev, slot->dma_addr, len,
+                                        DMA_TO_DEVICE);
diff --git a/target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch b/target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch
new file mode 100644 (file)
index 0000000..84772aa
--- /dev/null
@@ -0,0 +1,28 @@
+From c3897f2a69e54dd113fc9abd2daf872e5b495798 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 23 Jun 2016 14:25:32 -0700
+Subject: [PATCH 2/3] net: bgmac: Start transmit queue in bgmac_open
+
+The driver does not start the transmit queue in bgmac_open(). If the
+queue was stopped prior to closing then re-opening the interface, we
+would never be able to wake-up again.
+
+Fixes: dd4544f05469 ("bgmac: driver for GBit MAC core on BCMA bus")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1324,6 +1324,9 @@ static int bgmac_open(struct net_device
+       phy_start(net_dev->phydev);
+       netif_carrier_on(net_dev);
++
++      netif_start_queue(net_dev);
++
+       return 0;
+ }
diff --git a/target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch b/target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch
new file mode 100644 (file)
index 0000000..edb027c
--- /dev/null
@@ -0,0 +1,28 @@
+From 3894396e64994f31c3ef5c7e6f63dded0593e567 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 23 Jun 2016 14:25:33 -0700
+Subject: [PATCH 3/3] net: bgmac: Remove superflous netif_carrier_on()
+
+bgmac_open() calls phy_start() to initialize the PHY state machine,
+which will set the interface's carrier state accordingly, no need to
+force that as this could be conflicting with the PHY state determined by
+PHYLIB.
+
+Fixes: dd4544f05469 ("bgmac: driver for GBit MAC core on BCMA bus")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1323,8 +1323,6 @@ static int bgmac_open(struct net_device
+       phy_start(net_dev->phydev);
+-      netif_carrier_on(net_dev);
+-
+       netif_start_queue(net_dev);
+       return 0;
index 4348574..14986b5 100644 (file)
@@ -12,7 +12,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  #include <linux/bcm47xx_nvram.h>
  
  static const struct bcma_device_id bgmac_bcma_tbl[] = {
-@@ -1683,6 +1684,17 @@ static void bgmac_mii_unregister(struct
+@@ -1680,6 +1681,17 @@ static void bgmac_mii_unregister(struct
        mdiobus_free(mii_bus);
  }
  
@@ -30,7 +30,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  /**************************************************
   * BCMA bus ops
   **************************************************/
-@@ -1828,6 +1840,14 @@ static int bgmac_probe(struct bcma_devic
+@@ -1825,6 +1837,14 @@ static int bgmac_probe(struct bcma_devic
        net_dev->hw_features = net_dev->features;
        net_dev->vlan_features = net_dev->features;
  
@@ -45,7 +45,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
        err = register_netdev(bgmac->net_dev);
        if (err) {
                bgmac_err(bgmac, "Cannot register net device\n");
-@@ -1854,6 +1874,10 @@ static void bgmac_remove(struct bcma_dev
+@@ -1851,6 +1871,10 @@ static void bgmac_remove(struct bcma_dev
  {
        struct bgmac *bgmac = bcma_get_drvdata(core);
  
@@ -58,7 +58,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
        netif_napi_del(&bgmac->napi);
 --- a/drivers/net/ethernet/broadcom/bgmac.h
 +++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -463,6 +463,9 @@ struct bgmac {
+@@ -462,6 +462,9 @@ struct bgmac {
        bool has_robosw;
  
        bool loopback;