1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #define UATH_TX_DATA_LIST_COUNT 8
21 #define UATH_TX_CMD_LIST_COUNT 8
22
23
24 #define UATH_RX_DATA_LIST_COUNT 1
25 #define UATH_RX_CMD_LIST_COUNT 1
26
27 #define UATH_RX_DATA_POOL_COUNT (UATH_RX_DATA_LIST_COUNT + 24)
28
29 #define UATH_DATA_TIMEOUT 10000
30 #define UATH_CMD_TIMEOUT 1000
31
32 struct uath_rx_radiotap_header {
33 struct ieee80211_radiotap_header wr_ihdr;
34 uint8_t wr_flags;
35 uint16_t wr_chan_freq;
36 uint16_t wr_chan_flags;
37 int8_t wr_dbm_antsignal;
38 } __packed;
39
40 #define UATH_RX_RADIOTAP_PRESENT \
41 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
42 (1 << IEEE80211_RADIOTAP_CHANNEL) | \
43 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL))
44
45 struct uath_tx_radiotap_header {
46 struct ieee80211_radiotap_header wt_ihdr;
47 uint8_t wt_flags;
48 uint16_t wt_chan_freq;
49 uint16_t wt_chan_flags;
50 } __packed;
51
52 #define UATH_TX_RADIOTAP_PRESENT \
53 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
54 (1 << IEEE80211_RADIOTAP_CHANNEL))
55
56 struct uath_tx_data {
57 struct uath_softc *sc;
58 usbd_xfer_handle xfer;
59 uint8_t *buf;
60 struct ieee80211_node *ni;
61 };
62
63 struct uath_rx_data {
64 struct uath_softc *sc;
65 usbd_xfer_handle xfer;
66 uint8_t *buf;
67 SLIST_ENTRY(uath_rx_data) next;
68 };
69
70 struct uath_tx_cmd {
71 struct uath_softc *sc;
72 usbd_xfer_handle xfer;
73 uint8_t *buf;
74 void *odata;
75 };
76
77 struct uath_rx_cmd {
78 struct uath_softc *sc;
79 usbd_xfer_handle xfer;
80 uint8_t *buf;
81 };
82
83 struct uath_wme_settings {
84 uint8_t aifsn;
85 uint8_t logcwmin;
86 uint8_t logcwmax;
87 uint16_t txop;
88 #define UATH_TXOP_TO_US(txop) ((txop) << 5)
89
90 uint8_t acm;
91 };
92
93
94 #define UATH_COND_INIT(sc) ((caddr_t)sc + 1)
95 #define UATH_COND_NOREF(sc) ((caddr_t)sc + 2)
96
97
98 #define UATH_CMD_FLAG_ASYNC (1 << 0)
99 #define UATH_CMD_FLAG_READ (1 << 1)
100 #define UATH_CMD_FLAG_MAGIC (1 << 2)
101
102 struct uath_softc {
103 struct device sc_dev;
104 struct ieee80211com sc_ic;
105 int (*sc_newstate)(struct ieee80211com *,
106 enum ieee80211_state, int);
107
108 struct uath_tx_data tx_data[UATH_TX_DATA_LIST_COUNT];
109 struct uath_rx_data rx_data[UATH_RX_DATA_POOL_COUNT];
110
111 struct uath_tx_cmd tx_cmd[UATH_TX_CMD_LIST_COUNT];
112 struct uath_rx_cmd rx_cmd[UATH_RX_CMD_LIST_COUNT];
113
114 SLIST_HEAD(, uath_rx_data) rx_freelist;
115
116 int sc_flags;
117 int sc_dying;
118 int sc_refcnt;
119
120 int data_idx;
121 int cmd_idx;
122 int tx_queued;
123
124 usbd_device_handle sc_udev;
125 usbd_device_handle sc_uhub;
126 int sc_port;
127
128 usbd_interface_handle sc_iface;
129
130 usbd_pipe_handle data_tx_pipe;
131 usbd_pipe_handle data_rx_pipe;
132 usbd_pipe_handle cmd_tx_pipe;
133 usbd_pipe_handle cmd_rx_pipe;
134
135 enum ieee80211_state sc_state;
136 int sc_arg;
137 struct usb_task sc_task;
138
139 struct timeout scan_to;
140 struct timeout stat_to;
141
142 int sc_tx_timer;
143
144 int rxbufsz;
145
146 #if NBPFILTER > 0
147 caddr_t sc_drvbpf;
148
149 union {
150 struct uath_rx_radiotap_header th;
151 uint8_t pad[64];
152 } sc_rxtapu;
153 #define sc_rxtap sc_rxtapu.th
154 int sc_rxtap_len;
155
156 union {
157 struct uath_tx_radiotap_header th;
158 uint8_t pad[64];
159 } sc_txtapu;
160 #define sc_txtap sc_txtapu.th
161 int sc_txtap_len;
162 #endif
163 };