static void tx_reclaim_skb(struct bfin_mac_local *lp) { int timeout_cnt = MAX_TIMEOUT_CNT; if (tx_list_head->status.status_word != 0) _tx_reclaim_skb(); if (current_tx_ptr->next == tx_list_head) { while (tx_list_head->status.status_word == 0) { udelay(10); if (!(bfin_read_DMA2_IRQ_STATUS() & DMA_RUN)) break; if (timeout_cnt-- < 0) break; } if (timeout_cnt >= 0) _tx_reclaim_skb(); else netif_stop_queue(lp->ndev); } if (current_tx_ptr->next != tx_list_head && netif_queue_stopped(lp->ndev)) netif_wake_queue(lp->ndev); if (tx_list_head != current_tx_ptr) { if (netif_queue_stopped(lp->ndev)) lp->tx_reclaim_timer.expires = jiffies + (TX_RECLAIM_JIFFIES >> 4); else lp->tx_reclaim_timer.expires = jiffies + TX_RECLAIM_JIFFIES; mod_timer(&lp->tx_reclaim_timer, lp->tx_reclaim_timer.expires); }
static void tx_reclaim_skb(struct bfin_mac_local *lp) { int timeout_cnt = MAX_TIMEOUT_CNT; if (tx_list_head->status.status_word != 0) _tx_reclaim_skb(); if (current_tx_ptr->next == tx_list_head) { while (tx_list_head->status.status_word == 0) { /* slow down polling to avoid too many queue stop. */ udelay(10); /* reclaim skb if DMA is not running. */ if (!(bfin_read_DMA2_IRQ_STATUS() & DMA_RUN)) break; if (timeout_cnt-- < 0) break; } if (timeout_cnt >= 0) _tx_reclaim_skb(); else netif_stop_queue(lp->ndev); } if (current_tx_ptr->next != tx_list_head && netif_queue_stopped(lp->ndev)) netif_wake_queue(lp->ndev); if (tx_list_head != current_tx_ptr) { /* shorten the timer interval if tx queue is stopped */ if (netif_queue_stopped(lp->ndev)) lp->tx_reclaim_timer.expires = jiffies + (TX_RECLAIM_JIFFIES >> 4); else lp->tx_reclaim_timer.expires = jiffies + TX_RECLAIM_JIFFIES; mod_timer(&lp->tx_reclaim_timer, lp->tx_reclaim_timer.expires); }