aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/sta_cmd.c
diff options
context:
space:
mode:
authorBing Zhao <bzhao@marvell.com>2014-02-27 22:35:12 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-02-28 14:33:40 -0500
commitfa0ecbb9905d985a77e76801ba1153394ba593e8 (patch)
tree65b9a9e5fece3e020b82b14e4cf1479a0eec6372 /drivers/net/wireless/mwifiex/sta_cmd.c
parent6b7dce12b3e810a107735ab9e701f2be4e75db29 (diff)
mwifiex: remove global variable cmd_wait_q_required
There is a race condition while queuing synchronous command and asynchronous command requested from different threads, because the wait_q_enabled flag is set based on a global variable cmd_wait_q_required. The issue is fixed by removing this global variable and using a unified function with an argument 'sync' passed into the function. Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwifiex/sta_cmd.c')
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmd.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c
index 5aa3d39e48bc..4315a3ba3b92 100644
--- a/drivers/net/wireless/mwifiex/sta_cmd.c
+++ b/drivers/net/wireless/mwifiex/sta_cmd.c
@@ -1411,9 +1411,9 @@ int mwifiex_dnld_dt_cfgdata(struct mwifiex_private *priv,
1411 /* property header is 6 bytes, data must fit in cmd buffer */ 1411 /* property header is 6 bytes, data must fit in cmd buffer */
1412 if (prop && prop->value && prop->length > 6 && 1412 if (prop && prop->value && prop->length > 6 &&
1413 prop->length <= MWIFIEX_SIZE_OF_CMD_BUFFER - S_DS_GEN) { 1413 prop->length <= MWIFIEX_SIZE_OF_CMD_BUFFER - S_DS_GEN) {
1414 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_CFG_DATA, 1414 ret = mwifiex_send_cmd(priv, HostCmd_CMD_CFG_DATA,
1415 HostCmd_ACT_GEN_SET, 0, 1415 HostCmd_ACT_GEN_SET, 0,
1416 prop); 1416 prop, true);
1417 if (ret) 1417 if (ret)
1418 return ret; 1418 return ret;
1419 } 1419 }
@@ -1912,15 +1912,16 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1912 1912
1913 if (first_sta) { 1913 if (first_sta) {
1914 if (priv->adapter->iface_type == MWIFIEX_PCIE) { 1914 if (priv->adapter->iface_type == MWIFIEX_PCIE) {
1915 ret = mwifiex_send_cmd_sync(priv, 1915 ret = mwifiex_send_cmd(priv,
1916 HostCmd_CMD_PCIE_DESC_DETAILS, 1916 HostCmd_CMD_PCIE_DESC_DETAILS,
1917 HostCmd_ACT_GEN_SET, 0, NULL); 1917 HostCmd_ACT_GEN_SET, 0, NULL,
1918 true);
1918 if (ret) 1919 if (ret)
1919 return -1; 1920 return -1;
1920 } 1921 }
1921 1922
1922 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_FUNC_INIT, 1923 ret = mwifiex_send_cmd(priv, HostCmd_CMD_FUNC_INIT,
1923 HostCmd_ACT_GEN_SET, 0, NULL); 1924 HostCmd_ACT_GEN_SET, 0, NULL, true);
1924 if (ret) 1925 if (ret)
1925 return -1; 1926 return -1;
1926 1927
@@ -1938,55 +1939,57 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1938 } 1939 }
1939 1940
1940 if (adapter->cal_data) { 1941 if (adapter->cal_data) {
1941 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_CFG_DATA, 1942 ret = mwifiex_send_cmd(priv, HostCmd_CMD_CFG_DATA,
1942 HostCmd_ACT_GEN_SET, 0, NULL); 1943 HostCmd_ACT_GEN_SET, 0, NULL,
1944 true);
1943 if (ret) 1945 if (ret)
1944 return -1; 1946 return -1;
1945 } 1947 }
1946 1948
1947 /* Read MAC address from HW */ 1949 /* Read MAC address from HW */
1948 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_GET_HW_SPEC, 1950 ret = mwifiex_send_cmd(priv, HostCmd_CMD_GET_HW_SPEC,
1949 HostCmd_ACT_GEN_GET, 0, NULL); 1951 HostCmd_ACT_GEN_GET, 0, NULL, true);
1950 if (ret) 1952 if (ret)
1951 return -1; 1953 return -1;
1952 1954
1953 /* Reconfigure tx buf size */ 1955 /* Reconfigure tx buf size */
1954 ret = mwifiex_send_cmd_sync(priv, 1956 ret = mwifiex_send_cmd(priv, HostCmd_CMD_RECONFIGURE_TX_BUFF,
1955 HostCmd_CMD_RECONFIGURE_TX_BUFF, 1957 HostCmd_ACT_GEN_SET, 0,
1956 HostCmd_ACT_GEN_SET, 0, 1958 &priv->adapter->tx_buf_size, true);
1957 &priv->adapter->tx_buf_size);
1958 if (ret) 1959 if (ret)
1959 return -1; 1960 return -1;
1960 1961
1961 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) { 1962 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
1962 /* Enable IEEE PS by default */ 1963 /* Enable IEEE PS by default */
1963 priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP; 1964 priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
1964 ret = mwifiex_send_cmd_sync( 1965 ret = mwifiex_send_cmd(priv,
1965 priv, HostCmd_CMD_802_11_PS_MODE_ENH, 1966 HostCmd_CMD_802_11_PS_MODE_ENH,
1966 EN_AUTO_PS, BITMAP_STA_PS, NULL); 1967 EN_AUTO_PS, BITMAP_STA_PS, NULL,
1968 true);
1967 if (ret) 1969 if (ret)
1968 return -1; 1970 return -1;
1969 } 1971 }
1970 } 1972 }
1971 1973
1972 /* get tx rate */ 1974 /* get tx rate */
1973 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_TX_RATE_CFG, 1975 ret = mwifiex_send_cmd(priv, HostCmd_CMD_TX_RATE_CFG,
1974 HostCmd_ACT_GEN_GET, 0, NULL); 1976 HostCmd_ACT_GEN_GET, 0, NULL, true);
1975 if (ret) 1977 if (ret)
1976 return -1; 1978 return -1;
1977 priv->data_rate = 0; 1979 priv->data_rate = 0;
1978 1980
1979 /* get tx power */ 1981 /* get tx power */
1980 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_RF_TX_PWR, 1982 ret = mwifiex_send_cmd(priv, HostCmd_CMD_RF_TX_PWR,
1981 HostCmd_ACT_GEN_GET, 0, NULL); 1983 HostCmd_ACT_GEN_GET, 0, NULL, true);
1982 if (ret) 1984 if (ret)
1983 return -1; 1985 return -1;
1984 1986
1985 if (priv->bss_type == MWIFIEX_BSS_TYPE_STA) { 1987 if (priv->bss_type == MWIFIEX_BSS_TYPE_STA) {
1986 /* set ibss coalescing_status */ 1988 /* set ibss coalescing_status */
1987 ret = mwifiex_send_cmd_sync( 1989 ret = mwifiex_send_cmd(
1988 priv, HostCmd_CMD_802_11_IBSS_COALESCING_STATUS, 1990 priv,
1989 HostCmd_ACT_GEN_SET, 0, &enable); 1991 HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
1992 HostCmd_ACT_GEN_SET, 0, &enable, true);
1990 if (ret) 1993 if (ret)
1991 return -1; 1994 return -1;
1992 } 1995 }
@@ -1994,16 +1997,16 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
1994 memset(&amsdu_aggr_ctrl, 0, sizeof(amsdu_aggr_ctrl)); 1997 memset(&amsdu_aggr_ctrl, 0, sizeof(amsdu_aggr_ctrl));
1995 amsdu_aggr_ctrl.enable = true; 1998 amsdu_aggr_ctrl.enable = true;
1996 /* Send request to firmware */ 1999 /* Send request to firmware */
1997 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_AMSDU_AGGR_CTRL, 2000 ret = mwifiex_send_cmd(priv, HostCmd_CMD_AMSDU_AGGR_CTRL,
1998 HostCmd_ACT_GEN_SET, 0, 2001 HostCmd_ACT_GEN_SET, 0,
1999 &amsdu_aggr_ctrl); 2002 &amsdu_aggr_ctrl, true);
2000 if (ret) 2003 if (ret)
2001 return -1; 2004 return -1;
2002 /* MAC Control must be the last command in init_fw */ 2005 /* MAC Control must be the last command in init_fw */
2003 /* set MAC Control */ 2006 /* set MAC Control */
2004 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_MAC_CONTROL, 2007 ret = mwifiex_send_cmd(priv, HostCmd_CMD_MAC_CONTROL,
2005 HostCmd_ACT_GEN_SET, 0, 2008 HostCmd_ACT_GEN_SET, 0,
2006 &priv->curr_pkt_filter); 2009 &priv->curr_pkt_filter, true);
2007 if (ret) 2010 if (ret)
2008 return -1; 2011 return -1;
2009 2012
@@ -2012,10 +2015,9 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
2012 /* Enable auto deep sleep */ 2015 /* Enable auto deep sleep */
2013 auto_ds.auto_ds = DEEP_SLEEP_ON; 2016 auto_ds.auto_ds = DEEP_SLEEP_ON;
2014 auto_ds.idle_time = DEEP_SLEEP_IDLE_TIME; 2017 auto_ds.idle_time = DEEP_SLEEP_IDLE_TIME;
2015 ret = mwifiex_send_cmd_sync(priv, 2018 ret = mwifiex_send_cmd(priv, HostCmd_CMD_802_11_PS_MODE_ENH,
2016 HostCmd_CMD_802_11_PS_MODE_ENH, 2019 EN_AUTO_PS, BITMAP_AUTO_DS,
2017 EN_AUTO_PS, BITMAP_AUTO_DS, 2020 &auto_ds, true);
2018 &auto_ds);
2019 if (ret) 2021 if (ret)
2020 return -1; 2022 return -1;
2021 } 2023 }
@@ -2023,9 +2025,9 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
2023 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) { 2025 if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
2024 /* Send cmd to FW to enable/disable 11D function */ 2026 /* Send cmd to FW to enable/disable 11D function */
2025 state_11d = ENABLE_11D; 2027 state_11d = ENABLE_11D;
2026 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, 2028 ret = mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB,
2027 HostCmd_ACT_GEN_SET, DOT11D_I, 2029 HostCmd_ACT_GEN_SET, DOT11D_I,
2028 &state_11d); 2030 &state_11d, true);
2029 if (ret) 2031 if (ret)
2030 dev_err(priv->adapter->dev, 2032 dev_err(priv->adapter->dev,
2031 "11D: failed to enable 11D\n"); 2033 "11D: failed to enable 11D\n");
@@ -2038,8 +2040,8 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta)
2038 * (Short GI, Channel BW, Green field support etc.) for transmit 2040 * (Short GI, Channel BW, Green field support etc.) for transmit
2039 */ 2041 */
2040 tx_cfg.tx_htcap = MWIFIEX_FW_DEF_HTTXCFG; 2042 tx_cfg.tx_htcap = MWIFIEX_FW_DEF_HTTXCFG;
2041 ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_11N_CFG, 2043 ret = mwifiex_send_cmd(priv, HostCmd_CMD_11N_CFG,
2042 HostCmd_ACT_GEN_SET, 0, &tx_cfg); 2044 HostCmd_ACT_GEN_SET, 0, &tx_cfg, true);
2043 2045
2044 ret = -EINPROGRESS; 2046 ret = -EINPROGRESS;
2045 2047