aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStone Piao <piaoyun@marvell.com>2012-09-25 23:23:39 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-09-28 13:54:05 -0400
commit7bff9c974e1a70819c30c37d8ec0d84d456f8237 (patch)
treefc3780c2238bedcf5c37c1a682c9614e2028553e
parentea021f56009207e8023c1c4ac4939be3dbe80dbf (diff)
mwifiex: send firmware initialization commands synchronously
The driver will send some commands to firmware during the initialization. Currently these commands are sent asynchronously, which means that we firstly insert all of them to a pre-allocated command queue, and then start to process them one by one. The command queue will soon be exhausted if we keep adding new initialization commands. This issue can be resolved by sending initialization commands synchronously because each command is consumed and the buffer is recycled before queuing next command. Signed-off-by: Stone Piao <piaoyun@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmd.c65
1 files changed, 33 insertions, 32 deletions
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c
index 025244639bfc..c2198a798b9f 100644
--- a/drivers/net/wireless/mwifiex/sta_cmd.c
+++ b/drivers/net/wireless/mwifiex/sta_cmd.c
@@ -1302,35 +1302,35 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1302 1302
1303 if (first_sta) { 1303 if (first_sta) {
1304 if (priv->adapter->iface_type == MWIFIEX_PCIE) { 1304 if (priv->adapter->iface_type == MWIFIEX_PCIE) {
1305 ret = mwifiex_send_cmd_async(priv, 1305 ret = mwifiex_send_cmd_sync(priv,
1306 HostCmd_CMD_PCIE_DESC_DETAILS, 1306 HostCmd_CMD_PCIE_DESC_DETAILS,
1307 HostCmd_ACT_GEN_SET, 0, NULL); 1307 HostCmd_ACT_GEN_SET, 0, NULL);
1308 if (ret) 1308 if (ret)
1309 return -1; 1309 return -1;
1310 } 1310 }
1311 1311
1312 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_FUNC_INIT, 1312 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_FUNC_INIT,
1313 HostCmd_ACT_GEN_SET, 0, NULL); 1313 HostCmd_ACT_GEN_SET, 0, NULL);
1314 if (ret) 1314 if (ret)
1315 return -1; 1315 return -1;
1316 /* Read MAC address from HW */ 1316 /* Read MAC address from HW */
1317 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_GET_HW_SPEC, 1317 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_GET_HW_SPEC,
1318 HostCmd_ACT_GEN_GET, 0, NULL); 1318 HostCmd_ACT_GEN_GET, 0, NULL);
1319 if (ret) 1319 if (ret)
1320 return -1; 1320 return -1;
1321 1321
1322 /* Reconfigure tx buf size */ 1322 /* Reconfigure tx buf size */
1323 ret = mwifiex_send_cmd_async(priv, 1323 ret = mwifiex_send_cmd_sync(priv,
1324 HostCmd_CMD_RECONFIGURE_TX_BUFF, 1324 HostCmd_CMD_RECONFIGURE_TX_BUFF,
1325 HostCmd_ACT_GEN_SET, 0, 1325 HostCmd_ACT_GEN_SET, 0,
1326 &priv->adapter->tx_buf_size); 1326 &priv->adapter->tx_buf_size);
1327 if (ret) 1327 if (ret)
1328 return -1; 1328 return -1;
1329 1329
1330 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) { 1330 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
1331 /* Enable IEEE PS by default */ 1331 /* Enable IEEE PS by default */
1332 priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP; 1332 priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
1333 ret = mwifiex_send_cmd_async( 1333 ret = mwifiex_send_cmd_sync(
1334 priv, HostCmd_CMD_802_11_PS_MODE_ENH, 1334 priv, HostCmd_CMD_802_11_PS_MODE_ENH,
1335 EN_AUTO_PS, BITMAP_STA_PS, NULL); 1335 EN_AUTO_PS, BITMAP_STA_PS, NULL);
1336 if (ret) 1336 if (ret)
@@ -1339,21 +1339,21 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1339 } 1339 }
1340 1340
1341 /* get tx rate */ 1341 /* get tx rate */
1342 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_TX_RATE_CFG, 1342 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_TX_RATE_CFG,
1343 HostCmd_ACT_GEN_GET, 0, NULL); 1343 HostCmd_ACT_GEN_GET, 0, NULL);
1344 if (ret) 1344 if (ret)
1345 return -1; 1345 return -1;
1346 priv->data_rate = 0; 1346 priv->data_rate = 0;
1347 1347
1348 /* get tx power */ 1348 /* get tx power */
1349 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_RF_TX_PWR, 1349 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_RF_TX_PWR,
1350 HostCmd_ACT_GEN_GET, 0, NULL); 1350 HostCmd_ACT_GEN_GET, 0, NULL);
1351 if (ret) 1351 if (ret)
1352 return -1; 1352 return -1;
1353 1353
1354 if (priv->bss_type == MWIFIEX_BSS_TYPE_STA) { 1354 if (priv->bss_type == MWIFIEX_BSS_TYPE_STA) {
1355 /* set ibss coalescing_status */ 1355 /* set ibss coalescing_status */
1356 ret = mwifiex_send_cmd_async( 1356 ret = mwifiex_send_cmd_sync(
1357 priv, HostCmd_CMD_802_11_IBSS_COALESCING_STATUS, 1357 priv, HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
1358 HostCmd_ACT_GEN_SET, 0, &enable); 1358 HostCmd_ACT_GEN_SET, 0, &enable);
1359 if (ret) 1359 if (ret)
@@ -1363,16 +1363,16 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1363 memset(&amsdu_aggr_ctrl, 0, sizeof(amsdu_aggr_ctrl)); 1363 memset(&amsdu_aggr_ctrl, 0, sizeof(amsdu_aggr_ctrl));
1364 amsdu_aggr_ctrl.enable = true; 1364 amsdu_aggr_ctrl.enable = true;
1365 /* Send request to firmware */ 1365 /* Send request to firmware */
1366 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_AMSDU_AGGR_CTRL, 1366 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_AMSDU_AGGR_CTRL,
1367 HostCmd_ACT_GEN_SET, 0, 1367 HostCmd_ACT_GEN_SET, 0,
1368 &amsdu_aggr_ctrl); 1368 &amsdu_aggr_ctrl);
1369 if (ret) 1369 if (ret)
1370 return -1; 1370 return -1;
1371 /* MAC Control must be the last command in init_fw */ 1371 /* MAC Control must be the last command in init_fw */
1372 /* set MAC Control */ 1372 /* set MAC Control */
1373 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_MAC_CONTROL, 1373 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_MAC_CONTROL,
1374 HostCmd_ACT_GEN_SET, 0, 1374 HostCmd_ACT_GEN_SET, 0,
1375 &priv->curr_pkt_filter); 1375 &priv->curr_pkt_filter);
1376 if (ret) 1376 if (ret)
1377 return -1; 1377 return -1;
1378 1378
@@ -1381,10 +1381,10 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1381 /* Enable auto deep sleep */ 1381 /* Enable auto deep sleep */
1382 auto_ds.auto_ds = DEEP_SLEEP_ON; 1382 auto_ds.auto_ds = DEEP_SLEEP_ON;
1383 auto_ds.idle_time = DEEP_SLEEP_IDLE_TIME; 1383 auto_ds.idle_time = DEEP_SLEEP_IDLE_TIME;
1384 ret = mwifiex_send_cmd_async(priv, 1384 ret = mwifiex_send_cmd_sync(priv,
1385 HostCmd_CMD_802_11_PS_MODE_ENH, 1385 HostCmd_CMD_802_11_PS_MODE_ENH,
1386 EN_AUTO_PS, BITMAP_AUTO_DS, 1386 EN_AUTO_PS, BITMAP_AUTO_DS,
1387 &auto_ds); 1387 &auto_ds);
1388 if (ret) 1388 if (ret)
1389 return -1; 1389 return -1;
1390 } 1390 }
@@ -1392,23 +1392,24 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1392 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) { 1392 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
1393 /* Send cmd to FW to enable/disable 11D function */ 1393 /* Send cmd to FW to enable/disable 11D function */
1394 state_11d = ENABLE_11D; 1394 state_11d = ENABLE_11D;
1395 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_802_11_SNMP_MIB, 1395 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
1396 HostCmd_ACT_GEN_SET, DOT11D_I, 1396 HostCmd_ACT_GEN_SET, DOT11D_I,
1397 &state_11d); 1397 &state_11d);
1398 if (ret) 1398 if (ret)
1399 dev_err(priv->adapter->dev, 1399 dev_err(priv->adapter->dev,
1400 "11D: failed to enable 11D\n"); 1400 "11D: failed to enable 11D\n");
1401 } 1401 }
1402 1402
1403 /* set last_init_cmd before sending the command */
1404 priv->adapter->last_init_cmd = HostCmd_CMD_11N_CFG;
1405
1403 /* Send cmd to FW to configure 11n specific configuration 1406 /* Send cmd to FW to configure 11n specific configuration
1404 * (Short GI, Channel BW, Green field support etc.) for transmit 1407 * (Short GI, Channel BW, Green field support etc.) for transmit
1405 */ 1408 */
1406 tx_cfg.tx_htcap = MWIFIEX_FW_DEF_HTTXCFG; 1409 tx_cfg.tx_htcap = MWIFIEX_FW_DEF_HTTXCFG;
1407 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_CFG, 1410 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_11N_CFG,
1408 HostCmd_ACT_GEN_SET, 0, &tx_cfg); 1411 HostCmd_ACT_GEN_SET, 0, &tx_cfg);
1409 1412
1410 /* set last_init_cmd */
1411 priv->adapter->last_init_cmd = HostCmd_CMD_11N_CFG;
1412 ret = -EINPROGRESS; 1413 ret = -EINPROGRESS;
1413 1414
1414 return ret; 1415 return ret;