Path: blob/master/drivers/net/wireless/realtek/rtw88/hci.h
25924 views
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */1/* Copyright(c) 2018-2019 Realtek Corporation2*/34#ifndef __RTW_HCI_H__5#define __RTW_HCI_H__67/* ops for PCI, USB and SDIO */8struct rtw_hci_ops {9int (*tx_write)(struct rtw_dev *rtwdev,10struct rtw_tx_pkt_info *pkt_info,11struct sk_buff *skb);12void (*tx_kick_off)(struct rtw_dev *rtwdev);13void (*flush_queues)(struct rtw_dev *rtwdev, u32 queues, bool drop);14int (*setup)(struct rtw_dev *rtwdev);15int (*start)(struct rtw_dev *rtwdev);16void (*stop)(struct rtw_dev *rtwdev);17void (*deep_ps)(struct rtw_dev *rtwdev, bool enter);18void (*link_ps)(struct rtw_dev *rtwdev, bool enter);19void (*interface_cfg)(struct rtw_dev *rtwdev);20void (*dynamic_rx_agg)(struct rtw_dev *rtwdev, bool enable);21void (*write_firmware_page)(struct rtw_dev *rtwdev, u32 page,22const u8 *data, u32 size);2324int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);25int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);2627u8 (*read8)(struct rtw_dev *rtwdev, u32 addr);28u16 (*read16)(struct rtw_dev *rtwdev, u32 addr);29u32 (*read32)(struct rtw_dev *rtwdev, u32 addr);30void (*write8)(struct rtw_dev *rtwdev, u32 addr, u8 val);31void (*write16)(struct rtw_dev *rtwdev, u32 addr, u16 val);32void (*write32)(struct rtw_dev *rtwdev, u32 addr, u32 val);33};3435static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,36struct rtw_tx_pkt_info *pkt_info,37struct sk_buff *skb)38{39return rtwdev->hci.ops->tx_write(rtwdev, pkt_info, skb);40}4142static inline void rtw_hci_tx_kick_off(struct rtw_dev *rtwdev)43{44return rtwdev->hci.ops->tx_kick_off(rtwdev);45}4647static inline int rtw_hci_setup(struct rtw_dev *rtwdev)48{49return rtwdev->hci.ops->setup(rtwdev);50}5152static inline int rtw_hci_start(struct rtw_dev *rtwdev)53{54return rtwdev->hci.ops->start(rtwdev);55}5657static inline void rtw_hci_stop(struct rtw_dev *rtwdev)58{59rtwdev->hci.ops->stop(rtwdev);60}6162static inline void rtw_hci_deep_ps(struct rtw_dev *rtwdev, bool enter)63{64rtwdev->hci.ops->deep_ps(rtwdev, enter);65}6667static inline void rtw_hci_link_ps(struct rtw_dev *rtwdev, bool enter)68{69rtwdev->hci.ops->link_ps(rtwdev, enter);70}7172static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)73{74rtwdev->hci.ops->interface_cfg(rtwdev);75}7677static inline void rtw_hci_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)78{79if (rtwdev->hci.ops->dynamic_rx_agg)80rtwdev->hci.ops->dynamic_rx_agg(rtwdev, enable);81}8283static inline void rtw_hci_write_firmware_page(struct rtw_dev *rtwdev, u32 page,84const u8 *data, u32 size)85{86rtwdev->hci.ops->write_firmware_page(rtwdev, page, data, size);87}8889static inline int90rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)91{92return rtwdev->hci.ops->write_data_rsvd_page(rtwdev, buf, size);93}9495static inline int96rtw_hci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)97{98return rtwdev->hci.ops->write_data_h2c(rtwdev, buf, size);99}100101static inline u8 rtw_read8(struct rtw_dev *rtwdev, u32 addr)102{103return rtwdev->hci.ops->read8(rtwdev, addr);104}105106static inline u16 rtw_read16(struct rtw_dev *rtwdev, u32 addr)107{108return rtwdev->hci.ops->read16(rtwdev, addr);109}110111static inline u32 rtw_read32(struct rtw_dev *rtwdev, u32 addr)112{113return rtwdev->hci.ops->read32(rtwdev, addr);114}115116static inline void rtw_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)117{118rtwdev->hci.ops->write8(rtwdev, addr, val);119}120121static inline void rtw_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)122{123rtwdev->hci.ops->write16(rtwdev, addr, val);124}125126static inline void rtw_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)127{128rtwdev->hci.ops->write32(rtwdev, addr, val);129}130131static inline void rtw_write8_set(struct rtw_dev *rtwdev, u32 addr, u8 bit)132{133u8 val;134135val = rtw_read8(rtwdev, addr);136rtw_write8(rtwdev, addr, val | bit);137}138139static inline void rtw_write16_set(struct rtw_dev *rtwdev, u32 addr, u16 bit)140{141u16 val;142143val = rtw_read16(rtwdev, addr);144rtw_write16(rtwdev, addr, val | bit);145}146147static inline void rtw_write32_set(struct rtw_dev *rtwdev, u32 addr, u32 bit)148{149u32 val;150151val = rtw_read32(rtwdev, addr);152rtw_write32(rtwdev, addr, val | bit);153}154155static inline void rtw_write8_clr(struct rtw_dev *rtwdev, u32 addr, u8 bit)156{157u8 val;158159val = rtw_read8(rtwdev, addr);160rtw_write8(rtwdev, addr, val & ~bit);161}162163static inline void rtw_write16_clr(struct rtw_dev *rtwdev, u32 addr, u16 bit)164{165u16 val;166167val = rtw_read16(rtwdev, addr);168rtw_write16(rtwdev, addr, val & ~bit);169}170171static inline void rtw_write32_clr(struct rtw_dev *rtwdev, u32 addr, u32 bit)172{173u32 val;174175val = rtw_read32(rtwdev, addr);176rtw_write32(rtwdev, addr, val & ~bit);177}178179static inline u32180rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,181u32 addr, u32 mask)182{183u32 val;184185lockdep_assert_held(&rtwdev->mutex);186187val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);188189return val;190}191192static inline void193rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,194u32 addr, u32 mask, u32 data)195{196lockdep_assert_held(&rtwdev->mutex);197198rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);199}200201static inline u32202rtw_read32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)203{204u32 shift = __ffs(mask);205u32 orig;206u32 ret;207208orig = rtw_read32(rtwdev, addr);209ret = (orig & mask) >> shift;210211return ret;212}213214static inline u16215rtw_read16_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)216{217u32 shift = __ffs(mask);218u32 orig;219u32 ret;220221orig = rtw_read16(rtwdev, addr);222ret = (orig & mask) >> shift;223224return ret;225}226227static inline u8228rtw_read8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)229{230u32 shift = __ffs(mask);231u32 orig;232u32 ret;233234orig = rtw_read8(rtwdev, addr);235ret = (orig & mask) >> shift;236237return ret;238}239240static inline void241rtw_write32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)242{243u32 shift = __ffs(mask);244u32 orig;245u32 set;246247WARN(addr & 0x3, "should be 4-byte aligned, addr = 0x%08x\n", addr);248249orig = rtw_read32(rtwdev, addr);250set = (orig & ~mask) | ((data << shift) & mask);251rtw_write32(rtwdev, addr, set);252}253254static inline void255rtw_write8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u8 data)256{257u32 shift;258u8 orig, set;259260mask &= 0xff;261shift = __ffs(mask);262263orig = rtw_read8(rtwdev, addr);264set = (orig & ~mask) | ((data << shift) & mask);265rtw_write8(rtwdev, addr, set);266}267268static inline enum rtw_hci_type rtw_hci_type(struct rtw_dev *rtwdev)269{270return rtwdev->hci.type;271}272273static inline void rtw_hci_flush_queues(struct rtw_dev *rtwdev, u32 queues,274bool drop)275{276if (rtwdev->hci.ops->flush_queues)277rtwdev->hci.ops->flush_queues(rtwdev, queues, drop);278}279280static inline void rtw_hci_flush_all_queues(struct rtw_dev *rtwdev, bool drop)281{282if (rtwdev->hci.ops->flush_queues)283rtwdev->hci.ops->flush_queues(rtwdev,284BIT(rtwdev->hw->queues) - 1,285drop);286}287288#endif289290291