summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/rtwn/if_rtwnreg.h
blob: 00903d884bcb996eafbdb73131840b4ca5e433ca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*-
 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
 * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $
 * $FreeBSD$
 */

#ifndef IF_RTWNREG_H
#define IF_RTWNREG_H

#define R92C_MIN_TX_PWR		0x00
#define R92C_MAX_TX_PWR		0x3f

#define R92C_H2C_NBOX		4


/* Common part of Tx descriptor (named only!). */
struct rtwn_tx_desc_common {
	uint16_t	pktlen;
	uint8_t		offset;
	uint8_t		flags0;
#define RTWN_FLAGS0_OWN	0x80

	uint32_t	txdw1;
/* NB: qsel is shared too; however, it looks better at the lower level */
#define RTWN_TXDW1_CIPHER_M	0x00c00000
#define RTWN_TXDW1_CIPHER_S	22
#define RTWN_TXDW1_CIPHER_NONE	0
#define RTWN_TXDW1_CIPHER_RC4	1
#define RTWN_TXDW1_CIPHER_SM4	2
#define RTWN_TXDW1_CIPHER_AES	3

	uint32_t	reserved[5];

	union txdw7_shared {
		uint16_t	usb_checksum;
		uint16_t	pci_txbufsize;
	} txdw7;
} __packed __attribute__((aligned(4)));

/* Common part of Rx descriptor. */
struct rtwn_rx_stat_common {
	uint32_t	rxdw0;
#define RTWN_RXDW0_PKTLEN_M	0x00003fff
#define RTWN_RXDW0_PKTLEN_S	0
#define RTWN_RXDW0_CRCERR	0x00004000
#define RTWN_RXDW0_ICVERR	0x00008000
#define RTWN_RXDW0_INFOSZ_M	0x000f0000
#define RTWN_RXDW0_INFOSZ_S	16
#define RTWN_RXDW0_CIPHER_M	0x00700000
#define RTWN_RXDW0_CIPHER_S	20
#define RTWN_RXDW0_QOS		0x00800000
#define RTWN_RXDW0_SHIFT_M	0x03000000
#define RTWN_RXDW0_SHIFT_S	24
#define RTWN_RXDW0_PHYST	0x04000000
#define RTWN_RXDW0_SWDEC	0x08000000
#define RTWN_RXDW0_LS		0x10000000
#define RTWN_RXDW0_FS		0x20000000
#define RTWN_RXDW0_EOR		0x40000000
#define RTWN_RXDW0_OWN		0x80000000

	uint32_t	rxdw1;
#define RTWN_RXDW1_AMSDU	0x00002000
#define RTWN_RXDW1_MC		0x40000000
#define RTWN_RXDW1_BC		0x80000000

	uint32_t	rxdw2;
	uint32_t	rxdw3;
#define RTWN_RXDW3_HTC		0x00000400
#define RTWN_RXDW3_BSSID01_FIT_M 0x00003000
#define RTWN_RXDW3_BSSID01_FIT_S 12

	uint32_t	rxdw4;
	uint32_t	tsf_low;
} __packed __attribute__((aligned(4)));

/* Rx descriptor for PCIe devices. */
struct rtwn_rx_stat_pci {
	uint32_t	rxdw0;
	uint32_t	rxdw1;
	uint32_t	rxdw2;
	uint32_t	rxdw3;
	uint32_t	rxdw4;
	uint32_t	tsf_low;

	uint32_t	rxbufaddr;
	uint32_t	rxbufaddr64;
} __packed __attribute__((aligned(4)));

/*
 * Macros to access subfields in registers.
 */
/* Mask and Shift (getter). */
#define MS(val, field)							\
	(((val) & field##_M) >> field##_S)

/* Shift and Mask (setter). */
#define SM(field, val)							\
	(((val) << field##_S) & field##_M)

/* Rewrite. */
#define RW(var, field, val)						\
	(((var) & ~field##_M) | SM(field, val))


#define RTWN_MAX_CONDITIONS	3

/*
 * Structure for MAC initialization values.
 */
struct rtwn_mac_prog {
	uint16_t	reg;
	uint8_t		val;
};

/*
 * Structure for baseband initialization values.
 */
struct rtwn_bb_prog {
	int		count;
	const uint16_t	*reg;
	const uint32_t	*val;
	const uint8_t	cond[RTWN_MAX_CONDITIONS];
	const struct rtwn_bb_prog *next;
};

struct rtwn_agc_prog {
	int		count;
	const uint32_t	*val;
	const uint8_t	cond[RTWN_MAX_CONDITIONS];
	const struct rtwn_agc_prog *next;
};

/*
 * Structure for RF initialization values.
 */
struct rtwn_rf_prog {
	int		count;
	const uint8_t	*reg;
	const uint32_t	*val;
	const uint8_t	cond[RTWN_MAX_CONDITIONS];
	const struct rtwn_rf_prog *next;
};


/* XXX move to net80211. */
static __inline int
rtwn_chan2centieee(const struct ieee80211_channel *c)
{
	int chan;

	chan = c->ic_ieee;
	if (c->ic_extieee != 0)
		chan = (chan + c->ic_extieee) / 2;

	return (chan);
}

#endif	/* IF_RTWNREG_H */