mwifiex: use separate wait condition for each command node
[pandora-kernel.git] / drivers / net / wireless / mwifiex / main.h
index 4f40428..7db20db 100644 (file)
@@ -37,6 +37,7 @@
 #include "ioctl.h"
 #include "util.h"
 #include "fw.h"
+#include "pcie.h"
 
 extern const char driver_version[];
 
@@ -107,6 +108,8 @@ enum {
 
 #define MAX_FREQUENCY_BAND_BG   2484
 
+#define MWIFIEX_EVENT_HEADER_LEN           4
+
 struct mwifiex_dbg {
        u32 num_cmd_host_to_card_failure;
        u32 num_cmd_sleep_cfm_host_to_card_failure;
@@ -156,6 +159,11 @@ enum MWIFIEX_PS_STATE {
        PS_STATE_SLEEP
 };
 
+enum mwifiex_iface_type {
+       MWIFIEX_SDIO,
+       MWIFIEX_PCIE,
+};
+
 struct mwifiex_add_ba_param {
        u32 tx_win_size;
        u32 rx_win_size;
@@ -173,7 +181,6 @@ struct mwifiex_ra_list_tbl {
        struct sk_buff_head skb_head;
        u8 ra[ETH_ALEN];
        u32 total_pkts_size;
-       u32 total_pkts;
        u32 is_11n_enabled;
 };
 
@@ -513,32 +520,38 @@ struct cmd_ctrl_node {
        void *data_buf;
        u32 wait_q_enabled;
        struct sk_buff *skb;
+       u8 *condition;
+       u8 cmd_wait_q_woken;
 };
 
 struct mwifiex_if_ops {
        int (*init_if) (struct mwifiex_adapter *);
        void (*cleanup_if) (struct mwifiex_adapter *);
-       int (*check_fw_status) (struct mwifiex_adapter *, u32, int *);
+       int (*check_fw_status) (struct mwifiex_adapter *, u32);
        int (*prog_fw) (struct mwifiex_adapter *, struct mwifiex_fw_image *);
        int (*register_dev) (struct mwifiex_adapter *);
        void (*unregister_dev) (struct mwifiex_adapter *);
        int (*enable_int) (struct mwifiex_adapter *);
        int (*process_int_status) (struct mwifiex_adapter *);
-       int (*host_to_card) (struct mwifiex_adapter *, u8,
-                            u8 *payload, u32 pkt_len,
+       int (*host_to_card) (struct mwifiex_adapter *, u8, struct sk_buff *,
                             struct mwifiex_tx_param *);
        int (*wakeup) (struct mwifiex_adapter *);
        int (*wakeup_complete) (struct mwifiex_adapter *);
 
+       /* Interface specific functions */
        void (*update_mp_end_port) (struct mwifiex_adapter *, u16);
        void (*cleanup_mpa_buf) (struct mwifiex_adapter *);
+       int (*cmdrsp_complete) (struct mwifiex_adapter *, struct sk_buff *);
+       int (*event_complete) (struct mwifiex_adapter *, struct sk_buff *);
 };
 
 struct mwifiex_adapter {
+       u8 iface_type;
        struct mwifiex_private *priv[MWIFIEX_MAX_BSS_NUM];
        u8 priv_num;
        const struct firmware *firmware;
        char fw_name[32];
+       int winner;
        struct device *dev;
        bool surprise_removed;
        u32 fw_release_number;
@@ -640,6 +653,8 @@ struct mwifiex_adapter {
        u32 arp_filter_size;
        u16 cmd_wait_q_required;
        struct mwifiex_wait_queue cmd_wait_q;
+       u8 scan_wait_q_woken;
+       struct cmd_ctrl_node *cmd_queued;
 };
 
 int mwifiex_init_lock_list(struct mwifiex_adapter *adapter);
@@ -659,7 +674,8 @@ int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb);
 
 int mwifiex_process_event(struct mwifiex_adapter *adapter);
 
-int mwifiex_complete_cmd(struct mwifiex_adapter *adapter);
+int mwifiex_complete_cmd(struct mwifiex_adapter *adapter,
+                        struct cmd_ctrl_node *cmd_node);
 
 int mwifiex_send_cmd_async(struct mwifiex_private *priv, uint16_t cmd_no,
                           u16 cmd_action, u32 cmd_oid, void *data_buf);
@@ -873,7 +889,7 @@ struct mwifiex_private *mwifiex_bss_index_to_priv(struct mwifiex_adapter
                                                *adapter, u8 bss_index);
 int mwifiex_init_shutdown_fw(struct mwifiex_private *priv,
                             u32 func_init_shutdown);
-int mwifiex_add_card(void *, struct semaphore *, struct mwifiex_if_ops *);
+int mwifiex_add_card(void *, struct semaphore *, struct mwifiex_if_ops *, u8);
 int mwifiex_remove_card(struct mwifiex_adapter *, struct semaphore *);
 
 void mwifiex_get_version(struct mwifiex_adapter *adapter, char *version,