ath9k: Handle tx desc shortage more appropriately
authorVasanthakumar Thiagarajan <vasanth@atheros.com>
Wed, 15 Jul 2009 00:17:11 +0000 (20:17 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 24 Jul 2009 19:05:18 +0000 (15:05 -0400)
Update tx BA window and complete the frame as failed
one if we can't clone the holding descriptor due to
unavailability of descriptors.

Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/xmit.c

index 24663ce10ef8bdacbc8bb70af59d69a98411baa8..4ff155e8ee593171cc525699126f00e9a6855e27 100644 (file)
@@ -382,8 +382,24 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
                                struct ath_buf *tbf;
 
                                tbf = ath_clone_txbuf(sc, bf_last);
-                               if (!tbf)
+                               /*
+                                * Update tx baw and complete the frame with
+                                * failed status if we run out of tx buf
+                                */
+                               if (!tbf) {
+                                       spin_lock_bh(&txq->axq_lock);
+                                       ath_tx_update_baw(sc, tid,
+                                                         bf->bf_seqno);
+                                       spin_unlock_bh(&txq->axq_lock);
+
+                                       bf->bf_state.bf_type |= BUF_XRETRY;
+                                       ath_tx_rc_status(bf, ds, nbad,
+                                                        0, false);
+                                       ath_tx_complete_buf(sc, bf, &bf_head,
+                                                           0, 0);
                                        break;
+                               }
+
                                ath9k_hw_cleartxdesc(sc->sc_ah, tbf->bf_desc);
                                list_add_tail(&tbf->list, &bf_head);
                        } else {