133aca94dSKalle Valo /*
233aca94dSKalle Valo 	Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
333aca94dSKalle Valo 	Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
433aca94dSKalle Valo 	Copyright (C) 2009 Bartlomiej Zolnierkiewicz
533aca94dSKalle Valo 
633aca94dSKalle Valo 	This program is free software; you can redistribute it and/or modify
733aca94dSKalle Valo 	it under the terms of the GNU General Public License as published by
833aca94dSKalle Valo 	the Free Software Foundation; either version 2 of the License, or
933aca94dSKalle Valo 	(at your option) any later version.
1033aca94dSKalle Valo 
1133aca94dSKalle Valo 	This program is distributed in the hope that it will be useful,
1233aca94dSKalle Valo 	but WITHOUT ANY WARRANTY; without even the implied warranty of
1333aca94dSKalle Valo 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1433aca94dSKalle Valo 	GNU General Public License for more details.
1533aca94dSKalle Valo 
1633aca94dSKalle Valo 	You should have received a copy of the GNU General Public License
1733aca94dSKalle Valo 	along with this program; if not, see <http://www.gnu.org/licenses/>.
1833aca94dSKalle Valo  */
1933aca94dSKalle Valo 
2033aca94dSKalle Valo #ifndef RT2800LIB_H
2133aca94dSKalle Valo #define RT2800LIB_H
2233aca94dSKalle Valo 
2333aca94dSKalle Valo struct rt2800_ops {
2433aca94dSKalle Valo 	void (*register_read)(struct rt2x00_dev *rt2x00dev,
2533aca94dSKalle Valo 			      const unsigned int offset, u32 *value);
2633aca94dSKalle Valo 	void (*register_read_lock)(struct rt2x00_dev *rt2x00dev,
2733aca94dSKalle Valo 				   const unsigned int offset, u32 *value);
2833aca94dSKalle Valo 	void (*register_write)(struct rt2x00_dev *rt2x00dev,
2933aca94dSKalle Valo 			       const unsigned int offset, u32 value);
3033aca94dSKalle Valo 	void (*register_write_lock)(struct rt2x00_dev *rt2x00dev,
3133aca94dSKalle Valo 				    const unsigned int offset, u32 value);
3233aca94dSKalle Valo 
3333aca94dSKalle Valo 	void (*register_multiread)(struct rt2x00_dev *rt2x00dev,
3433aca94dSKalle Valo 				   const unsigned int offset,
3533aca94dSKalle Valo 				   void *value, const u32 length);
3633aca94dSKalle Valo 	void (*register_multiwrite)(struct rt2x00_dev *rt2x00dev,
3733aca94dSKalle Valo 				    const unsigned int offset,
3833aca94dSKalle Valo 				    const void *value, const u32 length);
3933aca94dSKalle Valo 
4033aca94dSKalle Valo 	int (*regbusy_read)(struct rt2x00_dev *rt2x00dev,
4133aca94dSKalle Valo 			    const unsigned int offset,
4233aca94dSKalle Valo 			    const struct rt2x00_field32 field, u32 *reg);
4333aca94dSKalle Valo 
4433aca94dSKalle Valo 	int (*read_eeprom)(struct rt2x00_dev *rt2x00dev);
4533aca94dSKalle Valo 	bool (*hwcrypt_disabled)(struct rt2x00_dev *rt2x00dev);
4633aca94dSKalle Valo 
4733aca94dSKalle Valo 	int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev,
4833aca94dSKalle Valo 				  const u8 *data, const size_t len);
4933aca94dSKalle Valo 	int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev);
5033aca94dSKalle Valo 	__le32 *(*drv_get_txwi)(struct queue_entry *entry);
5133aca94dSKalle Valo };
5233aca94dSKalle Valo 
5333aca94dSKalle Valo static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
5433aca94dSKalle Valo 					const unsigned int offset,
5533aca94dSKalle Valo 					u32 *value)
5633aca94dSKalle Valo {
5733aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
5833aca94dSKalle Valo 
5933aca94dSKalle Valo 	rt2800ops->register_read(rt2x00dev, offset, value);
6033aca94dSKalle Valo }
6133aca94dSKalle Valo 
6233aca94dSKalle Valo static inline void rt2800_register_read_lock(struct rt2x00_dev *rt2x00dev,
6333aca94dSKalle Valo 					     const unsigned int offset,
6433aca94dSKalle Valo 					     u32 *value)
6533aca94dSKalle Valo {
6633aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
6733aca94dSKalle Valo 
6833aca94dSKalle Valo 	rt2800ops->register_read_lock(rt2x00dev, offset, value);
6933aca94dSKalle Valo }
7033aca94dSKalle Valo 
7133aca94dSKalle Valo static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev,
7233aca94dSKalle Valo 					 const unsigned int offset,
7333aca94dSKalle Valo 					 u32 value)
7433aca94dSKalle Valo {
7533aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
7633aca94dSKalle Valo 
7733aca94dSKalle Valo 	rt2800ops->register_write(rt2x00dev, offset, value);
7833aca94dSKalle Valo }
7933aca94dSKalle Valo 
8033aca94dSKalle Valo static inline void rt2800_register_write_lock(struct rt2x00_dev *rt2x00dev,
8133aca94dSKalle Valo 					      const unsigned int offset,
8233aca94dSKalle Valo 					      u32 value)
8333aca94dSKalle Valo {
8433aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
8533aca94dSKalle Valo 
8633aca94dSKalle Valo 	rt2800ops->register_write_lock(rt2x00dev, offset, value);
8733aca94dSKalle Valo }
8833aca94dSKalle Valo 
8933aca94dSKalle Valo static inline void rt2800_register_multiread(struct rt2x00_dev *rt2x00dev,
9033aca94dSKalle Valo 					     const unsigned int offset,
9133aca94dSKalle Valo 					     void *value, const u32 length)
9233aca94dSKalle Valo {
9333aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
9433aca94dSKalle Valo 
9533aca94dSKalle Valo 	rt2800ops->register_multiread(rt2x00dev, offset, value, length);
9633aca94dSKalle Valo }
9733aca94dSKalle Valo 
9833aca94dSKalle Valo static inline void rt2800_register_multiwrite(struct rt2x00_dev *rt2x00dev,
9933aca94dSKalle Valo 					      const unsigned int offset,
10033aca94dSKalle Valo 					      const void *value,
10133aca94dSKalle Valo 					      const u32 length)
10233aca94dSKalle Valo {
10333aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
10433aca94dSKalle Valo 
10533aca94dSKalle Valo 	rt2800ops->register_multiwrite(rt2x00dev, offset, value, length);
10633aca94dSKalle Valo }
10733aca94dSKalle Valo 
10833aca94dSKalle Valo static inline int rt2800_regbusy_read(struct rt2x00_dev *rt2x00dev,
10933aca94dSKalle Valo 				      const unsigned int offset,
11033aca94dSKalle Valo 				      const struct rt2x00_field32 field,
11133aca94dSKalle Valo 				      u32 *reg)
11233aca94dSKalle Valo {
11333aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
11433aca94dSKalle Valo 
11533aca94dSKalle Valo 	return rt2800ops->regbusy_read(rt2x00dev, offset, field, reg);
11633aca94dSKalle Valo }
11733aca94dSKalle Valo 
11833aca94dSKalle Valo static inline int rt2800_read_eeprom(struct rt2x00_dev *rt2x00dev)
11933aca94dSKalle Valo {
12033aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
12133aca94dSKalle Valo 
12233aca94dSKalle Valo 	return rt2800ops->read_eeprom(rt2x00dev);
12333aca94dSKalle Valo }
12433aca94dSKalle Valo 
12533aca94dSKalle Valo static inline bool rt2800_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev)
12633aca94dSKalle Valo {
12733aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
12833aca94dSKalle Valo 
12933aca94dSKalle Valo 	return rt2800ops->hwcrypt_disabled(rt2x00dev);
13033aca94dSKalle Valo }
13133aca94dSKalle Valo 
13233aca94dSKalle Valo static inline int rt2800_drv_write_firmware(struct rt2x00_dev *rt2x00dev,
13333aca94dSKalle Valo 					    const u8 *data, const size_t len)
13433aca94dSKalle Valo {
13533aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
13633aca94dSKalle Valo 
13733aca94dSKalle Valo 	return rt2800ops->drv_write_firmware(rt2x00dev, data, len);
13833aca94dSKalle Valo }
13933aca94dSKalle Valo 
14033aca94dSKalle Valo static inline int rt2800_drv_init_registers(struct rt2x00_dev *rt2x00dev)
14133aca94dSKalle Valo {
14233aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
14333aca94dSKalle Valo 
14433aca94dSKalle Valo 	return rt2800ops->drv_init_registers(rt2x00dev);
14533aca94dSKalle Valo }
14633aca94dSKalle Valo 
14733aca94dSKalle Valo static inline __le32 *rt2800_drv_get_txwi(struct queue_entry *entry)
14833aca94dSKalle Valo {
14933aca94dSKalle Valo 	const struct rt2800_ops *rt2800ops = entry->queue->rt2x00dev->ops->drv;
15033aca94dSKalle Valo 
15133aca94dSKalle Valo 	return rt2800ops->drv_get_txwi(entry);
15233aca94dSKalle Valo }
15333aca94dSKalle Valo 
15433aca94dSKalle Valo void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
15533aca94dSKalle Valo 			const u8 command, const u8 token,
15633aca94dSKalle Valo 			const u8 arg0, const u8 arg1);
15733aca94dSKalle Valo 
15833aca94dSKalle Valo int rt2800_wait_csr_ready(struct rt2x00_dev *rt2x00dev);
15933aca94dSKalle Valo int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev);
16033aca94dSKalle Valo 
16133aca94dSKalle Valo int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev,
16233aca94dSKalle Valo 			  const u8 *data, const size_t len);
16333aca94dSKalle Valo int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
16433aca94dSKalle Valo 			 const u8 *data, const size_t len);
16533aca94dSKalle Valo 
16633aca94dSKalle Valo void rt2800_write_tx_data(struct queue_entry *entry,
16733aca94dSKalle Valo 			  struct txentry_desc *txdesc);
16833aca94dSKalle Valo void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc);
16933aca94dSKalle Valo 
17033aca94dSKalle Valo void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32* txwi);
17133aca94dSKalle Valo 
17233aca94dSKalle Valo void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);
17333aca94dSKalle Valo void rt2800_clear_beacon(struct queue_entry *entry);
17433aca94dSKalle Valo 
17533aca94dSKalle Valo extern const struct rt2x00debug rt2800_rt2x00debug;
17633aca94dSKalle Valo 
17733aca94dSKalle Valo int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev);
17833aca94dSKalle Valo int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
17933aca94dSKalle Valo 			     struct rt2x00lib_crypto *crypto,
18033aca94dSKalle Valo 			     struct ieee80211_key_conf *key);
18133aca94dSKalle Valo int rt2800_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
18233aca94dSKalle Valo 			       struct rt2x00lib_crypto *crypto,
18333aca94dSKalle Valo 			       struct ieee80211_key_conf *key);
18433aca94dSKalle Valo int rt2800_sta_add(struct rt2x00_dev *rt2x00dev, struct ieee80211_vif *vif,
18533aca94dSKalle Valo 		   struct ieee80211_sta *sta);
18633aca94dSKalle Valo int rt2800_sta_remove(struct rt2x00_dev *rt2x00dev, int wcid);
18733aca94dSKalle Valo void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
18833aca94dSKalle Valo 			  const unsigned int filter_flags);
18933aca94dSKalle Valo void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
19033aca94dSKalle Valo 			struct rt2x00intf_conf *conf, const unsigned int flags);
19133aca94dSKalle Valo void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp,
19233aca94dSKalle Valo 		       u32 changed);
19333aca94dSKalle Valo void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant);
19433aca94dSKalle Valo void rt2800_config(struct rt2x00_dev *rt2x00dev,
19533aca94dSKalle Valo 		   struct rt2x00lib_conf *libconf,
19633aca94dSKalle Valo 		   const unsigned int flags);
19733aca94dSKalle Valo void rt2800_link_stats(struct rt2x00_dev *rt2x00dev, struct link_qual *qual);
19833aca94dSKalle Valo void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual);
19933aca94dSKalle Valo void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
20033aca94dSKalle Valo 		       const u32 count);
20133aca94dSKalle Valo void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev);
20233aca94dSKalle Valo void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev);
20333aca94dSKalle Valo 
20433aca94dSKalle Valo int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev);
20533aca94dSKalle Valo void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev);
20633aca94dSKalle Valo 
20733aca94dSKalle Valo int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev);
20833aca94dSKalle Valo int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev);
20933aca94dSKalle Valo 
21033aca94dSKalle Valo int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev);
21133aca94dSKalle Valo 
21233aca94dSKalle Valo void rt2800_get_key_seq(struct ieee80211_hw *hw,
21333aca94dSKalle Valo 			struct ieee80211_key_conf *key,
21433aca94dSKalle Valo 			struct ieee80211_key_seq *seq);
21533aca94dSKalle Valo int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value);
21633aca94dSKalle Valo int rt2800_conf_tx(struct ieee80211_hw *hw,
21733aca94dSKalle Valo 		   struct ieee80211_vif *vif, u16 queue_idx,
21833aca94dSKalle Valo 		   const struct ieee80211_tx_queue_params *params);
21933aca94dSKalle Valo u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
22033aca94dSKalle Valo int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
22133aca94dSKalle Valo 			enum ieee80211_ampdu_mlme_action action,
22233aca94dSKalle Valo 			struct ieee80211_sta *sta, u16 tid, u16 *ssn,
22333aca94dSKalle Valo 			u8 buf_size, bool amsdu);
22433aca94dSKalle Valo int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
22533aca94dSKalle Valo 		      struct survey_info *survey);
22633aca94dSKalle Valo void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);
22733aca94dSKalle Valo 
22833aca94dSKalle Valo void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
22933aca94dSKalle Valo 			       unsigned short *txwi_size,
23033aca94dSKalle Valo 			       unsigned short *rxwi_size);
23133aca94dSKalle Valo 
23233aca94dSKalle Valo #endif /* RT2800LIB_H */
233