aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bgmac.c
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2013-09-29 07:54:58 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-01 01:08:55 -0400
commit49a467b4f607245d44d21627999ab75abe2c7f8b (patch)
treea8c1d431be962f292b51f28eea6e5a48d9c70aae /drivers/net/ethernet/broadcom/bgmac.c
parent5055544e96ca2ef8a0b62e7ea3c21460698d43ef (diff)
bgmac: add support for Byte Queue Limits
This makes it possible to use some more advanced queuing techniques with this driver. When multi queue support will be added some changes to Byte Queue handling is needed. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bgmac.c')
-rw-r--r--drivers/net/ethernet/broadcom/bgmac.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
index 249468f95365..7eca5a174733 100644
--- 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(struct bgmac *bgmac,
149 dma_desc->ctl0 = cpu_to_le32(ctl0); 149 dma_desc->ctl0 = cpu_to_le32(ctl0);
150 dma_desc->ctl1 = cpu_to_le32(ctl1); 150 dma_desc->ctl1 = cpu_to_le32(ctl1);
151 151
152 netdev_sent_queue(net_dev, skb->len);
153
152 wmb(); 154 wmb();
153 155
154 /* Increase ring->end to point empty slot. We tell hardware the first 156 /* Increase ring->end to point empty slot. We tell hardware the first
@@ -178,6 +180,7 @@ static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
178 struct device *dma_dev = bgmac->core->dma_dev; 180 struct device *dma_dev = bgmac->core->dma_dev;
179 int empty_slot; 181 int empty_slot;
180 bool freed = false; 182 bool freed = false;
183 unsigned bytes_compl = 0, pkts_compl = 0;
181 184
182 /* The last slot that hardware didn't consume yet */ 185 /* The last slot that hardware didn't consume yet */
183 empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); 186 empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
@@ -195,6 +198,9 @@ static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
195 slot->skb->len, DMA_TO_DEVICE); 198 slot->skb->len, DMA_TO_DEVICE);
196 slot->dma_addr = 0; 199 slot->dma_addr = 0;
197 200
201 bytes_compl += slot->skb->len;
202 pkts_compl++;
203
198 /* Free memory! :) */ 204 /* Free memory! :) */
199 dev_kfree_skb(slot->skb); 205 dev_kfree_skb(slot->skb);
200 slot->skb = NULL; 206 slot->skb = NULL;
@@ -208,6 +214,8 @@ static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
208 freed = true; 214 freed = true;
209 } 215 }
210 216
217 netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl);
218
211 if (freed && netif_queue_stopped(bgmac->net_dev)) 219 if (freed && netif_queue_stopped(bgmac->net_dev))
212 netif_wake_queue(bgmac->net_dev); 220 netif_wake_queue(bgmac->net_dev);
213} 221}
@@ -988,6 +996,8 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
988 bgmac_miiconfig(bgmac); 996 bgmac_miiconfig(bgmac);
989 bgmac_phy_init(bgmac); 997 bgmac_phy_init(bgmac);
990 998
999 netdev_reset_queue(bgmac->net_dev);
1000
991 bgmac->int_status = 0; 1001 bgmac->int_status = 0;
992} 1002}
993 1003