11ccea77eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
233aca94dSKalle Valo /*
333aca94dSKalle Valo 	Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
433aca94dSKalle Valo 	Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
533aca94dSKalle Valo 	Copyright (C) 2009 Bartlomiej Zolnierkiewicz
633aca94dSKalle Valo 
733aca94dSKalle Valo  */
833aca94dSKalle Valo 
933aca94dSKalle Valo #ifndef RT2800LIB_H
1033aca94dSKalle Valo #define RT2800LIB_H
1133aca94dSKalle Valo 
1296609f36SGabor Juhos /*
1396609f36SGabor Juhos  * Hardware has 255 WCID table entries. First 32 entries are reserved for
1496609f36SGabor Juhos  * shared keys. Since parts of the pairwise key table might be shared with
1596609f36SGabor Juhos  * the beacon frame buffers 6 & 7 we could only use the first 222 entries.
1696609f36SGabor Juhos  */
1796609f36SGabor Juhos #define WCID_START	33
1896609f36SGabor Juhos #define WCID_END	222
1996609f36SGabor Juhos #define STA_IDS_SIZE	(WCID_END - WCID_START + 2)
20dab902feSTomislav Požega #define CHAIN_0		0x0
21dab902feSTomislav Požega #define CHAIN_1		0x1
22dab902feSTomislav Požega #define RF_ALC_NUM	6
23dab902feSTomislav Požega #define CHAIN_NUM	2
24dab902feSTomislav Požega 
25dab902feSTomislav Požega struct rf_reg_pair {
26dab902feSTomislav Požega 	u8 bank;
27dab902feSTomislav Požega 	u8 reg;
28dab902feSTomislav Požega 	u8 value;
29dab902feSTomislav Požega };
3096609f36SGabor Juhos 
3196609f36SGabor Juhos /* RT2800 driver data structure */
3296609f36SGabor Juhos struct rt2800_drv_data {
3396609f36SGabor Juhos 	u8 calibration_bw20;
3496609f36SGabor Juhos 	u8 calibration_bw40;
35*d04bb085SJason A. Donenfeld 	s8 rx_calibration_bw20;
36*d04bb085SJason A. Donenfeld 	s8 rx_calibration_bw40;
37*d04bb085SJason A. Donenfeld 	s8 tx_calibration_bw20;
38*d04bb085SJason A. Donenfeld 	s8 tx_calibration_bw40;
3996609f36SGabor Juhos 	u8 bbp25;
4096609f36SGabor Juhos 	u8 bbp26;
4196609f36SGabor Juhos 	u8 txmixer_gain_24g;
4296609f36SGabor Juhos 	u8 txmixer_gain_5g;
4396609f36SGabor Juhos 	u8 max_psdu;
4496609f36SGabor Juhos 	unsigned int tbtt_tick;
4596609f36SGabor Juhos 	unsigned int ampdu_factor_cnt[4];
4696609f36SGabor Juhos 	DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
47a13d985fSStanislaw Gruszka 	struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE];
4896609f36SGabor Juhos };
4996609f36SGabor Juhos 
5033aca94dSKalle Valo struct rt2800_ops {
516b81745eSArnd Bergmann 	u32 (*register_read)(struct rt2x00_dev *rt2x00dev,
526b81745eSArnd Bergmann 			      const unsigned int offset);
536b81745eSArnd Bergmann 	u32 (*register_read_lock)(struct rt2x00_dev *rt2x00dev,
546b81745eSArnd Bergmann 				   const unsigned int offset);
5533aca94dSKalle Valo 	void (*register_write)(struct rt2x00_dev *rt2x00dev,
5633aca94dSKalle Valo 			       const unsigned int offset, u32 value);
5733aca94dSKalle Valo 	void (*register_write_lock)(struct rt2x00_dev *rt2x00dev,
5833aca94dSKalle Valo 				    const unsigned int offset, u32 value);
5933aca94dSKalle Valo 
6033aca94dSKalle Valo 	void (*register_multiread)(struct rt2x00_dev *rt2x00dev,
6133aca94dSKalle Valo 				   const unsigned int offset,
6233aca94dSKalle Valo 				   void *value, const u32 length);
6333aca94dSKalle Valo 	void (*register_multiwrite)(struct rt2x00_dev *rt2x00dev,
6433aca94dSKalle Valo 				    const unsigned int offset,
6533aca94dSKalle Valo 				    const void *value, const u32 length);
6633aca94dSKalle Valo 
6733aca94dSKalle Valo 	int (*regbusy_read)(struct rt2x00_dev *rt2x00dev,
6833aca94dSKalle Valo 			    const unsigned int offset,
6933aca94dSKalle Valo 			    const struct rt2x00_field32 field, u32 *reg);
7033aca94dSKalle Valo 
7133aca94dSKalle Valo 	int (*read_eeprom)(struct rt2x00_dev *rt2x00dev);
7233aca94dSKalle Valo 	bool (*hwcrypt_disabled)(struct rt2x00_dev *rt2x00dev);
7333aca94dSKalle Valo 
7433aca94dSKalle Valo 	int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev,
7533aca94dSKalle Valo 				  const u8 *data, const size_t len);
7633aca94dSKalle Valo 	int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev);
7733aca94dSKalle Valo 	__le32 *(*drv_get_txwi)(struct queue_entry *entry);
782034afe4SStanislaw Gruszka 	unsigned int (*drv_get_dma_done)(struct data_queue *queue);
7933aca94dSKalle Valo };
8033aca94dSKalle Valo 
rt2800_register_read(struct rt2x00_dev * rt2x00dev,const unsigned int offset)81eebd68e7SArnd Bergmann static inline u32 rt2800_register_read(struct rt2x00_dev *rt2x00dev,
826b81745eSArnd Bergmann 				       const unsigned int offset)
836b81745eSArnd Bergmann {
846b81745eSArnd Bergmann 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
856b81745eSArnd Bergmann 
866b81745eSArnd Bergmann 	return rt2800ops->register_read(rt2x00dev, offset);
8733aca94dSKalle Valo }
8833aca94dSKalle Valo 
rt2800_register_read_lock(struct rt2x00_dev * rt2x00dev,const unsigned int offset)89eebd68e7SArnd Bergmann static inline u32 rt2800_register_read_lock(struct rt2x00_dev *rt2x00dev,
90eebd68e7SArnd Bergmann 					    const unsigned int offset)
91eebd68e7SArnd Bergmann {
92eebd68e7SArnd Bergmann 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
93eebd68e7SArnd Bergmann 
94eebd68e7SArnd Bergmann 	return rt2800ops->register_read_lock(rt2x00dev, offset);
95eebd68e7SArnd Bergmann }
96eebd68e7SArnd Bergmann 
rt2800_register_write(struct rt2x00_dev * rt2x00dev,const unsigned int offset,u32 value)9733aca94dSKalle Valo static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev,
9833aca94dSKalle Valo 					 const unsigned int offset,
9933aca94dSKalle Valo 					 u32 value)
10033aca94dSKalle Valo {
10133aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
10233aca94dSKalle Valo 
10333aca94dSKalle Valo 	rt2800ops->register_write(rt2x00dev, offset, value);
10433aca94dSKalle Valo }
10533aca94dSKalle Valo 
rt2800_register_write_lock(struct rt2x00_dev * rt2x00dev,const unsigned int offset,u32 value)10633aca94dSKalle Valo static inline void rt2800_register_write_lock(struct rt2x00_dev *rt2x00dev,
10733aca94dSKalle Valo 					      const unsigned int offset,
10833aca94dSKalle Valo 					      u32 value)
10933aca94dSKalle Valo {
11033aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
11133aca94dSKalle Valo 
11233aca94dSKalle Valo 	rt2800ops->register_write_lock(rt2x00dev, offset, value);
11333aca94dSKalle Valo }
11433aca94dSKalle Valo 
rt2800_register_multiread(struct rt2x00_dev * rt2x00dev,const unsigned int offset,void * value,const u32 length)11533aca94dSKalle Valo static inline void rt2800_register_multiread(struct rt2x00_dev *rt2x00dev,
11633aca94dSKalle Valo 					     const unsigned int offset,
11733aca94dSKalle Valo 					     void *value, const u32 length)
11833aca94dSKalle Valo {
11933aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
12033aca94dSKalle Valo 
12133aca94dSKalle Valo 	rt2800ops->register_multiread(rt2x00dev, offset, value, length);
12233aca94dSKalle Valo }
12333aca94dSKalle Valo 
rt2800_register_multiwrite(struct rt2x00_dev * rt2x00dev,const unsigned int offset,const void * value,const u32 length)12433aca94dSKalle Valo static inline void rt2800_register_multiwrite(struct rt2x00_dev *rt2x00dev,
12533aca94dSKalle Valo 					      const unsigned int offset,
12633aca94dSKalle Valo 					      const void *value,
12733aca94dSKalle Valo 					      const u32 length)
12833aca94dSKalle Valo {
12933aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
13033aca94dSKalle Valo 
13133aca94dSKalle Valo 	rt2800ops->register_multiwrite(rt2x00dev, offset, value, length);
13233aca94dSKalle Valo }
13333aca94dSKalle Valo 
rt2800_regbusy_read(struct rt2x00_dev * rt2x00dev,const unsigned int offset,const struct rt2x00_field32 field,u32 * reg)13433aca94dSKalle Valo static inline int rt2800_regbusy_read(struct rt2x00_dev *rt2x00dev,
13533aca94dSKalle Valo 				      const unsigned int offset,
13633aca94dSKalle Valo 				      const struct rt2x00_field32 field,
13733aca94dSKalle Valo 				      u32 *reg)
13833aca94dSKalle Valo {
13933aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
14033aca94dSKalle Valo 
14133aca94dSKalle Valo 	return rt2800ops->regbusy_read(rt2x00dev, offset, field, reg);
14233aca94dSKalle Valo }
14333aca94dSKalle Valo 
rt2800_read_eeprom(struct rt2x00_dev * rt2x00dev)14433aca94dSKalle Valo static inline int rt2800_read_eeprom(struct rt2x00_dev *rt2x00dev)
14533aca94dSKalle Valo {
14633aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
14733aca94dSKalle Valo 
14833aca94dSKalle Valo 	return rt2800ops->read_eeprom(rt2x00dev);
14933aca94dSKalle Valo }
15033aca94dSKalle Valo 
rt2800_hwcrypt_disabled(struct rt2x00_dev * rt2x00dev)15133aca94dSKalle Valo static inline bool rt2800_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev)
15233aca94dSKalle Valo {
15333aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
15433aca94dSKalle Valo 
15533aca94dSKalle Valo 	return rt2800ops->hwcrypt_disabled(rt2x00dev);
15633aca94dSKalle Valo }
15733aca94dSKalle Valo 
rt2800_drv_write_firmware(struct rt2x00_dev * rt2x00dev,const u8 * data,const size_t len)15833aca94dSKalle Valo static inline int rt2800_drv_write_firmware(struct rt2x00_dev *rt2x00dev,
15933aca94dSKalle Valo 					    const u8 *data, const size_t len)
16033aca94dSKalle Valo {
16133aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
16233aca94dSKalle Valo 
16333aca94dSKalle Valo 	return rt2800ops->drv_write_firmware(rt2x00dev, data, len);
16433aca94dSKalle Valo }
16533aca94dSKalle Valo 
rt2800_drv_init_registers(struct rt2x00_dev * rt2x00dev)16633aca94dSKalle Valo static inline int rt2800_drv_init_registers(struct rt2x00_dev *rt2x00dev)
16733aca94dSKalle Valo {
16833aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
16933aca94dSKalle Valo 
17033aca94dSKalle Valo 	return rt2800ops->drv_init_registers(rt2x00dev);
17133aca94dSKalle Valo }
17233aca94dSKalle Valo 
rt2800_drv_get_txwi(struct queue_entry * entry)17333aca94dSKalle Valo static inline __le32 *rt2800_drv_get_txwi(struct queue_entry *entry)
17433aca94dSKalle Valo {
17533aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = entry->queue->rt2x00dev->ops->drv;
17633aca94dSKalle Valo 
17733aca94dSKalle Valo 	return rt2800ops->drv_get_txwi(entry);
17833aca94dSKalle Valo }
17933aca94dSKalle Valo 
rt2800_drv_get_dma_done(struct data_queue * queue)1802034afe4SStanislaw Gruszka static inline unsigned int rt2800_drv_get_dma_done(struct data_queue *queue)
1812034afe4SStanislaw Gruszka {
1822034afe4SStanislaw Gruszka 	const struct rt2800_ops *rt2800ops = queue->rt2x00dev->ops->drv;
1832034afe4SStanislaw Gruszka 
1842034afe4SStanislaw Gruszka 	return rt2800ops->drv_get_dma_done(queue);
1852034afe4SStanislaw Gruszka }
1862034afe4SStanislaw Gruszka 
18733aca94dSKalle Valo void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
18833aca94dSKalle Valo 			const u8 command, const u8 token,
18933aca94dSKalle Valo 			const u8 arg0, const u8 arg1);
19033aca94dSKalle Valo 
19133aca94dSKalle Valo int rt2800_wait_csr_ready(struct rt2x00_dev *rt2x00dev);
19233aca94dSKalle Valo int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev);
19333aca94dSKalle Valo 
19433aca94dSKalle Valo int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev,
19533aca94dSKalle Valo 			  const u8 *data, const size_t len);
19633aca94dSKalle Valo int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
19733aca94dSKalle Valo 			 const u8 *data, const size_t len);
19833aca94dSKalle Valo 
19933aca94dSKalle Valo void rt2800_write_tx_data(struct queue_entry *entry,
20033aca94dSKalle Valo 			  struct txentry_desc *txdesc);
20133aca94dSKalle Valo void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc);
20233aca94dSKalle Valo 
203293dff78SStanislaw Gruszka void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
204293dff78SStanislaw Gruszka 			 bool match);
205889bb866SStanislaw Gruszka void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota);
2065c656c71SStanislaw Gruszka void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev);
2075c656c71SStanislaw Gruszka bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev);
2086efa7987SStanislaw Gruszka bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev);
20933aca94dSKalle Valo 
210759c5b59SStanislaw Gruszka void rt2800_watchdog(struct rt2x00_dev *rt2x00dev);
211759c5b59SStanislaw Gruszka 
21233aca94dSKalle Valo void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);
21333aca94dSKalle Valo void rt2800_clear_beacon(struct queue_entry *entry);
21433aca94dSKalle Valo 
21533aca94dSKalle Valo extern const struct rt2x00debug rt2800_rt2x00debug;
21633aca94dSKalle Valo 
21733aca94dSKalle Valo int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev);
21833aca94dSKalle Valo int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
21933aca94dSKalle Valo 			     struct rt2x00lib_crypto *crypto,
22033aca94dSKalle Valo 			     struct ieee80211_key_conf *key);
22133aca94dSKalle Valo int rt2800_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
22233aca94dSKalle Valo 			       struct rt2x00lib_crypto *crypto,
22333aca94dSKalle Valo 			       struct ieee80211_key_conf *key);
2249c87758cSStanislaw Gruszka int rt2800_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
22533aca94dSKalle Valo 		   struct ieee80211_sta *sta);
2269c87758cSStanislaw Gruszka int rt2800_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2279c87758cSStanislaw Gruszka 		      struct ieee80211_sta *sta);
22833aca94dSKalle Valo void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
22933aca94dSKalle Valo 			  const unsigned int filter_flags);
23033aca94dSKalle Valo void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
23133aca94dSKalle Valo 			struct rt2x00intf_conf *conf, const unsigned int flags);
23233aca94dSKalle Valo void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp,
23333aca94dSKalle Valo 		       u32 changed);
23433aca94dSKalle Valo void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant);
23533aca94dSKalle Valo void rt2800_config(struct rt2x00_dev *rt2x00dev,
23633aca94dSKalle Valo 		   struct rt2x00lib_conf *libconf,
23733aca94dSKalle Valo 		   const unsigned int flags);
23833aca94dSKalle Valo void rt2800_link_stats(struct rt2x00_dev *rt2x00dev, struct link_qual *qual);
23933aca94dSKalle Valo void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual);
24033aca94dSKalle Valo void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
24133aca94dSKalle Valo 		       const u32 count);
24233aca94dSKalle Valo void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev);
24333aca94dSKalle Valo void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev);
24433aca94dSKalle Valo 
24533aca94dSKalle Valo int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev);
24633aca94dSKalle Valo void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev);
24733aca94dSKalle Valo 
24833aca94dSKalle Valo int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev);
24933aca94dSKalle Valo int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev);
25033aca94dSKalle Valo 
25133aca94dSKalle Valo int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev);
25233aca94dSKalle Valo 
25333aca94dSKalle Valo void rt2800_get_key_seq(struct ieee80211_hw *hw,
25433aca94dSKalle Valo 			struct ieee80211_key_conf *key,
25533aca94dSKalle Valo 			struct ieee80211_key_seq *seq);
25633aca94dSKalle Valo int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value);
25733aca94dSKalle Valo int rt2800_conf_tx(struct ieee80211_hw *hw,
258b3e2130bSJohannes Berg 		   struct ieee80211_vif *vif,
259b3e2130bSJohannes Berg 		   unsigned int link_id, u16 queue_idx,
26033aca94dSKalle Valo 		   const struct ieee80211_tx_queue_params *params);
26133aca94dSKalle Valo u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
26233aca94dSKalle Valo int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
26350ea05efSSara Sharon 			struct ieee80211_ampdu_params *params);
26433aca94dSKalle Valo int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
26533aca94dSKalle Valo 		      struct survey_info *survey);
26633aca94dSKalle Valo void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);
26733aca94dSKalle Valo 
26833aca94dSKalle Valo void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
26933aca94dSKalle Valo 			       unsigned short *txwi_size,
27033aca94dSKalle Valo 			       unsigned short *rxwi_size);
27109db3b00SStanislaw Gruszka void rt2800_pre_reset_hw(struct rt2x00_dev *rt2x00dev);
27233aca94dSKalle Valo 
27333aca94dSKalle Valo #endif /* RT2800LIB_H */
274