ath10k: rename board_data in struct ath10k
[cascardo/linux.git] / drivers / net / wireless / ath / ath10k / core.h
index 539336d..90d9399 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/types.h>
 #include <linux/pci.h>
 
+#include "htt.h"
 #include "htc.h"
 #include "hw.h"
 #include "targaddrs.h"
 #define ATH10K_SCAN_ID 0
 #define WMI_READY_TIMEOUT (5 * HZ)
 #define ATH10K_FLUSH_TIMEOUT_HZ (5*HZ)
+#define ATH10K_NUM_CHANS 38
 
 /* Antenna noise floor */
 #define ATH10K_DEFAULT_NOISE_FLOOR -95
 
-struct ath10k;
+#define ATH10K_MAX_NUM_MGMT_PENDING 16
 
-enum ath10k_bus {
-       ATH10K_BUS_PCI,
-};
+struct ath10k;
 
 struct ath10k_skb_cb {
        dma_addr_t paddr;
        bool is_mapped;
        bool is_aborted;
+       u8 vdev_id;
 
        struct {
-               u8 vdev_id;
-               u16 msdu_id;
                u8 tid;
                bool is_offchan;
-               bool is_conf;
-               bool discard;
-               bool no_ack;
-               u8 refcount;
-               struct sk_buff *txfrag;
-               struct sk_buff *msdu;
-       } __packed htt;
 
-       /* 4 bytes left on 64bit arch */
+               u8 frag_len;
+               u8 pad_len;
+       } __packed htt;
 } __packed;
 
 static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb)
@@ -110,15 +104,26 @@ struct ath10k_bmi {
        bool done_sent;
 };
 
+#define ATH10K_MAX_MEM_REQS 16
+
+struct ath10k_mem_chunk {
+       void *vaddr;
+       dma_addr_t paddr;
+       u32 len;
+       u32 req_id;
+};
+
 struct ath10k_wmi {
        enum ath10k_htc_ep_id eid;
        struct completion service_ready;
        struct completion unified_ready;
-       atomic_t pending_tx_count;
-       wait_queue_head_t wq;
+       wait_queue_head_t tx_credits_wq;
+       struct wmi_cmd_map *cmd;
+       struct wmi_vdev_param_map *vdev_param;
+       struct wmi_pdev_param_map *pdev_param;
 
-       struct sk_buff_head wmi_event_list;
-       struct work_struct wmi_event_work;
+       u32 num_mem_chunks;
+       struct ath10k_mem_chunk mem_chunks[ATH10K_MAX_MEM_REQS];
 };
 
 struct ath10k_peer_stat {
@@ -205,6 +210,7 @@ struct ath10k_vif {
        enum wmi_vdev_subtype vdev_subtype;
        u32 beacon_interval;
        u32 dtim_period;
+       struct sk_buff *beacon;
 
        struct ath10k *ar;
        struct ieee80211_vif *vif;
@@ -248,6 +254,45 @@ struct ath10k_debug {
        u32 wmi_service_bitmap[WMI_SERVICE_BM_SIZE];
 
        struct completion event_stats_compl;
+
+       unsigned long htt_stats_mask;
+       struct delayed_work htt_stats_dwork;
+};
+
+enum ath10k_state {
+       ATH10K_STATE_OFF = 0,
+       ATH10K_STATE_ON,
+
+       /* When doing firmware recovery the device is first powered down.
+        * mac80211 is supposed to call in to start() hook later on. It is
+        * however possible that driver unloading and firmware crash overlap.
+        * mac80211 can wait on conf_mutex in stop() while the device is
+        * stopped in ath10k_core_restart() work holding conf_mutex. The state
+        * RESTARTED means that the device is up and mac80211 has started hw
+        * reconfiguration. Once mac80211 is done with the reconfiguration we
+        * set the state to STATE_ON in restart_complete(). */
+       ATH10K_STATE_RESTARTING,
+       ATH10K_STATE_RESTARTED,
+
+       /* The device has crashed while restarting hw. This state is like ON
+        * but commands are blocked in HTC and -ECOMM response is given. This
+        * prevents completion timeouts and makes the driver more responsive to
+        * userspace commands. This is also prevents recursive recovery. */
+       ATH10K_STATE_WEDGED,
+};
+
+enum ath10k_fw_features {
+       /* wmi_mgmt_rx_hdr contains extra RSSI information */
+       ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0,
+
+       /* firmware from 10X branch */
+       ATH10K_FW_FEATURE_WMI_10X = 1,
+
+       /* firmware support tx frame management over WMI, otherwise it's HTT */
+       ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX = 2,
+
+       /* keep last */
+       ATH10K_FW_FEATURE_COUNT,
 };
 
 struct ath10k {
@@ -256,6 +301,7 @@ struct ath10k {
        struct device *dev;
        u8 mac_addr[ETH_ALEN];
 
+       u32 chip_id;
        u32 target_version;
        u8 fw_version_major;
        u32 fw_version_minor;
@@ -266,6 +312,9 @@ struct ath10k {
        u32 hw_max_tx_power;
        u32 ht_cap_info;
        u32 vht_cap_info;
+       u32 num_rf_chains;
+
+       DECLARE_BITMAP(fw_features, ATH10K_FW_FEATURE_COUNT);
 
        struct targetdef *targetdef;
        struct hostdef *hostdef;
@@ -274,19 +323,16 @@ struct ath10k {
 
        struct {
                void *priv;
-               enum ath10k_bus bus;
                const struct ath10k_hif_ops *ops;
        } hif;
 
-       struct ath10k_wmi wmi;
-
        wait_queue_head_t event_queue;
        bool is_target_paused;
 
        struct ath10k_bmi bmi;
-
-       struct ath10k_htc *htc;
-       struct ath10k_htt *htt;
+       struct ath10k_wmi wmi;
+       struct ath10k_htc htc;
+       struct ath10k_htt htt;
 
        struct ath10k_hw_params {
                u32 id;
@@ -301,6 +347,10 @@ struct ath10k {
                } fw;
        } hw_params;
 
+       const struct firmware *board;
+       const struct firmware *otp;
+       const struct firmware *firmware;
+
        struct {
                struct completion started;
                struct completion completed;
@@ -350,20 +400,31 @@ struct ath10k {
        struct completion offchan_tx_completed;
        struct sk_buff *offchan_tx_skb;
 
+       struct work_struct wmi_mgmt_tx_work;
+       struct sk_buff_head wmi_mgmt_tx_queue;
+
+       enum ath10k_state state;
+
+       struct work_struct restart_work;
+
+       /* cycle count is reported twice for each visited channel during scan.
+        * access protected by data_lock */
+       u32 survey_last_rx_clear_count;
+       u32 survey_last_cycle_count;
+       struct survey_info survey[ATH10K_NUM_CHANS];
+
 #ifdef CONFIG_ATH10K_DEBUGFS
        struct ath10k_debug debug;
 #endif
 };
 
 struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
-                                 enum ath10k_bus bus,
                                  const struct ath10k_hif_ops *hif_ops);
 void ath10k_core_destroy(struct ath10k *ar);
 
-int ath10k_core_register(struct ath10k *ar);
+int ath10k_core_start(struct ath10k *ar);
+void ath10k_core_stop(struct ath10k *ar);
+int ath10k_core_register(struct ath10k *ar, u32 chip_id);
 void ath10k_core_unregister(struct ath10k *ar);
 
-int ath10k_core_target_suspend(struct ath10k *ar);
-int ath10k_core_target_resume(struct ath10k *ar);
-
 #endif /* _CORE_H_ */