cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hci.h (6499B)


      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 */
      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
     22	int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
     23	int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
     24
     25	u8 (*read8)(struct rtw_dev *rtwdev, u32 addr);
     26	u16 (*read16)(struct rtw_dev *rtwdev, u32 addr);
     27	u32 (*read32)(struct rtw_dev *rtwdev, u32 addr);
     28	void (*write8)(struct rtw_dev *rtwdev, u32 addr, u8 val);
     29	void (*write16)(struct rtw_dev *rtwdev, u32 addr, u16 val);
     30	void (*write32)(struct rtw_dev *rtwdev, u32 addr, u32 val);
     31};
     32
     33static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,
     34				   struct rtw_tx_pkt_info *pkt_info,
     35				   struct sk_buff *skb)
     36{
     37	return rtwdev->hci.ops->tx_write(rtwdev, pkt_info, skb);
     38}
     39
     40static inline void rtw_hci_tx_kick_off(struct rtw_dev *rtwdev)
     41{
     42	return rtwdev->hci.ops->tx_kick_off(rtwdev);
     43}
     44
     45static inline int rtw_hci_setup(struct rtw_dev *rtwdev)
     46{
     47	return rtwdev->hci.ops->setup(rtwdev);
     48}
     49
     50static inline int rtw_hci_start(struct rtw_dev *rtwdev)
     51{
     52	return rtwdev->hci.ops->start(rtwdev);
     53}
     54
     55static inline void rtw_hci_stop(struct rtw_dev *rtwdev)
     56{
     57	rtwdev->hci.ops->stop(rtwdev);
     58}
     59
     60static inline void rtw_hci_deep_ps(struct rtw_dev *rtwdev, bool enter)
     61{
     62	rtwdev->hci.ops->deep_ps(rtwdev, enter);
     63}
     64
     65static inline void rtw_hci_link_ps(struct rtw_dev *rtwdev, bool enter)
     66{
     67	rtwdev->hci.ops->link_ps(rtwdev, enter);
     68}
     69
     70static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)
     71{
     72	rtwdev->hci.ops->interface_cfg(rtwdev);
     73}
     74
     75static inline int
     76rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
     77{
     78	return rtwdev->hci.ops->write_data_rsvd_page(rtwdev, buf, size);
     79}
     80
     81static inline int
     82rtw_hci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
     83{
     84	return rtwdev->hci.ops->write_data_h2c(rtwdev, buf, size);
     85}
     86
     87static inline u8 rtw_read8(struct rtw_dev *rtwdev, u32 addr)
     88{
     89	return rtwdev->hci.ops->read8(rtwdev, addr);
     90}
     91
     92static inline u16 rtw_read16(struct rtw_dev *rtwdev, u32 addr)
     93{
     94	return rtwdev->hci.ops->read16(rtwdev, addr);
     95}
     96
     97static inline u32 rtw_read32(struct rtw_dev *rtwdev, u32 addr)
     98{
     99	return rtwdev->hci.ops->read32(rtwdev, addr);
    100}
    101
    102static inline void rtw_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)
    103{
    104	rtwdev->hci.ops->write8(rtwdev, addr, val);
    105}
    106
    107static inline void rtw_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)
    108{
    109	rtwdev->hci.ops->write16(rtwdev, addr, val);
    110}
    111
    112static inline void rtw_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)
    113{
    114	rtwdev->hci.ops->write32(rtwdev, addr, val);
    115}
    116
    117static inline void rtw_write8_set(struct rtw_dev *rtwdev, u32 addr, u8 bit)
    118{
    119	u8 val;
    120
    121	val = rtw_read8(rtwdev, addr);
    122	rtw_write8(rtwdev, addr, val | bit);
    123}
    124
    125static inline void rtw_write16_set(struct rtw_dev *rtwdev, u32 addr, u16 bit)
    126{
    127	u16 val;
    128
    129	val = rtw_read16(rtwdev, addr);
    130	rtw_write16(rtwdev, addr, val | bit);
    131}
    132
    133static inline void rtw_write32_set(struct rtw_dev *rtwdev, u32 addr, u32 bit)
    134{
    135	u32 val;
    136
    137	val = rtw_read32(rtwdev, addr);
    138	rtw_write32(rtwdev, addr, val | bit);
    139}
    140
    141static inline void rtw_write8_clr(struct rtw_dev *rtwdev, u32 addr, u8 bit)
    142{
    143	u8 val;
    144
    145	val = rtw_read8(rtwdev, addr);
    146	rtw_write8(rtwdev, addr, val & ~bit);
    147}
    148
    149static inline void rtw_write16_clr(struct rtw_dev *rtwdev, u32 addr, u16 bit)
    150{
    151	u16 val;
    152
    153	val = rtw_read16(rtwdev, addr);
    154	rtw_write16(rtwdev, addr, val & ~bit);
    155}
    156
    157static inline void rtw_write32_clr(struct rtw_dev *rtwdev, u32 addr, u32 bit)
    158{
    159	u32 val;
    160
    161	val = rtw_read32(rtwdev, addr);
    162	rtw_write32(rtwdev, addr, val & ~bit);
    163}
    164
    165static inline u32
    166rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
    167	    u32 addr, u32 mask)
    168{
    169	unsigned long flags;
    170	u32 val;
    171
    172	spin_lock_irqsave(&rtwdev->rf_lock, flags);
    173	val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);
    174	spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
    175
    176	return val;
    177}
    178
    179static inline void
    180rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
    181	     u32 addr, u32 mask, u32 data)
    182{
    183	unsigned long flags;
    184
    185	spin_lock_irqsave(&rtwdev->rf_lock, flags);
    186	rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);
    187	spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
    188}
    189
    190static inline u32
    191rtw_read32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)
    192{
    193	u32 shift = __ffs(mask);
    194	u32 orig;
    195	u32 ret;
    196
    197	orig = rtw_read32(rtwdev, addr);
    198	ret = (orig & mask) >> shift;
    199
    200	return ret;
    201}
    202
    203static inline u16
    204rtw_read16_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)
    205{
    206	u32 shift = __ffs(mask);
    207	u32 orig;
    208	u32 ret;
    209
    210	orig = rtw_read16(rtwdev, addr);
    211	ret = (orig & mask) >> shift;
    212
    213	return ret;
    214}
    215
    216static inline u8
    217rtw_read8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask)
    218{
    219	u32 shift = __ffs(mask);
    220	u32 orig;
    221	u32 ret;
    222
    223	orig = rtw_read8(rtwdev, addr);
    224	ret = (orig & mask) >> shift;
    225
    226	return ret;
    227}
    228
    229static inline void
    230rtw_write32_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
    231{
    232	u32 shift = __ffs(mask);
    233	u32 orig;
    234	u32 set;
    235
    236	WARN(addr & 0x3, "should be 4-byte aligned, addr = 0x%08x\n", addr);
    237
    238	orig = rtw_read32(rtwdev, addr);
    239	set = (orig & ~mask) | ((data << shift) & mask);
    240	rtw_write32(rtwdev, addr, set);
    241}
    242
    243static inline void
    244rtw_write8_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u8 data)
    245{
    246	u32 shift;
    247	u8 orig, set;
    248
    249	mask &= 0xff;
    250	shift = __ffs(mask);
    251
    252	orig = rtw_read8(rtwdev, addr);
    253	set = (orig & ~mask) | ((data << shift) & mask);
    254	rtw_write8(rtwdev, addr, set);
    255}
    256
    257static inline enum rtw_hci_type rtw_hci_type(struct rtw_dev *rtwdev)
    258{
    259	return rtwdev->hci.type;
    260}
    261
    262static inline void rtw_hci_flush_queues(struct rtw_dev *rtwdev, u32 queues,
    263					bool drop)
    264{
    265	if (rtwdev->hci.ops->flush_queues)
    266		rtwdev->hci.ops->flush_queues(rtwdev, queues, drop);
    267}
    268
    269static inline void rtw_hci_flush_all_queues(struct rtw_dev *rtwdev, bool drop)
    270{
    271	if (rtwdev->hci.ops->flush_queues)
    272		rtwdev->hci.ops->flush_queues(rtwdev,
    273					      BIT(rtwdev->hw->queues) - 1,
    274					      drop);
    275}
    276
    277#endif