1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 struct rt2560_rx_radiotap_header {
21 struct ieee80211_radiotap_header wr_ihdr;
22 uint64_t wr_tsf;
23 uint8_t wr_flags;
24 uint8_t wr_rate;
25 uint16_t wr_chan_freq;
26 uint16_t wr_chan_flags;
27 uint8_t wr_antenna;
28 uint8_t wr_antsignal;
29 } __packed;
30
31 #define RT2560_RX_RADIOTAP_PRESENT \
32 ((1 << IEEE80211_RADIOTAP_TSFT) | \
33 (1 << IEEE80211_RADIOTAP_FLAGS) | \
34 (1 << IEEE80211_RADIOTAP_RATE) | \
35 (1 << IEEE80211_RADIOTAP_CHANNEL) | \
36 (1 << IEEE80211_RADIOTAP_ANTENNA) | \
37 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
38
39 struct rt2560_tx_radiotap_header {
40 struct ieee80211_radiotap_header wt_ihdr;
41 uint8_t wt_flags;
42 uint8_t wt_rate;
43 uint16_t wt_chan_freq;
44 uint16_t wt_chan_flags;
45 uint8_t wt_antenna;
46 } __packed;
47
48 #define RT2560_TX_RADIOTAP_PRESENT \
49 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
50 (1 << IEEE80211_RADIOTAP_RATE) | \
51 (1 << IEEE80211_RADIOTAP_CHANNEL) | \
52 (1 << IEEE80211_RADIOTAP_ANTENNA))
53
54 struct rt2560_tx_data {
55 bus_dmamap_t map;
56 struct mbuf *m;
57 struct ieee80211_node *ni;
58 };
59
60 struct rt2560_tx_ring {
61 bus_dmamap_t map;
62 bus_dma_segment_t seg;
63 bus_addr_t physaddr;
64 struct rt2560_tx_desc *desc;
65 struct rt2560_tx_data *data;
66 int count;
67 int queued;
68 int cur;
69 int next;
70 int cur_encrypt;
71 int next_encrypt;
72 };
73
74 struct rt2560_rx_data {
75 bus_dmamap_t map;
76 struct mbuf *m;
77 int drop;
78 };
79
80 struct rt2560_rx_ring {
81 bus_dmamap_t map;
82 bus_dma_segment_t seg;
83 bus_addr_t physaddr;
84 struct rt2560_rx_desc *desc;
85 struct rt2560_rx_data *data;
86 int count;
87 int cur;
88 int next;
89 int cur_decrypt;
90 };
91
92 struct rt2560_node {
93 struct ieee80211_node ni;
94 struct ieee80211_amrr_node amn;
95 };
96
97 struct rt2560_softc {
98 struct device sc_dev;
99
100 struct ieee80211com sc_ic;
101 int (*sc_newstate)(struct ieee80211com *,
102 enum ieee80211_state, int);
103 struct ieee80211_amrr amrr;
104
105 int (*sc_enable)(struct rt2560_softc *);
106 void (*sc_disable)(struct rt2560_softc *);
107 void (*sc_power)(struct rt2560_softc *, int);
108
109 bus_dma_tag_t sc_dmat;
110 bus_space_tag_t sc_st;
111 bus_space_handle_t sc_sh;
112
113 struct timeout scan_to;
114 struct timeout amrr_to;
115
116 int sc_flags;
117 #define RT2560_ENABLED (1 << 0)
118 #define RT2560_UPDATE_SLOT (1 << 1)
119 #define RT2560_SET_SLOTTIME (1 << 2)
120
121 int sc_tx_timer;
122
123 uint32_t asic_rev;
124 uint8_t rf_rev;
125
126 struct rt2560_tx_ring txq;
127 struct rt2560_tx_ring prioq;
128 struct rt2560_tx_ring atimq;
129 struct rt2560_tx_ring bcnq;
130 struct rt2560_rx_ring rxq;
131
132 uint32_t rf_regs[4];
133 uint8_t txpow[14];
134
135 struct {
136 uint8_t reg;
137 uint8_t val;
138 } bbp_prom[16];
139
140 int led_mode;
141 int hw_radio;
142 int rx_ant;
143 int tx_ant;
144 int nb_ant;
145
146 uint8_t *erp;
147
148 #if NBPFILTER > 0
149 caddr_t sc_drvbpf;
150
151 union {
152 struct rt2560_rx_radiotap_header th;
153 uint8_t pad[64];
154 } sc_rxtapu;
155 #define sc_rxtap sc_rxtapu.th
156 int sc_rxtap_len;
157
158 union {
159 struct rt2560_tx_radiotap_header th;
160 uint8_t pad[64];
161 } sc_txtapu;
162 #define sc_txtap sc_txtapu.th
163 int sc_txtap_len;
164 #endif
165 void *sc_sdhook;
166 void *sc_powerhook;
167 };
168
169 int rt2560_attach(void *, int);
170 int rt2560_detach(void *);
171 int rt2560_intr(void *);
172 void rt2560_shutdown(void *);