Home | History | Annotate | Line # | Download | only in usb
      1 /*	$NetBSD: if_runvar.h,v 1.9 2020/06/06 13:53:43 gson Exp $	*/
      2 /*	$OpenBSD: if_runvar.h,v 1.8 2010/02/08 18:46:47 damien Exp $	*/
      3 
      4 /*-
      5  * Copyright (c) 2008,2009 Damien Bergamini <damien.bergamini (at) free.fr>
      6  *
      7  * Permission to use, copy, modify, and distribute this software for any
      8  * purpose with or without fee is hereby granted, provided that the above
      9  * copyright notice and this permission notice appear in all copies.
     10  *
     11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18  */
     19 
     20 #define RUN_MAX_RXSZ			\
     21 	4096
     22 #if 0
     23 	(sizeof(uint32_t) +		\
     24 	 sizeof(struct rt2860_rxwi) +	\
     25 	 sizeof(uint16_t) +		\
     26 	 MCLBYTES +			\
     27 	 sizeof(struct rt2870_rxd))
     28 #endif
     29 /* NB: "11" is the maximum number of padding bytes needed for Tx */
     30 #define RUN_MAX_TXSZ			\
     31 	(sizeof(struct rt2870_txd) +	\
     32 	 sizeof(struct rt2860_txwi) +	\
     33 	 MCLBYTES + 11)
     34 
     35 #define RUN_TX_TIMEOUT	5000	/* ms */
     36 
     37 #define RUN_RX_RING_COUNT	1
     38 #define RUN_TX_RING_COUNT	8
     39 
     40 #define RT2870_WCID_MAX		64
     41 #define RUN_AID2WCID(aid)	((aid) & 0xff)
     42 
     43 struct run_rx_radiotap_header {
     44 	struct ieee80211_radiotap_header wr_ihdr;
     45 	uint8_t		wr_flags;
     46 	uint8_t		wr_rate;
     47 	uint16_t	wr_chan_freq;
     48 	uint16_t	wr_chan_flags;
     49 	uint8_t		wr_dbm_antsignal;
     50 	uint8_t		wr_antenna;
     51 	uint8_t		wr_antsignal;
     52 };
     53 
     54 #define RUN_RX_RADIOTAP_PRESENT				\
     55 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
     56 	 1 << IEEE80211_RADIOTAP_RATE |			\
     57 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
     58 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
     59 	 1 << IEEE80211_RADIOTAP_ANTENNA |		\
     60 	 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
     61 
     62 struct run_tx_radiotap_header {
     63 	struct ieee80211_radiotap_header wt_ihdr;
     64 	uint8_t		wt_flags;
     65 	uint8_t		wt_rate;
     66 	uint16_t	wt_chan_freq;
     67 	uint16_t	wt_chan_flags;
     68 	uint8_t		wt_hwqueue;
     69 };
     70 
     71 #define RUN_TX_RADIOTAP_PRESENT				\
     72 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
     73 	 1 << IEEE80211_RADIOTAP_RATE |			\
     74 	 1 << IEEE80211_RADIOTAP_CHANNEL/* |		\
     75 	 1 << IEEE80211_RADIOTAP_HWQUEUE*/)
     76 
     77 struct run_softc;
     78 
     79 struct run_tx_data {
     80 	struct run_softc	*sc;
     81 	struct usbd_xfer	*xfer;
     82 	uint8_t			*buf;
     83 	uint8_t			qid;
     84 };
     85 
     86 struct run_rx_data {
     87 	struct run_softc	*sc;
     88 	struct usbd_xfer	*xfer;
     89 	uint8_t			*buf;
     90 };
     91 
     92 struct run_tx_ring {
     93 	struct run_tx_data	data[RUN_TX_RING_COUNT];
     94 	struct usbd_pipe *	pipeh;
     95 	int			cur;
     96 	volatile unsigned	queued;
     97 	uint8_t			pipe_no;
     98 };
     99 
    100 struct run_rx_ring {
    101 	struct run_rx_data	data[RUN_RX_RING_COUNT];
    102 	struct usbd_pipe *	pipeh;
    103 	uint8_t			pipe_no;
    104 };
    105 
    106 struct run_host_cmd {
    107 	void	(*cb)(struct run_softc *, void *);
    108 	uint8_t	data[256];
    109 };
    110 
    111 struct run_cmd_newstate {
    112 	enum ieee80211_state	state;
    113 	int			arg;
    114 };
    115 
    116 struct run_cmd_key {
    117 	struct ieee80211_key	key;
    118 	uint16_t		associd;
    119 };
    120 
    121 #define RUN_HOST_CMD_RING_COUNT	32
    122 struct run_host_cmd_ring {
    123 	struct run_host_cmd	cmd[RUN_HOST_CMD_RING_COUNT];
    124 	int			cur;
    125 	int			next;
    126 	int			queued;
    127 };
    128 
    129 struct run_node {
    130 	struct ieee80211_node	ni;
    131 	uint8_t			ridx[IEEE80211_RATE_MAXSIZE];
    132 	uint8_t			ctl_ridx[IEEE80211_RATE_MAXSIZE];
    133 };
    134 
    135 #define	RUN_MAXEPOUT	4
    136 
    137 struct run_softc {
    138 	device_t			sc_dev;
    139 	struct ethercom			sc_ec;
    140 #define sc_if	sc_ec.ec_if
    141 	struct ieee80211com		sc_ic;
    142 	int				(*sc_newstate)(struct ieee80211com *,
    143 					    enum ieee80211_state, int);
    144 	int				(*sc_srom_read)(struct run_softc *,
    145 					    uint16_t, uint16_t *);
    146 
    147 	kmutex_t			sc_media_mtx;	/* XXX */
    148 
    149 	struct usbd_device *		sc_udev;
    150 	struct usbd_interface *		sc_iface;
    151 
    152 	uint16_t			mac_ver;
    153 	uint16_t			mac_rev;
    154 	uint16_t			rf_rev;
    155 	uint8_t				freq;
    156 	uint8_t				ntxchains;
    157 	uint8_t				nrxchains;
    158 	int				fixed_ridx;
    159 
    160 	uint8_t				bbp25;
    161 	uint8_t				bbp26;
    162 	uint8_t				rf24_20mhz;
    163 	uint8_t				rf24_40mhz;
    164 	uint8_t				patch_dac;
    165 	uint8_t				rfswitch;
    166 	uint8_t				ext_2ghz_lna;
    167 	uint8_t				ext_5ghz_lna;
    168 	uint8_t				calib_2ghz;
    169 	uint8_t				calib_5ghz;
    170 	uint8_t				txmixgain_2ghz;
    171 	uint8_t				txmixgain_5ghz;
    172 	int8_t				txpow1[54];
    173 	int8_t				txpow2[54];
    174 	int8_t				txpow3[54];
    175 	int8_t				rssi_2ghz[3];
    176 	int8_t				rssi_5ghz[3];
    177 	uint8_t				lna[4];
    178 
    179 	struct {
    180 		uint8_t	reg;
    181 		uint8_t	val;
    182 	}				bbp[10], rf[10];
    183 	uint8_t				leds;
    184 	uint16_t			led[3];
    185 	uint32_t			txpow20mhz[5];
    186 	uint32_t			txpow40mhz_2ghz[5];
    187 	uint32_t			txpow40mhz_5ghz[5];
    188 
    189 	struct usb_task			sc_task;
    190 
    191 	struct ieee80211_amrr		amrr;
    192 	struct ieee80211_amrr_node	amn;
    193 
    194 	callout_t			scan_to;
    195 	callout_t			calib_to;
    196 
    197 	struct run_rx_ring		rxq;
    198 	struct run_tx_ring		txq[RUN_MAXEPOUT];
    199 	struct run_host_cmd_ring	cmdq;
    200 	uint8_t				qfullmsk;
    201 	int				sc_tx_timer;
    202 	struct ieee80211_beacon_offsets	sc_bo;
    203 	int				sc_flags;
    204 #define RUN_FWLOADED		(1 << 0)
    205 #define RUN_DETACHING		(1 << 1)
    206 #define RUN_USE_BLOCK_WRITE	(1 << 2)
    207 
    208 	struct bpf_if *			sc_drvbpf;
    209 
    210 	union {
    211 		struct run_rx_radiotap_header th;
    212 		uint8_t	pad[64];
    213 	}				sc_rxtapu;
    214 #define sc_rxtap	sc_rxtapu.th
    215 	int				sc_rxtap_len;
    216 
    217 	union {
    218 		struct run_tx_radiotap_header th;
    219 		uint8_t	pad[64];
    220 	}				sc_txtapu;
    221 #define sc_txtap	sc_txtapu.th
    222 	int				sc_txtap_len;
    223 };
    224