From: Hauke Mehrtens 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);