summaryrefslogtreecommitdiff
path: root/mwl_fwcmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'mwl_fwcmd.c')
-rw-r--r--mwl_fwcmd.c594
1 files changed, 286 insertions, 308 deletions
diff --git a/mwl_fwcmd.c b/mwl_fwcmd.c
index 9cb95bd..6270177 100644
--- a/mwl_fwcmd.c
+++ b/mwl_fwcmd.c
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2006-2014 Marvell International Ltd.
+* Copyright (c) 2006-2015 Marvell International Ltd.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -34,28 +34,32 @@
* 16 bit host command code
*/
#define HOSTCMD_CMD_GET_HW_SPEC 0x0003
-#define HOSTCMD_CMD_SET_HW_SPEC 0x0004
+#define HOSTCMD_CMD_SET_HW_SPEC 0x0004
#define HOSTCMD_CMD_802_11_GET_STAT 0x0014
#define HOSTCMD_CMD_802_11_RADIO_CONTROL 0x001c
#define HOSTCMD_CMD_802_11_TX_POWER 0x001f
#define HOSTCMD_CMD_802_11_RF_ANTENNA 0x0020
#define HOSTCMD_CMD_BROADCAST_SSID_ENABLE 0x0050 /* per-vif */
#define HOSTCMD_CMD_SET_RF_CHANNEL 0x010a
+#define HOSTCMD_CMD_SET_AID 0x010d /* per-vif */
+#define HOSTCMD_CMD_SET_INFRA_MODE 0x010e /* per-vif */
#define HOSTCMD_CMD_802_11_RTS_THSD 0x0113
#define HOSTCMD_CMD_SET_EDCA_PARAMS 0x0115
#define HOSTCMD_CMD_SET_WMM_MODE 0x0123
#define HOSTCMD_CMD_SET_FIXED_RATE 0x0126
#define HOSTCMD_CMD_SET_IES 0x0127
-#define HOSTCMD_CMD_SET_RATE_ADAPT_MODE 0x0203
+#define HOSTCMD_CMD_SET_MAC_ADDR 0x0202 /* per-vif */
+#define HOSTCMD_CMD_SET_RATE_ADAPT_MODE 0x0203
#define HOSTCMD_CMD_GET_WATCHDOG_BITMAP 0x0205
+#define HOSTCMD_CMD_DEL_MAC_ADDR 0x0206 /* pre-vif */
#define HOSTCMD_CMD_BSS_START 0x1100 /* per-vif */
#define HOSTCMD_CMD_AP_BEACON 0x1101 /* per-vif */
#define HOSTCMD_CMD_SET_NEW_STN 0x1111 /* per-vif */
#define HOSTCMD_CMD_SET_APMODE 0x1114
-#define HOSTCMD_CMD_UPDATE_ENCRYPTION 0x1122 /* per-vif */
-#define HOSTCMD_CMD_BASTREAM 0x1125
-#define HOSTCMD_CMD_DWDS_ENABLE 0x1144
-#define HOSTCMD_CMD_FW_FLUSH_TIMER 0x1148
+#define HOSTCMD_CMD_UPDATE_ENCRYPTION 0x1122 /* per-vif */
+#define HOSTCMD_CMD_BASTREAM 0x1125
+#define HOSTCMD_CMD_DWDS_ENABLE 0x1144
+#define HOSTCMD_CMD_FW_FLUSH_TIMER 0x1148
#define HOSTCMD_CMD_SET_CDD 0x1150
/*
@@ -71,8 +75,8 @@
/*
* Define channel related constants
*/
-#define FREQ_BAND_2DOT4GHZ 0x1
-#define FREQ_BAND_4DOT9GHZ 0x2
+#define FREQ_BAND_2DOT4GHZ 0x1
+#define FREQ_BAND_4DOT9GHZ 0x2
#define FREQ_BAND_5GHZ 0x4
#define FREQ_BAND_5DOT2GHZ 0x8
#define CH_AUTO_WIDTH 0
@@ -111,15 +115,15 @@
#define MAX_ENCR_KEY_LENGTH 16
#define MIC_KEY_LENGTH 8
-#define KEY_TYPE_ID_WEP 0x00 /* Key type is WEP */
-#define KEY_TYPE_ID_TKIP 0x01 /* Key type is TKIP */
-#define KEY_TYPE_ID_AES 0x02 /* Key type is AES-CCMP */
+#define KEY_TYPE_ID_WEP 0x00 /* Key type is WEP */
+#define KEY_TYPE_ID_TKIP 0x01 /* Key type is TKIP */
+#define KEY_TYPE_ID_AES 0x02 /* Key type is AES-CCMP */
-#define ENCR_KEY_FLAG_TXGROUPKEY 0x00000004 /* Group key for TX */
-#define ENCR_KEY_FLAG_PAIRWISE 0x00000008 /* pairwise */
-#define ENCR_KEY_FLAG_TSC_VALID 0x00000040 /* Sequence counters are valid */
-#define ENCR_KEY_FLAG_WEP_TXKEY 0x01000000 /* Tx key for WEP */
-#define ENCR_KEY_FLAG_MICKEY_VALID 0x02000000 /* Tx/Rx MIC keys are valid */
+#define ENCR_KEY_FLAG_TXGROUPKEY 0x00000004 /* Group key for TX */
+#define ENCR_KEY_FLAG_PAIRWISE 0x00000008 /* pairwise */
+#define ENCR_KEY_FLAG_TSC_VALID 0x00000040 /* Sequence counters are valid */
+#define ENCR_KEY_FLAG_WEP_TXKEY 0x01000000 /* Tx key for WEP */
+#define ENCR_KEY_FLAG_MICKEY_VALID 0x02000000 /* Tx/Rx MIC keys are valid */
/*
* Define block ack related constants
@@ -137,7 +141,7 @@
/* Misc
*/
#define MWL_SPIN_LOCK(X) SPIN_LOCK_IRQSAVE(X, flags)
-#define MWL_SPIN_UNLOCK(X) SPIN_UNLOCK_IRQRESTORE(X, flags)
+#define MWL_SPIN_UNLOCK(X) SPIN_UNLOCK_IRQRESTORE(X, flags)
#define MAX_ENCR_KEY_LENGTH 16
#define MIC_KEY_LENGTH 8
@@ -146,31 +150,24 @@
*/
enum {
-
WL_DISABLE = 0,
WL_ENABLE = 1,
WL_DISABLE_VMAC = 0x80,
-
};
enum {
-
WL_GET = 0,
WL_SET = 1,
WL_RESET = 2,
-
};
enum {
-
WL_LONG_PREAMBLE = 1,
WL_SHORT_PREAMBLE = 3,
WL_AUTO_PREAMBLE = 5,
-
};
enum encr_action_type {
-
/* request to enable/disable HW encryption */
ENCR_ACTION_ENABLE_HW_ENCR,
/* request to set encryption key */
@@ -178,17 +175,21 @@ enum encr_action_type {
/* request to remove one or more keys */
ENCR_ACTION_TYPE_REMOVE_KEY,
ENCR_ACTION_TYPE_SET_GROUP_KEY,
-
};
enum ba_action_type {
-
BA_CREATE_STREAM,
BA_UPDATE_STREAM,
BA_DESTROY_STREAM,
BA_FLUSH_STREAM,
BA_CHECK_STREAM,
+};
+enum mac_type {
+ WL_MAC_TYPE_PRIMARY_CLIENT,
+ WL_MAC_TYPE_SECONDARY_CLIENT,
+ WL_MAC_TYPE_PRIMARY_AP,
+ WL_MAC_TYPE_SECONDARY_AP,
};
/*
@@ -196,13 +197,11 @@ enum ba_action_type {
*/
struct hostcmd_header {
-
u16 cmd;
u16 len;
u8 seq_num;
u8 macid;
u16 result;
-
} __packed;
/*
@@ -210,7 +209,6 @@ struct hostcmd_header {
*/
struct hostcmd_cmd_get_hw_spec {
-
struct hostcmd_header cmd_hdr;
u8 version; /* version of the HW */
u8 host_if; /* host interface */
@@ -225,7 +223,6 @@ struct hostcmd_cmd_get_hw_spec {
u32 rxpd_rd_ptr;
u32 fw_awake_cookie;
u32 wcb_base[SYSADPT_TOTAL_TX_QUEUES - 1];
-
} __packed;
/*
@@ -233,7 +230,6 @@ struct hostcmd_cmd_get_hw_spec {
*/
struct hostcmd_cmd_set_hw_spec {
-
struct hostcmd_header cmd_hdr;
u8 version; /* HW revision */
u8 host_if; /* Host interface */
@@ -259,7 +255,6 @@ struct hostcmd_cmd_set_hw_spec {
u32 reserved: 21; /* Reserved */
u32 tx_wcb_num_per_queue;
u32 total_rx_wcb;
-
} __packed;
/*
@@ -267,7 +262,6 @@ struct hostcmd_cmd_set_hw_spec {
*/
struct hostcmd_cmd_802_11_get_stat {
-
struct hostcmd_header cmd_hdr;
u32 tx_retry_successes;
u32 tx_multiple_retry_successes;
@@ -302,7 +296,6 @@ struct hostcmd_cmd_802_11_get_stat {
u32 rx_errors;
u32 rx_rts_count;
u32 tx_cts_count;
-
} __packed;
/*
@@ -310,12 +303,10 @@ struct hostcmd_cmd_802_11_get_stat {
*/
struct hostcmd_cmd_802_11_radio_control {
-
struct hostcmd_header cmd_hdr;
u16 action;
u16 control; /* @bit0: 1/0,on/off, @bit1: 1/0, long/short @bit2: 1/0,auto/fix */
u16 radio_on;
-
} __packed;
/*
@@ -323,7 +314,6 @@ struct hostcmd_cmd_802_11_radio_control {
*/
struct hostcmd_cmd_802_11_tx_power {
-
struct hostcmd_header cmd_hdr;
u16 action;
u16 band;
@@ -331,7 +321,6 @@ struct hostcmd_cmd_802_11_tx_power {
u16 bw;
u16 sub_ch;
u16 power_level_list[SYSADPT_TX_POWER_LEVEL_TOTAL];
-
} __packed;
/*
@@ -339,11 +328,9 @@ struct hostcmd_cmd_802_11_tx_power {
*/
struct hostcmd_cmd_802_11_rf_antenna {
-
struct hostcmd_header cmd_hdr;
u16 action;
u16 antenna_mode; /* Number of antennas or 0xffff(diversity) */
-
} __packed;
/*
@@ -351,10 +338,8 @@ struct hostcmd_cmd_802_11_rf_antenna {
*/
struct hostcmd_cmd_broadcast_ssid_enable {
-
struct hostcmd_header cmd_hdr;
u32 enable;
-
} __packed;
/*
@@ -362,21 +347,37 @@ struct hostcmd_cmd_broadcast_ssid_enable {
*/
struct chnl_flags_11ac {
-
u32 freq_band:6; /* bit0=1: 2.4GHz,bit1=1: 4.9GHz,bit2=1: 5GHz,bit3=1: 5.2GHz, */
u32 chnl_width:5; /* bit6=1:10MHz, bit7=1:20MHz, bit8=1:40MHz */
u32 act_primary:3; /* 000: 1st 20MHz chan, 001:2nd 20MHz chan, 011:3rd 20MHz chan, 100:4th 20MHz chan */
u32 reserved:18;
-
} __packed;
struct hostcmd_cmd_set_rf_channel {
-
struct hostcmd_header cmd_hdr;
u16 action;
u8 curr_chnl;
struct chnl_flags_11ac chnl_flags;
+} __packed;
+
+/*
+ * HOSTCMD_CMD_SET_AID
+ */
+
+struct hostcmd_cmd_set_aid {
+ struct hostcmd_header cmd_hdr;
+ u16 aid;
+ u8 mac_addr[ETH_ALEN]; /* AP's Mac Address(BSSID) */
+ u32 gprotect;
+ u8 ap_rates[SYSADPT_MAX_DATA_RATES_G];
+} __packed;
+/*
+ * HOSTCMD_CMD_SET_INFRA_MODE
+ */
+
+struct hostcmd_cmd_set_infra_mode {
+ struct hostcmd_header cmd_hdr;
} __packed;
/*
@@ -384,11 +385,9 @@ struct hostcmd_cmd_set_rf_channel {
*/
struct hostcmd_cmd_802_11_rts_thsd {
-
struct hostcmd_header cmd_hdr;
u16 action;
u16 threshold;
-
} __packed;
/*
@@ -396,7 +395,6 @@ struct hostcmd_cmd_802_11_rts_thsd {
*/
struct hostcmd_cmd_set_edca_params {
-
struct hostcmd_header cmd_hdr;
u16 action; /* 0 = get all, 0x1 =set CWMin/Max, 0x2 = set TXOP , 0x4 =set AIFSN */
u16 txop; /* in unit of 32 us */
@@ -404,7 +402,6 @@ struct hostcmd_cmd_set_edca_params {
u32 cw_min; /* 0~15 */
u8 aifsn;
u8 txq_num; /* Tx Queue number. */
-
} __packed;
/*
@@ -412,33 +409,26 @@ struct hostcmd_cmd_set_edca_params {
*/
struct hostcmd_cmd_set_wmm_mode {
-
struct hostcmd_header cmd_hdr;
u16 action; /* 0->unset, 1->set */
-
} __packed;
/*
* HOSTCMD_CMD_SET_FIXED_RATE
*/
-struct fix_rate_flag {
- /* lower rate after the retry count */
+struct fix_rate_flag { /* lower rate after the retry count */
u32 fix_rate_type; /* 0: legacy, 1: HT */
u32 retry_count_valid; /* 0: retry count is not valid, 1: use retry count specified */
-
} __packed;
struct fix_rate_entry {
-
struct fix_rate_flag fix_rate_type_flags;
u32 fixed_rate; /* depending on the flags above, this can be either a legacy rate(not index) or an MCS code. */
u32 retry_count;
-
} __packed;
struct hostcmd_cmd_set_fixed_rate {
-
struct hostcmd_header cmd_hdr;
u32 action; /* HOSTCMD_ACT_NOT_USE_FIXED_RATE 0x0002 */
u32 allow_rate_drop; /* use fixed rate specified but firmware can drop to */
@@ -447,7 +437,6 @@ struct hostcmd_cmd_set_fixed_rate {
u8 multicast_rate;
u8 multi_rate_tx_type;
u8 management_rate;
-
} __packed;
/*
@@ -455,7 +444,6 @@ struct hostcmd_cmd_set_fixed_rate {
*/
struct hostcmd_cmd_set_ies {
-
struct hostcmd_header cmd_hdr;
u16 action; /* 0->unset, 1->set */
u16 ie_list_len_ht;
@@ -465,7 +453,6 @@ struct hostcmd_cmd_set_ies {
u8 ie_list_ht[148];
u8 ie_list_vht[24];
u8 ie_list_proprietary[112];
-
} __packed;
/*
@@ -473,11 +460,19 @@ struct hostcmd_cmd_set_ies {
*/
struct hostcmd_cmd_set_rate_adapt_mode {
-
struct hostcmd_header cmd_hdr;
u16 action;
u16 rate_adapt_mode; /* 0:Indoor, 1:Outdoor */
+} __packed;
+/*
+ * HOSTCMD_CMD_SET_MAC_ADDR, HOSTCMD_CMD_DEL_MAC_ADDR
+ */
+
+struct hostcmd_cmd_set_mac_addr {
+ struct hostcmd_header cmd_hdr;
+ u16 mac_type;
+ u8 mac_addr[ETH_ALEN];
} __packed;
/*
@@ -485,10 +480,8 @@ struct hostcmd_cmd_set_rate_adapt_mode {
*/
struct hostcmd_cmd_get_watchdog_bitmap {
-
struct hostcmd_header cmd_hdr;
u8 watchdog_bitmap; /* for SW/BA */
-
} __packed;
/*
@@ -496,10 +489,8 @@ struct hostcmd_cmd_get_watchdog_bitmap {
*/
struct hostcmd_cmd_bss_start {
-
struct hostcmd_header cmd_hdr;
u32 enable; /* FALSE: Disable or TRUE: Enable */
-
} __packed;
/*
@@ -507,59 +498,46 @@ struct hostcmd_cmd_bss_start {
*/
struct cf_params {
-
u8 elem_id;
u8 len;
u8 cfp_cnt;
u8 cfp_period;
u16 cfp_max_duration;
u16 cfp_duration_remaining;
-
} __packed;
struct ibss_params {
-
u8 elem_id;
u8 len;
u16 atim_window;
-
} __packed;
union ss_params {
-
struct cf_params cf_param_set;
struct ibss_params ibss_param_set;
-
} __packed;
struct fh_params {
-
u8 elem_id;
u8 len;
u16 dwell_time;
u8 hop_set;
u8 hop_pattern;
u8 hop_index;
-
} __packed;
struct ds_params {
-
u8 elem_id;
u8 len;
u8 current_chnl;
-
} __packed;
union phy_params {
-
struct fh_params fh_param_set;
struct ds_params ds_param_set;
-
} __packed;
struct rsn_ie {
-
u8 elem_id;
u8 len;
u8 oui_type[4]; /* 00:50:f2:01 */
@@ -569,11 +547,9 @@ struct rsn_ie {
u8 pws_key_cipher_list[4];
u8 auth_key_cnt[2];
u8 auth_key_list[4];
-
} __packed;
struct rsn48_ie {
-
u8 elem_id;
u8 len;
u8 ver[2];
@@ -583,35 +559,30 @@ struct rsn48_ie {
u8 auth_key_cnt[2];
u8 auth_key_list[4];
u8 rsn_cap[2];
-
+ u8 pmk_id_cnt[2];
+ u8 pmk_id_list[16]; /* Should modify to 16 * S */
+ u8 reserved[8];
} __packed;
struct aci_aifsn_field {
-
u8 aifsn:4;
u8 acm:1;
u8 aci:2;
u8 rsvd:1;
-
} __packed;
struct ecw_min_max_field {
-
u8 ecw_min:4;
u8 ecw_max:4;
-
} __packed;
struct ac_param_rcd {
-
struct aci_aifsn_field aci_aifsn;
struct ecw_min_max_field ecw_min_max;
u16 txop_lim;
-
} __packed;
struct wmm_param_elem {
-
u8 elem_id;
u8 len;
u8 oui[3];
@@ -623,28 +594,22 @@ struct wmm_param_elem {
struct ac_param_rcd ac_bk;
struct ac_param_rcd ac_vi;
struct ac_param_rcd ac_vo;
-
} __packed;
struct channel_info {
-
u8 first_channel_num;
u8 num_channels;
u8 max_tx_pwr_level;
-
} __packed;
struct country {
-
u8 elem_id;
u8 len;
u8 country_str[3];
struct channel_info channel_info[40];
-
} __packetd;
struct start_cmd {
-
u8 sta_mac_addr[ETH_ALEN];
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 bss_type;
@@ -661,14 +626,11 @@ struct start_cmd {
struct wmm_param_elem wmm_param;
struct country country;
u32 ap_rf_type; /* 0->B, 1->G, 2->Mixed, 3->A, 4->11J */
-
} __packed;
struct hostcmd_cmd_ap_beacon {
-
struct hostcmd_header cmd_hdr;
struct start_cmd start_cmd;
-
} __packed;
/*
@@ -676,7 +638,6 @@ struct hostcmd_cmd_ap_beacon {
*/
struct cap_info {
-
u16 ess:1;
u16 ibss:1;
u16 cf_pollable:1;
@@ -693,31 +654,25 @@ struct cap_info {
u16 dsss_ofdm:1;
u16 block_ack:1;
u16 rsrvd2:1;
-
} __packed;
struct add_ht_chnl {
-
u8 ext_chnl_offset:2;
u8 sta_chnl_width:1;
u8 rifs_mode:1;
u8 psmp_stas_only:1;
u8 srvc_intvl_gran:3;
-
} __packed;
struct add_ht_op_mode {
-
u16 op_mode:2;
u16 non_gf_sta_present:1;
u16 rrans_burst_limit:1;
u16 non_ht_sta_present:1;
u16 rsrv:11;
-
} __packed;
struct add_ht_stbc {
-
u16 bsc_stbc:7;
u16 dual_stbc_proc:1;
u16 scd_bcn:1;
@@ -725,20 +680,16 @@ struct add_ht_stbc {
u16 pco_active:1;
u16 pco_phase:1;
u16 rsrv:4;
-
} __packed;
struct add_ht_info {
-
u8 control_chnl;
struct add_ht_chnl add_chnl;
struct add_ht_op_mode op_mode;
struct add_ht_stbc stbc;
-
} __packed;
struct peer_info {
-
u32 legacy_rate_bitmap;
u8 ht_rates[4];
struct cap_info cap_info;
@@ -750,11 +701,9 @@ struct peer_info {
u32 vht_max_rx_mcs;
u32 vht_cap;
u8 vht_rx_channel_width; /* 0:20Mhz, 1:40Mhz, 2:80Mhz, 3:160 or 80+80Mhz */
-
} __packed;
struct hostcmd_cmd_set_new_stn {
-
struct hostcmd_header cmd_hdr;
u16 aid;
u8 mac_addr[ETH_ALEN];
@@ -766,7 +715,6 @@ struct hostcmd_cmd_set_new_stn {
u8 qos_info;
u8 is_qos_sta;
u32 fw_sta_ptr;
-
} __packed;
/*
@@ -774,10 +722,8 @@ struct hostcmd_cmd_set_new_stn {
*/
struct hostcmd_cmd_set_apmode {
-
struct hostcmd_header cmd_hdr;
u8 apmode;
-
} __packed;
/*
@@ -785,7 +731,6 @@ struct hostcmd_cmd_set_apmode {
*/
struct hostcmd_cmd_update_encryptoin {
-
struct hostcmd_header cmd_hdr;
/* Action type - see encr_action_type */
u32 action_type; /* encr_action_type */
@@ -793,25 +738,19 @@ struct hostcmd_cmd_update_encryptoin {
u32 data_length;
u8 mac_addr[ETH_ALEN];
u8 action_data[1];
-
} __packed;
struct wep_type_key {
-
/* WEP key material (max 128bit) */
u8 key_material[MAX_ENCR_KEY_LENGTH];
-
} __packed;
struct encr_tkip_seqcnt {
-
u16 low;
u32 high;
-
} __packed;
struct tkip_type_key {
-
/* TKIP Key material. Key type (group or pairwise key) is determined by flags */
/* in KEY_PARAM_SET structure. */
u8 key_material[MAX_ENCR_KEY_LENGTH];
@@ -820,26 +759,20 @@ struct tkip_type_key {
u8 tkip_rx_mic_key[MIC_KEY_LENGTH];
struct encr_tkip_seqcnt tkip_rsc;
struct encr_tkip_seqcnt tkip_tsc;
-
} __packed;
struct aes_type_key {
-
/* AES Key material */
u8 key_material[MAX_ENCR_KEY_LENGTH];
-
} __packed;
union mwl_key_type {
-
struct wep_type_key wep_key;
struct tkip_type_key tkip_key;
struct aes_type_key aes_key;
-
} __packed;
struct key_param_set {
-
/* Total length of this structure (Key is variable size array) */
u16 length;
/* Key type - WEP, TKIP or AES-CCMP. */
@@ -854,11 +787,9 @@ struct key_param_set {
/* Key material (variable size array) */
union mwl_key_type key;
u8 mac_addr[ETH_ALEN];
-
} __packed;
struct hostcmd_cmd_set_key {
-
struct hostcmd_header cmd_hdr;
/* Action type - see encr_action_type */
u32 action_type; /* encr_action_type */
@@ -866,7 +797,6 @@ struct hostcmd_cmd_set_key {
u32 data_length;
/* data buffer - maps to one KEY_PARAM_SET structure */
struct key_param_set key_param;
-
} __packed;
/*
@@ -874,17 +804,13 @@ struct hostcmd_cmd_set_key {
*/
struct ba_stream_flags {
-
u32 ba_type:1;
u32 ba_direction:3;
u32 reserved:24;
-
} __packed;
struct ba_context {
-
u32 context;
-
} __packed;
/* parameters for block ack creation */
@@ -912,32 +838,26 @@ struct create_ba_params {
u8 reset_seq_no; /** 0 or 1**/
u16 current_seq;
u8 sta_src_mac_addr[ETH_ALEN]; /* This is for virtual station in Sta proxy mode for V6FW */
-
} __packed;
/* new transmit sequence number information */
struct ba_update_seq_num {
-
/* BA flags - see above */
struct ba_stream_flags flags;
/* returned by firmware in the create ba stream response */
struct ba_context fw_ba_context;
/* new sequence number for this block ack stream */
u16 ba_seq_num;
-
} __packed;
struct ba_stream_context {
-
/* BA Stream flags */
struct ba_stream_flags flags;
/* returned by firmware in the create ba stream response */
struct ba_context fw_ba_context;
-
} __packed;
union ba_info {
-
/* information required to create BA Stream... */
struct create_ba_params create_params;
/* update starting/new sequence number etc. */
@@ -946,15 +866,12 @@ union ba_info {
struct ba_stream_context destroy_params;
/* destroy an existing stream... */
struct ba_stream_context flush_params;
-
} __packed;
struct hostcmd_cmd_bastream {
-
struct hostcmd_header cmd_hdr;
u32 action_type;
union ba_info ba_info;
-
} __packed;
/*
@@ -962,10 +879,8 @@ struct hostcmd_cmd_bastream {
*/
struct hostcmd_cmd_dwds_enable {
-
struct hostcmd_header cmd_hdr;
u32 enable; /* 0 -- Disable. or 1 -- Enable. */
-
} __packed;
/*
@@ -973,10 +888,8 @@ struct hostcmd_cmd_dwds_enable {
*/
struct hostcmd_cmd_fw_flush_timer {
-
struct hostcmd_header cmd_hdr;
u32 value; /* 0 -- Disable. > 0 -- holds time value in usecs. */
-
} __packed;
/*
@@ -984,10 +897,8 @@ struct hostcmd_cmd_fw_flush_timer {
*/
struct hostcmd_cmd_set_cdd {
-
struct hostcmd_header cmd_hdr;
u32 enable;
-
} __packed;
/* PRIVATE FUNCTION DECLARATION
@@ -1030,7 +941,6 @@ void mwl_fwcmd_reset(struct ieee80211_hw *hw)
BUG_ON(!priv);
if (mwl_fwcmd_chk_adapter(priv)) {
-
writel(ISR_RESET, priv->iobase1 + MACREG_REG_H2A_INTERRUPT_EVENTS);
}
@@ -1048,9 +958,7 @@ void mwl_fwcmd_int_enable(struct ieee80211_hw *hw)
BUG_ON(!priv);
if (mwl_fwcmd_chk_adapter(priv)) {
-
writel(0x00, priv->iobase1 + MACREG_REG_A2H_INTERRUPT_MASK);
-
writel((MACREG_A2HRIC_BIT_MASK),
priv->iobase1 + MACREG_REG_A2H_INTERRUPT_MASK);
}
@@ -1069,7 +977,6 @@ void mwl_fwcmd_int_disable(struct ieee80211_hw *hw)
BUG_ON(!priv);
if (mwl_fwcmd_chk_adapter(priv)) {
-
writel(0x00, priv->iobase1 + MACREG_REG_A2H_INTERRUPT_MASK);
}
@@ -1103,7 +1010,6 @@ int mwl_fwcmd_get_hw_specs(struct ieee80211_hw *hw)
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
while (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_GET_HW_SPEC)) {
-
WLDBG_PRINT("failed execution");
WL_MSEC_SLEEP(1000);
WLDBG_PRINT("repeat command = %x", (unsigned int)pcmd);
@@ -1178,7 +1084,6 @@ int mwl_fwcmd_set_hw_specs(struct ieee80211_hw *hw)
pcmd->disablembss = 0;
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_HW_SPEC)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1212,7 +1117,6 @@ int mwl_fwcmd_get_stat(struct ieee80211_hw *hw,
pcmd->cmd_hdr.len = ENDIAN_SWAP16(sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_GET_STAT)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1306,7 +1210,6 @@ int mwl_fwcmd_max_tx_power(struct ieee80211_hw *hw,
BUG_ON(!priv);
switch (fraction) {
-
case 0:
reduce_val = 0; /* Max */
break;
@@ -1331,23 +1234,17 @@ int mwl_fwcmd_max_tx_power(struct ieee80211_hw *hw,
if ((conf->chandef.width == NL80211_CHAN_WIDTH_20_NOHT) ||
(conf->chandef.width == NL80211_CHAN_WIDTH_20)) {
-
width = CH_20_MHz_WIDTH;
sub_ch = NO_EXT_CHANNEL;
} else if (conf->chandef.width == NL80211_CHAN_WIDTH_40) {
-
width = CH_40_MHz_WIDTH;
-
if (conf->chandef.center_freq1 > channel->center_freq)
sub_ch = EXT_CH_ABOVE_CTRL_CH;
else
sub_ch = EXT_CH_BELOW_CTRL_CH;
-
} else if (conf->chandef.width == NL80211_CHAN_WIDTH_80) {
-
width = CH_80_MHz_WIDTH;
-
if (conf->chandef.center_freq1 > channel->center_freq)
sub_ch = EXT_CH_ABOVE_CTRL_CH;
else
@@ -1355,28 +1252,22 @@ int mwl_fwcmd_max_tx_power(struct ieee80211_hw *hw,
}
if ((priv->powinited & 2) == 0) {
-
mwl_fwcmd_get_tx_powers(priv, priv->max_tx_pow,
channel->hw_value, band, width, sub_ch);
-
priv->powinited |= 2;
}
if ((priv->powinited & 1) == 0) {
-
mwl_fwcmd_get_tx_powers(priv, priv->target_powers,
channel->hw_value, band, width, sub_ch);
-
priv->powinited |= 1;
}
for (i = 0; i < SYSADPT_TX_POWER_LEVEL_TOTAL; i++) {
-
if (priv->target_powers[i] > priv->max_tx_pow[i])
tmp = priv->max_tx_pow[i];
else
tmp = priv->target_powers[i];
-
maxtxpow[i] = ((tmp - reduce_val) > 0) ? (tmp - reduce_val) : 0;
}
@@ -1407,7 +1298,6 @@ int mwl_fwcmd_tx_power(struct ieee80211_hw *hw,
BUG_ON(!priv);
switch (fraction) {
-
case 0:
reduce_val = 0; /* Max */
break;
@@ -1432,23 +1322,16 @@ int mwl_fwcmd_tx_power(struct ieee80211_hw *hw,
if ((conf->chandef.width == NL80211_CHAN_WIDTH_20_NOHT) ||
(conf->chandef.width == NL80211_CHAN_WIDTH_20)) {
-
width = CH_20_MHz_WIDTH;
sub_ch = NO_EXT_CHANNEL;
-
} else if (conf->chandef.width == NL80211_CHAN_WIDTH_40) {
-
width = CH_40_MHz_WIDTH;
-
if (conf->chandef.center_freq1 > channel->center_freq)
sub_ch = EXT_CH_ABOVE_CTRL_CH;
else
sub_ch = EXT_CH_BELOW_CTRL_CH;
-
} else if (conf->chandef.width == NL80211_CHAN_WIDTH_80) {
-
width = CH_80_MHz_WIDTH;
-
if (conf->chandef.center_freq1 > channel->center_freq)
sub_ch = EXT_CH_ABOVE_CTRL_CH;
else
@@ -1458,14 +1341,12 @@ int mwl_fwcmd_tx_power(struct ieee80211_hw *hw,
/* search tx power table if exist
*/
for (index = 0; index < SYSADPT_MAX_NUM_CHANNELS; index++) {
-
/* do nothing if table is not loaded
*/
if (priv->tx_pwr_tbl[index].channel == 0)
break;
if (priv->tx_pwr_tbl[index].channel == channel->hw_value) {
-
priv->cdd = priv->tx_pwr_tbl[index].cdd;
priv->txantenna2 = priv->tx_pwr_tbl[index].txantenna2;
@@ -1475,7 +1356,6 @@ int mwl_fwcmd_tx_power(struct ieee80211_hw *hw,
priv->powinited = 0x02;
for (i = 0; i < SYSADPT_TX_POWER_LEVEL_TOTAL; i++) {
-
if (priv->tx_pwr_tbl[index].setcap)
priv->max_tx_pow[i] = priv->tx_pwr_tbl[index].tx_power[i];
else
@@ -1488,7 +1368,6 @@ int mwl_fwcmd_tx_power(struct ieee80211_hw *hw,
}
if ((priv->powinited & 2) == 0) {
-
mwl_fwcmd_get_tx_powers(priv, priv->max_tx_pow,
channel->hw_value, band, width, sub_ch);
@@ -1496,7 +1375,6 @@ int mwl_fwcmd_tx_power(struct ieee80211_hw *hw,
}
if ((priv->powinited & 1) == 0) {
-
mwl_fwcmd_get_tx_powers(priv, priv->target_powers,
channel->hw_value, band, width, sub_ch);
@@ -1504,17 +1382,13 @@ int mwl_fwcmd_tx_power(struct ieee80211_hw *hw,
}
for (i = 0; i < SYSADPT_TX_POWER_LEVEL_TOTAL; i++) {
-
if (found) {
-
if ((priv->tx_pwr_tbl[index].setcap)
&& (priv->tx_pwr_tbl[index].tx_power[i] > priv->max_tx_pow[i]))
tmp = priv->max_tx_pow[i];
else
tmp = priv->tx_pwr_tbl[index].tx_power[i];
-
} else {
-
if (priv->target_powers[i] > priv->max_tx_pow[i])
tmp = priv->max_tx_pow[i];
else
@@ -1555,29 +1429,24 @@ int mwl_fwcmd_rf_antenna(struct ieee80211_hw *hw, int dir, int antenna)
pcmd->action = ENDIAN_SWAP16(dir);
if (dir == WL_ANTENNATYPE_RX) {
-
u8 rx_antenna = 4; /* if auto, set 4 rx antennas in SC2 */
-
+
if (antenna != 0)
pcmd->antenna_mode = ENDIAN_SWAP16(antenna);
else
pcmd->antenna_mode = ENDIAN_SWAP16(rx_antenna);
-
} else {
-
u8 tx_antenna = 0xf; /* if auto, set 4 tx antennas in SC2 */
if (antenna != 0)
pcmd->antenna_mode = ENDIAN_SWAP16(antenna);
else
pcmd->antenna_mode = ENDIAN_SWAP16(tx_antenna);
-
}
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_RF_ANTENNA)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1618,7 +1487,6 @@ int mwl_fwcmd_broadcast_ssid_enable(struct ieee80211_hw *hw,
pcmd->enable = ENDIAN_SWAP32(enable);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_BROADCAST_SSID_ENABLE)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1661,31 +1529,103 @@ int mwl_fwcmd_set_rf_channel(struct ieee80211_hw *hw,
if ((conf->chandef.width == NL80211_CHAN_WIDTH_20_NOHT) ||
(conf->chandef.width == NL80211_CHAN_WIDTH_20)) {
-
pcmd->chnl_flags.chnl_width = CH_20_MHz_WIDTH;
pcmd->chnl_flags.act_primary = ACT_PRIMARY_CHAN_0;
-
} else if (conf->chandef.width == NL80211_CHAN_WIDTH_40) {
-
pcmd->chnl_flags.chnl_width = CH_40_MHz_WIDTH;
-
if (conf->chandef.center_freq1 > channel->center_freq)
pcmd->chnl_flags.act_primary = ACT_PRIMARY_CHAN_0;
else
pcmd->chnl_flags.act_primary = ACT_PRIMARY_CHAN_1;
-
} else if (conf->chandef.width == NL80211_CHAN_WIDTH_80) {
-
pcmd->chnl_flags.chnl_width = CH_80_MHz_WIDTH;
pcmd->chnl_flags.act_primary =
mwl_fwcmd_get_80m_pri_chnl_offset(pcmd->curr_chnl);
-
}
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_RF_CHANNEL)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT(DBG_LEVEL_2);
+
+ return 0;
+}
+
+int mwl_fwcmd_set_aid(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif, u8 *bssid, u16 aid)
+{
+ struct mwl_priv *priv;
+ struct mwl_vif *mwl_vif;
+ struct hostcmd_cmd_set_aid *pcmd;
+ unsigned long flags;
+
+ WLDBG_ENTER(DBG_LEVEL_2);
+
+ BUG_ON(!hw);
+ priv = hw->priv;
+ BUG_ON(!priv);
+
+ BUG_ON(!vif);
+ mwl_vif = MWL_VIF(vif);
+ BUG_ON(!mwl_vif);
+ pcmd = (struct hostcmd_cmd_set_aid *)&priv->pcmd_buf[0];
+
+ MWL_SPIN_LOCK(&priv->locks.fwcmd_lock);
+
+ memset(pcmd, 0x00, sizeof(*pcmd));
+ pcmd->cmd_hdr.cmd = ENDIAN_SWAP16(HOSTCMD_CMD_SET_AID);
+ pcmd->cmd_hdr.len = ENDIAN_SWAP16(sizeof(*pcmd));
+ pcmd->cmd_hdr.macid = mwl_vif->macid;
+ pcmd->aid = ENDIAN_SWAP16(aid);
+ memcpy(pcmd->mac_addr, bssid, ETH_ALEN);
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_AID)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT(DBG_LEVEL_2);
+
+ return 0;
+}
+
+int mwl_fwcmd_set_infra_mode(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif)
+{
+ struct mwl_priv *priv;
+ struct mwl_vif *mwl_vif;
+ struct hostcmd_cmd_set_infra_mode *pcmd;
+ unsigned long flags;
+
+ WLDBG_ENTER(DBG_LEVEL_2);
+
+ BUG_ON(!hw);
+ priv = hw->priv;
+ BUG_ON(!priv);
+
+ BUG_ON(!vif);
+ mwl_vif = MWL_VIF(vif);
+ BUG_ON(!mwl_vif);
+
+ pcmd = (struct hostcmd_cmd_set_infra_mode *)&priv->pcmd_buf[0];
+
+ MWL_SPIN_LOCK(&priv->locks.fwcmd_lock);
+
+ memset(pcmd, 0x00, sizeof(*pcmd));
+ pcmd->cmd_hdr.cmd = ENDIAN_SWAP16(HOSTCMD_CMD_SET_INFRA_MODE);
+ pcmd->cmd_hdr.len = ENDIAN_SWAP16(sizeof(*pcmd));
+ pcmd->cmd_hdr.macid = mwl_vif->macid;
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_INFRA_MODE)) {
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1720,7 +1660,6 @@ int mwl_fwcmd_set_rts_threshold(struct ieee80211_hw *hw, int threshold)
pcmd->threshold = ENDIAN_SWAP16(threshold);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_RTS_THSD)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1772,7 +1711,6 @@ int mwl_fwcmd_set_edca_params(struct ieee80211_hw *hw, u8 index,
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_EDCA_PARAMS)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1806,7 +1744,6 @@ int mwl_fwcmd_set_wmm_mode(struct ieee80211_hw *hw, bool enable)
pcmd->action = ENDIAN_SWAP16(enable ? WL_ENABLE : WL_DISABLE);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_WMM_MODE)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1843,7 +1780,6 @@ int mwl_fwcmd_use_fixed_rate(struct ieee80211_hw *hw, int mcast, int mgmt)
pcmd->management_rate = mgmt;
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_FIXED_RATE)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1878,7 +1814,47 @@ int mwl_fwcmd_set_rate_adapt_mode(struct ieee80211_hw *hw, u16 mode)
pcmd->rate_adapt_mode = ENDIAN_SWAP16(mode);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_RATE_ADAPT_MODE)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT(DBG_LEVEL_2);
+
+ return 0;
+}
+
+int mwl_fwcmd_set_mac_addr_client(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif, u8 *mac_addr)
+{
+ struct mwl_priv *priv;
+ struct mwl_vif *mwl_vif;
+ struct hostcmd_cmd_set_mac_addr *pcmd;
+ unsigned long flags;
+
+ WLDBG_ENTER(DBG_LEVEL_2);
+
+ BUG_ON(!hw);
+ priv = hw->priv;
+ BUG_ON(!priv);
+
+ BUG_ON(!vif);
+ mwl_vif = MWL_VIF(vif);
+ BUG_ON(!mwl_vif);
+
+ pcmd = (struct hostcmd_cmd_set_mac_addr *)&priv->pcmd_buf[0];
+ MWL_SPIN_LOCK(&priv->locks.fwcmd_lock);
+
+ memset(pcmd, 0x00, sizeof(*pcmd));
+ pcmd->cmd_hdr.cmd = ENDIAN_SWAP16(HOSTCMD_CMD_SET_MAC_ADDR);
+ pcmd->cmd_hdr.len = ENDIAN_SWAP16(sizeof(*pcmd));
+ pcmd->cmd_hdr.macid = mwl_vif->macid;
+ pcmd->mac_type = WL_MAC_TYPE_SECONDARY_CLIENT;
+ memcpy(pcmd->mac_addr, mac_addr, ETH_ALEN);
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_MAC_ADDR)) {
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1911,7 +1887,6 @@ int mwl_fwcmd_get_watchdog_bitmap(struct ieee80211_hw *hw, u8 *bitmap)
pcmd->cmd_hdr.len = ENDIAN_SWAP16(sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_GET_WATCHDOG_BITMAP)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -1925,6 +1900,46 @@ int mwl_fwcmd_get_watchdog_bitmap(struct ieee80211_hw *hw, u8 *bitmap)
return 0;
}
+int mwl_fwcmd_remove_mac_addr(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif, u8 *mac_addr)
+{
+ struct mwl_priv *priv;
+ struct mwl_vif *mwl_vif;
+ struct hostcmd_cmd_set_mac_addr *pcmd;
+ unsigned long flags;
+
+ WLDBG_ENTER(DBG_LEVEL_2);
+
+ BUG_ON(!hw);
+ priv = hw->priv;
+ BUG_ON(!priv);
+
+ BUG_ON(!vif);
+ mwl_vif = MWL_VIF(vif);
+ BUG_ON(!mwl_vif);
+
+ pcmd = (struct hostcmd_cmd_set_mac_addr *)&priv->pcmd_buf[0];
+
+ MWL_SPIN_LOCK(&priv->locks.fwcmd_lock);
+
+ memset(pcmd, 0x00, sizeof(*pcmd));
+ pcmd->cmd_hdr.cmd = ENDIAN_SWAP16(HOSTCMD_CMD_DEL_MAC_ADDR);
+ pcmd->cmd_hdr.len = ENDIAN_SWAP16(sizeof(*pcmd));
+ pcmd->cmd_hdr.macid = mwl_vif->macid;
+ memcpy(pcmd->mac_addr, mac_addr, ETH_ALEN);
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_DEL_MAC_ADDR)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT(DBG_LEVEL_2);
+
+ return 0;
+}
+
int mwl_fwcmd_bss_start(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, bool enable)
{
@@ -1959,20 +1974,15 @@ int mwl_fwcmd_bss_start(struct ieee80211_hw *hw,
pcmd->cmd_hdr.macid = mwl_vif->macid;
if (enable) {
-
pcmd->enable = ENDIAN_SWAP32(WL_ENABLE);
-
} else {
-
if (mwl_vif->macid == 0)
pcmd->enable = ENDIAN_SWAP32(WL_DISABLE);
else
pcmd->enable = ENDIAN_SWAP32(WL_DISABLE_VMAC);
-
}
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_BSS_START)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2030,7 +2040,7 @@ err:
int mwl_fwcmd_set_new_stn_add(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_sta *sta)
+ struct ieee80211_sta *sta)
{
struct mwl_priv *priv;
struct mwl_vif *mwl_vif;
@@ -2060,9 +2070,14 @@ int mwl_fwcmd_set_new_stn_add(struct ieee80211_hw *hw,
pcmd->cmd_hdr.macid = mwl_vif->macid;
pcmd->action = ENDIAN_SWAP16(HOSTCMD_ACT_STA_ACTION_ADD);
- pcmd->aid = ENDIAN_SWAP16(sta->aid);
+ if (mwl_vif->is_sta == true) {
+ pcmd->aid = 0;
+ pcmd->stn_id = 0;
+ } else {
+ pcmd->aid = ENDIAN_SWAP16(sta->aid);
+ pcmd->stn_id = ENDIAN_SWAP16(sta->aid);
+ }
memcpy(pcmd->mac_addr, sta->addr, ETH_ALEN);
- pcmd->stn_id = ENDIAN_SWAP16(sta->aid);
if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
rates = sta->supp_rates[IEEE80211_BAND_2GHZ];
@@ -2071,7 +2086,6 @@ int mwl_fwcmd_set_new_stn_add(struct ieee80211_hw *hw,
pcmd->peer_info.legacy_rate_bitmap = ENDIAN_SWAP32(rates);
if (sta->ht_cap.ht_supported) {
-
pcmd->peer_info.ht_rates[0] = sta->ht_cap.mcs.rx_mask[0];
pcmd->peer_info.ht_rates[1] = sta->ht_cap.mcs.rx_mask[1];
pcmd->peer_info.ht_rates[2] = sta->ht_cap.mcs.rx_mask[2];
@@ -2082,7 +2096,6 @@ int mwl_fwcmd_set_new_stn_add(struct ieee80211_hw *hw,
}
if (sta->vht_cap.vht_supported) {
-
pcmd->peer_info.vht_max_rx_mcs = ENDIAN_SWAP32(*((u32 *)&sta->vht_cap.vht_mcs.rx_mcs_map));
pcmd->peer_info.vht_cap = ENDIAN_SWAP32(sta->vht_cap.cap);
pcmd->peer_info.vht_rx_channel_width = sta->bandwidth;
@@ -2092,12 +2105,21 @@ int mwl_fwcmd_set_new_stn_add(struct ieee80211_hw *hw,
pcmd->qos_info = ((sta->uapsd_queues << 4) | (sta->max_sp << 1));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_NEW_STN)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
}
+ if (mwl_vif->is_sta == true) {
+ memcpy(pcmd->mac_addr, mwl_vif->sta_mac, ETH_ALEN);
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_NEW_STN)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+ }
+
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT(DBG_LEVEL_2);
@@ -2135,7 +2157,6 @@ int mwl_fwcmd_set_new_stn_add_self(struct ieee80211_hw *hw,
memcpy(pcmd->mac_addr, vif->addr, ETH_ALEN);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_NEW_STN)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2178,12 +2199,21 @@ int mwl_fwcmd_set_new_stn_del(struct ieee80211_hw *hw,
memcpy(pcmd->mac_addr, addr, ETH_ALEN);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_NEW_STN)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
}
+ if (mwl_vif->is_sta == true) {
+ memcpy(pcmd->mac_addr, mwl_vif->sta_mac, ETH_ALEN);
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_NEW_STN)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+ }
+
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT(DBG_LEVEL_2);
@@ -2212,7 +2242,6 @@ int mwl_fwcmd_set_apmode(struct ieee80211_hw *hw, u8 apmode)
pcmd->apmode = apmode;
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_APMODE)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2256,12 +2285,24 @@ int mwl_fwcmd_update_encryption_enable(struct ieee80211_hw *hw,
pcmd->action_data[0] = encr_type;
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_UPDATE_ENCRYPTION)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
}
+ if (mwl_vif->is_sta == true) {
+ if (memcmp(mwl_vif->bssid, addr, ETH_ALEN) == 0)
+ memcpy(pcmd->mac_addr, mwl_vif->sta_mac, ETH_ALEN);
+ else
+ memcpy(pcmd->mac_addr, mwl_vif->bssid, ETH_ALEN);
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_UPDATE_ENCRYPTION)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+ }
+
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT(DBG_LEVEL_2);
@@ -2270,7 +2311,7 @@ int mwl_fwcmd_update_encryption_enable(struct ieee80211_hw *hw,
int mwl_fwcmd_encryption_set_key(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, u8 *addr,
- struct ieee80211_key_conf *key)
+ struct ieee80211_key_conf *key)
{
struct mwl_priv *priv;
struct mwl_vif *mwl_vif;
@@ -2302,7 +2343,6 @@ int mwl_fwcmd_encryption_set_key(struct ieee80211_hw *hw,
rc = mwl_fwcmd_encryption_set_cmd_info(pcmd, addr, key);
if (rc) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "encryption not support");
return rc;
@@ -2316,12 +2356,9 @@ int mwl_fwcmd_encryption_set_key(struct ieee80211_hw *hw,
action = ENCR_ACTION_TYPE_SET_GROUP_KEY;
switch (key->cipher) {
-
case WLAN_CIPHER_SUITE_WEP40:
case WLAN_CIPHER_SUITE_WEP104:
-
if (!mwl_vif->wep_key_conf[idx].enabled) {
-
memcpy(mwl_vif->wep_key_conf[idx].key, key,
sizeof(*key) + key->keylen);
mwl_vif->wep_key_conf[idx].enabled = 1;
@@ -2330,19 +2367,13 @@ int mwl_fwcmd_encryption_set_key(struct ieee80211_hw *hw,
keymlen = key->keylen;
action = ENCR_ACTION_TYPE_SET_KEY;
break;
-
case WLAN_CIPHER_SUITE_TKIP:
-
keymlen = MAX_ENCR_KEY_LENGTH + 2 * MIC_KEY_LENGTH;
break;
-
case WLAN_CIPHER_SUITE_CCMP:
-
keymlen = key->keylen;
break;
-
default:
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "encryption not support");
return -ENOTSUPP;
@@ -2352,12 +2383,24 @@ int mwl_fwcmd_encryption_set_key(struct ieee80211_hw *hw,
pcmd->action_type = ENDIAN_SWAP32(action);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_UPDATE_ENCRYPTION)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
}
+ if (mwl_vif->is_sta == true) {
+ if (memcmp(mwl_vif->bssid, addr, ETH_ALEN) == 0)
+ memcpy(pcmd->key_param.mac_addr, mwl_vif->sta_mac, ETH_ALEN);
+ else
+ memcpy(pcmd->key_param.mac_addr, mwl_vif->bssid, ETH_ALEN);
+
+ if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_UPDATE_ENCRYPTION)) {
+ MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
+ WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
+ return -EIO;
+ }
+ }
+
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT(DBG_LEVEL_2);
@@ -2366,7 +2409,7 @@ int mwl_fwcmd_encryption_set_key(struct ieee80211_hw *hw,
int mwl_fwcmd_encryption_remove_key(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, u8 *addr,
- struct ieee80211_key_conf *key)
+ struct ieee80211_key_conf *key)
{
struct mwl_priv *priv;
struct mwl_vif *mwl_vif;
@@ -2395,7 +2438,6 @@ int mwl_fwcmd_encryption_remove_key(struct ieee80211_hw *hw,
rc = mwl_fwcmd_encryption_set_cmd_info(pcmd, addr, key);
if (rc) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "encryption not support");
return rc;
@@ -2408,7 +2450,6 @@ int mwl_fwcmd_encryption_remove_key(struct ieee80211_hw *hw,
mwl_vif->wep_key_conf[key->keyidx].enabled = 0;
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_UPDATE_ENCRYPTION)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2422,7 +2463,7 @@ int mwl_fwcmd_encryption_remove_key(struct ieee80211_hw *hw,
int mwl_fwcmd_check_ba(struct ieee80211_hw *hw,
struct mwl_ampdu_stream *stream,
- struct ieee80211_vif *vif)
+ struct ieee80211_vif *vif)
{
struct mwl_priv *priv;
struct mwl_vif *mwl_vif;
@@ -2464,14 +2505,12 @@ int mwl_fwcmd_check_ba(struct ieee80211_hw *hw,
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_BASTREAM)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
}
if (pcmd->cmd_hdr.result != 0) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "result error");
return -EINVAL;
@@ -2485,7 +2524,7 @@ int mwl_fwcmd_check_ba(struct ieee80211_hw *hw,
int mwl_fwcmd_create_ba(struct ieee80211_hw *hw,
struct mwl_ampdu_stream *stream,
- u8 buf_size, struct ieee80211_vif *vif)
+ u8 buf_size, struct ieee80211_vif *vif)
{
struct mwl_priv *priv;
struct mwl_vif *mwl_vif;
@@ -2536,14 +2575,12 @@ int mwl_fwcmd_create_ba(struct ieee80211_hw *hw,
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_BASTREAM)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
}
if (pcmd->cmd_hdr.result != 0) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "result error");
return -EINVAL;
@@ -2558,7 +2595,6 @@ int mwl_fwcmd_create_ba(struct ieee80211_hw *hw,
int mwl_fwcmd_destroy_ba(struct ieee80211_hw *hw,
u8 idx)
{
-
struct mwl_priv *priv;
struct hostcmd_cmd_bastream *pcmd;
unsigned long flags;
@@ -2585,7 +2621,6 @@ int mwl_fwcmd_destroy_ba(struct ieee80211_hw *hw,
pcmd->ba_info.destroy_params.fw_ba_context.context = ENDIAN_SWAP32(idx);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_BASTREAM)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2613,11 +2648,9 @@ struct mwl_ampdu_stream *mwl_fwcmd_add_stream(struct ieee80211_hw *hw,
BUG_ON(!sta);
for (i = 0; i < SYSADPT_TX_AMPDU_QUEUES; i++) {
-
stream = &priv->ampdu[i];
if (stream->state == AMPDU_NO_STREAM) {
-
stream->sta = sta;
stream->state = AMPDU_STREAM_NEW;
stream->tid = tid;
@@ -2664,7 +2697,6 @@ struct mwl_ampdu_stream *mwl_fwcmd_lookup_stream(struct ieee80211_hw *hw,
BUG_ON(!priv);
for (i = 0; i < SYSADPT_TX_AMPDU_QUEUES; i++) {
-
stream = &priv->ampdu[i];
if (stream->state == AMPDU_NO_STREAM)
@@ -2673,7 +2705,6 @@ struct mwl_ampdu_stream *mwl_fwcmd_lookup_stream(struct ieee80211_hw *hw,
if (!memcmp(stream->sta->addr, addr, ETH_ALEN) &&
stream->tid == tid)
return stream;
-
}
return NULL;
@@ -2718,7 +2749,6 @@ int mwl_fwcmd_set_dwds_stamode(struct ieee80211_hw *hw, bool enable)
pcmd->enable = ENDIAN_SWAP32(enable);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_DWDS_ENABLE)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2752,7 +2782,6 @@ int mwl_fwcmd_set_fw_flush_timer(struct ieee80211_hw *hw, u32 value)
pcmd->value = ENDIAN_SWAP32(value);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_FW_FLUSH_TIMER)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2786,7 +2815,6 @@ int mwl_fwcmd_set_cdd(struct ieee80211_hw *hw)
pcmd->enable = ENDIAN_SWAP32(priv->cdd);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_CDD)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2812,7 +2840,6 @@ static bool mwl_fwcmd_chk_adapter(struct mwl_priv *priv)
regval = readl(priv->iobase1 + MACREG_REG_INT_CODE);
if (regval == 0xffffffff) {
-
WLDBG_ERROR(DBG_LEVEL_2, "adapter is not existed");
WLDBG_EXIT_INFO(DBG_LEVEL_2, "adapter is not existed");
@@ -2833,7 +2860,6 @@ static int mwl_fwcmd_exec_cmd(struct mwl_priv *priv, unsigned short cmd)
BUG_ON(!priv);
if (!mwl_fwcmd_chk_adapter(priv)) {
-
WLDBG_ERROR(DBG_LEVEL_2, "no adapter existed");
WLDBG_EXIT_INFO(DBG_LEVEL_2, "no adapter plugged in");
priv->in_send_cmd = false;
@@ -2841,21 +2867,15 @@ static int mwl_fwcmd_exec_cmd(struct mwl_priv *priv, unsigned short cmd)
}
if (!priv->in_send_cmd) {
-
priv->in_send_cmd = true;
-
mwl_fwcmd_send_cmd(priv);
-
if (mwl_fwcmd_wait_complete(priv, 0x8000 | cmd)) {
-
WLDBG_ERROR(DBG_LEVEL_2, "timeout");
WLDBG_EXIT_INFO(DBG_LEVEL_2, "timeout");
priv->in_send_cmd = false;
return -EIO;
}
-
} else {
-
WLDBG_WARNING(DBG_LEVEL_2, "previous command is still running");
busy = true;
}
@@ -2891,19 +2911,14 @@ static int mwl_fwcmd_wait_complete(struct mwl_priv *priv, unsigned short cmd)
BUG_ON(!priv);
do {
-
int_code = ENDIAN_SWAP16(priv->pcmd_buf[0]);
WL_MSEC_SLEEP(1);
-
} while ((int_code != cmd) && (--curr_iteration));
- if (curr_iteration == 0)
- {
+ if (curr_iteration == 0) {
WLDBG_ERROR(DBG_LEVEL_2, "cmd 0x%04x=%s timed out",
cmd, mwl_fwcmd_get_cmd_string(cmd));
-
WLDBG_EXIT_INFO(DBG_LEVEL_2, "timeout");
-
return -EIO;
}
@@ -2941,7 +2956,6 @@ static int mwl_fwcmd_802_11_radio_control(struct mwl_priv *priv, bool enable, bo
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_RADIO_CONTROL)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -2980,7 +2994,6 @@ static int mwl_fwcmd_get_tx_powers(struct mwl_priv *priv, u16 *powlist, u16 ch,
pcmd->sub_ch = ENDIAN_SWAP16(sub_ch);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_TX_POWER)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -3023,7 +3036,6 @@ static int mwl_fwcmd_set_tx_powers(struct mwl_priv *priv, u16 txpow[], u8 action
pcmd->power_level_list[i] = ENDIAN_SWAP16(txpow[i]);
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_TX_POWER)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -3040,7 +3052,6 @@ static u8 mwl_fwcmd_get_80m_pri_chnl_offset(u8 channel)
u8 act_primary = ACT_PRIMARY_CHAN_0;
switch (channel) {
-
case 36:
act_primary = ACT_PRIMARY_CHAN_0;
break;
@@ -3053,7 +3064,6 @@ static u8 mwl_fwcmd_get_80m_pri_chnl_offset(u8 channel)
case 48:
act_primary = ACT_PRIMARY_CHAN_3;
break;
-
case 52:
act_primary = ACT_PRIMARY_CHAN_0;
break;
@@ -3066,7 +3076,6 @@ static u8 mwl_fwcmd_get_80m_pri_chnl_offset(u8 channel)
case 64:
act_primary = ACT_PRIMARY_CHAN_3;
break;
-
case 100:
act_primary = ACT_PRIMARY_CHAN_0;
break;
@@ -3079,7 +3088,6 @@ static u8 mwl_fwcmd_get_80m_pri_chnl_offset(u8 channel)
case 112:
act_primary = ACT_PRIMARY_CHAN_3;
break;
-
case 116:
act_primary = ACT_PRIMARY_CHAN_0;
break;
@@ -3092,7 +3100,6 @@ static u8 mwl_fwcmd_get_80m_pri_chnl_offset(u8 channel)
case 128:
act_primary = ACT_PRIMARY_CHAN_3;
break;
-
case 132:
act_primary = ACT_PRIMARY_CHAN_0;
break;
@@ -3105,7 +3112,6 @@ static u8 mwl_fwcmd_get_80m_pri_chnl_offset(u8 channel)
case 144:
act_primary = ACT_PRIMARY_CHAN_3;
break;
-
case 149:
act_primary = ACT_PRIMARY_CHAN_0;
break;
@@ -3158,7 +3164,6 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
elem_parse_failed = false;
while (left >= 2) {
-
u8 id, elen;
id = *pos++;
@@ -3166,13 +3171,11 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
left -= 2;
if (elen > left) {
-
elem_parse_failed = true;
break;
}
switch (id) {
-
case WLAN_EID_SUPP_RATES:
case WLAN_EID_EXT_SUPP_RATES:
{
@@ -3180,23 +3183,19 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
u8 rate;
for (basic_idx = 0; basic_idx < SYSADPT_MAX_DATA_RATES_G; basic_idx++) {
-
if (beacon_info->bss_basic_rate_set[basic_idx] == 0)
break;
}
for (oprate_idx = 0; oprate_idx < SYSADPT_MAX_DATA_RATES_G; oprate_idx++) {
-
if (beacon_info->op_rate_set[oprate_idx] == 0)
break;
}
for (idx = 0; idx < elen; idx++) {
-
rate = pos[idx];
if ((rate & 0x80) != 0) {
-
if (basic_idx < SYSADPT_MAX_DATA_RATES_G)
beacon_info->bss_basic_rate_set[basic_idx++] = rate & 0x7f;
else {
@@ -3214,12 +3213,10 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
}
}
break;
-
case WLAN_EID_RSN:
beacon_info->ie_rsn48_len = (elen + 2);
beacon_info->ie_rsn48_ptr = (pos - 2);
break;
-
case WLAN_EID_HT_CAPABILITY:
case WLAN_EID_HT_OPERATION:
case WLAN_EID_OVERLAP_BSS_SCAN_PARAM:
@@ -3235,7 +3232,6 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
beacon_info->ie_ht_ptr += elen;
}
break;
-
case WLAN_EID_VHT_CAPABILITY:
case WLAN_EID_VHT_OPERATION:
case WLAN_EID_OPMODE_NOTIF:
@@ -3250,10 +3246,8 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
beacon_info->ie_vht_ptr += elen;
}
break;
-
case WLAN_EID_VENDOR_SPECIFIC:
if ((pos[0] == 0x00) && (pos[1] == 0x50) && (pos[2] == 0xf2)) {
-
if (pos[3] == 0x01) {
beacon_info->ie_rsn_len = (elen + 2);
beacon_info->ie_rsn_ptr = (pos - 2);
@@ -3265,10 +3259,8 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
}
}
break;
-
default:
break;
-
}
left -= elen;
@@ -3276,7 +3268,6 @@ static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
}
if (elem_parse_failed == false) {
-
beacon_info->ie_ht_ptr = &beacon_info->ie_list_ht[0];
beacon_info->ie_vht_ptr = &beacon_info->ie_list_vht[0];
beacon_info->valid = true;
@@ -3338,7 +3329,6 @@ static int mwl_fwcmd_set_ies(struct mwl_priv *priv, struct mwl_vif *mwl_vif)
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_IES)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -3425,7 +3415,6 @@ static int mwl_fwcmd_set_ap_beacon(struct mwl_priv *priv, struct mwl_vif *mwl_vi
WLDBG_DUMP_DATA(DBG_LEVEL_2, (void *)pcmd, sizeof(*pcmd));
if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_AP_BEACON)) {
-
MWL_SPIN_UNLOCK(&priv->locks.fwcmd_lock);
WLDBG_EXIT_INFO(DBG_LEVEL_2, "failed execution");
return -EIO;
@@ -3455,18 +3444,13 @@ static int mwl_fwcmd_encryption_set_cmd_info(struct hostcmd_cmd_set_key *cmd,
memcpy(cmd->key_param.mac_addr, addr, ETH_ALEN);
switch (key->cipher) {
-
case WLAN_CIPHER_SUITE_WEP40:
case WLAN_CIPHER_SUITE_WEP104:
-
cmd->key_param.key_type_id = ENDIAN_SWAP16(KEY_TYPE_ID_WEP);
if (key->keyidx == 0)
cmd->key_param.key_info = ENDIAN_SWAP32(ENCR_KEY_FLAG_WEP_TXKEY);
-
break;
-
case WLAN_CIPHER_SUITE_TKIP:
-
cmd->key_param.key_type_id = ENDIAN_SWAP16(KEY_TYPE_ID_TKIP);
cmd->key_param.key_info = (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
? ENDIAN_SWAP32(ENCR_KEY_FLAG_PAIRWISE)
@@ -3474,17 +3458,13 @@ static int mwl_fwcmd_encryption_set_cmd_info(struct hostcmd_cmd_set_key *cmd,
cmd->key_param.key_info |= ENDIAN_SWAP32(ENCR_KEY_FLAG_MICKEY_VALID
| ENCR_KEY_FLAG_TSC_VALID);
break;
-
case WLAN_CIPHER_SUITE_CCMP:
-
cmd->key_param.key_type_id = ENDIAN_SWAP16(KEY_TYPE_ID_AES);
cmd->key_param.key_info = (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
? ENDIAN_SWAP32(ENCR_KEY_FLAG_PAIRWISE)
: ENDIAN_SWAP32(ENCR_KEY_FLAG_TXGROUPKEY);
break;
-
default:
-
return -ENOTSUPP;
}
@@ -3498,12 +3478,9 @@ static char *mwl_fwcmd_get_cmd_string(unsigned short cmd)
int curr_cmd = 0;
static const struct {
-
u16 cmd;
char *cmd_string;
-
} cmds[] = {
-
{ HOSTCMD_CMD_GET_HW_SPEC, "GetHwSpecifications" },
{ HOSTCMD_CMD_SET_HW_SPEC, "SetHwSepcifications" },
{ HOSTCMD_CMD_802_11_GET_STAT, "80211GetStat" },
@@ -3512,14 +3489,18 @@ static char *mwl_fwcmd_get_cmd_string(unsigned short cmd)
{ HOSTCMD_CMD_802_11_RF_ANTENNA, "80211RfAntenna" },
{ HOSTCMD_CMD_BROADCAST_SSID_ENABLE, "broadcast_ssid_enable" },
{ HOSTCMD_CMD_SET_RF_CHANNEL, "SetRfChannel" },
- { HOSTCMD_CMD_802_11_RTS_THSD, "80211RtsThreshold" },
- { HOSTCMD_CMD_SET_EDCA_PARAMS, "SetEDCAParams" },
+ { HOSTCMD_CMD_SET_AID, "SetAid" },
+ { HOSTCMD_CMD_SET_INFRA_MODE, "SetInfraMode" },
+ { HOSTCMD_CMD_802_11_RTS_THSD, "80211RtsThreshold" },
+ { HOSTCMD_CMD_SET_EDCA_PARAMS, "SetEDCAParams" },
{ HOSTCMD_CMD_SET_WMM_MODE, "SetWMMMode" },
{ HOSTCMD_CMD_SET_FIXED_RATE, "SetFixedRate" },
{ HOSTCMD_CMD_SET_IES, "SetInformationElements" },
{ HOSTCMD_CMD_SET_RATE_ADAPT_MODE, "SetRateAdaptationMode" },
+ { HOSTCMD_CMD_SET_MAC_ADDR, "SetMacAddr" },
{ HOSTCMD_CMD_GET_WATCHDOG_BITMAP, "GetWatchdogBitMap" },
- { HOSTCMD_CMD_BSS_START, "BssStart" },
+ { HOSTCMD_CMD_DEL_MAC_ADDR. "DelMacAddr" },
+ { HOSTCMD_CMD_BSS_START, "BssStart" },
{ HOSTCMD_CMD_AP_BEACON, "SetApBeacon" },
{ HOSTCMD_CMD_SET_NEW_STN, "SetNewStation" },
{ HOSTCMD_CMD_SET_APMODE, "SetApMode" },
@@ -3535,11 +3516,8 @@ static char *mwl_fwcmd_get_cmd_string(unsigned short cmd)
max_entries = sizeof(cmds) / sizeof(cmds[0]);
for (curr_cmd = 0; curr_cmd < max_entries; curr_cmd++) {
-
if ((cmd & 0x7fff) == cmds[curr_cmd].cmd) {
-
WLDBG_EXIT(DBG_LEVEL_2);
-
return cmds[curr_cmd].cmd_string;
}
}