diff options
author | Bing Zhao <bzhao@marvell.com> | 2014-02-27 22:35:12 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-02-28 14:33:40 -0500 |
commit | fa0ecbb9905d985a77e76801ba1153394ba593e8 (patch) | |
tree | 65b9a9e5fece3e020b82b14e4cf1479a0eec6372 /drivers/net/wireless/mwifiex/sta_cmd.c | |
parent | 6b7dce12b3e810a107735ab9e701f2be4e75db29 (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.c | 84 |
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 | ||