Commit f7c0fa4c authored by Rasesh Mody's avatar Rasesh Mody Committed by David S. Miller

bna: Fix for TX queue

Change Details:
	- Call netif_wake_queue() if we have freed up sufficient elements
	at the end of completion processing
	- Add netif_queue_stopped counter back to bnad_drv_stats {}
	- Get netif_queue_stopped value from stack
	- Remove BUG_ON() on value returned by pci_unmap_addr()
Signed-off-by: default avatarDebashis Dutt <ddutt@brocade.com>
Signed-off-by: default avatarRasesh Mody <rmody@brocade.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 886f7fed
...@@ -109,7 +109,7 @@ static void ...@@ -109,7 +109,7 @@ static void
bnad_free_all_txbufs(struct bnad *bnad, bnad_free_all_txbufs(struct bnad *bnad,
struct bna_tcb *tcb) struct bna_tcb *tcb)
{ {
u16 unmap_cons; u32 unmap_cons;
struct bnad_unmap_q *unmap_q = tcb->unmap_q; struct bnad_unmap_q *unmap_q = tcb->unmap_q;
struct bnad_skb_unmap *unmap_array; struct bnad_skb_unmap *unmap_array;
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
...@@ -244,7 +244,7 @@ bnad_tx_free_tasklet(unsigned long bnad_ptr) ...@@ -244,7 +244,7 @@ bnad_tx_free_tasklet(unsigned long bnad_ptr)
{ {
struct bnad *bnad = (struct bnad *)bnad_ptr; struct bnad *bnad = (struct bnad *)bnad_ptr;
struct bna_tcb *tcb; struct bna_tcb *tcb;
u32 acked; u32 acked = 0;
int i, j; int i, j;
for (i = 0; i < bnad->num_tx; i++) { for (i = 0; i < bnad->num_tx; i++) {
...@@ -263,6 +263,20 @@ bnad_tx_free_tasklet(unsigned long bnad_ptr) ...@@ -263,6 +263,20 @@ bnad_tx_free_tasklet(unsigned long bnad_ptr)
smp_mb__before_clear_bit(); smp_mb__before_clear_bit();
clear_bit(BNAD_TXQ_FREE_SENT, &tcb->flags); clear_bit(BNAD_TXQ_FREE_SENT, &tcb->flags);
} }
if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED,
&tcb->flags)))
continue;
if (netif_queue_stopped(bnad->netdev)) {
if (acked && netif_carrier_ok(bnad->netdev) &&
BNA_QE_FREE_CNT(tcb, tcb->q_depth) >=
BNAD_NETIF_WAKE_THRESHOLD) {
netif_wake_queue(bnad->netdev);
/* TODO */
/* Counters for individual TxQs? */
BNAD_UPDATE_CTR(bnad,
netif_queue_wakeup);
}
}
} }
} }
} }
...@@ -334,8 +348,6 @@ bnad_free_all_rxbufs(struct bnad *bnad, struct bna_rcb *rcb) ...@@ -334,8 +348,6 @@ bnad_free_all_rxbufs(struct bnad *bnad, struct bna_rcb *rcb)
skb = unmap_q->unmap_array[unmap_cons].skb; skb = unmap_q->unmap_array[unmap_cons].skb;
if (!skb) if (!skb)
continue; continue;
BUG_ON(!(pci_unmap_addr(
&unmap_q->unmap_array[unmap_cons], dma_addr)));
unmap_q->unmap_array[unmap_cons].skb = NULL; unmap_q->unmap_array[unmap_cons].skb = NULL;
pci_unmap_single(bnad->pcidev, pci_unmap_addr(&unmap_q-> pci_unmap_single(bnad->pcidev, pci_unmap_addr(&unmap_q->
unmap_array[unmap_cons], unmap_array[unmap_cons],
......
...@@ -126,6 +126,7 @@ struct bnad_completion { ...@@ -126,6 +126,7 @@ struct bnad_completion {
struct bnad_drv_stats { struct bnad_drv_stats {
u64 netif_queue_stop; u64 netif_queue_stop;
u64 netif_queue_wakeup; u64 netif_queue_wakeup;
u64 netif_queue_stopped;
u64 tso4; u64 tso4;
u64 tso6; u64 tso6;
u64 tso_err; u64 tso_err;
...@@ -308,8 +309,10 @@ extern void bnad_cleanup_rx(struct bnad *bnad, uint rx_id); ...@@ -308,8 +309,10 @@ extern void bnad_cleanup_rx(struct bnad *bnad, uint rx_id);
extern void bnad_dim_timer_start(struct bnad *bnad); extern void bnad_dim_timer_start(struct bnad *bnad);
/* Statistics */ /* Statistics */
extern void bnad_netdev_qstats_fill(struct bnad *bnad, struct rtnl_link_stats64 *stats); extern void bnad_netdev_qstats_fill(struct bnad *bnad,
extern void bnad_netdev_hwstats_fill(struct bnad *bnad, struct rtnl_link_stats64 *stats); struct rtnl_link_stats64 *stats);
extern void bnad_netdev_hwstats_fill(struct bnad *bnad,
struct rtnl_link_stats64 *stats);
/** /**
* MACROS * MACROS
......
...@@ -68,6 +68,7 @@ static char *bnad_net_stats_strings[BNAD_ETHTOOL_STATS_NUM] = { ...@@ -68,6 +68,7 @@ static char *bnad_net_stats_strings[BNAD_ETHTOOL_STATS_NUM] = {
"netif_queue_stop", "netif_queue_stop",
"netif_queue_wakeup", "netif_queue_wakeup",
"netif_queue_stopped",
"tso4", "tso4",
"tso6", "tso6",
"tso_err", "tso_err",
...@@ -1180,6 +1181,9 @@ bnad_get_ethtool_stats(struct net_device *netdev, struct ethtool_stats *stats, ...@@ -1180,6 +1181,9 @@ bnad_get_ethtool_stats(struct net_device *netdev, struct ethtool_stats *stats,
bi = sizeof(*net_stats64) / sizeof(u64); bi = sizeof(*net_stats64) / sizeof(u64);
/* Get netif_queue_stopped from stack */
bnad->stats.drv_stats.netif_queue_stopped = netif_queue_stopped(netdev);
/* Fill driver stats into ethtool buffers */ /* Fill driver stats into ethtool buffers */
stats64 = (u64 *)&bnad->stats.drv_stats; stats64 = (u64 *)&bnad->stats.drv_stats;
for (i = 0; i < sizeof(struct bnad_drv_stats) / sizeof(u64); i++) for (i = 0; i < sizeof(struct bnad_drv_stats) / sizeof(u64); i++)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment