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