Branch data Line data Source code
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 : : 39 : : struct b43legacy_pioqueue; 40 : : struct b43legacy_xmitstatus; 41 : : 42 : : struct 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 : : 51 : : struct 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 : : 83 : : static inline 84 : 0 : u16 b43legacy_pio_read(struct b43legacy_pioqueue *queue, 85 : : u16 offset) 86 : : { 87 : 0 : return b43legacy_read16(queue->dev, queue->mmio_base + offset); 88 : : } 89 : : 90 : : static inline 91 : 0 : void b43legacy_pio_write(struct b43legacy_pioqueue *queue, 92 : : u16 offset, u16 value) 93 : : { 94 : 0 : b43legacy_write16(queue->dev, queue->mmio_base + offset, value); 95 : 0 : } 96 : : 97 : : 98 : : int b43legacy_pio_init(struct b43legacy_wldev *dev); 99 : : void b43legacy_pio_free(struct b43legacy_wldev *dev); 100 : : 101 : : int b43legacy_pio_tx(struct b43legacy_wldev *dev, 102 : : struct sk_buff *skb); 103 : : void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev, 104 : : const struct b43legacy_txstatus *status); 105 : : void b43legacy_pio_rx(struct b43legacy_pioqueue *queue); 106 : : 107 : : /* Suspend TX queue in hardware. */ 108 : : void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue); 109 : : void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue); 110 : : /* Suspend (freeze) the TX tasklet (software level). */ 111 : : void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev); 112 : : void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev); 113 : : 114 : : #else /* CONFIG_B43LEGACY_PIO */ 115 : : 116 : : static inline 117 : : int b43legacy_pio_init(struct b43legacy_wldev *dev) 118 : : { 119 : : return 0; 120 : : } 121 : : static inline 122 : : void b43legacy_pio_free(struct b43legacy_wldev *dev) 123 : : { 124 : : } 125 : : static inline 126 : : int b43legacy_pio_tx(struct b43legacy_wldev *dev, 127 : : struct sk_buff *skb) 128 : : { 129 : : return 0; 130 : : } 131 : : static inline 132 : : void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev, 133 : : const struct b43legacy_txstatus *status) 134 : : { 135 : : } 136 : : static inline 137 : : void b43legacy_pio_rx(struct b43legacy_pioqueue *queue) 138 : : { 139 : : } 140 : : static inline 141 : : void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue) 142 : : { 143 : : } 144 : : static inline 145 : : void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue) 146 : : { 147 : : } 148 : : static inline 149 : : void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev) 150 : : { 151 : : } 152 : : static inline 153 : : void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev) 154 : : { 155 : : } 156 : : 157 : : #endif /* CONFIG_B43LEGACY_PIO */ 158 : : #endif /* B43legacy_PIO_H_ */