b43: Remove PIO RX workqueue
[pandora-kernel.git] / drivers / net / wireless / b43 / pio.c
index 4635baa..3498b68 100644 (file)
@@ -32,9 +32,6 @@
 #include <linux/delay.h>
 
 
-static void b43_pio_rx_work(struct work_struct *work);
-
-
 static u16 generate_cookie(struct b43_pio_txqueue *q,
                           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->mmio_base = index_to_pioqueue_base(dev, index) +
                       pio_rxqueue_offset(dev);
-       INIT_WORK(&q->rx_work, b43_pio_rx_work);
 
        /* Enable Direct FIFO RX (PIO) on the engine. */
        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);
 }
 
-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)
 {
        struct b43_pio *pio = &dev->pio;
@@ -745,30 +734,19 @@ rx_error:
        return 1;
 }
 
-/* RX workqueue. We can sleep, yay! */
-static void b43_pio_rx_work(struct work_struct *work)
+void b43_pio_rx(struct b43_pio_rxqueue *q)
 {
-       struct b43_pio_rxqueue *q = container_of(work, struct b43_pio_rxqueue,
-                                                rx_work);
-       unsigned int budget = 50;
+       unsigned int count = 0;
        bool stop;
 
-       do {
-               mutex_lock(&q->dev->wl->mutex);
+       while (1) {
                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)
-{
-       /* 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);
+               cond_resched();
+               if (WARN_ON_ONCE(++count > 10000))
+                       break;
+       }
 }
 
 static void b43_pio_tx_suspend_queue(struct b43_pio_txqueue *q)