18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef RTL8180_H 38c2ecf20Sopenharmony_ci#define RTL8180_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include "rtl818x.h" 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#define MAX_RX_SIZE IEEE80211_MAX_RTS_THRESHOLD 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#define RF_PARAM_ANALOGPHY (1 << 0) 108c2ecf20Sopenharmony_ci#define RF_PARAM_ANTBDEFAULT (1 << 1) 118c2ecf20Sopenharmony_ci#define RF_PARAM_CARRIERSENSE1 (1 << 2) 128c2ecf20Sopenharmony_ci#define RF_PARAM_CARRIERSENSE2 (1 << 3) 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define BB_ANTATTEN_CHAN14 0x0C 158c2ecf20Sopenharmony_ci#define BB_ANTENNA_B 0x40 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define BB_HOST_BANG (1 << 30) 188c2ecf20Sopenharmony_ci#define BB_HOST_BANG_EN (1 << 2) 198c2ecf20Sopenharmony_ci#define BB_HOST_BANG_CLK (1 << 1) 208c2ecf20Sopenharmony_ci#define BB_HOST_BANG_DATA 1 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define ANAPARAM_TXDACOFF_SHIFT 27 238c2ecf20Sopenharmony_ci#define ANAPARAM_PWR0_SHIFT 28 248c2ecf20Sopenharmony_ci#define ANAPARAM_PWR0_MASK (0x07 << ANAPARAM_PWR0_SHIFT) 258c2ecf20Sopenharmony_ci#define ANAPARAM_PWR1_SHIFT 20 268c2ecf20Sopenharmony_ci#define ANAPARAM_PWR1_MASK (0x7F << ANAPARAM_PWR1_SHIFT) 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci/* rtl8180/rtl8185 have 3 queue + beacon queue. 298c2ecf20Sopenharmony_ci * mac80211 can use just one, + beacon = 2 tot. 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_ci#define RTL8180_NR_TX_QUEUES 2 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/* rtl8187SE have 6 queues + beacon queues 348c2ecf20Sopenharmony_ci * mac80211 can use 4 QoS data queue, + beacon = 5 tot 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_ci#define RTL8187SE_NR_TX_QUEUES 5 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/* for array static allocation, it is the max of above */ 398c2ecf20Sopenharmony_ci#define RTL818X_NR_TX_QUEUES 5 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistruct rtl8180_tx_desc { 428c2ecf20Sopenharmony_ci __le32 flags; 438c2ecf20Sopenharmony_ci __le16 rts_duration; 448c2ecf20Sopenharmony_ci __le16 plcp_len; 458c2ecf20Sopenharmony_ci __le32 tx_buf; 468c2ecf20Sopenharmony_ci union{ 478c2ecf20Sopenharmony_ci __le32 frame_len; 488c2ecf20Sopenharmony_ci struct { 498c2ecf20Sopenharmony_ci __le16 frame_len_se; 508c2ecf20Sopenharmony_ci __le16 frame_duration; 518c2ecf20Sopenharmony_ci } __packed; 528c2ecf20Sopenharmony_ci } __packed; 538c2ecf20Sopenharmony_ci __le32 next_tx_desc; 548c2ecf20Sopenharmony_ci u8 cw; 558c2ecf20Sopenharmony_ci u8 retry_limit; 568c2ecf20Sopenharmony_ci u8 agc; 578c2ecf20Sopenharmony_ci u8 flags2; 588c2ecf20Sopenharmony_ci /* rsvd for 8180/8185. 598c2ecf20Sopenharmony_ci * valid for 8187se but we dont use it 608c2ecf20Sopenharmony_ci */ 618c2ecf20Sopenharmony_ci u32 reserved; 628c2ecf20Sopenharmony_ci /* all rsvd for 8180/8185 */ 638c2ecf20Sopenharmony_ci __le16 flags3; 648c2ecf20Sopenharmony_ci __le16 frag_qsize; 658c2ecf20Sopenharmony_ci} __packed; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_cistruct rtl818x_rx_cmd_desc { 688c2ecf20Sopenharmony_ci __le32 flags; 698c2ecf20Sopenharmony_ci u32 reserved; 708c2ecf20Sopenharmony_ci __le32 rx_buf; 718c2ecf20Sopenharmony_ci} __packed; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_cistruct rtl8180_rx_desc { 748c2ecf20Sopenharmony_ci __le32 flags; 758c2ecf20Sopenharmony_ci __le32 flags2; 768c2ecf20Sopenharmony_ci __le64 tsft; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci} __packed; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistruct rtl8187se_rx_desc { 818c2ecf20Sopenharmony_ci __le32 flags; 828c2ecf20Sopenharmony_ci __le64 tsft; 838c2ecf20Sopenharmony_ci __le32 flags2; 848c2ecf20Sopenharmony_ci __le32 flags3; 858c2ecf20Sopenharmony_ci u32 reserved[3]; 868c2ecf20Sopenharmony_ci} __packed; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cistruct rtl8180_tx_ring { 898c2ecf20Sopenharmony_ci struct rtl8180_tx_desc *desc; 908c2ecf20Sopenharmony_ci dma_addr_t dma; 918c2ecf20Sopenharmony_ci unsigned int idx; 928c2ecf20Sopenharmony_ci unsigned int entries; 938c2ecf20Sopenharmony_ci struct sk_buff_head queue; 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistruct rtl8180_vif { 978c2ecf20Sopenharmony_ci struct ieee80211_hw *dev; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci /* beaconing */ 1008c2ecf20Sopenharmony_ci struct delayed_work beacon_work; 1018c2ecf20Sopenharmony_ci bool enable_beacon; 1028c2ecf20Sopenharmony_ci}; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cistruct rtl8180_priv { 1058c2ecf20Sopenharmony_ci /* common between rtl818x drivers */ 1068c2ecf20Sopenharmony_ci struct rtl818x_csr __iomem *map; 1078c2ecf20Sopenharmony_ci const struct rtl818x_rf_ops *rf; 1088c2ecf20Sopenharmony_ci struct ieee80211_vif *vif; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci /* rtl8180 driver specific */ 1118c2ecf20Sopenharmony_ci bool map_pio; 1128c2ecf20Sopenharmony_ci spinlock_t lock; 1138c2ecf20Sopenharmony_ci void *rx_ring; 1148c2ecf20Sopenharmony_ci u8 rx_ring_sz; 1158c2ecf20Sopenharmony_ci dma_addr_t rx_ring_dma; 1168c2ecf20Sopenharmony_ci unsigned int rx_idx; 1178c2ecf20Sopenharmony_ci struct sk_buff *rx_buf[32]; 1188c2ecf20Sopenharmony_ci struct rtl8180_tx_ring tx_ring[RTL818X_NR_TX_QUEUES]; 1198c2ecf20Sopenharmony_ci struct ieee80211_channel channels[14]; 1208c2ecf20Sopenharmony_ci struct ieee80211_rate rates[12]; 1218c2ecf20Sopenharmony_ci struct ieee80211_supported_band band; 1228c2ecf20Sopenharmony_ci struct ieee80211_tx_queue_params queue_param[4]; 1238c2ecf20Sopenharmony_ci struct pci_dev *pdev; 1248c2ecf20Sopenharmony_ci u32 rx_conf; 1258c2ecf20Sopenharmony_ci u8 slot_time; 1268c2ecf20Sopenharmony_ci u16 ack_time; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci enum { 1298c2ecf20Sopenharmony_ci RTL818X_CHIP_FAMILY_RTL8180, 1308c2ecf20Sopenharmony_ci RTL818X_CHIP_FAMILY_RTL8185, 1318c2ecf20Sopenharmony_ci RTL818X_CHIP_FAMILY_RTL8187SE, 1328c2ecf20Sopenharmony_ci } chip_family; 1338c2ecf20Sopenharmony_ci u32 anaparam; 1348c2ecf20Sopenharmony_ci u16 rfparam; 1358c2ecf20Sopenharmony_ci u8 csthreshold; 1368c2ecf20Sopenharmony_ci u8 mac_addr[ETH_ALEN]; 1378c2ecf20Sopenharmony_ci u8 rf_type; 1388c2ecf20Sopenharmony_ci u8 xtal_out; 1398c2ecf20Sopenharmony_ci u8 xtal_in; 1408c2ecf20Sopenharmony_ci u8 xtal_cal; 1418c2ecf20Sopenharmony_ci u8 thermal_meter_val; 1428c2ecf20Sopenharmony_ci u8 thermal_meter_en; 1438c2ecf20Sopenharmony_ci u8 antenna_diversity_en; 1448c2ecf20Sopenharmony_ci u8 antenna_diversity_default; 1458c2ecf20Sopenharmony_ci /* sequence # */ 1468c2ecf20Sopenharmony_ci u16 seqno; 1478c2ecf20Sopenharmony_ci}; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_civoid rtl8180_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); 1508c2ecf20Sopenharmony_civoid rtl8180_set_anaparam(struct rtl8180_priv *priv, u32 anaparam); 1518c2ecf20Sopenharmony_civoid rtl8180_set_anaparam2(struct rtl8180_priv *priv, u32 anaparam2); 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistatic inline u8 rtl818x_ioread8(struct rtl8180_priv *priv, const u8 __iomem *addr) 1548c2ecf20Sopenharmony_ci{ 1558c2ecf20Sopenharmony_ci return ioread8(addr); 1568c2ecf20Sopenharmony_ci} 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_cistatic inline u16 rtl818x_ioread16(struct rtl8180_priv *priv, const __le16 __iomem *addr) 1598c2ecf20Sopenharmony_ci{ 1608c2ecf20Sopenharmony_ci return ioread16(addr); 1618c2ecf20Sopenharmony_ci} 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_cistatic inline u32 rtl818x_ioread32(struct rtl8180_priv *priv, const __le32 __iomem *addr) 1648c2ecf20Sopenharmony_ci{ 1658c2ecf20Sopenharmony_ci return ioread32(addr); 1668c2ecf20Sopenharmony_ci} 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_cistatic inline void rtl818x_iowrite8(struct rtl8180_priv *priv, 1698c2ecf20Sopenharmony_ci u8 __iomem *addr, u8 val) 1708c2ecf20Sopenharmony_ci{ 1718c2ecf20Sopenharmony_ci iowrite8(val, addr); 1728c2ecf20Sopenharmony_ci} 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_cistatic inline void rtl818x_iowrite16(struct rtl8180_priv *priv, 1758c2ecf20Sopenharmony_ci __le16 __iomem *addr, u16 val) 1768c2ecf20Sopenharmony_ci{ 1778c2ecf20Sopenharmony_ci iowrite16(val, addr); 1788c2ecf20Sopenharmony_ci} 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic inline void rtl818x_iowrite32(struct rtl8180_priv *priv, 1818c2ecf20Sopenharmony_ci __le32 __iomem *addr, u32 val) 1828c2ecf20Sopenharmony_ci{ 1838c2ecf20Sopenharmony_ci iowrite32(val, addr); 1848c2ecf20Sopenharmony_ci} 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci#endif /* RTL8180_H */ 187