if_malovar.h 8.4 KB

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