162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef RTL8180_H
362306a36Sopenharmony_ci#define RTL8180_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include "rtl818x.h"
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define MAX_RX_SIZE IEEE80211_MAX_RTS_THRESHOLD
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define RF_PARAM_ANALOGPHY	(1 << 0)
1062306a36Sopenharmony_ci#define RF_PARAM_ANTBDEFAULT	(1 << 1)
1162306a36Sopenharmony_ci#define RF_PARAM_CARRIERSENSE1	(1 << 2)
1262306a36Sopenharmony_ci#define RF_PARAM_CARRIERSENSE2	(1 << 3)
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define BB_ANTATTEN_CHAN14	0x0C
1562306a36Sopenharmony_ci#define BB_ANTENNA_B 		0x40
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define BB_HOST_BANG 		(1 << 30)
1862306a36Sopenharmony_ci#define BB_HOST_BANG_EN 	(1 << 2)
1962306a36Sopenharmony_ci#define BB_HOST_BANG_CLK 	(1 << 1)
2062306a36Sopenharmony_ci#define BB_HOST_BANG_DATA	1
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define ANAPARAM_TXDACOFF_SHIFT	27
2362306a36Sopenharmony_ci#define ANAPARAM_PWR0_SHIFT	28
2462306a36Sopenharmony_ci#define ANAPARAM_PWR0_MASK 	(0x07 << ANAPARAM_PWR0_SHIFT)
2562306a36Sopenharmony_ci#define ANAPARAM_PWR1_SHIFT	20
2662306a36Sopenharmony_ci#define ANAPARAM_PWR1_MASK	(0x7F << ANAPARAM_PWR1_SHIFT)
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* rtl8180/rtl8185 have 3 queue + beacon queue.
2962306a36Sopenharmony_ci * mac80211 can use just one, + beacon = 2 tot.
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_ci#define RTL8180_NR_TX_QUEUES 2
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/* rtl8187SE have 6 queues + beacon queues
3462306a36Sopenharmony_ci * mac80211 can use 4 QoS data queue, + beacon = 5 tot
3562306a36Sopenharmony_ci */
3662306a36Sopenharmony_ci#define RTL8187SE_NR_TX_QUEUES 5
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/* for array static allocation, it is the max of above */
3962306a36Sopenharmony_ci#define RTL818X_NR_TX_QUEUES 5
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct rtl8180_tx_desc {
4262306a36Sopenharmony_ci	__le32 flags;
4362306a36Sopenharmony_ci	__le16 rts_duration;
4462306a36Sopenharmony_ci	__le16 plcp_len;
4562306a36Sopenharmony_ci	__le32 tx_buf;
4662306a36Sopenharmony_ci	union{
4762306a36Sopenharmony_ci		__le32 frame_len;
4862306a36Sopenharmony_ci		struct {
4962306a36Sopenharmony_ci			__le16 frame_len_se;
5062306a36Sopenharmony_ci			__le16 frame_duration;
5162306a36Sopenharmony_ci		} __packed;
5262306a36Sopenharmony_ci	} __packed;
5362306a36Sopenharmony_ci	__le32 next_tx_desc;
5462306a36Sopenharmony_ci	u8 cw;
5562306a36Sopenharmony_ci	u8 retry_limit;
5662306a36Sopenharmony_ci	u8 agc;
5762306a36Sopenharmony_ci	u8 flags2;
5862306a36Sopenharmony_ci	/* rsvd for 8180/8185.
5962306a36Sopenharmony_ci	 * valid for 8187se but we dont use it
6062306a36Sopenharmony_ci	 */
6162306a36Sopenharmony_ci	u32 reserved;
6262306a36Sopenharmony_ci	/* all rsvd for 8180/8185 */
6362306a36Sopenharmony_ci	__le16 flags3;
6462306a36Sopenharmony_ci	__le16 frag_qsize;
6562306a36Sopenharmony_ci} __packed;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct rtl818x_rx_cmd_desc {
6862306a36Sopenharmony_ci	__le32 flags;
6962306a36Sopenharmony_ci	u32 reserved;
7062306a36Sopenharmony_ci	__le32 rx_buf;
7162306a36Sopenharmony_ci} __packed;
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistruct rtl8180_rx_desc {
7462306a36Sopenharmony_ci	__le32 flags;
7562306a36Sopenharmony_ci	__le32 flags2;
7662306a36Sopenharmony_ci	__le64 tsft;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci} __packed;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistruct rtl8187se_rx_desc {
8162306a36Sopenharmony_ci	__le32 flags;
8262306a36Sopenharmony_ci	__le64 tsft;
8362306a36Sopenharmony_ci	__le32 flags2;
8462306a36Sopenharmony_ci	__le32 flags3;
8562306a36Sopenharmony_ci	u32 reserved[3];
8662306a36Sopenharmony_ci} __packed;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct rtl8180_tx_ring {
8962306a36Sopenharmony_ci	struct rtl8180_tx_desc *desc;
9062306a36Sopenharmony_ci	dma_addr_t dma;
9162306a36Sopenharmony_ci	unsigned int idx;
9262306a36Sopenharmony_ci	unsigned int entries;
9362306a36Sopenharmony_ci	struct sk_buff_head queue;
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistruct rtl8180_vif {
9762306a36Sopenharmony_ci	struct ieee80211_hw *dev;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	/* beaconing */
10062306a36Sopenharmony_ci	struct delayed_work beacon_work;
10162306a36Sopenharmony_ci	bool enable_beacon;
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistruct rtl8180_priv {
10562306a36Sopenharmony_ci	/* common between rtl818x drivers */
10662306a36Sopenharmony_ci	struct rtl818x_csr __iomem *map;
10762306a36Sopenharmony_ci	const struct rtl818x_rf_ops *rf;
10862306a36Sopenharmony_ci	struct ieee80211_vif *vif;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	/* rtl8180 driver specific */
11162306a36Sopenharmony_ci	bool map_pio;
11262306a36Sopenharmony_ci	spinlock_t lock;
11362306a36Sopenharmony_ci	void *rx_ring;
11462306a36Sopenharmony_ci	u8 rx_ring_sz;
11562306a36Sopenharmony_ci	dma_addr_t rx_ring_dma;
11662306a36Sopenharmony_ci	unsigned int rx_idx;
11762306a36Sopenharmony_ci	struct sk_buff *rx_buf[32];
11862306a36Sopenharmony_ci	struct rtl8180_tx_ring tx_ring[RTL818X_NR_TX_QUEUES];
11962306a36Sopenharmony_ci	struct ieee80211_channel channels[14];
12062306a36Sopenharmony_ci	struct ieee80211_rate rates[12];
12162306a36Sopenharmony_ci	struct ieee80211_supported_band band;
12262306a36Sopenharmony_ci	struct ieee80211_tx_queue_params queue_param[4];
12362306a36Sopenharmony_ci	struct pci_dev *pdev;
12462306a36Sopenharmony_ci	u32 rx_conf;
12562306a36Sopenharmony_ci	u8 slot_time;
12662306a36Sopenharmony_ci	u16 ack_time;
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	enum {
12962306a36Sopenharmony_ci		RTL818X_CHIP_FAMILY_RTL8180,
13062306a36Sopenharmony_ci		RTL818X_CHIP_FAMILY_RTL8185,
13162306a36Sopenharmony_ci		RTL818X_CHIP_FAMILY_RTL8187SE,
13262306a36Sopenharmony_ci	} chip_family;
13362306a36Sopenharmony_ci	u32 anaparam;
13462306a36Sopenharmony_ci	u16 rfparam;
13562306a36Sopenharmony_ci	u8 csthreshold;
13662306a36Sopenharmony_ci	u8 mac_addr[ETH_ALEN];
13762306a36Sopenharmony_ci	u8 rf_type;
13862306a36Sopenharmony_ci	u8 xtal_out;
13962306a36Sopenharmony_ci	u8 xtal_in;
14062306a36Sopenharmony_ci	u8 xtal_cal;
14162306a36Sopenharmony_ci	u8 thermal_meter_val;
14262306a36Sopenharmony_ci	u8 thermal_meter_en;
14362306a36Sopenharmony_ci	u8 antenna_diversity_en;
14462306a36Sopenharmony_ci	u8 antenna_diversity_default;
14562306a36Sopenharmony_ci	/* sequence # */
14662306a36Sopenharmony_ci	u16 seqno;
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_civoid rtl8180_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data);
15062306a36Sopenharmony_civoid rtl8180_set_anaparam(struct rtl8180_priv *priv, u32 anaparam);
15162306a36Sopenharmony_civoid rtl8180_set_anaparam2(struct rtl8180_priv *priv, u32 anaparam2);
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistatic inline u8 rtl818x_ioread8(struct rtl8180_priv *priv, const u8 __iomem *addr)
15462306a36Sopenharmony_ci{
15562306a36Sopenharmony_ci	return ioread8(addr);
15662306a36Sopenharmony_ci}
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cistatic inline u16 rtl818x_ioread16(struct rtl8180_priv *priv, const __le16 __iomem *addr)
15962306a36Sopenharmony_ci{
16062306a36Sopenharmony_ci	return ioread16(addr);
16162306a36Sopenharmony_ci}
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_cistatic inline u32 rtl818x_ioread32(struct rtl8180_priv *priv, const __le32 __iomem *addr)
16462306a36Sopenharmony_ci{
16562306a36Sopenharmony_ci	return ioread32(addr);
16662306a36Sopenharmony_ci}
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistatic inline void rtl818x_iowrite8(struct rtl8180_priv *priv,
16962306a36Sopenharmony_ci				    u8 __iomem *addr, u8 val)
17062306a36Sopenharmony_ci{
17162306a36Sopenharmony_ci	iowrite8(val, addr);
17262306a36Sopenharmony_ci}
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_cistatic inline void rtl818x_iowrite16(struct rtl8180_priv *priv,
17562306a36Sopenharmony_ci				     __le16 __iomem *addr, u16 val)
17662306a36Sopenharmony_ci{
17762306a36Sopenharmony_ci	iowrite16(val, addr);
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic inline void rtl818x_iowrite32(struct rtl8180_priv *priv,
18162306a36Sopenharmony_ci				     __le32 __iomem *addr, u32 val)
18262306a36Sopenharmony_ci{
18362306a36Sopenharmony_ci	iowrite32(val, addr);
18462306a36Sopenharmony_ci}
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci#endif /* RTL8180_H */
187