xref: /freebsd/sys/dev/bwi/bwirf.h (revision 2ff63af9)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 2007 The DragonFly Project.  All rights reserved.
5  *
6  * This code is derived from software contributed to The DragonFly Project
7  * by Sepherosa Ziehau <sepherosa@gmail.com>
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in
17  *    the documentation and/or other materials provided with the
18  *    distribution.
19  * 3. Neither the name of The DragonFly Project nor the names of its
20  *    contributors may be used to endorse or promote products derived
21  *    from this software without specific, prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
27  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
31  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
33  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  * $DragonFly: src/sys/dev/netif/bwi/bwirf.h,v 1.3 2007/10/03 04:53:19 sephe Exp $
37  */
38 
39 #ifndef _BWI_RF_H
40 #define _BWI_RF_H
41 
42 int		bwi_rf_attach(struct bwi_mac *);
43 void		bwi_rf_clear_state(struct bwi_rf *);
44 
45 int		bwi_rf_map_txpower(struct bwi_mac *);
46 void		bwi_rf_lo_adjust(struct bwi_mac *, const struct bwi_tpctl *);
47 void		bwi_rf_set_chan(struct bwi_mac *, u_int, int);
48 void		bwi_rf_get_gains(struct bwi_mac *);
49 void		bwi_rf_init(struct bwi_mac *);
50 void		bwi_rf_init_bcm2050(struct bwi_mac *);
51 void		bwi_rf_init_hw_nrssi_table(struct bwi_mac *, uint16_t);
52 void		bwi_rf_set_ant_mode(struct bwi_mac *, int);
53 
54 void		bwi_rf_clear_tssi(struct bwi_mac *);
55 int		bwi_rf_get_latest_tssi(struct bwi_mac *, int8_t[], uint16_t);
56 int		bwi_rf_tssi2dbm(struct bwi_mac *, int8_t, int8_t *);
57 
58 void		bwi_rf_write(struct bwi_mac *, uint16_t, uint16_t);
59 uint16_t	bwi_rf_read(struct bwi_mac *, uint16_t);
60 
61 static __inline void
bwi_rf_off(struct bwi_mac * _mac)62 bwi_rf_off(struct bwi_mac *_mac)
63 {
64 	_mac->mac_rf.rf_off(_mac);
65 	/* TODO:LED */
66 
67 	_mac->mac_rf.rf_flags &= ~BWI_RF_F_ON;
68 }
69 
70 static __inline void
bwi_rf_on(struct bwi_mac * _mac)71 bwi_rf_on(struct bwi_mac *_mac)
72 {
73 	if (_mac->mac_rf.rf_flags & BWI_RF_F_ON)
74 		return;
75 
76 	_mac->mac_rf.rf_on(_mac);
77 	/* TODO: LED */
78 
79 	_mac->mac_rf.rf_flags |= BWI_RF_F_ON;
80 }
81 
82 static __inline void
bwi_rf_calc_nrssi_slope(struct bwi_mac * _mac)83 bwi_rf_calc_nrssi_slope(struct bwi_mac *_mac)
84 {
85 	_mac->mac_rf.rf_calc_nrssi_slope(_mac);
86 }
87 
88 static __inline void
bwi_rf_set_nrssi_thr(struct bwi_mac * _mac)89 bwi_rf_set_nrssi_thr(struct bwi_mac *_mac)
90 {
91 	_mac->mac_rf.rf_set_nrssi_thr(_mac);
92 }
93 
94 static __inline int
bwi_rf_calc_rssi(struct bwi_mac * _mac,const struct bwi_rxbuf_hdr * _hdr)95 bwi_rf_calc_rssi(struct bwi_mac *_mac, const struct bwi_rxbuf_hdr *_hdr)
96 {
97 	return _mac->mac_rf.rf_calc_rssi(_mac, _hdr);
98 }
99 
100 static __inline int
bwi_rf_calc_noise(struct bwi_mac * _mac)101 bwi_rf_calc_noise(struct bwi_mac *_mac)
102 {
103 	return _mac->mac_rf.rf_calc_noise(_mac);
104 }
105 
106 static __inline void
bwi_rf_lo_update(struct bwi_mac * _mac)107 bwi_rf_lo_update(struct bwi_mac *_mac)
108 {
109 	return _mac->mac_rf.rf_lo_update(_mac);
110 }
111 
112 #define RF_WRITE(mac, ofs, val)		bwi_rf_write((mac), (ofs), (val))
113 #define RF_READ(mac, ofs)		bwi_rf_read((mac), (ofs))
114 
115 #define RF_SETBITS(mac, ofs, bits)		\
116 	RF_WRITE((mac), (ofs), RF_READ((mac), (ofs)) | (bits))
117 #define RF_CLRBITS(mac, ofs, bits)		\
118 	RF_WRITE((mac), (ofs), RF_READ((mac), (ofs)) & ~(bits))
119 #define RF_FILT_SETBITS(mac, ofs, filt, bits)	\
120 	RF_WRITE((mac), (ofs), (RF_READ((mac), (ofs)) & (filt)) | (bits))
121 
122 #define BWI_RFR_ATTEN			0x43
123 
124 #define BWI_RFR_TXPWR			0x52
125 #define BWI_RFR_TXPWR1_MASK		__BITS(6, 4)
126 
127 #define BWI_RFR_BBP_ATTEN		0x60
128 #define BWI_RFR_BBP_ATTEN_CALIB_BIT	__BIT(0)
129 #define BWI_RFR_BBP_ATTEN_CALIB_IDX	__BITS(4, 1)
130 
131 /*
132  * TSSI -- TX power maps
133  */
134 /*
135  * http://bcm-specs.sipsolutions.net/TSSI_to_DBM_Table
136  * B PHY
137  */
138 #define BWI_TXPOWER_MAP_11B \
139 	0x4d,	0x4c,	0x4b,	0x4a,	0x4a,	0x49,	0x48,	0x47,	\
140 	0x47,	0x46,	0x45,	0x45,	0x44,	0x43,	0x42,	0x42,	\
141 	0x41,	0x40,	0x3f,	0x3e,	0x3d,	0x3c,	0x3b,	0x3a,	\
142 	0x39,	0x38,	0x37,	0x36,	0x35,	0x34,	0x32,	0x31,	\
143 	0x30,	0x2f,	0x2d,	0x2c,	0x2b,	0x29,	0x28,	0x26,	\
144 	0x25,	0x23,	0x21,	0x1f,	0x1d,	0x1a,	0x17,	0x14,	\
145 	0x10,	0x0c,	0x06,	0x00,	-7,	-7,	-7,	-7, 	\
146 	-7,	-7,	-7,	-7,	-7,	-7,	-7,	-7
147 /*
148  * http://bcm-specs.sipsolutions.net/TSSI_to_DBM_Table
149  * G PHY
150  */
151 #define BWI_TXPOWER_MAP_11G \
152 	77,	77,	77,	76,	76,	76,	75,	75,	\
153 	74,	74,	73,	73,	73,	72,	72,	71,	\
154 	71,	70,	70,	69,	68,	68,	67,	67,	\
155 	66,	65,	65,	64,	63,	63,	62,	61,	\
156 	60,	59,	58,	57,	56,	55,	54,	53,	\
157 	52,	50,	49,	47,	45,	43,	40,	37,	\
158 	33,	28,	22,	14,	5,	-7,	-20,	-20,	\
159 	-20,	-20,	-20,	-20,	-20,	-20,	-20,	-20
160 
161 #endif	/* !_BWI_RF_H */
162