Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 193669
b: refs/heads/master
c: 1e73eb6
h: refs/heads/master
i:
  193667: 1132c3a
v: v3
  • Loading branch information
Juuso Oikarinen authored and John W. Linville committed Mar 9, 2010
1 parent 1dbf55a commit 2ce6198
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 32 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: 4aa05917051b01da037a80c3207b48aee252eed2
refs/heads/master: 1e73eb62cec7cf78b7295769b6e51a915518f5a1
2 changes: 2 additions & 0 deletions trunk/drivers/net/wireless/wl12xx/wl1271.h
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,8 @@ struct wl1271 {
#define WL1271_FLAG_IN_ELP (6)
#define WL1271_FLAG_PSM (7)
#define WL1271_FLAG_PSM_REQUESTED (8)
#define WL1271_FLAG_IRQ_PENDING (9)
#define WL1271_FLAG_IRQ_RUNNING (10)
unsigned long flags;

struct wl1271_partition_set part;
Expand Down
76 changes: 47 additions & 29 deletions trunk/drivers/net/wireless/wl12xx/wl1271_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -406,62 +406,80 @@ static void wl1271_fw_status(struct wl1271 *wl,
le32_to_cpu(status->fw_localtime);
}

#define WL1271_IRQ_MAX_LOOPS 10

static void wl1271_irq_work(struct work_struct *work)
{
int ret;
u32 intr;
int loopcount = WL1271_IRQ_MAX_LOOPS;
unsigned long flags;
struct wl1271 *wl =
container_of(work, struct wl1271, irq_work);

mutex_lock(&wl->mutex);

wl1271_debug(DEBUG_IRQ, "IRQ work");

if (wl->state == WL1271_STATE_OFF)
if (unlikely(wl->state == WL1271_STATE_OFF))
goto out;

ret = wl1271_ps_elp_wakeup(wl, true);
if (ret < 0)
goto out;

wl1271_fw_status(wl, wl->fw_status);
intr = le32_to_cpu(wl->fw_status->intr);
if (!intr) {
wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
goto out_sleep;
}
spin_lock_irqsave(&wl->wl_lock, flags);
while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
spin_unlock_irqrestore(&wl->wl_lock, flags);
loopcount--;

intr &= WL1271_INTR_MASK;
wl1271_fw_status(wl, wl->fw_status);
intr = le32_to_cpu(wl->fw_status->intr);
if (!intr) {
wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
continue;
}

if (intr & WL1271_ACX_INTR_EVENT_A) {
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
wl1271_event_handle(wl, 0);
}
intr &= WL1271_INTR_MASK;

if (intr & WL1271_ACX_INTR_EVENT_B) {
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
wl1271_event_handle(wl, 1);
}
if (intr & WL1271_ACX_INTR_DATA) {
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");

if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
wl1271_debug(DEBUG_IRQ,
"WL1271_ACX_INTR_INIT_COMPLETE");
/* check for tx results */
if (wl->fw_status->tx_results_counter !=
(wl->tx_results_count & 0xff))
wl1271_tx_complete(wl);

if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
wl1271_rx(wl, wl->fw_status);
}

if (intr & WL1271_ACX_INTR_EVENT_A) {
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
wl1271_event_handle(wl, 0);
}

if (intr & WL1271_ACX_INTR_EVENT_B) {
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
wl1271_event_handle(wl, 1);
}

if (intr & WL1271_ACX_INTR_DATA) {
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
wl1271_debug(DEBUG_IRQ,
"WL1271_ACX_INTR_INIT_COMPLETE");

/* check for tx results */
if (wl->fw_status->tx_results_counter !=
(wl->tx_results_count & 0xff))
wl1271_tx_complete(wl);
if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");

wl1271_rx(wl, wl->fw_status);
spin_lock_irqsave(&wl->wl_lock, flags);
}

out_sleep:
if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
ieee80211_queue_work(wl->hw, &wl->irq_work);
else
clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
spin_unlock_irqrestore(&wl->wl_lock, flags);

wl1271_ps_elp_sleep(wl);

out:
Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/net/wireless/wl12xx/wl1271_sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,9 @@ static irqreturn_t wl1271_irq(int irq, void *cookie)
wl->elp_compl = NULL;
}

ieee80211_queue_work(wl->hw, &wl->irq_work);
if (!test_and_set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags))
ieee80211_queue_work(wl->hw, &wl->irq_work);
set_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
spin_unlock_irqrestore(&wl->wl_lock, flags);

return IRQ_HANDLED;
Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/net/wireless/wl12xx/wl1271_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,9 @@ static irqreturn_t wl1271_irq(int irq, void *cookie)
wl->elp_compl = NULL;
}

ieee80211_queue_work(wl->hw, &wl->irq_work);
if (!test_and_set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags))
ieee80211_queue_work(wl->hw, &wl->irq_work);
set_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
spin_unlock_irqrestore(&wl->wl_lock, flags);

return IRQ_HANDLED;
Expand Down

0 comments on commit 2ce6198

Please sign in to comment.