1 /* $OpenBSD: if_malovar.h,v 1.30 2013/12/06 21:03:04 deraadt Exp $ */ 2 3 /* 4 * Copyright (c) 2007 Marcus Glocker <mglocker@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /* simplify bus space access */ 20 #define MALO_READ_1(sc, reg) \ 21 bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, (reg)) 22 #define MALO_READ_2(sc, reg) \ 23 bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, (reg)) 24 #define MALO_READ_MULTI_2(sc, reg, off, size) \ 25 bus_space_read_raw_multi_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), \ 26 (size)) 27 #define MALO_WRITE_1(sc, reg, val) \ 28 bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, (reg), (val)) 29 #define MALO_WRITE_2(sc, reg, val) \ 30 bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (val)) 31 #define MALO_WRITE_MULTI_2(sc, reg, off, size) \ 32 bus_space_write_raw_multi_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), \ 33 (size)) 34 35 /* miscellaneous */ 36 #define MALO_FW_HELPER_BSIZE 256 /* helper FW block size */ 37 #define MALO_FW_HELPER_LOADED 0x10 /* helper FW loaded */ 38 #define MALO_FW_MAIN_MAXRETRY 20 /* main FW block resend max retry */ 39 #define MALO_CMD_BUFFER_SIZE 256 /* cmd buffer */ 40 41 /* device flags */ 42 #define MALO_DEVICE_ATTACHED (1 << 0) 43 #define MALO_FW_LOADED (1 << 1) 44 #define MALO_ASSOC_FAILED (1 << 2) 45 #define MALO_BUSY (1 << 3) 46 /* 47 * FW command structures 48 */ 49 struct malo_cmd_header { 50 uint16_t cmd; 51 uint16_t size; 52 uint16_t seqnum; 53 uint16_t result; 54 /* malo_cmd_body */ 55 }; 56 57 struct malo_cmd_body_spec { 58 uint16_t hw_if_version; 59 uint16_t hw_version; 60 uint16_t num_of_wcb; 61 uint16_t num_of_mcast; 62 uint8_t macaddr[ETHER_ADDR_LEN]; 63 uint16_t regioncode; 64 uint16_t num_of_antenna; 65 uint32_t fw_version; 66 uint32_t wcbbase; 67 uint32_t rxpdrdptr; 68 uint32_t rxpdwrptr; 69 uint32_t fw_capinfo; 70 } __packed; 71 72 struct malo_cmd_body_scan { 73 uint8_t bsstype; 74 uint8_t bssid[ETHER_ADDR_LEN]; 75 /* malo_cmd_tlv_ssid */ 76 /* malo_cmd_tlv_chanlist */ 77 /* malo_cmd_tlv_rates */ 78 /* malo_cmd_tlv_numprobes */ 79 } __packed; 80 81 struct malo_cmd_body_rsp_scan { 82 uint16_t bufsize; 83 uint8_t numofset; 84 } __packed; 85 struct malo_cmd_body_rsp_scan_set { 86 uint16_t size; 87 uint8_t bssid[ETHER_ADDR_LEN]; 88 uint8_t rssi; 89 uint8_t timestamp[8]; 90 uint16_t beaconintvl; 91 uint16_t capinfo; 92 } __packed; 93 94 struct malo_cmd_body_auth { 95 uint8_t peermac[ETHER_ADDR_LEN]; 96 uint8_t authtype; 97 } __packed; 98 99 #define MALO_WEP_ACTION_TYPE_ADD 0x02 100 #define MALO_WEP_ACTION_TYPE_REMOVE 0x04 101 #define MALO_WEP_ACTION_TYPE_DEFAULT 0x08 102 #define MALO_WEP_KEY_TYPE_40BIT 0x01 103 #define MALO_WEP_KEY_TYPE_104BIT 0x02 104 struct malo_cmd_body_wep { 105 uint16_t action; 106 uint16_t key_index; 107 uint8_t key_type_1; 108 uint8_t key_type_2; 109 uint8_t key_type_3; 110 uint8_t key_type_4; 111 uint8_t key_value_1[16]; 112 uint8_t key_value_2[16]; 113 uint8_t key_value_3[16]; 114 uint8_t key_value_4[16]; 115 } __packed; 116 117 #define MALO_OID_BSS 0x00 118 #define MALO_OID_RATE 0x01 119 #define MALO_OID_BCNPERIOD 0x02 120 #define MALO_OID_DTIMPERIOD 0x03 121 #define MALO_OID_ASSOCTIMEOUT 0x04 122 #define MALO_OID_RTSTRESH 0x05 123 #define MALO_OID_SHORTRETRY 0x06 124 #define MALO_OID_LONGRETRY 0x07 125 #define MALO_OID_FRAGTRESH 0x08 126 #define MALO_OID_80211D 0x09 127 #define MALO_OID_80211H 0x0a 128 struct malo_cmd_body_snmp { 129 uint16_t action; 130 uint16_t oid; 131 uint16_t size; 132 uint8_t data[128]; 133 } __packed; 134 135 struct malo_cmd_body_radio { 136 uint16_t action; 137 uint16_t control; 138 } __packed; 139 140 struct malo_cmd_body_channel { 141 uint16_t action; 142 uint16_t channel; 143 uint16_t rftype; 144 uint16_t reserved; 145 uint8_t channel_list[32]; 146 } __packed; 147 148 struct malo_cmd_body_txpower { 149 uint16_t action; 150 int16_t txpower; 151 } __packed; 152 153 struct malo_cmd_body_antenna { 154 uint16_t action; 155 uint16_t antenna_mode; 156 } __packed; 157 158 struct malo_cmd_body_macctrl { 159 uint16_t action; 160 uint16_t reserved; 161 } __packed; 162 163 struct malo_cmd_body_macaddr { 164 uint16_t action; 165 uint8_t macaddr[ETHER_ADDR_LEN]; 166 } __packed; 167 168 struct malo_cmd_body_assoc { 169 uint8_t peermac[ETHER_ADDR_LEN]; 170 uint16_t capinfo; 171 uint16_t listenintrv; 172 uint16_t bcnperiod; 173 uint8_t dtimperiod; 174 /* malo_cmd_tlv_ssid */ 175 /* malo_cmd_tlv_phy */ 176 /* malo_cmd_tlv_cf */ 177 /* malo_cmd_tlv_rate */ 178 } __packed; 179 180 struct malo_cmd_body_rsp_assoc { 181 uint16_t capinfo; 182 uint16_t status; 183 uint16_t assoc_id; 184 uint16_t info_len; 185 /* uint8_t info[270] */ 186 } __packed; 187 188 struct malo_cmd_body_80211d { 189 uint16_t action; 190 /* malo_cmd_tlv_80211d */ 191 } __packed; 192 193 struct malo_cmd_body_bgscan_config { 194 uint16_t action; 195 uint8_t enable; 196 uint8_t bsstype; 197 uint8_t chperscan; 198 uint8_t discard; 199 uint16_t reserved; 200 uint32_t scanintvl; 201 uint32_t storecond; 202 uint32_t reportcond; 203 uint16_t maxscanres; 204 } __packed; 205 206 struct malo_cmd_body_bgscan_query { 207 uint8_t flush; 208 } __packed; 209 210 #define MALO_RATE_BITMAP_DS1 (1 << 0) 211 #define MALO_RATE_BITMAP_DS2 (1 << 1) 212 #define MALO_RATE_BITMAP_DS5 (1 << 2) 213 #define MALO_RATE_BITMAP_DS11 (1 << 3) 214 #define MALO_RATE_BITMAP_OFDM6 (1 << 5) 215 #define MALO_RATE_BITMAP_OFDM9 (1 << 6) 216 #define MALO_RATE_BITMAP_OFDM12 (1 << 7) 217 #define MALO_RATE_BITMAP_OFDM18 (1 << 8) 218 #define MALO_RATE_BITMAP_OFDM24 (1 << 9) 219 #define MALO_RATE_BITMAP_OFDM36 (1 << 10) 220 #define MALO_RATE_BITMAP_OFDM48 (1 << 11) 221 #define MALO_RATE_BITMAP_OFDM54 (1 << 12) 222 #define MALO_RATE_BITMAP_AUTO 0x1fef 223 struct malo_cmd_body_rate { 224 uint16_t action; 225 uint16_t hwauto; 226 uint16_t ratebitmap; 227 } __packed; 228 229 /* 230 * FW command TLV structures 231 */ 232 #define MALO_TLV_TYPE_SSID 0x0000 233 #define MALO_TLV_TYPE_RATES 0x0001 234 #define MALO_TLV_TYPE_PHY 0x0003 235 #define MALO_TLV_TYPE_CF 0x0004 236 #define MALO_TLV_TYPE_80211D 0x0007 237 #define MALO_TLV_TYPE_CHANLIST 0x0101 238 #define MALO_TLV_TYPE_NUMPROBES 0x0102 239 #define MALO_TLV_TYPE_PASSEID 0x010a 240 241 struct malo_cmd_tlv_ssid { 242 uint16_t type; 243 uint16_t size; 244 uint8_t data[1]; 245 } __packed; 246 247 struct malo_cmd_tlv_rates { 248 uint16_t type; 249 uint16_t size; 250 uint8_t data[1]; 251 } __packed; 252 253 struct malo_cmd_tlv_phy { 254 uint16_t type; 255 uint16_t size; 256 uint8_t data[1]; 257 } __packed; 258 259 struct malo_cmd_tlv_cf { 260 uint16_t type; 261 uint16_t size; 262 uint8_t data[1]; 263 } __packed; 264 265 struct malo_cmd_tlv_80211d_param { 266 uint8_t firstchannel; 267 uint8_t numchannels; 268 uint8_t maxtxpower; 269 } __packed; 270 struct malo_cmd_tlv_80211d { 271 uint16_t type; 272 uint16_t size; 273 uint8_t countrycode[3]; 274 struct malo_cmd_tlv_80211d_param data[12]; 275 } __packed; 276 277 struct malo_cmd_tlv_chanlist_param { 278 uint8_t radiotype; 279 uint8_t channumber; 280 uint8_t scantype; 281 uint16_t minscantime; 282 uint16_t maxscantime; 283 } __packed; 284 #define CHANNELS 12 285 struct malo_cmd_tlv_chanlist { 286 uint16_t type; 287 uint16_t size; 288 struct malo_cmd_tlv_chanlist_param data[CHANNELS]; 289 } __packed; 290 291 struct malo_cmd_tlv_numprobes { 292 uint16_t type; 293 uint16_t size; 294 uint16_t numprobes; 295 } __packed; 296 297 struct malo_cmd_tlv_passeid { 298 uint16_t type; 299 uint16_t size; 300 uint8_t data[1]; 301 } __packed; 302 303 /* RX descriptor */ 304 #define MALO_RX_STATUS_OK 0x0001 305 struct malo_rx_desc { 306 uint16_t status; 307 uint8_t snr; 308 uint8_t control; 309 uint16_t pkglen; 310 uint8_t nf; 311 uint8_t rate; 312 uint32_t pkgoffset; 313 uint32_t reserved1; 314 uint8_t priority; 315 uint8_t reserved2[3]; 316 } __packed; 317 318 /* TX descriptor */ 319 struct malo_tx_desc { 320 uint32_t status; 321 uint32_t control; 322 uint32_t pkgoffset; 323 uint16_t pkglen; 324 uint8_t dstaddrhigh[2]; 325 uint8_t dstaddrlow[4]; 326 uint8_t priority; 327 uint8_t flags; 328 uint8_t reserved[2]; 329 } __packed; 330 331 /* scanned network */ 332 struct malo_networks { 333 uint8_t bssid[ETHER_ADDR_LEN]; 334 uint8_t rssi; 335 uint8_t timestamp[8]; 336 uint16_t beaconintvl; 337 uint16_t capinfo; 338 uint8_t ssid[32]; 339 uint8_t rates[14]; 340 uint8_t channel; 341 } __packed; 342 343 /* 344 * Softc 345 */ 346 struct malo_softc { 347 struct device sc_dev; 348 struct ieee80211com sc_ic; 349 bus_space_tag_t sc_iot; 350 bus_space_handle_t sc_ioh; 351 int (*sc_newstate) 352 (struct ieee80211com *, enum ieee80211_state, 353 int); 354 355 int sc_flags; 356 uint8_t *sc_fw_h; 357 uint8_t *sc_fw_m; 358 size_t sc_fw_h_size; 359 size_t sc_fw_m_size; 360 int sc_cmd_ctxsave; 361 void *sc_cmd; 362 void *sc_data; 363 uint8_t sc_curchan; 364 int sc_net_num; 365 int sc_net_cur; 366 struct malo_networks sc_net[12]; 367 struct timeout sc_scan_to; 368 }; 369