b43: Remove PIO RX workqueue
This removes the PIO RX work. It's not needed anymore, because we can sleep in the threaded interrupt handler. Signed-off-by: Michael Buesch <mb@bu3sch.de> Tested-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
637dae3f63
commit
77ca07ffe1
3 changed files with 11 additions and 38 deletions
|
@ -3883,7 +3883,6 @@ static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev)
|
||||||
while (skb_queue_len(&wl->tx_queue))
|
while (skb_queue_len(&wl->tx_queue))
|
||||||
dev_kfree_skb(skb_dequeue(&wl->tx_queue));
|
dev_kfree_skb(skb_dequeue(&wl->tx_queue));
|
||||||
|
|
||||||
b43_pio_stop(dev);
|
|
||||||
b43_mac_suspend(dev);
|
b43_mac_suspend(dev);
|
||||||
free_irq(dev->dev->irq, dev);
|
free_irq(dev->dev->irq, dev);
|
||||||
b43dbg(wl, "Wireless interface stopped\n");
|
b43dbg(wl, "Wireless interface stopped\n");
|
||||||
|
|
|
@ -32,9 +32,6 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
||||||
|
|
||||||
static void b43_pio_rx_work(struct work_struct *work);
|
|
||||||
|
|
||||||
|
|
||||||
static u16 generate_cookie(struct b43_pio_txqueue *q,
|
static u16 generate_cookie(struct b43_pio_txqueue *q,
|
||||||
struct b43_pio_txpacket *pack)
|
struct b43_pio_txpacket *pack)
|
||||||
{
|
{
|
||||||
|
@ -182,7 +179,6 @@ static struct b43_pio_rxqueue *b43_setup_pioqueue_rx(struct b43_wldev *dev,
|
||||||
q->rev = dev->dev->id.revision;
|
q->rev = dev->dev->id.revision;
|
||||||
q->mmio_base = index_to_pioqueue_base(dev, index) +
|
q->mmio_base = index_to_pioqueue_base(dev, index) +
|
||||||
pio_rxqueue_offset(dev);
|
pio_rxqueue_offset(dev);
|
||||||
INIT_WORK(&q->rx_work, b43_pio_rx_work);
|
|
||||||
|
|
||||||
/* Enable Direct FIFO RX (PIO) on the engine. */
|
/* Enable Direct FIFO RX (PIO) on the engine. */
|
||||||
b43_dma_direct_fifo_rx(dev, index, 1);
|
b43_dma_direct_fifo_rx(dev, index, 1);
|
||||||
|
@ -247,13 +243,6 @@ void b43_pio_free(struct b43_wldev *dev)
|
||||||
destroy_queue_tx(pio, tx_queue_AC_BK);
|
destroy_queue_tx(pio, tx_queue_AC_BK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void b43_pio_stop(struct b43_wldev *dev)
|
|
||||||
{
|
|
||||||
if (!b43_using_pio_transfers(dev))
|
|
||||||
return;
|
|
||||||
cancel_work_sync(&dev->pio.rx_queue->rx_work);
|
|
||||||
}
|
|
||||||
|
|
||||||
int b43_pio_init(struct b43_wldev *dev)
|
int b43_pio_init(struct b43_wldev *dev)
|
||||||
{
|
{
|
||||||
struct b43_pio *pio = &dev->pio;
|
struct b43_pio *pio = &dev->pio;
|
||||||
|
@ -745,30 +734,19 @@ static bool pio_rx_frame(struct b43_pio_rxqueue *q)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* RX workqueue. We can sleep, yay! */
|
|
||||||
static void b43_pio_rx_work(struct work_struct *work)
|
|
||||||
{
|
|
||||||
struct b43_pio_rxqueue *q = container_of(work, struct b43_pio_rxqueue,
|
|
||||||
rx_work);
|
|
||||||
unsigned int budget = 50;
|
|
||||||
bool stop;
|
|
||||||
|
|
||||||
do {
|
|
||||||
mutex_lock(&q->dev->wl->mutex);
|
|
||||||
stop = (pio_rx_frame(q) == 0);
|
|
||||||
mutex_unlock(&q->dev->wl->mutex);
|
|
||||||
cond_resched();
|
|
||||||
if (stop)
|
|
||||||
break;
|
|
||||||
} while (--budget);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called with IRQs disabled. */
|
|
||||||
void b43_pio_rx(struct b43_pio_rxqueue *q)
|
void b43_pio_rx(struct b43_pio_rxqueue *q)
|
||||||
{
|
{
|
||||||
/* Due to latency issues we must run the RX path in
|
unsigned int count = 0;
|
||||||
* a workqueue to be able to schedule between packets. */
|
bool stop;
|
||||||
ieee80211_queue_work(q->dev->wl->hw, &q->rx_work);
|
|
||||||
|
while (1) {
|
||||||
|
stop = (pio_rx_frame(q) == 0);
|
||||||
|
if (stop)
|
||||||
|
break;
|
||||||
|
cond_resched();
|
||||||
|
if (WARN_ON_ONCE(++count > 10000))
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void b43_pio_tx_suspend_queue(struct b43_pio_txqueue *q)
|
static void b43_pio_tx_suspend_queue(struct b43_pio_txqueue *q)
|
||||||
|
|
|
@ -104,9 +104,6 @@ struct b43_pio_rxqueue {
|
||||||
struct b43_wldev *dev;
|
struct b43_wldev *dev;
|
||||||
u16 mmio_base;
|
u16 mmio_base;
|
||||||
|
|
||||||
/* Work to reduce latency issues on RX. */
|
|
||||||
struct work_struct rx_work;
|
|
||||||
|
|
||||||
/* Shortcut to the 802.11 core revision. This is to
|
/* Shortcut to the 802.11 core revision. This is to
|
||||||
* avoid horrible pointer dereferencing in the fastpaths. */
|
* avoid horrible pointer dereferencing in the fastpaths. */
|
||||||
u8 rev;
|
u8 rev;
|
||||||
|
@ -160,7 +157,6 @@ static inline void b43_piorx_write32(struct b43_pio_rxqueue *q,
|
||||||
|
|
||||||
|
|
||||||
int b43_pio_init(struct b43_wldev *dev);
|
int b43_pio_init(struct b43_wldev *dev);
|
||||||
void b43_pio_stop(struct b43_wldev *dev);
|
|
||||||
void b43_pio_free(struct b43_wldev *dev);
|
void b43_pio_free(struct b43_wldev *dev);
|
||||||
|
|
||||||
int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb);
|
int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb);
|
||||||
|
|
Loading…
Reference in a new issue