linux/drivers/net/wireless/b43legacy/pio.h
<<
>>
Prefs
   1#ifndef B43legacy_PIO_H_
   2#define B43legacy_PIO_H_
   3
   4#include "b43legacy.h"
   5
   6#include <linux/interrupt.h>
   7#include <linux/list.h>
   8#include <linux/skbuff.h>
   9
  10
  11#define B43legacy_PIO_TXCTL             0x00
  12#define B43legacy_PIO_TXDATA            0x02
  13#define B43legacy_PIO_TXQBUFSIZE        0x04
  14#define B43legacy_PIO_RXCTL             0x08
  15#define B43legacy_PIO_RXDATA            0x0A
  16
  17#define B43legacy_PIO_TXCTL_WRITELO     (1 << 0)
  18#define B43legacy_PIO_TXCTL_WRITEHI     (1 << 1)
  19#define B43legacy_PIO_TXCTL_COMPLETE    (1 << 2)
  20#define B43legacy_PIO_TXCTL_INIT        (1 << 3)
  21#define B43legacy_PIO_TXCTL_SUSPEND     (1 << 7)
  22
  23#define B43legacy_PIO_RXCTL_DATAAVAILABLE       (1 << 0)
  24#define B43legacy_PIO_RXCTL_READY               (1 << 1)
  25
  26/* PIO constants */
  27#define B43legacy_PIO_MAXTXDEVQPACKETS  31
  28#define B43legacy_PIO_TXQADJUST         80
  29
  30/* PIO tuning knobs */
  31#define B43legacy_PIO_MAXTXPACKETS      256
  32
  33
  34
  35#ifdef CONFIG_B43LEGACY_PIO
  36
  37
  38struct b43legacy_pioqueue;
  39struct b43legacy_xmitstatus;
  40
  41struct b43legacy_pio_txpacket {
  42        struct b43legacy_pioqueue *queue;
  43        struct sk_buff *skb;
  44        struct list_head list;
  45};
  46
  47#define pio_txpacket_getindex(packet) ((int)((packet) - \
  48                              (packet)->queue->tx_packets_cache))
  49
  50struct b43legacy_pioqueue {
  51        struct b43legacy_wldev *dev;
  52        u16 mmio_base;
  53
  54        bool tx_suspended;
  55        bool tx_frozen;
  56        bool need_workarounds; /* Workarounds needed for core.rev < 3 */
  57
  58        /* Adjusted size of the device internal TX buffer. */
  59        u16 tx_devq_size;
  60        /* Used octets of the device internal TX buffer. */
  61        u16 tx_devq_used;
  62        /* Used packet slots in the device internal TX buffer. */
  63        u8 tx_devq_packets;
  64        /* Packets from the txfree list can
  65         * be taken on incoming TX requests.
  66         */
  67        struct list_head txfree;
  68        unsigned int nr_txfree;
  69        /* Packets on the txqueue are queued,
  70         * but not completely written to the chip, yet.
  71         */
  72        struct list_head txqueue;
  73        /* Packets on the txrunning queue are completely
  74         * posted to the device. We are waiting for the txstatus.
  75         */
  76        struct list_head txrunning;
  77        struct tasklet_struct txtask;
  78        struct b43legacy_pio_txpacket
  79                         tx_packets_cache[B43legacy_PIO_MAXTXPACKETS];
  80};
  81
  82static inline
  83u16 b43legacy_pio_read(struct b43legacy_pioqueue *queue,
  84                     u16 offset)
  85{
  86        return b43legacy_read16(queue->dev, queue->mmio_base + offset);
  87}
  88
  89static inline
  90void b43legacy_pio_write(struct b43legacy_pioqueue *queue,
  91                       u16 offset, u16 value)
  92{
  93        b43legacy_write16(queue->dev, queue->mmio_base + offset, value);
  94        mmiowb();
  95}
  96
  97
  98int b43legacy_pio_init(struct b43legacy_wldev *dev);
  99void b43legacy_pio_free(struct b43legacy_wldev *dev);
 100
 101int b43legacy_pio_tx(struct b43legacy_wldev *dev,
 102                   struct sk_buff *skb);
 103void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
 104                                 const struct b43legacy_txstatus *status);
 105void b43legacy_pio_rx(struct b43legacy_pioqueue *queue);
 106
 107/* Suspend TX queue in hardware. */
 108void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue);
 109void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue);
 110/* Suspend (freeze) the TX tasklet (software level). */
 111void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev);
 112void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev);
 113
 114#else /* CONFIG_B43LEGACY_PIO */
 115
 116static inline
 117int b43legacy_pio_init(struct b43legacy_wldev *dev)
 118{
 119        return 0;
 120}
 121static inline
 122void b43legacy_pio_free(struct b43legacy_wldev *dev)
 123{
 124}
 125static inline
 126int b43legacy_pio_tx(struct b43legacy_wldev *dev,
 127                   struct sk_buff *skb)
 128{
 129        return 0;
 130}
 131static inline
 132void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
 133                                 const struct b43legacy_txstatus *status)
 134{
 135}
 136static inline
 137void b43legacy_pio_rx(struct b43legacy_pioqueue *queue)
 138{
 139}
 140static inline
 141void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue)
 142{
 143}
 144static inline
 145void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue)
 146{
 147}
 148static inline
 149void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev)
 150{
 151}
 152static inline
 153void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev)
 154{
 155}
 156
 157#endif /* CONFIG_B43LEGACY_PIO */
 158#endif /* B43legacy_PIO_H_ */
 159