15fdff524SSepherosa Ziehau /* 25fdff524SSepherosa Ziehau * Copyright (c) 2005 35fdff524SSepherosa Ziehau * Damien Bergamini <damien.bergamini@free.fr> 45fdff524SSepherosa Ziehau * 55fdff524SSepherosa Ziehau * Permission to use, copy, modify, and distribute this software for any 65fdff524SSepherosa Ziehau * purpose with or without fee is hereby granted, provided that the above 75fdff524SSepherosa Ziehau * copyright notice and this permission notice appear in all copies. 85fdff524SSepherosa Ziehau * 95fdff524SSepherosa Ziehau * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 105fdff524SSepherosa Ziehau * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 115fdff524SSepherosa Ziehau * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 125fdff524SSepherosa Ziehau * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 135fdff524SSepherosa Ziehau * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 145fdff524SSepherosa Ziehau * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 155fdff524SSepherosa Ziehau * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 165fdff524SSepherosa Ziehau * 175fdff524SSepherosa Ziehau * $FreeBSD: src/sys/dev/ral/rt2661var.h,v 1.1 2006/03/05 20:36:56 damien Exp $ 18*99fda2c4SSepherosa Ziehau * $DragonFly: src/sys/dev/netif/ral/rt2661var.h,v 1.10 2008/01/17 07:35:38 sephe Exp $ 195fdff524SSepherosa Ziehau */ 205fdff524SSepherosa Ziehau 21ce42f143SSepherosa Ziehau #define RT2661_NCHAN_MAX 38 225717dc1aSSepherosa Ziehau #define RT2661_KEY_MAX 64 23ce42f143SSepherosa Ziehau 245fdff524SSepherosa Ziehau struct rt2661_rx_radiotap_header { 255fdff524SSepherosa Ziehau struct ieee80211_radiotap_header wr_ihdr; 265fdff524SSepherosa Ziehau uint64_t wr_tsf; 275fdff524SSepherosa Ziehau uint8_t wr_flags; 285fdff524SSepherosa Ziehau uint8_t wr_rate; 295fdff524SSepherosa Ziehau uint16_t wr_chan_freq; 305fdff524SSepherosa Ziehau uint16_t wr_chan_flags; 315fdff524SSepherosa Ziehau uint8_t wr_antsignal; 325fdff524SSepherosa Ziehau } __packed; 335fdff524SSepherosa Ziehau 345fdff524SSepherosa Ziehau #define RT2661_RX_RADIOTAP_PRESENT \ 355fdff524SSepherosa Ziehau ((1 << IEEE80211_RADIOTAP_TSFT) | \ 365fdff524SSepherosa Ziehau (1 << IEEE80211_RADIOTAP_FLAGS) | \ 375fdff524SSepherosa Ziehau (1 << IEEE80211_RADIOTAP_RATE) | \ 385fdff524SSepherosa Ziehau (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 395fdff524SSepherosa Ziehau (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)) 405fdff524SSepherosa Ziehau 415fdff524SSepherosa Ziehau struct rt2661_tx_radiotap_header { 425fdff524SSepherosa Ziehau struct ieee80211_radiotap_header wt_ihdr; 435fdff524SSepherosa Ziehau uint8_t wt_flags; 445fdff524SSepherosa Ziehau uint8_t wt_rate; 455fdff524SSepherosa Ziehau uint16_t wt_chan_freq; 465fdff524SSepherosa Ziehau uint16_t wt_chan_flags; 475fdff524SSepherosa Ziehau } __packed; 485fdff524SSepherosa Ziehau 495fdff524SSepherosa Ziehau #define RT2661_TX_RADIOTAP_PRESENT \ 505fdff524SSepherosa Ziehau ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 515fdff524SSepherosa Ziehau (1 << IEEE80211_RADIOTAP_RATE) | \ 525fdff524SSepherosa Ziehau (1 << IEEE80211_RADIOTAP_CHANNEL)) 535fdff524SSepherosa Ziehau 549dd87f8aSSepherosa Ziehau struct rt2661_tx_ratectl { 555fdff524SSepherosa Ziehau struct ieee80211_node *ni; 56e3ab8063SSepherosa Ziehau int len; 57e3ab8063SSepherosa Ziehau int rateidx; 589dd87f8aSSepherosa Ziehau STAILQ_ENTRY(rt2661_tx_ratectl) link; 599dd87f8aSSepherosa Ziehau }; 609dd87f8aSSepherosa Ziehau 619dd87f8aSSepherosa Ziehau struct rt2661_data { 629dd87f8aSSepherosa Ziehau bus_dmamap_t map; 639dd87f8aSSepherosa Ziehau struct mbuf *m; 645fdff524SSepherosa Ziehau }; 655fdff524SSepherosa Ziehau 665fdff524SSepherosa Ziehau struct rt2661_tx_ring { 675fdff524SSepherosa Ziehau bus_dma_tag_t desc_dmat; 685fdff524SSepherosa Ziehau bus_dma_tag_t data_dmat; 695fdff524SSepherosa Ziehau bus_dmamap_t desc_map; 705fdff524SSepherosa Ziehau bus_addr_t physaddr; 715fdff524SSepherosa Ziehau struct rt2661_tx_desc *desc; 729dd87f8aSSepherosa Ziehau struct rt2661_data *data; 735fdff524SSepherosa Ziehau int count; 745fdff524SSepherosa Ziehau int queued; 755fdff524SSepherosa Ziehau int cur; 765fdff524SSepherosa Ziehau int next; 775fdff524SSepherosa Ziehau }; 785fdff524SSepherosa Ziehau 795fdff524SSepherosa Ziehau struct rt2661_rx_ring { 805fdff524SSepherosa Ziehau bus_dma_tag_t desc_dmat; 815fdff524SSepherosa Ziehau bus_dma_tag_t data_dmat; 825fdff524SSepherosa Ziehau bus_dmamap_t desc_map; 835fdff524SSepherosa Ziehau bus_addr_t physaddr; 845fdff524SSepherosa Ziehau struct rt2661_rx_desc *desc; 859dd87f8aSSepherosa Ziehau struct rt2661_data *data; 865fdff524SSepherosa Ziehau int count; 875fdff524SSepherosa Ziehau int cur; 885fdff524SSepherosa Ziehau int next; 895fdff524SSepherosa Ziehau }; 905fdff524SSepherosa Ziehau 91*99fda2c4SSepherosa Ziehau struct rt2661_rfprog { 92*99fda2c4SSepherosa Ziehau uint8_t chan; 93*99fda2c4SSepherosa Ziehau uint32_t r1, r2, r3, r4; 94*99fda2c4SSepherosa Ziehau }; 95*99fda2c4SSepherosa Ziehau 965fdff524SSepherosa Ziehau struct rt2661_softc { 975fdff524SSepherosa Ziehau struct ieee80211com sc_ic; 985fdff524SSepherosa Ziehau bus_space_tag_t sc_st; 995fdff524SSepherosa Ziehau bus_space_handle_t sc_sh; 1005fdff524SSepherosa Ziehau device_t sc_dev; 1015fdff524SSepherosa Ziehau 1025fdff524SSepherosa Ziehau int sc_irq_rid; 1035fdff524SSepherosa Ziehau struct resource *sc_irq; 1045fdff524SSepherosa Ziehau void *sc_ih; 1055fdff524SSepherosa Ziehau 1065717dc1aSSepherosa Ziehau int (*sc_newstate) 1075717dc1aSSepherosa Ziehau (struct ieee80211com *, 1085fdff524SSepherosa Ziehau enum ieee80211_state, int); 1095fdff524SSepherosa Ziehau 1105717dc1aSSepherosa Ziehau int (*sc_key_alloc) 1115717dc1aSSepherosa Ziehau (struct ieee80211com *, 1125717dc1aSSepherosa Ziehau const struct ieee80211_key *, 1135717dc1aSSepherosa Ziehau ieee80211_keyix *, ieee80211_keyix *); 1145717dc1aSSepherosa Ziehau 1155717dc1aSSepherosa Ziehau int (*sc_key_delete) 1165717dc1aSSepherosa Ziehau (struct ieee80211com *, 1175717dc1aSSepherosa Ziehau const struct ieee80211_key *); 1185717dc1aSSepherosa Ziehau 1195717dc1aSSepherosa Ziehau int (*sc_key_set) 1205717dc1aSSepherosa Ziehau (struct ieee80211com *, 1215717dc1aSSepherosa Ziehau const struct ieee80211_key *, 1225717dc1aSSepherosa Ziehau const uint8_t[IEEE80211_ADDR_LEN]); 1235717dc1aSSepherosa Ziehau 1245fdff524SSepherosa Ziehau struct callout scan_ch; 125*99fda2c4SSepherosa Ziehau struct callout calib_ch; 1265fdff524SSepherosa Ziehau 1275fdff524SSepherosa Ziehau int sc_tx_timer; 128322b19a8SSepherosa Ziehau int sc_sifs; 1295fdff524SSepherosa Ziehau 1305fdff524SSepherosa Ziehau struct ieee80211_channel *sc_curchan; 131*99fda2c4SSepherosa Ziehau int sc_curchan_idx; 132*99fda2c4SSepherosa Ziehau int sc_txpwr_cnt; 133*99fda2c4SSepherosa Ziehau int8_t sc_txpwr; 1345fdff524SSepherosa Ziehau 1355fdff524SSepherosa Ziehau uint8_t rf_rev; 1365fdff524SSepherosa Ziehau 137*99fda2c4SSepherosa Ziehau const struct rt2661_rfprog *rfprog; 1385fdff524SSepherosa Ziehau uint8_t rffreq; 1395fdff524SSepherosa Ziehau 1405fdff524SSepherosa Ziehau struct rt2661_tx_ring txq[4]; 1415fdff524SSepherosa Ziehau struct rt2661_tx_ring mgtq; 1425fdff524SSepherosa Ziehau struct rt2661_rx_ring rxq; 1435fdff524SSepherosa Ziehau 1445fdff524SSepherosa Ziehau uint32_t rf_regs[4]; 145ce42f143SSepherosa Ziehau int8_t txpow[RT2661_NCHAN_MAX]; 1465fdff524SSepherosa Ziehau 1475fdff524SSepherosa Ziehau struct { 1485fdff524SSepherosa Ziehau uint8_t reg; 1495fdff524SSepherosa Ziehau uint8_t val; 1505fdff524SSepherosa Ziehau } bbp_prom[16]; 1515fdff524SSepherosa Ziehau 1525fdff524SSepherosa Ziehau int hw_radio; 1535fdff524SSepherosa Ziehau int rx_ant; 1545fdff524SSepherosa Ziehau int tx_ant; 1555fdff524SSepherosa Ziehau int nb_ant; 156110dc487SSepherosa Ziehau 1575fdff524SSepherosa Ziehau int ext_2ghz_lna; 158110dc487SSepherosa Ziehau int rssi_2ghz_corr[2]; 159110dc487SSepherosa Ziehau int avg_rssi[2]; 160*99fda2c4SSepherosa Ziehau uint8_t bbp17_2ghz_min; 161*99fda2c4SSepherosa Ziehau uint8_t bbp17_2ghz_max; 162110dc487SSepherosa Ziehau 1635fdff524SSepherosa Ziehau int ext_5ghz_lna; 1645fdff524SSepherosa Ziehau int rssi_5ghz_corr; 1655fdff524SSepherosa Ziehau 1665fdff524SSepherosa Ziehau uint8_t bbp18; 1675fdff524SSepherosa Ziehau uint8_t bbp21; 1685fdff524SSepherosa Ziehau uint8_t bbp22; 1695fdff524SSepherosa Ziehau uint8_t bbp16; 1705fdff524SSepherosa Ziehau uint8_t bbp17; 1715fdff524SSepherosa Ziehau uint8_t bbp64; 1726c40999eSSepherosa Ziehau uint16_t mcu_led; 1735fdff524SSepherosa Ziehau 1749dd87f8aSSepherosa Ziehau STAILQ_HEAD(, rt2661_tx_ratectl) tx_ratectl; 1759dd87f8aSSepherosa Ziehau 1765fdff524SSepherosa Ziehau struct bpf_if *sc_drvbpf; 1775fdff524SSepherosa Ziehau 1785fdff524SSepherosa Ziehau union { 1795fdff524SSepherosa Ziehau struct rt2661_rx_radiotap_header th; 1805fdff524SSepherosa Ziehau uint8_t pad[64]; 1815fdff524SSepherosa Ziehau } sc_rxtapu; 1825fdff524SSepherosa Ziehau #define sc_rxtap sc_rxtapu.th 1835fdff524SSepherosa Ziehau int sc_rxtap_len; 1845fdff524SSepherosa Ziehau 1855fdff524SSepherosa Ziehau union { 1865fdff524SSepherosa Ziehau struct rt2661_tx_radiotap_header th; 1875fdff524SSepherosa Ziehau uint8_t pad[64]; 1885fdff524SSepherosa Ziehau } sc_txtapu; 1895fdff524SSepherosa Ziehau #define sc_txtap sc_txtapu.th 1905fdff524SSepherosa Ziehau int sc_txtap_len; 1915fdff524SSepherosa Ziehau 1925fdff524SSepherosa Ziehau struct sysctl_ctx_list sysctl_ctx; 1935fdff524SSepherosa Ziehau struct sysctl_oid *sysctl_tree; 1945717dc1aSSepherosa Ziehau 195*99fda2c4SSepherosa Ziehau int sc_txpwr_corr; 196*99fda2c4SSepherosa Ziehau int sc_calib_txpwr; 197*99fda2c4SSepherosa Ziehau int sc_calib_rxsns; 198*99fda2c4SSepherosa Ziehau int sc_dwelltime; 199*99fda2c4SSepherosa Ziehau 20021028056SSepherosa Ziehau struct ieee80211_onoe_param sc_onoe_param; 20121028056SSepherosa Ziehau struct ieee80211_sample_param sc_sample_param; 20221028056SSepherosa Ziehau 2035717dc1aSSepherosa Ziehau uint32_t sc_keymap[2]; 2045fdff524SSepherosa Ziehau }; 2055fdff524SSepherosa Ziehau 2065717dc1aSSepherosa Ziehau #define RT2661_KEY_ASSERT(keyix) \ 2075717dc1aSSepherosa Ziehau KASSERT((keyix) < RT2661_KEY_MAX, ("invalid keyix %d\n", (keyix))) 2085717dc1aSSepherosa Ziehau 2095717dc1aSSepherosa Ziehau #define RT2661_KEY_SET(sc, keyix) \ 2105717dc1aSSepherosa Ziehau do { \ 2115717dc1aSSepherosa Ziehau RT2661_KEY_ASSERT((keyix)); \ 2125717dc1aSSepherosa Ziehau (sc)->sc_keymap[(keyix) / 32] |= (1 << ((keyix) % 32)); \ 2135717dc1aSSepherosa Ziehau } while (0) 2145717dc1aSSepherosa Ziehau 2155717dc1aSSepherosa Ziehau #define RT2661_KEY_CLR(sc, keyix) \ 2165717dc1aSSepherosa Ziehau do { \ 2175717dc1aSSepherosa Ziehau RT2661_KEY_ASSERT((keyix)); \ 2185717dc1aSSepherosa Ziehau (sc)->sc_keymap[(keyix) / 32] &= ~(1 << ((keyix) % 32)); \ 2195717dc1aSSepherosa Ziehau } while (0) 2205717dc1aSSepherosa Ziehau 2215717dc1aSSepherosa Ziehau #define RT2661_KEY_ISSET(sc, keyix) \ 2225717dc1aSSepherosa Ziehau ((sc)->sc_keymap[(keyix) / 32] & (1 << ((keyix) % 32))) 2235717dc1aSSepherosa Ziehau 224110dc487SSepherosa Ziehau #define RT2661_RESET_AVG_RSSI(sc) \ 225110dc487SSepherosa Ziehau do { \ 226110dc487SSepherosa Ziehau (sc)->avg_rssi[0] = -1; \ 227110dc487SSepherosa Ziehau (sc)->avg_rssi[1] = -1; \ 228110dc487SSepherosa Ziehau } while (0) 229110dc487SSepherosa Ziehau 2305fdff524SSepherosa Ziehau int rt2661_attach(device_t, int); 2315fdff524SSepherosa Ziehau int rt2661_detach(void *); 2325fdff524SSepherosa Ziehau void rt2661_shutdown(void *); 2335fdff524SSepherosa Ziehau void rt2661_suspend(void *); 2345fdff524SSepherosa Ziehau void rt2661_resume(void *); 235