1*37ecb596Sderaadt /* $OpenBSD: rt2661var.h,v 1.18 2013/12/06 21:03:03 deraadt Exp $ */ 2189ff541Sdamien 3189ff541Sdamien /*- 4189ff541Sdamien * Copyright (c) 2006 5189ff541Sdamien * Damien Bergamini <damien.bergamini@free.fr> 6189ff541Sdamien * 7189ff541Sdamien * Permission to use, copy, modify, and distribute this software for any 8189ff541Sdamien * purpose with or without fee is hereby granted, provided that the above 9189ff541Sdamien * copyright notice and this permission notice appear in all copies. 10189ff541Sdamien * 11189ff541Sdamien * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12189ff541Sdamien * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13189ff541Sdamien * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14189ff541Sdamien * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15189ff541Sdamien * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16189ff541Sdamien * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17189ff541Sdamien * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18189ff541Sdamien */ 19189ff541Sdamien 20e48892ffSdamien struct rt2661_rx_radiotap_header { 21e48892ffSdamien struct ieee80211_radiotap_header wr_ihdr; 22e48892ffSdamien uint64_t wr_tsf; 23e48892ffSdamien uint8_t wr_flags; 242a5f0c51Sdamien uint8_t wr_rate; 25e48892ffSdamien uint16_t wr_chan_freq; 26e48892ffSdamien uint16_t wr_chan_flags; 27e48892ffSdamien uint8_t wr_antsignal; 28e48892ffSdamien } __packed; 29e48892ffSdamien 30e48892ffSdamien #define RT2661_RX_RADIOTAP_PRESENT \ 31e48892ffSdamien ((1 << IEEE80211_RADIOTAP_TSFT) | \ 32e48892ffSdamien (1 << IEEE80211_RADIOTAP_FLAGS) | \ 332a5f0c51Sdamien (1 << IEEE80211_RADIOTAP_RATE) | \ 34e48892ffSdamien (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 35e48892ffSdamien (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)) 36e48892ffSdamien 37e48892ffSdamien struct rt2661_tx_radiotap_header { 38e48892ffSdamien struct ieee80211_radiotap_header wt_ihdr; 39e48892ffSdamien uint8_t wt_flags; 40e48892ffSdamien uint8_t wt_rate; 41e48892ffSdamien uint16_t wt_chan_freq; 42e48892ffSdamien uint16_t wt_chan_flags; 43e48892ffSdamien } __packed; 44e48892ffSdamien 45e48892ffSdamien #define RT2661_TX_RADIOTAP_PRESENT \ 46e48892ffSdamien ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 47e48892ffSdamien (1 << IEEE80211_RADIOTAP_RATE) | \ 48e48892ffSdamien (1 << IEEE80211_RADIOTAP_CHANNEL)) 49e48892ffSdamien 50189ff541Sdamien struct rt2661_tx_data { 51189ff541Sdamien bus_dmamap_t map; 52189ff541Sdamien struct mbuf *m; 53189ff541Sdamien struct ieee80211_node *ni; 54189ff541Sdamien }; 55189ff541Sdamien 56189ff541Sdamien struct rt2661_tx_ring { 57189ff541Sdamien bus_dmamap_t map; 58189ff541Sdamien bus_dma_segment_t seg; 59189ff541Sdamien bus_addr_t physaddr; 60189ff541Sdamien struct rt2661_tx_desc *desc; 61189ff541Sdamien struct rt2661_tx_data *data; 62189ff541Sdamien int count; 63189ff541Sdamien int queued; 64189ff541Sdamien int cur; 65189ff541Sdamien int next; 66189ff541Sdamien int stat; 67189ff541Sdamien }; 68189ff541Sdamien 69189ff541Sdamien struct rt2661_rx_data { 70189ff541Sdamien bus_dmamap_t map; 71189ff541Sdamien struct mbuf *m; 72189ff541Sdamien }; 73189ff541Sdamien 74189ff541Sdamien struct rt2661_rx_ring { 75189ff541Sdamien bus_dmamap_t map; 76189ff541Sdamien bus_dma_segment_t seg; 77189ff541Sdamien bus_addr_t physaddr; 78189ff541Sdamien struct rt2661_rx_desc *desc; 79189ff541Sdamien struct rt2661_rx_data *data; 80189ff541Sdamien int count; 81189ff541Sdamien int cur; 82189ff541Sdamien int next; 83189ff541Sdamien }; 84189ff541Sdamien 851af6d579Sstsp #define RT2661_AMRR_NODES_MAX 100 /* based on IEEE80211_CACHE_SIZE */ 861af6d579Sstsp #define RT2661_AMRR_INVALID_ID (RT2661_AMRR_NODES_MAX + 1) 871af6d579Sstsp 881af6d579Sstsp struct rt2661_amrr_node { 891af6d579Sstsp struct ieee80211_amrr_node amn; 901af6d579Sstsp struct rt2661_node *rn; 911af6d579Sstsp u_int8_t id; 921af6d579Sstsp TAILQ_ENTRY(rt2661_amrr_node) entry; 931af6d579Sstsp }; 941af6d579Sstsp 95e48892ffSdamien struct rt2661_node { 96e48892ffSdamien struct ieee80211_node ni; 971af6d579Sstsp struct rt2661_amrr_node *amn; 98e48892ffSdamien }; 99e48892ffSdamien 100189ff541Sdamien struct rt2661_softc { 101189ff541Sdamien struct device sc_dev; 102189ff541Sdamien 103189ff541Sdamien struct ieee80211com sc_ic; 104189ff541Sdamien int (*sc_newstate)(struct ieee80211com *, 105189ff541Sdamien enum ieee80211_state, int); 1068c71b0d2Sdamien struct ieee80211_amrr amrr; 107189ff541Sdamien 108189ff541Sdamien int (*sc_enable)(struct rt2661_softc *); 109189ff541Sdamien void (*sc_disable)(struct rt2661_softc *); 110189ff541Sdamien 111189ff541Sdamien bus_dma_tag_t sc_dmat; 112189ff541Sdamien bus_space_tag_t sc_st; 113189ff541Sdamien bus_space_handle_t sc_sh; 114189ff541Sdamien 1158c71b0d2Sdamien struct timeout scan_to; 1168c71b0d2Sdamien struct timeout amrr_to; 117189ff541Sdamien 118189ff541Sdamien int sc_id; 119189ff541Sdamien int sc_flags; 120189ff541Sdamien #define RT2661_ENABLED (1 << 0) 1210727ce2fSdamien #define RT2661_UPDATE_SLOT (1 << 1) 1220727ce2fSdamien #define RT2661_SET_SLOTTIME (1 << 2) 123361a5bb3Sderaadt #define RT2661_FWLOADED (1 << 3) 1241af6d579Sstsp #define RT2661_MGT_OACTIVE (1 << 4) 1251af6d579Sstsp #define RT2661_DATA_OACTIVE (1 << 5) 126189ff541Sdamien 127189ff541Sdamien int sc_tx_timer; 128189ff541Sdamien 129189ff541Sdamien struct ieee80211_channel *sc_curchan; 130189ff541Sdamien 1310727ce2fSdamien u_char *ucode; 1320727ce2fSdamien size_t ucsize; 1330727ce2fSdamien 134189ff541Sdamien uint8_t rf_rev; 135189ff541Sdamien 136189ff541Sdamien uint8_t rfprog; 137189ff541Sdamien uint8_t rffreq; 138189ff541Sdamien 139189ff541Sdamien struct rt2661_tx_ring txq[5]; 140189ff541Sdamien struct rt2661_tx_ring mgtq; 141189ff541Sdamien struct rt2661_rx_ring rxq; 142189ff541Sdamien 143189ff541Sdamien uint32_t rf_regs[4]; 144e48892ffSdamien int8_t txpow[38]; 145189ff541Sdamien 146189ff541Sdamien struct { 147189ff541Sdamien uint8_t reg; 148189ff541Sdamien uint8_t val; 149189ff541Sdamien } bbp_prom[16]; 150189ff541Sdamien 151189ff541Sdamien int hw_radio; 152189ff541Sdamien int rx_ant; 153189ff541Sdamien int tx_ant; 154189ff541Sdamien int nb_ant; 155189ff541Sdamien int ext_2ghz_lna; 156189ff541Sdamien int ext_5ghz_lna; 157189ff541Sdamien int rssi_2ghz_corr; 158189ff541Sdamien int rssi_5ghz_corr; 159189ff541Sdamien 160541fa21bSdamien int ncalls; 161541fa21bSdamien int avg_rssi; 162c3b095b8Sdamien int sifs; 163541fa21bSdamien 1641aa65ad1Sdamien uint32_t erp_csr; 1651aa65ad1Sdamien 166189ff541Sdamien uint8_t bbp18; 167189ff541Sdamien uint8_t bbp21; 168189ff541Sdamien uint8_t bbp22; 169189ff541Sdamien uint8_t bbp16; 170189ff541Sdamien uint8_t bbp17; 171189ff541Sdamien uint8_t bbp64; 172e48892ffSdamien 173e48892ffSdamien #if NBPFILTER > 0 174e48892ffSdamien caddr_t sc_drvbpf; 175e48892ffSdamien 176e48892ffSdamien union { 177e48892ffSdamien struct rt2661_rx_radiotap_header th; 178e48892ffSdamien uint8_t pad[64]; 179e48892ffSdamien } sc_rxtapu; 180e48892ffSdamien #define sc_rxtap sc_rxtapu.th 181e48892ffSdamien int sc_rxtap_len; 182e48892ffSdamien 183e48892ffSdamien union { 184e48892ffSdamien struct rt2661_tx_radiotap_header th; 185e48892ffSdamien uint8_t pad[64]; 186e48892ffSdamien } sc_txtapu; 187e48892ffSdamien #define sc_txtap sc_txtapu.th 188e48892ffSdamien int sc_txtap_len; 189e48892ffSdamien #endif 1901af6d579Sstsp void (*sc_node_free)(struct ieee80211com *, 1911af6d579Sstsp struct ieee80211_node *); 1921af6d579Sstsp TAILQ_HEAD(, rt2661_amrr_node) amn; 1931af6d579Sstsp u_int8_t amn_count; 194189ff541Sdamien }; 195189ff541Sdamien 196189ff541Sdamien int rt2661_attach(void *, int); 197189ff541Sdamien int rt2661_detach(void *); 1980727ce2fSdamien void rt2661_suspend(void *); 199*37ecb596Sderaadt void rt2661_wakeup(void *); 200189ff541Sdamien int rt2661_intr(void *); 201