1 1.21 andvar /* $NetBSD: malo.c,v 1.21 2024/09/07 06:17:37 andvar Exp $ */ 2 1.1 degroote /* $OpenBSD: malo.c,v 1.92 2010/08/27 17:08:00 jsg Exp $ */ 3 1.1 degroote 4 1.1 degroote /* 5 1.1 degroote * Copyright (c) 2006 Claudio Jeker <claudio (at) openbsd.org> 6 1.1 degroote * Copyright (c) 2006 Marcus Glocker <mglocker (at) openbsd.org> 7 1.1 degroote * 8 1.1 degroote * Permission to use, copy, modify, and distribute this software for any 9 1.1 degroote * purpose with or without fee is hereby granted, provided that the above 10 1.1 degroote * copyright notice and this permission notice appear in all copies. 11 1.1 degroote * 12 1.1 degroote * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 1.1 degroote * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 1.1 degroote * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 1.1 degroote * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 1.1 degroote * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 1.1 degroote * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 1.1 degroote * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 1.1 degroote */ 20 1.1 degroote 21 1.1 degroote #include <sys/cdefs.h> 22 1.21 andvar __KERNEL_RCSID(0, "$NetBSD: malo.c,v 1.21 2024/09/07 06:17:37 andvar Exp $"); 23 1.2 degroote 24 1.1 degroote #include <sys/param.h> 25 1.1 degroote #include <sys/types.h> 26 1.1 degroote 27 1.1 degroote #include <sys/device.h> 28 1.1 degroote #include <sys/kernel.h> 29 1.1 degroote #include <sys/malloc.h> 30 1.1 degroote #include <sys/mbuf.h> 31 1.1 degroote #include <sys/proc.h> 32 1.1 degroote #include <sys/socket.h> 33 1.1 degroote #include <sys/sockio.h> 34 1.1 degroote #include <sys/systm.h> 35 1.1 degroote #include <sys/bus.h> 36 1.1 degroote 37 1.1 degroote #include <machine/endian.h> 38 1.1 degroote #include <machine/intr.h> 39 1.1 degroote 40 1.1 degroote #include <net/if.h> 41 1.1 degroote #include <net/if_media.h> 42 1.1 degroote #include <net/if_ether.h> 43 1.1 degroote 44 1.1 degroote #include <net/bpf.h> 45 1.1 degroote 46 1.1 degroote #include <netinet/in.h> 47 1.1 degroote #include <netinet/in_systm.h> 48 1.1 degroote 49 1.1 degroote #include <net80211/ieee80211_var.h> 50 1.1 degroote #include <net80211/ieee80211_radiotap.h> 51 1.1 degroote 52 1.1 degroote #include <dev/firmload.h> 53 1.1 degroote 54 1.1 degroote #include <dev/ic/malovar.h> 55 1.1 degroote #include <dev/ic/maloreg.h> 56 1.1 degroote 57 1.1 degroote #ifdef MALO_DEBUG 58 1.1 degroote int malo_d = 2; 59 1.1 degroote #define DPRINTF(l, x...) do { if ((l) <= malo_d) printf(x); } while (0) 60 1.1 degroote #else 61 1.1 degroote #define DPRINTF(l, x...) 62 1.1 degroote #endif 63 1.1 degroote 64 1.1 degroote /* internal structures and defines */ 65 1.1 degroote struct malo_node { 66 1.1 degroote struct ieee80211_node ni; 67 1.1 degroote }; 68 1.1 degroote 69 1.1 degroote struct malo_rx_data { 70 1.1 degroote bus_dmamap_t map; 71 1.1 degroote struct mbuf *m; 72 1.1 degroote }; 73 1.1 degroote 74 1.1 degroote struct malo_tx_data { 75 1.1 degroote bus_dmamap_t map; 76 1.1 degroote struct mbuf *m; 77 1.1 degroote uint32_t softstat; 78 1.1 degroote struct ieee80211_node *ni; 79 1.1 degroote }; 80 1.1 degroote 81 1.1 degroote /* RX descriptor used by HW */ 82 1.1 degroote struct malo_rx_desc { 83 1.1 degroote uint8_t rxctrl; 84 1.1 degroote uint8_t rssi; 85 1.1 degroote uint8_t status; 86 1.1 degroote uint8_t channel; 87 1.1 degroote uint16_t len; 88 1.1 degroote uint8_t reserved1; /* actually unused */ 89 1.1 degroote uint8_t datarate; 90 1.1 degroote uint32_t physdata; /* DMA address of data */ 91 1.1 degroote uint32_t physnext; /* DMA address of next control block */ 92 1.1 degroote uint16_t qosctrl; 93 1.1 degroote uint16_t reserved2; 94 1.1 degroote } __packed; 95 1.1 degroote 96 1.1 degroote /* TX descriptor used by HW */ 97 1.1 degroote struct malo_tx_desc { 98 1.1 degroote uint32_t status; 99 1.1 degroote #define MALO_TXD_STATUS_IDLE 0x00000000 100 1.1 degroote #define MALO_TXD_STATUS_USED 0x00000001 101 1.1 degroote #define MALO_TXD_STATUS_OK 0x00000001 102 1.1 degroote #define MALO_TXD_STATUS_OK_RETRY 0x00000002 103 1.1 degroote #define MALO_TXD_STATUS_OK_MORE_RETRY 0x00000004 104 1.1 degroote #define MALO_TXD_STATUS_MULTICAST_TX 0x00000008 105 1.1 degroote #define MALO_TXD_STATUS_BROADCAST_TX 0x00000010 106 1.1 degroote #define MALO_TXD_STATUS_FAILED_LINK_ERROR 0x00000020 107 1.1 degroote #define MALO_TXD_STATUS_FAILED_EXCEED_LIMIT 0x00000040 108 1.1 degroote #define MALO_TXD_STATUS_FAILED_XRETRY MALO_TXD_STATUS_FAILED_EXCEED_LIMIT 109 1.1 degroote #define MALO_TXD_STATUS_FAILED_AGING 0x00000080 110 1.1 degroote #define MALO_TXD_STATUS_FW_OWNED 0x80000000 111 1.1 degroote uint8_t datarate; 112 1.1 degroote uint8_t txpriority; 113 1.1 degroote uint16_t qosctrl; 114 1.1 degroote uint32_t physdata; /* DMA address of data */ 115 1.1 degroote uint16_t len; 116 1.1 degroote uint8_t destaddr[6]; 117 1.1 degroote uint32_t physnext; /* DMA address of next control block */ 118 1.1 degroote uint32_t reserved1; /* SAP packet info ??? */ 119 1.1 degroote uint32_t reserved2; 120 1.1 degroote } __packed; 121 1.1 degroote 122 1.1 degroote #define MALO_RX_RING_COUNT 256 123 1.1 degroote #define MALO_TX_RING_COUNT 256 124 1.1 degroote #define MALO_MAX_SCATTER 8 /* XXX unknown, wild guess */ 125 1.1 degroote #define MALO_CMD_TIMEOUT 50 /* MALO_CMD_TIMEOUT * 100us */ 126 1.1 degroote 127 1.1 degroote /* 128 1.1 degroote * Firmware commands 129 1.1 degroote */ 130 1.1 degroote #define MALO_CMD_GET_HW_SPEC 0x0003 131 1.1 degroote #define MALO_CMD_SET_RADIO 0x001c 132 1.1 degroote #define MALO_CMD_SET_AID 0x010d 133 1.1 degroote #define MALO_CMD_SET_TXPOWER 0x001e 134 1.1 degroote #define MALO_CMD_SET_ANTENNA 0x0020 135 1.1 degroote #define MALO_CMD_SET_PRESCAN 0x0107 136 1.1 degroote #define MALO_CMD_SET_POSTSCAN 0x0108 137 1.1 degroote #define MALO_CMD_SET_RATE 0x0110 138 1.1 degroote #define MALO_CMD_SET_CHANNEL 0x010a 139 1.1 degroote #define MALO_CMD_SET_RTS 0x0113 140 1.1 degroote #define MALO_CMD_SET_SLOT 0x0114 141 1.1 degroote #define MALO_CMD_RESPONSE 0x8000 142 1.1 degroote 143 1.1 degroote #define MALO_CMD_RESULT_OK 0x0000 /* everything is fine */ 144 1.1 degroote #define MALO_CMD_RESULT_ERROR 0x0001 /* general error */ 145 1.1 degroote #define MALO_CMD_RESULT_NOSUPPORT 0x0002 /* command not valid */ 146 1.1 degroote #define MALO_CMD_RESULT_PENDING 0x0003 /* will be processed */ 147 1.1 degroote #define MALO_CMD_RESULT_BUSY 0x0004 /* command ignored */ 148 1.1 degroote #define MALO_CMD_RESULT_PARTIALDATA 0x0005 /* buffer too small */ 149 1.1 degroote 150 1.1 degroote struct malo_cmdheader { 151 1.1 degroote uint16_t cmd; 152 1.1 degroote uint16_t size; /* size of the command, incl. header */ 153 1.1 degroote uint16_t seqnum; /* seems not to matter that much */ 154 1.1 degroote uint16_t result; /* set to 0 on request */ 155 1.1 degroote /* following the data payload, up to 256 bytes */ 156 1.1 degroote }; 157 1.1 degroote 158 1.1 degroote struct malo_hw_spec { 159 1.1 degroote uint16_t HwVersion; 160 1.1 degroote uint16_t NumOfWCB; 161 1.1 degroote uint16_t NumOfMCastAdr; 162 1.1 degroote uint8_t PermanentAddress[6]; 163 1.1 degroote uint16_t RegionCode; 164 1.1 degroote uint16_t NumberOfAntenna; 165 1.1 degroote uint32_t FWReleaseNumber; 166 1.1 degroote uint32_t WcbBase0; 167 1.1 degroote uint32_t RxPdWrPtr; 168 1.1 degroote uint32_t RxPdRdPtr; 169 1.1 degroote uint32_t CookiePtr; 170 1.1 degroote uint32_t WcbBase1; 171 1.1 degroote uint32_t WcbBase2; 172 1.1 degroote uint32_t WcbBase3; 173 1.1 degroote } __packed; 174 1.1 degroote 175 1.1 degroote struct malo_cmd_radio { 176 1.1 degroote uint16_t action; 177 1.1 degroote uint16_t preamble_mode; 178 1.1 degroote uint16_t enable; 179 1.1 degroote } __packed; 180 1.1 degroote 181 1.1 degroote struct malo_cmd_aid { 182 1.1 degroote uint16_t associd; 183 1.1 degroote uint8_t macaddr[6]; 184 1.1 degroote uint32_t gprotection; 185 1.1 degroote uint8_t aprates[14]; 186 1.1 degroote } __packed; 187 1.1 degroote 188 1.1 degroote struct malo_cmd_txpower { 189 1.1 degroote uint16_t action; 190 1.1 degroote uint16_t supportpowerlvl; 191 1.1 degroote uint16_t currentpowerlvl; 192 1.1 degroote uint16_t reserved; 193 1.1 degroote uint16_t powerlvllist[8]; 194 1.1 degroote } __packed; 195 1.1 degroote 196 1.1 degroote struct malo_cmd_antenna { 197 1.1 degroote uint16_t action; 198 1.1 degroote uint16_t mode; 199 1.1 degroote } __packed; 200 1.1 degroote 201 1.1 degroote struct malo_cmd_postscan { 202 1.1 degroote uint32_t isibss; 203 1.1 degroote uint8_t bssid[6]; 204 1.1 degroote } __packed; 205 1.1 degroote 206 1.1 degroote struct malo_cmd_channel { 207 1.1 degroote uint16_t action; 208 1.1 degroote uint8_t channel; 209 1.1 degroote } __packed; 210 1.1 degroote 211 1.1 degroote struct malo_cmd_rate { 212 1.1 degroote uint8_t dataratetype; 213 1.1 degroote uint8_t rateindex; 214 1.1 degroote uint8_t aprates[14]; 215 1.1 degroote } __packed; 216 1.1 degroote 217 1.1 degroote struct malo_cmd_rts { 218 1.1 degroote uint16_t action; 219 1.1 degroote uint32_t threshold; 220 1.1 degroote } __packed; 221 1.1 degroote 222 1.1 degroote struct malo_cmd_slot { 223 1.1 degroote uint16_t action; 224 1.1 degroote uint8_t slot; 225 1.1 degroote } __packed; 226 1.1 degroote 227 1.1 degroote #define malo_mem_write4(sc, off, x) \ 228 1.1 degroote bus_space_write_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, (off), (x)) 229 1.1 degroote #define malo_mem_write2(sc, off, x) \ 230 1.1 degroote bus_space_write_2((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, (off), (x)) 231 1.1 degroote #define malo_mem_write1(sc, off, x) \ 232 1.1 degroote bus_space_write_1((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, (off), (x)) 233 1.1 degroote 234 1.1 degroote #define malo_mem_read4(sc, off) \ 235 1.1 degroote bus_space_read_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, (off)) 236 1.1 degroote #define malo_mem_read1(sc, off) \ 237 1.1 degroote bus_space_read_1((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, (off)) 238 1.1 degroote 239 1.1 degroote #define malo_ctl_write4(sc, off, x) \ 240 1.1 degroote bus_space_write_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, (off), (x)) 241 1.1 degroote #define malo_ctl_read4(sc, off) \ 242 1.1 degroote bus_space_read_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, (off)) 243 1.1 degroote #define malo_ctl_read1(sc, off) \ 244 1.1 degroote bus_space_read_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, (off)) 245 1.1 degroote 246 1.1 degroote #define malo_ctl_barrier(sc, t) \ 247 1.1 degroote bus_space_barrier((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, 0x0c00, 0xff, (t)) 248 1.1 degroote 249 1.1 degroote static int malo_alloc_cmd(struct malo_softc *sc); 250 1.1 degroote static void malo_free_cmd(struct malo_softc *sc); 251 1.1 degroote static void malo_send_cmd(struct malo_softc *sc, bus_addr_t addr); 252 1.1 degroote static int malo_send_cmd_dma(struct malo_softc *sc, bus_addr_t addr); 253 1.1 degroote static int malo_alloc_rx_ring(struct malo_softc *sc, struct malo_rx_ring *ring, 254 1.1 degroote int count); 255 1.1 degroote static void malo_reset_rx_ring(struct malo_softc *sc, struct malo_rx_ring *ring); 256 1.1 degroote static void malo_free_rx_ring(struct malo_softc *sc, struct malo_rx_ring *ring); 257 1.1 degroote static int malo_alloc_tx_ring(struct malo_softc *sc, struct malo_tx_ring *ring, 258 1.1 degroote int count); 259 1.1 degroote static void malo_reset_tx_ring(struct malo_softc *sc, struct malo_tx_ring *ring); 260 1.1 degroote static void malo_free_tx_ring(struct malo_softc *sc, struct malo_tx_ring *ring); 261 1.1 degroote static int malo_ioctl(struct ifnet *ifp, u_long cmd, void* data); 262 1.1 degroote static void malo_start(struct ifnet *ifp); 263 1.1 degroote static void malo_watchdog(struct ifnet *ifp); 264 1.1 degroote static int malo_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, 265 1.1 degroote int arg); 266 1.1 degroote static void malo_newassoc(struct ieee80211_node *ni, int isnew); 267 1.1 degroote static struct ieee80211_node * 268 1.1 degroote malo_node_alloc(struct ieee80211_node_table *nt); 269 1.1 degroote static int malo_media_change(struct ifnet *ifp); 270 1.1 degroote static void malo_media_status(struct ifnet *ifp, struct ifmediareq *imr); 271 1.1 degroote static int malo_chip2rate(int chip_rate); 272 1.1 degroote static int malo_fix2rate(int fix_rate); 273 1.1 degroote static void malo_next_scan(void *arg); 274 1.1 degroote static void malo_tx_intr(struct malo_softc *sc); 275 1.1 degroote static int malo_tx_data(struct malo_softc *sc, struct mbuf *m0, 276 1.1 degroote struct ieee80211_node *ni); 277 1.1 degroote static void malo_tx_setup_desc(struct malo_softc *sc, struct malo_tx_desc *desc, 278 1.1 degroote int len, int rate, const bus_dma_segment_t *segs, int nsegs); 279 1.1 degroote static void malo_rx_intr(struct malo_softc *sc); 280 1.1 degroote static int malo_load_bootimg(struct malo_softc *sc); 281 1.1 degroote static int malo_load_firmware(struct malo_softc *sc); 282 1.1 degroote 283 1.1 degroote static int malo_set_slot(struct malo_softc *sc); 284 1.1 degroote static void malo_update_slot(struct ifnet* ifp); 285 1.1 degroote #ifdef MALO_DEBUG 286 1.1 degroote static void malo_hexdump(void *buf, int len); 287 1.1 degroote #endif 288 1.1 degroote static const char *malo_cmd_string(uint16_t cmd); 289 1.1 degroote static const char *malo_cmd_string_result(uint16_t result); 290 1.1 degroote static int malo_cmd_get_spec(struct malo_softc *sc); 291 1.1 degroote static int malo_cmd_set_prescan(struct malo_softc *sc); 292 1.1 degroote static int malo_cmd_set_postscan(struct malo_softc *sc, uint8_t *macaddr, 293 1.1 degroote uint8_t ibsson); 294 1.1 degroote static int malo_cmd_set_channel(struct malo_softc *sc, struct ieee80211_channel *chan); 295 1.1 degroote static int malo_cmd_set_antenna(struct malo_softc *sc, uint16_t antenna_type); 296 1.1 degroote static int malo_cmd_set_radio(struct malo_softc *sc, uint16_t mode, 297 1.1 degroote uint16_t preamble); 298 1.1 degroote static int malo_cmd_set_aid(struct malo_softc *sc, uint8_t *bssid, 299 1.1 degroote uint16_t associd); 300 1.1 degroote static int malo_cmd_set_txpower(struct malo_softc *sc, unsigned int powerlevel); 301 1.1 degroote static int malo_cmd_set_rts(struct malo_softc *sc, uint32_t threshold); 302 1.1 degroote static int malo_cmd_set_slot(struct malo_softc *sc, uint8_t slot); 303 1.1 degroote static int malo_cmd_set_rate(struct malo_softc *sc, uint8_t rate); 304 1.1 degroote static void malo_cmd_response(struct malo_softc *sc); 305 1.1 degroote 306 1.1 degroote int 307 1.1 degroote malo_intr(void *arg) 308 1.1 degroote { 309 1.1 degroote struct malo_softc *sc = arg; 310 1.1 degroote uint32_t status; 311 1.1 degroote 312 1.1 degroote status = malo_ctl_read4(sc, MALO_REG_A2H_INTERRUPT_CAUSE); 313 1.1 degroote if (status == 0xffffffff || status == 0) 314 1.1 degroote /* not for us */ 315 1.1 degroote return (0); 316 1.1 degroote 317 1.9 nonaka /* disable interrupts */ 318 1.9 nonaka malo_ctl_read4(sc, MALO_REG_A2H_INTERRUPT_CAUSE); 319 1.9 nonaka malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_CAUSE, 0); 320 1.9 nonaka malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_MASK, 0); 321 1.9 nonaka malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_STATUS_MASK, 0); 322 1.9 nonaka 323 1.9 nonaka softint_schedule(sc->sc_soft_ih); 324 1.9 nonaka return (1); 325 1.9 nonaka } 326 1.9 nonaka 327 1.9 nonaka void 328 1.9 nonaka malo_softintr(void *arg) 329 1.9 nonaka { 330 1.9 nonaka struct malo_softc *sc = arg; 331 1.9 nonaka uint32_t status; 332 1.9 nonaka 333 1.9 nonaka status = malo_ctl_read4(sc, MALO_REG_A2H_INTERRUPT_CAUSE); 334 1.9 nonaka if (status == 0xffffffff || status == 0) 335 1.9 nonaka goto out; /* not for us */ 336 1.9 nonaka 337 1.1 degroote if (status & MALO_A2HRIC_BIT_TX_DONE) 338 1.1 degroote malo_tx_intr(sc); 339 1.1 degroote if (status & MALO_A2HRIC_BIT_RX_RDY) 340 1.1 degroote malo_rx_intr(sc); 341 1.1 degroote if (status & MALO_A2HRIC_BIT_OPC_DONE) { 342 1.1 degroote /* XXX cmd done interrupt handling doesn't work yet */ 343 1.9 nonaka DPRINTF(1, "%s: got cmd done interrupt\n", 344 1.9 nonaka device_xname(sc->sc_dev)); 345 1.1 degroote //malo_cmd_response(sc); 346 1.1 degroote } 347 1.1 degroote 348 1.1 degroote if (status & ~0x7) { 349 1.1 degroote DPRINTF(1, "%s: unknown interrupt %x\n", 350 1.1 degroote device_xname(sc->sc_dev), status); 351 1.1 degroote } 352 1.1 degroote 353 1.1 degroote /* just ack the interrupt */ 354 1.1 degroote malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_CAUSE, 0); 355 1.1 degroote 356 1.9 nonaka out: 357 1.9 nonaka /* enable interrupts */ 358 1.9 nonaka malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_MASK, 0x1f); 359 1.9 nonaka malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE); 360 1.9 nonaka malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_STATUS_MASK, 0x1f); 361 1.9 nonaka malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE); 362 1.1 degroote } 363 1.1 degroote 364 1.1 degroote int 365 1.1 degroote malo_attach(struct malo_softc *sc) 366 1.1 degroote { 367 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 368 1.1 degroote struct ifnet *ifp = &sc->sc_if; 369 1.19 riastrad int i; 370 1.1 degroote 371 1.1 degroote /* initialize channel scanning timer */ 372 1.1 degroote callout_init(&sc->sc_scan_to, 0); 373 1.1 degroote callout_setfunc(&sc->sc_scan_to, malo_next_scan, sc); 374 1.1 degroote 375 1.1 degroote /* allocate DMA structures */ 376 1.1 degroote malo_alloc_cmd(sc); 377 1.1 degroote malo_alloc_rx_ring(sc, &sc->sc_rxring, MALO_RX_RING_COUNT); 378 1.1 degroote malo_alloc_tx_ring(sc, &sc->sc_txring, MALO_TX_RING_COUNT); 379 1.1 degroote 380 1.1 degroote /* setup interface */ 381 1.1 degroote ifp->if_softc = sc; 382 1.1 degroote ifp->if_init = malo_init; 383 1.1 degroote ifp->if_stop = malo_stop; 384 1.1 degroote ifp->if_ioctl = malo_ioctl; 385 1.1 degroote ifp->if_start = malo_start; 386 1.1 degroote ifp->if_watchdog = malo_watchdog; 387 1.1 degroote ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST; 388 1.1 degroote memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); 389 1.1 degroote IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); 390 1.1 degroote IFQ_SET_READY(&ifp->if_snd); 391 1.1 degroote 392 1.1 degroote /* set supported rates */ 393 1.1 degroote ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b; 394 1.1 degroote ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g; 395 1.1 degroote sc->sc_last_txrate = -1; 396 1.1 degroote 397 1.1 degroote /* set channels */ 398 1.1 degroote for (i = 1; i <= 14; i++) { 399 1.1 degroote ic->ic_channels[i].ic_freq = 400 1.1 degroote ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ); 401 1.1 degroote ic->ic_channels[i].ic_flags = 402 1.1 degroote IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | 403 1.1 degroote IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; 404 1.1 degroote } 405 1.1 degroote 406 1.1 degroote /* OpenBSD supports IEEE80211_C_RSN too */ 407 1.1 degroote /* set the rest */ 408 1.1 degroote ic->ic_ifp = ifp; 409 1.1 degroote ic->ic_caps = 410 1.1 degroote IEEE80211_C_IBSS | 411 1.1 degroote IEEE80211_C_MONITOR | 412 1.1 degroote IEEE80211_C_SHPREAMBLE | 413 1.1 degroote IEEE80211_C_SHSLOT | 414 1.1 degroote IEEE80211_C_WEP | 415 1.1 degroote IEEE80211_C_WPA; 416 1.1 degroote ic->ic_opmode = IEEE80211_M_STA; 417 1.1 degroote ic->ic_state = IEEE80211_S_INIT; 418 1.1 degroote for (i = 0; i < 6; i++) 419 1.1 degroote ic->ic_myaddr[i] = malo_ctl_read1(sc, 0xa528 + i); 420 1.1 degroote 421 1.1 degroote /* show our mac address */ 422 1.20 riastrad aprint_normal_dev(sc->sc_dev, "address %s\n", 423 1.20 riastrad ether_sprintf(ic->ic_myaddr)); 424 1.1 degroote 425 1.1 degroote /* attach interface */ 426 1.19 riastrad if_initialize(ifp); 427 1.1 degroote ieee80211_ifattach(ic); 428 1.9 nonaka /* Use common softint-based if_input */ 429 1.9 nonaka ifp->if_percpuq = if_percpuq_create(ifp); 430 1.9 nonaka if_register(ifp); 431 1.1 degroote 432 1.1 degroote /* post attach vector functions */ 433 1.1 degroote sc->sc_newstate = ic->ic_newstate; 434 1.1 degroote ic->ic_newstate = malo_newstate; 435 1.1 degroote ic->ic_newassoc = malo_newassoc; 436 1.1 degroote ic->ic_node_alloc = malo_node_alloc; 437 1.1 degroote ic->ic_updateslot = malo_update_slot; 438 1.1 degroote 439 1.1 degroote ieee80211_media_init(ic, malo_media_change, malo_media_status); 440 1.1 degroote 441 1.1 degroote bpf_attach2(ifp, DLT_IEEE802_11_RADIO, 442 1.1 degroote sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN, 443 1.1 degroote &sc->sc_drvbpf); 444 1.1 degroote 445 1.1 degroote sc->sc_rxtap_len = sizeof(sc->sc_rxtapu); 446 1.1 degroote sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len); 447 1.1 degroote sc->sc_rxtap.wr_ihdr.it_present = htole32(MALO_RX_RADIOTAP_PRESENT); 448 1.1 degroote 449 1.1 degroote sc->sc_txtap_len = sizeof(sc->sc_txtapu); 450 1.1 degroote sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len); 451 1.1 degroote sc->sc_txtap.wt_ihdr.it_present = htole32(MALO_TX_RADIOTAP_PRESENT); 452 1.1 degroote 453 1.1 degroote ieee80211_announce(ic); 454 1.1 degroote 455 1.1 degroote return (0); 456 1.1 degroote } 457 1.1 degroote 458 1.1 degroote int 459 1.1 degroote malo_detach(void *arg) 460 1.1 degroote { 461 1.1 degroote struct malo_softc *sc = arg; 462 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 463 1.1 degroote struct ifnet *ifp = &sc->sc_if; 464 1.1 degroote 465 1.15 jakllsch malo_stop(ifp, 1); 466 1.1 degroote /* remove channel scanning timer */ 467 1.15 jakllsch callout_destroy(&sc->sc_scan_to); 468 1.1 degroote ieee80211_ifdetach(ic); 469 1.1 degroote if_detach(ifp); 470 1.1 degroote malo_free_cmd(sc); 471 1.1 degroote malo_free_rx_ring(sc, &sc->sc_rxring); 472 1.1 degroote malo_free_tx_ring(sc, &sc->sc_txring); 473 1.1 degroote 474 1.1 degroote return (0); 475 1.1 degroote } 476 1.1 degroote 477 1.1 degroote static int 478 1.1 degroote malo_alloc_cmd(struct malo_softc *sc) 479 1.1 degroote { 480 1.1 degroote int error, nsegs; 481 1.1 degroote 482 1.1 degroote error = bus_dmamap_create(sc->sc_dmat, PAGE_SIZE, 1, 483 1.1 degroote PAGE_SIZE, 0, BUS_DMA_ALLOCNOW, &sc->sc_cmd_dmam); 484 1.1 degroote if (error != 0) { 485 1.1 degroote aprint_error_dev(sc->sc_dev, "can not create DMA tag\n"); 486 1.1 degroote return (-1); 487 1.1 degroote } 488 1.1 degroote 489 1.1 degroote error = bus_dmamem_alloc(sc->sc_dmat, PAGE_SIZE, PAGE_SIZE, 490 1.1 degroote 0, &sc->sc_cmd_dmas, 1, &nsegs, BUS_DMA_WAITOK); 491 1.1 degroote if (error != 0) { 492 1.1 degroote aprint_error_dev(sc->sc_dev, "error alloc dma memory\n"); 493 1.1 degroote return (-1); 494 1.1 degroote } 495 1.1 degroote 496 1.1 degroote error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cmd_dmas, nsegs, 497 1.1 degroote PAGE_SIZE, (void **)&sc->sc_cmd_mem, BUS_DMA_WAITOK); 498 1.1 degroote if (error != 0) { 499 1.1 degroote aprint_error_dev(sc->sc_dev, "error map dma memory\n"); 500 1.1 degroote return (-1); 501 1.1 degroote } 502 1.1 degroote 503 1.1 degroote error = bus_dmamap_load(sc->sc_dmat, sc->sc_cmd_dmam, 504 1.1 degroote sc->sc_cmd_mem, PAGE_SIZE, NULL, BUS_DMA_NOWAIT); 505 1.1 degroote if (error != 0) { 506 1.1 degroote aprint_error_dev(sc->sc_dev, "error load dma memory\n"); 507 1.1 degroote bus_dmamem_free(sc->sc_dmat, &sc->sc_cmd_dmas, nsegs); 508 1.1 degroote return (-1); 509 1.1 degroote } 510 1.1 degroote 511 1.1 degroote sc->sc_cookie = sc->sc_cmd_mem; 512 1.1 degroote *sc->sc_cookie = htole32(0xaa55aa55); 513 1.1 degroote sc->sc_cmd_mem = ((char*)sc->sc_cmd_mem) + sizeof(uint32_t); 514 1.1 degroote sc->sc_cookie_dmaaddr = sc->sc_cmd_dmam->dm_segs[0].ds_addr; 515 1.1 degroote sc->sc_cmd_dmaaddr = sc->sc_cmd_dmam->dm_segs[0].ds_addr + 516 1.1 degroote sizeof(uint32_t); 517 1.1 degroote 518 1.1 degroote return (0); 519 1.1 degroote } 520 1.1 degroote 521 1.1 degroote static void 522 1.1 degroote malo_free_cmd(struct malo_softc *sc) 523 1.1 degroote { 524 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 525 1.1 degroote BUS_DMASYNC_POSTWRITE); 526 1.1 degroote bus_dmamap_unload(sc->sc_dmat, sc->sc_cmd_dmam); 527 1.1 degroote bus_dmamem_unmap(sc->sc_dmat, sc->sc_cookie, PAGE_SIZE); 528 1.1 degroote bus_dmamem_free(sc->sc_dmat, &sc->sc_cmd_dmas, 1); 529 1.1 degroote } 530 1.1 degroote 531 1.1 degroote static void 532 1.1 degroote malo_send_cmd(struct malo_softc *sc, bus_addr_t addr) 533 1.1 degroote { 534 1.1 degroote malo_ctl_write4(sc, MALO_REG_GEN_PTR, (uint32_t)addr); 535 1.1 degroote malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE); 536 1.1 degroote malo_ctl_write4(sc, MALO_REG_H2A_INTERRUPT_EVENTS, 2); /* CPU_TRANSFER_CMD */ 537 1.1 degroote malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE); 538 1.1 degroote } 539 1.1 degroote 540 1.1 degroote static int 541 1.1 degroote malo_send_cmd_dma(struct malo_softc *sc, bus_addr_t addr) 542 1.1 degroote { 543 1.1 degroote int i; 544 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 545 1.1 degroote 546 1.1 degroote malo_send_cmd(sc, addr); 547 1.1 degroote 548 1.1 degroote for (i = 0; i < MALO_CMD_TIMEOUT; i++) { 549 1.1 degroote delay(100); 550 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 551 1.1 degroote BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); 552 1.1 degroote if (hdr->cmd & htole16(0x8000)) 553 1.1 degroote break; 554 1.1 degroote } 555 1.1 degroote if (i == MALO_CMD_TIMEOUT) { 556 1.1 degroote aprint_error_dev(sc->sc_dev, "timeout while waiting for cmd response!\n"); 557 1.1 degroote return (ETIMEDOUT); 558 1.1 degroote } 559 1.1 degroote 560 1.1 degroote malo_cmd_response(sc); 561 1.1 degroote 562 1.1 degroote return (0); 563 1.1 degroote } 564 1.1 degroote 565 1.1 degroote static int 566 1.1 degroote malo_alloc_rx_ring(struct malo_softc *sc, struct malo_rx_ring *ring, int count) 567 1.1 degroote { 568 1.1 degroote struct malo_rx_desc *desc; 569 1.1 degroote struct malo_rx_data *data; 570 1.1 degroote int i, nsegs, error; 571 1.1 degroote 572 1.1 degroote ring->count = count; 573 1.1 degroote ring->cur = ring->next = 0; 574 1.1 degroote 575 1.1 degroote error = bus_dmamap_create(sc->sc_dmat, 576 1.1 degroote count * sizeof(struct malo_rx_desc), 1, 577 1.1 degroote count * sizeof(struct malo_rx_desc), 0, 578 1.1 degroote BUS_DMA_NOWAIT, &ring->map); 579 1.1 degroote if (error != 0) { 580 1.1 degroote aprint_error_dev(sc->sc_dev, "could not create desc DMA map\n"); 581 1.1 degroote goto fail; 582 1.1 degroote } 583 1.1 degroote 584 1.1 degroote error = bus_dmamem_alloc(sc->sc_dmat, 585 1.1 degroote count * sizeof(struct malo_rx_desc), 586 1.1 degroote PAGE_SIZE, 0, &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT); 587 1.1 degroote 588 1.1 degroote if (error != 0) { 589 1.1 degroote aprint_error_dev(sc->sc_dev, "could not allocate DMA memory\n"); 590 1.1 degroote goto fail; 591 1.1 degroote } 592 1.1 degroote 593 1.1 degroote error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs, 594 1.1 degroote count * sizeof(struct malo_rx_desc), (void **)&ring->desc, 595 1.1 degroote BUS_DMA_NOWAIT); 596 1.1 degroote if (error != 0) { 597 1.1 degroote aprint_error_dev(sc->sc_dev, "can't map desc DMA memory\n"); 598 1.1 degroote goto fail; 599 1.1 degroote } 600 1.1 degroote 601 1.1 degroote error = bus_dmamap_load(sc->sc_dmat, ring->map, ring->desc, 602 1.1 degroote count * sizeof(struct malo_rx_desc), NULL, BUS_DMA_NOWAIT); 603 1.1 degroote if (error != 0) { 604 1.1 degroote aprint_error_dev(sc->sc_dev, "could not load desc DMA map\n"); 605 1.1 degroote goto fail; 606 1.1 degroote } 607 1.1 degroote 608 1.1 degroote ring->physaddr = ring->map->dm_segs->ds_addr; 609 1.1 degroote 610 1.1 degroote ring->data = malloc(count * sizeof (struct malo_rx_data), M_DEVBUF, 611 1.17 chs M_WAITOK); 612 1.1 degroote 613 1.1 degroote /* 614 1.1 degroote * Pre-allocate Rx buffers and populate Rx ring. 615 1.1 degroote */ 616 1.1 degroote memset(ring->data, 0, count * sizeof (struct malo_rx_data)); 617 1.1 degroote for (i = 0; i < count; i++) { 618 1.1 degroote desc = &ring->desc[i]; 619 1.1 degroote data = &ring->data[i]; 620 1.1 degroote 621 1.1 degroote error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES, 622 1.1 degroote 0, BUS_DMA_NOWAIT, &data->map); 623 1.1 degroote if (error != 0) { 624 1.1 degroote aprint_error_dev(sc->sc_dev, "could not create DMA map\n"); 625 1.1 degroote goto fail; 626 1.1 degroote } 627 1.1 degroote 628 1.1 degroote MGETHDR(data->m, M_DONTWAIT, MT_DATA); 629 1.1 degroote if (data->m == NULL) { 630 1.1 degroote aprint_error_dev(sc->sc_dev, "could not allocate rx mbuf\n"); 631 1.1 degroote error = ENOMEM; 632 1.1 degroote goto fail; 633 1.1 degroote } 634 1.1 degroote 635 1.1 degroote MCLGET(data->m, M_DONTWAIT); 636 1.1 degroote if (!(data->m->m_flags & M_EXT)) { 637 1.1 degroote aprint_error_dev(sc->sc_dev, "could not allocate rx mbuf cluster\n"); 638 1.1 degroote error = ENOMEM; 639 1.1 degroote goto fail; 640 1.1 degroote } 641 1.1 degroote 642 1.1 degroote error = bus_dmamap_load(sc->sc_dmat, data->map, 643 1.1 degroote mtod(data->m, void *), MCLBYTES, NULL, BUS_DMA_NOWAIT); 644 1.1 degroote if (error != 0) { 645 1.1 degroote aprint_error_dev(sc->sc_dev, "could not load rx buf DMA map"); 646 1.1 degroote goto fail; 647 1.1 degroote } 648 1.1 degroote 649 1.5 macallan desc->status = 1; 650 1.1 degroote desc->physdata = htole32(data->map->dm_segs->ds_addr); 651 1.1 degroote desc->physnext = htole32(ring->physaddr + 652 1.1 degroote (i + 1) % count * sizeof(struct malo_rx_desc)); 653 1.1 degroote } 654 1.1 degroote 655 1.1 degroote bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize, 656 1.1 degroote BUS_DMASYNC_PREWRITE); 657 1.1 degroote 658 1.1 degroote return (0); 659 1.1 degroote 660 1.1 degroote fail: malo_free_rx_ring(sc, ring); 661 1.1 degroote return (error); 662 1.1 degroote } 663 1.1 degroote 664 1.1 degroote static void 665 1.1 degroote malo_reset_rx_ring(struct malo_softc *sc, struct malo_rx_ring *ring) 666 1.1 degroote { 667 1.1 degroote int i; 668 1.1 degroote 669 1.1 degroote for (i = 0; i < ring->count; i++) 670 1.1 degroote ring->desc[i].status = 0; 671 1.1 degroote 672 1.1 degroote bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize, 673 1.1 degroote BUS_DMASYNC_PREWRITE); 674 1.1 degroote 675 1.1 degroote ring->cur = ring->next = 0; 676 1.1 degroote } 677 1.1 degroote 678 1.1 degroote static void 679 1.1 degroote malo_free_rx_ring(struct malo_softc *sc, struct malo_rx_ring *ring) 680 1.1 degroote { 681 1.1 degroote struct malo_rx_data *data; 682 1.1 degroote int i; 683 1.1 degroote 684 1.1 degroote if (ring->desc != NULL) { 685 1.1 degroote bus_dmamap_sync(sc->sc_dmat, ring->map, 0, 686 1.1 degroote ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE); 687 1.1 degroote bus_dmamap_unload(sc->sc_dmat, ring->map); 688 1.1 degroote bus_dmamem_unmap(sc->sc_dmat, ring->desc, 689 1.1 degroote ring->count * sizeof(struct malo_rx_desc)); 690 1.1 degroote bus_dmamem_free(sc->sc_dmat, &ring->seg, 1); 691 1.1 degroote } 692 1.1 degroote 693 1.1 degroote if (ring->data != NULL) { 694 1.1 degroote for (i = 0; i < ring->count; i++) { 695 1.1 degroote data = &ring->data[i]; 696 1.1 degroote 697 1.1 degroote if (data->m != NULL) { 698 1.1 degroote bus_dmamap_sync(sc->sc_dmat, data->map, 0, 699 1.1 degroote data->map->dm_mapsize, 700 1.1 degroote BUS_DMASYNC_POSTREAD); 701 1.1 degroote bus_dmamap_unload(sc->sc_dmat, data->map); 702 1.1 degroote m_freem(data->m); 703 1.1 degroote } 704 1.1 degroote 705 1.1 degroote if (data->map != NULL) 706 1.1 degroote bus_dmamap_destroy(sc->sc_dmat, data->map); 707 1.1 degroote } 708 1.1 degroote free(ring->data, M_DEVBUF); 709 1.1 degroote } 710 1.1 degroote } 711 1.1 degroote 712 1.1 degroote static int 713 1.1 degroote malo_alloc_tx_ring(struct malo_softc *sc, struct malo_tx_ring *ring, 714 1.1 degroote int count) 715 1.1 degroote { 716 1.1 degroote int i, nsegs, error; 717 1.1 degroote 718 1.1 degroote ring->count = count; 719 1.1 degroote ring->queued = 0; 720 1.1 degroote ring->cur = ring->next = ring->stat = 0; 721 1.1 degroote 722 1.1 degroote error = bus_dmamap_create(sc->sc_dmat, 723 1.1 degroote count * sizeof(struct malo_tx_desc), 1, 724 1.1 degroote count * sizeof(struct malo_tx_desc), 0, BUS_DMA_NOWAIT, &ring->map); 725 1.1 degroote if (error != 0) { 726 1.1 degroote aprint_error_dev(sc->sc_dev, "could not create desc DMA map\n"); 727 1.1 degroote goto fail; 728 1.1 degroote } 729 1.1 degroote 730 1.1 degroote error = bus_dmamem_alloc(sc->sc_dmat, 731 1.1 degroote count * sizeof(struct malo_tx_desc), PAGE_SIZE, 0, 732 1.1 degroote &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT); 733 1.1 degroote if (error != 0) { 734 1.1 degroote aprint_error_dev(sc->sc_dev, "could not allocate DMA memory\n"); 735 1.1 degroote goto fail; 736 1.1 degroote } 737 1.1 degroote 738 1.1 degroote error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs, 739 1.1 degroote count * sizeof(struct malo_tx_desc), (void **)&ring->desc, 740 1.1 degroote BUS_DMA_NOWAIT); 741 1.1 degroote if (error != 0) { 742 1.1 degroote aprint_error_dev(sc->sc_dev, "can't map desc DMA memory\n"); 743 1.1 degroote goto fail; 744 1.1 degroote } 745 1.1 degroote 746 1.1 degroote error = bus_dmamap_load(sc->sc_dmat, ring->map, ring->desc, 747 1.1 degroote count * sizeof(struct malo_tx_desc), NULL, BUS_DMA_NOWAIT); 748 1.1 degroote if (error != 0) { 749 1.1 degroote aprint_error_dev(sc->sc_dev, "could not load desc DMA map\n"); 750 1.1 degroote goto fail; 751 1.1 degroote } 752 1.1 degroote 753 1.1 degroote ring->physaddr = ring->map->dm_segs->ds_addr; 754 1.1 degroote 755 1.1 degroote ring->data = malloc(count * sizeof(struct malo_tx_data), M_DEVBUF, 756 1.17 chs M_WAITOK | M_ZERO); 757 1.1 degroote 758 1.1 degroote for (i = 0; i < count; i++) { 759 1.1 degroote error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 760 1.1 degroote MALO_MAX_SCATTER, MCLBYTES, 0, BUS_DMA_NOWAIT, 761 1.1 degroote &ring->data[i].map); 762 1.1 degroote if (error != 0) { 763 1.1 degroote aprint_error_dev(sc->sc_dev, "could not create DMA map\n"); 764 1.1 degroote goto fail; 765 1.1 degroote } 766 1.1 degroote ring->desc[i].physnext = htole32(ring->physaddr + 767 1.1 degroote (i + 1) % count * sizeof(struct malo_tx_desc)); 768 1.1 degroote } 769 1.1 degroote 770 1.1 degroote return (0); 771 1.1 degroote 772 1.1 degroote fail: malo_free_tx_ring(sc, ring); 773 1.1 degroote return (error); 774 1.1 degroote } 775 1.1 degroote 776 1.1 degroote static void 777 1.1 degroote malo_reset_tx_ring(struct malo_softc *sc, struct malo_tx_ring *ring) 778 1.1 degroote { 779 1.1 degroote struct malo_tx_desc *desc; 780 1.1 degroote struct malo_tx_data *data; 781 1.1 degroote int i; 782 1.1 degroote 783 1.1 degroote for (i = 0; i < ring->count; i++) { 784 1.1 degroote desc = &ring->desc[i]; 785 1.1 degroote data = &ring->data[i]; 786 1.1 degroote 787 1.1 degroote if (data->m != NULL) { 788 1.1 degroote bus_dmamap_sync(sc->sc_dmat, data->map, 0, 789 1.1 degroote data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE); 790 1.1 degroote bus_dmamap_unload(sc->sc_dmat, data->map); 791 1.1 degroote m_freem(data->m); 792 1.1 degroote data->m = NULL; 793 1.1 degroote } 794 1.1 degroote 795 1.1 degroote /* 796 1.1 degroote * The node has already been freed at that point so don't call 797 1.1 degroote * ieee80211_release_node() here. 798 1.1 degroote */ 799 1.1 degroote data->ni = NULL; 800 1.1 degroote 801 1.1 degroote desc->status = 0; 802 1.1 degroote } 803 1.1 degroote 804 1.1 degroote bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize, 805 1.1 degroote BUS_DMASYNC_PREWRITE); 806 1.1 degroote 807 1.1 degroote ring->queued = 0; 808 1.1 degroote ring->cur = ring->next = ring->stat = 0; 809 1.1 degroote } 810 1.1 degroote 811 1.1 degroote static void 812 1.1 degroote malo_free_tx_ring(struct malo_softc *sc, struct malo_tx_ring *ring) 813 1.1 degroote { 814 1.1 degroote struct malo_tx_data *data; 815 1.1 degroote int i; 816 1.1 degroote 817 1.1 degroote if (ring->desc != NULL) { 818 1.1 degroote bus_dmamap_sync(sc->sc_dmat, ring->map, 0, 819 1.1 degroote ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE); 820 1.1 degroote bus_dmamap_unload(sc->sc_dmat, ring->map); 821 1.1 degroote bus_dmamem_unmap(sc->sc_dmat, ring->desc, 822 1.1 degroote ring->count * sizeof(struct malo_tx_desc)); 823 1.1 degroote bus_dmamem_free(sc->sc_dmat, &ring->seg, 1); 824 1.1 degroote } 825 1.1 degroote 826 1.1 degroote if (ring->data != NULL) { 827 1.1 degroote for (i = 0; i < ring->count; i++) { 828 1.1 degroote data = &ring->data[i]; 829 1.1 degroote 830 1.1 degroote if (data->m != NULL) { 831 1.1 degroote bus_dmamap_sync(sc->sc_dmat, data->map, 0, 832 1.1 degroote data->map->dm_mapsize, 833 1.1 degroote BUS_DMASYNC_POSTWRITE); 834 1.1 degroote bus_dmamap_unload(sc->sc_dmat, data->map); 835 1.1 degroote m_freem(data->m); 836 1.1 degroote } 837 1.1 degroote 838 1.1 degroote /* 839 1.1 degroote * The node has already been freed at that point so 840 1.1 degroote * don't call ieee80211_release_node() here. 841 1.1 degroote */ 842 1.1 degroote data->ni = NULL; 843 1.1 degroote 844 1.1 degroote if (data->map != NULL) 845 1.1 degroote bus_dmamap_destroy(sc->sc_dmat, data->map); 846 1.1 degroote } 847 1.1 degroote free(ring->data, M_DEVBUF); 848 1.1 degroote } 849 1.1 degroote } 850 1.1 degroote 851 1.3 degroote int 852 1.1 degroote malo_init(struct ifnet *ifp) 853 1.1 degroote { 854 1.1 degroote struct malo_softc *sc = ifp->if_softc; 855 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 856 1.1 degroote int error; 857 1.1 degroote 858 1.1 degroote DPRINTF(1, "%s: %s\n", ifp->if_xname, __func__); 859 1.1 degroote 860 1.1 degroote /* if interface already runs stop it first */ 861 1.1 degroote if (ifp->if_flags & IFF_RUNNING) 862 1.1 degroote malo_stop(ifp, 1); 863 1.1 degroote 864 1.1 degroote /* power on cardbus socket */ 865 1.1 degroote if (sc->sc_enable) 866 1.1 degroote sc->sc_enable(sc); 867 1.1 degroote 868 1.1 degroote /* disable interrupts */ 869 1.1 degroote malo_ctl_read4(sc, MALO_REG_A2H_INTERRUPT_CAUSE); 870 1.1 degroote malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_CAUSE, 0); 871 1.1 degroote malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_MASK, 0); 872 1.1 degroote malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_STATUS_MASK, 0); 873 1.1 degroote 874 1.1 degroote /* load firmware */ 875 1.1 degroote if ((error = malo_load_bootimg(sc))) 876 1.1 degroote goto fail; 877 1.1 degroote if ((error = malo_load_firmware(sc))) 878 1.1 degroote goto fail; 879 1.1 degroote 880 1.1 degroote /* enable interrupts */ 881 1.1 degroote malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_MASK, 0x1f); 882 1.1 degroote malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE); 883 1.1 degroote malo_ctl_write4(sc, MALO_REG_A2H_INTERRUPT_STATUS_MASK, 0x1f); 884 1.1 degroote malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE); 885 1.1 degroote 886 1.1 degroote if ((error = malo_cmd_get_spec(sc))) 887 1.1 degroote goto fail; 888 1.1 degroote 889 1.1 degroote /* select default channel */ 890 1.1 degroote ic->ic_bss->ni_chan = ic->ic_ibss_chan; 891 1.1 degroote 892 1.1 degroote /* initialize hardware */ 893 1.1 degroote if ((error = malo_cmd_set_channel(sc, ic->ic_bss->ni_chan))) { 894 1.1 degroote aprint_error_dev(sc->sc_dev, "setting channel failed!\n"); 895 1.1 degroote goto fail; 896 1.1 degroote } 897 1.1 degroote if ((error = malo_cmd_set_antenna(sc, 1))) { 898 1.1 degroote aprint_error_dev(sc->sc_dev, "setting RX antenna failed!\n"); 899 1.1 degroote goto fail; 900 1.1 degroote } 901 1.1 degroote if ((error = malo_cmd_set_antenna(sc, 2))) { 902 1.1 degroote aprint_error_dev(sc->sc_dev, "setting TX antenna failed!\n"); 903 1.1 degroote goto fail; 904 1.1 degroote } 905 1.1 degroote if ((error = malo_cmd_set_radio(sc, 1, 5))) { 906 1.1 degroote aprint_error_dev(sc->sc_dev, "turn radio on failed!\n"); 907 1.1 degroote goto fail; 908 1.1 degroote } 909 1.1 degroote if ((error = malo_cmd_set_txpower(sc, 100))) { 910 1.1 degroote aprint_error_dev(sc->sc_dev, "setting TX power failed!\n"); 911 1.1 degroote goto fail; 912 1.1 degroote } 913 1.1 degroote if ((error = malo_cmd_set_rts(sc, IEEE80211_RTS_MAX))) { 914 1.1 degroote aprint_error_dev(sc->sc_dev, "setting RTS failed!\n"); 915 1.1 degroote goto fail; 916 1.1 degroote } 917 1.1 degroote 918 1.1 degroote ifp->if_flags |= IFF_RUNNING; 919 1.1 degroote 920 1.1 degroote if (ic->ic_opmode != IEEE80211_M_MONITOR) 921 1.1 degroote /* start background scanning */ 922 1.1 degroote ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); 923 1.1 degroote else 924 1.1 degroote /* in monitor mode change directly into run state */ 925 1.1 degroote ieee80211_new_state(ic, IEEE80211_S_RUN, -1); 926 1.1 degroote 927 1.1 degroote return (0); 928 1.1 degroote 929 1.1 degroote fail: 930 1.1 degroote /* reset adapter */ 931 1.1 degroote DPRINTF(1, "%s: malo_init failed, resetting card\n", 932 1.1 degroote device_xname(sc->sc_dev)); 933 1.1 degroote malo_stop(ifp, 1); 934 1.1 degroote return (error); 935 1.1 degroote } 936 1.1 degroote 937 1.1 degroote static int 938 1.1 degroote malo_ioctl(struct ifnet *ifp, u_long cmd, void* data) 939 1.1 degroote { 940 1.1 degroote struct malo_softc *sc = ifp->if_softc; 941 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 942 1.1 degroote int s, error = 0; 943 1.1 degroote 944 1.1 degroote s = splnet(); 945 1.1 degroote 946 1.1 degroote switch (cmd) { 947 1.1 degroote case SIOCSIFFLAGS: 948 1.1 degroote if ((error = ifioctl_common(ifp, cmd, data)) != 0) 949 1.1 degroote break; 950 1.1 degroote if (ifp->if_flags & IFF_UP) { 951 1.1 degroote if ((ifp->if_flags & IFF_RUNNING) == 0) 952 1.1 degroote malo_init(ifp); 953 1.1 degroote } else { 954 1.1 degroote if (ifp->if_flags & IFF_RUNNING) 955 1.1 degroote malo_stop(ifp, 1); 956 1.1 degroote } 957 1.1 degroote break; 958 1.1 degroote case SIOCADDMULTI: 959 1.1 degroote case SIOCDELMULTI: 960 1.1 degroote if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { 961 1.1 degroote /* setup multicast filter, etc */ 962 1.1 degroote error = 0; 963 1.1 degroote } 964 1.1 degroote break; 965 1.1 degroote case SIOCS80211CHANNEL: 966 1.1 degroote /* allow fast channel switching in monitor mode */ 967 1.1 degroote error = ieee80211_ioctl(ic, cmd, data); 968 1.1 degroote if (error == ENETRESET && 969 1.1 degroote ic->ic_opmode == IEEE80211_M_MONITOR) { 970 1.1 degroote if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == 971 1.1 degroote (IFF_UP | IFF_RUNNING)) { 972 1.1 degroote ic->ic_bss->ni_chan = ic->ic_ibss_chan; 973 1.1 degroote malo_cmd_set_channel(sc, ic->ic_bss->ni_chan); 974 1.1 degroote } 975 1.1 degroote error = 0; 976 1.1 degroote } 977 1.1 degroote break; 978 1.1 degroote default: 979 1.1 degroote error = ieee80211_ioctl(ic, cmd, data); 980 1.1 degroote break; 981 1.1 degroote } 982 1.1 degroote 983 1.1 degroote if (error == ENETRESET) { 984 1.1 degroote if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == 985 1.1 degroote (IFF_UP | IFF_RUNNING)) 986 1.1 degroote malo_init(ifp); 987 1.1 degroote error = 0; 988 1.1 degroote } 989 1.1 degroote 990 1.1 degroote splx(s); 991 1.1 degroote 992 1.1 degroote return (error); 993 1.1 degroote } 994 1.1 degroote 995 1.1 degroote static void 996 1.1 degroote malo_start(struct ifnet *ifp) 997 1.1 degroote { 998 1.1 degroote struct malo_softc *sc = ifp->if_softc; 999 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1000 1.1 degroote struct mbuf *m0; 1001 1.1 degroote struct ether_header *eh; 1002 1.1 degroote struct ieee80211_node *ni = NULL; 1003 1.1 degroote 1004 1.1 degroote DPRINTF(2, "%s: %s\n", device_xname(sc->sc_dev), __func__); 1005 1.1 degroote 1006 1.1 degroote if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING) 1007 1.1 degroote return; 1008 1.1 degroote 1009 1.1 degroote for (;;) { 1010 1.1 degroote IF_POLL(&ic->ic_mgtq, m0); 1011 1.1 degroote if (m0 != NULL) { 1012 1.1 degroote if (sc->sc_txring.queued >= MALO_TX_RING_COUNT) { 1013 1.1 degroote ifp->if_flags |= IFF_OACTIVE; 1014 1.1 degroote break; 1015 1.1 degroote } 1016 1.1 degroote IF_DEQUEUE(&ic->ic_mgtq, m0); 1017 1.1 degroote 1018 1.6 ozaki ni = M_GETCTX(m0, struct ieee80211_node *); 1019 1.7 ozaki M_CLEARCTX(m0); 1020 1.1 degroote 1021 1.12 msaitoh bpf_mtap3(ic->ic_rawbpf, m0, BPF_D_OUT); 1022 1.1 degroote 1023 1.1 degroote if (malo_tx_data(sc, m0, ni) != 0) 1024 1.1 degroote break; 1025 1.1 degroote } else { 1026 1.1 degroote if (ic->ic_state != IEEE80211_S_RUN) 1027 1.1 degroote break; 1028 1.1 degroote IFQ_POLL(&ifp->if_snd, m0); 1029 1.1 degroote if (m0 == NULL) 1030 1.1 degroote break; 1031 1.1 degroote if (sc->sc_txring.queued >= MALO_TX_RING_COUNT - 1) { 1032 1.1 degroote ifp->if_flags |= IFF_OACTIVE; 1033 1.1 degroote break; 1034 1.1 degroote } 1035 1.1 degroote 1036 1.1 degroote if (m0->m_len < sizeof (*eh) && 1037 1.1 degroote (m0 = m_pullup(m0, sizeof (*eh))) == NULL) { 1038 1.18 thorpej if_statinc(ifp, if_oerrors); 1039 1.1 degroote continue; 1040 1.1 degroote } 1041 1.1 degroote eh = mtod(m0, struct ether_header *); 1042 1.1 degroote ni = ieee80211_find_txnode(ic, eh->ether_dhost); 1043 1.1 degroote if (ni == NULL) { 1044 1.1 degroote m_freem(m0); 1045 1.18 thorpej if_statinc(ifp, if_oerrors); 1046 1.1 degroote continue; 1047 1.1 degroote } 1048 1.1 degroote 1049 1.1 degroote // XXX must I call ieee_classify at this point ? 1050 1.1 degroote 1051 1.1 degroote IFQ_DEQUEUE(&ifp->if_snd, m0); 1052 1.12 msaitoh bpf_mtap(ifp, m0, BPF_D_OUT); 1053 1.1 degroote 1054 1.1 degroote m0 = ieee80211_encap(ic, m0, ni); 1055 1.1 degroote if (m0 == NULL) 1056 1.1 degroote continue; 1057 1.12 msaitoh bpf_mtap3(ic->ic_rawbpf, m0, BPF_D_OUT); 1058 1.1 degroote 1059 1.1 degroote if (malo_tx_data(sc, m0, ni) != 0) { 1060 1.1 degroote ieee80211_free_node(ni); 1061 1.18 thorpej if_statinc(ifp, if_oerrors); 1062 1.1 degroote break; 1063 1.1 degroote } 1064 1.1 degroote } 1065 1.1 degroote } 1066 1.1 degroote } 1067 1.1 degroote 1068 1.3 degroote void 1069 1.1 degroote malo_stop(struct ifnet* ifp, int disable) 1070 1.1 degroote { 1071 1.1 degroote struct malo_softc *sc = ifp->if_softc; 1072 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1073 1.1 degroote 1074 1.1 degroote DPRINTF(1, "%s: %s\n", ifp->if_xname, __func__); 1075 1.1 degroote 1076 1.1 degroote /* reset adapter */ 1077 1.1 degroote if (ifp->if_flags & IFF_RUNNING) 1078 1.1 degroote malo_ctl_write4(sc, MALO_REG_H2A_INTERRUPT_EVENTS, (1 << 15)); 1079 1.1 degroote 1080 1.1 degroote /* device is not running anymore */ 1081 1.1 degroote ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 1082 1.1 degroote 1083 1.1 degroote /* change back to initial state */ 1084 1.1 degroote ieee80211_new_state(ic, IEEE80211_S_INIT, -1); 1085 1.1 degroote 1086 1.1 degroote /* reset RX / TX rings */ 1087 1.1 degroote malo_reset_tx_ring(sc, &sc->sc_txring); 1088 1.1 degroote malo_reset_rx_ring(sc, &sc->sc_rxring); 1089 1.1 degroote 1090 1.1 degroote /* set initial rate */ 1091 1.1 degroote sc->sc_last_txrate = -1; 1092 1.1 degroote 1093 1.1 degroote /* power off cardbus socket */ 1094 1.1 degroote if (sc->sc_disable) 1095 1.1 degroote sc->sc_disable(sc); 1096 1.1 degroote } 1097 1.1 degroote 1098 1.1 degroote static void 1099 1.1 degroote malo_watchdog(struct ifnet *ifp) 1100 1.1 degroote { 1101 1.1 degroote 1102 1.1 degroote } 1103 1.1 degroote 1104 1.1 degroote static int 1105 1.1 degroote malo_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) 1106 1.1 degroote { 1107 1.1 degroote struct ifnet *ifp = ic->ic_ifp; 1108 1.1 degroote struct malo_softc *sc = ifp->if_softc; 1109 1.1 degroote enum ieee80211_state ostate; 1110 1.1 degroote int rate; 1111 1.1 degroote 1112 1.1 degroote DPRINTF(2, "%s: %s\n", device_xname(sc->sc_dev), __func__); 1113 1.1 degroote 1114 1.1 degroote ostate = ic->ic_state; 1115 1.1 degroote callout_stop(&sc->sc_scan_to); 1116 1.1 degroote 1117 1.1 degroote switch (nstate) { 1118 1.1 degroote case IEEE80211_S_INIT: 1119 1.1 degroote DPRINTF(1, "%s: newstate INIT\n", device_xname(sc->sc_dev)); 1120 1.1 degroote break; 1121 1.1 degroote case IEEE80211_S_SCAN: 1122 1.1 degroote DPRINTF(1, "%s: newstate SCAN\n", device_xname(sc->sc_dev)); 1123 1.1 degroote if (ostate == IEEE80211_S_INIT) { 1124 1.1 degroote if (malo_cmd_set_prescan(sc) != 0) { 1125 1.1 degroote DPRINTF(1, "%s: can't set prescan\n", 1126 1.1 degroote device_xname(sc->sc_dev)); 1127 1.1 degroote } 1128 1.1 degroote } else { 1129 1.1 degroote malo_cmd_set_channel(sc, ic->ic_curchan); 1130 1.1 degroote } 1131 1.1 degroote callout_schedule(&sc->sc_scan_to, hz/2); 1132 1.1 degroote break; 1133 1.1 degroote case IEEE80211_S_AUTH: 1134 1.1 degroote DPRINTF(1, "%s: newstate AUTH\n", device_xname(sc->sc_dev)); 1135 1.1 degroote malo_cmd_set_postscan(sc, ic->ic_myaddr, 1); 1136 1.1 degroote malo_cmd_set_channel(sc, ic->ic_curchan); 1137 1.1 degroote break; 1138 1.1 degroote case IEEE80211_S_ASSOC: 1139 1.1 degroote DPRINTF(1, "%s: newstate ASSOC\n", device_xname(sc->sc_dev)); 1140 1.1 degroote malo_cmd_set_channel(sc, ic->ic_curchan); 1141 1.1 degroote if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) 1142 1.1 degroote malo_cmd_set_radio(sc, 1, 3); /* short preamble */ 1143 1.1 degroote else 1144 1.1 degroote malo_cmd_set_radio(sc, 1, 1); /* long preamble */ 1145 1.1 degroote 1146 1.1 degroote malo_cmd_set_aid(sc, ic->ic_bss->ni_bssid, 1147 1.1 degroote ic->ic_bss->ni_associd); 1148 1.1 degroote 1149 1.1 degroote if (ic->ic_fixed_rate == -1) 1150 1.1 degroote /* automatic rate adaption */ 1151 1.1 degroote malo_cmd_set_rate(sc, 0); 1152 1.1 degroote else { 1153 1.1 degroote /* fixed rate */ 1154 1.1 degroote rate = malo_fix2rate(ic->ic_fixed_rate); 1155 1.1 degroote malo_cmd_set_rate(sc, rate); 1156 1.1 degroote } 1157 1.1 degroote 1158 1.1 degroote malo_set_slot(sc); 1159 1.1 degroote break; 1160 1.1 degroote case IEEE80211_S_RUN: 1161 1.1 degroote DPRINTF(1, "%s: newstate RUN\n", device_xname(sc->sc_dev)); 1162 1.1 degroote break; 1163 1.1 degroote default: 1164 1.1 degroote break; 1165 1.1 degroote } 1166 1.1 degroote 1167 1.1 degroote return (sc->sc_newstate(ic, nstate, arg)); 1168 1.1 degroote } 1169 1.1 degroote 1170 1.1 degroote static void 1171 1.1 degroote malo_newassoc(struct ieee80211_node *ni, int isnew) 1172 1.1 degroote { 1173 1.1 degroote } 1174 1.1 degroote 1175 1.1 degroote static struct ieee80211_node * 1176 1.1 degroote malo_node_alloc(struct ieee80211_node_table *nt) 1177 1.1 degroote { 1178 1.1 degroote struct malo_node *wn; 1179 1.1 degroote 1180 1.1 degroote wn = malloc(sizeof(*wn), M_DEVBUF, M_NOWAIT | M_ZERO); 1181 1.1 degroote if (wn == NULL) 1182 1.1 degroote return (NULL); 1183 1.1 degroote 1184 1.1 degroote return ((struct ieee80211_node *)wn); 1185 1.1 degroote } 1186 1.1 degroote 1187 1.1 degroote static int 1188 1.1 degroote malo_media_change(struct ifnet *ifp) 1189 1.1 degroote { 1190 1.1 degroote int error; 1191 1.1 degroote 1192 1.1 degroote DPRINTF(1, "%s: %s\n", ifp->if_xname, __func__); 1193 1.1 degroote 1194 1.1 degroote error = ieee80211_media_change(ifp); 1195 1.1 degroote if (error != ENETRESET) 1196 1.1 degroote return (error); 1197 1.1 degroote 1198 1.1 degroote if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING)) 1199 1.1 degroote malo_init(ifp); 1200 1.1 degroote 1201 1.1 degroote return (0); 1202 1.1 degroote } 1203 1.1 degroote 1204 1.1 degroote static void 1205 1.1 degroote malo_media_status(struct ifnet *ifp, struct ifmediareq *imr) 1206 1.1 degroote { 1207 1.1 degroote struct malo_softc *sc = ifp->if_softc; 1208 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1209 1.1 degroote 1210 1.1 degroote imr->ifm_status = IFM_AVALID; 1211 1.1 degroote imr->ifm_active = IFM_IEEE80211; 1212 1.1 degroote if (ic->ic_state == IEEE80211_S_RUN) 1213 1.1 degroote imr->ifm_status |= IFM_ACTIVE; 1214 1.1 degroote 1215 1.1 degroote /* report last TX rate used by chip */ 1216 1.1 degroote imr->ifm_active |= ieee80211_rate2media(ic, sc->sc_last_txrate, 1217 1.1 degroote ic->ic_curmode); 1218 1.1 degroote 1219 1.1 degroote switch (ic->ic_opmode) { 1220 1.1 degroote case IEEE80211_M_STA: 1221 1.1 degroote break; 1222 1.1 degroote case IEEE80211_M_IBSS: 1223 1.1 degroote imr->ifm_active |= IFM_IEEE80211_ADHOC; 1224 1.1 degroote break; 1225 1.1 degroote case IEEE80211_M_AHDEMO: 1226 1.1 degroote break; 1227 1.1 degroote case IEEE80211_M_HOSTAP: 1228 1.1 degroote break; 1229 1.1 degroote case IEEE80211_M_MONITOR: 1230 1.1 degroote imr->ifm_active |= IFM_IEEE80211_MONITOR; 1231 1.1 degroote break; 1232 1.1 degroote default: 1233 1.1 degroote break; 1234 1.1 degroote } 1235 1.1 degroote 1236 1.1 degroote switch (ic->ic_curmode) { 1237 1.1 degroote case IEEE80211_MODE_11B: 1238 1.1 degroote imr->ifm_active |= IFM_IEEE80211_11B; 1239 1.1 degroote break; 1240 1.1 degroote case IEEE80211_MODE_11G: 1241 1.1 degroote imr->ifm_active |= IFM_IEEE80211_11G; 1242 1.1 degroote break; 1243 1.1 degroote } 1244 1.1 degroote } 1245 1.1 degroote 1246 1.1 degroote static int 1247 1.1 degroote malo_chip2rate(int chip_rate) 1248 1.1 degroote { 1249 1.1 degroote switch (chip_rate) { 1250 1.1 degroote /* CCK rates */ 1251 1.1 degroote case 0: return (2); 1252 1.1 degroote case 1: return (4); 1253 1.1 degroote case 2: return (11); 1254 1.1 degroote case 3: return (22); 1255 1.1 degroote 1256 1.1 degroote /* OFDM rates */ 1257 1.1 degroote case 4: return (0); /* reserved */ 1258 1.1 degroote case 5: return (12); 1259 1.1 degroote case 6: return (18); 1260 1.1 degroote case 7: return (24); 1261 1.1 degroote case 8: return (36); 1262 1.1 degroote case 9: return (48); 1263 1.1 degroote case 10: return (72); 1264 1.1 degroote case 11: return (96); 1265 1.1 degroote case 12: return (108); 1266 1.1 degroote 1267 1.1 degroote /* no rate select yet or unknown rate */ 1268 1.1 degroote default: return (-1); 1269 1.1 degroote } 1270 1.1 degroote } 1271 1.1 degroote 1272 1.1 degroote static int 1273 1.1 degroote malo_fix2rate(int fix_rate) 1274 1.1 degroote { 1275 1.1 degroote switch (fix_rate) { 1276 1.1 degroote /* CCK rates */ 1277 1.1 degroote case 0: return (2); 1278 1.1 degroote case 1: return (4); 1279 1.1 degroote case 2: return (11); 1280 1.1 degroote case 3: return (22); 1281 1.1 degroote 1282 1.1 degroote /* OFDM rates */ 1283 1.1 degroote case 4: return (12); 1284 1.1 degroote case 5: return (18); 1285 1.1 degroote case 6: return (24); 1286 1.1 degroote case 7: return (36); 1287 1.1 degroote case 8: return (48); 1288 1.1 degroote case 9: return (72); 1289 1.1 degroote case 10: return (96); 1290 1.1 degroote case 11: return (108); 1291 1.1 degroote 1292 1.1 degroote /* unknown rate: should not happen */ 1293 1.1 degroote default: return (0); 1294 1.1 degroote } 1295 1.1 degroote } 1296 1.1 degroote 1297 1.1 degroote static void 1298 1.1 degroote malo_next_scan(void *arg) 1299 1.1 degroote { 1300 1.1 degroote struct malo_softc *sc = arg; 1301 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1302 1.1 degroote int s; 1303 1.1 degroote 1304 1.1 degroote DPRINTF(1, "%s: %s\n", sc->sc_if.if_xname, __func__); 1305 1.1 degroote 1306 1.1 degroote s = splnet(); 1307 1.1 degroote 1308 1.1 degroote if (ic->ic_state == IEEE80211_S_SCAN) 1309 1.1 degroote ieee80211_next_scan(ic); 1310 1.1 degroote 1311 1.1 degroote splx(s); 1312 1.1 degroote } 1313 1.1 degroote 1314 1.1 degroote static void 1315 1.1 degroote malo_tx_intr(struct malo_softc *sc) 1316 1.1 degroote { 1317 1.1 degroote struct ifnet *ifp = &sc->sc_if; 1318 1.1 degroote struct malo_tx_desc *desc; 1319 1.1 degroote struct malo_tx_data *data; 1320 1.1 degroote struct malo_node *rn; 1321 1.9 nonaka int stat, s; 1322 1.1 degroote 1323 1.1 degroote DPRINTF(2, "%s: %s\n", device_xname(sc->sc_dev), __func__); 1324 1.1 degroote 1325 1.9 nonaka s = splnet(); 1326 1.9 nonaka 1327 1.1 degroote stat = sc->sc_txring.stat; 1328 1.1 degroote for (;;) { 1329 1.1 degroote desc = &sc->sc_txring.desc[sc->sc_txring.stat]; 1330 1.1 degroote data = &sc->sc_txring.data[sc->sc_txring.stat]; 1331 1.1 degroote rn = (struct malo_node *)data->ni; 1332 1.1 degroote 1333 1.1 degroote /* check if TX descriptor is not owned by FW anymore */ 1334 1.1 degroote if ((le32toh(desc->status) & MALO_TXD_STATUS_FW_OWNED) || 1335 1.1 degroote !(le32toh(data->softstat) & MALO_TXD_STATUS_FAILED_AGING)) 1336 1.1 degroote break; 1337 1.1 degroote 1338 1.1 degroote /* if no frame has been sent, ignore */ 1339 1.1 degroote if (rn == NULL) 1340 1.1 degroote goto next; 1341 1.1 degroote 1342 1.1 degroote /* check TX state */ 1343 1.1 degroote switch (le32toh(desc->status) & MALO_TXD_STATUS_USED) { 1344 1.1 degroote case MALO_TXD_STATUS_OK: 1345 1.1 degroote DPRINTF(2, "%s: data frame was sent successfully\n", 1346 1.1 degroote device_xname(sc->sc_dev)); 1347 1.18 thorpej if_statinc(ifp, if_opackets); 1348 1.1 degroote break; 1349 1.1 degroote default: 1350 1.1 degroote DPRINTF(1, "%s: data frame sending error\n", 1351 1.1 degroote device_xname(sc->sc_dev)); 1352 1.18 thorpej if_statinc(ifp, if_oerrors); 1353 1.1 degroote break; 1354 1.1 degroote } 1355 1.1 degroote 1356 1.1 degroote /* save last used TX rate */ 1357 1.1 degroote sc->sc_last_txrate = malo_chip2rate(desc->datarate); 1358 1.1 degroote 1359 1.1 degroote /* cleanup TX data and TX descriptor */ 1360 1.1 degroote bus_dmamap_sync(sc->sc_dmat, data->map, 0, 1361 1.1 degroote data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE); 1362 1.1 degroote bus_dmamap_unload(sc->sc_dmat, data->map); 1363 1.1 degroote m_freem(data->m); 1364 1.1 degroote ieee80211_free_node(data->ni); 1365 1.1 degroote data->m = NULL; 1366 1.1 degroote data->ni = NULL; 1367 1.1 degroote data->softstat &= htole32(~0x80); 1368 1.1 degroote desc->status = 0; 1369 1.1 degroote desc->len = 0; 1370 1.1 degroote 1371 1.1 degroote DPRINTF(2, "%s: tx done idx=%u\n", 1372 1.1 degroote device_xname(sc->sc_dev), sc->sc_txring.stat); 1373 1.1 degroote 1374 1.1 degroote sc->sc_txring.queued--; 1375 1.1 degroote next: 1376 1.1 degroote if (++sc->sc_txring.stat >= sc->sc_txring.count) 1377 1.1 degroote sc->sc_txring.stat = 0; 1378 1.1 degroote if (sc->sc_txring.stat == stat) 1379 1.1 degroote break; 1380 1.1 degroote } 1381 1.1 degroote 1382 1.1 degroote sc->sc_tx_timer = 0; 1383 1.1 degroote ifp->if_flags &= ~IFF_OACTIVE; 1384 1.1 degroote malo_start(ifp); 1385 1.9 nonaka 1386 1.9 nonaka splx(s); 1387 1.1 degroote } 1388 1.1 degroote 1389 1.1 degroote static int 1390 1.1 degroote malo_tx_data(struct malo_softc *sc, struct mbuf *m0, 1391 1.1 degroote struct ieee80211_node *ni) 1392 1.1 degroote { 1393 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1394 1.1 degroote struct ifnet *ifp = &sc->sc_if; 1395 1.1 degroote struct malo_tx_desc *desc; 1396 1.1 degroote struct malo_tx_data *data; 1397 1.1 degroote struct ieee80211_frame *wh; 1398 1.1 degroote struct ieee80211_key *k; 1399 1.1 degroote struct mbuf *mnew; 1400 1.1 degroote int error; 1401 1.1 degroote 1402 1.1 degroote DPRINTF(2, "%s: %s\n", device_xname(sc->sc_dev), __func__); 1403 1.1 degroote 1404 1.1 degroote desc = &sc->sc_txring.desc[sc->sc_txring.cur]; 1405 1.1 degroote data = &sc->sc_txring.data[sc->sc_txring.cur]; 1406 1.1 degroote 1407 1.1 degroote if (m0->m_len < sizeof(struct ieee80211_frame)) { 1408 1.1 degroote m0 = m_pullup(m0, sizeof(struct ieee80211_frame)); 1409 1.1 degroote if (m0 == NULL) { 1410 1.18 thorpej if_statinc(ifp, if_ierrors); 1411 1.1 degroote return (ENOBUFS); 1412 1.1 degroote } 1413 1.1 degroote } 1414 1.1 degroote wh = mtod(m0, struct ieee80211_frame *); 1415 1.1 degroote 1416 1.1 degroote if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 1417 1.1 degroote k = ieee80211_crypto_encap(ic, ni, m0); 1418 1.1 degroote if (k == NULL) { 1419 1.1 degroote m_freem(m0); 1420 1.1 degroote return ENOBUFS; 1421 1.1 degroote } 1422 1.1 degroote 1423 1.1 degroote /* packet header may have moved, reset our local pointer */ 1424 1.1 degroote wh = mtod(m0, struct ieee80211_frame *); 1425 1.1 degroote } 1426 1.1 degroote 1427 1.1 degroote if (sc->sc_drvbpf != NULL) { 1428 1.1 degroote struct malo_tx_radiotap_hdr *tap = &sc->sc_txtap; 1429 1.1 degroote 1430 1.1 degroote tap->wt_flags = 0; 1431 1.1 degroote tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq); 1432 1.1 degroote tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags); 1433 1.1 degroote tap->wt_rate = sc->sc_last_txrate; 1434 1.1 degroote if (wh->i_fc[1] & IEEE80211_FC1_WEP) 1435 1.1 degroote tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; 1436 1.1 degroote 1437 1.12 msaitoh bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0, BPF_D_OUT); 1438 1.1 degroote } 1439 1.1 degroote 1440 1.1 degroote /* 1441 1.1 degroote * inject FW specific fields into the 802.11 frame 1442 1.1 degroote * 1443 1.1 degroote * 2 bytes FW len (inject) 1444 1.1 degroote * 24 bytes 802.11 frame header 1445 1.1 degroote * 6 bytes addr4 (inject) 1446 1.1 degroote * n bytes 802.11 frame body 1447 1.1 degroote * 1448 1.1 degroote * For now copy all into a new mcluster. 1449 1.1 degroote */ 1450 1.1 degroote MGETHDR(mnew, M_DONTWAIT, MT_DATA); 1451 1.1 degroote if (mnew == NULL) 1452 1.1 degroote return (ENOBUFS); 1453 1.1 degroote MCLGET(mnew, M_DONTWAIT); 1454 1.1 degroote if (!(mnew->m_flags & M_EXT)) { 1455 1.1 degroote m_free(mnew); 1456 1.1 degroote return (ENOBUFS); 1457 1.1 degroote } 1458 1.1 degroote 1459 1.1 degroote *mtod(mnew, uint16_t *) = htole16(m0->m_pkthdr.len - 24); /* FW len */ 1460 1.1 degroote memmove(mtod(mnew, char*) + 2, wh, sizeof(*wh)); 1461 1.1 degroote memset(mtod(mnew, char*) + 26, 0, 6); 1462 1.1 degroote m_copydata(m0, sizeof(*wh), m0->m_pkthdr.len - sizeof(*wh), 1463 1.1 degroote mtod(mnew, char*) + 32); 1464 1.1 degroote mnew->m_pkthdr.len = mnew->m_len = m0->m_pkthdr.len + 8; 1465 1.1 degroote m_freem(m0); 1466 1.1 degroote m0 = mnew; 1467 1.1 degroote 1468 1.1 degroote error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0, 1469 1.1 degroote BUS_DMA_NOWAIT); 1470 1.1 degroote if (error != 0) { 1471 1.1 degroote aprint_error_dev(sc->sc_dev, "can't map mbuf (error %d)\n", error); 1472 1.1 degroote m_freem(m0); 1473 1.1 degroote return (error); 1474 1.1 degroote } 1475 1.1 degroote 1476 1.1 degroote data->m = m0; 1477 1.1 degroote data->ni = ni; 1478 1.1 degroote data->softstat |= htole32(0x80); 1479 1.1 degroote 1480 1.1 degroote malo_tx_setup_desc(sc, desc, m0->m_pkthdr.len, 1, 1481 1.1 degroote data->map->dm_segs, data->map->dm_nsegs); 1482 1.1 degroote 1483 1.1 degroote bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize, 1484 1.1 degroote BUS_DMASYNC_PREWRITE); 1485 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_txring.map, 1486 1.1 degroote sc->sc_txring.cur * sizeof(struct malo_tx_desc), 1487 1.1 degroote sizeof(struct malo_tx_desc), BUS_DMASYNC_PREWRITE); 1488 1.1 degroote 1489 1.1 degroote DPRINTF(2, "%s: sending frame, pktlen=%u, idx=%u\n", 1490 1.1 degroote device_xname(sc->sc_dev), m0->m_pkthdr.len, sc->sc_txring.cur); 1491 1.1 degroote 1492 1.1 degroote sc->sc_txring.queued++; 1493 1.1 degroote sc->sc_txring.cur = (sc->sc_txring.cur + 1) % MALO_TX_RING_COUNT; 1494 1.1 degroote 1495 1.1 degroote /* kick data TX */ 1496 1.1 degroote malo_ctl_write4(sc, MALO_REG_H2A_INTERRUPT_EVENTS, 1); 1497 1.1 degroote malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE); 1498 1.1 degroote 1499 1.1 degroote return (0); 1500 1.1 degroote } 1501 1.1 degroote 1502 1.1 degroote static void 1503 1.1 degroote malo_tx_setup_desc(struct malo_softc *sc, struct malo_tx_desc *desc, 1504 1.1 degroote int len, int rate, const bus_dma_segment_t *segs, int nsegs) 1505 1.1 degroote { 1506 1.1 degroote desc->len = htole16(segs[0].ds_len); 1507 1.1 degroote desc->datarate = rate; /* 0 = mgmt frame, 1 = data frame */ 1508 1.1 degroote desc->physdata = htole32(segs[0].ds_addr); 1509 1.1 degroote desc->status = htole32(MALO_TXD_STATUS_OK | MALO_TXD_STATUS_FW_OWNED); 1510 1.1 degroote } 1511 1.1 degroote 1512 1.1 degroote static void 1513 1.1 degroote malo_rx_intr(struct malo_softc *sc) 1514 1.1 degroote { 1515 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1516 1.1 degroote struct ifnet *ifp = &sc->sc_if; 1517 1.1 degroote struct malo_rx_desc *desc; 1518 1.1 degroote struct malo_rx_data *data; 1519 1.1 degroote struct ieee80211_frame *wh; 1520 1.1 degroote struct ieee80211_node *ni; 1521 1.1 degroote struct mbuf *mnew, *m; 1522 1.1 degroote uint32_t rxRdPtr, rxWrPtr; 1523 1.9 nonaka int error, i, s; 1524 1.1 degroote 1525 1.1 degroote rxRdPtr = malo_mem_read4(sc, sc->sc_RxPdRdPtr); 1526 1.1 degroote rxWrPtr = malo_mem_read4(sc, sc->sc_RxPdWrPtr); 1527 1.1 degroote 1528 1.1 degroote for (i = 0; i < MALO_RX_RING_COUNT && rxRdPtr != rxWrPtr; i++) { 1529 1.1 degroote desc = &sc->sc_rxring.desc[sc->sc_rxring.cur]; 1530 1.1 degroote data = &sc->sc_rxring.data[sc->sc_rxring.cur]; 1531 1.1 degroote 1532 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_rxring.map, 1533 1.1 degroote sc->sc_rxring.cur * sizeof(struct malo_rx_desc), 1534 1.1 degroote sizeof(struct malo_rx_desc), BUS_DMASYNC_POSTREAD); 1535 1.1 degroote 1536 1.1 degroote DPRINTF(3, "%s: rx intr idx=%d, rxctrl=0x%02x, rssi=%d, " 1537 1.1 degroote "status=0x%02x, channel=%d, len=%d, res1=%02x, rate=%d, " 1538 1.1 degroote "physdata=0x%04x, physnext=0x%04x, qosctrl=%02x, res2=%d\n", 1539 1.1 degroote device_xname(sc->sc_dev), 1540 1.1 degroote sc->sc_rxring.cur, desc->rxctrl, desc->rssi, desc->status, 1541 1.1 degroote desc->channel, le16toh(desc->len), desc->reserved1, 1542 1.1 degroote desc->datarate, le32toh(desc->physdata), 1543 1.1 degroote le32toh(desc->physnext), desc->qosctrl, desc->reserved2); 1544 1.1 degroote 1545 1.1 degroote if ((desc->rxctrl & 0x80) == 0) 1546 1.1 degroote break; 1547 1.1 degroote 1548 1.1 degroote MGETHDR(mnew, M_DONTWAIT, MT_DATA); 1549 1.1 degroote if (mnew == NULL) { 1550 1.18 thorpej if_statinc(ifp, if_ierrors); 1551 1.1 degroote goto skip; 1552 1.1 degroote } 1553 1.1 degroote 1554 1.1 degroote MCLGET(mnew, M_DONTWAIT); 1555 1.1 degroote if (!(mnew->m_flags & M_EXT)) { 1556 1.1 degroote m_freem(mnew); 1557 1.18 thorpej if_statinc(ifp, if_ierrors); 1558 1.1 degroote goto skip; 1559 1.1 degroote } 1560 1.1 degroote 1561 1.1 degroote bus_dmamap_sync(sc->sc_dmat, data->map, 0, 1562 1.1 degroote data->map->dm_mapsize, BUS_DMASYNC_POSTREAD); 1563 1.1 degroote bus_dmamap_unload(sc->sc_dmat, data->map); 1564 1.1 degroote 1565 1.1 degroote error = bus_dmamap_load(sc->sc_dmat, data->map, 1566 1.1 degroote mtod(mnew, void *), MCLBYTES, NULL, BUS_DMA_NOWAIT); 1567 1.1 degroote if (error != 0) { 1568 1.1 degroote m_freem(mnew); 1569 1.1 degroote 1570 1.1 degroote error = bus_dmamap_load(sc->sc_dmat, data->map, 1571 1.1 degroote mtod(data->m, void *), MCLBYTES, NULL, 1572 1.1 degroote BUS_DMA_NOWAIT); 1573 1.1 degroote if (error != 0) { 1574 1.1 degroote panic("%s: could not load old rx mbuf", 1575 1.1 degroote device_xname(sc->sc_dev)); 1576 1.1 degroote } 1577 1.18 thorpej if_statinc(ifp, if_ierrors); 1578 1.1 degroote goto skip; 1579 1.1 degroote } 1580 1.1 degroote 1581 1.1 degroote /* 1582 1.1 degroote * New mbuf mbuf successfully loaded 1583 1.1 degroote */ 1584 1.1 degroote m = data->m; 1585 1.1 degroote data->m = mnew; 1586 1.1 degroote desc->physdata = htole32(data->map->dm_segs->ds_addr); 1587 1.1 degroote 1588 1.1 degroote /* finalize mbuf */ 1589 1.8 ozaki m_set_rcvif(m, ifp); 1590 1.1 degroote m->m_pkthdr.len = m->m_len = le16toh(desc->len); 1591 1.1 degroote 1592 1.1 degroote /* 1593 1.1 degroote * cut out FW specific fields from the 802.11 frame 1594 1.1 degroote * 1595 1.1 degroote * 2 bytes FW len (cut out) 1596 1.1 degroote * 24 bytes 802.11 frame header 1597 1.1 degroote * 6 bytes addr4 (cut out) 1598 1.1 degroote * n bytes 802.11 frame data 1599 1.1 degroote */ 1600 1.1 degroote memmove(m->m_data +6, m->m_data, 26); 1601 1.1 degroote m_adj(m, 8); 1602 1.1 degroote 1603 1.9 nonaka s = splnet(); 1604 1.9 nonaka 1605 1.1 degroote if (sc->sc_drvbpf != NULL) { 1606 1.1 degroote struct malo_rx_radiotap_hdr *tap = &sc->sc_rxtap; 1607 1.1 degroote 1608 1.1 degroote tap->wr_flags = 0; 1609 1.1 degroote tap->wr_chan_freq = 1610 1.1 degroote htole16(ic->ic_bss->ni_chan->ic_freq); 1611 1.1 degroote tap->wr_chan_flags = 1612 1.1 degroote htole16(ic->ic_bss->ni_chan->ic_flags); 1613 1.1 degroote 1614 1.12 msaitoh bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m, 1615 1.12 msaitoh BPF_D_IN); 1616 1.1 degroote } 1617 1.1 degroote 1618 1.1 degroote wh = mtod(m, struct ieee80211_frame *); 1619 1.1 degroote ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); 1620 1.1 degroote 1621 1.1 degroote /* send the frame to the 802.11 layer */ 1622 1.1 degroote ieee80211_input(ic, m, ni, desc->rssi, 0); 1623 1.1 degroote 1624 1.1 degroote /* node is no longer needed */ 1625 1.1 degroote ieee80211_free_node(ni); 1626 1.1 degroote 1627 1.9 nonaka splx(s); 1628 1.9 nonaka 1629 1.1 degroote skip: 1630 1.1 degroote desc->rxctrl = 0; 1631 1.1 degroote rxRdPtr = le32toh(desc->physnext); 1632 1.1 degroote 1633 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_rxring.map, 1634 1.1 degroote sc->sc_rxring.cur * sizeof(struct malo_rx_desc), 1635 1.1 degroote sizeof(struct malo_rx_desc), BUS_DMASYNC_PREWRITE); 1636 1.1 degroote 1637 1.1 degroote sc->sc_rxring.cur = (sc->sc_rxring.cur + 1) % 1638 1.1 degroote MALO_RX_RING_COUNT; 1639 1.1 degroote } 1640 1.1 degroote 1641 1.1 degroote malo_mem_write4(sc, sc->sc_RxPdRdPtr, rxRdPtr); 1642 1.1 degroote } 1643 1.1 degroote 1644 1.1 degroote static int 1645 1.1 degroote malo_get_firmware(struct malo_softc *sc, const char *name, 1646 1.1 degroote uint8_t** firmware_image, size_t* size) 1647 1.1 degroote { 1648 1.1 degroote firmware_handle_t fw; 1649 1.1 degroote int error; 1650 1.1 degroote 1651 1.1 degroote 1652 1.1 degroote /* load firmware image from disk */ 1653 1.4 christos if ((error = firmware_open("malo", name, &fw)) != 0) { 1654 1.1 degroote aprint_error_dev(sc->sc_dev, "could not read firmware file\n"); 1655 1.1 degroote return error; 1656 1.1 degroote } 1657 1.1 degroote 1658 1.1 degroote *size = firmware_get_size(fw); 1659 1.1 degroote 1660 1.1 degroote *firmware_image = firmware_malloc(*size); 1661 1.1 degroote if (*firmware_image == NULL) { 1662 1.1 degroote aprint_error_dev(sc->sc_dev, "not enough memory to stock firmware\n"); 1663 1.1 degroote error = ENOMEM; 1664 1.1 degroote goto fail1; 1665 1.1 degroote } 1666 1.1 degroote 1667 1.1 degroote if ((error = firmware_read(fw, 0, *firmware_image, *size)) != 0) { 1668 1.1 degroote aprint_error_dev(sc->sc_dev, "can't get firmware\n"); 1669 1.1 degroote goto fail2; 1670 1.1 degroote } 1671 1.1 degroote 1672 1.1 degroote firmware_close(fw); 1673 1.1 degroote 1674 1.1 degroote return 0; 1675 1.1 degroote fail2: 1676 1.1 degroote firmware_free(*firmware_image, *size); 1677 1.1 degroote fail1: 1678 1.1 degroote firmware_close(fw); 1679 1.1 degroote return error; 1680 1.1 degroote } 1681 1.1 degroote 1682 1.1 degroote static int 1683 1.1 degroote malo_load_bootimg(struct malo_softc *sc) 1684 1.1 degroote { 1685 1.1 degroote const char *name = "malo8335-h"; 1686 1.1 degroote uint8_t *ucode; 1687 1.1 degroote size_t size; 1688 1.1 degroote int error, i; 1689 1.1 degroote 1690 1.1 degroote /* load boot firmware */ 1691 1.1 degroote if ((error = malo_get_firmware(sc, name, &ucode, &size)) != 0) { 1692 1.1 degroote aprint_error_dev(sc->sc_dev, "error %d, could not read firmware %s\n", 1693 1.1 degroote error, name); 1694 1.1 degroote return (EIO); 1695 1.1 degroote } 1696 1.1 degroote 1697 1.1 degroote /* 1698 1.1 degroote * It seems we are putting this code directly onto the stack of 1699 1.1 degroote * the ARM cpu. I don't know why we need to instruct the DMA 1700 1.1 degroote * engine to move the code. This is a big riddle without docu. 1701 1.1 degroote */ 1702 1.1 degroote DPRINTF(1, "%s: loading boot firmware\n", device_xname(sc->sc_dev)); 1703 1.1 degroote malo_mem_write2(sc, 0xbef8, 0x001); 1704 1.1 degroote malo_mem_write2(sc, 0xbefa, size); 1705 1.1 degroote malo_mem_write4(sc, 0xbefc, 0); 1706 1.1 degroote 1707 1.1 degroote bus_space_write_region_1(sc->sc_mem1_bt, sc->sc_mem1_bh, 0xbf00, 1708 1.1 degroote ucode, size); 1709 1.1 degroote 1710 1.14 jakllsch firmware_free(ucode, size); 1711 1.14 jakllsch 1712 1.1 degroote /* 1713 1.1 degroote * we loaded the firmware into card memory now tell the CPU 1714 1.1 degroote * to fetch the code and execute it. The memory mapped via the 1715 1.21 andvar * first bar is internally mapped to 0xc0000000. 1716 1.1 degroote */ 1717 1.1 degroote malo_send_cmd(sc, 0xc000bef8); 1718 1.1 degroote 1719 1.1 degroote /* wait for the device to go into FW loading mode */ 1720 1.1 degroote for (i = 0; i < 10; i++) { 1721 1.1 degroote delay(50); 1722 1.1 degroote malo_ctl_barrier(sc, BUS_SPACE_BARRIER_READ); 1723 1.1 degroote if (malo_ctl_read4(sc, 0x0c14) == 0x5) 1724 1.1 degroote break; 1725 1.1 degroote } 1726 1.1 degroote if (i == 10) { 1727 1.1 degroote aprint_error_dev(sc->sc_dev, "timeout at boot firmware load!\n"); 1728 1.1 degroote return (ETIMEDOUT); 1729 1.1 degroote } 1730 1.1 degroote 1731 1.1 degroote /* tell the card we're done and... */ 1732 1.1 degroote malo_mem_write2(sc, 0xbef8, 0x001); 1733 1.1 degroote malo_mem_write2(sc, 0xbefa, 0); 1734 1.1 degroote malo_mem_write4(sc, 0xbefc, 0); 1735 1.1 degroote malo_send_cmd(sc, 0xc000bef8); 1736 1.1 degroote 1737 1.1 degroote DPRINTF(1, "%s: boot firmware loaded\n", device_xname(sc->sc_dev)); 1738 1.1 degroote 1739 1.1 degroote return (0); 1740 1.1 degroote } 1741 1.1 degroote 1742 1.1 degroote 1743 1.1 degroote static int 1744 1.1 degroote malo_load_firmware(struct malo_softc *sc) 1745 1.1 degroote { 1746 1.1 degroote struct malo_cmdheader *hdr; 1747 1.1 degroote const char *name = "malo8335-m"; 1748 1.1 degroote void *data; 1749 1.1 degroote uint8_t *ucode; 1750 1.1 degroote size_t size, count, bsize; 1751 1.1 degroote int i, sn, error; 1752 1.1 degroote 1753 1.1 degroote /* load real firmware now */ 1754 1.1 degroote if ((error = malo_get_firmware(sc, name, &ucode, &size)) != 0) { 1755 1.1 degroote aprint_error_dev(sc->sc_dev, "error %d, could not read firmware %s\n", 1756 1.1 degroote error, name); 1757 1.1 degroote return (EIO); 1758 1.1 degroote } 1759 1.1 degroote 1760 1.1 degroote DPRINTF(1, "%s: uploading firmware\n", device_xname(sc->sc_dev)); 1761 1.1 degroote 1762 1.1 degroote hdr = sc->sc_cmd_mem; 1763 1.1 degroote data = hdr + 1; 1764 1.1 degroote sn = 1; 1765 1.1 degroote for (count = 0; count < size; count += bsize) { 1766 1.1 degroote bsize = MIN(256, size - count); 1767 1.1 degroote 1768 1.1 degroote hdr->cmd = htole16(0x0001); 1769 1.1 degroote hdr->size = htole16(bsize); 1770 1.1 degroote hdr->seqnum = htole16(sn++); 1771 1.1 degroote hdr->result = 0; 1772 1.1 degroote 1773 1.1 degroote memcpy(data, ucode + count, bsize); 1774 1.1 degroote 1775 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 1776 1.1 degroote BUS_DMASYNC_PREWRITE); 1777 1.1 degroote malo_send_cmd(sc, sc->sc_cmd_dmaaddr); 1778 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 1779 1.1 degroote BUS_DMASYNC_POSTWRITE); 1780 1.1 degroote delay(500); 1781 1.1 degroote } 1782 1.1 degroote firmware_free(ucode, size); 1783 1.1 degroote 1784 1.1 degroote DPRINTF(1, "%s: firmware upload finished\n", device_xname(sc->sc_dev)); 1785 1.1 degroote 1786 1.1 degroote /* 1787 1.1 degroote * send a command with size 0 to tell that the firmware has been 1788 1.1 degroote * uploaded 1789 1.1 degroote */ 1790 1.1 degroote hdr->cmd = htole16(0x0001); 1791 1.1 degroote hdr->size = 0; 1792 1.1 degroote hdr->seqnum = htole16(sn++); 1793 1.1 degroote hdr->result = 0; 1794 1.1 degroote 1795 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 1796 1.1 degroote BUS_DMASYNC_PREWRITE); 1797 1.1 degroote malo_send_cmd(sc, sc->sc_cmd_dmaaddr); 1798 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 1799 1.1 degroote BUS_DMASYNC_POSTWRITE); 1800 1.1 degroote delay(100); 1801 1.1 degroote 1802 1.1 degroote DPRINTF(1, "%s: loading firmware\n", device_xname(sc->sc_dev)); 1803 1.1 degroote 1804 1.1 degroote /* wait until firmware has been loaded */ 1805 1.1 degroote for (i = 0; i < 200; i++) { 1806 1.1 degroote malo_ctl_write4(sc, 0x0c10, 0x5a); 1807 1.1 degroote delay(500); 1808 1.1 degroote malo_ctl_barrier(sc, BUS_SPACE_BARRIER_WRITE | 1809 1.1 degroote BUS_SPACE_BARRIER_READ); 1810 1.1 degroote if (malo_ctl_read4(sc, 0x0c14) == 0xf0f1f2f4) 1811 1.1 degroote break; 1812 1.1 degroote } 1813 1.1 degroote if (i == 200) { 1814 1.1 degroote aprint_error_dev(sc->sc_dev, "timeout at firmware load!\n"); 1815 1.1 degroote return (ETIMEDOUT); 1816 1.1 degroote } 1817 1.1 degroote 1818 1.1 degroote DPRINTF(1, "%s: firmware loaded\n", device_xname(sc->sc_dev)); 1819 1.1 degroote 1820 1.1 degroote return (0); 1821 1.1 degroote } 1822 1.1 degroote 1823 1.1 degroote static int 1824 1.1 degroote malo_set_slot(struct malo_softc *sc) 1825 1.1 degroote { 1826 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1827 1.1 degroote 1828 1.1 degroote if (ic->ic_flags & IEEE80211_F_SHSLOT) { 1829 1.1 degroote /* set short slot */ 1830 1.1 degroote if (malo_cmd_set_slot(sc, 1)) { 1831 1.1 degroote aprint_error_dev(sc->sc_dev, "setting short slot failed\n"); 1832 1.1 degroote return (ENXIO); 1833 1.1 degroote } 1834 1.1 degroote } else { 1835 1.1 degroote /* set long slot */ 1836 1.1 degroote if (malo_cmd_set_slot(sc, 0)) { 1837 1.1 degroote aprint_error_dev(sc->sc_dev, "setting long slot failed\n"); 1838 1.1 degroote return (ENXIO); 1839 1.1 degroote } 1840 1.1 degroote } 1841 1.1 degroote 1842 1.1 degroote return (0); 1843 1.1 degroote } 1844 1.1 degroote 1845 1.1 degroote static void 1846 1.1 degroote malo_update_slot(struct ifnet* ifp) 1847 1.1 degroote { 1848 1.1 degroote struct malo_softc *sc = ifp->if_softc; 1849 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 1850 1.1 degroote 1851 1.1 degroote malo_set_slot(sc); 1852 1.1 degroote 1853 1.1 degroote if (ic->ic_opmode == IEEE80211_M_HOSTAP) { 1854 1.1 degroote /* TODO */ 1855 1.1 degroote } 1856 1.1 degroote } 1857 1.1 degroote 1858 1.1 degroote #ifdef MALO_DEBUG 1859 1.1 degroote static void 1860 1.1 degroote malo_hexdump(void *buf, int len) 1861 1.1 degroote { 1862 1.1 degroote u_char b[16]; 1863 1.1 degroote int i, j, l; 1864 1.1 degroote 1865 1.1 degroote for (i = 0; i < len; i += l) { 1866 1.1 degroote printf("%4i:", i); 1867 1.13 riastrad l = uimin(sizeof(b), len - i); 1868 1.1 degroote memcpy(b, (char*)buf + i, l); 1869 1.1 degroote 1870 1.1 degroote for (j = 0; j < sizeof(b); j++) { 1871 1.1 degroote if (j % 2 == 0) 1872 1.1 degroote printf(" "); 1873 1.1 degroote if (j % 8 == 0) 1874 1.1 degroote printf(" "); 1875 1.1 degroote if (j < l) 1876 1.1 degroote printf("%02x", (int)b[j]); 1877 1.1 degroote else 1878 1.1 degroote printf(" "); 1879 1.1 degroote } 1880 1.1 degroote printf(" |"); 1881 1.1 degroote for (j = 0; j < l; j++) { 1882 1.1 degroote if (b[j] >= 0x20 && b[j] <= 0x7e) 1883 1.1 degroote printf("%c", b[j]); 1884 1.1 degroote else 1885 1.1 degroote printf("."); 1886 1.1 degroote } 1887 1.1 degroote printf("|\n"); 1888 1.1 degroote } 1889 1.1 degroote } 1890 1.1 degroote #endif 1891 1.1 degroote 1892 1.1 degroote static const char * 1893 1.1 degroote malo_cmd_string(uint16_t cmd) 1894 1.1 degroote { 1895 1.1 degroote int i; 1896 1.1 degroote static char cmd_buf[16]; 1897 1.1 degroote static const struct { 1898 1.1 degroote uint16_t cmd_code; 1899 1.1 degroote const char *cmd_string; 1900 1.1 degroote } cmds[] = { 1901 1.1 degroote { MALO_CMD_GET_HW_SPEC, "GetHwSpecifications" }, 1902 1.1 degroote { MALO_CMD_SET_RADIO, "SetRadio" }, 1903 1.1 degroote { MALO_CMD_SET_AID, "SetAid" }, 1904 1.1 degroote { MALO_CMD_SET_TXPOWER, "SetTxPower" }, 1905 1.1 degroote { MALO_CMD_SET_ANTENNA, "SetAntenna" }, 1906 1.1 degroote { MALO_CMD_SET_PRESCAN, "SetPrescan" }, 1907 1.1 degroote { MALO_CMD_SET_POSTSCAN, "SetPostscan" }, 1908 1.1 degroote { MALO_CMD_SET_RATE, "SetRate" }, 1909 1.1 degroote { MALO_CMD_SET_CHANNEL, "SetChannel" }, 1910 1.1 degroote { MALO_CMD_SET_RTS, "SetRTS" }, 1911 1.1 degroote { MALO_CMD_SET_SLOT, "SetSlot" }, 1912 1.1 degroote }; 1913 1.1 degroote 1914 1.1 degroote for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) 1915 1.1 degroote if ((le16toh(cmd) & 0x7fff) == cmds[i].cmd_code) 1916 1.1 degroote return (cmds[i].cmd_string); 1917 1.1 degroote 1918 1.1 degroote snprintf(cmd_buf, sizeof(cmd_buf), "unknown %#x", cmd); 1919 1.1 degroote return (cmd_buf); 1920 1.1 degroote } 1921 1.1 degroote 1922 1.1 degroote static const char * 1923 1.1 degroote malo_cmd_string_result(uint16_t result) 1924 1.1 degroote { 1925 1.1 degroote int i; 1926 1.1 degroote static const struct { 1927 1.1 degroote uint16_t result_code; 1928 1.1 degroote const char *result_string; 1929 1.1 degroote } results[] = { 1930 1.1 degroote { MALO_CMD_RESULT_OK, "OK" }, 1931 1.1 degroote { MALO_CMD_RESULT_ERROR, "general error" }, 1932 1.1 degroote { MALO_CMD_RESULT_NOSUPPORT, "not supported" }, 1933 1.1 degroote { MALO_CMD_RESULT_PENDING, "pending" }, 1934 1.1 degroote { MALO_CMD_RESULT_BUSY, "ignored" }, 1935 1.1 degroote { MALO_CMD_RESULT_PARTIALDATA, "incomplete" }, 1936 1.1 degroote }; 1937 1.1 degroote 1938 1.1 degroote for (i = 0; i < sizeof(results) / sizeof(results[0]); i++) 1939 1.1 degroote if (le16toh(result) == results[i].result_code) 1940 1.1 degroote return (results[i].result_string); 1941 1.1 degroote 1942 1.1 degroote return ("unknown"); 1943 1.1 degroote } 1944 1.1 degroote 1945 1.1 degroote static int 1946 1.1 degroote malo_cmd_get_spec(struct malo_softc *sc) 1947 1.1 degroote { 1948 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 1949 1.1 degroote struct malo_hw_spec *spec; 1950 1.1 degroote 1951 1.1 degroote hdr->cmd = htole16(MALO_CMD_GET_HW_SPEC); 1952 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*spec)); 1953 1.1 degroote hdr->seqnum = htole16(42); /* the one and only */ 1954 1.1 degroote hdr->result = 0; 1955 1.1 degroote spec = (struct malo_hw_spec *)(hdr + 1); 1956 1.1 degroote 1957 1.1 degroote memset(spec, 0, sizeof(*spec)); 1958 1.1 degroote memset(spec->PermanentAddress, 0xff, ETHER_ADDR_LEN); 1959 1.1 degroote spec->CookiePtr = htole32(sc->sc_cookie_dmaaddr); 1960 1.1 degroote 1961 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 1962 1.1 degroote BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); 1963 1.1 degroote 1964 1.1 degroote if (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr) != 0) 1965 1.1 degroote return (ETIMEDOUT); 1966 1.1 degroote 1967 1.1 degroote /* get the data from the buffer */ 1968 1.1 degroote DPRINTF(1, "%s: get_hw_spec: V%x R%x, #WCB %d, #Mcast %d, Regcode %d, " 1969 1.1 degroote "#Ant %d\n", device_xname(sc->sc_dev), htole16(spec->HwVersion), 1970 1.1 degroote htole32(spec->FWReleaseNumber), htole16(spec->NumOfWCB), 1971 1.1 degroote htole16(spec->NumOfMCastAdr), htole16(spec->RegionCode), 1972 1.1 degroote htole16(spec->NumberOfAntenna)); 1973 1.1 degroote 1974 1.1 degroote /* tell the DMA engine where our rings are */ 1975 1.1 degroote malo_mem_write4(sc, le32toh(spec->RxPdRdPtr) & 0xffff, 1976 1.1 degroote sc->sc_rxring.physaddr); 1977 1.1 degroote malo_mem_write4(sc, le32toh(spec->RxPdWrPtr) & 0xffff, 1978 1.1 degroote sc->sc_rxring.physaddr); 1979 1.1 degroote malo_mem_write4(sc, le32toh(spec->WcbBase0) & 0xffff, 1980 1.1 degroote sc->sc_txring.physaddr); 1981 1.1 degroote 1982 1.1 degroote /* save DMA RX pointers for later use */ 1983 1.1 degroote sc->sc_RxPdRdPtr = le32toh(spec->RxPdRdPtr) & 0xffff; 1984 1.1 degroote sc->sc_RxPdWrPtr = le32toh(spec->RxPdWrPtr) & 0xffff; 1985 1.1 degroote 1986 1.1 degroote return (0); 1987 1.1 degroote } 1988 1.1 degroote 1989 1.1 degroote static int 1990 1.1 degroote malo_cmd_set_prescan(struct malo_softc *sc) 1991 1.1 degroote { 1992 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 1993 1.1 degroote 1994 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_PRESCAN); 1995 1.1 degroote hdr->size = htole16(sizeof(*hdr)); 1996 1.1 degroote hdr->seqnum = 1; 1997 1.1 degroote hdr->result = 0; 1998 1.1 degroote 1999 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2000 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2001 1.1 degroote 2002 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2003 1.1 degroote } 2004 1.1 degroote 2005 1.1 degroote static int 2006 1.1 degroote malo_cmd_set_postscan(struct malo_softc *sc, uint8_t *macaddr, uint8_t ibsson) 2007 1.1 degroote { 2008 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2009 1.1 degroote struct malo_cmd_postscan *body; 2010 1.1 degroote 2011 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_POSTSCAN); 2012 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2013 1.1 degroote hdr->seqnum = 1; 2014 1.1 degroote hdr->result = 0; 2015 1.1 degroote body = (struct malo_cmd_postscan *)(hdr + 1); 2016 1.1 degroote 2017 1.1 degroote memset(body, 0, sizeof(*body)); 2018 1.1 degroote memcpy(&body->bssid, macaddr, ETHER_ADDR_LEN); 2019 1.1 degroote body->isibss = htole32(ibsson); 2020 1.1 degroote 2021 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2022 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2023 1.1 degroote 2024 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2025 1.1 degroote } 2026 1.1 degroote 2027 1.1 degroote static int 2028 1.1 degroote malo_cmd_set_channel(struct malo_softc *sc, struct ieee80211_channel* chan) 2029 1.1 degroote { 2030 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2031 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 2032 1.1 degroote struct malo_cmd_channel *body; 2033 1.1 degroote uint8_t channel; 2034 1.1 degroote 2035 1.1 degroote channel = ieee80211_chan2ieee(ic, chan); 2036 1.1 degroote 2037 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_CHANNEL); 2038 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2039 1.1 degroote hdr->seqnum = 1; 2040 1.1 degroote hdr->result = 0; 2041 1.1 degroote body = (struct malo_cmd_channel *)(hdr + 1); 2042 1.1 degroote 2043 1.1 degroote memset(body, 0, sizeof(*body)); 2044 1.1 degroote body->action = htole16(1); 2045 1.1 degroote body->channel = channel; 2046 1.1 degroote 2047 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2048 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2049 1.1 degroote 2050 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2051 1.1 degroote } 2052 1.1 degroote 2053 1.1 degroote static int 2054 1.1 degroote malo_cmd_set_antenna(struct malo_softc *sc, uint16_t antenna) 2055 1.1 degroote { 2056 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2057 1.1 degroote struct malo_cmd_antenna *body; 2058 1.1 degroote 2059 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_ANTENNA); 2060 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2061 1.1 degroote hdr->seqnum = 1; 2062 1.1 degroote hdr->result = 0; 2063 1.1 degroote body = (struct malo_cmd_antenna *)(hdr + 1); 2064 1.1 degroote 2065 1.1 degroote memset(body, 0, sizeof(*body)); 2066 1.1 degroote body->action = htole16(antenna); 2067 1.1 degroote if (antenna == 1) 2068 1.1 degroote body->mode = htole16(0xffff); 2069 1.1 degroote else 2070 1.1 degroote body->mode = htole16(2); 2071 1.1 degroote 2072 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2073 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2074 1.1 degroote 2075 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2076 1.1 degroote } 2077 1.1 degroote 2078 1.1 degroote static int 2079 1.1 degroote malo_cmd_set_radio(struct malo_softc *sc, uint16_t enable, 2080 1.1 degroote uint16_t preamble_mode) 2081 1.1 degroote { 2082 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2083 1.1 degroote struct malo_cmd_radio *body; 2084 1.1 degroote 2085 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_RADIO); 2086 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2087 1.1 degroote hdr->seqnum = 1; 2088 1.1 degroote hdr->result = 0; 2089 1.1 degroote body = (struct malo_cmd_radio *)(hdr + 1); 2090 1.1 degroote 2091 1.1 degroote memset(body, 0, sizeof(*body)); 2092 1.1 degroote body->action = htole16(1); 2093 1.1 degroote body->preamble_mode = htole16(preamble_mode); 2094 1.1 degroote body->enable = htole16(enable); 2095 1.1 degroote 2096 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2097 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2098 1.1 degroote 2099 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2100 1.1 degroote } 2101 1.1 degroote 2102 1.1 degroote static int 2103 1.1 degroote malo_cmd_set_aid(struct malo_softc *sc, uint8_t *bssid, uint16_t associd) 2104 1.1 degroote { 2105 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2106 1.1 degroote struct malo_cmd_aid *body; 2107 1.1 degroote 2108 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_AID); 2109 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2110 1.1 degroote hdr->seqnum = 1; 2111 1.1 degroote hdr->result = 0; 2112 1.1 degroote body = (struct malo_cmd_aid *)(hdr + 1); 2113 1.1 degroote 2114 1.1 degroote memset(body, 0, sizeof(*body)); 2115 1.1 degroote body->associd = htole16(associd); 2116 1.1 degroote memcpy(&body->macaddr[0], bssid, IEEE80211_ADDR_LEN); 2117 1.1 degroote 2118 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2119 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2120 1.1 degroote 2121 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2122 1.1 degroote } 2123 1.1 degroote 2124 1.1 degroote static int 2125 1.1 degroote malo_cmd_set_txpower(struct malo_softc *sc, unsigned int powerlevel) 2126 1.1 degroote { 2127 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2128 1.1 degroote struct malo_cmd_txpower *body; 2129 1.1 degroote 2130 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_TXPOWER); 2131 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2132 1.1 degroote hdr->seqnum = 1; 2133 1.1 degroote hdr->result = 0; 2134 1.1 degroote body = (struct malo_cmd_txpower *)(hdr + 1); 2135 1.1 degroote 2136 1.1 degroote memset(body, 0, sizeof(*body)); 2137 1.1 degroote body->action = htole16(1); 2138 1.1 degroote if (powerlevel < 30) 2139 1.1 degroote body->supportpowerlvl = htole16(5); /* LOW */ 2140 1.16 kamil else if (powerlevel < 60) 2141 1.1 degroote body->supportpowerlvl = htole16(10); /* MEDIUM */ 2142 1.1 degroote else 2143 1.1 degroote body->supportpowerlvl = htole16(15); /* HIGH */ 2144 1.1 degroote 2145 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2146 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2147 1.1 degroote 2148 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2149 1.1 degroote } 2150 1.1 degroote 2151 1.1 degroote static int 2152 1.1 degroote malo_cmd_set_rts(struct malo_softc *sc, uint32_t threshold) 2153 1.1 degroote { 2154 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2155 1.1 degroote struct malo_cmd_rts *body; 2156 1.1 degroote 2157 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_RTS); 2158 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2159 1.1 degroote hdr->seqnum = 1; 2160 1.1 degroote hdr->result = 0; 2161 1.1 degroote body = (struct malo_cmd_rts *)(hdr + 1); 2162 1.1 degroote 2163 1.1 degroote memset(body, 0, sizeof(*body)); 2164 1.1 degroote body->action = htole16(1); 2165 1.1 degroote body->threshold = htole32(threshold); 2166 1.1 degroote 2167 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2168 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2169 1.1 degroote 2170 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2171 1.1 degroote } 2172 1.1 degroote 2173 1.1 degroote static int 2174 1.1 degroote malo_cmd_set_slot(struct malo_softc *sc, uint8_t slot) 2175 1.1 degroote { 2176 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2177 1.1 degroote struct malo_cmd_slot *body; 2178 1.1 degroote 2179 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_SLOT); 2180 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2181 1.1 degroote hdr->seqnum = 1; 2182 1.1 degroote hdr->result = 0; 2183 1.1 degroote body = (struct malo_cmd_slot *)(hdr + 1); 2184 1.1 degroote 2185 1.1 degroote memset(body, 0, sizeof(*body)); 2186 1.1 degroote body->action = htole16(1); 2187 1.1 degroote body->slot = slot; 2188 1.1 degroote 2189 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2190 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2191 1.1 degroote 2192 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2193 1.1 degroote } 2194 1.1 degroote 2195 1.1 degroote static int 2196 1.1 degroote malo_cmd_set_rate(struct malo_softc *sc, uint8_t rate) 2197 1.1 degroote { 2198 1.1 degroote struct ieee80211com *ic = &sc->sc_ic; 2199 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2200 1.1 degroote struct malo_cmd_rate *body; 2201 1.1 degroote int i; 2202 1.1 degroote 2203 1.1 degroote hdr->cmd = htole16(MALO_CMD_SET_RATE); 2204 1.1 degroote hdr->size = htole16(sizeof(*hdr) + sizeof(*body)); 2205 1.1 degroote hdr->seqnum = 1; 2206 1.1 degroote hdr->result = 0; 2207 1.1 degroote body = (struct malo_cmd_rate *)(hdr + 1); 2208 1.1 degroote 2209 1.1 degroote memset(body, 0,sizeof(*body)); 2210 1.1 degroote 2211 1.1 degroote if (ic->ic_opmode == IEEE80211_M_HOSTAP) { 2212 1.1 degroote /* TODO */ 2213 1.1 degroote } else 2214 1.1 degroote { 2215 1.1 degroote body->aprates[0] = 2; 2216 1.1 degroote body->aprates[1] = 4; 2217 1.1 degroote body->aprates[2] = 11; 2218 1.1 degroote body->aprates[3] = 22; 2219 1.1 degroote if (ic->ic_curmode == IEEE80211_MODE_11G) { 2220 1.1 degroote body->aprates[4] = 0; 2221 1.1 degroote body->aprates[5] = 12; 2222 1.1 degroote body->aprates[6] = 18; 2223 1.1 degroote body->aprates[7] = 24; 2224 1.1 degroote body->aprates[8] = 36; 2225 1.1 degroote body->aprates[9] = 48; 2226 1.1 degroote body->aprates[10] = 72; 2227 1.1 degroote body->aprates[11] = 96; 2228 1.1 degroote body->aprates[12] = 108; 2229 1.1 degroote } 2230 1.1 degroote } 2231 1.1 degroote 2232 1.1 degroote if (rate != 0) { 2233 1.1 degroote /* fixed rate */ 2234 1.1 degroote for (i = 0; i < 13; i++) { 2235 1.1 degroote if (body->aprates[i] == rate) { 2236 1.1 degroote body->rateindex = i; 2237 1.1 degroote body->dataratetype = 1; 2238 1.1 degroote break; 2239 1.1 degroote } 2240 1.1 degroote } 2241 1.1 degroote } 2242 1.1 degroote 2243 1.1 degroote bus_dmamap_sync(sc->sc_dmat, sc->sc_cmd_dmam, 0, PAGE_SIZE, 2244 1.1 degroote BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 2245 1.1 degroote 2246 1.1 degroote return (malo_send_cmd_dma(sc, sc->sc_cmd_dmaaddr)); 2247 1.1 degroote } 2248 1.1 degroote 2249 1.1 degroote static void 2250 1.1 degroote malo_cmd_response(struct malo_softc *sc) 2251 1.1 degroote { 2252 1.1 degroote struct malo_cmdheader *hdr = sc->sc_cmd_mem; 2253 1.1 degroote 2254 1.1 degroote if (le16toh(hdr->result) != MALO_CMD_RESULT_OK) { 2255 1.1 degroote aprint_error_dev(sc->sc_dev, "firmware cmd %s failed with %s\n", 2256 1.1 degroote malo_cmd_string(hdr->cmd), 2257 1.1 degroote malo_cmd_string_result(hdr->result)); 2258 1.1 degroote } 2259 1.1 degroote 2260 1.1 degroote #ifdef MALO_DEBUG 2261 1.1 degroote aprint_error_dev(sc->sc_dev, "cmd answer for %s=%s\n", 2262 1.1 degroote malo_cmd_string(hdr->cmd), 2263 1.1 degroote malo_cmd_string_result(hdr->result)); 2264 1.1 degroote 2265 1.1 degroote if (malo_d > 2) 2266 1.1 degroote malo_hexdump(hdr, le16toh(hdr->size)); 2267 1.1 degroote #endif 2268 1.1 degroote } 2269