1*f88d426dSjsg /* $OpenBSD: acxvar.h,v 1.20 2024/05/29 01:11:53 jsg Exp $ */ 295339239Smglocker 395339239Smglocker /* 495339239Smglocker * Copyright (c) 2006 Jonathan Gray <jsg@openbsd.org> 595339239Smglocker * 695339239Smglocker * Permission to use, copy, modify, and distribute this software for any 795339239Smglocker * purpose with or without fee is hereby granted, provided that the above 895339239Smglocker * copyright notice and this permission notice appear in all copies. 995339239Smglocker * 1095339239Smglocker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1195339239Smglocker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1295339239Smglocker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1395339239Smglocker * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1495339239Smglocker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1595339239Smglocker * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1695339239Smglocker * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1795339239Smglocker */ 180f91cf57Smglocker 190f91cf57Smglocker /* 200f91cf57Smglocker * Copyright (c) 2006 The DragonFly Project. All rights reserved. 210f91cf57Smglocker * 220f91cf57Smglocker * This code is derived from software contributed to The DragonFly Project 230f91cf57Smglocker * by Sepherosa Ziehau <sepherosa@gmail.com> 240f91cf57Smglocker * 250f91cf57Smglocker * Redistribution and use in source and binary forms, with or without 260f91cf57Smglocker * modification, are permitted provided that the following conditions 270f91cf57Smglocker * are met: 280f91cf57Smglocker * 290f91cf57Smglocker * 1. Redistributions of source code must retain the above copyright 300f91cf57Smglocker * notice, this list of conditions and the following disclaimer. 310f91cf57Smglocker * 2. Redistributions in binary form must reproduce the above copyright 320f91cf57Smglocker * notice, this list of conditions and the following disclaimer in 330f91cf57Smglocker * the documentation and/or other materials provided with the 340f91cf57Smglocker * distribution. 350f91cf57Smglocker * 3. Neither the name of The DragonFly Project nor the names of its 360f91cf57Smglocker * contributors may be used to endorse or promote products derived 370f91cf57Smglocker * from this software without specific, prior written permission. 380f91cf57Smglocker * 390f91cf57Smglocker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 400f91cf57Smglocker * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 410f91cf57Smglocker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 420f91cf57Smglocker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 430f91cf57Smglocker * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 440f91cf57Smglocker * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 450f91cf57Smglocker * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 460f91cf57Smglocker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 470f91cf57Smglocker * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 480f91cf57Smglocker * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 490f91cf57Smglocker * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 500f91cf57Smglocker * SUCH DAMAGE. 510f91cf57Smglocker */ 520f91cf57Smglocker 530f91cf57Smglocker #ifndef _IF_ACXVAR_H 540f91cf57Smglocker #define _IF_ACXVAR_H 550f91cf57Smglocker 560f91cf57Smglocker #ifdef ACX_DEBUG 570f91cf57Smglocker extern int acxdebug; 580f91cf57Smglocker #define DPRINTF(x) do { if (acxdebug) printf x; } while (0) 590f91cf57Smglocker #define DPRINTFN(n,x) do { if (acxdebug >= (n)) printf x; } while (0) 600f91cf57Smglocker #else 610f91cf57Smglocker #define DPRINTF(x) 620f91cf57Smglocker #define DPRINTFN(n,x) 630f91cf57Smglocker #endif 640f91cf57Smglocker 650f91cf57Smglocker #define ACX_FRAME_HDRLEN sizeof(struct ieee80211_frame) 660f91cf57Smglocker #define ACX_MEMBLOCK_SIZE 256 670f91cf57Smglocker 680f91cf57Smglocker #define ACX_TX_DESC_CNT 16 690f91cf57Smglocker #define ACX_RX_DESC_CNT 16 700f91cf57Smglocker 710f91cf57Smglocker #define ACX_TX_RING_SIZE \ 720f91cf57Smglocker (2 * ACX_TX_DESC_CNT * sizeof(struct acx_host_desc)) 730f91cf57Smglocker #define ACX_RX_RING_SIZE \ 740f91cf57Smglocker (ACX_RX_DESC_CNT * sizeof(struct acx_host_desc)) 750f91cf57Smglocker 760f91cf57Smglocker #define CSR_READ_1(sc, reg) \ 770f91cf57Smglocker bus_space_read_1((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \ 780f91cf57Smglocker (sc)->chip_ioreg[(reg)]) 790f91cf57Smglocker #define CSR_READ_2(sc, reg) \ 800f91cf57Smglocker bus_space_read_2((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \ 810f91cf57Smglocker (sc)->chip_ioreg[(reg)]) 820f91cf57Smglocker #define CSR_READ_4(sc, reg) \ 830f91cf57Smglocker bus_space_read_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \ 840f91cf57Smglocker (sc)->chip_ioreg[(reg)]) 850f91cf57Smglocker 860f91cf57Smglocker #define CSR_WRITE_2(sc, reg, val) \ 870f91cf57Smglocker bus_space_write_2((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \ 880f91cf57Smglocker (sc)->chip_ioreg[(reg)], val) 890f91cf57Smglocker #define CSR_WRITE_4(sc, reg, val) \ 900f91cf57Smglocker bus_space_write_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \ 910f91cf57Smglocker (sc)->chip_ioreg[(reg)], val) 920f91cf57Smglocker 930f91cf57Smglocker #define CSR_SETB_2(sc, reg, b) \ 940f91cf57Smglocker CSR_WRITE_2((sc), (reg), CSR_READ_2((sc), (reg)) | (b)) 950f91cf57Smglocker #define CSR_CLRB_2(sc, reg, b) \ 960f91cf57Smglocker CSR_WRITE_2((sc), (reg), CSR_READ_2((sc), (reg)) & (~(b))) 970f91cf57Smglocker 980f91cf57Smglocker #define DESC_WRITE_REGION_1(sc, off, d, dlen) \ 990f91cf57Smglocker bus_space_write_region_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \ 1000f91cf57Smglocker (off), (const uint8_t *)(d), (dlen)) 1010f91cf57Smglocker 1020f91cf57Smglocker #define FW_TXDESC_SETFIELD_1(sc, mb, field, val) \ 103280ea4a5Sclaudio bus_space_write_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \ 104280ea4a5Sclaudio (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val)) 1050f91cf57Smglocker #define FW_TXDESC_SETFIELD_2(sc, mb, field, val) \ 106280ea4a5Sclaudio bus_space_write_2((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \ 107280ea4a5Sclaudio (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val)) 1080f91cf57Smglocker #define FW_TXDESC_SETFIELD_4(sc, mb, field, val) \ 109280ea4a5Sclaudio bus_space_write_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \ 110280ea4a5Sclaudio (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val)) 1110f91cf57Smglocker 1120f91cf57Smglocker #define FW_TXDESC_GETFIELD_1(sc, mb, field) \ 113280ea4a5Sclaudio bus_space_read_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \ 114280ea4a5Sclaudio (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field)) 1150f91cf57Smglocker 1160f91cf57Smglocker /* 1170f91cf57Smglocker * Firmware TX descriptor 1180f91cf57Smglocker * Fields are little endian 1190f91cf57Smglocker */ 1200f91cf57Smglocker struct acx_fw_txdesc { 1210f91cf57Smglocker uint32_t f_tx_next_desc; /* next acx_fw_txdesc phyaddr */ 1220f91cf57Smglocker uint32_t f_tx_host_desc; /* acx_host_desc phyaddr */ 1230f91cf57Smglocker uint32_t f_tx_acx_ptr; 1240f91cf57Smglocker uint32_t f_tx_time; 1250f91cf57Smglocker uint16_t f_tx_len; 1260f91cf57Smglocker uint16_t f_tx_reserved; 1270f91cf57Smglocker 1280f91cf57Smglocker uint32_t f_tx_dev_spec[4]; 1290f91cf57Smglocker 1300f91cf57Smglocker uint8_t f_tx_ctrl; /* see DESC_CTRL_ */ 1310f91cf57Smglocker uint8_t f_tx_ctrl2; 1320f91cf57Smglocker uint8_t f_tx_error; /* see DESC_ERR_ */ 1330f91cf57Smglocker uint8_t f_tx_ack_fail; 1340f91cf57Smglocker uint8_t f_tx_rts_fail; 1350f91cf57Smglocker uint8_t f_tx_rts_ok; 1360f91cf57Smglocker 1370f91cf57Smglocker /* XXX should be moved to chip specific file */ 1380f91cf57Smglocker union { 1390f91cf57Smglocker struct { 1400f91cf57Smglocker uint8_t rate100; /* acx100 tx rate */ 1410f91cf57Smglocker uint8_t queue_ctrl; 1420f91cf57Smglocker } __packed r1; 1430f91cf57Smglocker struct { 1440f91cf57Smglocker uint16_t rate111; /* acx111 tx rate */ 1450f91cf57Smglocker } __packed r2; 1460f91cf57Smglocker } u; 1470f91cf57Smglocker #define f_tx_rate100 u.r1.rate100 1480f91cf57Smglocker #define f_tx_queue_ctrl u.r1.queue_ctrl 1490f91cf57Smglocker #define f_tx_rate111 u.r2.rate111 1500f91cf57Smglocker uint32_t f_tx_queue_info; 1510f91cf57Smglocker } __packed; 1520f91cf57Smglocker 1530f91cf57Smglocker /* 1540f91cf57Smglocker * Firmware RX descriptor 1550f91cf57Smglocker * Fields are little endian 1560f91cf57Smglocker */ 1570f91cf57Smglocker struct acx_fw_rxdesc { 1580f91cf57Smglocker uint32_t f_rx_next_desc; /* next acx_fw_rxdesc phyaddr */ 1590f91cf57Smglocker uint32_t f_rx_host_desc; /* acx_host_desc phyaddr */ 1600f91cf57Smglocker uint32_t f_rx_acx_ptr; 1610f91cf57Smglocker uint32_t f_rx_time; 1620f91cf57Smglocker uint16_t f_rx_len; 1630f91cf57Smglocker uint16_t f_rx_wep_len; 1640f91cf57Smglocker uint32_t f_rx_wep_ofs; 1650f91cf57Smglocker 1660f91cf57Smglocker uint8_t f_rx_dev_spec[16]; 1670f91cf57Smglocker 1680f91cf57Smglocker uint8_t f_rx_ctrl; /* see DESC_CTRL_ */ 1690f91cf57Smglocker uint8_t f_rx_rate; 1700f91cf57Smglocker uint8_t f_rx_error; 1710f91cf57Smglocker uint8_t f_rx_snr; /* signal noise ratio */ 1720f91cf57Smglocker uint8_t f_rx_level; 1730f91cf57Smglocker uint8_t f_rx_queue_ctrl; 1740f91cf57Smglocker uint16_t f_rx_unknown0; 1750f91cf57Smglocker uint32_t f_rx_unknown1; 1760f91cf57Smglocker } __packed; 1770f91cf57Smglocker 1780f91cf57Smglocker /* 1790f91cf57Smglocker * Host TX/RX descriptor 1800f91cf57Smglocker * Fields are little endian 1810f91cf57Smglocker */ 1820f91cf57Smglocker struct acx_host_desc { 1830f91cf57Smglocker uint32_t h_data_paddr; /* data phyaddr */ 1840f91cf57Smglocker uint16_t h_data_ofs; 1850f91cf57Smglocker uint16_t h_reserved; 1860f91cf57Smglocker uint16_t h_ctrl; /* see DESC_CTRL_ */ 1870f91cf57Smglocker uint16_t h_data_len; /* data length */ 1880f91cf57Smglocker uint32_t h_next_desc; /* next acx_host_desc phyaddr */ 1890f91cf57Smglocker uint32_t h_pnext; 1900f91cf57Smglocker uint32_t h_status; /* see DESC_STATUS_ */ 1910f91cf57Smglocker } __packed; 1920f91cf57Smglocker 1930f91cf57Smglocker #define DESC_STATUS_FULL 0x80000000 1940f91cf57Smglocker 1950f91cf57Smglocker #define DESC_CTRL_SHORT_PREAMBLE 0x01 1960f91cf57Smglocker #define DESC_CTRL_FIRST_FRAG 0x02 1970f91cf57Smglocker #define DESC_CTRL_AUTODMA 0x04 1980f91cf57Smglocker #define DESC_CTRL_RECLAIM 0x08 1990f91cf57Smglocker #define DESC_CTRL_HOSTDONE 0x20 /* host finished buf proc */ 2000f91cf57Smglocker #define DESC_CTRL_ACXDONE 0x40 /* chip finished buf proc */ 2010f91cf57Smglocker #define DESC_CTRL_HOSTOWN 0x80 /* host controls desc */ 2020f91cf57Smglocker 2030f91cf57Smglocker #define DESC_ERR_OTHER_FRAG 0x01 2040f91cf57Smglocker #define DESC_ERR_ABORT 0x02 2050f91cf57Smglocker #define DESC_ERR_PARAM 0x04 2060f91cf57Smglocker #define DESC_ERR_NO_WEPKEY 0x08 2070f91cf57Smglocker #define DESC_ERR_MSDU_TIMEOUT 0x10 2080f91cf57Smglocker #define DESC_ERR_EXCESSIVE_RETRY 0x20 2090f91cf57Smglocker #define DESC_ERR_BUF_OVERFLOW 0x40 2100f91cf57Smglocker #define DESC_ERR_DMA 0x80 2110f91cf57Smglocker 2120f91cf57Smglocker /* 2130f91cf57Smglocker * Extra header in receiving buffer 2140f91cf57Smglocker * Fields are little endian 2150f91cf57Smglocker */ 2160f91cf57Smglocker struct acx_rxbuf_hdr { 2170f91cf57Smglocker uint16_t rbh_len; /* ACX_RXBUG_LEN_MASK part is len */ 2180f91cf57Smglocker uint8_t rbh_memblk_cnt; 2190f91cf57Smglocker uint8_t rbh_status; 2200f91cf57Smglocker uint8_t rbh_stat_baseband; /* see ACX_RXBUF_STAT_ */ 2210f91cf57Smglocker uint8_t rbh_plcp; 2220f91cf57Smglocker uint8_t rbh_level; /* signal level */ 2230f91cf57Smglocker uint8_t rbh_snr; /* signal noise ratio */ 2240f91cf57Smglocker uint32_t rbh_time; /* recv timestamp */ 2250f91cf57Smglocker 2260f91cf57Smglocker /* 2270f91cf57Smglocker * XXX may have 4~8 byte here which 2280f91cf57Smglocker * depends on firmware version 2290f91cf57Smglocker */ 2300f91cf57Smglocker } __packed; 2310f91cf57Smglocker 2320f91cf57Smglocker #define ACX_RXBUF_LEN_MASK 0xfff 2330f91cf57Smglocker #define ACX_RXBUF_STAT_LNA 0x80 /* low noise amplifier */ 2340f91cf57Smglocker 2350f91cf57Smglocker struct acx_ring_data { 2360f91cf57Smglocker struct acx_host_desc *rx_ring; 2370f91cf57Smglocker bus_dma_segment_t rx_ring_seg; 2380f91cf57Smglocker bus_dmamap_t rx_ring_dmamap; 2390f91cf57Smglocker uint32_t rx_ring_paddr; 2400f91cf57Smglocker 2410f91cf57Smglocker struct acx_host_desc *tx_ring; 2420f91cf57Smglocker bus_dma_segment_t tx_ring_seg; 2430f91cf57Smglocker bus_dmamap_t tx_ring_dmamap; 2440f91cf57Smglocker uint32_t tx_ring_paddr; 2450f91cf57Smglocker }; 2460f91cf57Smglocker 2470f91cf57Smglocker struct acx_txbuf { 2480f91cf57Smglocker struct mbuf *tb_mbuf; 2490f91cf57Smglocker bus_dmamap_t tb_mbuf_dmamap; 2500f91cf57Smglocker 2510f91cf57Smglocker struct acx_host_desc *tb_desc1; 2520f91cf57Smglocker struct acx_host_desc *tb_desc2; 2530f91cf57Smglocker 2540f91cf57Smglocker uint32_t tb_fwdesc_ofs; 2550f91cf57Smglocker 2560f91cf57Smglocker /* 2570f91cf57Smglocker * Used by tx rate updating 2580f91cf57Smglocker */ 2590f91cf57Smglocker struct acx_node *tb_node; /* remote node */ 2600f91cf57Smglocker int tb_rate; /* current tx rate */ 2610f91cf57Smglocker }; 2620f91cf57Smglocker 2630f91cf57Smglocker struct acx_rxbuf { 2640f91cf57Smglocker struct mbuf *rb_mbuf; 2650f91cf57Smglocker bus_dmamap_t rb_mbuf_dmamap; 2660f91cf57Smglocker 2670f91cf57Smglocker struct acx_host_desc *rb_desc; 2680f91cf57Smglocker }; 2690f91cf57Smglocker 2700f91cf57Smglocker struct acx_buf_data { 2710f91cf57Smglocker struct acx_rxbuf rx_buf[ACX_RX_DESC_CNT]; 2720f91cf57Smglocker struct acx_txbuf tx_buf[ACX_TX_DESC_CNT]; 2730f91cf57Smglocker bus_dmamap_t mbuf_tmp_dmamap; 2740f91cf57Smglocker 2750f91cf57Smglocker int rx_scan_start; 2760f91cf57Smglocker 2770f91cf57Smglocker int tx_free_start; 2780f91cf57Smglocker int tx_used_start; 2790f91cf57Smglocker int tx_used_count; 2800f91cf57Smglocker }; 2810f91cf57Smglocker 2820f91cf57Smglocker struct acx_node { 283960b9804Smglocker struct ieee80211_node ni; /* must be first */ 284960b9804Smglocker struct ieee80211_amrr_node amn; 2850f91cf57Smglocker }; 2860f91cf57Smglocker 2870f91cf57Smglocker struct acx_config { 2880f91cf57Smglocker uint8_t antenna; 2890f91cf57Smglocker uint8_t regdom; 2900f91cf57Smglocker uint8_t cca_mode; /* acx100 */ 2910f91cf57Smglocker uint8_t ed_thresh; /* acx100 */ 2920f91cf57Smglocker }; 2930f91cf57Smglocker 2940f91cf57Smglocker struct acx_stats { 2950f91cf57Smglocker uint64_t err_oth_frag; /* XXX error in other frag?? */ 2960f91cf57Smglocker uint64_t err_abort; /* tx abortion */ 2970f91cf57Smglocker uint64_t err_param; /* tx desc contains invalid param */ 2980f91cf57Smglocker uint64_t err_no_wepkey; /* no WEP key exists */ 2990f91cf57Smglocker uint64_t err_msdu_timeout; /* MSDU timed out */ 3000f91cf57Smglocker uint64_t err_ex_retry; /* excessive tx retry */ 3010f91cf57Smglocker uint64_t err_buf_oflow; /* buffer overflow */ 3020f91cf57Smglocker uint64_t err_dma; /* DMA error */ 3030f91cf57Smglocker uint64_t err_unkn; /* XXX unknown error */ 3040f91cf57Smglocker }; 3050f91cf57Smglocker 306172cbfceSmglocker #define ACX_RX_RADIOTAP_PRESENT \ 307172cbfceSmglocker ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 308172cbfceSmglocker (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 309172cbfceSmglocker (1 << IEEE80211_RADIOTAP_RSSI)) 310172cbfceSmglocker 311172cbfceSmglocker struct acx_rx_radiotap_hdr { 312172cbfceSmglocker struct ieee80211_radiotap_header wr_ihdr; 313172cbfceSmglocker uint8_t wr_flags; 314172cbfceSmglocker uint16_t wr_chan_freq; 315172cbfceSmglocker uint16_t wr_chan_flags; 316172cbfceSmglocker uint8_t wr_rssi; 317172cbfceSmglocker uint8_t wr_max_rssi; 318172cbfceSmglocker } __packed; 319172cbfceSmglocker 320172cbfceSmglocker #define ACX_TX_RADIOTAP_PRESENT \ 321172cbfceSmglocker ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 322172cbfceSmglocker (1 << IEEE80211_RADIOTAP_RATE) | \ 323172cbfceSmglocker (1 << IEEE80211_RADIOTAP_CHANNEL)) \ 324172cbfceSmglocker 325172cbfceSmglocker struct acx_tx_radiotap_hdr { 326172cbfceSmglocker struct ieee80211_radiotap_header wt_ihdr; 327172cbfceSmglocker uint8_t wt_flags; 328172cbfceSmglocker uint8_t wt_rate; 329172cbfceSmglocker uint16_t wt_chan_freq; 330172cbfceSmglocker uint16_t wt_chan_flags; 331172cbfceSmglocker } __packed; 332172cbfceSmglocker 3330f91cf57Smglocker struct acx_softc { 3340f91cf57Smglocker /* 3350f91cf57Smglocker * sc_xxx are filled in by common code 3360f91cf57Smglocker * chip_xxx are filled in by chip specific code 3370f91cf57Smglocker */ 3380f91cf57Smglocker struct device sc_dev; 3390f91cf57Smglocker struct ieee80211com sc_ic; 3400f91cf57Smglocker 3410f91cf57Smglocker struct timeout sc_chanscan_timer; 3420f91cf57Smglocker uint32_t sc_flags; /* see ACX_FLAG_ */ 3430f91cf57Smglocker 3440f91cf57Smglocker uint32_t sc_firmware_ver; 3450f91cf57Smglocker uint32_t sc_hardware_id; 3460f91cf57Smglocker 3470f91cf57Smglocker bus_dma_tag_t sc_dmat; 3480f91cf57Smglocker 349960b9804Smglocker struct ieee80211_amrr amrr; 350960b9804Smglocker struct timeout amrr_ch; 351960b9804Smglocker 3520f91cf57Smglocker /* 3530f91cf57Smglocker * MMIO 1 3540f91cf57Smglocker */ 3550f91cf57Smglocker bus_space_tag_t sc_mem1_bt; 3560f91cf57Smglocker bus_space_handle_t sc_mem1_bh; 3570f91cf57Smglocker int chip_mem1_rid; 3580f91cf57Smglocker 3590f91cf57Smglocker /* 3600f91cf57Smglocker * MMIO 2 3610f91cf57Smglocker */ 3620f91cf57Smglocker bus_space_tag_t sc_mem2_bt; 3630f91cf57Smglocker bus_space_handle_t sc_mem2_bh; 3640f91cf57Smglocker int chip_mem2_rid; 3650f91cf57Smglocker 3660f91cf57Smglocker int (*sc_enable)(struct acx_softc *); 3670f91cf57Smglocker void (*sc_disable)(struct acx_softc *); 3680f91cf57Smglocker void (*sc_power)(struct acx_softc *, int); 3690f91cf57Smglocker 3700f91cf57Smglocker uint32_t sc_cmd; /* cmd reg (MMIO 2) */ 3710f91cf57Smglocker uint32_t sc_cmd_param; /* cmd param reg (MMIO 2) */ 3720f91cf57Smglocker uint32_t sc_info; /* unused */ 3730f91cf57Smglocker uint32_t sc_info_param; /* unused */ 3740f91cf57Smglocker 3750f91cf57Smglocker const uint16_t *chip_ioreg; /* reg map (MMIO 1) */ 3760f91cf57Smglocker 3770f91cf57Smglocker /* 3780f91cf57Smglocker * NOTE: 3790f91cf57Smglocker * chip_intr_enable is not necessarily same as 3800f91cf57Smglocker * ~chip_intr_disable 3810f91cf57Smglocker */ 3820f91cf57Smglocker uint16_t chip_intr_enable; 3830f91cf57Smglocker uint16_t chip_intr_disable; 3840f91cf57Smglocker 3850f91cf57Smglocker int chip_hw_crypt; 3860f91cf57Smglocker uint16_t chip_gpio_pled; /* power led */ 3870f91cf57Smglocker uint16_t chip_chan_flags; /* see IEEE80211_CHAN_ */ 3880f91cf57Smglocker uint16_t chip_txdesc1_len; 3890f91cf57Smglocker int chip_rxbuf_exhdr; /* based on fw ver */ 3900f91cf57Smglocker uint32_t chip_ee_eaddr_ofs; 3910f91cf57Smglocker enum ieee80211_phymode chip_phymode; /* see IEEE80211_MODE_ */ 3920f91cf57Smglocker uint8_t chip_fw_txdesc_ctrl; 3930f91cf57Smglocker 3940f91cf57Smglocker uint8_t sc_eeprom_ver; /* unused */ 3950f91cf57Smglocker uint8_t sc_form_factor; /* unused */ 3960f91cf57Smglocker uint8_t sc_radio_type; /* see ACX_RADIO_TYPE_ */ 3970f91cf57Smglocker 3980f91cf57Smglocker struct acx_ring_data sc_ring_data; 3990f91cf57Smglocker struct acx_buf_data sc_buf_data; 4000f91cf57Smglocker 4010f91cf57Smglocker struct acx_stats sc_stats; /* statistics */ 4020f91cf57Smglocker 4030f91cf57Smglocker /* 4040f91cf57Smglocker * Per interface sysctl variables 4050f91cf57Smglocker */ 40652d2b7e2Smglocker int sc_txtimer; 4070f91cf57Smglocker int sc_long_retry_limit; 4080f91cf57Smglocker int sc_short_retry_limit; 4090f91cf57Smglocker int sc_msdu_lifetime; 4100f91cf57Smglocker 4110f91cf57Smglocker int (*sc_newstate) 4120f91cf57Smglocker (struct ieee80211com *, 4130f91cf57Smglocker enum ieee80211_state, int); 4140f91cf57Smglocker 4150f91cf57Smglocker int (*chip_init) /* non-NULL */ 4160f91cf57Smglocker (struct acx_softc *); 4170f91cf57Smglocker 4180f91cf57Smglocker int (*chip_set_wepkey) 4190f91cf57Smglocker (struct acx_softc *, 42083da4af0Sdamien struct ieee80211_key *, int); 4210f91cf57Smglocker 4220f91cf57Smglocker int (*chip_read_config) 4230f91cf57Smglocker (struct acx_softc *, struct acx_config *); 4240f91cf57Smglocker 4250f91cf57Smglocker int (*chip_write_config) 4260f91cf57Smglocker (struct acx_softc *, struct acx_config *); 4270f91cf57Smglocker 4280f91cf57Smglocker void (*chip_set_fw_txdesc_rate) /* non-NULL */ 4290f91cf57Smglocker (struct acx_softc *, struct acx_txbuf *, int); 4300f91cf57Smglocker 4310f91cf57Smglocker void (*chip_set_bss_join_param) /* non-NULL */ 4320f91cf57Smglocker (struct acx_softc *, void *, int); 4330f91cf57Smglocker 4340f91cf57Smglocker void (*chip_proc_wep_rxbuf) 4350f91cf57Smglocker (struct acx_softc *, struct mbuf *, int *); 436172cbfceSmglocker 437172cbfceSmglocker #if NBPFILTER > 0 438172cbfceSmglocker caddr_t sc_drvbpf; 439172cbfceSmglocker 440172cbfceSmglocker union { 441172cbfceSmglocker struct acx_rx_radiotap_hdr th; 442172cbfceSmglocker uint8_t pad[64]; 443172cbfceSmglocker } sc_rxtapu; 444172cbfceSmglocker #define sc_rxtap sc_rxtapu.th 445172cbfceSmglocker int sc_rxtap_len; 446172cbfceSmglocker 447172cbfceSmglocker union { 448172cbfceSmglocker struct acx_tx_radiotap_hdr th; 449172cbfceSmglocker uint8_t pad[64]; 450172cbfceSmglocker } sc_txtapu; 451172cbfceSmglocker #define sc_txtap sc_txtapu.th 452172cbfceSmglocker int sc_txtap_len; 453172cbfceSmglocker #endif 4540f91cf57Smglocker }; 4550f91cf57Smglocker 4565f0637dbSjsg #define ACX_FLAG_FW_LOADED 0x01 4575f0637dbSjsg #define ACX_FLAG_ACX111 0x02 4580f91cf57Smglocker 4590f91cf57Smglocker #define ACX_RADIO_TYPE_MAXIM 0x0d 4600f91cf57Smglocker #define ACX_RADIO_TYPE_RFMD 0x11 4610f91cf57Smglocker #define ACX_RADIO_TYPE_RALINK 0x15 4620f91cf57Smglocker #define ACX_RADIO_TYPE_RADIA 0x16 4630f91cf57Smglocker #define ACX_RADIO_TYPE_UNKN17 0x17 4640f91cf57Smglocker #define ACX_RADIO_TYPE_UNKN19 0x19 4650f91cf57Smglocker 4668dc7d017Smglocker #define ACX_RADIO_RSSI_MAXIM 120 /* 100dB */ 4678dc7d017Smglocker #define ACX_RADIO_RSSI_RFMD 215 /* 215dB */ 4688dc7d017Smglocker #define ACX_RADIO_RSSI_RALINK 0 /* XXX unknown yet */ 4698dc7d017Smglocker #define ACX_RADIO_RSSI_RADIA 78 /* 78db */ 4708dc7d017Smglocker #define ACX_RADIO_RSSI_UNKN 0 /* unknown radio */ 4718dc7d017Smglocker 4720f91cf57Smglocker extern int acx_beacon_intvl; 4730f91cf57Smglocker 4740f91cf57Smglocker void acx100_set_param(struct acx_softc *); 4750f91cf57Smglocker void acx111_set_param(struct acx_softc *); 4760f91cf57Smglocker 4770f91cf57Smglocker int acx_init_tmplt_ordered(struct acx_softc *); 4780f91cf57Smglocker void acx_write_phyreg(struct acx_softc *, uint32_t, uint8_t); 4790f91cf57Smglocker 4800f91cf57Smglocker int acx_set_tmplt(struct acx_softc *, uint16_t, void *, uint16_t); 4810f91cf57Smglocker int acx_get_conf(struct acx_softc *, uint16_t, void *, uint16_t); 4820f91cf57Smglocker int acx_set_conf(struct acx_softc *, uint16_t, void *, uint16_t); 4830f91cf57Smglocker int acx_exec_command(struct acx_softc *, uint16_t, void *, uint16_t, 4840f91cf57Smglocker void *, uint16_t); 4850f91cf57Smglocker int acx_attach(struct acx_softc *); 4860f91cf57Smglocker int acx_detach(void *); 4870f91cf57Smglocker int acx_intr(void *); 4880f91cf57Smglocker 4890f91cf57Smglocker #endif /* !_IF_ACXVAR_H */ 490