mwifiex: use separate wait condition for each command node
[pandora-kernel.git] / drivers / net / wireless / mwifiex / main.h
index 03691c0..7db20db 100644 (file)
@@ -37,6 +37,7 @@
 #include "ioctl.h"
 #include "util.h"
 #include "fw.h"
+#include "pcie.h"
 
 extern const char driver_version[];
 
@@ -45,14 +46,7 @@ enum {
        MWIFIEX_SYNC_CMD
 };
 
-#define DRV_MODE_STA       0x1
-
-struct mwifiex_drv_mode {
-       u16 drv_mode;
-       u16 intf_num;
-       struct mwifiex_bss_attr *bss_attr;
-};
-
+#define MWIFIEX_MAX_AP                         64
 
 #define MWIFIEX_DEFAULT_WATCHDOG_TIMEOUT       (5 * HZ)
 
@@ -114,6 +108,8 @@ struct mwifiex_drv_mode {
 
 #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;
@@ -163,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;
@@ -180,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;
 };
 
@@ -227,27 +227,10 @@ struct ieee_types_header {
        u8 len;
 } __packed;
 
-struct ieee_obss_scan_param {
-       u16 obss_scan_passive_dwell;
-       u16 obss_scan_active_dwell;
-       u16 bss_chan_width_trigger_scan_int;
-       u16 obss_scan_passive_total;
-       u16 obss_scan_active_total;
-       u16 bss_width_chan_trans_delay;
-       u16 obss_scan_active_threshold;
-} __packed;
-
-struct ieee_types_obss_scan_param {
-       struct ieee_types_header ieee_hdr;
-       struct ieee_obss_scan_param obss_scan;
-} __packed;
-
 #define MWIFIEX_SUPPORTED_RATES                 14
 
 #define MWIFIEX_SUPPORTED_RATES_EXT             32
 
-#define IEEE_MAX_IE_SIZE                       256
-
 struct ieee_types_vendor_specific {
        struct ieee_types_vendor_header vend_hdr;
        u8 data[IEEE_MAX_IE_SIZE - sizeof(struct ieee_types_vendor_header)];
@@ -291,8 +274,6 @@ struct mwifiex_bssdescriptor {
        u16 bss_co_2040_offset;
        u8 *bcn_ext_cap;
        u16 ext_cap_offset;
-       struct ieee_types_obss_scan_param *bcn_obss_scan;
-       u16 overlap_bss_offset;
        struct ieee_types_vendor_specific *bcn_wpa_ie;
        u16 wpa_offset;
        struct ieee_types_generic *bcn_rsn_ie;
@@ -301,8 +282,6 @@ struct mwifiex_bssdescriptor {
        u16 wapi_offset;
        u8 *beacon_buf;
        u32 beacon_buf_size;
-       u32 beacon_buf_size_max;
-
 };
 
 struct mwifiex_current_bss_params {
@@ -468,7 +447,7 @@ struct mwifiex_private {
        struct dentry *dfs_dev_dir;
 #endif
        u8 nick_name[16];
-       struct iw_statistics w_stats;
+       u8 qual_level, qual_noise;
        u16 current_key_index;
        struct semaphore async_sem;
        u8 scan_pending_on_block;
@@ -541,33 +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;
-       struct mwifiex_drv_mode *drv_mode;
        const struct firmware *firmware;
        char fw_name[32];
+       int winner;
        struct device *dev;
        bool surprise_removed;
        u32 fw_release_number;
@@ -624,15 +608,11 @@ struct mwifiex_adapter {
        u32 scan_processing;
        u16 region_code;
        struct mwifiex_802_11d_domain_reg domain_reg;
-       struct mwifiex_bssdescriptor *scan_table;
-       u32 num_in_scan_table;
        u16 scan_probes;
        u32 scan_mode;
        u16 specific_scan_time;
        u16 active_scan_time;
        u16 passive_scan_time;
-       u8 bcn_buf[MAX_SCAN_BEACON_BUFFER];
-       u8 *bcn_buf_end;
        u8 fw_bands;
        u8 adhoc_start_band;
        u8 config_bands;
@@ -673,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);
@@ -692,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);
@@ -765,13 +748,6 @@ void mwifiex_queue_scan_cmd(struct mwifiex_private *priv,
                            struct cmd_ctrl_node *cmd_node);
 int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
                            struct host_cmd_ds_command *resp);
-s32 mwifiex_find_ssid_in_list(struct mwifiex_private *priv,
-                               struct mwifiex_802_11_ssid *ssid, u8 *bssid,
-                               u32 mode);
-s32 mwifiex_find_bssid_in_list(struct mwifiex_private *priv, u8 *bssid,
-                                u32 mode);
-int mwifiex_find_best_network(struct mwifiex_private *priv,
-                             struct mwifiex_ssid_bssid *req_ssid_bssid);
 s32 mwifiex_ssid_cmp(struct mwifiex_802_11_ssid *ssid1,
                       struct mwifiex_802_11_ssid *ssid2);
 int mwifiex_associate(struct mwifiex_private *priv,
@@ -782,7 +758,6 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,
 int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
                                 struct host_cmd_ds_command *resp);
 void mwifiex_reset_connect_state(struct mwifiex_private *priv);
-void mwifiex_2040_coex_event(struct mwifiex_private *priv);
 u8 mwifiex_band_to_radio_type(u8 band);
 int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac);
 int mwifiex_adhoc_start(struct mwifiex_private *priv,
@@ -823,6 +798,8 @@ int mwifiex_cmd_get_hw_spec(struct mwifiex_private *priv,
 int mwifiex_ret_get_hw_spec(struct mwifiex_private *priv,
                            struct host_cmd_ds_command *resp);
 int is_command_pending(struct mwifiex_adapter *adapter);
+void mwifiex_init_priv_params(struct mwifiex_private *priv,
+                                               struct net_device *dev);
 
 /*
  * This function checks if the queuing is RA based or not.
@@ -912,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,
@@ -922,19 +899,18 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
 int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
                            struct net_device *dev);
 int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter);
-int mwifiex_bss_start(struct mwifiex_private *priv,
-                     struct mwifiex_ssid_bssid *ssid_bssid);
+int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
+                     struct mwifiex_802_11_ssid *req_ssid);
 int mwifiex_set_hs_params(struct mwifiex_private *priv,
                              u16 action, int cmd_type,
                              struct mwifiex_ds_hs_cfg *hscfg);
 int mwifiex_cancel_hs(struct mwifiex_private *priv, int cmd_type);
 int mwifiex_enable_hs(struct mwifiex_adapter *adapter);
+int mwifiex_disable_auto_ds(struct mwifiex_private *priv);
 int mwifiex_get_signal_info(struct mwifiex_private *priv,
                            struct mwifiex_ds_get_signal *signal);
 int mwifiex_drv_get_data_rate(struct mwifiex_private *priv,
                              struct mwifiex_rate_cfg *rate);
-int mwifiex_find_best_bss(struct mwifiex_private *priv,
-                         struct mwifiex_ssid_bssid *ssid_bssid);
 int mwifiex_request_scan(struct mwifiex_private *priv,
                         struct mwifiex_802_11_ssid *req_ssid);
 int mwifiex_set_user_scan_ioctl(struct mwifiex_private *priv,
@@ -983,12 +959,26 @@ int mwifiex_main_process(struct mwifiex_adapter *);
 
 int mwifiex_bss_set_channel(struct mwifiex_private *,
                            struct mwifiex_chan_freq_power *cfp);
-int mwifiex_bss_ioctl_find_bss(struct mwifiex_private *,
-                              struct mwifiex_ssid_bssid *);
 int mwifiex_set_radio_band_cfg(struct mwifiex_private *,
                         struct mwifiex_ds_band_cfg *);
 int mwifiex_get_bss_info(struct mwifiex_private *,
                         struct mwifiex_bss_info *);
+int mwifiex_fill_new_bss_desc(struct mwifiex_private *priv,
+                             u8 *bssid, s32 rssi, u8 *ie_buf,
+                             size_t ie_len, u16 beacon_period,
+                             u16 cap_info_bitmap, u8 band,
+                             struct mwifiex_bssdescriptor *bss_desc);
+int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
+                               struct mwifiex_bssdescriptor *bss_entry,
+                               u8 *ie_buf, u32 ie_len);
+int mwifiex_check_network_compatibility(struct mwifiex_private *priv,
+                                       struct mwifiex_bssdescriptor *bss_desc);
+
+struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
+                                       char *name, enum nl80211_iftype type,
+                                       u32 *flags, struct vif_params *params);
+int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev);
+
 
 #ifdef CONFIG_DEBUG_FS
 void mwifiex_debugfs_init(void);