Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 224255
b: refs/heads/master
c: 2fe33e8
h: refs/heads/master
i:
  224253: 11eaff6
  224251: 5d4ed6a
  224247: a65e85c
  224239: c205f9c
  224223: a1fc845
  224191: 7350a39
  224127: 08f548e
  223999: 643b982
  223743: 63afd0d
  223231: 3ba73eb
v: v3
  • Loading branch information
Ido Yariv authored and John W. Linville committed Nov 15, 2010
1 parent 74b9bc8 commit 142e3d1
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 25eeb9e3876a161e3afcc820c6cb72e13f9b7c7e
refs/heads/master: 2fe33e8cff354a3f320549544bffebbbab680145
35 changes: 22 additions & 13 deletions trunk/drivers/net/wireless/wl12xx/wl1271_tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,20 @@ u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set)
return enabled_rates;
}

static void handle_tx_low_watermark(struct wl1271 *wl)
{
unsigned long flags;

if (test_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags) &&
skb_queue_len(&wl->tx_queue) <= WL1271_TX_QUEUE_LOW_WATERMARK) {
/* firmware buffer has space, restart queues */
spin_lock_irqsave(&wl->wl_lock, flags);
ieee80211_wake_queues(wl->hw);
clear_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
spin_unlock_irqrestore(&wl->wl_lock, flags);
}
}

void wl1271_tx_work_locked(struct wl1271 *wl)
{
struct sk_buff *skb;
Expand All @@ -225,6 +239,7 @@ void wl1271_tx_work_locked(struct wl1271 *wl)
if (unlikely(test_and_clear_bit(WL1271_FLAG_STA_RATES_CHANGED,
&wl->flags))) {
unsigned long flags;

spin_lock_irqsave(&wl->wl_lock, flags);
sta_rates = wl->sta_rate_set;
spin_unlock_irqrestore(&wl->wl_lock, flags);
Expand Down Expand Up @@ -285,6 +300,7 @@ void wl1271_tx_work_locked(struct wl1271 *wl)
if (sent_packets) {
/* interrupt the firmware with the new packets */
wl1271_write32(wl, WL1271_HOST_WR_ACCESS, wl->tx_packets_count);
handle_tx_low_watermark(wl);
}

out:
Expand Down Expand Up @@ -399,19 +415,6 @@ void wl1271_tx_complete(struct wl1271 *wl)

wl->tx_results_count++;
}

if (test_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags) &&
skb_queue_len(&wl->tx_queue) <= WL1271_TX_QUEUE_LOW_WATERMARK) {
unsigned long flags;

/* firmware buffer has space, restart queues */
wl1271_debug(DEBUG_TX, "tx_complete: waking queues");
spin_lock_irqsave(&wl->wl_lock, flags);
ieee80211_wake_queues(wl->hw);
clear_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
spin_unlock_irqrestore(&wl->wl_lock, flags);
ieee80211_queue_work(wl->hw, &wl->tx_work);
}
}

/* caller must hold wl->mutex */
Expand All @@ -426,6 +429,12 @@ void wl1271_tx_reset(struct wl1271 *wl)
ieee80211_tx_status(wl->hw, skb);
}

/*
* Make sure the driver is at a consistent state, in case this
* function is called from a context other than interface removal.
*/
handle_tx_low_watermark(wl);

for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
if (wl->tx_frames[i] != NULL) {
skb = wl->tx_frames[i];
Expand Down

0 comments on commit 142e3d1

Please sign in to comment.