brintos

brintos / linux-shallow public Read only

0
0
Text · 6.4 KiB · 96aeda2 Raw
282 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */2/* Copyright(c) 2018-2019  Realtek Corporation3 */4 5#ifndef	__RTW_HCI_H__6#define __RTW_HCI_H__7 8/* ops for PCI, USB and SDIO */9struct rtw_hci_ops {10	int (*tx_write)(struct rtw_dev *rtwdev,11			struct rtw_tx_pkt_info *pkt_info,12			struct sk_buff *skb);13	void (*tx_kick_off)(struct rtw_dev *rtwdev);14	void (*flush_queues)(struct rtw_dev *rtwdev, u32 queues, bool drop);15	int (*setup)(struct rtw_dev *rtwdev);16	int (*start)(struct rtw_dev *rtwdev);17	void (*stop)(struct rtw_dev *rtwdev);18	void (*deep_ps)(struct rtw_dev *rtwdev, bool enter);19	void (*link_ps)(struct rtw_dev *rtwdev, bool enter);20	void (*interface_cfg)(struct rtw_dev *rtwdev);21	void (*dynamic_rx_agg)(struct rtw_dev *rtwdev, bool enable);22 23	int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);24	int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);25 26	u8 (*read8)(struct rtw_dev *rtwdev, u32 addr);27	u16 (*read16)(struct rtw_dev *rtwdev, u32 addr);28	u32 (*read32)(struct rtw_dev *rtwdev, u32 addr);29	void (*write8)(struct rtw_dev *rtwdev, u32 addr, u8 val);30	void (*write16)(struct rtw_dev *rtwdev, u32 addr, u16 val);31	void (*write32)(struct rtw_dev *rtwdev, u32 addr, u32 val);32};33 34static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,35				   struct rtw_tx_pkt_info *pkt_info,36				   struct sk_buff *skb)37{38	return rtwdev->hci.ops->tx_write(rtwdev, pkt_info, skb);39}40 41static inline void rtw_hci_tx_kick_off(struct rtw_dev *rtwdev)42{43	return rtwdev->hci.ops->tx_kick_off(rtwdev);44}45 46static inline int rtw_hci_setup(struct rtw_dev *rtwdev)47{48	return rtwdev->hci.ops->setup(rtwdev);49}50 51static inline int rtw_hci_start(struct rtw_dev *rtwdev)52{53	return rtwdev->hci.ops->start(rtwdev);54}55 56static inline void rtw_hci_stop(struct rtw_dev *rtwdev)57{58	rtwdev->hci.ops->stop(rtwdev);59}60 61static inline void rtw_hci_deep_ps(struct rtw_dev *rtwdev, bool enter)62{63	rtwdev->hci.ops->deep_ps(rtwdev, enter);64}65 66static inline void rtw_hci_link_ps(struct rtw_dev *rtwdev, bool enter)67{68	rtwdev->hci.ops->link_ps(rtwdev, enter);69}70 71static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)72{73	rtwdev->hci.ops->interface_cfg(rtwdev);74}75 76static inline void rtw_hci_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)77{78	if (rtwdev->hci.ops->dynamic_rx_agg)79		rtwdev->hci.ops->dynamic_rx_agg(rtwdev, enable);80}81 82static inline int83rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)84{85	return rtwdev->hci.ops->write_data_rsvd_page(rtwdev, buf, size);86}87 88static inline int89rtw_hci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)90{91	return rtwdev->hci.ops->write_data_h2c(rtwdev, buf, size);92}93 94static inline u8 rtw_read8(struct rtw_dev *rtwdev, u32 addr)95{96	return rtwdev->hci.ops->read8(rtwdev, addr);97}98 99static inline u16 rtw_read16(struct rtw_dev *rtwdev, u32 addr)100{101	return rtwdev->hci.ops->read16(rtwdev, addr);102}103 104static inline u32 rtw_read32(struct rtw_dev *rtwdev, u32 addr)105{106	return rtwdev->hci.ops->read32(rtwdev, addr);107}108 109static inline void rtw_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)110{111	rtwdev->hci.ops->write8(rtwdev, addr, val);112}113 114static inline void rtw_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)115{116	rtwdev->hci.ops->write16(rtwdev, addr, val);117}118 119static inline void rtw_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)120{121	rtwdev->hci.ops->write32(rtwdev, addr, val);122}123 124static inline void rtw_write8_set(struct rtw_dev *rtwdev, u32 addr, u8 bit)125{126	u8 val;127 128	val = rtw_read8(rtwdev, addr);129	rtw_write8(rtwdev, addr, val | bit);130}131 132static inline void rtw_write16_set(struct rtw_dev *rtwdev, u32 addr, u16 bit)133{134	u16 val;135 136	val = rtw_read16(rtwdev, addr);137	rtw_write16(rtwdev, addr, val | bit);138}139 140static inline void rtw_write32_set(struct rtw_dev *rtwdev, u32 addr, u32 bit)141{142	u32 val;143 144	val = rtw_read32(rtwdev, addr);145	rtw_write32(rtwdev, addr, val | bit);146}147 148static inline void rtw_write8_clr(struct rtw_dev *rtwdev, u32 addr, u8 bit)149{150	u8 val;151 152	val = rtw_read8(rtwdev, addr);153	rtw_write8(rtwdev, addr, val & ~bit);154}155 156static inline void rtw_write16_clr(struct rtw_dev *rtwdev, u32 addr, u16 bit)157{158	u16 val;159 160	val = rtw_read16(rtwdev, addr);161	rtw_write16(rtwdev, addr, val & ~bit);162}163 164static inline void rtw_write32_clr(struct rtw_dev *rtwdev, u32 addr, u32 bit)165{166	u32 val;167 168	val = rtw_read32(rtwdev, addr);169	rtw_write32(rtwdev, addr, val & ~bit);170}171 172static inline u32173rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,174	    u32 addr, u32 mask)175{176	u32 val;177 178	lockdep_assert_held(&rtwdev->mutex);179 180	val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);181 182	return val;183}184 185static inline void186rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,187	     u32 addr, u32 mask, u32 data)188{189	lockdep_assert_held(&rtwdev->mutex);190 191	rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);192}193 194static inline u32195rtw_read32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)196{197	u32 shift = __ffs(mask);198	u32 orig;199	u32 ret;200 201	orig = rtw_read32(rtwdev, addr);202	ret = (orig & mask) >> shift;203 204	return ret;205}206 207static inline u16208rtw_read16_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)209{210	u32 shift = __ffs(mask);211	u32 orig;212	u32 ret;213 214	orig = rtw_read16(rtwdev, addr);215	ret = (orig & mask) >> shift;216 217	return ret;218}219 220static inline u8221rtw_read8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)222{223	u32 shift = __ffs(mask);224	u32 orig;225	u32 ret;226 227	orig = rtw_read8(rtwdev, addr);228	ret = (orig & mask) >> shift;229 230	return ret;231}232 233static inline void234rtw_write32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)235{236	u32 shift = __ffs(mask);237	u32 orig;238	u32 set;239 240	WARN(addr & 0x3, "should be 4-byte aligned, addr = 0x%08x\n", addr);241 242	orig = rtw_read32(rtwdev, addr);243	set = (orig & ~mask) | ((data << shift) & mask);244	rtw_write32(rtwdev, addr, set);245}246 247static inline void248rtw_write8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u8 data)249{250	u32 shift;251	u8 orig, set;252 253	mask &= 0xff;254	shift = __ffs(mask);255 256	orig = rtw_read8(rtwdev, addr);257	set = (orig & ~mask) | ((data << shift) & mask);258	rtw_write8(rtwdev, addr, set);259}260 261static inline enum rtw_hci_type rtw_hci_type(struct rtw_dev *rtwdev)262{263	return rtwdev->hci.type;264}265 266static inline void rtw_hci_flush_queues(struct rtw_dev *rtwdev, u32 queues,267					bool drop)268{269	if (rtwdev->hci.ops->flush_queues)270		rtwdev->hci.ops->flush_queues(rtwdev, queues, drop);271}272 273static inline void rtw_hci_flush_all_queues(struct rtw_dev *rtwdev, bool drop)274{275	if (rtwdev->hci.ops->flush_queues)276		rtwdev->hci.ops->flush_queues(rtwdev,277					      BIT(rtwdev->hw->queues) - 1,278					      drop);279}280 281#endif282