1235233Sbschmidt/*- 2235233Sbschmidt * Copyright (c) 2007 Damien Bergamini <damien.bergamini@free.fr> 3235233Sbschmidt * Copyright (c) 2012 Bernhard Schmidt <bschmidt@FreeBSD.org> 4235233Sbschmidt * 5235233Sbschmidt * Permission to use, copy, modify, and distribute this software for any 6235233Sbschmidt * purpose with or without fee is hereby granted, provided that the above 7235233Sbschmidt * copyright notice and this permission notice appear in all copies. 8235233Sbschmidt * 9235233Sbschmidt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10235233Sbschmidt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11235233Sbschmidt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12235233Sbschmidt * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13235233Sbschmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14235233Sbschmidt * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15235233Sbschmidt * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16235233Sbschmidt * 17235233Sbschmidt * $OpenBSD: rt2860var.h,v 1.20 2010/09/07 16:21:42 deraadt Exp $ 18235233Sbschmidt * $FreeBSD: stable/11/sys/dev/ral/rt2860var.h 351143 2019-08-16 21:03:55Z kevans $ 19235233Sbschmidt */ 20235233Sbschmidt 21235233Sbschmidt#define RT2860_TX_RING_COUNT 64 22235233Sbschmidt#define RT2860_RX_RING_COUNT 128 23235233Sbschmidt#define RT2860_TX_POOL_COUNT (RT2860_TX_RING_COUNT * 2) 24235233Sbschmidt 25235233Sbschmidt#define RT2860_MAX_SCATTER ((RT2860_TX_RING_COUNT * 2) - 1) 26235233Sbschmidt 27235233Sbschmidt/* HW supports up to 255 STAs */ 28235233Sbschmidt#define RT2860_WCID_MAX 254 29235233Sbschmidt#define RT2860_AID2WCID(aid) ((aid) & 0xff) 30235233Sbschmidt 31235233Sbschmidtstruct rt2860_rx_radiotap_header { 32235233Sbschmidt struct ieee80211_radiotap_header wr_ihdr; 33235233Sbschmidt uint64_t wr_tsf; 34235233Sbschmidt uint8_t wr_flags; 35235233Sbschmidt uint8_t wr_rate; 36235233Sbschmidt uint16_t wr_chan_freq; 37235233Sbschmidt uint16_t wr_chan_flags; 38235233Sbschmidt uint8_t wr_antenna; 39235233Sbschmidt int8_t wr_antsignal; 40235233Sbschmidt int8_t wr_antnoise; 41300657Ssgalabov} __packed __aligned(8); 42235233Sbschmidt 43235233Sbschmidt#define RT2860_RX_RADIOTAP_PRESENT \ 44235233Sbschmidt ((1 << IEEE80211_RADIOTAP_TSFT) | \ 45235233Sbschmidt (1 << IEEE80211_RADIOTAP_FLAGS) | \ 46235233Sbschmidt (1 << IEEE80211_RADIOTAP_RATE) | \ 47235233Sbschmidt (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 48235233Sbschmidt (1 << IEEE80211_RADIOTAP_ANTENNA) | \ 49235233Sbschmidt (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 50235233Sbschmidt (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) 51235233Sbschmidt 52235233Sbschmidtstruct rt2860_tx_radiotap_header { 53235233Sbschmidt struct ieee80211_radiotap_header wt_ihdr; 54235233Sbschmidt uint8_t wt_flags; 55235233Sbschmidt uint8_t wt_rate; 56235233Sbschmidt uint16_t wt_chan_freq; 57235233Sbschmidt uint16_t wt_chan_flags; 58345636Savos} __packed; 59235233Sbschmidt 60235233Sbschmidt#define RT2860_TX_RADIOTAP_PRESENT \ 61235233Sbschmidt ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 62235233Sbschmidt (1 << IEEE80211_RADIOTAP_RATE) | \ 63235233Sbschmidt (1 << IEEE80211_RADIOTAP_CHANNEL)) 64235233Sbschmidt 65235233Sbschmidtstruct rt2860_tx_data { 66235233Sbschmidt struct rt2860_txwi *txwi; 67235233Sbschmidt struct mbuf *m; 68235233Sbschmidt struct ieee80211_node *ni; 69235233Sbschmidt bus_dmamap_t map; 70235233Sbschmidt bus_addr_t paddr; 71235233Sbschmidt SLIST_ENTRY(rt2860_tx_data) next; 72235233Sbschmidt}; 73235233Sbschmidt 74235233Sbschmidtstruct rt2860_tx_ring { 75235233Sbschmidt struct rt2860_txd *txd; 76235233Sbschmidt bus_addr_t paddr; 77235233Sbschmidt bus_dma_tag_t desc_dmat; 78235233Sbschmidt bus_dmamap_t desc_map; 79235233Sbschmidt bus_dma_segment_t seg; 80235233Sbschmidt struct rt2860_tx_data *data[RT2860_TX_RING_COUNT]; 81235233Sbschmidt int cur; 82235233Sbschmidt int next; 83235233Sbschmidt int queued; 84235233Sbschmidt}; 85235233Sbschmidt 86235233Sbschmidtstruct rt2860_rx_data { 87235233Sbschmidt struct mbuf *m; 88235233Sbschmidt bus_dmamap_t map; 89235233Sbschmidt}; 90235233Sbschmidt 91235233Sbschmidtstruct rt2860_rx_ring { 92235233Sbschmidt struct rt2860_rxd *rxd; 93235233Sbschmidt bus_addr_t paddr; 94235233Sbschmidt bus_dma_tag_t desc_dmat; 95235233Sbschmidt bus_dmamap_t desc_map; 96235233Sbschmidt bus_dma_tag_t data_dmat; 97235233Sbschmidt bus_dma_segment_t seg; 98235233Sbschmidt unsigned int cur; /* must be unsigned */ 99235233Sbschmidt struct rt2860_rx_data data[RT2860_RX_RING_COUNT]; 100235233Sbschmidt}; 101235233Sbschmidt 102235233Sbschmidtstruct rt2860_node { 103235233Sbschmidt struct ieee80211_node ni; 104235233Sbschmidt uint8_t wcid; 105235233Sbschmidt uint8_t ridx[IEEE80211_RATE_MAXSIZE]; 106235233Sbschmidt uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE]; 107235233Sbschmidt}; 108235233Sbschmidt 109235233Sbschmidtstruct rt2860_vap { 110235233Sbschmidt struct ieee80211vap ral_vap; 111235233Sbschmidt 112235233Sbschmidt int (*ral_newstate)(struct ieee80211vap *, 113235233Sbschmidt enum ieee80211_state, int); 114235233Sbschmidt}; 115235233Sbschmidt#define RT2860_VAP(vap) ((struct rt2860_vap *)(vap)) 116235233Sbschmidt 117235233Sbschmidtstruct rt2860_softc { 118287197Sglebius struct ieee80211com sc_ic; 119287197Sglebius struct mbufq sc_snd; 120287197Sglebius struct mtx sc_mtx; 121235233Sbschmidt device_t sc_dev; 122235233Sbschmidt bus_space_tag_t sc_st; 123235233Sbschmidt bus_space_handle_t sc_sh; 124235233Sbschmidt 125235233Sbschmidt struct callout watchdog_ch; 126235233Sbschmidt 127235233Sbschmidt int sc_invalid; 128235233Sbschmidt int sc_debug; 129235233Sbschmidt/* 130235233Sbschmidt * The same in both up to here 131235233Sbschmidt * ------------------------------------------------ 132235233Sbschmidt */ 133235233Sbschmidt 134235233Sbschmidt uint16_t (*sc_srom_read)(struct rt2860_softc *, 135235233Sbschmidt uint16_t); 136235233Sbschmidt void (*sc_node_free)(struct ieee80211_node *); 137235233Sbschmidt 138235233Sbschmidt int sc_flags; 139235233Sbschmidt#define RT2860_ENABLED (1 << 0) 140235233Sbschmidt#define RT2860_ADVANCED_PS (1 << 1) 141235233Sbschmidt#define RT2860_PCIE (1 << 2) 142290133Skevlo#define RT2860_RUNNING (1 << 3) 143235233Sbschmidt 144351143Skevans struct ieee80211_node *wcid2ni[RT2860_WCID_MAX + 1]; 145235233Sbschmidt 146235233Sbschmidt struct rt2860_tx_ring txq[6]; 147235233Sbschmidt struct rt2860_rx_ring rxq; 148235233Sbschmidt 149235233Sbschmidt SLIST_HEAD(, rt2860_tx_data) data_pool; 150235233Sbschmidt struct rt2860_tx_data data[RT2860_TX_POOL_COUNT]; 151235233Sbschmidt bus_dma_tag_t txwi_dmat; 152235233Sbschmidt bus_dmamap_t txwi_map; 153235233Sbschmidt bus_dma_segment_t txwi_seg; 154235233Sbschmidt caddr_t txwi_vaddr; 155235233Sbschmidt 156235233Sbschmidt int sc_tx_timer; 157235233Sbschmidt int mgtqid; 158235233Sbschmidt uint8_t qfullmsk; 159235233Sbschmidt 160235233Sbschmidt uint16_t mac_ver; 161235233Sbschmidt uint16_t mac_rev; 162300006Skevlo uint16_t rf_rev; 163235233Sbschmidt uint8_t freq; 164235233Sbschmidt uint8_t ntxchains; 165235233Sbschmidt uint8_t nrxchains; 166235233Sbschmidt uint8_t pslevel; 167235233Sbschmidt int8_t txpow1[54]; 168235233Sbschmidt int8_t txpow2[54]; 169235233Sbschmidt int8_t rssi_2ghz[3]; 170235233Sbschmidt int8_t rssi_5ghz[3]; 171235233Sbschmidt uint8_t lna[4]; 172235233Sbschmidt uint8_t rf24_20mhz; 173235233Sbschmidt uint8_t rf24_40mhz; 174235233Sbschmidt uint8_t patch_dac; 175235233Sbschmidt uint8_t rfswitch; 176235233Sbschmidt uint8_t ext_2ghz_lna; 177235233Sbschmidt uint8_t ext_5ghz_lna; 178235233Sbschmidt uint8_t calib_2ghz; 179235233Sbschmidt uint8_t calib_5ghz; 180235233Sbschmidt uint8_t txmixgain_2ghz; 181235233Sbschmidt uint8_t txmixgain_5ghz; 182235233Sbschmidt uint8_t tssi_2ghz[9]; 183235233Sbschmidt uint8_t tssi_5ghz[9]; 184235233Sbschmidt uint8_t step_2ghz; 185235233Sbschmidt uint8_t step_5ghz; 186235233Sbschmidt struct { 187235233Sbschmidt uint8_t reg; 188235233Sbschmidt uint8_t val; 189235233Sbschmidt } bbp[8], rf[10]; 190235233Sbschmidt uint8_t leds; 191235233Sbschmidt uint16_t led[3]; 192235233Sbschmidt uint32_t txpow20mhz[5]; 193235233Sbschmidt uint32_t txpow40mhz_2ghz[5]; 194235233Sbschmidt uint32_t txpow40mhz_5ghz[5]; 195235233Sbschmidt 196235233Sbschmidt struct rt2860_rx_radiotap_header sc_rxtap; 197235233Sbschmidt struct rt2860_tx_radiotap_header sc_txtap; 198235233Sbschmidt}; 199235233Sbschmidt 200235233Sbschmidtint rt2860_attach(device_t, int); 201235233Sbschmidtint rt2860_detach(void *); 202235233Sbschmidtvoid rt2860_shutdown(void *); 203235233Sbschmidtvoid rt2860_suspend(void *); 204235233Sbschmidtvoid rt2860_resume(void *); 205235233Sbschmidtvoid rt2860_intr(void *); 206235233Sbschmidt 207235233Sbschmidt#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 208235233Sbschmidt#define RAL_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 209235233Sbschmidt#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 210