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