Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 : : /* Copyright(c) 2018-2019 Realtek Corporation
3 : : */
4 : :
5 : : #ifndef __RTW_HCI_H__
6 : : #define __RTW_HCI_H__
7 : :
8 : : /* ops for PCI, USB and SDIO */
9 : : struct rtw_hci_ops {
10 : : int (*tx)(struct rtw_dev *rtwdev,
11 : : struct rtw_tx_pkt_info *pkt_info,
12 : : struct sk_buff *skb);
13 : : int (*setup)(struct rtw_dev *rtwdev);
14 : : int (*start)(struct rtw_dev *rtwdev);
15 : : void (*stop)(struct rtw_dev *rtwdev);
16 : : void (*deep_ps)(struct rtw_dev *rtwdev, bool enter);
17 : : void (*link_ps)(struct rtw_dev *rtwdev, bool enter);
18 : : void (*interface_cfg)(struct rtw_dev *rtwdev);
19 : :
20 : : int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
21 : : int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
22 : :
23 : : u8 (*read8)(struct rtw_dev *rtwdev, u32 addr);
24 : : u16 (*read16)(struct rtw_dev *rtwdev, u32 addr);
25 : : u32 (*read32)(struct rtw_dev *rtwdev, u32 addr);
26 : : void (*write8)(struct rtw_dev *rtwdev, u32 addr, u8 val);
27 : : void (*write16)(struct rtw_dev *rtwdev, u32 addr, u16 val);
28 : : void (*write32)(struct rtw_dev *rtwdev, u32 addr, u32 val);
29 : : };
30 : :
31 : 0 : static inline int rtw_hci_tx(struct rtw_dev *rtwdev,
32 : : struct rtw_tx_pkt_info *pkt_info,
33 : : struct sk_buff *skb)
34 : : {
35 : 0 : return rtwdev->hci.ops->tx(rtwdev, pkt_info, skb);
36 : : }
37 : :
38 : 22 : static inline int rtw_hci_setup(struct rtw_dev *rtwdev)
39 : : {
40 : 22 : return rtwdev->hci.ops->setup(rtwdev);
41 : : }
42 : :
43 : 0 : static inline int rtw_hci_start(struct rtw_dev *rtwdev)
44 : : {
45 : 0 : return rtwdev->hci.ops->start(rtwdev);
46 : : }
47 : :
48 : 9 : static inline void rtw_hci_stop(struct rtw_dev *rtwdev)
49 : : {
50 : 9 : rtwdev->hci.ops->stop(rtwdev);
51 : : }
52 : :
53 : 0 : static inline void rtw_hci_deep_ps(struct rtw_dev *rtwdev, bool enter)
54 : : {
55 : 0 : rtwdev->hci.ops->deep_ps(rtwdev, enter);
56 : 0 : }
57 : :
58 : 0 : static inline void rtw_hci_link_ps(struct rtw_dev *rtwdev, bool enter)
59 : : {
60 : 0 : rtwdev->hci.ops->link_ps(rtwdev, enter);
61 : : }
62 : :
63 : 0 : static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)
64 : : {
65 : 0 : rtwdev->hci.ops->interface_cfg(rtwdev);
66 : : }
67 : :
68 : : static inline int
69 : 380 : rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
70 : : {
71 : 380 : return rtwdev->hci.ops->write_data_rsvd_page(rtwdev, buf, size);
72 : : }
73 : :
74 : : static inline int
75 : 0 : rtw_hci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
76 : : {
77 : 0 : return rtwdev->hci.ops->write_data_h2c(rtwdev, buf, size);
78 : : }
79 : :
80 : 1962 : static inline u8 rtw_read8(struct rtw_dev *rtwdev, u32 addr)
81 : : {
82 : 1870 : return rtwdev->hci.ops->read8(rtwdev, addr);
83 : : }
84 : :
85 : 51 : static inline u16 rtw_read16(struct rtw_dev *rtwdev, u32 addr)
86 : : {
87 : 51 : return rtwdev->hci.ops->read16(rtwdev, addr);
88 : : }
89 : :
90 : 20966 : static inline u32 rtw_read32(struct rtw_dev *rtwdev, u32 addr)
91 : : {
92 : 18720 : return rtwdev->hci.ops->read32(rtwdev, addr);
93 : : }
94 : :
95 : 2548 : static inline void rtw_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)
96 : : {
97 : 2076 : rtwdev->hci.ops->write8(rtwdev, addr, val);
98 : 799 : }
99 : :
100 : 1028 : static inline void rtw_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)
101 : : {
102 : 1028 : rtwdev->hci.ops->write16(rtwdev, addr, val);
103 : 10 : }
104 : :
105 : 10923 : static inline void rtw_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)
106 : : {
107 : 10047 : rtwdev->hci.ops->write32(rtwdev, addr, val);
108 : 50 : }
109 : :
110 : 51 : static inline void rtw_write8_set(struct rtw_dev *rtwdev, u32 addr, u8 bit)
111 : : {
112 : 51 : u8 val;
113 : :
114 : 51 : val = rtw_read8(rtwdev, addr);
115 : 51 : rtw_write8(rtwdev, addr, val | bit);
116 : 10 : }
117 : :
118 : 0 : static inline void rtw_write16_set(struct rtw_dev *rtwdev, u32 addr, u16 bit)
119 : : {
120 : 0 : u16 val;
121 : :
122 : 0 : val = rtw_read16(rtwdev, addr);
123 : 0 : rtw_write16(rtwdev, addr, val | bit);
124 : : }
125 : :
126 : 66 : static inline void rtw_write32_set(struct rtw_dev *rtwdev, u32 addr, u32 bit)
127 : : {
128 : 66 : u32 val;
129 : :
130 : 66 : val = rtw_read32(rtwdev, addr);
131 : 66 : rtw_write32(rtwdev, addr, val | bit);
132 : 13 : }
133 : :
134 : 41 : static inline void rtw_write8_clr(struct rtw_dev *rtwdev, u32 addr, u8 bit)
135 : : {
136 : 41 : u8 val;
137 : :
138 : 41 : val = rtw_read8(rtwdev, addr);
139 : 41 : rtw_write8(rtwdev, addr, val & ~bit);
140 : 10 : }
141 : :
142 : : static inline void rtw_write16_clr(struct rtw_dev *rtwdev, u32 addr, u16 bit)
143 : : {
144 : : u16 val;
145 : :
146 : : val = rtw_read16(rtwdev, addr);
147 : : rtw_write16(rtwdev, addr, val & ~bit);
148 : : }
149 : :
150 : 0 : static inline void rtw_write32_clr(struct rtw_dev *rtwdev, u32 addr, u32 bit)
151 : : {
152 : 0 : u32 val;
153 : :
154 : 0 : val = rtw_read32(rtwdev, addr);
155 : 0 : rtw_write32(rtwdev, addr, val & ~bit);
156 : 0 : }
157 : :
158 : : static inline u32
159 : 0 : rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
160 : : u32 addr, u32 mask)
161 : : {
162 : 0 : unsigned long flags;
163 : 0 : u32 val;
164 : :
165 : 0 : spin_lock_irqsave(&rtwdev->rf_lock, flags);
166 : 0 : val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);
167 : 0 : spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
168 : :
169 : 0 : return val;
170 : : }
171 : :
172 : : static inline void
173 : 0 : rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
174 : : u32 addr, u32 mask, u32 data)
175 : : {
176 : 0 : unsigned long flags;
177 : :
178 : 0 : spin_lock_irqsave(&rtwdev->rf_lock, flags);
179 : 0 : rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);
180 : 0 : spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
181 : 0 : }
182 : :
183 : : static inline u32
184 : 2171 : rtw_read32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)
185 : : {
186 : 2171 : u32 shift = __ffs(mask);
187 : 2171 : u32 orig;
188 : 2171 : u32 ret;
189 : :
190 : 2171 : orig = rtw_read32(rtwdev, addr);
191 : 2171 : ret = (orig & mask) >> shift;
192 : :
193 [ + + # # : 2171 : return ret;
# # ]
194 : : }
195 : :
196 : : static inline void
197 : 9 : rtw_write32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
198 : : {
199 [ - + ]: 9 : u32 shift = __ffs(mask);
200 : 9 : u32 orig;
201 : 9 : u32 set;
202 : :
203 [ - + ]: 9 : WARN(addr & 0x3, "should be 4-byte aligned, addr = 0x%08x\n", addr);
204 : :
205 : 9 : orig = rtw_read32(rtwdev, addr);
206 : 9 : set = (orig & ~mask) | ((data << shift) & mask);
207 : 9 : rtw_write32(rtwdev, addr, set);
208 : 9 : }
209 : :
210 : : static inline void
211 : 0 : rtw_write8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u8 data)
212 : : {
213 : 0 : u32 shift;
214 : 0 : u8 orig, set;
215 : :
216 : 0 : mask &= 0xff;
217 : 0 : shift = __ffs(mask);
218 : :
219 : 0 : orig = rtw_read8(rtwdev, addr);
220 : 0 : set = (orig & ~mask) | ((data << shift) & mask);
221 : 0 : rtw_write8(rtwdev, addr, set);
222 : 0 : }
223 : :
224 : 450 : static inline enum rtw_hci_type rtw_hci_type(struct rtw_dev *rtwdev)
225 : : {
226 [ + - - - : 450 : return rtwdev->hci.type;
- - - + -
+ - + - -
- + - - ]
227 : : }
228 : :
229 : : #endif
|