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