summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/mwifiex')
-rw-r--r--drivers/net/wireless/mwifiex/11n.c34
-rw-r--r--drivers/net/wireless/mwifiex/11n.h53
-rw-r--r--drivers/net/wireless/mwifiex/11n_aggr.c5
-rw-r--r--drivers/net/wireless/mwifiex/11n_rxreorder.c36
-rw-r--r--drivers/net/wireless/mwifiex/11n_rxreorder.h6
-rw-r--r--drivers/net/wireless/mwifiex/README2
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c224
-rw-r--r--drivers/net/wireless/mwifiex/cfp.c17
-rw-r--r--drivers/net/wireless/mwifiex/cmdevt.c194
-rw-r--r--drivers/net/wireless/mwifiex/debugfs.c7
-rw-r--r--drivers/net/wireless/mwifiex/decl.h38
-rw-r--r--drivers/net/wireless/mwifiex/fw.h29
-rw-r--r--drivers/net/wireless/mwifiex/init.c14
-rw-r--r--drivers/net/wireless/mwifiex/ioctl.h3
-rw-r--r--drivers/net/wireless/mwifiex/join.c128
-rw-r--r--drivers/net/wireless/mwifiex/main.c174
-rw-r--r--drivers/net/wireless/mwifiex/main.h142
-rw-r--r--drivers/net/wireless/mwifiex/scan.c154
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c49
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmd.c127
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmdresp.c47
-rw-r--r--drivers/net/wireless/mwifiex/sta_event.c25
-rw-r--r--drivers/net/wireless/mwifiex/sta_ioctl.c1081
-rw-r--r--drivers/net/wireless/mwifiex/sta_tx.c8
-rw-r--r--drivers/net/wireless/mwifiex/txrx.c4
-rw-r--r--drivers/net/wireless/mwifiex/util.c55
-rw-r--r--drivers/net/wireless/mwifiex/wmm.c24
-rw-r--r--drivers/net/wireless/mwifiex/wmm.h8
28 files changed, 715 insertions, 1973 deletions
diff --git a/drivers/net/wireless/mwifiex/11n.c b/drivers/net/wireless/mwifiex/11n.c
index 73a6e62f5680..e22d761f2ef2 100644
--- a/drivers/net/wireless/mwifiex/11n.c
+++ b/drivers/net/wireless/mwifiex/11n.c
@@ -115,7 +115,7 @@ mwifiex_fill_cap_info(struct mwifiex_private *priv,
SETHT_MCS32(ht_cap->ht_cap.mcs.rx_mask);
/* Clear RD responder bit */
- RESETHT_EXTCAP_RDG(ht_ext_cap);
+ ht_ext_cap &= ~IEEE80211_HT_EXT_CAP_RD_RESPONDER;
ht_cap->ht_cap.cap_info = cpu_to_le16(ht_cap_info);
ht_cap->ht_cap.extended_ht_cap_info = cpu_to_le16(ht_ext_cap);
@@ -242,9 +242,7 @@ int mwifiex_ret_11n_addba_req(struct mwifiex_private *priv,
*
* Handling includes changing the header fields into CPU format.
*/
-int mwifiex_ret_11n_cfg(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp,
- void *data_buf)
+int mwifiex_ret_11n_cfg(struct host_cmd_ds_command *resp, void *data_buf)
{
struct mwifiex_ds_11n_tx_cfg *tx_cfg = NULL;
struct host_cmd_ds_11n_cfg *htcfg = &resp->params.htcfg;
@@ -298,8 +296,7 @@ int mwifiex_cmd_recfg_tx_buf(struct mwifiex_private *priv,
* - Setting AMSDU control parameters (for SET only)
* - Ensuring correct endian-ness
*/
-int mwifiex_cmd_amsdu_aggr_ctrl(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+int mwifiex_cmd_amsdu_aggr_ctrl(struct host_cmd_ds_command *cmd,
int cmd_action, void *data_buf)
{
struct host_cmd_ds_amsdu_aggr_ctrl *amsdu_ctrl =
@@ -331,8 +328,7 @@ int mwifiex_cmd_amsdu_aggr_ctrl(struct mwifiex_private *priv,
*
* Handling includes changing the header fields into CPU format.
*/
-int mwifiex_ret_amsdu_aggr_ctrl(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp,
+int mwifiex_ret_amsdu_aggr_ctrl(struct host_cmd_ds_command *resp,
void *data_buf)
{
struct mwifiex_ds_11n_amsdu_aggr_ctrl *amsdu_aggr_ctrl = NULL;
@@ -357,8 +353,7 @@ int mwifiex_ret_amsdu_aggr_ctrl(struct mwifiex_private *priv,
* - Setting HT Tx capability and HT Tx information fields
* - Ensuring correct endian-ness
*/
-int mwifiex_cmd_11n_cfg(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+int mwifiex_cmd_11n_cfg(struct host_cmd_ds_command *cmd,
u16 cmd_action, void *data_buf)
{
struct host_cmd_ds_11n_cfg *htcfg = &cmd->params.htcfg;
@@ -541,11 +536,8 @@ mwifiex_cfg_tx_buf(struct mwifiex_private *priv,
else if (priv->adapter->curr_tx_buf_size <= MWIFIEX_TX_DATA_BUF_SIZE_8K)
curr_tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_8K;
if (curr_tx_buf_size != tx_buf)
- mwifiex_prepare_cmd(priv, HostCmd_CMD_RECONFIGURE_TX_BUFF,
- HostCmd_ACT_GEN_SET, 0,
- NULL, &tx_buf);
-
- return;
+ mwifiex_send_cmd_async(priv, HostCmd_CMD_RECONFIGURE_TX_BUFF,
+ HostCmd_ACT_GEN_SET, 0, &tx_buf);
}
/*
@@ -583,8 +575,6 @@ void mwifiex_11n_delete_tx_ba_stream_tbl_entry(struct mwifiex_private *priv,
list_del(&tx_ba_tsr_tbl->list);
kfree(tx_ba_tsr_tbl);
-
- return;
}
/*
@@ -663,8 +653,6 @@ void mwifiex_11n_create_tx_ba_stream_tbl(struct mwifiex_private *priv,
list_add_tail(&new_node->list, &priv->tx_ba_stream_tbl_ptr);
spin_unlock_irqrestore(&priv->tx_ba_stream_tbl_lock, flags);
}
-
- return;
}
/*
@@ -694,8 +682,8 @@ int mwifiex_send_addba(struct mwifiex_private *priv, int tid, u8 *peer_mac)
memcpy(&add_ba_req.peer_mac_addr, peer_mac, ETH_ALEN);
/* We don't wait for the response of this command */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_11N_ADDBA_REQ,
- 0, 0, NULL, &add_ba_req);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_ADDBA_REQ,
+ 0, 0, &add_ba_req);
return ret;
}
@@ -722,8 +710,8 @@ int mwifiex_send_delba(struct mwifiex_private *priv, int tid, u8 *peer_mac,
memcpy(&delba.peer_mac_addr, peer_mac, ETH_ALEN);
/* We don't wait for the response of this command */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_11N_DELBA,
- HostCmd_ACT_GEN_SET, 0, NULL, &delba);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_DELBA,
+ HostCmd_ACT_GEN_SET, 0, &delba);
return ret;
}
diff --git a/drivers/net/wireless/mwifiex/11n.h b/drivers/net/wireless/mwifiex/11n.h
index 71a853e61b61..02602ff30cbf 100644
--- a/drivers/net/wireless/mwifiex/11n.h
+++ b/drivers/net/wireless/mwifiex/11n.h
@@ -28,15 +28,9 @@ int mwifiex_ret_11n_delba(struct mwifiex_private *priv,
struct host_cmd_ds_command *resp);
int mwifiex_ret_11n_addba_req(struct mwifiex_private *priv,
struct host_cmd_ds_command *resp);
-int mwifiex_ret_11n_cfg(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp,
+int mwifiex_ret_11n_cfg(struct host_cmd_ds_command *resp,
void *data_buf);
-int mwifiex_cmd_11n_cfg(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
- u16 cmd_action, void *data_buf);
-
-int mwifiex_cmd_11n_cfg(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+int mwifiex_cmd_11n_cfg(struct host_cmd_ds_command *cmd,
u16 cmd_action, void *data_buf);
int mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv,
@@ -67,24 +61,19 @@ int mwifiex_get_rx_reorder_tbl(struct mwifiex_private *priv,
struct mwifiex_ds_rx_reorder_tbl *buf);
int mwifiex_get_tx_ba_stream_tbl(struct mwifiex_private *priv,
struct mwifiex_ds_tx_ba_stream_tbl *buf);
-int mwifiex_ret_amsdu_aggr_ctrl(struct mwifiex_private *priv,
- struct host_cmd_ds_command
- *resp,
+int mwifiex_ret_amsdu_aggr_ctrl(struct host_cmd_ds_command *resp,
void *data_buf);
int mwifiex_cmd_recfg_tx_buf(struct mwifiex_private *priv,
struct host_cmd_ds_command *cmd,
int cmd_action, void *data_buf);
-int mwifiex_cmd_amsdu_aggr_ctrl(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
- int cmd_action,
- void *data_buf);
+int mwifiex_cmd_amsdu_aggr_ctrl(struct host_cmd_ds_command *cmd,
+ int cmd_action, void *data_buf);
/*
* This function checks whether AMPDU is allowed or not for a particular TID.
*/
static inline u8
-mwifiex_is_ampdu_allowed(struct mwifiex_private *priv,
- struct mwifiex_ra_list_tbl *ptr, int tid)
+mwifiex_is_ampdu_allowed(struct mwifiex_private *priv, int tid)
{
return ((priv->aggr_prio_tbl[tid].ampdu_ap != BA_STREAM_NOT_ALLOWED)
? true : false);
@@ -94,8 +83,7 @@ mwifiex_is_ampdu_allowed(struct mwifiex_private *priv,
* This function checks whether AMSDU is allowed or not for a particular TID.
*/
static inline u8
-mwifiex_is_amsdu_allowed(struct mwifiex_private *priv,
- struct mwifiex_ra_list_tbl *ptr, int tid)
+mwifiex_is_amsdu_allowed(struct mwifiex_private *priv, int tid)
{
return (((priv->aggr_prio_tbl[tid].amsdu != BA_STREAM_NOT_ALLOWED)
&& ((priv->is_data_rate_auto)
@@ -104,23 +92,21 @@ mwifiex_is_amsdu_allowed(struct mwifiex_private *priv,
}
/*
- * This function checks whether a BA stream is available or not.
+ * This function checks whether a space is available for new BA stream or not.
*/
-static inline u8
-mwifiex_is_ba_stream_avail(struct mwifiex_private *priv)
+static inline u8 mwifiex_space_avail_for_new_ba_stream(
+ struct mwifiex_adapter *adapter)
{
- struct mwifiex_private *pmpriv = NULL;
- u8 i = 0;
+ struct mwifiex_private *priv;
+ u8 i;
u32 ba_stream_num = 0;
- for (i = 0; i < priv->adapter->priv_num; i++) {
- pmpriv = priv->adapter->priv[i];
- if (pmpriv)
- ba_stream_num +=
- mwifiex_wmm_list_len(priv->adapter,
- (struct list_head
- *) &pmpriv->
- tx_ba_stream_tbl_ptr);
+ for (i = 0; i < adapter->priv_num; i++) {
+ priv = adapter->priv[i];
+ if (priv)
+ ba_stream_num += mwifiex_wmm_list_len(
+ (struct list_head *)
+ &priv->tx_ba_stream_tbl_ptr);
}
return ((ba_stream_num <
@@ -133,8 +119,7 @@ mwifiex_is_ba_stream_avail(struct mwifiex_private *priv)
* Upon successfully locating, both the TID and the RA are returned.
*/
static inline u8
-mwifiex_find_stream_to_delete(struct mwifiex_private *priv,
- struct mwifiex_ra_list_tbl *ptr, int ptr_tid,
+mwifiex_find_stream_to_delete(struct mwifiex_private *priv, int ptr_tid,
int *ptid, u8 *ra)
{
int tid;
diff --git a/drivers/net/wireless/mwifiex/11n_aggr.c b/drivers/net/wireless/mwifiex/11n_aggr.c
index c2abced66957..c9fb0627de43 100644
--- a/drivers/net/wireless/mwifiex/11n_aggr.c
+++ b/drivers/net/wireless/mwifiex/11n_aggr.c
@@ -44,8 +44,7 @@
* MSDU => |DA|SA|Length|SNAP|...... ..|
*/
static int
-mwifiex_11n_form_amsdu_pkt(struct mwifiex_adapter *adapter,
- struct sk_buff *skb_aggr,
+mwifiex_11n_form_amsdu_pkt(struct sk_buff *skb_aggr,
struct sk_buff *skb_src, int *pad)
{
@@ -324,7 +323,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
ra_list_flags);
- mwifiex_11n_form_amsdu_pkt(adapter, skb_aggr, skb_src, &pad);
+ mwifiex_11n_form_amsdu_pkt(skb_aggr, skb_src, &pad);
mwifiex_write_data_complete(adapter, skb_src, 0);
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.c b/drivers/net/wireless/mwifiex/11n_rxreorder.c
index 8e94e620e6f4..a93c03fdea82 100644
--- a/drivers/net/wireless/mwifiex/11n_rxreorder.c
+++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c
@@ -27,19 +27,6 @@
#include "11n_rxreorder.h"
/*
- * This function processes a received packet and forwards
- * it to the kernel/upper layer.
- */
-static int mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv, void *payload)
-{
- int ret = 0;
- struct mwifiex_adapter *adapter = priv->adapter;
-
- ret = mwifiex_process_rx_packet(adapter, (struct sk_buff *) payload);
- return ret;
-}
-
-/*
* This function dispatches all packets in the Rx reorder table.
*
* There could be holes in the buffer, which are skipped by the function.
@@ -51,7 +38,7 @@ mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv,
struct mwifiex_rx_reorder_tbl
*rx_reor_tbl_ptr, int start_win)
{
- int no_pkt_to_send, i, xchg;
+ int no_pkt_to_send, i;
void *rx_tmp_ptr = NULL;
unsigned long flags;
@@ -68,7 +55,7 @@ mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv,
}
spin_unlock_irqrestore(&priv->rx_pkt_lock, flags);
if (rx_tmp_ptr)
- mwifiex_11n_dispatch_pkt(priv, rx_tmp_ptr);
+ mwifiex_process_rx_packet(priv->adapter, rx_tmp_ptr);
}
spin_lock_irqsave(&priv->rx_pkt_lock, flags);
@@ -76,8 +63,7 @@ mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv,
* We don't have a circular buffer, hence use rotation to simulate
* circular buffer
*/
- xchg = rx_reor_tbl_ptr->win_size - no_pkt_to_send;
- for (i = 0; i < xchg; ++i) {
+ for (i = 0; i < rx_reor_tbl_ptr->win_size - no_pkt_to_send; ++i) {
rx_reor_tbl_ptr->rx_reorder_ptr[i] =
rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i];
rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i] = NULL;
@@ -114,7 +100,7 @@ mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv,
rx_tmp_ptr = rx_reor_tbl_ptr->rx_reorder_ptr[i];
rx_reor_tbl_ptr->rx_reorder_ptr[i] = NULL;
spin_unlock_irqrestore(&priv->rx_pkt_lock, flags);
- mwifiex_11n_dispatch_pkt(priv, rx_tmp_ptr);
+ mwifiex_process_rx_packet(priv->adapter, rx_tmp_ptr);
}
spin_lock_irqsave(&priv->rx_pkt_lock, flags);
@@ -309,8 +295,6 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags);
list_add_tail(&new_node->list, &priv->rx_reorder_tbl_ptr);
spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);
-
- return;
}
/*
@@ -321,8 +305,7 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
* - Setting add BA request buffer
* - Ensuring correct endian-ness
*/
-int mwifiex_cmd_11n_addba_req(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd, void *data_buf)
+int mwifiex_cmd_11n_addba_req(struct host_cmd_ds_command *cmd, void *data_buf)
{
struct host_cmd_ds_11n_addba_req *add_ba_req =
(struct host_cmd_ds_11n_addba_req *)
@@ -393,8 +376,7 @@ int mwifiex_cmd_11n_addba_rsp_gen(struct mwifiex_private *priv,
* - Setting del BA request buffer
* - Ensuring correct endian-ness
*/
-int mwifiex_cmd_11n_delba(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd, void *data_buf)
+int mwifiex_cmd_11n_delba(struct host_cmd_ds_command *cmd, void *data_buf)
{
struct host_cmd_ds_11n_delba *del_ba = (struct host_cmd_ds_11n_delba *)
&cmd->params.del_ba;
@@ -433,7 +415,7 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
tid, ta);
if (!rx_reor_tbl_ptr) {
if (pkt_type != PKT_TYPE_BAR)
- mwifiex_11n_dispatch_pkt(priv, payload);
+ mwifiex_process_rx_packet(priv->adapter, payload);
return 0;
}
start_win = rx_reor_tbl_ptr->start_win;
@@ -609,9 +591,7 @@ void mwifiex_11n_ba_stream_timeout(struct mwifiex_private *priv,
delba.del_ba_param_set |= cpu_to_le16(
(u16) event->origninator << DELBA_INITIATOR_POS);
delba.reason_code = cpu_to_le16(WLAN_REASON_QSTA_TIMEOUT);
- mwifiex_prepare_cmd(priv, HostCmd_CMD_11N_DELBA, 0, 0, NULL, &delba);
-
- return;
+ mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_DELBA, 0, 0, &delba);
}
/*
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.h b/drivers/net/wireless/mwifiex/11n_rxreorder.h
index 42f569035745..f3ca8c8c18f9 100644
--- a/drivers/net/wireless/mwifiex/11n_rxreorder.h
+++ b/drivers/net/wireless/mwifiex/11n_rxreorder.h
@@ -49,14 +49,12 @@ void mwifiex_11n_ba_stream_timeout(struct mwifiex_private *priv,
int mwifiex_ret_11n_addba_resp(struct mwifiex_private *priv,
struct host_cmd_ds_command
*resp);
-int mwifiex_cmd_11n_delba(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+int mwifiex_cmd_11n_delba(struct host_cmd_ds_command *cmd,
void *data_buf);
int mwifiex_cmd_11n_addba_rsp_gen(struct mwifiex_private *priv,
struct host_cmd_ds_command
*cmd, void *data_buf);
-int mwifiex_cmd_11n_addba_req(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+int mwifiex_cmd_11n_addba_req(struct host_cmd_ds_command *cmd,
void *data_buf);
void mwifiex_11n_cleanup_reorder_tbl(struct mwifiex_private *priv);
struct mwifiex_rx_reorder_tbl *mwifiex_11n_get_rxreorder_tbl(struct
diff --git a/drivers/net/wireless/mwifiex/README b/drivers/net/wireless/mwifiex/README
index 338377f7093b..b55badef4660 100644
--- a/drivers/net/wireless/mwifiex/README
+++ b/drivers/net/wireless/mwifiex/README
@@ -157,7 +157,7 @@ info
mp_wr_bitmap = <SDIO multi-port write bitmap>
cmd_resp_received = <0/1, no cmd response to process/response received and yet to process>
event_received = <0/1, no event to process/event received and yet to process>
- ioctl_pending = <number of ioctl pending>
+ cmd_pending = <number of cmd pending>
tx_pending = <number of Tx packet pending>
rx_pending = <number of Rx packet pending>
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index ec0895f4e8d3..b99ae2677d78 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -34,22 +34,17 @@ static int
mwifiex_cfg80211_channel_type_to_mwifiex_channels(enum nl80211_channel_type
channel_type)
{
- int channel;
switch (channel_type) {
case NL80211_CHAN_NO_HT:
case NL80211_CHAN_HT20:
- channel = NO_SEC_CHANNEL;
- break;
+ return NO_SEC_CHANNEL;
case NL80211_CHAN_HT40PLUS:
- channel = SEC_CHANNEL_ABOVE;
- break;
+ return SEC_CHANNEL_ABOVE;
case NL80211_CHAN_HT40MINUS:
- channel = SEC_CHANNEL_BELOW;
- break;
+ return SEC_CHANNEL_BELOW;
default:
- channel = NO_SEC_CHANNEL;
+ return NO_SEC_CHANNEL;
}
- return channel;
}
/*
@@ -64,21 +59,16 @@ mwifiex_cfg80211_channel_type_to_mwifiex_channels(enum nl80211_channel_type
static enum nl80211_channel_type
mwifiex_channels_to_cfg80211_channel_type(int channel_type)
{
- int channel;
switch (channel_type) {
case NO_SEC_CHANNEL:
- channel = NL80211_CHAN_HT20;
- break;
+ return NL80211_CHAN_HT20;
case SEC_CHANNEL_ABOVE:
- channel = NL80211_CHAN_HT40PLUS;
- break;
+ return NL80211_CHAN_HT40PLUS;
case SEC_CHANNEL_BELOW:
- channel = NL80211_CHAN_HT40MINUS;
- break;
+ return NL80211_CHAN_HT40MINUS;
default:
- channel = NL80211_CHAN_HT20;
+ return NL80211_CHAN_HT20;
}
- return channel;
}
/*
@@ -117,10 +107,8 @@ mwifiex_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
u8 key_index, bool pairwise, const u8 *mac_addr)
{
struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
- int ret = 0;
- ret = mwifiex_set_encode(priv, NULL, 0, key_index, 1);
- if (ret) {
+ if (mwifiex_set_encode(priv, NULL, 0, key_index, 1)) {
wiphy_err(wiphy, "deleting the crypto keys\n");
return -EFAULT;
}
@@ -137,12 +125,17 @@ mwifiex_cfg80211_set_tx_power(struct wiphy *wiphy,
enum nl80211_tx_power_setting type,
int dbm)
{
- int ret = 0;
struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+ struct mwifiex_power_cfg power_cfg;
- ret = mwifiex_set_tx_power(priv, type, dbm);
+ if (type == NL80211_TX_POWER_FIXED) {
+ power_cfg.is_power_auto = 0;
+ power_cfg.power_level = dbm;
+ } else {
+ power_cfg.is_power_auto = 1;
+ }
- return ret;
+ return mwifiex_set_tx_power(priv, &power_cfg);
}
/*
@@ -155,17 +148,17 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
struct net_device *dev,
bool enabled, int timeout)
{
- int ret = 0;
struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+ u32 ps_mode;
if (timeout)
wiphy_dbg(wiphy,
"info: ignoring the timeout value"
" for IEEE power save\n");
- ret = mwifiex_drv_set_power(priv, enabled);
+ ps_mode = enabled;
- return ret;
+ return mwifiex_drv_set_power(priv, &ps_mode);
}
/*
@@ -177,18 +170,15 @@ mwifiex_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
bool multicast)
{
struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
- int ret;
/* Return if WEP key not configured */
if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_DISABLED)
return 0;
- ret = mwifiex_set_encode(priv, NULL, 0, key_index, 0);
-
- wiphy_dbg(wiphy, "info: set default Tx key index\n");
-
- if (ret)
+ if (mwifiex_set_encode(priv, NULL, 0, key_index, 0)) {
+ wiphy_err(wiphy, "set default Tx key index\n");
return -EFAULT;
+ }
return 0;
}
@@ -202,15 +192,12 @@ mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
struct key_params *params)
{
struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
- int ret = 0;
- ret = mwifiex_set_encode(priv, params->key, params->key_len,
- key_index, 0);
-
- wiphy_dbg(wiphy, "info: crypto keys added\n");
-
- if (ret)
+ if (mwifiex_set_encode(priv, params->key, params->key_len,
+ key_index, 0)) {
+ wiphy_err(wiphy, "crypto keys added\n");
return -EFAULT;
+ }
return 0;
}
@@ -235,7 +222,6 @@ static int mwifiex_send_domain_info_cmd_fw(struct wiphy *wiphy)
struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
struct mwifiex_adapter *adapter = priv->adapter;
struct mwifiex_802_11d_domain_reg *domain_info = &adapter->domain_reg;
- int ret = 0;
/* Set country code */
domain_info->country_code[0] = priv->country_code[0];
@@ -290,13 +276,14 @@ static int mwifiex_send_domain_info_cmd_fw(struct wiphy *wiphy)
}
domain_info->no_of_triplet = no_of_triplet;
- /* Send cmd to FW to set domain info */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11D_DOMAIN_INFO,
- HostCmd_ACT_GEN_SET, 0, NULL, NULL);
- if (ret)
+
+ if (mwifiex_send_cmd_async(priv, HostCmd_CMD_802_11D_DOMAIN_INFO,
+ HostCmd_ACT_GEN_SET, 0, NULL)) {
wiphy_err(wiphy, "11D: setting domain info in FW\n");
+ return -1;
+ }
- return ret;
+ return 0;
}
/*
@@ -346,8 +333,6 @@ mwifiex_set_rf_channel(struct mwifiex_private *priv,
enum nl80211_channel_type channel_type)
{
struct mwifiex_chan_freq_power cfp;
- int ret = 0;
- int status = 0;
struct mwifiex_ds_band_cfg band_cfg;
u32 config_bands = 0;
struct wiphy *wiphy = priv->wdev->wiphy;
@@ -366,15 +351,14 @@ mwifiex_set_rf_channel(struct mwifiex_private *priv,
band_cfg.config_bands = config_bands;
band_cfg.adhoc_start_band = config_bands;
}
- /* Set channel offset */
+
band_cfg.sec_chan_offset =
mwifiex_cfg80211_channel_type_to_mwifiex_channels
(channel_type);
- status = mwifiex_radio_ioctl_band_cfg(priv, HostCmd_ACT_GEN_SET,
- &band_cfg);
- if (status)
+ if (mwifiex_set_radio_band_cfg(priv, &band_cfg))
return -EFAULT;
+
mwifiex_send_domain_info_cmd_fw(wiphy);
}
@@ -382,20 +366,16 @@ mwifiex_set_rf_channel(struct mwifiex_private *priv,
"mode %d\n", config_bands, band_cfg.sec_chan_offset,
priv->bss_mode);
if (!chan)
- return ret;
+ return 0;
memset(&cfp, 0, sizeof(cfp));
cfp.freq = chan->center_freq;
- /* Convert frequency to channel */
cfp.channel = ieee80211_frequency_to_channel(chan->center_freq);
- status = mwifiex_bss_ioctl_channel(priv, HostCmd_ACT_GEN_SET, &cfp);
- if (status)
+ if (mwifiex_bss_set_channel(priv, &cfp))
return -EFAULT;
- ret = mwifiex_drv_change_adhoc_chan(priv, cfp.channel);
-
- return ret;
+ return mwifiex_drv_change_adhoc_chan(priv, cfp.channel);
}
/*
@@ -422,67 +402,41 @@ mwifiex_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
/*
* This function sets the fragmentation threshold.
*
- * This function creates an IOCTL request, populates it accordingly
- * and issues an IOCTL.
- *
- * The fragmentation threshold value must lies between MWIFIEX_FRAG_MIN_VALUE
+ * The fragmentation threshold value must lie between MWIFIEX_FRAG_MIN_VALUE
* and MWIFIEX_FRAG_MAX_VALUE.
*/
static int
mwifiex_set_frag(struct mwifiex_private *priv, u32 frag_thr)
{
int ret = 0;
- int status = 0;
- struct mwifiex_wait_queue *wait = NULL;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
if (frag_thr < MWIFIEX_FRAG_MIN_VALUE
|| frag_thr > MWIFIEX_FRAG_MAX_VALUE)
return -EINVAL;
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- status = mwifiex_snmp_mib_ioctl(priv, wait, FRAG_THRESH_I,
- HostCmd_ACT_GEN_SET, &frag_thr);
-
- if (mwifiex_request_ioctl(priv, wait, status, wait_option))
- ret = -EFAULT;
+ /* Send request to firmware */
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
+ HostCmd_ACT_GEN_SET, FRAG_THRESH_I,
+ &frag_thr);
- kfree(wait);
return ret;
}
/*
* This function sets the RTS threshold.
- *
- * This function creates an IOCTL request, populates it accordingly
- * and issues an IOCTL.
+
+ * The rts value must lie between MWIFIEX_RTS_MIN_VALUE
+ * and MWIFIEX_RTS_MAX_VALUE.
*/
static int
mwifiex_set_rts(struct mwifiex_private *priv, u32 rts_thr)
{
- int ret = 0;
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
-
if (rts_thr < MWIFIEX_RTS_MIN_VALUE || rts_thr > MWIFIEX_RTS_MAX_VALUE)
rts_thr = MWIFIEX_RTS_MAX_VALUE;
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- status = mwifiex_snmp_mib_ioctl(priv, wait, RTS_THRESH_I,
- HostCmd_ACT_GEN_SET, &rts_thr);
-
- if (mwifiex_request_ioctl(priv, wait, status, wait_option))
- ret = -EFAULT;
-
- kfree(wait);
- return ret;
+ return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
+ HostCmd_ACT_GEN_SET, RTS_THRESH_I,
+ &rts_thr);
}
/*
@@ -498,8 +452,11 @@ mwifiex_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
int ret = 0;
- if (changed & WIPHY_PARAM_RTS_THRESHOLD)
+ if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
ret = mwifiex_set_rts(priv, wiphy->rts_threshold);
+ if (ret)
+ return ret;
+ }
if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
ret = mwifiex_set_frag(priv, wiphy->frag_threshold);
@@ -518,7 +475,6 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
{
int ret = 0;
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
- struct mwifiex_wait_queue *wait = NULL;
if (priv->bss_mode == type) {
wiphy_warn(wiphy, "already set to required type\n");
@@ -545,24 +501,13 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
return -EINVAL;
}
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
-
- mwifiex_deauthenticate(priv, wait, NULL);
+ mwifiex_deauthenticate(priv, NULL);
priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM;
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_SET_BSS_MODE,
- HostCmd_ACT_GEN_SET, 0, wait, NULL);
- if (!ret)
- ret = -EINPROGRESS;
-
- ret = mwifiex_request_ioctl(priv, wait, ret, MWIFIEX_IOCTL_WAIT);
- if (ret)
- ret = -EFAULT;
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_SET_BSS_MODE,
+ HostCmd_ACT_GEN_SET, 0, NULL);
- kfree(wait);
return ret;
}
@@ -592,7 +537,7 @@ mwifiex_dump_station_info(struct mwifiex_private *priv,
/* Get signal information from the firmware */
memset(&signal, 0, sizeof(struct mwifiex_ds_get_signal));
- if (mwifiex_get_signal_info(priv, MWIFIEX_IOCTL_WAIT, &signal)) {
+ if (mwifiex_get_signal_info(priv, &signal)) {
dev_err(priv->adapter->dev, "getting signal information\n");
ret = -EFAULT;
}
@@ -623,7 +568,6 @@ mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
u8 *mac, struct station_info *sinfo)
{
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
- int ret = 0;
mwifiex_dump_station_info(priv, sinfo);
@@ -632,10 +576,7 @@ mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
if (memcmp(mac, priv->cfg_bssid, ETH_ALEN))
return -ENOENT;
-
- ret = mwifiex_dump_station_info(priv, sinfo);
-
- return ret;
+ return mwifiex_dump_station_info(priv, sinfo);
}
/* Supported rates to be advertised to the cfg80211 */
@@ -750,7 +691,7 @@ mwifiex_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
return -EBUSY;
priv->disconnect = 1;
- if (mwifiex_disconnect(priv, MWIFIEX_IOCTL_WAIT, NULL))
+ if (mwifiex_deauthenticate(priv, NULL))
return -EFAULT;
wiphy_dbg(wiphy, "info: successfully disconnected from %pM:"
@@ -774,15 +715,13 @@ mwifiex_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
*/
static int mwifiex_cfg80211_inform_ibss_bss(struct mwifiex_private *priv)
{
- int ret = 0;
struct ieee80211_channel *chan;
struct mwifiex_bss_info bss_info;
int ie_len = 0;
u8 ie_buf[IEEE80211_MAX_SSID_LEN + sizeof(struct ieee_types_header)];
- ret = mwifiex_get_bss_info(priv, &bss_info);
- if (ret)
- return ret;
+ if (mwifiex_get_bss_info(priv, &bss_info))
+ return -1;
ie_buf[0] = WLAN_EID_SSID;
ie_buf[1] = bss_info.ssid.ssid_len;
@@ -801,7 +740,7 @@ static int mwifiex_cfg80211_inform_ibss_bss(struct mwifiex_private *priv)
0, ie_buf, ie_len, 0, GFP_KERNEL);
memcpy(priv->cfg_bssid, bss_info.bssid, ETH_ALEN);
- return ret;
+ return 0;
}
/*
@@ -830,16 +769,15 @@ static int mwifiex_inform_bss_from_scan_result(struct mwifiex_private *priv,
struct mwifiex_bssdescriptor *scan_table;
int i, j;
struct ieee80211_channel *chan;
- u8 *ie, *tmp, *ie_buf;
+ u8 *ie, *ie_buf;
u32 ie_len;
- u64 ts = 0;
u8 *beacon;
int beacon_size;
u8 element_id, element_len;
memset(&scan_resp, 0, sizeof(scan_resp));
- if (mwifiex_get_scan_table(priv, MWIFIEX_IOCTL_WAIT, &scan_resp))
- return -EFAULT;
+ scan_resp.scan_table = (u8 *) priv->adapter->scan_table;
+ scan_resp.num_in_scan_table = priv->adapter->num_in_scan_table;
#define MAX_IE_BUF 2048
ie_buf = kzalloc(MAX_IE_BUF, GFP_KERNEL);
@@ -914,9 +852,9 @@ static int mwifiex_inform_bss_from_scan_result(struct mwifiex_private *priv,
case WLAN_EID_BSS_AC_ACCESS_DELAY:
ie[0] = element_id;
ie[1] = element_len;
- tmp = (u8 *) beacon;
memcpy(&ie[sizeof(struct ieee_types_header)],
- tmp + sizeof(struct ieee_types_header),
+ (u8 *) beacon
+ + sizeof(struct ieee_types_header),
element_len);
ie_len += ie[1] +
sizeof(struct ieee_types_header);
@@ -933,7 +871,7 @@ static int mwifiex_inform_bss_from_scan_result(struct mwifiex_private *priv,
scan_table[i].freq);
cfg80211_inform_bss(priv->wdev->wiphy, chan,
scan_table[i].mac_address,
- ts, scan_table[i].cap_info_bitmap,
+ 0, scan_table[i].cap_info_bitmap,
scan_table[i].beacon_period,
ie_buf, ie_len,
scan_table[i].rssi, GFP_KERNEL);
@@ -966,9 +904,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
struct mwifiex_802_11_ssid req_ssid;
struct mwifiex_ssid_bssid ssid_bssid;
int ret = 0;
- int auth_type = 0, pairwise_encrypt_mode = 0;
- int group_encrypt_mode = 0;
- int alg_is_wep = 0;
+ int auth_type = 0;
memset(&req_ssid, 0, sizeof(struct mwifiex_802_11_ssid));
memset(&ssid_bssid, 0, sizeof(struct mwifiex_ssid_bssid));
@@ -986,7 +922,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
}
/* disconnect before try to associate */
- mwifiex_disconnect(priv, MWIFIEX_IOCTL_WAIT, NULL);
+ mwifiex_deauthenticate(priv, NULL);
if (channel)
ret = mwifiex_set_rf_channel(priv, channel,
@@ -1034,9 +970,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
ret = mwifiex_set_gen_ie(priv, sme->ie, sme->ie_len);
if (sme->key) {
- alg_is_wep = mwifiex_is_alg_wep(pairwise_encrypt_mode)
- | mwifiex_is_alg_wep(group_encrypt_mode);
- if (alg_is_wep) {
+ if (mwifiex_is_alg_wep(0) | mwifiex_is_alg_wep(0)) {
dev_dbg(priv->adapter->dev,
"info: setting wep encryption"
" with key len %d\n", sme->key_len);
@@ -1046,7 +980,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
}
done:
/* Do specific SSID scanning */
- if (mwifiex_request_scan(priv, MWIFIEX_IOCTL_WAIT, &req_ssid)) {
+ if (mwifiex_request_scan(priv, &req_ssid)) {
dev_err(priv->adapter->dev, "scan error\n");
return -EFAULT;
}
@@ -1055,8 +989,7 @@ done:
memcpy(&ssid_bssid.ssid, &req_ssid, sizeof(struct mwifiex_802_11_ssid));
if (mode != NL80211_IFTYPE_ADHOC) {
- if (mwifiex_find_best_bss(priv, MWIFIEX_IOCTL_WAIT,
- &ssid_bssid))
+ if (mwifiex_find_best_bss(priv, &ssid_bssid))
return -EFAULT;
/* Inform the BSS information to kernel, otherwise
* kernel will give a panic after successful assoc */
@@ -1072,7 +1005,10 @@ done:
/* Connect to BSS by ESSID */
memset(&ssid_bssid.bssid, 0, ETH_ALEN);
- if (mwifiex_bss_start(priv, MWIFIEX_IOCTL_WAIT, &ssid_bssid))
+ if (!netif_queue_stopped(priv->netdev))
+ netif_stop_queue(priv->netdev);
+
+ if (mwifiex_bss_start(priv, &ssid_bssid))
return -EFAULT;
if (mode == NL80211_IFTYPE_ADHOC) {
@@ -1176,7 +1112,7 @@ mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
wiphy_dbg(wiphy, "info: disconnecting from essid %pM\n",
priv->cfg_bssid);
- if (mwifiex_disconnect(priv, MWIFIEX_IOCTL_WAIT, NULL))
+ if (mwifiex_deauthenticate(priv, NULL))
return -EFAULT;
queue_work(priv->workqueue, &priv->cfg_workqueue);
@@ -1451,6 +1387,4 @@ done:
memset(priv->cfg_bssid, 0, ETH_ALEN);
priv->disconnect = 0;
}
-
- return;
}
diff --git a/drivers/net/wireless/mwifiex/cfp.c b/drivers/net/wireless/mwifiex/cfp.c
index 07187a405fee..d0cada5a29a0 100644
--- a/drivers/net/wireless/mwifiex/cfp.c
+++ b/drivers/net/wireless/mwifiex/cfp.c
@@ -75,8 +75,7 @@ u8 supported_rates_n[N_SUPPORTED_RATES] = { 0x02, 0x04, 0 };
* This function maps an index in supported rates table into
* the corresponding data rate.
*/
-u32 mwifiex_index_to_data_rate(struct mwifiex_adapter *adapter, u8 index,
- u8 ht_info)
+u32 mwifiex_index_to_data_rate(u8 index, u8 ht_info)
{
u16 mcs_rate[4][8] = {
{0x1b, 0x36, 0x51, 0x6c, 0xa2, 0xd8, 0xf3, 0x10e}
@@ -126,7 +125,7 @@ u32 mwifiex_index_to_data_rate(struct mwifiex_adapter *adapter, u8 index,
* This function maps a data rate value into corresponding index in supported
* rates table.
*/
-u8 mwifiex_data_rate_to_index(struct mwifiex_adapter *adapter, u32 rate)
+u8 mwifiex_data_rate_to_index(u32 rate)
{
u16 *ptr;
@@ -146,16 +145,12 @@ u8 mwifiex_data_rate_to_index(struct mwifiex_adapter *adapter, u32 rate)
*/
u32 mwifiex_get_active_data_rates(struct mwifiex_private *priv, u8 *rates)
{
- u32 k;
-
if (!priv->media_connected)
- k = mwifiex_get_supported_rates(priv, rates);
+ return mwifiex_get_supported_rates(priv, rates);
else
- k = mwifiex_copy_rates(rates, 0,
+ return mwifiex_copy_rates(rates, 0,
priv->curr_bss_params.data_rates,
priv->curr_bss_params.num_of_rates);
-
- return k;
}
/*
@@ -265,9 +260,7 @@ mwifiex_is_rate_auto(struct mwifiex_private *priv)
/*
* This function converts rate bitmap into rate index.
*/
-int
-mwifiex_get_rate_index(struct mwifiex_adapter *adapter, u16 *rate_bitmap,
- int size)
+int mwifiex_get_rate_index(u16 *rate_bitmap, int size)
{
int i;
diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c
index a9aeb31af455..776146a104ec 100644
--- a/drivers/net/wireless/mwifiex/cmdevt.c
+++ b/drivers/net/wireless/mwifiex/cmdevt.c
@@ -36,11 +36,12 @@
static void
mwifiex_init_cmd_node(struct mwifiex_private *priv,
struct cmd_ctrl_node *cmd_node,
- u32 cmd_oid, void *wait_queue, void *data_buf)
+ u32 cmd_oid, void *data_buf)
{
cmd_node->priv = priv;
cmd_node->cmd_oid = cmd_oid;
- cmd_node->wq_buf = wait_queue;
+ cmd_node->wait_q_enabled = priv->adapter->cmd_wait_q_required;
+ priv->adapter->cmd_wait_q_required = false;
cmd_node->data_buf = data_buf;
cmd_node->cmd_skb = cmd_node->skb;
}
@@ -86,39 +87,13 @@ mwifiex_clean_cmd_node(struct mwifiex_adapter *adapter,
{
cmd_node->cmd_oid = 0;
cmd_node->cmd_flag = 0;
- cmd_node->wq_buf = NULL;
cmd_node->data_buf = NULL;
+ cmd_node->wait_q_enabled = false;
if (cmd_node->resp_skb) {
mwifiex_recv_complete(adapter, cmd_node->resp_skb, 0);
cmd_node->resp_skb = NULL;
}
-
- return;
-}
-
-/*
- * This function returns a command node from the pending queue which
- * matches the given IOCTL request.
- */
-static struct cmd_ctrl_node *
-mwifiex_get_pending_ioctl_cmd(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait_queue)
-{
- unsigned long flags;
- struct cmd_ctrl_node *cmd_node;
-
- spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
- list_for_each_entry(cmd_node, &adapter->cmd_pending_q, list) {
- if (cmd_node->wq_buf == wait_queue) {
- spin_unlock_irqrestore(&adapter->cmd_pending_q_lock,
- flags);
- return cmd_node;
- }
- }
- spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
-
- return NULL;
}
/*
@@ -155,7 +130,6 @@ static int mwifiex_dnld_cmd_to_fw(struct mwifiex_private *priv,
struct mwifiex_adapter *adapter = priv->adapter;
int ret = 0;
struct host_cmd_ds_command *host_cmd;
- struct mwifiex_wait_queue *wait_queue = NULL;
uint16_t cmd_code;
uint16_t cmd_size;
struct timeval tstamp;
@@ -165,15 +139,13 @@ static int mwifiex_dnld_cmd_to_fw(struct mwifiex_private *priv,
return -1;
host_cmd = (struct host_cmd_ds_command *) (cmd_node->cmd_skb->data);
- if (cmd_node->wq_buf)
- wait_queue = (struct mwifiex_wait_queue *) cmd_node->wq_buf;
/* Sanity test */
if (host_cmd == NULL || host_cmd->size == 0) {
dev_err(adapter->dev, "DNLD_CMD: host_cmd is null"
" or cmd size is 0, not sending\n");
- if (wait_queue)
- wait_queue->status = MWIFIEX_ERROR_CMD_DNLD_FAIL;
+ if (cmd_node->wait_q_enabled)
+ adapter->cmd_wait_q.status = -1;
mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
return -1;
}
@@ -206,10 +178,12 @@ static int mwifiex_dnld_cmd_to_fw(struct mwifiex_private *priv,
cmd_node->cmd_skb->data,
cmd_node->cmd_skb->len, NULL);
+ skb_pull(cmd_node->cmd_skb, INTF_HEADER_LEN);
+
if (ret == -1) {
dev_err(adapter->dev, "DNLD_CMD: host to card failed\n");
- if (wait_queue)
- wait_queue->status = MWIFIEX_ERROR_CMD_DNLD_FAIL;
+ if (cmd_node->wait_q_enabled)
+ adapter->cmd_wait_q.status = -1;
mwifiex_insert_cmd_to_free_q(adapter, adapter->curr_cmd);
spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
@@ -435,7 +409,31 @@ int mwifiex_process_event(struct mwifiex_adapter *adapter)
}
/*
- * This function prepares a command before sending it to the firmware.
+ * This function is used to send synchronous command to the firmware.
+ *
+ * it allocates a wait queue for the command and wait for the command
+ * response.
+ */
+int mwifiex_send_cmd_sync(struct mwifiex_private *priv, uint16_t cmd_no,
+ u16 cmd_action, u32 cmd_oid, void *data_buf)
+{
+ int ret = 0;
+ struct mwifiex_adapter *adapter = priv->adapter;
+
+ adapter->cmd_wait_q_required = true;
+ adapter->cmd_wait_q.condition = false;
+
+ ret = mwifiex_send_cmd_async(priv, cmd_no, cmd_action, cmd_oid,
+ data_buf);
+ if (!ret)
+ ret = mwifiex_wait_queue_complete(adapter);
+
+ return ret;
+}
+
+
+/*
+ * This function prepares a command and asynchronously send it to the firmware.
*
* Preparation includes -
* - Sanity tests to make sure the card is still present or the FW
@@ -445,9 +443,8 @@ int mwifiex_process_event(struct mwifiex_adapter *adapter)
* - Fill up the non-default parameters and buffer pointers
* - Add the command to pending queue
*/
-int mwifiex_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
- u16 cmd_action, u32 cmd_oid,
- void *wait_queue, void *data_buf)
+int mwifiex_send_cmd_async(struct mwifiex_private *priv, uint16_t cmd_no,
+ u16 cmd_action, u32 cmd_oid, void *data_buf)
{
int ret = 0;
struct mwifiex_adapter *adapter = priv->adapter;
@@ -485,7 +482,7 @@ int mwifiex_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
}
/* Initialize the command node */
- mwifiex_init_cmd_node(priv, cmd_node, cmd_oid, wait_queue, data_buf);
+ mwifiex_init_cmd_node(priv, cmd_node, cmd_oid, data_buf);
if (!cmd_node->cmd_skb) {
dev_err(adapter->dev, "PREP_CMD: no free cmd buf\n");
@@ -535,18 +532,13 @@ void
mwifiex_insert_cmd_to_free_q(struct mwifiex_adapter *adapter,
struct cmd_ctrl_node *cmd_node)
{
- struct mwifiex_wait_queue *wait_queue = NULL;
unsigned long flags;
- if (cmd_node == NULL)
+ if (!cmd_node)
return;
- if (cmd_node->wq_buf) {
- wait_queue = (struct mwifiex_wait_queue *) cmd_node->wq_buf;
- if (wait_queue->status != MWIFIEX_ERROR_NO_ERROR)
- mwifiex_ioctl_complete(adapter, wait_queue, -1);
- else
- mwifiex_ioctl_complete(adapter, wait_queue, 0);
- }
+
+ if (cmd_node->wait_q_enabled)
+ mwifiex_complete_cmd(adapter);
/* Clean the node */
mwifiex_clean_cmd_node(adapter, cmd_node);
@@ -554,8 +546,6 @@ mwifiex_insert_cmd_to_free_q(struct mwifiex_adapter *adapter,
spin_lock_irqsave(&adapter->cmd_free_q_lock, flags);
list_add_tail(&cmd_node->list, &adapter->cmd_free_q);
spin_unlock_irqrestore(&adapter->cmd_free_q_lock, flags);
-
- return;
}
/*
@@ -600,8 +590,6 @@ mwifiex_insert_cmd_to_pending_q(struct mwifiex_adapter *adapter,
spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
dev_dbg(adapter->dev, "cmd: QUEUE_CMD: cmd=%#x is queued\n", command);
-
- return;
}
/*
@@ -692,7 +680,6 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
uint16_t orig_cmdresp_no;
uint16_t cmdresp_no;
uint16_t cmdresp_result;
- struct mwifiex_wait_queue *wait_queue = NULL;
struct timeval tstamp;
unsigned long flags;
@@ -706,10 +693,6 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
return -1;
}
- if (adapter->curr_cmd->wq_buf)
- wait_queue = (struct mwifiex_wait_queue *)
- adapter->curr_cmd->wq_buf;
-
adapter->num_cmd_timeout = 0;
resp = (struct host_cmd_ds_command *) adapter->curr_cmd->resp_skb->data;
@@ -764,8 +747,8 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
if (!(orig_cmdresp_no & HostCmd_RET_BIT)) {
dev_err(adapter->dev, "CMD_RESP: invalid cmd resp\n");
- if (wait_queue)
- wait_queue->status = MWIFIEX_ERROR_FW_CMDRESP;
+ if (adapter->curr_cmd->wait_q_enabled)
+ adapter->cmd_wait_q.status = -1;
mwifiex_insert_cmd_to_free_q(adapter, adapter->curr_cmd);
spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
@@ -781,8 +764,7 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
ret = mwifiex_ret_802_11_hs_cfg(priv, resp);
} else {
/* handle response */
- ret = mwifiex_process_sta_cmdresp(priv, cmdresp_no, resp,
- wait_queue);
+ ret = mwifiex_process_sta_cmdresp(priv, cmdresp_no, resp);
}
/* Check init command response */
@@ -797,10 +779,10 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
}
if (adapter->curr_cmd) {
- if (wait_queue && (!ret))
- wait_queue->status = MWIFIEX_ERROR_NO_ERROR;
- else if (wait_queue && (ret == -1))
- wait_queue->status = MWIFIEX_ERROR_CMD_RESP_FAIL;
+ if (adapter->curr_cmd->wait_q_enabled && (!ret))
+ adapter->cmd_wait_q.status = 0;
+ else if (adapter->curr_cmd->wait_q_enabled && (ret == -1))
+ adapter->cmd_wait_q.status = -1;
/* Clean up and put current command back to cmd_free_q */
mwifiex_insert_cmd_to_free_q(adapter, adapter->curr_cmd);
@@ -824,7 +806,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
struct mwifiex_adapter *adapter =
(struct mwifiex_adapter *) function_context;
struct cmd_ctrl_node *cmd_node = NULL;
- struct mwifiex_wait_queue *wait_queue = NULL;
struct timeval tstamp;
adapter->num_cmd_timeout++;
@@ -834,10 +815,8 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
return;
}
cmd_node = adapter->curr_cmd;
- if (cmd_node->wq_buf) {
- wait_queue = (struct mwifiex_wait_queue *) cmd_node->wq_buf;
- wait_queue->status = MWIFIEX_ERROR_CMD_TIMEOUT;
- }
+ if (cmd_node->wait_q_enabled)
+ adapter->cmd_wait_q.status = -ETIMEDOUT;
if (cmd_node) {
adapter->dbg.timeout_cmd_id =
@@ -886,8 +865,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
}
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING)
mwifiex_init_fw_complete(adapter);
-
- return;
}
/*
@@ -901,18 +878,15 @@ void
mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter)
{
struct cmd_ctrl_node *cmd_node = NULL, *tmp_node = NULL;
- struct mwifiex_wait_queue *wait_queue = NULL;
unsigned long flags;
/* Cancel current cmd */
- if ((adapter->curr_cmd) && (adapter->curr_cmd->wq_buf)) {
- wait_queue =
- (struct mwifiex_wait_queue *) adapter->curr_cmd->wq_buf;
+ if ((adapter->curr_cmd) && (adapter->curr_cmd->wait_q_enabled)) {
spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
- adapter->curr_cmd->wq_buf = NULL;
+ adapter->curr_cmd->wait_q_enabled = false;
spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
- wait_queue->status = MWIFIEX_ERROR_CMD_CANCEL;
- mwifiex_ioctl_complete(adapter, wait_queue, -1);
+ adapter->cmd_wait_q.status = -1;
+ mwifiex_complete_cmd(adapter);
}
/* Cancel all pending command */
spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
@@ -921,12 +895,10 @@ mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter)
list_del(&cmd_node->list);
spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
- if (cmd_node->wq_buf) {
- wait_queue =
- (struct mwifiex_wait_queue *) cmd_node->wq_buf;
- wait_queue->status = MWIFIEX_ERROR_CMD_CANCEL;
- mwifiex_ioctl_complete(adapter, wait_queue, -1);
- cmd_node->wq_buf = NULL;
+ if (cmd_node->wait_q_enabled) {
+ adapter->cmd_wait_q.status = -1;
+ mwifiex_complete_cmd(adapter);
+ cmd_node->wait_q_enabled = false;
}
mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
@@ -940,7 +912,7 @@ mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter)
list_del(&cmd_node->list);
spin_unlock_irqrestore(&adapter->scan_pending_q_lock, flags);
- cmd_node->wq_buf = NULL;
+ cmd_node->wait_q_enabled = false;
mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
spin_lock_irqsave(&adapter->scan_pending_q_lock, flags);
}
@@ -962,8 +934,7 @@ mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter)
* are cancelled.
*/
void
-mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait_queue)
+mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter)
{
struct cmd_ctrl_node *cmd_node = NULL, *tmp_node = NULL;
unsigned long cmd_flags;
@@ -972,45 +943,33 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter,
uint16_t cancel_scan_cmd = false;
if ((adapter->curr_cmd) &&
- (adapter->curr_cmd->wq_buf == wait_queue)) {
+ (adapter->curr_cmd->wait_q_enabled)) {
spin_lock_irqsave(&adapter->mwifiex_cmd_lock, cmd_flags);
cmd_node = adapter->curr_cmd;
- cmd_node->wq_buf = NULL;
+ cmd_node->wait_q_enabled = false;
cmd_node->cmd_flag |= CMD_F_CANCELED;
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
- }
-
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, cmd_flags);
- while (1) {
- cmd_node = mwifiex_get_pending_ioctl_cmd(adapter, wait_queue);
- if (!cmd_node)
- break;
-
spin_lock_irqsave(&adapter->cmd_pending_q_lock,
cmd_pending_q_flags);
list_del(&cmd_node->list);
spin_unlock_irqrestore(&adapter->cmd_pending_q_lock,
cmd_pending_q_flags);
-
- cmd_node->wq_buf = NULL;
mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
+ spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
}
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
+
/* Cancel all pending scan command */
spin_lock_irqsave(&adapter->scan_pending_q_lock,
scan_pending_q_flags);
list_for_each_entry_safe(cmd_node, tmp_node,
&adapter->scan_pending_q, list) {
- if (cmd_node->wq_buf == wait_queue) {
- list_del(&cmd_node->list);
- spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
- scan_pending_q_flags);
- cmd_node->wq_buf = NULL;
- mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
- spin_lock_irqsave(&adapter->scan_pending_q_lock,
- scan_pending_q_flags);
- cancel_scan_cmd = true;
- }
+ list_del(&cmd_node->list);
+ spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
+ scan_pending_q_flags);
+ cmd_node->wait_q_enabled = false;
+ mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
+ spin_lock_irqsave(&adapter->scan_pending_q_lock,
+ scan_pending_q_flags);
+ cancel_scan_cmd = true;
}
spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
scan_pending_q_flags);
@@ -1020,10 +979,8 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter,
adapter->scan_processing = false;
spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
}
- wait_queue->status = MWIFIEX_ERROR_CMD_CANCEL;
- mwifiex_ioctl_complete(adapter, wait_queue, -1);
-
- return;
+ adapter->cmd_wait_q.status = -1;
+ mwifiex_complete_cmd(adapter);
}
/*
@@ -1127,7 +1084,6 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter)
adapter->is_hs_configured = false;
mwifiex_hs_activated_event(mwifiex_get_priv(adapter,
MWIFIEX_BSS_ROLE_ANY), false);
- return;
}
/*
diff --git a/drivers/net/wireless/mwifiex/debugfs.c b/drivers/net/wireless/mwifiex/debugfs.c
index 63b09692f27d..7ddcb062f103 100644
--- a/drivers/net/wireless/mwifiex/debugfs.c
+++ b/drivers/net/wireless/mwifiex/debugfs.c
@@ -129,8 +129,8 @@ static struct mwifiex_debug_data items[] = {
item_addr(event_received), 1},
/* variables defined in struct mwifiex_adapter */
- {"ioctl_pending", adapter_item_size(ioctl_pending),
- adapter_item_addr(ioctl_pending), 1},
+ {"cmd_pending", adapter_item_size(cmd_pending),
+ adapter_item_addr(cmd_pending), 1},
{"tx_pending", adapter_item_size(tx_pending),
adapter_item_addr(tx_pending), 1},
{"rx_pending", adapter_item_size(rx_pending),
@@ -735,8 +735,6 @@ mwifiex_dev_debugfs_init(struct mwifiex_private *priv)
MWIFIEX_DFS_ADD_FILE(getlog);
MWIFIEX_DFS_ADD_FILE(regrdwr);
MWIFIEX_DFS_ADD_FILE(rdeeprom);
-
- return;
}
/*
@@ -749,7 +747,6 @@ mwifiex_dev_debugfs_remove(struct mwifiex_private *priv)
return;
debugfs_remove_recursive(priv->dfs_dev_dir);
- return;
}
/*
diff --git a/drivers/net/wireless/mwifiex/decl.h b/drivers/net/wireless/mwifiex/decl.h
index c3c15f9e757e..0e90b0986ed8 100644
--- a/drivers/net/wireless/mwifiex/decl.h
+++ b/drivers/net/wireless/mwifiex/decl.h
@@ -61,23 +61,6 @@
#define MWIFIEX_BUF_FLAG_REQUEUED_PKT BIT(0)
-enum mwifiex_error_code {
- MWIFIEX_ERROR_NO_ERROR = 0,
- MWIFIEX_ERROR_FW_NOT_READY = 0x00000001,
- MWIFIEX_ERROR_FW_BUSY,
- MWIFIEX_ERROR_FW_CMDRESP,
- MWIFIEX_ERROR_PKT_SIZE_INVALID = 0x80000001,
- MWIFIEX_ERROR_PKT_TIMEOUT,
- MWIFIEX_ERROR_CMD_INVALID,
- MWIFIEX_ERROR_CMD_TIMEOUT,
- MWIFIEX_ERROR_CMD_DNLD_FAIL,
- MWIFIEX_ERROR_CMD_CANCEL,
- MWIFIEX_ERROR_CMD_RESP_FAIL,
- MWIFIEX_ERROR_ASSOC_FAIL,
- MWIFIEX_ERROR_EVENT_UNKNOWN,
- MWIFIEX_ERROR_INVALID_PARAMETER,
-};
-
enum mwifiex_bss_type {
MWIFIEX_BSS_TYPE_STA = 0,
MWIFIEX_BSS_TYPE_UAP = 1,
@@ -112,12 +95,9 @@ struct mwifiex_802_11_ssid {
};
struct mwifiex_wait_queue {
- u32 bss_index;
- wait_queue_head_t *wait;
- u16 *condition;
- u32 start_time;
+ wait_queue_head_t wait;
+ u16 condition;
int status;
- u32 enabled;
};
struct mwifiex_rxinfo {
@@ -133,11 +113,11 @@ struct mwifiex_txinfo {
};
struct mwifiex_bss_attr {
- u32 bss_type;
- u32 frame_type;
- u32 active;
- u32 bss_priority;
- u32 bss_num;
+ u8 bss_type;
+ u8 frame_type;
+ u8 active;
+ u8 bss_priority;
+ u8 bss_num;
};
enum mwifiex_wmm_ac_e {
@@ -146,8 +126,4 @@ enum mwifiex_wmm_ac_e {
WMM_AC_VI,
WMM_AC_VO
} __packed;
-
-struct mwifiex_device {
- struct mwifiex_bss_attr bss_attr[MWIFIEX_MAX_BSS_NUM];
-};
#endif /* !_MWIFIEX_DECL_H_ */
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h
index 2b938115b26a..6d1c4545eda6 100644
--- a/drivers/net/wireless/mwifiex/fw.h
+++ b/drivers/net/wireless/mwifiex/fw.h
@@ -72,33 +72,12 @@ enum KEY_TYPE_ID {
KEY_TYPE_ID_AES,
KEY_TYPE_ID_WAPI,
};
-
-enum KEY_INFO_WEP {
- KEY_INFO_WEP_MCAST = 0x01,
- KEY_INFO_WEP_UNICAST = 0x02,
- KEY_INFO_WEP_ENABLED = 0x04
-};
-
-enum KEY_INFO_TKIP {
- KEY_INFO_TKIP_MCAST = 0x01,
- KEY_INFO_TKIP_UNICAST = 0x02,
- KEY_INFO_TKIP_ENABLED = 0x04
-};
-
-enum KEY_INFO_AES {
- KEY_INFO_AES_MCAST = 0x01,
- KEY_INFO_AES_UNICAST = 0x02,
- KEY_INFO_AES_ENABLED = 0x04
-};
+#define KEY_MCAST BIT(0)
+#define KEY_UNICAST BIT(1)
+#define KEY_ENABLED BIT(2)
#define WAPI_KEY_LEN 50
-enum KEY_INFO_WAPI {
- KEY_INFO_WAPI_MCAST = 0x01,
- KEY_INFO_WAPI_UNICAST = 0x02,
- KEY_INFO_WAPI_ENABLED = 0x04
-};
-
#define MAX_POLL_TRIES 100
#define MAX_MULTI_INTERFACE_POLL_TRIES 1000
@@ -155,7 +134,6 @@ enum MWIFIEX_802_11_WEP_STATUS {
#define MWIFIEX_TX_DATA_BUF_SIZE_4K 4096
#define MWIFIEX_TX_DATA_BUF_SIZE_8K 8192
-#define NON_GREENFIELD_STAS 0x04
#define ISSUPP_11NENABLED(FwCapInfo) (FwCapInfo & BIT(11))
@@ -180,7 +158,6 @@ enum MWIFIEX_802_11_WEP_STATUS {
#define ISSUPP_GREENFIELD(Dot11nDevCap) (Dot11nDevCap & BIT(29))
#define GET_RXMCSSUPP(DevMCSSupported) (DevMCSSupported & 0x0f)
-#define RESETHT_EXTCAP_RDG(HTExtCap) (HTExtCap &= ~BIT(11))
#define SETHT_MCS32(x) (x[4] |= 1)
#define SET_SECONDARYCHAN(RadioType, SECCHAN) (RadioType |= (SECCHAN << 4))
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c
index 8189862da1f9..fc2c0c5728d9 100644
--- a/drivers/net/wireless/mwifiex/init.c
+++ b/drivers/net/wireless/mwifiex/init.c
@@ -35,7 +35,6 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv)
{
struct mwifiex_adapter *adapter = priv->adapter;
struct mwifiex_bss_prio_node *bss_prio;
- int status = 0;
unsigned long flags;
bss_prio = kzalloc(sizeof(struct mwifiex_bss_prio_node), GFP_KERNEL);
@@ -59,7 +58,7 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv)
spin_unlock_irqrestore(&adapter->bss_prio_tbl[priv->bss_priority]
.bss_prio_lock, flags);
- return status;
+ return 0;
}
/*
@@ -72,7 +71,6 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv)
static int mwifiex_init_priv(struct mwifiex_private *priv)
{
u32 i;
- int ret = 0;
priv->media_connected = false;
memset(priv->curr_addr, 0xff, ETH_ALEN);
@@ -140,9 +138,7 @@ static int mwifiex_init_priv(struct mwifiex_private *priv)
priv->scan_block = false;
- ret = mwifiex_add_bss_prio_tbl(priv);
-
- return ret;
+ return mwifiex_add_bss_prio_tbl(priv);
}
/*
@@ -300,8 +296,6 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
adapter->adhoc_awake_period = 0;
memset(&adapter->arp_filter, 0, sizeof(adapter->arp_filter));
adapter->arp_filter_size = 0;
-
- return;
}
/*
@@ -340,8 +334,6 @@ mwifiex_free_adapter(struct mwifiex_adapter *adapter)
adapter->if_ops.cleanup_if(adapter);
dev_kfree_skb_any(adapter->sleep_cfm);
-
- return;
}
/*
@@ -429,8 +421,6 @@ void mwifiex_free_lock_list(struct mwifiex_adapter *adapter)
list_del(&priv->rx_reorder_tbl_ptr);
}
}
-
- return;
}
/*
diff --git a/drivers/net/wireless/mwifiex/ioctl.h b/drivers/net/wireless/mwifiex/ioctl.h
index 703a6d12ebf3..5488e111fd2c 100644
--- a/drivers/net/wireless/mwifiex/ioctl.h
+++ b/drivers/net/wireless/mwifiex/ioctl.h
@@ -268,14 +268,13 @@ struct mwifiex_debug_info {
};
#define MWIFIEX_KEY_INDEX_UNICAST 0x40000000
-#define MWIFIEX_MAX_KEY_LENGTH 32
#define WAPI_RXPN_LEN 16
struct mwifiex_ds_encrypt_key {
u32 key_disable;
u32 key_index;
u32 key_len;
- u8 key_material[MWIFIEX_MAX_KEY_LENGTH];
+ u8 key_material[WLAN_MAX_KEY_LEN];
u8 mac_addr[ETH_ALEN];
u32 is_wapi_key;
u8 wapi_rxpn[WAPI_RXPN_LEN];
diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c
index 7a9e0b5962ed..23d2d0b9a527 100644
--- a/drivers/net/wireless/mwifiex/join.c
+++ b/drivers/net/wireless/mwifiex/join.c
@@ -590,11 +590,10 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,
* an association success (0) or failure (non-zero).
*/
int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp, void *wq_buf)
+ struct host_cmd_ds_command *resp)
{
+ struct mwifiex_adapter *adapter = priv->adapter;
int ret = 0;
- struct mwifiex_wait_queue *wait_queue =
- (struct mwifiex_wait_queue *) wq_buf;
struct ieee_types_assoc_rsp *assoc_rsp;
struct mwifiex_bssdescriptor *bss_desc;
u8 enable_data = true;
@@ -718,16 +717,11 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
done:
/* Need to indicate IOCTL complete */
- if (wait_queue) {
- if (ret) {
- if (assoc_rsp->status_code)
- wait_queue->status =
- le16_to_cpu(assoc_rsp->status_code);
- else
- wait_queue->status = MWIFIEX_ERROR_ASSOC_FAIL;
- } else {
- wait_queue->status = MWIFIEX_ERROR_NO_ERROR;
- }
+ if (adapter->curr_cmd->wait_q_enabled) {
+ if (ret)
+ adapter->cmd_wait_q.status = -1;
+ else
+ adapter->cmd_wait_q.status = 0;
}
return ret;
@@ -755,7 +749,7 @@ int
mwifiex_cmd_802_11_ad_hoc_start(struct mwifiex_private *priv,
struct host_cmd_ds_command *cmd, void *data_buf)
{
- int ret = 0, rsn_ie_len = 0;
+ int rsn_ie_len = 0;
struct mwifiex_adapter *adapter = priv->adapter;
struct host_cmd_ds_802_11_ad_hoc_start *adhoc_start =
&cmd->params.adhoc_start;
@@ -885,11 +879,9 @@ mwifiex_cmd_802_11_ad_hoc_start(struct mwifiex_private *priv,
mwifiex_get_active_data_rates(priv, adhoc_start->DataRate);
if ((adapter->adhoc_start_band & BAND_G) &&
(priv->curr_pkt_filter & HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON)) {
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_MAC_CONTROL,
- HostCmd_ACT_GEN_SET,
- 0, NULL, &priv->curr_pkt_filter);
-
- if (ret) {
+ if (mwifiex_send_cmd_async(priv, HostCmd_CMD_MAC_CONTROL,
+ HostCmd_ACT_GEN_SET, 0,
+ &priv->curr_pkt_filter)) {
dev_err(adapter->dev,
"ADHOC_S_CMD: G Protection config failed\n");
return -1;
@@ -1003,7 +995,7 @@ mwifiex_cmd_802_11_ad_hoc_start(struct mwifiex_private *priv,
IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
}
ht_info->ht_info.operation_mode =
- cpu_to_le16(NON_GREENFIELD_STAS);
+ cpu_to_le16(IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
ht_info->ht_info.basic_set[0] = 0xff;
pos += sizeof(struct mwifiex_ie_types_htinfo);
cmd_append_size +=
@@ -1045,7 +1037,7 @@ int
mwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv,
struct host_cmd_ds_command *cmd, void *data_buf)
{
- int ret = 0, rsn_ie_len = 0;
+ int rsn_ie_len = 0;
struct host_cmd_ds_802_11_ad_hoc_join *adhoc_join =
&cmd->params.adhoc_join;
struct mwifiex_bssdescriptor *bss_desc =
@@ -1066,10 +1058,9 @@ mwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv,
priv->
curr_pkt_filter | HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON;
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_MAC_CONTROL,
- HostCmd_ACT_GEN_SET, 0, NULL,
- &curr_pkt_filter);
- if (ret) {
+ if (mwifiex_send_cmd_async(priv, HostCmd_CMD_MAC_CONTROL,
+ HostCmd_ACT_GEN_SET, 0,
+ &curr_pkt_filter)) {
dev_err(priv->adapter->dev,
"ADHOC_J_CMD: G Protection config failed\n");
return -1;
@@ -1180,7 +1171,7 @@ mwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv,
adhoc_join->bss_descriptor.cap_info_bitmap = cpu_to_le16(tmp_cap);
- return ret;
+ return 0;
}
/*
@@ -1192,22 +1183,19 @@ mwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv,
* saves the beacon buffer.
*/
int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp, void *wq_buf)
+ struct host_cmd_ds_command *resp)
{
int ret = 0;
- struct mwifiex_wait_queue *wait_queue =
- (struct mwifiex_wait_queue *) wq_buf;
+ struct mwifiex_adapter *adapter = priv->adapter;
struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result;
struct mwifiex_bssdescriptor *bss_desc;
- u16 command = le16_to_cpu(resp->command);
- u16 result = le16_to_cpu(resp->result);
adhoc_result = &resp->params.adhoc_result;
bss_desc = priv->attempted_bss_desc;
/* Join result code 0 --> SUCCESS */
- if (result) {
+ if (le16_to_cpu(resp->result)) {
dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n");
if (priv->media_connected)
mwifiex_reset_connect_state(priv);
@@ -1222,7 +1210,7 @@ int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv,
/* Send a Media Connected event, according to the Spec */
priv->media_connected = true;
- if (command == HostCmd_CMD_802_11_AD_HOC_START) {
+ if (le16_to_cpu(resp->command) == HostCmd_CMD_802_11_AD_HOC_START) {
dev_dbg(priv->adapter->dev, "info: ADHOC_S_RESP %s\n",
bss_desc->ssid.ssid);
@@ -1264,11 +1252,11 @@ int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv,
done:
/* Need to indicate IOCTL complete */
- if (wait_queue) {
+ if (adapter->curr_cmd->wait_q_enabled) {
if (ret)
- wait_queue->status = MWIFIEX_ERROR_ASSOC_FAIL;
+ adapter->cmd_wait_q.status = -1;
else
- wait_queue->status = MWIFIEX_ERROR_NO_ERROR;
+ adapter->cmd_wait_q.status = 0;
}
@@ -1283,9 +1271,8 @@ done:
* command to firmware.
*/
int mwifiex_associate(struct mwifiex_private *priv,
- void *wait_queue, struct mwifiex_bssdescriptor *bss_desc)
+ struct mwifiex_bssdescriptor *bss_desc)
{
- int ret = 0;
u8 current_bssid[ETH_ALEN];
/* Return error if the adapter or table entry is not marked as infra */
@@ -1301,11 +1288,8 @@ int mwifiex_associate(struct mwifiex_private *priv,
retrieval */
priv->assoc_rsp_size = 0;
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_ASSOCIATE,
- HostCmd_ACT_GEN_SET, 0, wait_queue,
- bss_desc);
-
- return ret;
+ return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_ASSOCIATE,
+ HostCmd_ACT_GEN_SET, 0, bss_desc);
}
/*
@@ -1315,10 +1299,8 @@ int mwifiex_associate(struct mwifiex_private *priv,
*/
int
mwifiex_adhoc_start(struct mwifiex_private *priv,
- void *wait_queue, struct mwifiex_802_11_ssid *adhoc_ssid)
+ struct mwifiex_802_11_ssid *adhoc_ssid)
{
- int ret = 0;
-
dev_dbg(priv->adapter->dev, "info: Adhoc Channel = %d\n",
priv->adhoc_channel);
dev_dbg(priv->adapter->dev, "info: curr_bss_params.channel = %d\n",
@@ -1326,11 +1308,8 @@ mwifiex_adhoc_start(struct mwifiex_private *priv,
dev_dbg(priv->adapter->dev, "info: curr_bss_params.band = %d\n",
priv->curr_bss_params.band);
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_AD_HOC_START,
- HostCmd_ACT_GEN_SET, 0, wait_queue,
- adhoc_ssid);
-
- return ret;
+ return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_AD_HOC_START,
+ HostCmd_ACT_GEN_SET, 0, adhoc_ssid);
}
/*
@@ -1340,10 +1319,8 @@ mwifiex_adhoc_start(struct mwifiex_private *priv,
* if already not connected to the requested SSID.
*/
int mwifiex_adhoc_join(struct mwifiex_private *priv,
- void *wait_queue, struct mwifiex_bssdescriptor *bss_desc)
+ struct mwifiex_bssdescriptor *bss_desc)
{
- int ret = 0;
-
dev_dbg(priv->adapter->dev, "info: adhoc join: curr_bss ssid =%s\n",
priv->curr_bss_params.bss_descriptor.ssid.ssid);
dev_dbg(priv->adapter->dev, "info: adhoc join: curr_bss ssid_len =%u\n",
@@ -1369,20 +1346,15 @@ int mwifiex_adhoc_join(struct mwifiex_private *priv,
dev_dbg(priv->adapter->dev, "info: curr_bss_params.band = %c\n",
priv->curr_bss_params.band);
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_AD_HOC_JOIN,
- HostCmd_ACT_GEN_SET, 0, wait_queue,
- bss_desc);
-
- return ret;
+ return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_AD_HOC_JOIN,
+ HostCmd_ACT_GEN_SET, 0, bss_desc);
}
/*
* This function deauthenticates/disconnects from infra network by sending
* deauthentication request.
*/
-static int mwifiex_deauthenticate_infra(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u8 *mac)
+static int mwifiex_deauthenticate_infra(struct mwifiex_private *priv, u8 *mac)
{
u8 mac_address[ETH_ALEN];
int ret = 0;
@@ -1400,11 +1372,8 @@ static int mwifiex_deauthenticate_infra(struct mwifiex_private *priv,
bss_descriptor.mac_address, ETH_ALEN);
}
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_DEAUTHENTICATE,
- HostCmd_ACT_GEN_SET, 0, wait, &mac_address);
-
- if (!ret && wait)
- ret = -EINPROGRESS;
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_DEAUTHENTICATE,
+ HostCmd_ACT_GEN_SET, 0, &mac_address);
return ret;
}
@@ -1415,26 +1384,23 @@ static int mwifiex_deauthenticate_infra(struct mwifiex_private *priv,
* In case of infra made, it sends deauthentication request, and
* in case of ad-hoc mode, a stop network request is sent to the firmware.
*/
-int mwifiex_deauthenticate(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait, u8 *mac)
+int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac)
{
int ret = 0;
if (priv->media_connected) {
if (priv->bss_mode == NL80211_IFTYPE_STATION) {
- ret = mwifiex_deauthenticate_infra(priv, wait, mac);
+ ret = mwifiex_deauthenticate_infra(priv, mac);
} else if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
- ret = mwifiex_prepare_cmd(priv,
- HostCmd_CMD_802_11_AD_HOC_STOP,
- HostCmd_ACT_GEN_SET, 0, wait, NULL);
-
- if (!ret && wait)
- ret = -EINPROGRESS;
+ ret = mwifiex_send_cmd_sync(priv,
+ HostCmd_CMD_802_11_AD_HOC_STOP,
+ HostCmd_ACT_GEN_SET, 0, NULL);
}
}
return ret;
}
+EXPORT_SYMBOL_GPL(mwifiex_deauthenticate);
/*
* This function converts band to radio type used in channel TLV.
@@ -1442,21 +1408,15 @@ int mwifiex_deauthenticate(struct mwifiex_private *priv,
u8
mwifiex_band_to_radio_type(u8 band)
{
- u8 ret_radio_type;
-
switch (band) {
case BAND_A:
case BAND_AN:
case BAND_A | BAND_AN:
- ret_radio_type = HostCmd_SCAN_RADIO_TYPE_A;
- break;
+ return HostCmd_SCAN_RADIO_TYPE_A;
case BAND_B:
case BAND_G:
case BAND_B | BAND_G:
default:
- ret_radio_type = HostCmd_SCAN_RADIO_TYPE_BG;
- break;
+ return HostCmd_SCAN_RADIO_TYPE_BG;
}
-
- return ret_radio_type;
}
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index ed89ca41a902..c5971880e7b3 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -40,14 +40,10 @@ static char fw_name[32] = DEFAULT_FW_NAME;
/* Supported drv_mode table */
static struct mwifiex_drv_mode mwifiex_drv_mode_tbl[] = {
{
- /* drv_mode */
- .drv_mode = DRV_MODE_STA,
- /* intf number */
- .intf_num = ARRAY_SIZE(mwifiex_bss_sta),
- /* bss_attr */
- .bss_attr = mwifiex_bss_sta,
- }
- ,
+ .drv_mode = DRV_MODE_STA,
+ .intf_num = ARRAY_SIZE(mwifiex_bss_sta),
+ .bss_attr = mwifiex_bss_sta,
+ },
};
/*
@@ -66,14 +62,12 @@ static struct mwifiex_drv_mode mwifiex_drv_mode_tbl[] = {
* proper cleanup before exiting.
*/
static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
- struct mwifiex_device *mdevice, void **padapter)
+ struct mwifiex_drv_mode *drv_mode_ptr)
{
- int ret = 0;
- struct mwifiex_adapter *adapter = NULL;
- u8 i = 0;
+ struct mwifiex_adapter *adapter;
+ int i;
adapter = kzalloc(sizeof(struct mwifiex_adapter), GFP_KERNEL);
- /* Allocate memory for adapter structure */
if (!adapter)
return -1;
@@ -84,19 +78,17 @@ static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
memmove(&adapter->if_ops, if_ops, sizeof(struct mwifiex_if_ops));
/* card specific initialization has been deferred until now .. */
- ret = adapter->if_ops.init_if(adapter);
- if (ret)
+ if (adapter->if_ops.init_if(adapter))
goto error;
adapter->priv_num = 0;
- for (i = 0; i < MWIFIEX_MAX_BSS_NUM; i++) {
+ for (i = 0; i < drv_mode_ptr->intf_num; i++) {
adapter->priv[i] = NULL;
- if (!mdevice->bss_attr[i].active)
+ if (!drv_mode_ptr->bss_attr[i].active)
continue;
- /* For valid bss_attr,
- allocate memory for private structure */
+ /* Allocate memory for private structure */
adapter->priv[i] = kzalloc(sizeof(struct mwifiex_private),
GFP_KERNEL);
if (!adapter->priv[i]) {
@@ -106,26 +98,26 @@ static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
}
adapter->priv_num++;
- memset(adapter->priv[i], 0,
- sizeof(struct mwifiex_private));
adapter->priv[i]->adapter = adapter;
/* Save bss_type, frame_type & bss_priority */
- adapter->priv[i]->bss_type = (u8) mdevice->bss_attr[i].bss_type;
+ adapter->priv[i]->bss_type = drv_mode_ptr->bss_attr[i].bss_type;
adapter->priv[i]->frame_type =
- (u8) mdevice->bss_attr[i].frame_type;
+ drv_mode_ptr->bss_attr[i].frame_type;
adapter->priv[i]->bss_priority =
- (u8) mdevice->bss_attr[i].bss_priority;
- if (mdevice->bss_attr[i].bss_type == MWIFIEX_BSS_TYPE_STA)
+ drv_mode_ptr->bss_attr[i].bss_priority;
+
+ if (drv_mode_ptr->bss_attr[i].bss_type == MWIFIEX_BSS_TYPE_STA)
adapter->priv[i]->bss_role = MWIFIEX_BSS_ROLE_STA;
- else if (mdevice->bss_attr[i].bss_type == MWIFIEX_BSS_TYPE_UAP)
+ else if (drv_mode_ptr->bss_attr[i].bss_type ==
+ MWIFIEX_BSS_TYPE_UAP)
adapter->priv[i]->bss_role = MWIFIEX_BSS_ROLE_UAP;
/* Save bss_index & bss_num */
adapter->priv[i]->bss_index = i;
- adapter->priv[i]->bss_num = mdevice->bss_attr[i].bss_num;
+ adapter->priv[i]->bss_num = drv_mode_ptr->bss_attr[i].bss_num;
}
+ adapter->drv_mode = drv_mode_ptr;
- /* Initialize lock variables */
if (mwifiex_init_lock_list(adapter))
goto error;
@@ -133,16 +125,13 @@ static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
adapter->cmd_timer.function = mwifiex_cmd_timeout_func;
adapter->cmd_timer.data = (unsigned long) adapter;
- /* Return pointer of struct mwifiex_adapter */
- *padapter = adapter;
return 0;
error:
dev_dbg(adapter->dev, "info: leave mwifiex_register with error\n");
- /* Free lock variables */
mwifiex_free_lock_list(adapter);
- for (i = 0; i < MWIFIEX_MAX_BSS_NUM; i++)
+ for (i = 0; i < drv_mode_ptr->intf_num; i++)
kfree(adapter->priv[i]);
kfree(adapter);
@@ -337,10 +326,9 @@ exit_main_proc:
* and initializing the private structures.
*/
static int
-mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops, void **pmwifiex)
+mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops)
{
int i;
- struct mwifiex_device device;
struct mwifiex_drv_mode *drv_mode_ptr;
/* find mwifiex_drv_mode entry from mwifiex_drv_mode_tbl */
@@ -357,20 +345,7 @@ mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops, void **pmwifiex)
return -1;
}
- memset(&device, 0, sizeof(struct mwifiex_device));
-
- for (i = 0; i < drv_mode_ptr->intf_num; i++) {
- device.bss_attr[i].bss_type =
- drv_mode_ptr->bss_attr[i].bss_type;
- device.bss_attr[i].frame_type =
- drv_mode_ptr->bss_attr[i].frame_type;
- device.bss_attr[i].active = drv_mode_ptr->bss_attr[i].active;
- device.bss_attr[i].bss_priority =
- drv_mode_ptr->bss_attr[i].bss_priority;
- device.bss_attr[i].bss_num = drv_mode_ptr->bss_attr[i].bss_num;
- }
-
- if (mwifiex_register(card, if_ops, &device, pmwifiex))
+ if (mwifiex_register(card, if_ops, drv_mode_ptr))
return -1;
return 0;
@@ -505,7 +480,6 @@ mwifiex_fill_buffer(struct sk_buff *skb)
*/
do_gettimeofday(&tv);
skb->tstamp = timeval_to_ktime(tv);
- return;
}
/*
@@ -597,16 +571,23 @@ mwifiex_set_mac_address(struct net_device *dev, void *addr)
{
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
struct sockaddr *hw_addr = (struct sockaddr *) addr;
+ int ret = 0;
memcpy(priv->curr_addr, hw_addr->sa_data, ETH_ALEN);
- if (mwifiex_request_set_mac_address(priv)) {
- dev_err(priv->adapter->dev, "set MAC address failed\n");
- return -EFAULT;
- }
+ /* Send request to firmware */
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_MAC_ADDRESS,
+ HostCmd_ACT_GEN_SET, 0, NULL);
+
+ if (!ret)
+ memcpy(priv->netdev->dev_addr, priv->curr_addr, ETH_ALEN);
+ else
+ dev_err(priv->adapter->dev, "set mac address failed: ret=%d"
+ "\n", ret);
+
memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN);
- return 0;
+ return ret;
}
/*
@@ -615,7 +596,20 @@ mwifiex_set_mac_address(struct net_device *dev, void *addr)
static void mwifiex_set_multicast_list(struct net_device *dev)
{
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
- mwifiex_request_set_multicast_list(priv, dev);
+ struct mwifiex_multicast_list mcast_list;
+
+ if (dev->flags & IFF_PROMISC) {
+ mcast_list.mode = MWIFIEX_PROMISC_MODE;
+ } else if (dev->flags & IFF_ALLMULTI ||
+ netdev_mc_count(dev) > MWIFIEX_MAX_MULTICAST_LIST_SIZE) {
+ mcast_list.mode = MWIFIEX_ALL_MULTI_MODE;
+ } else {
+ mcast_list.mode = MWIFIEX_MULTICAST_MODE;
+ if (netdev_mc_count(dev))
+ mcast_list.num_multicast_addr =
+ mwifiex_copy_mcast_addr(&mcast_list, dev);
+ }
+ mwifiex_request_set_multicast_list(priv, &mcast_list);
}
/*
@@ -677,9 +671,6 @@ mwifiex_init_priv_params(struct mwifiex_private *priv, struct net_device *dev)
{
dev->netdev_ops = &mwifiex_netdev_ops;
/* Initialize private structure */
- init_waitqueue_head(&priv->ioctl_wait_q);
- init_waitqueue_head(&priv->cmd_wait_q);
- init_waitqueue_head(&priv->w_stats_wait_q);
priv->current_key_index = 0;
priv->media_connected = false;
memset(&priv->nick_name, 0, sizeof(priv->nick_name));
@@ -803,37 +794,9 @@ mwifiex_remove_interface(struct mwifiex_adapter *adapter, u8 bss_index)
wiphy_unregister(priv->wdev->wiphy);
wiphy_free(priv->wdev->wiphy);
kfree(priv->wdev);
-
- return;
}
/*
- * Sends IOCTL request to shutdown firmware.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int mwifiex_shutdown_fw(struct mwifiex_private *priv, u8 wait_option)
-{
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
-
- /* Allocate an IOCTL request buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- status = mwifiex_misc_ioctl_init_shutdown(priv->adapter, wait,
- MWIFIEX_FUNC_SHUTDOWN);
-
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
-
- kfree(wait);
- return status;
-}
-EXPORT_SYMBOL_GPL(mwifiex_shutdown_fw);
-
-/*
* This function check if command is pending.
*/
int is_command_pending(struct mwifiex_adapter *adapter)
@@ -905,30 +868,30 @@ int
mwifiex_add_card(void *card, struct semaphore *sem,
struct mwifiex_if_ops *if_ops)
{
- int status = 0;
int i;
- struct mwifiex_adapter *adapter = NULL;
- struct mwifiex_drv_mode *drv_mode_info = &mwifiex_drv_mode_tbl[0];
+ struct mwifiex_adapter *adapter;
if (down_interruptible(sem))
goto exit_sem_err;
- if (mwifiex_init_sw(card, if_ops, (void **) &adapter)) {
+ if (mwifiex_init_sw(card, if_ops)) {
pr_err("%s: software init failed\n", __func__);
goto err_init_sw;
}
- adapter->drv_mode = drv_mode_info;
+ adapter = g_adapter;
adapter->hw_status = MWIFIEX_HW_STATUS_INITIALIZING;
- /* PnP and power profile */
adapter->surprise_removed = false;
init_waitqueue_head(&adapter->init_wait_q);
adapter->is_suspended = false;
adapter->hs_activated = false;
init_waitqueue_head(&adapter->hs_activate_wait_q);
+ adapter->cmd_wait_q_required = false;
+ init_waitqueue_head(&adapter->cmd_wait_q.wait);
+ adapter->cmd_wait_q.condition = false;
+ adapter->cmd_wait_q.status = 0;
- /* Create workqueue */
adapter->workqueue = create_workqueue("MWIFIEX_WORK_QUEUE");
if (!adapter->workqueue)
goto err_kmalloc;
@@ -942,21 +905,18 @@ mwifiex_add_card(void *card, struct semaphore *sem,
goto err_registerdev;
}
- /* Init FW and HW */
if (mwifiex_init_hw_fw(adapter)) {
pr_err("%s: firmware init failed\n", __func__);
goto err_init_fw;
}
+
/* Add interfaces */
- for (i = 0; i < drv_mode_info->intf_num; i++) {
+ for (i = 0; i < adapter->drv_mode->intf_num; i++) {
if (!mwifiex_add_interface(adapter, i,
adapter->drv_mode->bss_attr[i].bss_type)) {
- status = -1;
- break;
+ goto err_add_intf;
}
}
- if (status)
- goto err_add_intf;
up(sem);
@@ -966,7 +926,6 @@ err_add_intf:
for (i = 0; i < adapter->priv_num; i++)
mwifiex_remove_interface(adapter, i);
err_init_fw:
- /* Unregister device */
pr_debug("info: %s: unregister device\n", __func__);
adapter->if_ops.unregister_dev(adapter);
err_registerdev:
@@ -977,8 +936,8 @@ err_kmalloc:
(adapter->hw_status == MWIFIEX_HW_STATUS_READY)) {
pr_debug("info: %s: shutdown mwifiex\n", __func__);
adapter->init_wait_q_woken = false;
- status = mwifiex_shutdown_drv(adapter);
- if (status == -EINPROGRESS)
+
+ if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
wait_event_interruptible(adapter->init_wait_q,
adapter->init_wait_q_woken);
}
@@ -1007,7 +966,6 @@ EXPORT_SYMBOL_GPL(mwifiex_add_card);
int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
{
struct mwifiex_private *priv = NULL;
- int status;
int i;
if (down_interruptible(sem))
@@ -1031,19 +989,19 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
dev_dbg(adapter->dev, "cmd: calling mwifiex_shutdown_drv...\n");
adapter->init_wait_q_woken = false;
- status = mwifiex_shutdown_drv(adapter);
- if (status == -EINPROGRESS)
+
+ if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
wait_event_interruptible(adapter->init_wait_q,
adapter->init_wait_q_woken);
dev_dbg(adapter->dev, "cmd: mwifiex_shutdown_drv done\n");
if (atomic_read(&adapter->rx_pending) ||
atomic_read(&adapter->tx_pending) ||
- atomic_read(&adapter->ioctl_pending)) {
+ atomic_read(&adapter->cmd_pending)) {
dev_err(adapter->dev, "rx_pending=%d, tx_pending=%d, "
- "ioctl_pending=%d\n",
+ "cmd_pending=%d\n",
atomic_read(&adapter->rx_pending),
atomic_read(&adapter->tx_pending),
- atomic_read(&adapter->ioctl_pending));
+ atomic_read(&adapter->cmd_pending));
}
/* Remove interface */
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index 43ff149de9db..1b503038270e 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -42,11 +42,8 @@ extern const char driver_version[];
extern struct mwifiex_adapter *g_adapter;
enum {
- MWIFIEX_NO_WAIT,
- MWIFIEX_IOCTL_WAIT,
- MWIFIEX_CMD_WAIT,
- MWIFIEX_PROC_WAIT,
- MWIFIEX_WSTATS_WAIT
+ MWIFIEX_ASYNC_CMD,
+ MWIFIEX_SYNC_CMD
};
#define DRV_MODE_STA 0x1
@@ -468,10 +465,6 @@ struct mwifiex_private {
u32 curr_bcn_size;
/* spin lock for beacon buffer */
spinlock_t curr_bcn_buf_lock;
- u16 ioctl_wait_q_woken;
- wait_queue_head_t ioctl_wait_q;
- u16 cmd_wait_q_woken;
- wait_queue_head_t cmd_wait_q;
struct wireless_dev *wdev;
struct mwifiex_chan_freq_power cfp;
char version_str[128];
@@ -480,8 +473,6 @@ struct mwifiex_private {
#endif
u8 nick_name[16];
struct iw_statistics w_stats;
- u16 w_stats_wait_q_woken;
- wait_queue_head_t w_stats_wait_q;
u16 current_key_index;
struct semaphore async_sem;
u8 scan_pending_on_block;
@@ -552,7 +543,7 @@ struct cmd_ctrl_node {
struct sk_buff *cmd_skb;
struct sk_buff *resp_skb;
void *data_buf;
- void *wq_buf;
+ u32 wait_q_enabled;
struct sk_buff *skb;
};
@@ -590,7 +581,7 @@ struct mwifiex_adapter {
struct mwifiex_if_ops if_ops;
atomic_t rx_pending;
atomic_t tx_pending;
- atomic_t ioctl_pending;
+ atomic_t cmd_pending;
struct workqueue_struct *workqueue;
struct work_struct main_work;
struct mwifiex_bss_prio_tbl bss_prio_tbl[MWIFIEX_MAX_BSS_NUM];
@@ -684,6 +675,8 @@ struct mwifiex_adapter {
struct mwifiex_dbg dbg;
u8 arp_filter[ARP_FILTER_MAX_BUF_SIZE];
u32 arp_filter_size;
+ u16 cmd_wait_q_required;
+ struct mwifiex_wait_queue cmd_wait_q;
};
int mwifiex_init_lock_list(struct mwifiex_adapter *adapter);
@@ -707,29 +700,23 @@ int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb);
int mwifiex_process_event(struct mwifiex_adapter *adapter);
-int mwifiex_ioctl_complete(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *ioctl_wq,
- int status);
+int mwifiex_complete_cmd(struct mwifiex_adapter *adapter);
-int mwifiex_prepare_cmd(struct mwifiex_private *priv,
- uint16_t cmd_no,
- u16 cmd_action,
- u32 cmd_oid,
- void *wait_queue, void *data_buf);
+int mwifiex_send_cmd_async(struct mwifiex_private *priv, uint16_t cmd_no,
+ u16 cmd_action, u32 cmd_oid, void *data_buf);
+
+int mwifiex_send_cmd_sync(struct mwifiex_private *priv, uint16_t cmd_no,
+ u16 cmd_action, u32 cmd_oid, void *data_buf);
void mwifiex_cmd_timeout_func(unsigned long function_context);
-int mwifiex_misc_ioctl_init_shutdown(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait_queue,
- u32 func_init_shutdown);
int mwifiex_get_debug_info(struct mwifiex_private *,
struct mwifiex_debug_info *);
int mwifiex_alloc_cmd_buffer(struct mwifiex_adapter *adapter);
int mwifiex_free_cmd_buffer(struct mwifiex_adapter *adapter);
void mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter);
-void mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *ioctl_wq);
+void mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter);
void mwifiex_insert_cmd_to_free_q(struct mwifiex_adapter *adapter,
struct cmd_ctrl_node *cmd_node);
@@ -772,24 +759,20 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *, uint16_t cmd_no,
u16 cmd_action, u32 cmd_oid,
void *data_buf, void *cmd_buf);
int mwifiex_process_sta_cmdresp(struct mwifiex_private *, u16 cmdresp_no,
- void *cmd_buf, void *ioctl);
+ void *cmd_buf);
int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *,
struct sk_buff *skb);
int mwifiex_process_sta_event(struct mwifiex_private *);
void *mwifiex_process_sta_txpd(struct mwifiex_private *, struct sk_buff *skb);
int mwifiex_sta_init_cmd(struct mwifiex_private *, u8 first_sta);
-int mwifiex_scan_networks(struct mwifiex_private *priv, void *wait_queue,
- u16 action,
- const struct mwifiex_user_scan_cfg
- *user_scan_in, struct mwifiex_scan_resp *);
-int mwifiex_cmd_802_11_scan(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+int mwifiex_scan_networks(struct mwifiex_private *priv,
+ const struct mwifiex_user_scan_cfg *user_scan_in);
+int mwifiex_cmd_802_11_scan(struct host_cmd_ds_command *cmd,
void *data_buf);
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,
- void *wait_queue);
+ 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);
@@ -799,23 +782,20 @@ 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, void *wait_queue,
+int mwifiex_associate(struct mwifiex_private *priv,
struct mwifiex_bssdescriptor *bss_desc);
int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,
struct host_cmd_ds_command
*cmd, void *data_buf);
int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp,
- void *wait_queue);
+ 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,
- struct mwifiex_wait_queue *wait_queue,
- u8 *mac);
-int mwifiex_adhoc_start(struct mwifiex_private *priv, void *wait_queue,
+int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac);
+int mwifiex_adhoc_start(struct mwifiex_private *priv,
struct mwifiex_802_11_ssid *adhoc_ssid);
-int mwifiex_adhoc_join(struct mwifiex_private *priv, void *wait_queue,
+int mwifiex_adhoc_join(struct mwifiex_private *priv,
struct mwifiex_bssdescriptor *bss_desc);
int mwifiex_cmd_802_11_ad_hoc_start(struct mwifiex_private *priv,
struct host_cmd_ds_command *cmd,
@@ -824,11 +804,8 @@ int mwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv,
struct host_cmd_ds_command *cmd,
void *data_buf);
int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp,
- void *wait_queue);
-int mwifiex_cmd_802_11_bg_scan_query(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
- void *data_buf);
+ struct host_cmd_ds_command *resp);
+int mwifiex_cmd_802_11_bg_scan_query(struct host_cmd_ds_command *cmd);
struct mwifiex_chan_freq_power *
mwifiex_get_cfp_by_band_and_channel_from_cfg80211(
struct mwifiex_private *priv,
@@ -836,20 +813,16 @@ struct mwifiex_chan_freq_power *
struct mwifiex_chan_freq_power *mwifiex_get_cfp_by_band_and_freq_from_cfg80211(
struct mwifiex_private *priv,
u8 band, u32 freq);
-u32 mwifiex_index_to_data_rate(struct mwifiex_adapter *adapter, u8 index,
- u8 ht_info);
+u32 mwifiex_index_to_data_rate(u8 index, u8 ht_info);
u32 mwifiex_find_freq_from_band_chan(u8, u8);
int mwifiex_cmd_append_vsie_tlv(struct mwifiex_private *priv, u16 vsie_mask,
u8 **buffer);
-u32 mwifiex_index_to_data_rate(struct mwifiex_adapter *adapter, u8 index,
- u8 ht_info);
u32 mwifiex_get_active_data_rates(struct mwifiex_private *priv,
u8 *rates);
u32 mwifiex_get_supported_rates(struct mwifiex_private *priv, u8 *rates);
-u8 mwifiex_data_rate_to_index(struct mwifiex_adapter *adapter, u32 rate);
+u8 mwifiex_data_rate_to_index(u32 rate);
u8 mwifiex_is_rate_auto(struct mwifiex_private *priv);
-int mwifiex_get_rate_index(struct mwifiex_adapter *adapter,
- u16 *rateBitmap, int size);
+int mwifiex_get_rate_index(u16 *rateBitmap, int size);
extern u16 region_code_index[MWIFIEX_MAX_REGION_CODE];
void mwifiex_save_curr_bcn(struct mwifiex_private *priv);
void mwifiex_free_curr_bcn(struct mwifiex_private *priv);
@@ -899,7 +872,7 @@ mwifiex_copy_rates(u8 *dest, u32 pos, u8 *src, int len)
*/
static inline struct mwifiex_private *
mwifiex_get_priv_by_id(struct mwifiex_adapter *adapter,
- u32 bss_num, u32 bss_type)
+ u8 bss_num, u8 bss_type)
{
int i;
@@ -943,52 +916,34 @@ mwifiex_netdev_get_priv(struct net_device *dev)
return (struct mwifiex_private *) (*(unsigned long *) netdev_priv(dev));
}
-struct mwifiex_wait_queue *mwifiex_alloc_fill_wait_queue(
- struct mwifiex_private *,
- u8 wait_option);
struct mwifiex_private *mwifiex_bss_index_to_priv(struct mwifiex_adapter
*adapter, u8 bss_index);
-int mwifiex_shutdown_fw(struct mwifiex_private *, u8);
-
+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_remove_card(struct mwifiex_adapter *, struct semaphore *);
void mwifiex_get_version(struct mwifiex_adapter *adapter, char *version,
int maxlen);
-int mwifiex_request_set_mac_address(struct mwifiex_private *priv);
-void mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
- struct net_device *dev);
-int mwifiex_request_ioctl(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *req,
- int, u8 wait_option);
-int mwifiex_disconnect(struct mwifiex_private *, u8, u8 *);
+int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
+ struct mwifiex_multicast_list *mcast_list);
+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,
- u8 wait_option,
struct mwifiex_ssid_bssid *ssid_bssid);
int mwifiex_set_hs_params(struct mwifiex_private *priv,
- u16 action, u8 wait_option,
+ u16 action, int cmd_type,
struct mwifiex_ds_hs_cfg *hscfg);
-int mwifiex_cancel_hs(struct mwifiex_private *priv, u8 wait_option);
+int mwifiex_cancel_hs(struct mwifiex_private *priv, int cmd_type);
int mwifiex_enable_hs(struct mwifiex_adapter *adapter);
-void mwifiex_process_ioctl_resp(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *req);
-u32 mwifiex_get_mode(struct mwifiex_private *priv, u8 wait_option);
int mwifiex_get_signal_info(struct mwifiex_private *priv,
- u8 wait_option,
struct mwifiex_ds_get_signal *signal);
int mwifiex_drv_get_data_rate(struct mwifiex_private *priv,
struct mwifiex_rate_cfg *rate);
-int mwifiex_get_channel_list(struct mwifiex_private *priv,
- u8 wait_option,
- struct mwifiex_chan_list *chanlist);
-int mwifiex_get_scan_table(struct mwifiex_private *priv,
- u8 wait_option,
- struct mwifiex_scan_resp *scanresp);
-int mwifiex_enable_wep_key(struct mwifiex_private *priv, u8 wait_option);
-int mwifiex_find_best_bss(struct mwifiex_private *priv, u8 wait_option,
+int mwifiex_find_best_bss(struct mwifiex_private *priv,
struct mwifiex_ssid_bssid *ssid_bssid);
int mwifiex_request_scan(struct mwifiex_private *priv,
- u8 wait_option,
struct mwifiex_802_11_ssid *req_ssid);
int mwifiex_set_user_scan_ioctl(struct mwifiex_private *priv,
struct mwifiex_user_scan_cfg *scan_req);
@@ -1024,27 +979,22 @@ int mwifiex_set_tx_rate_cfg(struct mwifiex_private *priv, int tx_rate_index);
int mwifiex_get_tx_rate_cfg(struct mwifiex_private *priv, int *tx_rate_index);
-int mwifiex_drv_set_power(struct mwifiex_private *priv, bool power_on);
+int mwifiex_drv_set_power(struct mwifiex_private *priv, u32 *ps_mode);
int mwifiex_drv_get_driver_version(struct mwifiex_adapter *adapter,
char *version, int max_len);
-int mwifiex_set_tx_power(struct mwifiex_private *priv, int type, int dbm);
+int mwifiex_set_tx_power(struct mwifiex_private *priv,
+ struct mwifiex_power_cfg *power_cfg);
int mwifiex_main_process(struct mwifiex_adapter *);
-int mwifiex_bss_ioctl_channel(struct mwifiex_private *,
- u16 action,
- struct mwifiex_chan_freq_power *cfp);
+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_wait_queue *,
struct mwifiex_ssid_bssid *);
-int mwifiex_radio_ioctl_band_cfg(struct mwifiex_private *,
- u16 action,
- struct mwifiex_ds_band_cfg *);
-int mwifiex_snmp_mib_ioctl(struct mwifiex_private *,
- struct mwifiex_wait_queue *,
- u32 cmd_oid, u16 action, u32 *value);
+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 *);
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c
index 6bb52d0e6cfa..68d905d58606 100644
--- a/drivers/net/wireless/mwifiex/scan.c
+++ b/drivers/net/wireless/mwifiex/scan.c
@@ -178,35 +178,27 @@ mwifiex_ssid_cmp(struct mwifiex_802_11_ssid *ssid1,
* with requisite parameters and calls the IOCTL handler.
*/
int mwifiex_find_best_bss(struct mwifiex_private *priv,
- u8 wait_option, struct mwifiex_ssid_bssid *ssid_bssid)
+ struct mwifiex_ssid_bssid *ssid_bssid)
{
- struct mwifiex_wait_queue *wait = NULL;
struct mwifiex_ssid_bssid tmp_ssid_bssid;
- int ret = 0;
u8 *mac = NULL;
if (!ssid_bssid)
return -1;
- /* Allocate wait request buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
memcpy(&tmp_ssid_bssid, ssid_bssid,
sizeof(struct mwifiex_ssid_bssid));
- ret = mwifiex_bss_ioctl_find_bss(priv, wait, &tmp_ssid_bssid);
- if (!ret) {
+ if (!mwifiex_bss_ioctl_find_bss(priv, &tmp_ssid_bssid)) {
memcpy(ssid_bssid, &tmp_ssid_bssid,
sizeof(struct mwifiex_ssid_bssid));
mac = (u8 *) &ssid_bssid->bssid;
dev_dbg(priv->adapter->dev, "cmd: found network: ssid=%s,"
" %pM\n", ssid_bssid->ssid.ssid, mac);
+ return 0;
}
- kfree(wait);
- return ret;
+ return -1;
}
/*
@@ -221,22 +213,14 @@ int mwifiex_find_best_bss(struct mwifiex_private *priv,
int mwifiex_set_user_scan_ioctl(struct mwifiex_private *priv,
struct mwifiex_user_scan_cfg *scan_req)
{
- struct mwifiex_wait_queue *wait = NULL;
int status = 0;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
- /* Allocate an IOCTL request buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
+ priv->adapter->cmd_wait_q.condition = false;
- status = mwifiex_scan_networks(priv, wait, HostCmd_ACT_GEN_SET,
- scan_req, NULL);
+ status = mwifiex_scan_networks(priv, scan_req);
+ if (!status)
+ status = mwifiex_wait_queue_complete(priv->adapter);
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
-
- if (wait && (status != -EINPROGRESS))
- kfree(wait);
return status;
}
@@ -674,7 +658,7 @@ mwifiex_scan_create_channel_list(struct mwifiex_private *priv,
* along with the other TLVs, to the firmware.
*/
static int
-mwifiex_scan_channel_list(struct mwifiex_private *priv, void *wait_buf,
+mwifiex_scan_channel_list(struct mwifiex_private *priv,
u32 max_chan_per_scan, u8 filtered_scan,
struct mwifiex_scan_cmd_config *scan_cfg_out,
struct mwifiex_ie_types_chan_list_param_set
@@ -808,9 +792,9 @@ mwifiex_scan_channel_list(struct mwifiex_private *priv, void *wait_buf,
/* Send the scan command to the firmware with the specified
cfg */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_SCAN,
- HostCmd_ACT_GEN_SET,
- 0, wait_buf, scan_cfg_out);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_802_11_SCAN,
+ HostCmd_ACT_GEN_SET, 0,
+ scan_cfg_out);
if (ret)
break;
}
@@ -2076,19 +2060,13 @@ mwifiex_process_scan_results(struct mwifiex_private *priv)
static u8
mwifiex_radio_type_to_band(u8 radio_type)
{
- u8 ret_band;
-
switch (radio_type) {
case HostCmd_SCAN_RADIO_TYPE_A:
- ret_band = BAND_A;
- break;
+ return BAND_A;
case HostCmd_SCAN_RADIO_TYPE_BG:
default:
- ret_band = BAND_G;
- break;
+ return BAND_G;
}
-
- return ret_band;
}
/*
@@ -2241,8 +2219,7 @@ static int
mwifiex_scan_delete_ssid_table_entry(struct mwifiex_private *priv,
struct mwifiex_802_11_ssid *del_ssid)
{
- int ret = -1;
- s32 table_idx;
+ s32 table_idx = -1;
dev_dbg(priv->adapter->dev, "info: scan: delete ssid entry: %-32s\n",
del_ssid->ssid);
@@ -2255,11 +2232,10 @@ mwifiex_scan_delete_ssid_table_entry(struct mwifiex_private *priv,
dev_dbg(priv->adapter->dev,
"info: Scan: Delete SSID Entry: Found Idx = %d\n",
table_idx);
- ret = 0;
mwifiex_scan_delete_table_entry(priv, table_idx);
}
- return ret;
+ return table_idx == -1 ? -1 : 0;
}
/*
@@ -2271,9 +2247,7 @@ mwifiex_scan_delete_ssid_table_entry(struct mwifiex_private *priv,
* update the internal driver scan table.
*/
int mwifiex_scan_networks(struct mwifiex_private *priv,
- void *wait_buf, u16 action,
- const struct mwifiex_user_scan_cfg *user_scan_in,
- struct mwifiex_scan_resp *scan_resp)
+ const struct mwifiex_user_scan_cfg *user_scan_in)
{
int ret = 0;
struct mwifiex_adapter *adapter = priv->adapter;
@@ -2288,18 +2262,7 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
u8 max_chan_per_scan;
unsigned long flags;
- if (action == HostCmd_ACT_GEN_GET) {
- if (scan_resp) {
- scan_resp->scan_table = (u8 *) adapter->scan_table;
- scan_resp->num_in_scan_table =
- adapter->num_in_scan_table;
- } else {
- ret = -1;
- }
- return ret;
- }
-
- if (adapter->scan_processing && action == HostCmd_ACT_GEN_SET) {
+ if (adapter->scan_processing) {
dev_dbg(adapter->dev, "cmd: Scan already in process...\n");
return ret;
}
@@ -2308,7 +2271,7 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
adapter->scan_processing = true;
spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
- if (priv->scan_block && action == HostCmd_ACT_GEN_SET) {
+ if (priv->scan_block) {
dev_dbg(adapter->dev,
"cmd: Scan is blocked during association...\n");
return ret;
@@ -2348,9 +2311,9 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
adapter->bcn_buf_end = adapter->bcn_buf;
}
- ret = mwifiex_scan_channel_list(priv, wait_buf, max_chan_per_scan,
- filtered_scan, &scan_cfg_out->config,
- chan_list_out, scan_chan_list);
+ ret = mwifiex_scan_channel_list(priv, max_chan_per_scan, filtered_scan,
+ &scan_cfg_out->config, chan_list_out,
+ scan_chan_list);
/* Get scan command from scan_pending_q and put to cmd_pending_q */
if (!ret) {
@@ -2367,7 +2330,6 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
flags);
}
- ret = -EINPROGRESS;
} else {
spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
adapter->scan_processing = true;
@@ -2393,8 +2355,7 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
* - Setting command ID, and proper size
* - Ensuring correct endian-ness
*/
-int mwifiex_cmd_802_11_scan(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd, void *data_buf)
+int mwifiex_cmd_802_11_scan(struct host_cmd_ds_command *cmd, void *data_buf)
{
struct host_cmd_ds_802_11_scan *scan_cmd = &cmd->params.scan;
struct mwifiex_scan_cmd_config *scan_cfg;
@@ -2437,11 +2398,10 @@ int mwifiex_cmd_802_11_scan(struct mwifiex_private *priv,
* .-------------------------------------------------------------.
*/
int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp, void *wq_buf)
+ struct host_cmd_ds_command *resp)
{
int ret = 0;
struct mwifiex_adapter *adapter = priv->adapter;
- struct mwifiex_wait_queue *wait_queue = NULL;
struct cmd_ctrl_node *cmd_node = NULL;
struct host_cmd_ds_802_11_scan_rsp *scan_rsp = NULL;
struct mwifiex_bssdescriptor *bss_new_entry = NULL;
@@ -2653,13 +2613,9 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
mwifiex_process_scan_results(priv);
/* Need to indicate IOCTL complete */
- wait_queue = (struct mwifiex_wait_queue *) wq_buf;
- if (wait_queue) {
- wait_queue->status = MWIFIEX_ERROR_NO_ERROR;
-
- /* Indicate ioctl complete */
- mwifiex_ioctl_complete(adapter,
- (struct mwifiex_wait_queue *) wait_queue, 0);
+ if (adapter->curr_cmd->wait_q_enabled) {
+ adapter->cmd_wait_q.status = 0;
+ mwifiex_complete_cmd(adapter);
}
if (priv->report_scan_result)
priv->report_scan_result = false;
@@ -2692,9 +2648,7 @@ done:
* - Setting background scan flush parameter
* - Ensuring correct endian-ness
*/
-int mwifiex_cmd_802_11_bg_scan_query(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
- void *data_buf)
+int mwifiex_cmd_802_11_bg_scan_query(struct host_cmd_ds_command *cmd)
{
struct host_cmd_ds_802_11_bg_scan_query *bg_query =
&cmd->params.bg_scan_query;
@@ -2853,6 +2807,7 @@ mwifiex_queue_scan_cmd(struct mwifiex_private *priv,
struct mwifiex_adapter *adapter = priv->adapter;
unsigned long flags;
+ cmd_node->wait_q_enabled = true;
spin_lock_irqsave(&adapter->scan_pending_q_lock, flags);
list_add_tail(&cmd_node->list, &adapter->scan_pending_q);
spin_unlock_irqrestore(&adapter->scan_pending_q_lock, flags);
@@ -2899,9 +2854,7 @@ int mwifiex_find_best_network(struct mwifiex_private *priv,
* firmware, filtered on a specific SSID.
*/
static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv,
- void *wait_buf, u16 action,
- struct mwifiex_802_11_ssid *req_ssid,
- struct mwifiex_scan_resp *scan_resp)
+ struct mwifiex_802_11_ssid *req_ssid)
{
struct mwifiex_adapter *adapter = priv->adapter;
int ret = 0;
@@ -2910,24 +2863,12 @@ static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv,
if (!req_ssid)
return -1;
- if (action == HostCmd_ACT_GEN_GET) {
- if (scan_resp) {
- scan_resp->scan_table =
- (u8 *) &priv->curr_bss_params.bss_descriptor;
- scan_resp->num_in_scan_table =
- adapter->num_in_scan_table;
- } else {
- ret = -1;
- }
- return ret;
- }
-
- if (adapter->scan_processing && action == HostCmd_ACT_GEN_SET) {
+ if (adapter->scan_processing) {
dev_dbg(adapter->dev, "cmd: Scan already in process...\n");
return ret;
}
- if (priv->scan_block && action == HostCmd_ACT_GEN_SET) {
+ if (priv->scan_block) {
dev_dbg(adapter->dev,
"cmd: Scan is blocked during association...\n");
return ret;
@@ -2945,7 +2886,7 @@ static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv,
req_ssid->ssid_len);
scan_cfg->keep_previous_scan = true;
- ret = mwifiex_scan_networks(priv, wait_buf, action, scan_cfg, NULL);
+ ret = mwifiex_scan_networks(priv, scan_cfg);
kfree(scan_cfg);
return ret;
@@ -2960,12 +2901,10 @@ static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv,
* Scan command can be issued for both normal scan and specific SSID
* scan, depending upon whether an SSID is provided or not.
*/
-int mwifiex_request_scan(struct mwifiex_private *priv, u8 wait_option,
+int mwifiex_request_scan(struct mwifiex_private *priv,
struct mwifiex_802_11_ssid *req_ssid)
{
int ret = 0;
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
if (down_interruptible(&priv->async_sem)) {
dev_err(priv->adapter->dev, "%s: acquire semaphore\n",
@@ -2974,32 +2913,23 @@ int mwifiex_request_scan(struct mwifiex_private *priv, u8 wait_option,
}
priv->scan_pending_on_block = true;
- /* Allocate wait request buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait) {
- ret = -1;
- goto done;
- }
+ priv->adapter->cmd_wait_q.condition = false;
if (req_ssid && req_ssid->ssid_len != 0)
/* Specific SSID scan */
- status = mwifiex_scan_specific_ssid(priv, wait,
- HostCmd_ACT_GEN_SET,
- req_ssid, NULL);
+ ret = mwifiex_scan_specific_ssid(priv, req_ssid);
else
/* Normal scan */
- status = mwifiex_scan_networks(priv, wait, HostCmd_ACT_GEN_SET,
- NULL, NULL);
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
- if (status == -1)
- ret = -1;
-done:
- if ((wait) && (status != -EINPROGRESS))
- kfree(wait);
+ ret = mwifiex_scan_networks(priv, NULL);
+
+ if (!ret)
+ ret = mwifiex_wait_queue_complete(priv->adapter);
+
if (ret == -1) {
priv->scan_pending_on_block = false;
up(&priv->async_sem);
}
+
return ret;
}
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index f21e5cd19839..5148d0e0fad6 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -208,7 +208,7 @@ static int mwifiex_sdio_resume(struct device *dev)
/* Disable Host Sleep */
mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
- MWIFIEX_NO_WAIT);
+ MWIFIEX_ASYNC_CMD);
return 0;
}
@@ -282,7 +282,7 @@ mwifiex_read_reg(struct mwifiex_adapter *adapter, u32 reg, u32 *data)
*/
static int
mwifiex_write_data_sync(struct mwifiex_adapter *adapter,
- u8 *buffer, u32 pkt_len, u32 port, u32 timeout)
+ u8 *buffer, u32 pkt_len, u32 port)
{
struct sdio_mmc_card *card = adapter->card;
int ret = -1;
@@ -314,9 +314,8 @@ mwifiex_write_data_sync(struct mwifiex_adapter *adapter,
/*
* This function reads multiple data from SDIO card memory.
*/
-static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter,
- u8 *buffer, u32 len,
- u32 port, u32 timeout, u8 claim)
+static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter, u8 *buffer,
+ u32 len, u32 port, u8 claim)
{
struct sdio_mmc_card *card = adapter->card;
int ret = -1;
@@ -348,12 +347,9 @@ static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter,
*/
static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
{
- int ret;
-
dev_dbg(adapter->dev, "event: wakeup device...\n");
- ret = mwifiex_write_reg(adapter, CONFIGURATION_REG, HOST_POWER_UP);
- return ret;
+ return mwifiex_write_reg(adapter, CONFIGURATION_REG, HOST_POWER_UP);
}
/*
@@ -363,12 +359,9 @@ static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
*/
static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
{
- int ret;
-
dev_dbg(adapter->dev, "cmd: wakeup device completed\n");
- ret = mwifiex_write_reg(adapter, CONFIGURATION_REG, 0);
- return ret;
+ return mwifiex_write_reg(adapter, CONFIGURATION_REG, 0);
}
/*
@@ -430,8 +423,7 @@ static int mwifiex_write_data_to_card(struct mwifiex_adapter *adapter,
int ret = 0;
do {
- ret = mwifiex_write_data_sync(adapter, payload, pkt_len,
- port, 0);
+ ret = mwifiex_write_data_sync(adapter, payload, pkt_len, port);
if (ret) {
i++;
dev_err(adapter->dev, "host_to_card, write iomem"
@@ -630,7 +622,7 @@ static int mwifiex_sdio_card_to_host(struct mwifiex_adapter *adapter,
return -1;
}
- ret = mwifiex_read_data_sync(adapter, buffer, npayload, ioport, 0, 1);
+ ret = mwifiex_read_data_sync(adapter, buffer, npayload, ioport, 1);
if (ret) {
dev_err(adapter->dev, "%s: read iomem failed: %d\n", __func__,
@@ -769,7 +761,7 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
ret = mwifiex_write_data_sync(adapter, fwbuf, tx_blocks *
MWIFIEX_SDIO_BLOCK_SIZE,
- adapter->ioport, 0);
+ adapter->ioport);
if (ret) {
dev_err(adapter->dev, "FW download, write iomem (%d)"
" failed @ %d\n", i, offset);
@@ -842,7 +834,7 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
unsigned long flags;
if (mwifiex_read_data_sync(adapter, card->mp_regs, MAX_MP_REGS,
- REG_PORT | MWIFIEX_SDIO_BYTE_MODE_MASK, 0,
+ REG_PORT | MWIFIEX_SDIO_BYTE_MODE_MASK,
0)) {
dev_err(adapter->dev, "read mp_regs failed\n");
return;
@@ -859,8 +851,6 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
adapter->int_status |= sdio_ireg;
spin_unlock_irqrestore(&adapter->int_lock, flags);
}
-
- return;
}
/*
@@ -891,8 +881,6 @@ mwifiex_sdio_interrupt(struct sdio_func *func)
mwifiex_interrupt_status(adapter);
queue_work(adapter->workqueue, &adapter->main_work);
-
- return;
}
/*
@@ -1054,7 +1042,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
card->mpa_rx.buf_len,
(adapter->ioport | 0x1000 |
(card->mpa_rx.ports << 4)) +
- card->mpa_rx.start_port, 0, 1))
+ card->mpa_rx.start_port, 1))
return -1;
curr_ptr = card->mpa_rx.buf;
@@ -1709,13 +1697,9 @@ static struct mwifiex_if_ops sdio_ops = {
static int
mwifiex_sdio_init_module(void)
{
- int ret;
-
sema_init(&add_remove_card_sem, 1);
- ret = sdio_register_driver(&mwifiex_sdio);
-
- return ret;
+ return sdio_register_driver(&mwifiex_sdio);
}
/*
@@ -1745,13 +1729,12 @@ mwifiex_sdio_cleanup_module(void)
for (i = 0; i < adapter->priv_num; i++)
if ((GET_BSS_ROLE(adapter->priv[i]) == MWIFIEX_BSS_ROLE_STA) &&
adapter->priv[i]->media_connected)
- mwifiex_disconnect(adapter->priv[i], MWIFIEX_CMD_WAIT,
- NULL);
+ mwifiex_deauthenticate(adapter->priv[i], NULL);
if (!adapter->surprise_removed)
- mwifiex_shutdown_fw(mwifiex_get_priv
- (adapter, MWIFIEX_BSS_ROLE_ANY),
- MWIFIEX_CMD_WAIT);
+ mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter,
+ MWIFIEX_BSS_ROLE_ANY),
+ MWIFIEX_FUNC_SHUTDOWN);
exit:
up(&add_remove_card_sem);
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c
index 6fff26153e26..33c8ba1f5e33 100644
--- a/drivers/net/wireless/mwifiex/sta_cmd.c
+++ b/drivers/net/wireless/mwifiex/sta_cmd.c
@@ -190,8 +190,7 @@ static int mwifiex_cmd_802_11_snmp_mib(struct mwifiex_private *priv,
* - Ensuring correct endian-ness
*/
static int
-mwifiex_cmd_802_11_get_log(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd)
+mwifiex_cmd_802_11_get_log(struct host_cmd_ds_command *cmd)
{
cmd->command = cpu_to_le16(HostCmd_CMD_802_11_GET_LOG);
cmd->size = cpu_to_le16(sizeof(struct host_cmd_ds_802_11_get_log) +
@@ -272,8 +271,7 @@ static int mwifiex_cmd_tx_rate_cfg(struct mwifiex_private *priv,
* (as required)
* - Ensuring correct endian-ness
*/
-static int mwifiex_cmd_tx_power_cfg(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+static int mwifiex_cmd_tx_power_cfg(struct host_cmd_ds_command *cmd,
u16 cmd_action, void *data_buf)
{
struct mwifiex_types_power_group *pg_tlv = NULL;
@@ -407,8 +405,7 @@ static int mwifiex_cmd_802_11_mac_address(struct mwifiex_private *priv,
* - Setting MAC multicast address
* - Ensuring correct endian-ness
*/
-static int mwifiex_cmd_mac_multicast_adr(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+static int mwifiex_cmd_mac_multicast_adr(struct host_cmd_ds_command *cmd,
u16 cmd_action, void *data_buf)
{
struct mwifiex_multicast_list *mcast_list =
@@ -463,8 +460,7 @@ static int mwifiex_cmd_802_11_deauthenticate(struct mwifiex_private *priv,
* - Setting command ID and proper size
* - Ensuring correct endian-ness
*/
-static int mwifiex_cmd_802_11_ad_hoc_stop(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd)
+static int mwifiex_cmd_802_11_ad_hoc_stop(struct host_cmd_ds_command *cmd)
{
cmd->command = cpu_to_le16(HostCmd_CMD_802_11_AD_HOC_STOP);
cmd->size = cpu_to_le16(S_DS_GEN);
@@ -500,9 +496,8 @@ mwifiex_set_keyparamset_wep(struct mwifiex_private *priv,
key_param_set->key_type_id =
cpu_to_le16(KEY_TYPE_ID_WEP);
key_param_set->key_info =
- cpu_to_le16(KEY_INFO_WEP_ENABLED |
- KEY_INFO_WEP_UNICAST |
- KEY_INFO_WEP_MCAST);
+ cpu_to_le16(KEY_ENABLED | KEY_UNICAST |
+ KEY_MCAST);
key_param_set->key_len =
cpu_to_le16(priv->wep_key[i].key_length);
/* Set WEP key index */
@@ -589,10 +584,10 @@ static int mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv,
cpu_to_le16(KEY_TYPE_ID_WAPI);
if (cmd_oid == KEY_INFO_ENABLED)
key_material->key_param_set.key_info =
- cpu_to_le16(KEY_INFO_WAPI_ENABLED);
+ cpu_to_le16(KEY_ENABLED);
else
key_material->key_param_set.key_info =
- cpu_to_le16(!KEY_INFO_WAPI_ENABLED);
+ cpu_to_le16(!KEY_ENABLED);
key_material->key_param_set.key[0] = enc_key->key_index;
if (!priv->sec_info.wapi_key_on)
@@ -604,10 +599,10 @@ static int mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv,
if (0 != memcmp(enc_key->mac_addr, bc_mac, sizeof(bc_mac))) {
/* WAPI pairwise key: unicast */
key_material->key_param_set.key_info |=
- cpu_to_le16(KEY_INFO_WAPI_UNICAST);
+ cpu_to_le16(KEY_UNICAST);
} else { /* WAPI group key: multicast */
key_material->key_param_set.key_info |=
- cpu_to_le16(KEY_INFO_WAPI_MCAST);
+ cpu_to_le16(KEY_MCAST);
priv->sec_info.wapi_key_on = true;
}
@@ -634,32 +629,32 @@ static int mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv,
cpu_to_le16(KEY_TYPE_ID_AES);
if (cmd_oid == KEY_INFO_ENABLED)
key_material->key_param_set.key_info =
- cpu_to_le16(KEY_INFO_AES_ENABLED);
+ cpu_to_le16(KEY_ENABLED);
else
key_material->key_param_set.key_info =
- cpu_to_le16(!KEY_INFO_AES_ENABLED);
+ cpu_to_le16(!KEY_ENABLED);
if (enc_key->key_index & MWIFIEX_KEY_INDEX_UNICAST)
/* AES pairwise key: unicast */
key_material->key_param_set.key_info |=
- cpu_to_le16(KEY_INFO_AES_UNICAST);
+ cpu_to_le16(KEY_UNICAST);
else /* AES group key: multicast */
key_material->key_param_set.key_info |=
- cpu_to_le16(KEY_INFO_AES_MCAST);
+ cpu_to_le16(KEY_MCAST);
} else if (enc_key->key_len == WLAN_KEY_LEN_TKIP) {
dev_dbg(priv->adapter->dev, "cmd: WPA_TKIP\n");
key_material->key_param_set.key_type_id =
cpu_to_le16(KEY_TYPE_ID_TKIP);
key_material->key_param_set.key_info =
- cpu_to_le16(KEY_INFO_TKIP_ENABLED);
+ cpu_to_le16(KEY_ENABLED);
if (enc_key->key_index & MWIFIEX_KEY_INDEX_UNICAST)
/* TKIP pairwise key: unicast */
key_material->key_param_set.key_info |=
- cpu_to_le16(KEY_INFO_TKIP_UNICAST);
+ cpu_to_le16(KEY_UNICAST);
else /* TKIP group key: multicast */
key_material->key_param_set.key_info |=
- cpu_to_le16(KEY_INFO_TKIP_MCAST);
+ cpu_to_le16(KEY_MCAST);
}
if (key_material->key_param_set.key_type_id) {
@@ -778,8 +773,7 @@ static int mwifiex_cmd_802_11_rf_channel(struct mwifiex_private *priv,
* - Setting status to enable or disable (for SET only)
* - Ensuring correct endian-ness
*/
-static int mwifiex_cmd_ibss_coalescing_status(struct mwifiex_private *priv,
- struct host_cmd_ds_command *cmd,
+static int mwifiex_cmd_ibss_coalescing_status(struct host_cmd_ds_command *cmd,
u16 cmd_action, void *data_buf)
{
struct host_cmd_ds_802_11_ibss_status *ibss_coal =
@@ -947,7 +941,7 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
cmd_action);
break;
case HostCmd_CMD_MAC_MULTICAST_ADR:
- ret = mwifiex_cmd_mac_multicast_adr(priv, cmd_ptr, cmd_action,
+ ret = mwifiex_cmd_mac_multicast_adr(cmd_ptr, cmd_action,
data_buf);
break;
case HostCmd_CMD_TX_RATE_CFG:
@@ -955,7 +949,7 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
data_buf);
break;
case HostCmd_CMD_TXPWR_CFG:
- ret = mwifiex_cmd_tx_power_cfg(priv, cmd_ptr, cmd_action,
+ ret = mwifiex_cmd_tx_power_cfg(cmd_ptr, cmd_action,
data_buf);
break;
case HostCmd_CMD_802_11_PS_MODE_ENH:
@@ -967,11 +961,10 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
(struct mwifiex_hs_config_param *) data_buf);
break;
case HostCmd_CMD_802_11_SCAN:
- ret = mwifiex_cmd_802_11_scan(priv, cmd_ptr, data_buf);
+ ret = mwifiex_cmd_802_11_scan(cmd_ptr, data_buf);
break;
case HostCmd_CMD_802_11_BG_SCAN_QUERY:
- ret = mwifiex_cmd_802_11_bg_scan_query(priv, cmd_ptr,
- data_buf);
+ ret = mwifiex_cmd_802_11_bg_scan_query(cmd_ptr);
break;
case HostCmd_CMD_802_11_ASSOCIATE:
ret = mwifiex_cmd_802_11_associate(priv, cmd_ptr, data_buf);
@@ -985,14 +978,14 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
data_buf);
break;
case HostCmd_CMD_802_11_GET_LOG:
- ret = mwifiex_cmd_802_11_get_log(priv, cmd_ptr);
+ ret = mwifiex_cmd_802_11_get_log(cmd_ptr);
break;
case HostCmd_CMD_802_11_AD_HOC_JOIN:
ret = mwifiex_cmd_802_11_ad_hoc_join(priv, cmd_ptr,
data_buf);
break;
case HostCmd_CMD_802_11_AD_HOC_STOP:
- ret = mwifiex_cmd_802_11_ad_hoc_stop(priv, cmd_ptr);
+ ret = mwifiex_cmd_802_11_ad_hoc_stop(cmd_ptr);
break;
case HostCmd_CMD_RSSI_INFO:
ret = mwifiex_cmd_802_11_rssi_info(priv, cmd_ptr, cmd_action);
@@ -1037,10 +1030,10 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
cmd_ptr->size = cpu_to_le16(S_DS_GEN);
break;
case HostCmd_CMD_11N_ADDBA_REQ:
- ret = mwifiex_cmd_11n_addba_req(priv, cmd_ptr, data_buf);
+ ret = mwifiex_cmd_11n_addba_req(cmd_ptr, data_buf);
break;
case HostCmd_CMD_11N_DELBA:
- ret = mwifiex_cmd_11n_delba(priv, cmd_ptr, data_buf);
+ ret = mwifiex_cmd_11n_delba(cmd_ptr, data_buf);
break;
case HostCmd_CMD_11N_ADDBA_RSP:
ret = mwifiex_cmd_11n_addba_rsp_gen(priv, cmd_ptr, data_buf);
@@ -1059,11 +1052,11 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
data_buf);
break;
case HostCmd_CMD_AMSDU_AGGR_CTRL:
- ret = mwifiex_cmd_amsdu_aggr_ctrl(priv, cmd_ptr, cmd_action,
+ ret = mwifiex_cmd_amsdu_aggr_ctrl(cmd_ptr, cmd_action,
data_buf);
break;
case HostCmd_CMD_11N_CFG:
- ret = mwifiex_cmd_11n_cfg(priv, cmd_ptr, cmd_action,
+ ret = mwifiex_cmd_11n_cfg(cmd_ptr, cmd_action,
data_buf);
break;
case HostCmd_CMD_WMM_GET_STATUS:
@@ -1076,8 +1069,8 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
ret = 0;
break;
case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS:
- ret = mwifiex_cmd_ibss_coalescing_status(priv, cmd_ptr,
- cmd_action, data_buf);
+ ret = mwifiex_cmd_ibss_coalescing_status(cmd_ptr, cmd_action,
+ data_buf);
break;
case HostCmd_CMD_MAC_REG_ACCESS:
case HostCmd_CMD_BBP_REG_ACCESS:
@@ -1136,65 +1129,66 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
if (first_sta) {
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_FUNC_INIT,
- HostCmd_ACT_GEN_SET, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_FUNC_INIT,
+ HostCmd_ACT_GEN_SET, 0, NULL);
if (ret)
return -1;
/* Read MAC address from HW */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_GET_HW_SPEC,
- HostCmd_ACT_GEN_GET, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_GET_HW_SPEC,
+ HostCmd_ACT_GEN_GET, 0, NULL);
if (ret)
return -1;
/* Reconfigure tx buf size */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_RECONFIGURE_TX_BUFF,
- HostCmd_ACT_GEN_SET, 0, NULL,
- &priv->adapter->tx_buf_size);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_RECONFIGURE_TX_BUFF,
+ HostCmd_ACT_GEN_SET, 0,
+ &priv->adapter->tx_buf_size);
if (ret)
return -1;
/* Enable IEEE PS by default */
priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_PS_MODE_ENH,
- EN_AUTO_PS, BITMAP_STA_PS, NULL,
- NULL);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_PS_MODE_ENH,
+ EN_AUTO_PS, BITMAP_STA_PS, NULL);
if (ret)
return -1;
}
/* get tx rate */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_TX_RATE_CFG,
- HostCmd_ACT_GEN_GET, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_TX_RATE_CFG,
+ HostCmd_ACT_GEN_GET, 0, NULL);
if (ret)
return -1;
priv->data_rate = 0;
/* get tx power */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_TXPWR_CFG,
- HostCmd_ACT_GEN_GET, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_TXPWR_CFG,
+ HostCmd_ACT_GEN_GET, 0, NULL);
if (ret)
return -1;
/* set ibss coalescing_status */
- ret = mwifiex_prepare_cmd(priv,
- HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
- HostCmd_ACT_GEN_SET, 0, NULL, &enable);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
+ HostCmd_ACT_GEN_SET, 0, &enable);
if (ret)
return -1;
memset(&amsdu_aggr_ctrl, 0, sizeof(amsdu_aggr_ctrl));
amsdu_aggr_ctrl.enable = true;
/* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_AMSDU_AGGR_CTRL,
- HostCmd_ACT_GEN_SET, 0, NULL,
- (void *) &amsdu_aggr_ctrl);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_AMSDU_AGGR_CTRL,
+ HostCmd_ACT_GEN_SET, 0,
+ (void *) &amsdu_aggr_ctrl);
if (ret)
return -1;
/* MAC Control must be the last command in init_fw */
/* set MAC Control */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_MAC_CONTROL,
- HostCmd_ACT_GEN_SET, 0, NULL,
- &priv->curr_pkt_filter);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_MAC_CONTROL,
+ HostCmd_ACT_GEN_SET, 0,
+ &priv->curr_pkt_filter);
if (ret)
return -1;
@@ -1202,19 +1196,18 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
/* Enable auto deep sleep */
auto_ds.auto_ds = DEEP_SLEEP_ON;
auto_ds.idle_time = DEEP_SLEEP_IDLE_TIME;
- ret = mwifiex_prepare_cmd(priv,
- HostCmd_CMD_802_11_PS_MODE_ENH,
- EN_AUTO_PS, BITMAP_AUTO_DS, NULL,
- &auto_ds);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_PS_MODE_ENH,
+ EN_AUTO_PS, BITMAP_AUTO_DS,
+ &auto_ds);
if (ret)
return -1;
}
/* Send cmd to FW to enable/disable 11D function */
state_11d = ENABLE_11D;
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB,
- HostCmd_ACT_GEN_SET, DOT11D_I,
- NULL, &state_11d);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_802_11_SNMP_MIB,
+ HostCmd_ACT_GEN_SET, DOT11D_I, &state_11d);
if (ret)
dev_err(priv->adapter->dev, "11D: failed to enable 11D\n");
diff --git a/drivers/net/wireless/mwifiex/sta_cmdresp.c b/drivers/net/wireless/mwifiex/sta_cmdresp.c
index 74add45b99b6..7f4f10b752fb 100644
--- a/drivers/net/wireless/mwifiex/sta_cmdresp.c
+++ b/drivers/net/wireless/mwifiex/sta_cmdresp.c
@@ -41,8 +41,7 @@
*/
static void
mwifiex_process_cmdresp_error(struct mwifiex_private *priv,
- struct host_cmd_ds_command *resp,
- struct mwifiex_wait_queue *wq_buf)
+ struct host_cmd_ds_command *resp)
{
struct cmd_ctrl_node *cmd_node = NULL, *tmp_node = NULL;
struct mwifiex_adapter *adapter = priv->adapter;
@@ -51,8 +50,9 @@ mwifiex_process_cmdresp_error(struct mwifiex_private *priv,
dev_err(adapter->dev, "CMD_RESP: cmd %#x error, result=%#x\n",
resp->command, resp->result);
- if (wq_buf)
- wq_buf->status = MWIFIEX_ERROR_FW_CMDRESP;
+
+ if (adapter->curr_cmd->wait_q_enabled)
+ adapter->cmd_wait_q.status = -1;
switch (le16_to_cpu(resp->command)) {
case HostCmd_CMD_802_11_PS_MODE_ENH:
@@ -103,8 +103,6 @@ mwifiex_process_cmdresp_error(struct mwifiex_private *priv,
spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
adapter->curr_cmd = NULL;
spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
-
- return;
}
/*
@@ -282,7 +280,6 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv,
struct host_cmd_ds_command *resp,
void *data_buf)
{
- struct mwifiex_adapter *adapter = priv->adapter;
struct mwifiex_rate_cfg *ds_rate = NULL;
struct host_cmd_ds_tx_rate_cfg *rate_cfg = &resp->params.tx_rate_cfg;
struct mwifiex_rate_scope *rate_scope;
@@ -328,9 +325,9 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv,
if (priv->is_data_rate_auto)
priv->data_rate = 0;
else
- ret = mwifiex_prepare_cmd(priv,
+ ret = mwifiex_send_cmd_async(priv,
HostCmd_CMD_802_11_TX_RATE_QUERY,
- HostCmd_ACT_GEN_GET, 0, NULL, NULL);
+ HostCmd_ACT_GEN_GET, 0, NULL);
if (data_buf) {
ds_rate = (struct mwifiex_rate_cfg *) data_buf;
@@ -338,9 +335,7 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv,
if (priv->is_data_rate_auto) {
ds_rate->is_rate_auto = 1;
} else {
- ds_rate->rate =
- mwifiex_get_rate_index(adapter,
- priv->
+ ds_rate->rate = mwifiex_get_rate_index(priv->
bitmap_rates,
sizeof(priv->
bitmap_rates));
@@ -516,13 +511,11 @@ static int mwifiex_ret_mac_multicast_adr(struct mwifiex_private *priv,
static int mwifiex_ret_802_11_tx_rate_query(struct mwifiex_private *priv,
struct host_cmd_ds_command *resp)
{
- struct mwifiex_adapter *adapter = priv->adapter;
-
priv->tx_rate = resp->params.tx_rate.tx_rate;
priv->tx_htinfo = resp->params.tx_rate.ht_info;
if (!priv->is_data_rate_auto)
priv->data_rate =
- mwifiex_index_to_data_rate(adapter, priv->tx_rate,
+ mwifiex_index_to_data_rate(priv->tx_rate,
priv->tx_htinfo);
return 0;
@@ -574,8 +567,7 @@ static int mwifiex_ret_802_11_key_material(struct mwifiex_private *priv,
&resp->params.key_material;
if (le16_to_cpu(key->action) == HostCmd_ACT_GEN_SET) {
- if ((le16_to_cpu(key->key_param_set.key_info) &
- KEY_INFO_TKIP_MCAST)) {
+ if ((le16_to_cpu(key->key_param_set.key_info) & KEY_MCAST)) {
dev_dbg(priv->adapter->dev, "info: key: GTK is set\n");
priv->wpa_is_gtk_set = true;
priv->scan_block = false;
@@ -834,19 +826,17 @@ static int mwifiex_ret_ibss_coalescing_status(struct mwifiex_private *priv,
* response handlers based on the command ID.
*/
int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv,
- u16 cmdresp_no, void *cmd_buf, void *wq_buf)
+ u16 cmdresp_no, void *cmd_buf)
{
int ret = 0;
struct mwifiex_adapter *adapter = priv->adapter;
struct host_cmd_ds_command *resp =
(struct host_cmd_ds_command *) cmd_buf;
- struct mwifiex_wait_queue *wait_queue =
- (struct mwifiex_wait_queue *) wq_buf;
void *data_buf = adapter->curr_cmd->data_buf;
/* If the command is not successful, cleanup and return failure */
if (resp->result != HostCmd_RESULT_OK) {
- mwifiex_process_cmdresp_error(priv, resp, wait_queue);
+ mwifiex_process_cmdresp_error(priv, resp);
return -1;
}
/* Command successful, handle response */
@@ -866,12 +856,11 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv,
ret = mwifiex_ret_tx_rate_cfg(priv, resp, data_buf);
break;
case HostCmd_CMD_802_11_SCAN:
- ret = mwifiex_ret_802_11_scan(priv, resp, wait_queue);
- wait_queue = NULL;
- adapter->curr_cmd->wq_buf = NULL;
+ ret = mwifiex_ret_802_11_scan(priv, resp);
+ adapter->curr_cmd->wait_q_enabled = false;
break;
case HostCmd_CMD_802_11_BG_SCAN_QUERY:
- ret = mwifiex_ret_802_11_scan(priv, resp, wait_queue);
+ ret = mwifiex_ret_802_11_scan(priv, resp);
dev_dbg(adapter->dev,
"info: CMD_RESP: BG_SCAN result is ready!\n");
break;
@@ -885,14 +874,14 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv,
ret = mwifiex_ret_802_11_hs_cfg(priv, resp);
break;
case HostCmd_CMD_802_11_ASSOCIATE:
- ret = mwifiex_ret_802_11_associate(priv, resp, wait_queue);
+ ret = mwifiex_ret_802_11_associate(priv, resp);
break;
case HostCmd_CMD_802_11_DEAUTHENTICATE:
ret = mwifiex_ret_802_11_deauthenticate(priv, resp);
break;
case HostCmd_CMD_802_11_AD_HOC_START:
case HostCmd_CMD_802_11_AD_HOC_JOIN:
- ret = mwifiex_ret_802_11_ad_hoc(priv, resp, wait_queue);
+ ret = mwifiex_ret_802_11_ad_hoc(priv, resp);
break;
case HostCmd_CMD_802_11_AD_HOC_STOP:
ret = mwifiex_ret_802_11_ad_hoc_stop(priv, resp);
@@ -952,7 +941,7 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv,
mp_end_port));
break;
case HostCmd_CMD_AMSDU_AGGR_CTRL:
- ret = mwifiex_ret_amsdu_aggr_ctrl(priv, resp, data_buf);
+ ret = mwifiex_ret_amsdu_aggr_ctrl(resp, data_buf);
break;
case HostCmd_CMD_WMM_GET_STATUS:
ret = mwifiex_ret_wmm_get_status(priv, resp);
@@ -971,7 +960,7 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv,
case HostCmd_CMD_SET_BSS_MODE:
break;
case HostCmd_CMD_11N_CFG:
- ret = mwifiex_ret_11n_cfg(priv, resp, data_buf);
+ ret = mwifiex_ret_11n_cfg(resp, data_buf);
break;
default:
dev_err(adapter->dev, "CMD_RESP: unknown cmd response %#x\n",
diff --git a/drivers/net/wireless/mwifiex/sta_event.c b/drivers/net/wireless/mwifiex/sta_event.c
index 936d7c175e75..fc265cab0907 100644
--- a/drivers/net/wireless/mwifiex/sta_event.c
+++ b/drivers/net/wireless/mwifiex/sta_event.c
@@ -271,8 +271,9 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
case EVENT_HS_ACT_REQ:
dev_dbg(adapter->dev, "event: HS_ACT_REQ\n");
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_HS_CFG_ENH,
- 0, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_HS_CFG_ENH,
+ 0, 0, NULL);
break;
case EVENT_MIC_ERR_UNICAST:
@@ -303,9 +304,9 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
sizeof(struct mwifiex_bssdescriptor) * IW_MAX_AP);
adapter->num_in_scan_table = 0;
adapter->bcn_buf_end = adapter->bcn_buf;
- ret = mwifiex_prepare_cmd(priv,
- HostCmd_CMD_802_11_BG_SCAN_QUERY,
- HostCmd_ACT_GEN_GET, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_BG_SCAN_QUERY,
+ HostCmd_ACT_GEN_GET, 0, NULL);
break;
case EVENT_PORT_RELEASE:
@@ -314,8 +315,8 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
case EVENT_WMM_STATUS_CHANGE:
dev_dbg(adapter->dev, "event: WMM status changed\n");
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_WMM_GET_STATUS,
- 0, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_WMM_GET_STATUS,
+ 0, 0, NULL);
break;
case EVENT_RSSI_LOW:
@@ -353,15 +354,15 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
break;
case EVENT_IBSS_COALESCED:
dev_dbg(adapter->dev, "event: IBSS_COALESCED\n");
- ret = mwifiex_prepare_cmd(priv,
+ ret = mwifiex_send_cmd_async(priv,
HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
- HostCmd_ACT_GEN_GET, 0, NULL, NULL);
+ HostCmd_ACT_GEN_GET, 0, NULL);
break;
case EVENT_ADDBA:
dev_dbg(adapter->dev, "event: ADDBA Request\n");
- mwifiex_prepare_cmd(priv, HostCmd_CMD_11N_ADDBA_RSP,
- HostCmd_ACT_GEN_SET, 0, NULL,
- adapter->event_body);
+ mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_ADDBA_RSP,
+ HostCmd_ACT_GEN_SET, 0,
+ adapter->event_body);
break;
case EVENT_DELBA:
dev_dbg(adapter->dev, "event: DELBA Request\n");
diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c
index b163507b1fe0..e7adaab35226 100644
--- a/drivers/net/wireless/mwifiex/sta_ioctl.c
+++ b/drivers/net/wireless/mwifiex/sta_ioctl.c
@@ -33,9 +33,8 @@
* size, and the calling function must ensure enough memory is
* available.
*/
-static int
-mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
- struct net_device *dev)
+int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
+ struct net_device *dev)
{
int i = 0;
struct netdev_hw_addr *ha;
@@ -47,216 +46,51 @@ mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
}
/*
- * Allocate and fills a wait queue with proper parameters.
- *
- * This function needs to be called before an IOCTL request can be made.
- * It can handle the following wait options:
- * MWIFIEX_NO_WAIT - Waiting is disabled
- * MWIFIEX_IOCTL_WAIT - Waiting is done on IOCTL wait queue
- * MWIFIEX_CMD_WAIT - Waiting is done on command wait queue
- * MWIFIEX_WSTATS_WAIT - Waiting is done on stats wait queue
- */
-struct mwifiex_wait_queue *
-mwifiex_alloc_fill_wait_queue(struct mwifiex_private *priv,
- u8 wait_option)
-{
- struct mwifiex_wait_queue *wait = NULL;
-
- wait = (struct mwifiex_wait_queue *)
- kzalloc(sizeof(struct mwifiex_wait_queue), GFP_ATOMIC);
- if (!wait) {
- dev_err(priv->adapter->dev, "%s: fail to alloc buffer\n",
- __func__);
- return wait;
- }
-
- wait->bss_index = priv->bss_index;
-
- switch (wait_option) {
- case MWIFIEX_NO_WAIT:
- wait->enabled = 0;
- break;
- case MWIFIEX_IOCTL_WAIT:
- priv->ioctl_wait_q_woken = false;
- wait->start_time = jiffies;
- wait->wait = &priv->ioctl_wait_q;
- wait->condition = &priv->ioctl_wait_q_woken;
- wait->enabled = 1;
- break;
- case MWIFIEX_CMD_WAIT:
- priv->cmd_wait_q_woken = false;
- wait->start_time = jiffies;
- wait->wait = &priv->cmd_wait_q;
- wait->condition = &priv->cmd_wait_q_woken;
- wait->enabled = 1;
- break;
- case MWIFIEX_WSTATS_WAIT:
- priv->w_stats_wait_q_woken = false;
- wait->start_time = jiffies;
- wait->wait = &priv->w_stats_wait_q;
- wait->condition = &priv->w_stats_wait_q_woken;
- wait->enabled = 1;
- break;
- }
-
- return wait;
-}
-
-/*
* Wait queue completion handler.
*
- * This function waits on a particular wait queue.
- * For NO_WAIT option, it returns immediately. It also cancels the
- * pending IOCTL request after waking up, in case of errors.
+ * This function waits on a cmd wait queue. It also cancels the pending
+ * request after waking up, in case of errors.
*/
-static void
-mwifiex_wait_ioctl_complete(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u8 wait_option)
+int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
{
bool cancel_flag = false;
+ int status = adapter->cmd_wait_q.status;
- switch (wait_option) {
- case MWIFIEX_NO_WAIT:
- break;
- case MWIFIEX_IOCTL_WAIT:
- wait_event_interruptible(priv->ioctl_wait_q,
- priv->ioctl_wait_q_woken);
- if (!priv->ioctl_wait_q_woken)
- cancel_flag = true;
- break;
- case MWIFIEX_CMD_WAIT:
- wait_event_interruptible(priv->cmd_wait_q,
- priv->cmd_wait_q_woken);
- if (!priv->cmd_wait_q_woken)
- cancel_flag = true;
- break;
- case MWIFIEX_WSTATS_WAIT:
- wait_event_interruptible(priv->w_stats_wait_q,
- priv->w_stats_wait_q_woken);
- if (!priv->w_stats_wait_q_woken)
- cancel_flag = true;
- break;
- }
- if (cancel_flag) {
- mwifiex_cancel_pending_ioctl(priv->adapter, wait);
- dev_dbg(priv->adapter->dev, "cmd: IOCTL cancel: wait=%p, wait_option=%d\n",
- wait, wait_option);
- }
+ dev_dbg(adapter->dev, "cmd pending\n");
+ atomic_inc(&adapter->cmd_pending);
- return;
-}
-
-/*
- * The function waits for the request to complete and issues the
- * completion handler, if required.
- */
-int mwifiex_request_ioctl(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- int status, u8 wait_option)
-{
- switch (status) {
- case -EINPROGRESS:
- dev_dbg(priv->adapter->dev, "cmd: IOCTL pending: wait=%p, wait_option=%d\n",
- wait, wait_option);
- atomic_inc(&priv->adapter->ioctl_pending);
- /* Status pending, wake up main process */
- queue_work(priv->adapter->workqueue, &priv->adapter->main_work);
-
- /* Wait for completion */
- if (wait_option) {
- mwifiex_wait_ioctl_complete(priv, wait, wait_option);
- status = wait->status;
- }
- break;
- case 0:
- case -1:
- case -EBUSY:
- default:
- break;
- }
- return status;
-}
-EXPORT_SYMBOL_GPL(mwifiex_request_ioctl);
+ /* Status pending, wake up main process */
+ queue_work(adapter->workqueue, &adapter->main_work);
-/*
- * IOCTL request handler to set/get MAC address.
- *
- * This function prepares the correct firmware command and
- * issues it to get the extended version information.
- */
-static int mwifiex_bss_ioctl_mac_address(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u8 action, u8 *mac)
-{
- int ret = 0;
+ /* Wait for completion */
+ wait_event_interruptible(adapter->cmd_wait_q.wait,
+ adapter->cmd_wait_q.condition);
+ if (!adapter->cmd_wait_q.condition)
+ cancel_flag = true;
- if ((action == HostCmd_ACT_GEN_GET) && mac) {
- memcpy(mac, priv->curr_addr, ETH_ALEN);
- return 0;
+ if (cancel_flag) {
+ mwifiex_cancel_pending_ioctl(adapter);
+ dev_dbg(adapter->dev, "cmd cancel\n");
}
+ adapter->cmd_wait_q.status = 0;
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_MAC_ADDRESS,
- action, 0, wait, mac);
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
-}
-
-/*
- * Sends IOCTL request to set MAC address.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int mwifiex_request_set_mac_address(struct mwifiex_private *priv)
-{
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
- u8 wait_option = MWIFIEX_CMD_WAIT;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- status = mwifiex_bss_ioctl_mac_address(priv, wait, HostCmd_ACT_GEN_SET,
- NULL);
-
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
- if (!status)
- memcpy(priv->netdev->dev_addr, priv->curr_addr, ETH_ALEN);
- else
- dev_err(priv->adapter->dev, "set mac address failed: status=%d"
- " error_code=%#x\n", status, wait->status);
-
- kfree(wait);
return status;
}
/*
- * IOCTL request handler to set multicast list.
- *
* This function prepares the correct firmware command and
* issues it to set the multicast list.
*
* This function can be used to enable promiscuous mode, or enable all
* multicast packets, or to enable selective multicast.
*/
-static int
-mwifiex_bss_ioctl_multicast_list(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u16 action,
- struct mwifiex_multicast_list *mcast_list)
+int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
+ struct mwifiex_multicast_list *mcast_list)
{
int ret = 0;
u16 old_pkt_filter;
old_pkt_filter = priv->curr_pkt_filter;
- if (action == HostCmd_ACT_GEN_GET)
- return -1;
if (mcast_list->mode == MWIFIEX_PROMISC_MODE) {
dev_dbg(priv->adapter->dev, "info: Enable Promiscuous mode\n");
@@ -281,16 +115,15 @@ mwifiex_bss_ioctl_multicast_list(struct mwifiex_private *priv,
/* Set multicast addresses to firmware */
if (old_pkt_filter == priv->curr_pkt_filter) {
/* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv,
+ ret = mwifiex_send_cmd_async(priv,
HostCmd_CMD_MAC_MULTICAST_ADR,
- action, 0, wait, mcast_list);
- if (!ret)
- ret = -EINPROGRESS;
+ HostCmd_ACT_GEN_SET, 0,
+ mcast_list);
} else {
/* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv,
+ ret = mwifiex_send_cmd_async(priv,
HostCmd_CMD_MAC_MULTICAST_ADR,
- action, 0, NULL,
+ HostCmd_ACT_GEN_SET, 0,
mcast_list);
}
}
@@ -300,101 +133,21 @@ mwifiex_bss_ioctl_multicast_list(struct mwifiex_private *priv,
"info: old_pkt_filter=%#x, curr_pkt_filter=%#x\n",
old_pkt_filter, priv->curr_pkt_filter);
if (old_pkt_filter != priv->curr_pkt_filter) {
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_MAC_CONTROL, action,
- 0, wait, &priv->curr_pkt_filter);
- if (!ret)
- ret = -EINPROGRESS;
+ ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_MAC_CONTROL,
+ HostCmd_ACT_GEN_SET,
+ 0, &priv->curr_pkt_filter);
}
return ret;
}
/*
- * Sends IOCTL request to set multicast list.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-void
-mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
- struct net_device *dev)
-{
- struct mwifiex_wait_queue *wait = NULL;
- struct mwifiex_multicast_list mcast_list;
- u8 wait_option = MWIFIEX_NO_WAIT;
- int status = 0;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return;
-
- if (dev->flags & IFF_PROMISC) {
- mcast_list.mode = MWIFIEX_PROMISC_MODE;
- } else if (dev->flags & IFF_ALLMULTI ||
- netdev_mc_count(dev) > MWIFIEX_MAX_MULTICAST_LIST_SIZE) {
- mcast_list.mode = MWIFIEX_ALL_MULTI_MODE;
- } else {
- mcast_list.mode = MWIFIEX_MULTICAST_MODE;
- if (netdev_mc_count(dev))
- mcast_list.num_multicast_addr =
- mwifiex_copy_mcast_addr(&mcast_list, dev);
- }
- status = mwifiex_bss_ioctl_multicast_list(priv, wait,
- HostCmd_ACT_GEN_SET,
- &mcast_list);
-
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
- if (wait && status != -EINPROGRESS)
- kfree(wait);
-
- return;
-}
-
-/*
- * IOCTL request handler to disconnect from a BSS/IBSS.
- */
-static int mwifiex_bss_ioctl_stop(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait, u8 *mac)
-{
- return mwifiex_deauthenticate(priv, wait, mac);
-}
-
-/*
- * Sends IOCTL request to disconnect from a BSS.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int mwifiex_disconnect(struct mwifiex_private *priv, u8 wait_option, u8 *mac)
-{
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- status = mwifiex_bss_ioctl_stop(priv, wait, mac);
-
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
-
- kfree(wait);
- return status;
-}
-EXPORT_SYMBOL_GPL(mwifiex_disconnect);
-
-/*
- * IOCTL request handler to join a BSS/IBSS.
- *
* In Ad-Hoc mode, the IBSS is created if not found in scan list.
* In both Ad-Hoc and infra mode, an deauthentication is performed
* first.
*/
-static int mwifiex_bss_ioctl_start(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- struct mwifiex_ssid_bssid *ssid_bssid)
+int mwifiex_bss_start(struct mwifiex_private *priv,
+ struct mwifiex_ssid_bssid *ssid_bssid)
{
int ret = 0;
struct mwifiex_adapter *adapter = priv->adapter;
@@ -406,7 +159,7 @@ static int mwifiex_bss_ioctl_start(struct mwifiex_private *priv,
if (priv->bss_mode == NL80211_IFTYPE_STATION) {
/* Infra mode */
- ret = mwifiex_deauthenticate(priv, NULL, NULL);
+ ret = mwifiex_deauthenticate(priv, NULL);
if (ret)
return ret;
@@ -427,7 +180,7 @@ static int mwifiex_bss_ioctl_start(struct mwifiex_private *priv,
/* Clear any past association response stored for
* application retrieval */
priv->assoc_rsp_size = 0;
- ret = mwifiex_associate(priv, wait, &adapter->scan_table[i]);
+ ret = mwifiex_associate(priv, &adapter->scan_table[i]);
if (ret)
return ret;
} else {
@@ -441,7 +194,7 @@ static int mwifiex_bss_ioctl_start(struct mwifiex_private *priv,
/* Exit Adhoc mode first */
dev_dbg(adapter->dev, "info: Sending Adhoc Stop\n");
- ret = mwifiex_deauthenticate(priv, NULL, NULL);
+ ret = mwifiex_deauthenticate(priv, NULL);
if (ret)
return ret;
@@ -460,75 +213,39 @@ static int mwifiex_bss_ioctl_start(struct mwifiex_private *priv,
if (i >= 0) {
dev_dbg(adapter->dev, "info: network found in scan"
" list. Joining...\n");
- ret = mwifiex_adhoc_join(priv, wait,
- &adapter->scan_table[i]);
+ ret = mwifiex_adhoc_join(priv, &adapter->scan_table[i]);
if (ret)
return ret;
- } else { /* i >= 0 */
+ } else {
dev_dbg(adapter->dev, "info: Network not found in "
"the list, creating adhoc with ssid = %s\n",
ssid_bssid->ssid.ssid);
- ret = mwifiex_adhoc_start(priv, wait,
- &ssid_bssid->ssid);
+ ret = mwifiex_adhoc_start(priv, &ssid_bssid->ssid);
if (ret)
return ret;
}
}
- if (!ret)
- ret = -EINPROGRESS;
-
return ret;
}
/*
- * Sends IOCTL request to connect with a BSS.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int mwifiex_bss_start(struct mwifiex_private *priv, u8 wait_option,
- struct mwifiex_ssid_bssid *ssid_bssid)
-{
- struct mwifiex_wait_queue *wait = NULL;
- struct mwifiex_ssid_bssid tmp_ssid_bssid;
- int status = 0;
-
- /* Stop the O.S. TX queue if needed */
- if (!netif_queue_stopped(priv->netdev))
- netif_stop_queue(priv->netdev);
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- if (ssid_bssid)
- memcpy(&tmp_ssid_bssid, ssid_bssid,
- sizeof(struct mwifiex_ssid_bssid));
- status = mwifiex_bss_ioctl_start(priv, wait, &tmp_ssid_bssid);
-
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
-
- kfree(wait);
- return status;
-}
-
-/*
* IOCTL request handler to set host sleep configuration.
*
* This function prepares the correct firmware command and
* issues it.
*/
-static int
-mwifiex_pm_ioctl_hs_cfg(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u16 action, struct mwifiex_ds_hs_cfg *hs_cfg)
+int mwifiex_set_hs_params(struct mwifiex_private *priv, u16 action,
+ int cmd_type, struct mwifiex_ds_hs_cfg *hs_cfg)
+
{
struct mwifiex_adapter *adapter = priv->adapter;
int status = 0;
u32 prev_cond = 0;
+ if (!hs_cfg)
+ return -ENOMEM;
+
switch (action) {
case HostCmd_ACT_GEN_SET:
if (adapter->pps_uapsd_mode) {
@@ -561,12 +278,16 @@ mwifiex_pm_ioctl_hs_cfg(struct mwifiex_private *priv,
status = -1;
break;
}
- status = mwifiex_prepare_cmd(priv,
- HostCmd_CMD_802_11_HS_CFG_ENH,
- HostCmd_ACT_GEN_SET,
- 0, wait, &adapter->hs_cfg);
- if (!status)
- status = -EINPROGRESS;
+ if (cmd_type == MWIFIEX_SYNC_CMD)
+ status = mwifiex_send_cmd_sync(priv,
+ HostCmd_CMD_802_11_HS_CFG_ENH,
+ HostCmd_ACT_GEN_SET, 0,
+ &adapter->hs_cfg);
+ else
+ status = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_HS_CFG_ENH,
+ HostCmd_ACT_GEN_SET, 0,
+ &adapter->hs_cfg);
if (hs_cfg->conditions == HOST_SLEEP_CFG_CANCEL)
/* Restore previous condition */
adapter->hs_cfg.conditions =
@@ -592,53 +313,20 @@ mwifiex_pm_ioctl_hs_cfg(struct mwifiex_private *priv,
}
/*
- * Sends IOCTL request to set Host Sleep parameters.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int mwifiex_set_hs_params(struct mwifiex_private *priv, u16 action,
- u8 wait_option,
- struct mwifiex_ds_hs_cfg *hscfg)
-{
- int ret = 0;
- struct mwifiex_wait_queue *wait = NULL;
-
- if (!hscfg)
- return -ENOMEM;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- ret = mwifiex_pm_ioctl_hs_cfg(priv, wait, action, hscfg);
-
- ret = mwifiex_request_ioctl(priv, wait, ret, wait_option);
-
- if (wait && (ret != -EINPROGRESS))
- kfree(wait);
- return ret;
-}
-
-/*
* Sends IOCTL request to cancel the existing Host Sleep configuration.
*
* This function allocates the IOCTL request buffer, fills it
* with requisite parameters and calls the IOCTL handler.
*/
-int mwifiex_cancel_hs(struct mwifiex_private *priv, u8 wait_option)
+int mwifiex_cancel_hs(struct mwifiex_private *priv, int cmd_type)
{
- int ret = 0;
struct mwifiex_ds_hs_cfg hscfg;
- /* Cancel Host Sleep */
hscfg.conditions = HOST_SLEEP_CFG_CANCEL;
hscfg.is_invoke_hostcmd = true;
- ret = mwifiex_set_hs_params(priv, HostCmd_ACT_GEN_SET,
- wait_option, &hscfg);
- return ret;
+ return mwifiex_set_hs_params(priv, HostCmd_ACT_GEN_SET,
+ cmd_type, &hscfg);
}
EXPORT_SYMBOL_GPL(mwifiex_cancel_hs);
@@ -657,7 +345,6 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter)
return true;
}
- /* Enable Host Sleep */
adapter->hs_activate_wait_q_woken = false;
memset(&hscfg, 0, sizeof(struct mwifiex_hs_config_param));
@@ -665,8 +352,8 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter)
if (mwifiex_set_hs_params(mwifiex_get_priv(adapter,
MWIFIEX_BSS_ROLE_STA),
- HostCmd_ACT_GEN_SET,
- MWIFIEX_IOCTL_WAIT, &hscfg)) {
+ HostCmd_ACT_GEN_SET, MWIFIEX_SYNC_CMD,
+ &hscfg)) {
dev_err(adapter->dev, "IOCTL request HS enable failed\n");
return false;
}
@@ -679,69 +366,6 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter)
EXPORT_SYMBOL_GPL(mwifiex_enable_hs);
/*
- * IOCTL request handler to get signal information.
- *
- * This function prepares the correct firmware command and
- * issues it to get the signal (RSSI) information.
- *
- * This only works in the connected mode.
- */
-static int mwifiex_get_info_signal(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- struct mwifiex_ds_get_signal *signal)
-{
- int ret = 0;
-
- if (!wait) {
- dev_err(priv->adapter->dev, "WAIT information is not present\n");
- return -1;
- }
-
- /* Signal info can be obtained only if connected */
- if (!priv->media_connected) {
- dev_dbg(priv->adapter->dev,
- "info: Can not get signal in disconnected state\n");
- return -1;
- }
-
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_RSSI_INFO,
- HostCmd_ACT_GEN_GET, 0, wait, signal);
-
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
-}
-
-/*
- * IOCTL request handler to get statistics.
- *
- * This function prepares the correct firmware command and
- * issues it to get the statistics (RSSI) information.
- */
-static int mwifiex_get_info_stats(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- struct mwifiex_ds_get_stats *log)
-{
- int ret = 0;
-
- if (!wait) {
- dev_err(priv->adapter->dev, "MWIFIEX IOCTL information is not present\n");
- return -1;
- }
-
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_GET_LOG,
- HostCmd_ACT_GEN_GET, 0, wait, log);
-
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
-}
-
-/*
* IOCTL request handler to get BSS information.
*
* This function collates the information from different driver structures
@@ -757,23 +381,17 @@ int mwifiex_get_bss_info(struct mwifiex_private *priv,
if (!info)
return -1;
- /* Get current BSS info */
bss_desc = &priv->curr_bss_params.bss_descriptor;
- /* BSS mode */
info->bss_mode = priv->bss_mode;
- /* SSID */
memcpy(&info->ssid, &bss_desc->ssid,
sizeof(struct mwifiex_802_11_ssid));
- /* BSSID */
memcpy(&info->bssid, &bss_desc->mac_address, ETH_ALEN);
- /* Channel */
info->bss_chan = bss_desc->channel;
- /* Region code */
info->region_code = adapter->region_code;
/* Scan table index if connected */
@@ -787,20 +405,15 @@ int mwifiex_get_bss_info(struct mwifiex_private *priv,
info->scan_table_idx = tbl_idx;
}
- /* Connection status */
info->media_connected = priv->media_connected;
- /* Tx power information */
info->max_power_level = priv->max_tx_power_level;
info->min_power_level = priv->min_tx_power_level;
- /* AdHoc state */
info->adhoc_state = priv->adhoc_state;
- /* Last beacon NF */
info->bcn_nf_last = priv->bcn_nf_last;
- /* wep status */
if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED)
info->wep_status = true;
else
@@ -813,90 +426,20 @@ int mwifiex_get_bss_info(struct mwifiex_private *priv,
}
/*
- * IOCTL request handler to get extended version information.
+ * The function sets band configurations.
*
- * This function prepares the correct firmware command and
- * issues it to get the extended version information.
- */
-static int mwifiex_get_info_ver_ext(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- struct mwifiex_ver_ext *ver_ext)
-{
- int ret = 0;
-
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_VERSION_EXT,
- HostCmd_ACT_GEN_GET, 0, wait, ver_ext);
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
-}
-
-/*
- * IOCTL request handler to set/get SNMP MIB parameters.
- *
- * This function prepares the correct firmware command and
- * issues it.
- *
- * Currently the following parameters are supported -
- * Set/get RTS Threshold
- * Set/get fragmentation threshold
- * Set/get retry count
- */
-int mwifiex_snmp_mib_ioctl(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u32 cmd_oid, u16 action, u32 *value)
-{
- int ret = 0;
-
- if (!value)
- return -1;
-
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB,
- action, cmd_oid, wait, value);
-
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
-}
-
-/*
- * IOCTL request handler to set/get band configurations.
- *
- * For SET operation, it performs extra checks to make sure the Ad-Hoc
+ * it performs extra checks to make sure the Ad-Hoc
* band and channel are compatible. Otherwise it returns an error.
*
- * For GET operation, this function retrieves the following information -
- * - Infra bands
- * - Ad-hoc band
- * - Ad-hoc channel
- * - Secondary channel offset
*/
-int mwifiex_radio_ioctl_band_cfg(struct mwifiex_private *priv,
- u16 action,
- struct mwifiex_ds_band_cfg *radio_cfg)
+int mwifiex_set_radio_band_cfg(struct mwifiex_private *priv,
+ struct mwifiex_ds_band_cfg *radio_cfg)
{
struct mwifiex_adapter *adapter = priv->adapter;
u8 infra_band = 0;
u8 adhoc_band = 0;
u32 adhoc_channel = 0;
- if (action == HostCmd_ACT_GEN_GET) {
- /* Infra Bands */
- radio_cfg->config_bands = adapter->config_bands;
- /* Adhoc Band */
- radio_cfg->adhoc_start_band = adapter->adhoc_start_band;
- /* Adhoc channel */
- radio_cfg->adhoc_channel = priv->adhoc_channel;
- /* Secondary channel offset */
- radio_cfg->sec_chan_offset = adapter->chan_offset;
- return 0;
- }
-
- /* For action = SET */
infra_band = (u8) radio_cfg->config_bands;
adhoc_band = (u8) radio_cfg->adhoc_start_band;
adhoc_channel = radio_cfg->adhoc_channel;
@@ -950,8 +493,8 @@ int mwifiex_radio_ioctl_band_cfg(struct mwifiex_private *priv,
* This function performs validity checking on channel/frequency
* compatibility and returns failure if not valid.
*/
-int mwifiex_bss_ioctl_channel(struct mwifiex_private *priv, u16 action,
- struct mwifiex_chan_freq_power *chan)
+int mwifiex_bss_set_channel(struct mwifiex_private *priv,
+ struct mwifiex_chan_freq_power *chan)
{
struct mwifiex_adapter *adapter = priv->adapter;
struct mwifiex_chan_freq_power *cfp = NULL;
@@ -959,16 +502,6 @@ int mwifiex_bss_ioctl_channel(struct mwifiex_private *priv, u16 action,
if (!chan)
return -1;
- if (action == HostCmd_ACT_GEN_GET) {
- cfp = mwifiex_get_cfp_by_band_and_channel_from_cfg80211(priv,
- priv->curr_bss_params.band,
- (u16) priv->curr_bss_params.bss_descriptor.
- channel);
- chan->channel = cfp->channel;
- chan->freq = cfp->freq;
-
- return 0;
- }
if (!chan->channel && !chan->freq)
return -1;
if (adapter->adhoc_start_band & BAND_AN)
@@ -1024,27 +557,19 @@ int mwifiex_bss_ioctl_channel(struct mwifiex_private *priv, u16 action,
* issues it to set or get the ad-hoc channel.
*/
static int mwifiex_bss_ioctl_ibss_channel(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
u16 action, u16 *channel)
{
- int ret = 0;
-
if (action == HostCmd_ACT_GEN_GET) {
if (!priv->media_connected) {
*channel = priv->adhoc_channel;
- return ret;
+ return 0;
}
} else {
priv->adhoc_channel = (u8) *channel;
}
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_RF_CHANNEL,
- action, 0, wait, channel);
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
+ return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_RF_CHANNEL,
+ action, 0, channel);
}
/*
@@ -1054,11 +579,9 @@ static int mwifiex_bss_ioctl_ibss_channel(struct mwifiex_private *priv,
* these are provided, just the best BSS (best RSSI) is returned.
*/
int mwifiex_bss_ioctl_find_bss(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
struct mwifiex_ssid_bssid *ssid_bssid)
{
struct mwifiex_adapter *adapter = priv->adapter;
- int ret = 0;
struct mwifiex_bssdescriptor *bss_desc;
u8 zero_mac[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 };
u8 mac[ETH_ALEN];
@@ -1087,10 +610,10 @@ int mwifiex_bss_ioctl_find_bss(struct mwifiex_private *priv,
bss_desc = &adapter->scan_table[i];
memcpy(ssid_bssid->bssid, bss_desc->mac_address, ETH_ALEN);
} else {
- ret = mwifiex_find_best_network(priv, ssid_bssid);
+ return mwifiex_find_best_network(priv, ssid_bssid);
}
- return ret;
+ return 0;
}
/*
@@ -1114,10 +637,7 @@ int
mwifiex_drv_change_adhoc_chan(struct mwifiex_private *priv, int channel)
{
int ret = 0;
- int status = 0;
struct mwifiex_bss_info bss_info;
- struct mwifiex_wait_queue *wait = NULL;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
struct mwifiex_ssid_bssid ssid_bssid;
u16 curr_chan = 0;
@@ -1127,19 +647,10 @@ mwifiex_drv_change_adhoc_chan(struct mwifiex_private *priv, int channel)
if (mwifiex_get_bss_info(priv, &bss_info))
return -1;
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
/* Get current channel */
- status = mwifiex_bss_ioctl_ibss_channel(priv, wait, HostCmd_ACT_GEN_GET,
- &curr_chan);
+ ret = mwifiex_bss_ioctl_ibss_channel(priv, HostCmd_ACT_GEN_GET,
+ &curr_chan);
- if (mwifiex_request_ioctl(priv, wait, status, wait_option)) {
- ret = -1;
- goto done;
- }
if (curr_chan == channel) {
ret = 0;
goto done;
@@ -1154,23 +665,13 @@ mwifiex_drv_change_adhoc_chan(struct mwifiex_private *priv, int channel)
/* Do disonnect */
memset(&ssid_bssid, 0, ETH_ALEN);
- status = mwifiex_bss_ioctl_stop(priv, wait, ssid_bssid.bssid);
-
- if (mwifiex_request_ioctl(priv, wait, status, wait_option)) {
- ret = -1;
- goto done;
- }
+ ret = mwifiex_deauthenticate(priv, ssid_bssid.bssid);
- status = mwifiex_bss_ioctl_ibss_channel(priv, wait, HostCmd_ACT_GEN_SET,
- (u16 *) &channel);
-
- if (mwifiex_request_ioctl(priv, wait, status, wait_option)) {
- ret = -1;
- goto done;
- }
+ ret = mwifiex_bss_ioctl_ibss_channel(priv, HostCmd_ACT_GEN_SET,
+ (u16 *) &channel);
/* Do specific SSID scanning */
- if (mwifiex_request_scan(priv, wait_option, &bss_info.ssid)) {
+ if (mwifiex_request_scan(priv, &bss_info.ssid)) {
ret = -1;
goto done;
}
@@ -1179,13 +680,8 @@ mwifiex_drv_change_adhoc_chan(struct mwifiex_private *priv, int channel)
memcpy(&ssid_bssid.ssid, &bss_info.ssid,
sizeof(struct mwifiex_802_11_ssid));
- status = mwifiex_bss_ioctl_start(priv, wait, &ssid_bssid);
-
- if (mwifiex_request_ioctl(priv, wait, status, wait_option))
- ret = -1;
-
+ ret = mwifiex_bss_start(priv, &ssid_bssid);
done:
- kfree(wait);
return ret;
}
@@ -1198,11 +694,9 @@ done:
* for the band.
*/
static int mwifiex_rate_ioctl_get_rate_value(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
struct mwifiex_rate_cfg *rate_cfg)
{
struct mwifiex_adapter *adapter = priv->adapter;
- int ret = 0;
rate_cfg->is_rate_auto = priv->is_data_rate_auto;
if (!priv->media_connected) {
@@ -1241,15 +735,12 @@ static int mwifiex_rate_ioctl_get_rate_value(struct mwifiex_private *priv,
break;
}
} else {
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv,
- HostCmd_CMD_802_11_TX_RATE_QUERY,
- HostCmd_ACT_GEN_GET, 0, wait, NULL);
- if (!ret)
- ret = -EINPROGRESS;
+ return mwifiex_send_cmd_sync(priv,
+ HostCmd_CMD_802_11_TX_RATE_QUERY,
+ HostCmd_ACT_GEN_GET, 0, NULL);
}
- return ret;
+ return 0;
}
/*
@@ -1261,7 +752,6 @@ static int mwifiex_rate_ioctl_get_rate_value(struct mwifiex_private *priv,
* The function also performs validation checking on the supplied value.
*/
static int mwifiex_rate_ioctl_set_rate_value(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
struct mwifiex_rate_cfg *rate_cfg)
{
u8 rates[MWIFIEX_SUPPORTED_RATES];
@@ -1299,8 +789,7 @@ static int mwifiex_rate_ioctl_set_rate_value(struct mwifiex_private *priv,
}
memset(bitmap_rates, 0, sizeof(bitmap_rates));
- rate_index =
- mwifiex_data_rate_to_index(adapter, rate_cfg->rate);
+ rate_index = mwifiex_data_rate_to_index(rate_cfg->rate);
/* Only allow b/g rates to be set */
if (rate_index >= MWIFIEX_RATE_INDEX_HRDSSS0 &&
@@ -1315,11 +804,8 @@ static int mwifiex_rate_ioctl_set_rate_value(struct mwifiex_private *priv,
}
}
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_TX_RATE_CFG,
- HostCmd_ACT_GEN_SET, 0, wait, bitmap_rates);
- if (!ret)
- ret = -EINPROGRESS;
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_TX_RATE_CFG,
+ HostCmd_ACT_GEN_SET, 0, bitmap_rates);
return ret;
}
@@ -1331,7 +817,6 @@ static int mwifiex_rate_ioctl_set_rate_value(struct mwifiex_private *priv,
* rate index.
*/
static int mwifiex_rate_ioctl_cfg(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
struct mwifiex_rate_cfg *rate_cfg)
{
int status = 0;
@@ -1340,11 +825,9 @@ static int mwifiex_rate_ioctl_cfg(struct mwifiex_private *priv,
return -1;
if (rate_cfg->action == HostCmd_ACT_GEN_GET)
- status = mwifiex_rate_ioctl_get_rate_value(
- priv, wait, rate_cfg);
+ status = mwifiex_rate_ioctl_get_rate_value(priv, rate_cfg);
else
- status = mwifiex_rate_ioctl_set_rate_value(
- priv, wait, rate_cfg);
+ status = mwifiex_rate_ioctl_set_rate_value(priv, rate_cfg);
return status;
}
@@ -1359,30 +842,21 @@ int mwifiex_drv_get_data_rate(struct mwifiex_private *priv,
struct mwifiex_rate_cfg *rate)
{
int ret = 0;
- struct mwifiex_wait_queue *wait = NULL;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
memset(rate, 0, sizeof(struct mwifiex_rate_cfg));
rate->action = HostCmd_ACT_GEN_GET;
- ret = mwifiex_rate_ioctl_cfg(priv, wait, rate);
+ ret = mwifiex_rate_ioctl_cfg(priv, rate);
- ret = mwifiex_request_ioctl(priv, wait, ret, wait_option);
if (!ret) {
if (rate && rate->is_rate_auto)
- rate->rate = mwifiex_index_to_data_rate(priv->adapter,
- priv->tx_rate, priv->tx_htinfo);
+ rate->rate = mwifiex_index_to_data_rate(priv->tx_rate,
+ priv->tx_htinfo);
else if (rate)
rate->rate = priv->data_rate;
} else {
ret = -1;
}
- kfree(wait);
return ret;
}
@@ -1398,9 +872,8 @@ int mwifiex_drv_get_data_rate(struct mwifiex_private *priv,
* - Modulation class HTBW20
* - Modulation class HTBW40
*/
-static int mwifiex_power_ioctl_set_power(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- struct mwifiex_power_cfg *power_cfg)
+int mwifiex_set_tx_power(struct mwifiex_private *priv,
+ struct mwifiex_power_cfg *power_cfg)
{
int ret = 0;
struct host_cmd_ds_txpwr_cfg *txp_cfg = NULL;
@@ -1472,13 +945,10 @@ static int mwifiex_power_ioctl_set_power(struct mwifiex_private *priv,
pg->power_max = (s8) dbm;
pg->ht_bandwidth = HT_BW_40;
}
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_TXPWR_CFG,
- HostCmd_ACT_GEN_SET, 0, wait, buf);
- if (!ret)
- ret = -EINPROGRESS;
- kfree(buf);
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_TXPWR_CFG,
+ HostCmd_ACT_GEN_SET, 0, buf);
+ kfree(buf);
return ret;
}
@@ -1488,33 +958,23 @@ static int mwifiex_power_ioctl_set_power(struct mwifiex_private *priv,
* This function prepares the correct firmware command and
* issues it.
*/
-static int mwifiex_pm_ioctl_ps_mode(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u32 *ps_mode, u16 action)
+int mwifiex_drv_set_power(struct mwifiex_private *priv, u32 *ps_mode)
{
int ret = 0;
struct mwifiex_adapter *adapter = priv->adapter;
u16 sub_cmd;
- if (action == HostCmd_ACT_GEN_SET) {
- if (*ps_mode)
- adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
- else
- adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_CAM;
- sub_cmd = (*ps_mode) ? EN_AUTO_PS : DIS_AUTO_PS;
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_PS_MODE_ENH,
- sub_cmd, BITMAP_STA_PS, wait, NULL);
- if ((!ret) && (sub_cmd == DIS_AUTO_PS))
- ret = mwifiex_prepare_cmd(priv,
- HostCmd_CMD_802_11_PS_MODE_ENH, GET_PS,
- 0, NULL, NULL);
- } else {
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_PS_MODE_ENH,
- GET_PS, 0, wait, NULL);
- }
-
- if (!ret)
- ret = -EINPROGRESS;
+ if (*ps_mode)
+ adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
+ else
+ adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_CAM;
+ sub_cmd = (*ps_mode) ? EN_AUTO_PS : DIS_AUTO_PS;
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_PS_MODE_ENH,
+ sub_cmd, BITMAP_STA_PS, NULL);
+ if ((!ret) && (sub_cmd == DIS_AUTO_PS))
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_PS_MODE_ENH, GET_PS,
+ 0, NULL);
return ret;
}
@@ -1600,20 +1060,13 @@ static int mwifiex_set_wapi_ie(struct mwifiex_private *priv,
* This function prepares the correct firmware command and
* issues it.
*/
-static int mwifiex_sec_ioctl_set_wapi_key(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait,
+static int mwifiex_sec_ioctl_set_wapi_key(struct mwifiex_private *priv,
struct mwifiex_ds_encrypt_key *encrypt_key)
{
- int ret = 0;
- struct mwifiex_private *priv = adapter->priv[wait->bss_index];
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
- HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED,
- wait, encrypt_key);
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
+ return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
+ HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED,
+ encrypt_key);
}
/*
@@ -1622,12 +1075,10 @@ static int mwifiex_sec_ioctl_set_wapi_key(struct mwifiex_adapter *adapter,
* This function prepares the correct firmware command and
* issues it, after validation checks.
*/
-static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait,
+static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_private *priv,
struct mwifiex_ds_encrypt_key *encrypt_key)
{
int ret = 0;
- struct mwifiex_private *priv = adapter->priv[wait->bss_index];
struct mwifiex_wep_key *wep_key = NULL;
int index;
@@ -1641,7 +1092,7 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_adapter *adapter,
/* Copy the required key as the current key */
wep_key = &priv->wep_key[index];
if (!wep_key->key_length) {
- dev_err(adapter->dev,
+ dev_err(priv->adapter->dev,
"key not set, so cannot enable it\n");
return -1;
}
@@ -1649,7 +1100,6 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_adapter *adapter,
priv->sec_info.wep_status = MWIFIEX_802_11_WEP_ENABLED;
} else {
wep_key = &priv->wep_key[index];
- /* Cleanup */
memset(wep_key, 0, sizeof(struct mwifiex_wep_key));
/* Copy the key in the driver */
memcpy(wep_key->key_material,
@@ -1661,8 +1111,9 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_adapter *adapter,
}
if (wep_key->key_length) {
/* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
- HostCmd_ACT_GEN_SET, 0, NULL, NULL);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_KEY_MATERIAL,
+ HostCmd_ACT_GEN_SET, 0, NULL);
if (ret)
return ret;
}
@@ -1671,12 +1122,9 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_adapter *adapter,
else
priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_WEP_ENABLE;
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_MAC_CONTROL,
- HostCmd_ACT_GEN_SET, 0, wait,
- &priv->curr_pkt_filter);
- if (!ret)
- ret = -EINPROGRESS;
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_MAC_CONTROL,
+ HostCmd_ACT_GEN_SET, 0,
+ &priv->curr_pkt_filter);
return ret;
}
@@ -1691,18 +1139,16 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_adapter *adapter,
*
* This function can also be used to disable a currently set key.
*/
-static int mwifiex_sec_ioctl_set_wpa_key(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait,
+static int mwifiex_sec_ioctl_set_wpa_key(struct mwifiex_private *priv,
struct mwifiex_ds_encrypt_key *encrypt_key)
{
int ret = 0;
- struct mwifiex_private *priv = adapter->priv[wait->bss_index];
u8 remove_key = false;
struct host_cmd_ds_802_11_key_material *ibss_key;
/* Current driver only supports key length of up to 32 bytes */
- if (encrypt_key->key_len > MWIFIEX_MAX_KEY_LENGTH) {
- dev_err(adapter->dev, "key length too long\n");
+ if (encrypt_key->key_len > WLAN_MAX_KEY_LEN) {
+ dev_err(priv->adapter->dev, "key length too long\n");
return -1;
}
@@ -1713,9 +1159,10 @@ static int mwifiex_sec_ioctl_set_wpa_key(struct mwifiex_adapter *adapter,
*/
/* Send the key as PTK to firmware */
encrypt_key->key_index = MWIFIEX_KEY_INDEX_UNICAST;
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
- HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED,
- NULL, encrypt_key);
+ ret = mwifiex_send_cmd_async(priv,
+ HostCmd_CMD_802_11_KEY_MATERIAL,
+ HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED,
+ encrypt_key);
if (ret)
return ret;
@@ -1729,8 +1176,7 @@ static int mwifiex_sec_ioctl_set_wpa_key(struct mwifiex_adapter *adapter,
sizeof(ibss_key->key_param_set.key_len));
ibss_key->key_param_set.key_type_id
= cpu_to_le16(KEY_TYPE_ID_TKIP);
- ibss_key->key_param_set.key_info
- = cpu_to_le16(KEY_INFO_TKIP_ENABLED);
+ ibss_key->key_param_set.key_info = cpu_to_le16(KEY_ENABLED);
/* Send the key as GTK to firmware */
encrypt_key->key_index = ~MWIFIEX_KEY_INDEX_UNICAST;
@@ -1740,19 +1186,15 @@ static int mwifiex_sec_ioctl_set_wpa_key(struct mwifiex_adapter *adapter,
encrypt_key->key_index = MWIFIEX_KEY_INDEX_UNICAST;
if (remove_key)
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
- HostCmd_ACT_GEN_SET,
- !(KEY_INFO_ENABLED),
- wait, encrypt_key);
+ ret = mwifiex_send_cmd_sync(priv,
+ HostCmd_CMD_802_11_KEY_MATERIAL,
+ HostCmd_ACT_GEN_SET, !(KEY_INFO_ENABLED),
+ encrypt_key);
else
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
- HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED,
- wait, encrypt_key);
-
- if (!ret)
- ret = -EINPROGRESS;
+ ret = mwifiex_send_cmd_sync(priv,
+ HostCmd_CMD_802_11_KEY_MATERIAL,
+ HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED,
+ encrypt_key);
return ret;
}
@@ -1765,21 +1207,16 @@ static int mwifiex_sec_ioctl_set_wpa_key(struct mwifiex_adapter *adapter,
*/
static int
mwifiex_sec_ioctl_encrypt_key(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
struct mwifiex_ds_encrypt_key *encrypt_key)
{
int status = 0;
- struct mwifiex_adapter *adapter = priv->adapter;
if (encrypt_key->is_wapi_key)
- status = mwifiex_sec_ioctl_set_wapi_key(adapter, wait,
- encrypt_key);
+ status = mwifiex_sec_ioctl_set_wapi_key(priv, encrypt_key);
else if (encrypt_key->key_len > WLAN_KEY_LEN_WEP104)
- status = mwifiex_sec_ioctl_set_wpa_key(adapter, wait,
- encrypt_key);
+ status = mwifiex_sec_ioctl_set_wpa_key(priv, encrypt_key);
else
- status = mwifiex_sec_ioctl_set_wep_key(adapter, wait,
- encrypt_key);
+ status = mwifiex_sec_ioctl_set_wep_key(priv, encrypt_key);
return status;
}
@@ -1807,94 +1244,30 @@ mwifiex_drv_get_driver_version(struct mwifiex_adapter *adapter, char *version,
}
/*
- * Sends IOCTL request to set Tx power. It can be set to either auto
- * or a fixed value.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int
-mwifiex_set_tx_power(struct mwifiex_private *priv, int type, int dbm)
-{
- struct mwifiex_power_cfg power_cfg;
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
- int ret = 0;
-
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
-
- if (type == NL80211_TX_POWER_FIXED) {
- power_cfg.is_power_auto = 0;
- power_cfg.power_level = dbm;
- } else {
- power_cfg.is_power_auto = 1;
- }
- status = mwifiex_power_ioctl_set_power(priv, wait, &power_cfg);
-
- ret = mwifiex_request_ioctl(priv, wait, status, MWIFIEX_IOCTL_WAIT);
-
- kfree(wait);
- return ret;
-}
-
-/*
- * Sends IOCTL request to get scan table.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int mwifiex_get_scan_table(struct mwifiex_private *priv, u8 wait_option,
- struct mwifiex_scan_resp *scan_resp)
-{
- struct mwifiex_wait_queue *wait = NULL;
- struct mwifiex_scan_resp scan;
- int status = 0;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- status = mwifiex_scan_networks(priv, wait, HostCmd_ACT_GEN_GET,
- NULL, &scan);
-
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
- if (!status) {
- if (scan_resp)
- memcpy(scan_resp, &scan,
- sizeof(struct mwifiex_scan_resp));
- }
-
- if (wait && (status != -EINPROGRESS))
- kfree(wait);
- return status;
-}
-
-/*
* Sends IOCTL request to get signal information.
*
* This function allocates the IOCTL request buffer, fills it
* with requisite parameters and calls the IOCTL handler.
*/
-int mwifiex_get_signal_info(struct mwifiex_private *priv, u8 wait_option,
+int mwifiex_get_signal_info(struct mwifiex_private *priv,
struct mwifiex_ds_get_signal *signal)
{
struct mwifiex_ds_get_signal info;
- struct mwifiex_wait_queue *wait = NULL;
int status = 0;
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
+ memset(&info, 0, sizeof(struct mwifiex_ds_get_signal));
info.selector = ALL_RSSI_INFO_MASK;
- status = mwifiex_get_info_signal(priv, wait, &info);
+ /* Signal info can be obtained only if connected */
+ if (!priv->media_connected) {
+ dev_dbg(priv->adapter->dev,
+ "info: Can not get signal in disconnected state\n");
+ return -1;
+ }
+
+ status = mwifiex_send_cmd_sync(priv, HostCmd_CMD_RSSI_INFO,
+ HostCmd_ACT_GEN_GET, 0, signal);
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
if (!status) {
if (signal)
memcpy(signal, &info,
@@ -1905,8 +1278,6 @@ int mwifiex_get_signal_info(struct mwifiex_private *priv, u8 wait_option,
priv->w_stats.qual.noise = info.bcn_nf_avg;
}
- if (wait && (status != -EINPROGRESS))
- kfree(wait);
return status;
}
@@ -1919,14 +1290,7 @@ int mwifiex_get_signal_info(struct mwifiex_private *priv, u8 wait_option,
int mwifiex_set_encode(struct mwifiex_private *priv, const u8 *key,
int key_len, u8 key_index, int disable)
{
- struct mwifiex_wait_queue *wait = NULL;
struct mwifiex_ds_encrypt_key encrypt_key;
- int status = 0;
- int ret = 0;
-
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
memset(&encrypt_key, 0, sizeof(struct mwifiex_ds_encrypt_key));
encrypt_key.key_len = key_len;
@@ -1938,41 +1302,7 @@ int mwifiex_set_encode(struct mwifiex_private *priv, const u8 *key,
encrypt_key.key_disable = true;
}
- status = mwifiex_sec_ioctl_encrypt_key(priv, wait, &encrypt_key);
-
- if (mwifiex_request_ioctl(priv, wait, status, MWIFIEX_IOCTL_WAIT))
- ret = -EFAULT;
-
- kfree(wait);
- return ret;
-}
-
-/*
- * Sends IOCTL request to set power management parameters.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int
-mwifiex_drv_set_power(struct mwifiex_private *priv, bool power_on)
-{
- int ret = 0;
- int status = 0;
- struct mwifiex_wait_queue *wait = NULL;
- u32 ps_mode;
-
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
-
- ps_mode = power_on;
- status = mwifiex_pm_ioctl_ps_mode(priv, wait, &ps_mode,
- HostCmd_ACT_GEN_SET);
-
- ret = mwifiex_request_ioctl(priv, wait, status, MWIFIEX_IOCTL_WAIT);
-
- kfree(wait);
- return ret;
+ return mwifiex_sec_ioctl_encrypt_key(priv, &encrypt_key);
}
/*
@@ -1985,27 +1315,13 @@ int
mwifiex_get_ver_ext(struct mwifiex_private *priv)
{
struct mwifiex_ver_ext ver_ext;
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
- int ret = 0;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
-
- /* get fw version */
memset(&ver_ext, 0, sizeof(struct host_cmd_ds_version_ext));
- status = mwifiex_get_info_ver_ext(priv, wait, &ver_ext);
-
- ret = mwifiex_request_ioctl(priv, wait, status, wait_option);
-
- if (ret)
- ret = -1;
+ if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_VERSION_EXT,
+ HostCmd_ACT_GEN_GET, 0, &ver_ext))
+ return -1;
- kfree(wait);
- return ret;
+ return 0;
}
/*
@@ -2019,21 +1335,12 @@ mwifiex_get_stats_info(struct mwifiex_private *priv,
struct mwifiex_ds_get_stats *log)
{
int ret = 0;
- int status = 0;
- struct mwifiex_wait_queue *wait = NULL;
struct mwifiex_ds_get_stats get_log;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -ENOMEM;
memset(&get_log, 0, sizeof(struct mwifiex_ds_get_stats));
- status = mwifiex_get_info_stats(priv, wait, &get_log);
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_GET_LOG,
+ HostCmd_ACT_GEN_GET, 0, &get_log);
- /* Send IOCTL request to MWIFIEX */
- ret = mwifiex_request_ioctl(priv, wait, status, wait_option);
if (!ret) {
if (log)
memcpy(log, &get_log, sizeof(struct
@@ -2043,7 +1350,6 @@ mwifiex_get_stats_info(struct mwifiex_private *priv,
priv->w_stats.discard.misc = get_log.ack_failure;
}
- kfree(wait);
return ret;
}
@@ -2061,11 +1367,9 @@ mwifiex_get_stats_info(struct mwifiex_private *priv,
* - CAU
*/
static int mwifiex_reg_mem_ioctl_reg_rw(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
struct mwifiex_ds_reg_rw *reg_rw,
u16 action)
{
- int ret = 0;
u16 cmd_no;
switch (le32_to_cpu(reg_rw->type)) {
@@ -2088,13 +1392,8 @@ static int mwifiex_reg_mem_ioctl_reg_rw(struct mwifiex_private *priv,
return -1;
}
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, cmd_no, action, 0, wait, reg_rw);
-
- if (!ret)
- ret = -EINPROGRESS;
+ return mwifiex_send_cmd_sync(priv, cmd_no, action, 0, reg_rw);
- return ret;
}
/*
@@ -2107,25 +1406,13 @@ int
mwifiex_reg_write(struct mwifiex_private *priv, u32 reg_type,
u32 reg_offset, u32 reg_value)
{
- int ret = 0;
- int status = 0;
- struct mwifiex_wait_queue *wait = NULL;
struct mwifiex_ds_reg_rw reg_rw;
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
-
reg_rw.type = cpu_to_le32(reg_type);
reg_rw.offset = cpu_to_le32(reg_offset);
reg_rw.value = cpu_to_le32(reg_value);
- status = mwifiex_reg_mem_ioctl_reg_rw(priv, wait, &reg_rw,
- HostCmd_ACT_GEN_SET);
-
- ret = mwifiex_request_ioctl(priv, wait, status, MWIFIEX_IOCTL_WAIT);
- kfree(wait);
- return ret;
+ return mwifiex_reg_mem_ioctl_reg_rw(priv, &reg_rw, HostCmd_ACT_GEN_SET);
}
/*
@@ -2139,50 +1426,18 @@ mwifiex_reg_read(struct mwifiex_private *priv, u32 reg_type,
u32 reg_offset, u32 *value)
{
int ret = 0;
- int status = 0;
- struct mwifiex_wait_queue *wait = NULL;
struct mwifiex_ds_reg_rw reg_rw;
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
-
reg_rw.type = cpu_to_le32(reg_type);
reg_rw.offset = cpu_to_le32(reg_offset);
- status = mwifiex_reg_mem_ioctl_reg_rw(priv, wait, &reg_rw,
- HostCmd_ACT_GEN_GET);
+ ret = mwifiex_reg_mem_ioctl_reg_rw(priv, &reg_rw, HostCmd_ACT_GEN_GET);
- ret = mwifiex_request_ioctl(priv, wait, status, MWIFIEX_IOCTL_WAIT);
if (ret)
goto done;
*value = le32_to_cpu(reg_rw.value);
done:
- kfree(wait);
- return ret;
-}
-
-/*
- * IOCTL request handler to read EEPROM.
- *
- * This function prepares the correct firmware command and
- * issues it.
- */
-static int
-mwifiex_reg_mem_ioctl_read_eeprom(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- struct mwifiex_ds_read_eeprom *rd_eeprom)
-{
- int ret = 0;
-
- /* Send request to firmware */
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_802_11_EEPROM_ACCESS,
- HostCmd_ACT_GEN_GET, 0, wait, rd_eeprom);
-
- if (!ret)
- ret = -EINPROGRESS;
-
return ret;
}
@@ -2197,25 +1452,17 @@ mwifiex_eeprom_read(struct mwifiex_private *priv, u16 offset, u16 bytes,
u8 *value)
{
int ret = 0;
- int status = 0;
- struct mwifiex_wait_queue *wait = NULL;
struct mwifiex_ds_read_eeprom rd_eeprom;
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
-
rd_eeprom.offset = cpu_to_le16((u16) offset);
rd_eeprom.byte_count = cpu_to_le16((u16) bytes);
- status = mwifiex_reg_mem_ioctl_read_eeprom(priv, wait, &rd_eeprom);
- ret = mwifiex_request_ioctl(priv, wait, status, MWIFIEX_IOCTL_WAIT);
- if (ret)
- goto done;
+ /* Send request to firmware */
+ ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_EEPROM_ACCESS,
+ HostCmd_ACT_GEN_GET, 0, &rd_eeprom);
- memcpy(value, rd_eeprom.value, MAX_EEPROM_DATA);
-done:
- kfree(wait);
+ if (!ret)
+ memcpy(value, rd_eeprom.value, MAX_EEPROM_DATA);
return ret;
}
@@ -2344,7 +1591,6 @@ int
mwifiex_set_gen_ie(struct mwifiex_private *priv, u8 *ie, int ie_len)
{
struct mwifiex_ds_misc_gen_ie gen_ie;
- int status = 0;
if (ie_len > IW_CUSTOM_MAX)
return -EFAULT;
@@ -2352,8 +1598,7 @@ mwifiex_set_gen_ie(struct mwifiex_private *priv, u8 *ie, int ie_len)
gen_ie.type = MWIFIEX_IE_TYPE_GEN_IE;
gen_ie.len = ie_len;
memcpy(gen_ie.ie_data, ie, ie_len);
- status = mwifiex_misc_ioctl_gen_ie(priv, &gen_ie, HostCmd_ACT_GEN_SET);
- if (status)
+ if (mwifiex_misc_ioctl_gen_ie(priv, &gen_ie, HostCmd_ACT_GEN_SET))
return -EFAULT;
return 0;
diff --git a/drivers/net/wireless/mwifiex/sta_tx.c b/drivers/net/wireless/mwifiex/sta_tx.c
index e8db6bd021c6..5d37ef160121 100644
--- a/drivers/net/wireless/mwifiex/sta_tx.c
+++ b/drivers/net/wireless/mwifiex/sta_tx.c
@@ -51,7 +51,7 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv,
if (!skb->len) {
dev_err(adapter->dev, "Tx: bad packet length: %d\n",
skb->len);
- tx_info->status_code = MWIFIEX_ERROR_PKT_SIZE_INVALID;
+ tx_info->status_code = -1;
return skb->data;
}
@@ -180,15 +180,11 @@ mwifiex_check_last_packet_indication(struct mwifiex_private *priv)
{
struct mwifiex_adapter *adapter = priv->adapter;
u8 ret = false;
- u8 prop_ps = true;
if (!adapter->sleep_period.period)
return ret;
- if (mwifiex_wmm_lists_empty(adapter)) {
- if ((priv->curr_bss_params.wmm_uapsd_enabled &&
- priv->wmm_qosinfo) || prop_ps)
+ if (mwifiex_wmm_lists_empty(adapter))
ret = true;
- }
if (ret && !adapter->cmd_sent && !adapter->curr_cmd
&& !is_command_pending(adapter)) {
diff --git a/drivers/net/wireless/mwifiex/txrx.c b/drivers/net/wireless/mwifiex/txrx.c
index f06923cb1c4b..ce772e078db8 100644
--- a/drivers/net/wireless/mwifiex/txrx.c
+++ b/drivers/net/wireless/mwifiex/txrx.c
@@ -36,7 +36,6 @@
int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,
struct sk_buff *skb)
{
- int ret = 0;
struct mwifiex_private *priv =
mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
struct rxpd *local_rx_pd;
@@ -50,9 +49,8 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,
priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
rx_info->bss_index = priv->bss_index;
- ret = mwifiex_process_sta_rx_packet(adapter, skb);
- return ret;
+ return mwifiex_process_sta_rx_packet(adapter, skb);
}
EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c
index 205022aa52f5..7ab4fb279f8a 100644
--- a/drivers/net/wireless/mwifiex/util.c
+++ b/drivers/net/wireless/mwifiex/util.c
@@ -55,18 +55,12 @@ int mwifiex_shutdown_fw_complete(struct mwifiex_adapter *adapter)
}
/*
- * IOCTL request handler to send function init/shutdown command
+ * This function sends init/shutdown command
* to firmware.
- *
- * This function prepares the correct firmware command and
- * issues it.
*/
-int mwifiex_misc_ioctl_init_shutdown(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait,
- u32 func_init_shutdown)
+int mwifiex_init_shutdown_fw(struct mwifiex_private *priv,
+ u32 func_init_shutdown)
{
- struct mwifiex_private *priv = adapter->priv[wait->bss_index];
- int ret;
u16 cmd;
if (func_init_shutdown == MWIFIEX_FUNC_INIT) {
@@ -74,19 +68,13 @@ int mwifiex_misc_ioctl_init_shutdown(struct mwifiex_adapter *adapter,
} else if (func_init_shutdown == MWIFIEX_FUNC_SHUTDOWN) {
cmd = HostCmd_CMD_FUNC_SHUTDOWN;
} else {
- dev_err(adapter->dev, "unsupported parameter\n");
+ dev_err(priv->adapter->dev, "unsupported parameter\n");
return -1;
}
- /* Send command to firmware */
- ret = mwifiex_prepare_cmd(priv, cmd, HostCmd_ACT_GEN_SET,
- 0, wait, NULL);
-
- if (!ret)
- ret = -EINPROGRESS;
-
- return ret;
+ return mwifiex_send_cmd_sync(priv, cmd, HostCmd_ACT_GEN_SET, 0, NULL);
}
+EXPORT_SYMBOL_GPL(mwifiex_init_shutdown_fw);
/*
* IOCTL request handler to set/get debug information.
@@ -222,31 +210,18 @@ int mwifiex_recv_complete(struct mwifiex_adapter *adapter,
* corresponding waiting function. Otherwise, it processes the
* IOCTL response and frees the response buffer.
*/
-int mwifiex_ioctl_complete(struct mwifiex_adapter *adapter,
- struct mwifiex_wait_queue *wait_queue,
- int status)
+int mwifiex_complete_cmd(struct mwifiex_adapter *adapter)
{
- enum mwifiex_error_code status_code =
- (enum mwifiex_error_code) wait_queue->status;
-
- atomic_dec(&adapter->ioctl_pending);
+ atomic_dec(&adapter->cmd_pending);
+ dev_dbg(adapter->dev, "cmd completed: status=%d\n",
+ adapter->cmd_wait_q.status);
- dev_dbg(adapter->dev, "cmd: IOCTL completed: status=%d,"
- " status_code=%#x\n", status, status_code);
+ adapter->cmd_wait_q.condition = true;
- if (wait_queue->enabled) {
- *wait_queue->condition = true;
- wait_queue->status = status;
- if (status && (status_code == MWIFIEX_ERROR_CMD_TIMEOUT))
- dev_err(adapter->dev, "cmd timeout\n");
- else
- wake_up_interruptible(wait_queue->wait);
- } else {
- if (status)
- dev_err(adapter->dev, "cmd failed: status_code=%#x\n",
- status_code);
- kfree(wait_queue);
- }
+ if (adapter->cmd_wait_q.status == -ETIMEDOUT)
+ dev_err(adapter->dev, "cmd timeout\n");
+ else
+ wake_up_interruptible(&adapter->cmd_wait_q.wait);
return 0;
}
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c
index 1cfbc6bed692..c009370f309e 100644
--- a/drivers/net/wireless/mwifiex/wmm.c
+++ b/drivers/net/wireless/mwifiex/wmm.c
@@ -177,8 +177,7 @@ static void mwifiex_wmm_default_queue_priorities(struct mwifiex_private *priv)
* This function map ACs to TIDs.
*/
static void
-mwifiex_wmm_queue_priorities_tid(struct mwifiex_private *priv,
- u8 queue_priority[])
+mwifiex_wmm_queue_priorities_tid(u8 queue_priority[])
{
int i;
@@ -247,7 +246,7 @@ mwifiex_wmm_setup_queue_priorities(struct mwifiex_private *priv,
}
}
- mwifiex_wmm_queue_priorities_tid(priv, priv->wmm.queue_priority);
+ mwifiex_wmm_queue_priorities_tid(priv->wmm.queue_priority);
}
/*
@@ -416,7 +415,7 @@ mwifiex_wmm_lists_empty(struct mwifiex_adapter *adapter)
priv = adapter->priv[j];
if (priv) {
for (i = 0; i < MAX_NUM_TID; i++)
- if (!mwifiex_wmm_is_ra_list_empty(adapter,
+ if (!mwifiex_wmm_is_ra_list_empty(
&priv->wmm.tid_tbl_ptr[i].ra_list))
return false;
}
@@ -974,7 +973,6 @@ mwifiex_send_single_packet(struct mwifiex_private *priv,
struct sk_buff *skb, *skb_next;
struct mwifiex_tx_param tx_param;
struct mwifiex_adapter *adapter = priv->adapter;
- int status = 0;
struct mwifiex_txinfo *tx_info;
if (skb_queue_empty(&ptr->skb_head)) {
@@ -1001,9 +999,7 @@ mwifiex_send_single_packet(struct mwifiex_private *priv,
tx_param.next_pkt_len = ((skb_next) ? skb_next->len +
sizeof(struct txpd) : 0);
- status = mwifiex_process_tx(priv, skb, &tx_param);
-
- if (status == -EBUSY) {
+ if (mwifiex_process_tx(priv, skb, &tx_param) == -EBUSY) {
/* Queue the packet back at the head */
spin_lock_irqsave(&priv->wmm.ra_list_spinlock, ra_list_flags);
@@ -1161,7 +1157,7 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
if (!ptr)
return -1;
- tid = mwifiex_get_tid(priv->adapter, ptr);
+ tid = mwifiex_get_tid(ptr);
dev_dbg(adapter->dev, "data: tid=%d\n", tid);
@@ -1186,14 +1182,14 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
/* ra_list_spinlock has been freed in
mwifiex_send_single_packet() */
} else {
- if (mwifiex_is_ampdu_allowed(priv, ptr, tid)) {
- if (mwifiex_is_ba_stream_avail(priv)) {
+ if (mwifiex_is_ampdu_allowed(priv, tid)) {
+ if (mwifiex_space_avail_for_new_ba_stream(adapter)) {
mwifiex_11n_create_tx_ba_stream_tbl(priv,
ptr->ra, tid,
BA_STREAM_SETUP_INPROGRESS);
mwifiex_send_addba(priv, tid, ptr->ra);
} else if (mwifiex_find_stream_to_delete
- (priv, ptr, tid, &tid_del, ra)) {
+ (priv, tid, &tid_del, ra)) {
mwifiex_11n_create_tx_ba_stream_tbl(priv,
ptr->ra, tid,
BA_STREAM_SETUP_INPROGRESS);
@@ -1202,7 +1198,7 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
}
/* Minimum number of AMSDU */
#define MIN_NUM_AMSDU 2
- if (mwifiex_is_amsdu_allowed(priv, ptr, tid) &&
+ if (mwifiex_is_amsdu_allowed(priv, tid) &&
(mwifiex_num_pkts_in_txq(priv, ptr, adapter->tx_buf_size) >=
MIN_NUM_AMSDU))
mwifiex_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN,
@@ -1232,6 +1228,4 @@ mwifiex_wmm_process_tx(struct mwifiex_adapter *adapter)
if (mwifiex_dequeue_tx_packet(adapter))
break;
} while (true);
-
- return;
}
diff --git a/drivers/net/wireless/mwifiex/wmm.h b/drivers/net/wireless/mwifiex/wmm.h
index 241f1b0b77f9..fcea1f68792f 100644
--- a/drivers/net/wireless/mwifiex/wmm.h
+++ b/drivers/net/wireless/mwifiex/wmm.h
@@ -35,8 +35,7 @@ enum ieee_types_wmm_ecw_bitmasks {
* This function retrieves the TID of the given RA list.
*/
static inline int
-mwifiex_get_tid(struct mwifiex_adapter *adapter,
- struct mwifiex_ra_list_tbl *ptr)
+mwifiex_get_tid(struct mwifiex_ra_list_tbl *ptr)
{
struct sk_buff *skb;
@@ -52,7 +51,7 @@ mwifiex_get_tid(struct mwifiex_adapter *adapter,
* This function gets the length of a list.
*/
static inline int
-mwifiex_wmm_list_len(struct mwifiex_adapter *adapter, struct list_head *head)
+mwifiex_wmm_list_len(struct list_head *head)
{
struct list_head *pos;
int count = 0;
@@ -67,8 +66,7 @@ mwifiex_wmm_list_len(struct mwifiex_adapter *adapter, struct list_head *head)
* This function checks if a RA list is empty or not.
*/
static inline u8
-mwifiex_wmm_is_ra_list_empty(struct mwifiex_adapter *adapter,
- struct list_head *ra_list_hhead)
+mwifiex_wmm_is_ra_list_empty(struct list_head *ra_list_hhead)
{
struct mwifiex_ra_list_tbl *ra_list;
int is_list_empty;
OpenPOWER on IntegriCloud