1 /*        $NetBSD: if_rtwnreg.h,v 1.6 2019/10/05 23:27:20 mrg Exp $   */
2 /*        $OpenBSD: if_rtwnreg.h,v 1.3 2015/06/14 08:02:47 stsp Exp $ */
3 
4 /*-
5  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
6  * Copyright (c) 2015 Stefan Sperling <stsp@openbsd.org>
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 #ifndef _DEV_PCI_RTWNREG_H_
22 #define   _DEV_PCI_RTWNREG_H_
23 
24 /* Maximum number of output pipes is 3. */
25 #define R92C_MAX_EPOUT        3
26 
27 #define R92C_PUBQ_NPAGES      176
28 #define R92C_HPQ_NPAGES                 41
29 #define R92C_LPQ_NPAGES                 28
30 #define R92C_TXPKTBUF_COUNT   256
31 #define R92C_TX_PAGE_COUNT    \
32           (R92C_PUBQ_NPAGES + R92C_HPQ_NPAGES + R92C_LPQ_NPAGES)
33 #define R92C_TX_PAGE_BOUNDARY (R92C_TX_PAGE_COUNT + 1)
34 
35 /* USB Requests. */
36 #define R92C_REQ_REGS         0x05
37 
38 /*
39  * Driver definitions.
40  */
41 #define RTWN_NTXQUEUES                            9
42 #define RTWN_RX_LIST_COUNT              256
43 #define RTWN_TX_LIST_COUNT              256
44 #define RTWN_TX_LIST_LOMARK             192
45 #define RTWN_TX_LIST_HIMARK             255
46 #define RTWN_HOST_CMD_RING_COUNT        32
47 
48 /* TX queue indices. */
49 #define RTWN_BK_QUEUE                             0
50 #define RTWN_BE_QUEUE                             1
51 #define RTWN_VI_QUEUE                             2
52 #define RTWN_VO_QUEUE                             3
53 #define RTWN_BEACON_QUEUE               4
54 #define RTWN_TXCMD_QUEUE                5
55 #define RTWN_MGNT_QUEUE                           6
56 #define RTWN_HIGH_QUEUE                           7
57 #define RTWN_HCCA_QUEUE                           8
58 
59 /* RX queue indices. */
60 #define RTWN_RX_QUEUE                             0
61 
62 #define RTWN_RXBUFSZ          (16 * 1024)
63 #define RTWN_TXBUFSZ          (sizeof(struct r92c_tx_desc) + IEEE80211_MAX_LEN)
64 
65 #define RTWN_RIDX_COUNT       28
66 
67 #define RTWN_TX_TIMEOUT       5000      /* ms */
68 
69 #define RTWN_LED_LINK         0
70 #define RTWN_LED_DATA         1
71 
72 struct rtwn_rx_radiotap_header {
73           struct ieee80211_radiotap_header wr_ihdr;
74           uint8_t             wr_flags;
75           uint8_t             wr_rate;
76           uint16_t  wr_chan_freq;
77           uint16_t  wr_chan_flags;
78           uint8_t             wr_dbm_antsignal;
79 };
80 
81 #define RTWN_RX_RADIOTAP_PRESENT                            \
82           (1 << IEEE80211_RADIOTAP_FLAGS |                  \
83            1 << IEEE80211_RADIOTAP_RATE |                             \
84            1 << IEEE80211_RADIOTAP_CHANNEL |                \
85            1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL)
86 
87 struct rtwn_tx_radiotap_header {
88           struct ieee80211_radiotap_header wt_ihdr;
89           uint8_t             wt_flags;
90           uint16_t  wt_chan_freq;
91           uint16_t  wt_chan_flags;
92 };
93 
94 #define RTWN_TX_RADIOTAP_PRESENT                            \
95           (1 << IEEE80211_RADIOTAP_FLAGS |                  \
96            1 << IEEE80211_RADIOTAP_CHANNEL)
97 
98 struct rtwn_softc;
99 
100 struct rtwn_rx_data {
101           bus_dmamap_t                  map;
102           struct mbuf                   *m;
103 };
104 
105 struct rtwn_rx_ring {
106           struct r92c_rx_desc_pci       *desc;
107           bus_dmamap_t                  map;
108           bus_dma_segment_t   seg;
109           int                           nsegs;
110           struct rtwn_rx_data rx_data[RTWN_RX_LIST_COUNT];
111 
112 };
113 struct rtwn_tx_data {
114           bus_dmamap_t                            map;
115           struct mbuf                             *m;
116           struct ieee80211_node                   *ni;
117 };
118 
119 struct rtwn_tx_ring {
120           bus_dmamap_t                  map;
121           bus_dma_segment_t   seg;
122           int                           nsegs;
123           struct r92c_tx_desc_pci       *desc;
124           struct rtwn_tx_data tx_data[RTWN_TX_LIST_COUNT];
125           int                           queued;
126           int                           cur;
127 };
128 
129 struct rtwn_host_cmd {
130           void      (*cb)(struct rtwn_softc *, void *);
131           uint8_t   data[256];
132 };
133 
134 struct rtwn_cmd_key {
135           struct ieee80211_key          key;
136           uint16_t            associd;
137 };
138 
139 struct rtwn_host_cmd_ring {
140           struct rtwn_host_cmd          cmd[RTWN_HOST_CMD_RING_COUNT];
141           int                           cur;
142           int                           next;
143           int                           queued;
144 };
145 
146 struct rtwn_softc {
147           device_t                      sc_dev;
148           struct ethercom                         sc_ec;
149           struct ieee80211com           sc_ic;
150           int                                     (*sc_newstate)(struct ieee80211com *,
151                                                       enum ieee80211_state, int);
152 
153           /* PCI specific goo. */
154           bus_dma_tag_t                           sc_dmat;
155           pci_chipset_tag_t             sc_pc;
156           pcitag_t                      sc_tag;
157           void                                    *sc_ih;
158           pci_intr_handle_t             *sc_pihp;
159           bus_space_tag_t                         sc_st;
160           bus_space_handle_t            sc_sh;
161           bus_size_t                              sc_mapsize;
162           int                                     sc_cap_off;
163           void                                    *sc_soft_ih;
164 
165           struct callout                          scan_to;
166           struct callout                          calib_to;
167           void                                    *init_task;
168           int                                     ac2idx[WME_NUM_AC];
169           uint32_t                      sc_flags;
170 #define RTWN_FLAG_FW_LOADED   __BIT(0)
171 #define RTWN_FLAG_CCK_HIPWR   __BIT(1)
172 
173           uint32_t                      chip;
174 #define RTWN_CHIP_88C                   __BIT(0)
175 #define RTWN_CHIP_92C                   __BIT(1)
176 #define RTWN_CHIP_92C_1T2R    __BIT(2)
177 #define RTWN_CHIP_UMC                   __BIT(3)
178 #define RTWN_CHIP_UMC_A_CUT   __BIT(4)
179 #define RTWN_CHIP_UMC_B_CUT   __BIT(5)
180 
181           uint8_t                                 board_type;
182           uint8_t                                 regulatory;
183           uint8_t                                 pa_setting;
184           int                                     avg_pwdb;
185           int                                     thcal_state;
186           int                                     thcal_lctemp;
187           int                                     ntxchains;
188           int                                     nrxchains;
189           int                                     ledlink;
190 
191           int                                     sc_tx_timer;
192           int                                     fwcur;
193           struct rtwn_rx_ring           rx_ring;
194           struct rtwn_tx_ring           tx_ring[RTWN_NTXQUEUES];
195           uint32_t                      qfullmsk;
196           struct r92c_rom                         rom;
197 
198           uint32_t                      rf_chnlbw[R92C_MAX_CHAINS];
199           struct bpf_if                           *sc_drvbpf;
200 
201           union {
202                     struct rtwn_rx_radiotap_header th;
203                     uint8_t   pad[64];
204           }                                       sc_rxtapu;
205 #define sc_rxtap    sc_rxtapu.th
206           int                                     sc_rxtap_len;
207 
208           union {
209                     struct rtwn_tx_radiotap_header th;
210                     uint8_t   pad[64];
211           }                                       sc_txtapu;
212 #define sc_txtap    sc_txtapu.th
213           int                                     sc_txtap_len;
214 };
215 
216 #define   sc_if               sc_ec.ec_if
217 #define   GET_IFP(sc)         (&(sc)->sc_if)
218 #define   IC2IFP(ic)          ((ic)->ic_ifp)
219 
220 #endif /* _DEV_PCI_RTWNREG_H_ */
221