xref: /dragonfly/sys/dev/netif/ral/rt2560var.h (revision 93d249f7c46ee64628768dd449f435c6ae641ed0)
1 /*        $FreeBSD$ */
2 
3 /*-
4  * Copyright (c) 2005, 2006
5  *        Damien Bergamini <damien.bergamini@free.fr>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
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           int8_t              wr_antsignal;
28           int8_t              wr_antnoise;
29           uint8_t             wr_antenna;
30 };
31 
32 #define RT2560_RX_RADIOTAP_PRESENT                                              \
33           ((1 << IEEE80211_RADIOTAP_TSFT) |                                     \
34            (1 << IEEE80211_RADIOTAP_FLAGS) |                                    \
35            (1 << IEEE80211_RADIOTAP_RATE) |                                     \
36            (1 << IEEE80211_RADIOTAP_CHANNEL) |                                  \
37            (1 << IEEE80211_RADIOTAP_ANTENNA) |                                  \
38            (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |                            \
39            (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
40 
41 struct rt2560_tx_radiotap_header {
42           struct ieee80211_radiotap_header wt_ihdr;
43           uint8_t             wt_flags;
44           uint8_t             wt_rate;
45           uint16_t  wt_chan_freq;
46           uint16_t  wt_chan_flags;
47           uint8_t             wt_antenna;
48 };
49 
50 #define RT2560_TX_RADIOTAP_PRESENT                                              \
51           ((1 << IEEE80211_RADIOTAP_FLAGS) |                                    \
52            (1 << IEEE80211_RADIOTAP_RATE) |                                     \
53            (1 << IEEE80211_RADIOTAP_CHANNEL) |                                  \
54            (1 << IEEE80211_RADIOTAP_ANTENNA))
55 
56 struct rt2560_tx_data {
57           bus_dmamap_t                            map;
58           struct mbuf                             *m;
59           struct ieee80211_node                   *ni;
60           uint8_t                                 rix;
61           int8_t                                  rssi;
62 };
63 
64 struct rt2560_tx_ring {
65           bus_dma_tag_t                 desc_dmat;
66           bus_dma_tag_t                 data_dmat;
67           bus_dmamap_t                  desc_map;
68           bus_addr_t                    physaddr;
69           struct rt2560_tx_desc         *desc;
70           struct rt2560_tx_data         *data;
71           int                           count;
72           int                           queued;
73           int                           cur;
74           int                           next;
75           int                           cur_encrypt;
76           int                           next_encrypt;
77 };
78 
79 struct rt2560_rx_data {
80           bus_dmamap_t        map;
81           struct mbuf         *m;
82           int                 drop;
83 };
84 
85 struct rt2560_rx_ring {
86           bus_dma_tag_t                 desc_dmat;
87           bus_dma_tag_t                 data_dmat;
88           bus_dmamap_t                  desc_map;
89           bus_addr_t                    physaddr;
90           struct rt2560_rx_desc         *desc;
91           struct rt2560_rx_data         *data;
92           int                           count;
93           int                           cur;
94           int                           next;
95           int                           cur_decrypt;
96 };
97 
98 struct rt2560_vap {
99           struct ieee80211vap ral_vap;
100 
101           int                           (*ral_newstate)(struct ieee80211vap *,
102                                             enum ieee80211_state, int);
103 };
104 #define   RT2560_VAP(vap)               ((struct rt2560_vap *)(vap))
105 
106 struct rt2560_softc {
107           struct ieee80211com sc_ic;
108 #if defined(__DragonFly__)
109           struct lock                   sc_mtx;
110 #else
111           struct mtx                    sc_mtx;
112 #endif
113           struct mbufq                  sc_snd;
114           device_t            sc_dev;
115           bus_space_tag_t               sc_st;
116           bus_space_handle_t  sc_sh;
117 
118           struct callout                watchdog_ch;
119 
120           int                           sc_tx_timer;
121           int                     sc_invalid;
122           int                           sc_debug;
123 /*
124  * The same in both up to here
125  * ------------------------------------------------
126  */
127           uint32_t            asic_rev;
128           uint32_t            eeprom_rev;
129           uint8_t                       rf_rev;
130           uint8_t                       rssi_corr;
131 
132           struct rt2560_tx_ring         txq;
133           struct rt2560_tx_ring         prioq;
134           struct rt2560_tx_ring         atimq;
135           struct rt2560_tx_ring         bcnq;
136           struct rt2560_rx_ring         rxq;
137 
138           uint32_t            rf_regs[4];
139           uint8_t                       txpow[14];
140 
141           struct {
142                     uint8_t   reg;
143                     uint8_t   val;
144           }                             bbp_prom[16];
145 
146           int                           led_mode;
147           int                           hw_radio;
148           int                           rx_ant;
149           int                           tx_ant;
150           int                           nb_ant;
151 
152           struct rt2560_rx_radiotap_header sc_rxtap;
153           struct rt2560_tx_radiotap_header sc_txtap;
154 
155 #define RT2560_F_INPUT_RUNNING          0x1
156 #define RT2560_F_RUNNING      0x2
157           int                           sc_flags;
158 };
159 
160 int       rt2560_attach(device_t, int);
161 int       rt2560_detach(void *);
162 void      rt2560_stop(void *);
163 void      rt2560_resume(void *);
164 void      rt2560_intr(void *);
165 
166 #if defined(__DragonFly__)
167 
168 #define RAL_LOCK(sc)                    lockmgr(&(sc)->sc_mtx, LK_EXCLUSIVE)
169 #define RAL_LOCK_ASSERT(sc)   KKASSERT(lockstatus(&(sc)->sc_mtx, curthread) == LK_EXCLUSIVE)
170 #define RAL_UNLOCK(sc)                  lockmgr(&(sc)->sc_mtx, LK_RELEASE)
171 
172 #else
173 
174 #define RAL_LOCK(sc)                    mtx_lock(&(sc)->sc_mtx)
175 #define RAL_LOCK_ASSERT(sc)   mtx_assert(&(sc)->sc_mtx, MA_OWNED)
176 #define RAL_UNLOCK(sc)                  mtx_unlock(&(sc)->sc_mtx)
177 
178 #endif
179