linux/drivers/net/wireless/b43/pio.h
<<
>>
Prefs
   1#ifndef B43_PIO_H_
   2#define B43_PIO_H_
   3
   4#include "b43.h"
   5
   6#include <linux/interrupt.h>
   7#include <linux/io.h>
   8#include <linux/list.h>
   9#include <linux/skbuff.h>
  10
  11
  12/*** Registers for PIO queues up to revision 7. ***/
  13/* TX queue. */
  14#define B43_PIO_TXCTL                   0x00
  15#define  B43_PIO_TXCTL_WRITELO          0x0001
  16#define  B43_PIO_TXCTL_WRITEHI          0x0002
  17#define  B43_PIO_TXCTL_EOF              0x0004
  18#define  B43_PIO_TXCTL_FREADY           0x0008
  19#define  B43_PIO_TXCTL_FLUSHREQ         0x0020
  20#define  B43_PIO_TXCTL_FLUSHPEND        0x0040
  21#define  B43_PIO_TXCTL_SUSPREQ          0x0080
  22#define  B43_PIO_TXCTL_QSUSP            0x0100
  23#define  B43_PIO_TXCTL_COMMCNT          0xFC00
  24#define  B43_PIO_TXCTL_COMMCNT_SHIFT    10
  25#define B43_PIO_TXDATA                  0x02
  26#define B43_PIO_TXQBUFSIZE              0x04
  27/* RX queue. */
  28#define B43_PIO_RXCTL                   0x00
  29#define  B43_PIO_RXCTL_FRAMERDY         0x0001
  30#define  B43_PIO_RXCTL_DATARDY          0x0002
  31#define B43_PIO_RXDATA                  0x02
  32
  33/*** Registers for PIO queues revision 8 and later. ***/
  34/* TX queue */
  35#define B43_PIO8_TXCTL                  0x00
  36#define  B43_PIO8_TXCTL_0_7             0x00000001
  37#define  B43_PIO8_TXCTL_8_15            0x00000002
  38#define  B43_PIO8_TXCTL_16_23           0x00000004
  39#define  B43_PIO8_TXCTL_24_31           0x00000008
  40#define  B43_PIO8_TXCTL_EOF             0x00000010
  41#define  B43_PIO8_TXCTL_FREADY          0x00000080
  42#define  B43_PIO8_TXCTL_SUSPREQ         0x00000100
  43#define  B43_PIO8_TXCTL_QSUSP           0x00000200
  44#define  B43_PIO8_TXCTL_FLUSHREQ        0x00000400
  45#define  B43_PIO8_TXCTL_FLUSHPEND       0x00000800
  46#define B43_PIO8_TXDATA                 0x04
  47/* RX queue */
  48#define B43_PIO8_RXCTL                  0x00
  49#define  B43_PIO8_RXCTL_FRAMERDY        0x00000001
  50#define  B43_PIO8_RXCTL_DATARDY         0x00000002
  51#define B43_PIO8_RXDATA                 0x04
  52
  53
  54/* The maximum number of TX-packets the HW can handle. */
  55#define B43_PIO_MAX_NR_TXPACKETS        32
  56
  57
  58#ifdef CONFIG_B43_PIO
  59
  60struct b43_pio_txpacket {
  61        /* Pointer to the TX queue we belong to. */
  62        struct b43_pio_txqueue *queue;
  63        /* The TX data packet. */
  64        struct sk_buff *skb;
  65        /* Index in the (struct b43_pio_txqueue)->packets array. */
  66        u8 index;
  67
  68        struct list_head list;
  69};
  70
  71struct b43_pio_txqueue {
  72        struct b43_wldev *dev;
  73        u16 mmio_base;
  74
  75        /* The device queue buffer size in bytes. */
  76        u16 buffer_size;
  77        /* The number of used bytes in the device queue buffer. */
  78        u16 buffer_used;
  79        /* The number of packets that can still get queued.
  80         * This is decremented on queueing a packet and incremented
  81         * after receiving the transmit status. */
  82        u16 free_packet_slots;
  83
  84        /* True, if the mac80211 queue was stopped due to overflow at TX. */
  85        bool stopped;
  86        /* Our b43 queue index number */
  87        u8 index;
  88        /* The mac80211 QoS queue priority. */
  89        u8 queue_prio;
  90
  91        /* Buffer for TX packet meta data. */
  92        struct b43_pio_txpacket packets[B43_PIO_MAX_NR_TXPACKETS];
  93        struct list_head packets_list;
  94
  95        /* Total number of transmitted packets. */
  96        unsigned int nr_tx_packets;
  97
  98        /* Shortcut to the 802.11 core revision. This is to
  99         * avoid horrible pointer dereferencing in the fastpaths. */
 100        u8 rev;
 101};
 102
 103struct b43_pio_rxqueue {
 104        struct b43_wldev *dev;
 105        u16 mmio_base;
 106
 107        /* Shortcut to the 802.11 core revision. This is to
 108         * avoid horrible pointer dereferencing in the fastpaths. */
 109        u8 rev;
 110};
 111
 112
 113static inline u16 b43_piotx_read16(struct b43_pio_txqueue *q, u16 offset)
 114{
 115        return b43_read16(q->dev, q->mmio_base + offset);
 116}
 117
 118static inline u32 b43_piotx_read32(struct b43_pio_txqueue *q, u16 offset)
 119{
 120        return b43_read32(q->dev, q->mmio_base + offset);
 121}
 122
 123static inline void b43_piotx_write16(struct b43_pio_txqueue *q,
 124                                     u16 offset, u16 value)
 125{
 126        b43_write16(q->dev, q->mmio_base + offset, value);
 127}
 128
 129static inline void b43_piotx_write32(struct b43_pio_txqueue *q,
 130                                     u16 offset, u32 value)
 131{
 132        b43_write32(q->dev, q->mmio_base + offset, value);
 133}
 134
 135
 136static inline u16 b43_piorx_read16(struct b43_pio_rxqueue *q, u16 offset)
 137{
 138        return b43_read16(q->dev, q->mmio_base + offset);
 139}
 140
 141static inline u32 b43_piorx_read32(struct b43_pio_rxqueue *q, u16 offset)
 142{
 143        return b43_read32(q->dev, q->mmio_base + offset);
 144}
 145
 146static inline void b43_piorx_write16(struct b43_pio_rxqueue *q,
 147                                     u16 offset, u16 value)
 148{
 149        b43_write16(q->dev, q->mmio_base + offset, value);
 150}
 151
 152static inline void b43_piorx_write32(struct b43_pio_rxqueue *q,
 153                                     u16 offset, u32 value)
 154{
 155        b43_write32(q->dev, q->mmio_base + offset, value);
 156}
 157
 158
 159int b43_pio_init(struct b43_wldev *dev);
 160void b43_pio_free(struct b43_wldev *dev);
 161
 162int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb);
 163void b43_pio_handle_txstatus(struct b43_wldev *dev,
 164                             const struct b43_txstatus *status);
 165void b43_pio_get_tx_stats(struct b43_wldev *dev,
 166                          struct ieee80211_tx_queue_stats *stats);
 167void b43_pio_rx(struct b43_pio_rxqueue *q);
 168
 169void b43_pio_tx_suspend(struct b43_wldev *dev);
 170void b43_pio_tx_resume(struct b43_wldev *dev);
 171
 172
 173#else /* CONFIG_B43_PIO */
 174
 175
 176static inline int b43_pio_init(struct b43_wldev *dev)
 177{
 178        return 0;
 179}
 180static inline void b43_pio_free(struct b43_wldev *dev)
 181{
 182}
 183static inline void b43_pio_stop(struct b43_wldev *dev)
 184{
 185}
 186static inline int b43_pio_tx(struct b43_wldev *dev,
 187                             struct sk_buff *skb)
 188{
 189        return 0;
 190}
 191static inline void b43_pio_handle_txstatus(struct b43_wldev *dev,
 192                                           const struct b43_txstatus *status)
 193{
 194}
 195static inline void b43_pio_get_tx_stats(struct b43_wldev *dev,
 196                                        struct ieee80211_tx_queue_stats *stats)
 197{
 198}
 199static inline void b43_pio_rx(struct b43_pio_rxqueue *q)
 200{
 201}
 202static inline void b43_pio_tx_suspend(struct b43_wldev *dev)
 203{
 204}
 205static inline void b43_pio_tx_resume(struct b43_wldev *dev)
 206{
 207}
 208
 209#endif /* CONFIG_B43_PIO */
 210#endif /* B43_PIO_H_ */
 211