Commit 77ca07ff authored by Michael Buesch's avatar Michael Buesch Committed by John W. Linville

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: default avatarMichael Buesch <mb@bu3sch.de>
Tested-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 637dae3f
...@@ -3883,7 +3883,6 @@ redo: ...@@ -3883,7 +3883,6 @@ redo:
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 @@ ...@@ -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, ...@@ -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) ...@@ -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 @@ rx_error: ...@@ -745,30 +734,19 @@ rx_error:
return 1; return 1;
} }
/* RX workqueue. We can sleep, yay! */ void b43_pio_rx(struct b43_pio_rxqueue *q)
static void b43_pio_rx_work(struct work_struct *work)
{ {
struct b43_pio_rxqueue *q = container_of(work, struct b43_pio_rxqueue, unsigned int count = 0;
rx_work);
unsigned int budget = 50;
bool stop; bool stop;
do { while (1) {
mutex_lock(&q->dev->wl->mutex);
stop = (pio_rx_frame(q) == 0); stop = (pio_rx_frame(q) == 0);
mutex_unlock(&q->dev->wl->mutex);
cond_resched();
if (stop) if (stop)
break; break;
} while (--budget); cond_resched();
} if (WARN_ON_ONCE(++count > 10000))
break;
/* Called with IRQs disabled. */ }
void b43_pio_rx(struct b43_pio_rxqueue *q)
{
/* Due to latency issues we must run the RX path in
* a workqueue to be able to schedule between packets. */
ieee80211_queue_work(q->dev->wl->hw, &q->rx_work);
} }
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 { ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment