This source file includes following definitions.
- acx111_set_param
- acx111_init
- acx111_init_memory
- acx111_init_fw_txring
- acx111_write_config
- acx111_set_fw_txdesc_rate
- acx111_set_bss_join_param
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 #include <sys/param.h>
54 #include <sys/endian.h>
55 #include <sys/socket.h>
56 #include <sys/sysctl.h>
57 #include <sys/device.h>
58
59 #include <machine/bus.h>
60
61 #include <net/if.h>
62 #include <net/if_arp.h>
63 #include <net/if_media.h>
64
65 #include <net/if.h>
66
67 #ifdef INET
68 #include <netinet/in.h>
69 #include <netinet/if_ether.h>
70 #endif
71
72 #include <net80211/ieee80211_var.h>
73 #include <net80211/ieee80211_amrr.h>
74 #include <net80211/ieee80211_radiotap.h>
75
76 #include <dev/pci/pcireg.h>
77
78 #include <dev/ic/acxvar.h>
79 #include <dev/ic/acxreg.h>
80
81 #define ACX111_CONF_MEM 0x0003
82 #define ACX111_CONF_MEMINFO 0x0005
83
84 #define ACX111_INTR_ENABLE (ACXRV_INTR_TX_FINI | ACXRV_INTR_RX_FINI)
85
86
87
88
89
90
91
92 #define ACX111_INTR_DISABLE (uint16_t)~(ACXRV_INTR_CMD_FINI)
93
94 #define ACX111_RATE_2 0x0001
95 #define ACX111_RATE_4 0x0002
96 #define ACX111_RATE_11 0x0004
97 #define ACX111_RATE_12 0x0008
98 #define ACX111_RATE_18 0x0010
99 #define ACX111_RATE_22 0x0020
100 #define ACX111_RATE_24 0x0040
101 #define ACX111_RATE_36 0x0080
102 #define ACX111_RATE_44 0x0100
103 #define ACX111_RATE_48 0x0200
104 #define ACX111_RATE_72 0x0400
105 #define ACX111_RATE_96 0x0800
106 #define ACX111_RATE_108 0x1000
107
108
109 #define ACX111_RATE_ALL 0x1eff
110
111 #define ACX111_TXPOWER 15
112 #define ACX111_GPIO_POWER_LED 0x0040
113 #define ACX111_EE_EADDR_OFS 0x21
114
115 #define ACX111_FW_TXDESC_SIZE (sizeof(struct acx_fw_txdesc) + 4)
116
117 #if ACX111_TXPOWER <= 12
118 #define ACX111_TXPOWER_VAL 1
119 #else
120 #define ACX111_TXPOWER_VAL 2
121 #endif
122
123 int acx111_init(struct acx_softc *);
124 int acx111_init_memory(struct acx_softc *);
125 void acx111_init_fw_txring(struct acx_softc *, uint32_t);
126 int acx111_write_config(struct acx_softc *, struct acx_config *);
127 void acx111_set_fw_txdesc_rate(struct acx_softc *,
128 struct acx_txbuf *, int);
129 void acx111_set_bss_join_param(struct acx_softc *, void *, int);
130
131
132
133
134
135 struct acx111_bss_join {
136 uint16_t basic_rates;
137 uint8_t dtim_intvl;
138 } __packed;
139
140 struct acx111_conf_mem {
141 struct acx_conf confcom;
142
143 uint16_t sta_max;
144 uint16_t memblk_size;
145 uint8_t rx_memblk_perc;
146 uint8_t fw_rxring_num;
147 uint8_t fw_txring_num;
148 uint8_t opt;
149 uint8_t xfer_perc;
150 uint16_t reserved0;
151 uint8_t reserved1;
152
153 uint8_t fw_rxdesc_num;
154 uint8_t fw_rxring_reserved1;
155 uint8_t fw_rxring_type;
156 uint8_t fw_rxring_prio;
157
158 uint32_t h_rxring_paddr;
159
160 uint8_t fw_txdesc_num;
161 uint8_t fw_txring_reserved1;
162 uint8_t fw_txring_reserved2;
163 uint8_t fw_txring_attr;
164 } __packed;
165
166 #define ACX111_STA_MAX 32
167 #define ACX111_RX_MEMBLK_PERCENT 10
168 #define ACX111_XFER_PERCENT 15
169 #define ACX111_RXRING_TYPE_DEFAULT 7
170 #define ACX111_RXRING_PRIO_DEFAULT 0
171 #define ACX111_TXRING_ATTR_DEFAULT 0
172 #define ACX111_MEMOPT_DEFAULT 0
173
174 struct acx111_conf_meminfo {
175 struct acx_conf confcom;
176 uint32_t tx_memblk_addr;
177 uint32_t rx_memblk_addr;
178 uint32_t fw_rxring_start;
179 uint32_t reserved0;
180 uint32_t fw_txring_start;
181 uint8_t fw_txring_attr;
182 uint16_t reserved1;
183 uint8_t reserved2;
184 } __packed;
185
186 struct acx111_conf_txpower {
187 struct acx_conf confcom;
188 uint8_t txpower;
189 } __packed;
190
191 struct acx111_conf_option {
192 struct acx_conf confcom;
193 uint32_t feature;
194 uint32_t dataflow;
195 } __packed;
196
197 #define ACX111_DF_NO_RXDECRYPT 0x00000080
198 #define ACX111_DF_NO_TXENCRYPT 0x00000001
199
200 struct acx111_wepkey {
201 uint8_t mac_addr[IEEE80211_ADDR_LEN];
202 uint16_t action;
203 uint16_t reserved;
204 uint8_t key_len;
205 uint8_t key_type;
206 uint8_t index;
207 uint8_t key_idx;
208 uint8_t counter[6];
209 #define ACX111_WEPKEY_LEN 32
210 uint8_t key[ACX111_WEPKEY_LEN];
211 } __packed;
212
213 #define ACX111_WEPKEY_ACT_ADD 1
214 #define ACX111_WEPKEY_TYPE_DEFAULT 0
215
216 static const uint16_t acx111_reg[ACXREG_MAX] = {
217 ACXREG(SOFT_RESET, 0x0000),
218
219 ACXREG(FWMEM_ADDR, 0x0014),
220 ACXREG(FWMEM_DATA, 0x0018),
221 ACXREG(FWMEM_CTRL, 0x001c),
222 ACXREG(FWMEM_START, 0x0020),
223
224 ACXREG(EVENT_MASK, 0x0034),
225
226 ACXREG(INTR_TRIG, 0x00b4),
227 ACXREG(INTR_MASK, 0x00d4),
228 ACXREG(INTR_STATUS, 0x00f0),
229 ACXREG(INTR_STATUS_CLR, 0x00e4),
230 ACXREG(INTR_ACK, 0x00e8),
231
232 ACXREG(HINTR_TRIG, 0x00ec),
233 ACXREG(RADIO_ENABLE, 0x01d0),
234
235 ACXREG(EEPROM_INIT, 0x0100),
236 ACXREG(EEPROM_CTRL, 0x0338),
237 ACXREG(EEPROM_ADDR, 0x033c),
238 ACXREG(EEPROM_DATA, 0x0340),
239 ACXREG(EEPROM_CONF, 0x0344),
240 ACXREG(EEPROM_INFO, 0x0390),
241
242 ACXREG(PHY_ADDR, 0x0350),
243 ACXREG(PHY_DATA, 0x0354),
244 ACXREG(PHY_CTRL, 0x0358),
245
246 ACXREG(GPIO_OUT_ENABLE, 0x0374),
247 ACXREG(GPIO_OUT, 0x037c),
248
249 ACXREG(CMD_REG_OFFSET, 0x0388),
250 ACXREG(INFO_REG_OFFSET, 0x038c),
251
252 ACXREG(RESET_SENSE, 0x0104),
253 ACXREG(ECPU_CTRL, 0x0108)
254 };
255
256
257 static uint16_t acx111_rate_map[109] = {
258 ACX111_RATE_2,
259 ACX111_RATE_4,
260 ACX111_RATE_11,
261 ACX111_RATE_22,
262 ACX111_RATE_12,
263 ACX111_RATE_18,
264 ACX111_RATE_24,
265 ACX111_RATE_36,
266 ACX111_RATE_48,
267 ACX111_RATE_72,
268 ACX111_RATE_96,
269 ACX111_RATE_108
270 };
271
272 void
273 acx111_set_param(struct acx_softc *sc)
274 {
275 sc->chip_mem1_rid = PCIR_BAR(0);
276 sc->chip_mem2_rid = PCIR_BAR(1);
277 sc->chip_ioreg = acx111_reg;
278 sc->chip_intr_enable = ACX111_INTR_ENABLE;
279 sc->chip_intr_disable = ACX111_INTR_DISABLE;
280 sc->chip_gpio_pled = ACX111_GPIO_POWER_LED;
281 sc->chip_ee_eaddr_ofs = ACX111_EE_EADDR_OFS;
282
283 sc->chip_phymode = IEEE80211_MODE_11G;
284 sc->chip_chan_flags = IEEE80211_CHAN_CCK |
285 IEEE80211_CHAN_OFDM |
286 IEEE80211_CHAN_DYN |
287 IEEE80211_CHAN_2GHZ;
288 sc->sc_ic.ic_caps = IEEE80211_C_WEP;
289 sc->sc_ic.ic_phytype = IEEE80211_T_OFDM;
290 sc->sc_ic.ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
291 sc->sc_ic.ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
292
293 sc->chip_init = acx111_init;
294 sc->chip_write_config = acx111_write_config;
295 sc->chip_set_fw_txdesc_rate = acx111_set_fw_txdesc_rate;
296 sc->chip_set_bss_join_param = acx111_set_bss_join_param;
297 sc->sc_flags |= ACX_FLAG_ACX111;
298 }
299
300 int
301 acx111_init(struct acx_softc *sc)
302 {
303 struct ifnet *ifp = &sc->sc_ic.ic_if;
304
305
306
307
308
309
310
311
312 if (acx_init_tmplt_ordered(sc) != 0) {
313 printf("%s: %s can't initialize templates\n",
314 ifp->if_xname, __func__);
315 return (ENXIO);
316 }
317
318 if (acx111_init_memory(sc) != 0) {
319 printf("%s: %s can't initialize hw memory\n",
320 ifp->if_xname, __func__);
321 return (ENXIO);
322 }
323
324 return (0);
325 }
326
327 int
328 acx111_init_memory(struct acx_softc *sc)
329 {
330 struct acx111_conf_mem mem;
331 struct acx111_conf_meminfo mem_info;
332 struct ifnet *ifp = &sc->sc_ic.ic_if;
333
334
335 bzero(&mem, sizeof(mem));
336
337 mem.sta_max = htole16(ACX111_STA_MAX);
338 mem.memblk_size = htole16(ACX_MEMBLOCK_SIZE);
339 mem.rx_memblk_perc = ACX111_RX_MEMBLK_PERCENT;
340 mem.opt = ACX111_MEMOPT_DEFAULT;
341 mem.xfer_perc = ACX111_XFER_PERCENT;
342
343 mem.fw_rxring_num = 1;
344 mem.fw_rxring_type = ACX111_RXRING_TYPE_DEFAULT;
345 mem.fw_rxring_prio = ACX111_RXRING_PRIO_DEFAULT;
346 mem.fw_rxdesc_num = ACX_RX_DESC_CNT;
347 mem.h_rxring_paddr = htole32(sc->sc_ring_data.rx_ring_paddr);
348
349 mem.fw_txring_num = 1;
350 mem.fw_txring_attr = ACX111_TXRING_ATTR_DEFAULT;
351 mem.fw_txdesc_num = ACX_TX_DESC_CNT;
352
353 if (acx_set_conf(sc, ACX111_CONF_MEM, &mem, sizeof(mem)) != 0) {
354 printf("%s: can't set mem\n", ifp->if_xname);
355 return (1);
356 }
357
358
359 if (acx_get_conf(sc, ACX111_CONF_MEMINFO, &mem_info,
360 sizeof(mem_info)) != 0) {
361 printf("%s: can't get meminfo\n", ifp->if_xname);
362 return (1);
363 }
364
365
366 acx111_init_fw_txring(sc, letoh32(mem_info.fw_txring_start));
367
368
369
370
371
372
373 return (0);
374 }
375
376 void
377 acx111_init_fw_txring(struct acx_softc *sc, uint32_t fw_txdesc_start)
378 {
379 struct acx_txbuf *tx_buf;
380 uint32_t desc_paddr;
381 int i;
382
383 tx_buf = sc->sc_buf_data.tx_buf;
384 desc_paddr = sc->sc_ring_data.tx_ring_paddr;
385
386 for (i = 0; i < ACX_TX_DESC_CNT; ++i) {
387 tx_buf[i].tb_fwdesc_ofs = fw_txdesc_start +
388 (i * ACX111_FW_TXDESC_SIZE);
389
390
391
392
393
394 FW_TXDESC_SETFIELD_4(sc, &tx_buf[i], f_tx_host_desc,
395 desc_paddr);
396 FW_TXDESC_SETFIELD_1(sc, &tx_buf[i], f_tx_ctrl,
397 DESC_CTRL_HOSTOWN);
398
399 desc_paddr += (2 * sizeof(struct acx_host_desc));
400 }
401 }
402
403 int
404 acx111_write_config(struct acx_softc *sc, struct acx_config *conf)
405 {
406 struct acx111_conf_txpower tx_power;
407 struct acx111_conf_option opt;
408 struct ifnet *ifp = &sc->sc_ic.ic_if;
409 uint32_t dataflow;
410
411
412 tx_power.txpower = ACX111_TXPOWER_VAL;
413 if (acx_set_conf(sc, ACX_CONF_TXPOWER, &tx_power,
414 sizeof(tx_power)) != 0) {
415 printf("%s: %s can't set TX power\n",
416 ifp->if_xname, __func__);
417 return (ENXIO);
418 }
419
420
421
422
423 if (acx_get_conf(sc, ACX_CONF_OPTION, &opt, sizeof(opt)) != 0) {
424 printf("%s: %s can't get option\n", ifp->if_xname, __func__);
425 return (ENXIO);
426 }
427
428 dataflow = letoh32(opt.dataflow) |
429 ACX111_DF_NO_TXENCRYPT |
430 ACX111_DF_NO_RXDECRYPT;
431 opt.dataflow = htole32(dataflow);
432
433 if (acx_set_conf(sc, ACX_CONF_OPTION, &opt, sizeof(opt)) != 0) {
434 printf("%s: %s can't set option\n", ifp->if_xname, __func__);
435 return (ENXIO);
436 }
437
438 return (0);
439 }
440
441 void
442 acx111_set_fw_txdesc_rate(struct acx_softc *sc, struct acx_txbuf *tx_buf,
443 int rate0)
444 {
445 uint16_t rate;
446
447 rate = acx111_rate_map[rate0];
448 if (rate == 0)
449
450 rate = acx111_rate_map[2];
451
452 FW_TXDESC_SETFIELD_2(sc, tx_buf, u.r2.rate111, rate);
453 }
454
455 void
456 acx111_set_bss_join_param(struct acx_softc *sc, void *param, int dtim_intvl)
457 {
458 struct acx111_bss_join *bj = param;
459
460 bj->basic_rates = htole16(ACX111_RATE_ALL);
461 bj->dtim_intvl = dtim_intvl;
462 }