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