Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / net / wireless / b43legacy / pio.h
diff --git a/kernel/drivers/net/wireless/b43legacy/pio.h b/kernel/drivers/net/wireless/b43legacy/pio.h
new file mode 100644 (file)
index 0000000..8e6773e
--- /dev/null
@@ -0,0 +1,158 @@
+#ifndef B43legacy_PIO_H_
+#define B43legacy_PIO_H_
+
+#include "b43legacy.h"
+
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/skbuff.h>
+
+
+#define B43legacy_PIO_TXCTL            0x00
+#define B43legacy_PIO_TXDATA           0x02
+#define B43legacy_PIO_TXQBUFSIZE       0x04
+#define B43legacy_PIO_RXCTL            0x08
+#define B43legacy_PIO_RXDATA           0x0A
+
+#define B43legacy_PIO_TXCTL_WRITELO    (1 << 0)
+#define B43legacy_PIO_TXCTL_WRITEHI    (1 << 1)
+#define B43legacy_PIO_TXCTL_COMPLETE   (1 << 2)
+#define B43legacy_PIO_TXCTL_INIT       (1 << 3)
+#define B43legacy_PIO_TXCTL_SUSPEND    (1 << 7)
+
+#define B43legacy_PIO_RXCTL_DATAAVAILABLE      (1 << 0)
+#define B43legacy_PIO_RXCTL_READY              (1 << 1)
+
+/* PIO constants */
+#define B43legacy_PIO_MAXTXDEVQPACKETS 31
+#define B43legacy_PIO_TXQADJUST                80
+
+/* PIO tuning knobs */
+#define B43legacy_PIO_MAXTXPACKETS     256
+
+
+
+#ifdef CONFIG_B43LEGACY_PIO
+
+
+struct b43legacy_pioqueue;
+struct b43legacy_xmitstatus;
+
+struct b43legacy_pio_txpacket {
+       struct b43legacy_pioqueue *queue;
+       struct sk_buff *skb;
+       struct list_head list;
+};
+
+#define pio_txpacket_getindex(packet) ((int)((packet) - \
+                             (packet)->queue->tx_packets_cache))
+
+struct b43legacy_pioqueue {
+       struct b43legacy_wldev *dev;
+       u16 mmio_base;
+
+       bool tx_suspended;
+       bool tx_frozen;
+       bool need_workarounds; /* Workarounds needed for core.rev < 3 */
+
+       /* Adjusted size of the device internal TX buffer. */
+       u16 tx_devq_size;
+       /* Used octets of the device internal TX buffer. */
+       u16 tx_devq_used;
+       /* Used packet slots in the device internal TX buffer. */
+       u8 tx_devq_packets;
+       /* Packets from the txfree list can
+        * be taken on incoming TX requests.
+        */
+       struct list_head txfree;
+       unsigned int nr_txfree;
+       /* Packets on the txqueue are queued,
+        * but not completely written to the chip, yet.
+        */
+       struct list_head txqueue;
+       /* Packets on the txrunning queue are completely
+        * posted to the device. We are waiting for the txstatus.
+        */
+       struct list_head txrunning;
+       struct tasklet_struct txtask;
+       struct b43legacy_pio_txpacket
+                        tx_packets_cache[B43legacy_PIO_MAXTXPACKETS];
+};
+
+static inline
+u16 b43legacy_pio_read(struct b43legacy_pioqueue *queue,
+                    u16 offset)
+{
+       return b43legacy_read16(queue->dev, queue->mmio_base + offset);
+}
+
+static inline
+void b43legacy_pio_write(struct b43legacy_pioqueue *queue,
+                      u16 offset, u16 value)
+{
+       b43legacy_write16(queue->dev, queue->mmio_base + offset, value);
+       mmiowb();
+}
+
+
+int b43legacy_pio_init(struct b43legacy_wldev *dev);
+void b43legacy_pio_free(struct b43legacy_wldev *dev);
+
+int b43legacy_pio_tx(struct b43legacy_wldev *dev,
+                  struct sk_buff *skb);
+void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
+                                const struct b43legacy_txstatus *status);
+void b43legacy_pio_rx(struct b43legacy_pioqueue *queue);
+
+/* Suspend TX queue in hardware. */
+void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue);
+void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue);
+/* Suspend (freeze) the TX tasklet (software level). */
+void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev);
+void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev);
+
+#else /* CONFIG_B43LEGACY_PIO */
+
+static inline
+int b43legacy_pio_init(struct b43legacy_wldev *dev)
+{
+       return 0;
+}
+static inline
+void b43legacy_pio_free(struct b43legacy_wldev *dev)
+{
+}
+static inline
+int b43legacy_pio_tx(struct b43legacy_wldev *dev,
+                  struct sk_buff *skb)
+{
+       return 0;
+}
+static inline
+void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
+                                const struct b43legacy_txstatus *status)
+{
+}
+static inline
+void b43legacy_pio_rx(struct b43legacy_pioqueue *queue)
+{
+}
+static inline
+void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue)
+{
+}
+static inline
+void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue)
+{
+}
+static inline
+void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev)
+{
+}
+static inline
+void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev)
+{
+}
+
+#endif /* CONFIG_B43LEGACY_PIO */
+#endif /* B43legacy_PIO_H_ */