176c21ea3SSascha Wildner /*- 276c21ea3SSascha Wildner * Copyright (c) 2007 Damien Bergamini <damien.bergamini@free.fr> 376c21ea3SSascha Wildner * Copyright (c) 2012 Bernhard Schmidt <bschmidt@FreeBSD.org> 476c21ea3SSascha Wildner * 576c21ea3SSascha Wildner * Permission to use, copy, modify, and distribute this software for any 676c21ea3SSascha Wildner * purpose with or without fee is hereby granted, provided that the above 776c21ea3SSascha Wildner * copyright notice and this permission notice appear in all copies. 876c21ea3SSascha Wildner * 976c21ea3SSascha Wildner * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1076c21ea3SSascha Wildner * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1176c21ea3SSascha Wildner * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1276c21ea3SSascha Wildner * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1376c21ea3SSascha Wildner * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1476c21ea3SSascha Wildner * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1576c21ea3SSascha Wildner * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1676c21ea3SSascha Wildner * 1776c21ea3SSascha Wildner * $OpenBSD: rt2860var.h,v 1.20 2010/09/07 16:21:42 deraadt Exp $ 1891b30d50SMatthew Dillon * $FreeBSD$ 1976c21ea3SSascha Wildner */ 2076c21ea3SSascha Wildner 2176c21ea3SSascha Wildner #define RT2860_TX_RING_COUNT 64 2276c21ea3SSascha Wildner #define RT2860_RX_RING_COUNT 128 2376c21ea3SSascha Wildner #define RT2860_TX_POOL_COUNT (RT2860_TX_RING_COUNT * 2) 2476c21ea3SSascha Wildner 2576c21ea3SSascha Wildner #define RT2860_MAX_SCATTER ((RT2860_TX_RING_COUNT * 2) - 1) 2676c21ea3SSascha Wildner 2776c21ea3SSascha Wildner /* HW supports up to 255 STAs */ 2876c21ea3SSascha Wildner #define RT2860_WCID_MAX 254 2976c21ea3SSascha Wildner #define RT2860_AID2WCID(aid) ((aid) & 0xff) 3076c21ea3SSascha Wildner 3176c21ea3SSascha Wildner struct rt2860_rx_radiotap_header { 3276c21ea3SSascha Wildner struct ieee80211_radiotap_header wr_ihdr; 3376c21ea3SSascha Wildner uint64_t wr_tsf; 3476c21ea3SSascha Wildner uint8_t wr_flags; 3576c21ea3SSascha Wildner uint8_t wr_rate; 3676c21ea3SSascha Wildner uint16_t wr_chan_freq; 3776c21ea3SSascha Wildner uint16_t wr_chan_flags; 3876c21ea3SSascha Wildner uint8_t wr_antenna; 3976c21ea3SSascha Wildner int8_t wr_antsignal; 4076c21ea3SSascha Wildner int8_t wr_antnoise; 4176c21ea3SSascha Wildner } __packed; 4276c21ea3SSascha Wildner 4376c21ea3SSascha Wildner #define RT2860_RX_RADIOTAP_PRESENT \ 4476c21ea3SSascha Wildner ((1 << IEEE80211_RADIOTAP_TSFT) | \ 4576c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_FLAGS) | \ 4676c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_RATE) | \ 4776c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 4876c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_ANTENNA) | \ 4976c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 5076c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) 5176c21ea3SSascha Wildner 5276c21ea3SSascha Wildner struct rt2860_tx_radiotap_header { 5376c21ea3SSascha Wildner struct ieee80211_radiotap_header wt_ihdr; 5476c21ea3SSascha Wildner uint8_t wt_flags; 5576c21ea3SSascha Wildner uint8_t wt_rate; 5676c21ea3SSascha Wildner uint16_t wt_chan_freq; 5776c21ea3SSascha Wildner uint16_t wt_chan_flags; 5876c21ea3SSascha Wildner } __packed; 5976c21ea3SSascha Wildner 6076c21ea3SSascha Wildner #define RT2860_TX_RADIOTAP_PRESENT \ 6176c21ea3SSascha Wildner ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 6276c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_RATE) | \ 6376c21ea3SSascha Wildner (1 << IEEE80211_RADIOTAP_CHANNEL)) 6476c21ea3SSascha Wildner 6576c21ea3SSascha Wildner struct rt2860_tx_data { 6676c21ea3SSascha Wildner struct rt2860_txwi *txwi; 6776c21ea3SSascha Wildner struct mbuf *m; 6876c21ea3SSascha Wildner struct ieee80211_node *ni; 6976c21ea3SSascha Wildner bus_dmamap_t map; 7076c21ea3SSascha Wildner bus_addr_t paddr; 7176c21ea3SSascha Wildner SLIST_ENTRY(rt2860_tx_data) next; 7276c21ea3SSascha Wildner }; 7376c21ea3SSascha Wildner 7476c21ea3SSascha Wildner struct rt2860_tx_ring { 7576c21ea3SSascha Wildner struct rt2860_txd *txd; 7676c21ea3SSascha Wildner bus_addr_t paddr; 7776c21ea3SSascha Wildner bus_dma_tag_t desc_dmat; 7876c21ea3SSascha Wildner bus_dmamap_t desc_map; 7976c21ea3SSascha Wildner bus_dma_segment_t seg; 8076c21ea3SSascha Wildner struct rt2860_tx_data *data[RT2860_TX_RING_COUNT]; 8176c21ea3SSascha Wildner int cur; 8276c21ea3SSascha Wildner int next; 8376c21ea3SSascha Wildner int queued; 8476c21ea3SSascha Wildner }; 8576c21ea3SSascha Wildner 8676c21ea3SSascha Wildner struct rt2860_rx_data { 8776c21ea3SSascha Wildner struct mbuf *m; 8876c21ea3SSascha Wildner bus_dmamap_t map; 8976c21ea3SSascha Wildner }; 9076c21ea3SSascha Wildner 9176c21ea3SSascha Wildner struct rt2860_rx_ring { 9276c21ea3SSascha Wildner struct rt2860_rxd *rxd; 9376c21ea3SSascha Wildner bus_addr_t paddr; 9476c21ea3SSascha Wildner bus_dma_tag_t desc_dmat; 9576c21ea3SSascha Wildner bus_dmamap_t desc_map; 9676c21ea3SSascha Wildner bus_dma_tag_t data_dmat; 9776c21ea3SSascha Wildner bus_dma_segment_t seg; 9876c21ea3SSascha Wildner unsigned int cur; /* must be unsigned */ 9976c21ea3SSascha Wildner struct rt2860_rx_data data[RT2860_RX_RING_COUNT]; 10076c21ea3SSascha Wildner }; 10176c21ea3SSascha Wildner 10276c21ea3SSascha Wildner struct rt2860_node { 10376c21ea3SSascha Wildner struct ieee80211_node ni; 10476c21ea3SSascha Wildner uint8_t wcid; 10576c21ea3SSascha Wildner uint8_t ridx[IEEE80211_RATE_MAXSIZE]; 10676c21ea3SSascha Wildner uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE]; 10776c21ea3SSascha Wildner }; 10876c21ea3SSascha Wildner 10976c21ea3SSascha Wildner struct rt2860_vap { 11076c21ea3SSascha Wildner struct ieee80211vap ral_vap; 11176c21ea3SSascha Wildner 11276c21ea3SSascha Wildner int (*ral_newstate)(struct ieee80211vap *, 11376c21ea3SSascha Wildner enum ieee80211_state, int); 11476c21ea3SSascha Wildner }; 11576c21ea3SSascha Wildner #define RT2860_VAP(vap) ((struct rt2860_vap *)(vap)) 11676c21ea3SSascha Wildner 11776c21ea3SSascha Wildner struct rt2860_softc { 11891b30d50SMatthew Dillon struct ieee80211com sc_ic; 11991b30d50SMatthew Dillon struct mbufq sc_snd; 120*93d249f7SMatthew Dillon #if defined(__DragonFly__) 121*93d249f7SMatthew Dillon struct lock sc_mtx; 122*93d249f7SMatthew Dillon #else 12391b30d50SMatthew Dillon struct mtx sc_mtx; 124*93d249f7SMatthew Dillon #endif 12576c21ea3SSascha Wildner device_t sc_dev; 12676c21ea3SSascha Wildner bus_space_tag_t sc_st; 12776c21ea3SSascha Wildner bus_space_handle_t sc_sh; 12876c21ea3SSascha Wildner 12976c21ea3SSascha Wildner struct callout watchdog_ch; 13076c21ea3SSascha Wildner 13176c21ea3SSascha Wildner int sc_invalid; 13276c21ea3SSascha Wildner int sc_debug; 13376c21ea3SSascha Wildner /* 13476c21ea3SSascha Wildner * The same in both up to here 13576c21ea3SSascha Wildner * ------------------------------------------------ 13676c21ea3SSascha Wildner */ 13776c21ea3SSascha Wildner 13876c21ea3SSascha Wildner uint16_t (*sc_srom_read)(struct rt2860_softc *, 13976c21ea3SSascha Wildner uint16_t); 14076c21ea3SSascha Wildner void (*sc_node_free)(struct ieee80211_node *); 14176c21ea3SSascha Wildner 14276c21ea3SSascha Wildner int sc_flags; 14376c21ea3SSascha Wildner #define RT2860_ENABLED (1 << 0) 14476c21ea3SSascha Wildner #define RT2860_ADVANCED_PS (1 << 1) 14576c21ea3SSascha Wildner #define RT2860_PCIE (1 << 2) 14691b30d50SMatthew Dillon #define RT2860_RUNNING (1 << 3) 14776c21ea3SSascha Wildner 14876c21ea3SSascha Wildner struct ieee80211_node *wcid2ni[RT2860_WCID_MAX]; 14976c21ea3SSascha Wildner 15076c21ea3SSascha Wildner struct rt2860_tx_ring txq[6]; 15176c21ea3SSascha Wildner struct rt2860_rx_ring rxq; 15276c21ea3SSascha Wildner 15376c21ea3SSascha Wildner SLIST_HEAD(, rt2860_tx_data) data_pool; 15476c21ea3SSascha Wildner struct rt2860_tx_data data[RT2860_TX_POOL_COUNT]; 15576c21ea3SSascha Wildner bus_dma_tag_t txwi_dmat; 15676c21ea3SSascha Wildner bus_dmamap_t txwi_map; 15776c21ea3SSascha Wildner bus_dma_segment_t txwi_seg; 15876c21ea3SSascha Wildner caddr_t txwi_vaddr; 15976c21ea3SSascha Wildner 16076c21ea3SSascha Wildner int sc_tx_timer; 16176c21ea3SSascha Wildner int mgtqid; 16276c21ea3SSascha Wildner uint8_t qfullmsk; 16376c21ea3SSascha Wildner 16476c21ea3SSascha Wildner uint16_t mac_ver; 16576c21ea3SSascha Wildner uint16_t mac_rev; 16691b30d50SMatthew Dillon uint16_t rf_rev; 16776c21ea3SSascha Wildner uint8_t freq; 16876c21ea3SSascha Wildner uint8_t ntxchains; 16976c21ea3SSascha Wildner uint8_t nrxchains; 17076c21ea3SSascha Wildner uint8_t pslevel; 17176c21ea3SSascha Wildner int8_t txpow1[54]; 17276c21ea3SSascha Wildner int8_t txpow2[54]; 17376c21ea3SSascha Wildner int8_t rssi_2ghz[3]; 17476c21ea3SSascha Wildner int8_t rssi_5ghz[3]; 17576c21ea3SSascha Wildner uint8_t lna[4]; 17676c21ea3SSascha Wildner uint8_t rf24_20mhz; 17776c21ea3SSascha Wildner uint8_t rf24_40mhz; 17876c21ea3SSascha Wildner uint8_t patch_dac; 17976c21ea3SSascha Wildner uint8_t rfswitch; 18076c21ea3SSascha Wildner uint8_t ext_2ghz_lna; 18176c21ea3SSascha Wildner uint8_t ext_5ghz_lna; 18276c21ea3SSascha Wildner uint8_t calib_2ghz; 18376c21ea3SSascha Wildner uint8_t calib_5ghz; 18476c21ea3SSascha Wildner uint8_t txmixgain_2ghz; 18576c21ea3SSascha Wildner uint8_t txmixgain_5ghz; 18676c21ea3SSascha Wildner uint8_t tssi_2ghz[9]; 18776c21ea3SSascha Wildner uint8_t tssi_5ghz[9]; 18876c21ea3SSascha Wildner uint8_t step_2ghz; 18976c21ea3SSascha Wildner uint8_t step_5ghz; 19076c21ea3SSascha Wildner struct { 19176c21ea3SSascha Wildner uint8_t reg; 19276c21ea3SSascha Wildner uint8_t val; 19376c21ea3SSascha Wildner } bbp[8], rf[10]; 19476c21ea3SSascha Wildner uint8_t leds; 19576c21ea3SSascha Wildner uint16_t led[3]; 19676c21ea3SSascha Wildner uint32_t txpow20mhz[5]; 19776c21ea3SSascha Wildner uint32_t txpow40mhz_2ghz[5]; 19876c21ea3SSascha Wildner uint32_t txpow40mhz_5ghz[5]; 19976c21ea3SSascha Wildner 20076c21ea3SSascha Wildner struct rt2860_rx_radiotap_header sc_rxtap; 20176c21ea3SSascha Wildner struct rt2860_tx_radiotap_header sc_txtap; 20276c21ea3SSascha Wildner }; 20376c21ea3SSascha Wildner 20476c21ea3SSascha Wildner int rt2860_attach(device_t, int); 20576c21ea3SSascha Wildner int rt2860_detach(void *); 20676c21ea3SSascha Wildner void rt2860_shutdown(void *); 20776c21ea3SSascha Wildner void rt2860_suspend(void *); 20876c21ea3SSascha Wildner void rt2860_resume(void *); 20976c21ea3SSascha Wildner void rt2860_intr(void *); 21091b30d50SMatthew Dillon 211*93d249f7SMatthew Dillon #if defined(__DragonFly__) 212*93d249f7SMatthew Dillon 213*93d249f7SMatthew Dillon #define RAL_LOCK(sc) lockmgr(&(sc)->sc_mtx, LK_EXCLUSIVE) 214*93d249f7SMatthew Dillon #define RAL_LOCK_ASSERT(sc) KKASSERT(lockstatus(&(sc)->sc_mtx, curthread) == LK_EXCLUSIVE) 215*93d249f7SMatthew Dillon #define RAL_UNLOCK(sc) lockmgr(&(sc)->sc_mtx, LK_RELEASE) 216*93d249f7SMatthew Dillon 217*93d249f7SMatthew Dillon #else 218*93d249f7SMatthew Dillon 21991b30d50SMatthew Dillon #define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 22091b30d50SMatthew Dillon #define RAL_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 22191b30d50SMatthew Dillon #define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 222*93d249f7SMatthew Dillon 223*93d249f7SMatthew Dillon #endif 224