xref: /linux/drivers/net/wireless/realtek/rtw88/hci.h (revision 002a5db9a52a0e7af0fa9a450d31049748435748)
1e3037485SYan-Hsuan Chuang /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2e3037485SYan-Hsuan Chuang /* Copyright(c) 2018-2019  Realtek Corporation
3e3037485SYan-Hsuan Chuang  */
4e3037485SYan-Hsuan Chuang 
5e3037485SYan-Hsuan Chuang #ifndef	__RTW_HCI_H__
6e3037485SYan-Hsuan Chuang #define __RTW_HCI_H__
7e3037485SYan-Hsuan Chuang 
8e3037485SYan-Hsuan Chuang /* ops for PCI, USB and SDIO */
9e3037485SYan-Hsuan Chuang struct rtw_hci_ops {
10aaab5d0eSYan-Hsuan Chuang 	int (*tx_write)(struct rtw_dev *rtwdev,
11e3037485SYan-Hsuan Chuang 			struct rtw_tx_pkt_info *pkt_info,
12e3037485SYan-Hsuan Chuang 			struct sk_buff *skb);
13aaab5d0eSYan-Hsuan Chuang 	void (*tx_kick_off)(struct rtw_dev *rtwdev);
147b33ec8bSZong-Zhe Yang 	void (*flush_queues)(struct rtw_dev *rtwdev, u32 queues, bool drop);
15e3037485SYan-Hsuan Chuang 	int (*setup)(struct rtw_dev *rtwdev);
16e3037485SYan-Hsuan Chuang 	int (*start)(struct rtw_dev *rtwdev);
17e3037485SYan-Hsuan Chuang 	void (*stop)(struct rtw_dev *rtwdev);
1827e117e4SYan-Hsuan Chuang 	void (*deep_ps)(struct rtw_dev *rtwdev, bool enter);
193dff7c6eSYan-Hsuan Chuang 	void (*link_ps)(struct rtw_dev *rtwdev, bool enter);
2078622104SYan-Hsuan Chuang 	void (*interface_cfg)(struct rtw_dev *rtwdev);
21002a5db9SBitterblue Smith 	void (*dynamic_rx_agg)(struct rtw_dev *rtwdev, bool enable);
22e3037485SYan-Hsuan Chuang 
23e3037485SYan-Hsuan Chuang 	int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
24e3037485SYan-Hsuan Chuang 	int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
25e3037485SYan-Hsuan Chuang 
26e3037485SYan-Hsuan Chuang 	u8 (*read8)(struct rtw_dev *rtwdev, u32 addr);
27e3037485SYan-Hsuan Chuang 	u16 (*read16)(struct rtw_dev *rtwdev, u32 addr);
28e3037485SYan-Hsuan Chuang 	u32 (*read32)(struct rtw_dev *rtwdev, u32 addr);
29e3037485SYan-Hsuan Chuang 	void (*write8)(struct rtw_dev *rtwdev, u32 addr, u8 val);
30e3037485SYan-Hsuan Chuang 	void (*write16)(struct rtw_dev *rtwdev, u32 addr, u16 val);
31e3037485SYan-Hsuan Chuang 	void (*write32)(struct rtw_dev *rtwdev, u32 addr, u32 val);
32e3037485SYan-Hsuan Chuang };
33e3037485SYan-Hsuan Chuang 
34aaab5d0eSYan-Hsuan Chuang static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,
35e3037485SYan-Hsuan Chuang 				   struct rtw_tx_pkt_info *pkt_info,
36e3037485SYan-Hsuan Chuang 				   struct sk_buff *skb)
37e3037485SYan-Hsuan Chuang {
38aaab5d0eSYan-Hsuan Chuang 	return rtwdev->hci.ops->tx_write(rtwdev, pkt_info, skb);
39aaab5d0eSYan-Hsuan Chuang }
40aaab5d0eSYan-Hsuan Chuang 
41aaab5d0eSYan-Hsuan Chuang static inline void rtw_hci_tx_kick_off(struct rtw_dev *rtwdev)
42aaab5d0eSYan-Hsuan Chuang {
43aaab5d0eSYan-Hsuan Chuang 	return rtwdev->hci.ops->tx_kick_off(rtwdev);
44e3037485SYan-Hsuan Chuang }
45e3037485SYan-Hsuan Chuang 
46e3037485SYan-Hsuan Chuang static inline int rtw_hci_setup(struct rtw_dev *rtwdev)
47e3037485SYan-Hsuan Chuang {
48e3037485SYan-Hsuan Chuang 	return rtwdev->hci.ops->setup(rtwdev);
49e3037485SYan-Hsuan Chuang }
50e3037485SYan-Hsuan Chuang 
51e3037485SYan-Hsuan Chuang static inline int rtw_hci_start(struct rtw_dev *rtwdev)
52e3037485SYan-Hsuan Chuang {
53e3037485SYan-Hsuan Chuang 	return rtwdev->hci.ops->start(rtwdev);
54e3037485SYan-Hsuan Chuang }
55e3037485SYan-Hsuan Chuang 
56e3037485SYan-Hsuan Chuang static inline void rtw_hci_stop(struct rtw_dev *rtwdev)
57e3037485SYan-Hsuan Chuang {
58e3037485SYan-Hsuan Chuang 	rtwdev->hci.ops->stop(rtwdev);
59e3037485SYan-Hsuan Chuang }
60e3037485SYan-Hsuan Chuang 
6127e117e4SYan-Hsuan Chuang static inline void rtw_hci_deep_ps(struct rtw_dev *rtwdev, bool enter)
6227e117e4SYan-Hsuan Chuang {
6327e117e4SYan-Hsuan Chuang 	rtwdev->hci.ops->deep_ps(rtwdev, enter);
6427e117e4SYan-Hsuan Chuang }
6527e117e4SYan-Hsuan Chuang 
663dff7c6eSYan-Hsuan Chuang static inline void rtw_hci_link_ps(struct rtw_dev *rtwdev, bool enter)
673dff7c6eSYan-Hsuan Chuang {
683dff7c6eSYan-Hsuan Chuang 	rtwdev->hci.ops->link_ps(rtwdev, enter);
693dff7c6eSYan-Hsuan Chuang }
703dff7c6eSYan-Hsuan Chuang 
7178622104SYan-Hsuan Chuang static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)
7278622104SYan-Hsuan Chuang {
7378622104SYan-Hsuan Chuang 	rtwdev->hci.ops->interface_cfg(rtwdev);
7478622104SYan-Hsuan Chuang }
7578622104SYan-Hsuan Chuang 
76002a5db9SBitterblue Smith static inline void rtw_hci_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
77002a5db9SBitterblue Smith {
78002a5db9SBitterblue Smith 	if (rtwdev->hci.ops->dynamic_rx_agg)
79002a5db9SBitterblue Smith 		rtwdev->hci.ops->dynamic_rx_agg(rtwdev, enable);
80002a5db9SBitterblue Smith }
81002a5db9SBitterblue Smith 
82e3037485SYan-Hsuan Chuang static inline int
83e3037485SYan-Hsuan Chuang rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
84e3037485SYan-Hsuan Chuang {
85e3037485SYan-Hsuan Chuang 	return rtwdev->hci.ops->write_data_rsvd_page(rtwdev, buf, size);
86e3037485SYan-Hsuan Chuang }
87e3037485SYan-Hsuan Chuang 
88e3037485SYan-Hsuan Chuang static inline int
89e3037485SYan-Hsuan Chuang rtw_hci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
90e3037485SYan-Hsuan Chuang {
91e3037485SYan-Hsuan Chuang 	return rtwdev->hci.ops->write_data_h2c(rtwdev, buf, size);
92e3037485SYan-Hsuan Chuang }
93e3037485SYan-Hsuan Chuang 
94e3037485SYan-Hsuan Chuang static inline u8 rtw_read8(struct rtw_dev *rtwdev, u32 addr)
95e3037485SYan-Hsuan Chuang {
96e3037485SYan-Hsuan Chuang 	return rtwdev->hci.ops->read8(rtwdev, addr);
97e3037485SYan-Hsuan Chuang }
98e3037485SYan-Hsuan Chuang 
99e3037485SYan-Hsuan Chuang static inline u16 rtw_read16(struct rtw_dev *rtwdev, u32 addr)
100e3037485SYan-Hsuan Chuang {
101e3037485SYan-Hsuan Chuang 	return rtwdev->hci.ops->read16(rtwdev, addr);
102e3037485SYan-Hsuan Chuang }
103e3037485SYan-Hsuan Chuang 
104e3037485SYan-Hsuan Chuang static inline u32 rtw_read32(struct rtw_dev *rtwdev, u32 addr)
105e3037485SYan-Hsuan Chuang {
106e3037485SYan-Hsuan Chuang 	return rtwdev->hci.ops->read32(rtwdev, addr);
107e3037485SYan-Hsuan Chuang }
108e3037485SYan-Hsuan Chuang 
109e3037485SYan-Hsuan Chuang static inline void rtw_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)
110e3037485SYan-Hsuan Chuang {
111e3037485SYan-Hsuan Chuang 	rtwdev->hci.ops->write8(rtwdev, addr, val);
112e3037485SYan-Hsuan Chuang }
113e3037485SYan-Hsuan Chuang 
114e3037485SYan-Hsuan Chuang static inline void rtw_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)
115e3037485SYan-Hsuan Chuang {
116e3037485SYan-Hsuan Chuang 	rtwdev->hci.ops->write16(rtwdev, addr, val);
117e3037485SYan-Hsuan Chuang }
118e3037485SYan-Hsuan Chuang 
119e3037485SYan-Hsuan Chuang static inline void rtw_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)
120e3037485SYan-Hsuan Chuang {
121e3037485SYan-Hsuan Chuang 	rtwdev->hci.ops->write32(rtwdev, addr, val);
122e3037485SYan-Hsuan Chuang }
123e3037485SYan-Hsuan Chuang 
124e3037485SYan-Hsuan Chuang static inline void rtw_write8_set(struct rtw_dev *rtwdev, u32 addr, u8 bit)
125e3037485SYan-Hsuan Chuang {
126e3037485SYan-Hsuan Chuang 	u8 val;
127e3037485SYan-Hsuan Chuang 
128e3037485SYan-Hsuan Chuang 	val = rtw_read8(rtwdev, addr);
129e3037485SYan-Hsuan Chuang 	rtw_write8(rtwdev, addr, val | bit);
130e3037485SYan-Hsuan Chuang }
131e3037485SYan-Hsuan Chuang 
1324a36de39STzu-En Huang static inline void rtw_write16_set(struct rtw_dev *rtwdev, u32 addr, u16 bit)
133e3037485SYan-Hsuan Chuang {
134e3037485SYan-Hsuan Chuang 	u16 val;
135e3037485SYan-Hsuan Chuang 
136e3037485SYan-Hsuan Chuang 	val = rtw_read16(rtwdev, addr);
137e3037485SYan-Hsuan Chuang 	rtw_write16(rtwdev, addr, val | bit);
138e3037485SYan-Hsuan Chuang }
139e3037485SYan-Hsuan Chuang 
140e3037485SYan-Hsuan Chuang static inline void rtw_write32_set(struct rtw_dev *rtwdev, u32 addr, u32 bit)
141e3037485SYan-Hsuan Chuang {
142e3037485SYan-Hsuan Chuang 	u32 val;
143e3037485SYan-Hsuan Chuang 
144e3037485SYan-Hsuan Chuang 	val = rtw_read32(rtwdev, addr);
145e3037485SYan-Hsuan Chuang 	rtw_write32(rtwdev, addr, val | bit);
146e3037485SYan-Hsuan Chuang }
147e3037485SYan-Hsuan Chuang 
148e3037485SYan-Hsuan Chuang static inline void rtw_write8_clr(struct rtw_dev *rtwdev, u32 addr, u8 bit)
149e3037485SYan-Hsuan Chuang {
150e3037485SYan-Hsuan Chuang 	u8 val;
151e3037485SYan-Hsuan Chuang 
152e3037485SYan-Hsuan Chuang 	val = rtw_read8(rtwdev, addr);
153e3037485SYan-Hsuan Chuang 	rtw_write8(rtwdev, addr, val & ~bit);
154e3037485SYan-Hsuan Chuang }
155e3037485SYan-Hsuan Chuang 
156e3037485SYan-Hsuan Chuang static inline void rtw_write16_clr(struct rtw_dev *rtwdev, u32 addr, u16 bit)
157e3037485SYan-Hsuan Chuang {
158e3037485SYan-Hsuan Chuang 	u16 val;
159e3037485SYan-Hsuan Chuang 
160e3037485SYan-Hsuan Chuang 	val = rtw_read16(rtwdev, addr);
161e3037485SYan-Hsuan Chuang 	rtw_write16(rtwdev, addr, val & ~bit);
162e3037485SYan-Hsuan Chuang }
163e3037485SYan-Hsuan Chuang 
164e3037485SYan-Hsuan Chuang static inline void rtw_write32_clr(struct rtw_dev *rtwdev, u32 addr, u32 bit)
165e3037485SYan-Hsuan Chuang {
166e3037485SYan-Hsuan Chuang 	u32 val;
167e3037485SYan-Hsuan Chuang 
168e3037485SYan-Hsuan Chuang 	val = rtw_read32(rtwdev, addr);
169e3037485SYan-Hsuan Chuang 	rtw_write32(rtwdev, addr, val & ~bit);
170e3037485SYan-Hsuan Chuang }
171e3037485SYan-Hsuan Chuang 
172e3037485SYan-Hsuan Chuang static inline u32
173e3037485SYan-Hsuan Chuang rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
174e3037485SYan-Hsuan Chuang 	    u32 addr, u32 mask)
175e3037485SYan-Hsuan Chuang {
176e3037485SYan-Hsuan Chuang 	u32 val;
177e3037485SYan-Hsuan Chuang 
178d57ca103SSascha Hauer 	lockdep_assert_held(&rtwdev->mutex);
179d57ca103SSascha Hauer 
180e3037485SYan-Hsuan Chuang 	val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);
181e3037485SYan-Hsuan Chuang 
182e3037485SYan-Hsuan Chuang 	return val;
183e3037485SYan-Hsuan Chuang }
184e3037485SYan-Hsuan Chuang 
185e3037485SYan-Hsuan Chuang static inline void
186e3037485SYan-Hsuan Chuang rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
187e3037485SYan-Hsuan Chuang 	     u32 addr, u32 mask, u32 data)
188e3037485SYan-Hsuan Chuang {
189d57ca103SSascha Hauer 	lockdep_assert_held(&rtwdev->mutex);
190e3037485SYan-Hsuan Chuang 
191e3037485SYan-Hsuan Chuang 	rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);
192e3037485SYan-Hsuan Chuang }
193e3037485SYan-Hsuan Chuang 
194e3037485SYan-Hsuan Chuang static inline u32
195e3037485SYan-Hsuan Chuang rtw_read32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)
196e3037485SYan-Hsuan Chuang {
197e3037485SYan-Hsuan Chuang 	u32 shift = __ffs(mask);
198e3037485SYan-Hsuan Chuang 	u32 orig;
199e3037485SYan-Hsuan Chuang 	u32 ret;
200e3037485SYan-Hsuan Chuang 
201e3037485SYan-Hsuan Chuang 	orig = rtw_read32(rtwdev, addr);
202e3037485SYan-Hsuan Chuang 	ret = (orig & mask) >> shift;
203e3037485SYan-Hsuan Chuang 
204e3037485SYan-Hsuan Chuang 	return ret;
205e3037485SYan-Hsuan Chuang }
206e3037485SYan-Hsuan Chuang 
2079e01c070SYan-Hsuan Chuang static inline u16
2089e01c070SYan-Hsuan Chuang rtw_read16_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)
2099e01c070SYan-Hsuan Chuang {
2109e01c070SYan-Hsuan Chuang 	u32 shift = __ffs(mask);
2119e01c070SYan-Hsuan Chuang 	u32 orig;
2129e01c070SYan-Hsuan Chuang 	u32 ret;
2139e01c070SYan-Hsuan Chuang 
2149e01c070SYan-Hsuan Chuang 	orig = rtw_read16(rtwdev, addr);
2159e01c070SYan-Hsuan Chuang 	ret = (orig & mask) >> shift;
2169e01c070SYan-Hsuan Chuang 
2179e01c070SYan-Hsuan Chuang 	return ret;
2189e01c070SYan-Hsuan Chuang }
2199e01c070SYan-Hsuan Chuang 
2209e01c070SYan-Hsuan Chuang static inline u8
2219e01c070SYan-Hsuan Chuang rtw_read8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)
2229e01c070SYan-Hsuan Chuang {
2239e01c070SYan-Hsuan Chuang 	u32 shift = __ffs(mask);
2249e01c070SYan-Hsuan Chuang 	u32 orig;
2259e01c070SYan-Hsuan Chuang 	u32 ret;
2269e01c070SYan-Hsuan Chuang 
2279e01c070SYan-Hsuan Chuang 	orig = rtw_read8(rtwdev, addr);
2289e01c070SYan-Hsuan Chuang 	ret = (orig & mask) >> shift;
2299e01c070SYan-Hsuan Chuang 
2309e01c070SYan-Hsuan Chuang 	return ret;
2319e01c070SYan-Hsuan Chuang }
2329e01c070SYan-Hsuan Chuang 
233e3037485SYan-Hsuan Chuang static inline void
234e3037485SYan-Hsuan Chuang rtw_write32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
235e3037485SYan-Hsuan Chuang {
236e3037485SYan-Hsuan Chuang 	u32 shift = __ffs(mask);
237e3037485SYan-Hsuan Chuang 	u32 orig;
238e3037485SYan-Hsuan Chuang 	u32 set;
239e3037485SYan-Hsuan Chuang 
240e3037485SYan-Hsuan Chuang 	WARN(addr & 0x3, "should be 4-byte aligned, addr = 0x%08x\n", addr);
241e3037485SYan-Hsuan Chuang 
242e3037485SYan-Hsuan Chuang 	orig = rtw_read32(rtwdev, addr);
243e3037485SYan-Hsuan Chuang 	set = (orig & ~mask) | ((data << shift) & mask);
244e3037485SYan-Hsuan Chuang 	rtw_write32(rtwdev, addr, set);
245e3037485SYan-Hsuan Chuang }
246e3037485SYan-Hsuan Chuang 
247e3037485SYan-Hsuan Chuang static inline void
248e3037485SYan-Hsuan Chuang rtw_write8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u8 data)
249e3037485SYan-Hsuan Chuang {
250e3037485SYan-Hsuan Chuang 	u32 shift;
251e3037485SYan-Hsuan Chuang 	u8 orig, set;
252e3037485SYan-Hsuan Chuang 
253e3037485SYan-Hsuan Chuang 	mask &= 0xff;
254e3037485SYan-Hsuan Chuang 	shift = __ffs(mask);
255e3037485SYan-Hsuan Chuang 
256e3037485SYan-Hsuan Chuang 	orig = rtw_read8(rtwdev, addr);
257e3037485SYan-Hsuan Chuang 	set = (orig & ~mask) | ((data << shift) & mask);
258e3037485SYan-Hsuan Chuang 	rtw_write8(rtwdev, addr, set);
259e3037485SYan-Hsuan Chuang }
260e3037485SYan-Hsuan Chuang 
261e3037485SYan-Hsuan Chuang static inline enum rtw_hci_type rtw_hci_type(struct rtw_dev *rtwdev)
262e3037485SYan-Hsuan Chuang {
263e3037485SYan-Hsuan Chuang 	return rtwdev->hci.type;
264e3037485SYan-Hsuan Chuang }
265e3037485SYan-Hsuan Chuang 
2667b33ec8bSZong-Zhe Yang static inline void rtw_hci_flush_queues(struct rtw_dev *rtwdev, u32 queues,
2677b33ec8bSZong-Zhe Yang 					bool drop)
2687b33ec8bSZong-Zhe Yang {
2697b33ec8bSZong-Zhe Yang 	if (rtwdev->hci.ops->flush_queues)
2707b33ec8bSZong-Zhe Yang 		rtwdev->hci.ops->flush_queues(rtwdev, queues, drop);
2717b33ec8bSZong-Zhe Yang }
2727b33ec8bSZong-Zhe Yang 
2737b33ec8bSZong-Zhe Yang static inline void rtw_hci_flush_all_queues(struct rtw_dev *rtwdev, bool drop)
2747b33ec8bSZong-Zhe Yang {
2757b33ec8bSZong-Zhe Yang 	if (rtwdev->hci.ops->flush_queues)
2767b33ec8bSZong-Zhe Yang 		rtwdev->hci.ops->flush_queues(rtwdev,
2777b33ec8bSZong-Zhe Yang 					      BIT(rtwdev->hw->queues) - 1,
2787b33ec8bSZong-Zhe Yang 					      drop);
2797b33ec8bSZong-Zhe Yang }
2807b33ec8bSZong-Zhe Yang 
281e3037485SYan-Hsuan Chuang #endif
282