bcm53xx: update bgmac driver
[15.05/openwrt.git] / target / linux / bcm53xx / patches-3.10 / 213-bgmac-add-support-for-Byte-Queue-Limits.patch
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
new file mode 100644 (file)
index 0000000..440461a
--- /dev/null
@@ -0,0 +1,50 @@
+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);