aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2012-09-27 08:17:48 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-09-28 13:54:07 -0400
commitf09d0c02b63d9fd9873087b21311507988674221 (patch)
treea343945ee14b4a1982cc8c92e15c6a71c19483ed /drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
parent70398a59297965d4af1a0022660bb103dfa59c42 (diff)
brcmfmac: use different fw api for encryption,auth. config
This patch changes the commands being used to configure encryption and authentication. These new methods are needed for when p2p and hostap support are added. Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c266
1 files changed, 169 insertions, 97 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 24e8f8d708ad..d0a2fa0babbf 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -366,6 +366,44 @@ brcmf_exec_dcmd_u32(struct net_device *ndev, u32 cmd, u32 *par)
366 return err; 366 return err;
367} 367}
368 368
369static s32
370brcmf_dev_iovar_setbuf_bsscfg(struct net_device *ndev, s8 *name,
371 void *param, s32 paramlen,
372 void *buf, s32 buflen, s32 bssidx)
373{
374 s32 err = -ENOMEM;
375 u32 len;
376
377 len = brcmf_c_mkiovar_bsscfg(name, param, paramlen,
378 buf, buflen, bssidx);
379 BUG_ON(!len);
380 if (len > 0)
381 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR, buf, len);
382 if (err)
383 WL_ERR("error (%d)\n", err);
384
385 return err;
386}
387
388static s32
389brcmf_dev_iovar_getbuf_bsscfg(struct net_device *ndev, s8 *name,
390 void *param, s32 paramlen,
391 void *buf, s32 buflen, s32 bssidx)
392{
393 s32 err = -ENOMEM;
394 u32 len;
395
396 len = brcmf_c_mkiovar_bsscfg(name, param, paramlen,
397 buf, buflen, bssidx);
398 BUG_ON(!len);
399 if (len > 0)
400 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_VAR, buf, len);
401 if (err)
402 WL_ERR("error (%d)\n", err);
403
404 return err;
405}
406
369static void convert_key_from_CPU(struct brcmf_wsec_key *key, 407static void convert_key_from_CPU(struct brcmf_wsec_key *key,
370 struct brcmf_wsec_key_le *key_le) 408 struct brcmf_wsec_key_le *key_le)
371{ 409{
@@ -380,16 +418,22 @@ static void convert_key_from_CPU(struct brcmf_wsec_key *key,
380 memcpy(key_le->ea, key->ea, sizeof(key->ea)); 418 memcpy(key_le->ea, key->ea, sizeof(key->ea));
381} 419}
382 420
383static int send_key_to_dongle(struct net_device *ndev, 421static int
384 struct brcmf_wsec_key *key) 422send_key_to_dongle(struct brcmf_cfg80211_priv *cfg_priv, s32 bssidx,
423 struct net_device *ndev, struct brcmf_wsec_key *key)
385{ 424{
386 int err; 425 int err;
387 struct brcmf_wsec_key_le key_le; 426 struct brcmf_wsec_key_le key_le;
388 427
389 convert_key_from_CPU(key, &key_le); 428 convert_key_from_CPU(key, &key_le);
390 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_KEY, &key_le, sizeof(key_le)); 429
430 err = brcmf_dev_iovar_setbuf_bsscfg(ndev, "wsec_key", &key_le,
431 sizeof(key_le),
432 cfg_priv->extra_buf,
433 WL_EXTRA_BUF_MAX, bssidx);
434
391 if (err) 435 if (err)
392 WL_ERR("WLC_SET_KEY error (%d)\n", err); 436 WL_ERR("wsec_key error (%d)\n", err);
393 return err; 437 return err;
394} 438}
395 439
@@ -487,6 +531,49 @@ brcmf_dev_intvar_get(struct net_device *ndev, s8 *name, s32 *retval)
487 return err; 531 return err;
488} 532}
489 533
534static s32
535brcmf_dev_intvar_set_bsscfg(struct net_device *ndev, s8 *name, u32 val,
536 s32 bssidx)
537{
538 s8 buf[BRCMF_DCMD_SMLEN];
539 __le32 val_le;
540
541 val_le = cpu_to_le32(val);
542
543 return brcmf_dev_iovar_setbuf_bsscfg(ndev, name, &val_le,
544 sizeof(val_le), buf, sizeof(buf),
545 bssidx);
546}
547
548static s32
549brcmf_dev_intvar_get_bsscfg(struct net_device *ndev, s8 *name, s32 *val,
550 s32 bssidx)
551{
552 s8 buf[BRCMF_DCMD_SMLEN];
553 s32 err;
554 __le32 val_le;
555
556 memset(buf, 0, sizeof(buf));
557 err = brcmf_dev_iovar_getbuf_bsscfg(ndev, name, val, sizeof(*val), buf,
558 sizeof(buf), bssidx);
559 if (err == 0) {
560 memcpy(&val_le, buf, sizeof(val_le));
561 *val = le32_to_cpu(val_le);
562 }
563 return err;
564}
565
566
567/*
568 * For now brcmf_find_bssidx will return 0. Once p2p gets implemented this
569 * should return the ndev matching bssidx.
570 */
571static s32
572brcmf_find_bssidx(struct brcmf_cfg80211_priv *cfg_priv, struct net_device *ndev)
573{
574 return 0;
575}
576
490static void brcmf_set_mpc(struct net_device *ndev, int mpc) 577static void brcmf_set_mpc(struct net_device *ndev, int mpc)
491{ 578{
492 s32 err = 0; 579 s32 err = 0;
@@ -1600,14 +1687,15 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
1600} 1687}
1601 1688
1602static s32 1689static s32
1603brcmf_set_wep_sharedkey(struct net_device *ndev, 1690brcmf_set_sharedkey(struct net_device *ndev,
1604 struct cfg80211_connect_params *sme) 1691 struct cfg80211_connect_params *sme)
1605{ 1692{
1606 struct brcmf_cfg80211_priv *cfg_priv = ndev_to_cfg(ndev); 1693 struct brcmf_cfg80211_priv *cfg_priv = ndev_to_cfg(ndev);
1607 struct brcmf_cfg80211_security *sec; 1694 struct brcmf_cfg80211_security *sec;
1608 struct brcmf_wsec_key key; 1695 struct brcmf_wsec_key key;
1609 s32 val; 1696 s32 val;
1610 s32 err = 0; 1697 s32 err = 0;
1698 s32 bssidx;
1611 1699
1612 WL_CONN("key len (%d)\n", sme->key_len); 1700 WL_CONN("key len (%d)\n", sme->key_len);
1613 1701
@@ -1621,46 +1709,46 @@ brcmf_set_wep_sharedkey(struct net_device *ndev,
1621 if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) 1709 if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2))
1622 return 0; 1710 return 0;
1623 1711
1624 if (sec->cipher_pairwise & 1712 if (!(sec->cipher_pairwise &
1625 (WLAN_CIPHER_SUITE_WEP40 | WLAN_CIPHER_SUITE_WEP104)) { 1713 (WLAN_CIPHER_SUITE_WEP40 | WLAN_CIPHER_SUITE_WEP104)))
1626 memset(&key, 0, sizeof(key)); 1714 return 0;
1627 key.len = (u32) sme->key_len;
1628 key.index = (u32) sme->key_idx;
1629 if (key.len > sizeof(key.data)) {
1630 WL_ERR("Too long key length (%u)\n", key.len);
1631 return -EINVAL;
1632 }
1633 memcpy(key.data, sme->key, key.len);
1634 key.flags = BRCMF_PRIMARY_KEY;
1635 switch (sec->cipher_pairwise) {
1636 case WLAN_CIPHER_SUITE_WEP40:
1637 key.algo = CRYPTO_ALGO_WEP1;
1638 break;
1639 case WLAN_CIPHER_SUITE_WEP104:
1640 key.algo = CRYPTO_ALGO_WEP128;
1641 break;
1642 default:
1643 WL_ERR("Invalid algorithm (%d)\n",
1644 sme->crypto.ciphers_pairwise[0]);
1645 return -EINVAL;
1646 }
1647 /* Set the new key/index */
1648 WL_CONN("key length (%d) key index (%d) algo (%d)\n",
1649 key.len, key.index, key.algo);
1650 WL_CONN("key \"%s\"\n", key.data);
1651 err = send_key_to_dongle(ndev, &key);
1652 if (err)
1653 return err;
1654 1715
1655 if (sec->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) { 1716 memset(&key, 0, sizeof(key));
1656 WL_CONN("set auth_type to shared key\n"); 1717 key.len = (u32) sme->key_len;
1657 val = 1; /* shared key */ 1718 key.index = (u32) sme->key_idx;
1658 err = brcmf_dev_intvar_set(ndev, "auth", val); 1719 if (key.len > sizeof(key.data)) {
1659 if (err) { 1720 WL_ERR("Too long key length (%u)\n", key.len);
1660 WL_ERR("set auth failed (%d)\n", err); 1721 return -EINVAL;
1661 return err; 1722 }
1662 } 1723 memcpy(key.data, sme->key, key.len);
1663 } 1724 key.flags = BRCMF_PRIMARY_KEY;
1725 switch (sec->cipher_pairwise) {
1726 case WLAN_CIPHER_SUITE_WEP40:
1727 key.algo = CRYPTO_ALGO_WEP1;
1728 break;
1729 case WLAN_CIPHER_SUITE_WEP104:
1730 key.algo = CRYPTO_ALGO_WEP128;
1731 break;
1732 default:
1733 WL_ERR("Invalid algorithm (%d)\n",
1734 sme->crypto.ciphers_pairwise[0]);
1735 return -EINVAL;
1736 }
1737 /* Set the new key/index */
1738 WL_CONN("key length (%d) key index (%d) algo (%d)\n",
1739 key.len, key.index, key.algo);
1740 WL_CONN("key \"%s\"\n", key.data);
1741 bssidx = brcmf_find_bssidx(cfg_priv, ndev);
1742 err = send_key_to_dongle(cfg_priv, bssidx, ndev, &key);
1743 if (err)
1744 return err;
1745
1746 if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) {
1747 WL_CONN("set auth_type to shared key\n");
1748 val = WL_AUTH_SHARED_KEY; /* shared key */
1749 err = brcmf_dev_intvar_set_bsscfg(ndev, "auth", val, bssidx);
1750 if (err)
1751 WL_ERR("set auth failed (%d)\n", err);
1664 } 1752 }
1665 return err; 1753 return err;
1666} 1754}
@@ -1722,9 +1810,9 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
1722 goto done; 1810 goto done;
1723 } 1811 }
1724 1812
1725 err = brcmf_set_wep_sharedkey(ndev, sme); 1813 err = brcmf_set_sharedkey(ndev, sme);
1726 if (err) { 1814 if (err) {
1727 WL_ERR("brcmf_set_wep_sharedkey failed (%d)\n", err); 1815 WL_ERR("brcmf_set_sharedkey failed (%d)\n", err);
1728 goto done; 1816 goto done;
1729 } 1817 }
1730 1818
@@ -1863,16 +1951,19 @@ static s32
1863brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev, 1951brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
1864 u8 key_idx, bool unicast, bool multicast) 1952 u8 key_idx, bool unicast, bool multicast)
1865{ 1953{
1954 struct brcmf_cfg80211_priv *cfg_priv = wiphy_to_cfg(wiphy);
1866 u32 index; 1955 u32 index;
1867 u32 wsec; 1956 u32 wsec;
1868 s32 err = 0; 1957 s32 err = 0;
1958 s32 bssidx;
1869 1959
1870 WL_TRACE("Enter\n"); 1960 WL_TRACE("Enter\n");
1871 WL_CONN("key index (%d)\n", key_idx); 1961 WL_CONN("key index (%d)\n", key_idx);
1872 if (!check_sys_up(wiphy)) 1962 if (!check_sys_up(wiphy))
1873 return -EIO; 1963 return -EIO;
1874 1964
1875 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_GET_WSEC, &wsec); 1965 bssidx = brcmf_find_bssidx(cfg_priv, ndev);
1966 err = brcmf_dev_intvar_get_bsscfg(ndev, "wsec", &wsec, bssidx);
1876 if (err) { 1967 if (err) {
1877 WL_ERR("WLC_GET_WSEC error (%d)\n", err); 1968 WL_ERR("WLC_GET_WSEC error (%d)\n", err);
1878 goto done; 1969 goto done;
@@ -1895,9 +1986,11 @@ static s32
1895brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev, 1986brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev,
1896 u8 key_idx, const u8 *mac_addr, struct key_params *params) 1987 u8 key_idx, const u8 *mac_addr, struct key_params *params)
1897{ 1988{
1989 struct brcmf_cfg80211_priv *cfg_priv = wiphy_to_cfg(wiphy);
1898 struct brcmf_wsec_key key; 1990 struct brcmf_wsec_key key;
1899 struct brcmf_wsec_key_le key_le; 1991 struct brcmf_wsec_key_le key_le;
1900 s32 err = 0; 1992 s32 err = 0;
1993 s32 bssidx;
1901 1994
1902 memset(&key, 0, sizeof(key)); 1995 memset(&key, 0, sizeof(key));
1903 key.index = (u32) key_idx; 1996 key.index = (u32) key_idx;
@@ -1906,12 +1999,13 @@ brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev,
1906 if (!is_multicast_ether_addr(mac_addr)) 1999 if (!is_multicast_ether_addr(mac_addr))
1907 memcpy((char *)&key.ea, (void *)mac_addr, ETH_ALEN); 2000 memcpy((char *)&key.ea, (void *)mac_addr, ETH_ALEN);
1908 key.len = (u32) params->key_len; 2001 key.len = (u32) params->key_len;
2002 bssidx = brcmf_find_bssidx(cfg_priv, ndev);
1909 /* check for key index change */ 2003 /* check for key index change */
1910 if (key.len == 0) { 2004 if (key.len == 0) {
1911 /* key delete */ 2005 /* key delete */
1912 err = send_key_to_dongle(ndev, &key); 2006 err = send_key_to_dongle(cfg_priv, bssidx, ndev, &key);
1913 if (err) 2007 if (err)
1914 return err; 2008 WL_ERR("key delete error (%d)\n", err);
1915 } else { 2009 } else {
1916 if (key.len > sizeof(key.data)) { 2010 if (key.len > sizeof(key.data)) {
1917 WL_ERR("Invalid key length (%d)\n", key.len); 2011 WL_ERR("Invalid key length (%d)\n", key.len);
@@ -1967,12 +2061,12 @@ brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev,
1967 convert_key_from_CPU(&key, &key_le); 2061 convert_key_from_CPU(&key, &key_le);
1968 2062
1969 brcmf_netdev_wait_pend8021x(ndev); 2063 brcmf_netdev_wait_pend8021x(ndev);
1970 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_KEY, &key_le, 2064 err = brcmf_dev_iovar_setbuf_bsscfg(ndev, "wsec_key", &key_le,
1971 sizeof(key_le)); 2065 sizeof(key_le),
1972 if (err) { 2066 cfg_priv->extra_buf,
1973 WL_ERR("WLC_SET_KEY error (%d)\n", err); 2067 WL_EXTRA_BUF_MAX, bssidx);
1974 return err; 2068 if (err)
1975 } 2069 WL_ERR("wsec_key error (%d)\n", err);
1976 } 2070 }
1977 return err; 2071 return err;
1978} 2072}
@@ -1982,11 +2076,13 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
1982 u8 key_idx, bool pairwise, const u8 *mac_addr, 2076 u8 key_idx, bool pairwise, const u8 *mac_addr,
1983 struct key_params *params) 2077 struct key_params *params)
1984{ 2078{
2079 struct brcmf_cfg80211_priv *cfg_priv = wiphy_to_cfg(wiphy);
1985 struct brcmf_wsec_key key; 2080 struct brcmf_wsec_key key;
1986 s32 val; 2081 s32 val;
1987 s32 wsec; 2082 s32 wsec;
1988 s32 err = 0; 2083 s32 err = 0;
1989 u8 keybuf[8]; 2084 u8 keybuf[8];
2085 s32 bssidx;
1990 2086
1991 WL_TRACE("Enter\n"); 2087 WL_TRACE("Enter\n");
1992 WL_CONN("key index (%d)\n", key_idx); 2088 WL_CONN("key index (%d)\n", key_idx);
@@ -2013,10 +2109,12 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
2013 switch (params->cipher) { 2109 switch (params->cipher) {
2014 case WLAN_CIPHER_SUITE_WEP40: 2110 case WLAN_CIPHER_SUITE_WEP40:
2015 key.algo = CRYPTO_ALGO_WEP1; 2111 key.algo = CRYPTO_ALGO_WEP1;
2112 val = WEP_ENABLED;
2016 WL_CONN("WLAN_CIPHER_SUITE_WEP40\n"); 2113 WL_CONN("WLAN_CIPHER_SUITE_WEP40\n");
2017 break; 2114 break;
2018 case WLAN_CIPHER_SUITE_WEP104: 2115 case WLAN_CIPHER_SUITE_WEP104:
2019 key.algo = CRYPTO_ALGO_WEP128; 2116 key.algo = CRYPTO_ALGO_WEP128;
2117 val = WEP_ENABLED;
2020 WL_CONN("WLAN_CIPHER_SUITE_WEP104\n"); 2118 WL_CONN("WLAN_CIPHER_SUITE_WEP104\n");
2021 break; 2119 break;
2022 case WLAN_CIPHER_SUITE_TKIP: 2120 case WLAN_CIPHER_SUITE_TKIP:
@@ -2024,14 +2122,17 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
2024 memcpy(&key.data[24], &key.data[16], sizeof(keybuf)); 2122 memcpy(&key.data[24], &key.data[16], sizeof(keybuf));
2025 memcpy(&key.data[16], keybuf, sizeof(keybuf)); 2123 memcpy(&key.data[16], keybuf, sizeof(keybuf));
2026 key.algo = CRYPTO_ALGO_TKIP; 2124 key.algo = CRYPTO_ALGO_TKIP;
2125 val = TKIP_ENABLED;
2027 WL_CONN("WLAN_CIPHER_SUITE_TKIP\n"); 2126 WL_CONN("WLAN_CIPHER_SUITE_TKIP\n");
2028 break; 2127 break;
2029 case WLAN_CIPHER_SUITE_AES_CMAC: 2128 case WLAN_CIPHER_SUITE_AES_CMAC:
2030 key.algo = CRYPTO_ALGO_AES_CCM; 2129 key.algo = CRYPTO_ALGO_AES_CCM;
2130 val = AES_ENABLED;
2031 WL_CONN("WLAN_CIPHER_SUITE_AES_CMAC\n"); 2131 WL_CONN("WLAN_CIPHER_SUITE_AES_CMAC\n");
2032 break; 2132 break;
2033 case WLAN_CIPHER_SUITE_CCMP: 2133 case WLAN_CIPHER_SUITE_CCMP:
2034 key.algo = CRYPTO_ALGO_AES_CCM; 2134 key.algo = CRYPTO_ALGO_AES_CCM;
2135 val = AES_ENABLED;
2035 WL_CONN("WLAN_CIPHER_SUITE_CCMP\n"); 2136 WL_CONN("WLAN_CIPHER_SUITE_CCMP\n");
2036 break; 2137 break;
2037 default: 2138 default:
@@ -2040,28 +2141,23 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
2040 goto done; 2141 goto done;
2041 } 2142 }
2042 2143
2043 err = send_key_to_dongle(ndev, &key); /* Set the new key/index */ 2144 bssidx = brcmf_find_bssidx(cfg_priv, ndev);
2145 err = send_key_to_dongle(cfg_priv, bssidx, ndev, &key);
2044 if (err) 2146 if (err)
2045 goto done; 2147 goto done;
2046 2148
2047 val = WEP_ENABLED; 2149 err = brcmf_dev_intvar_get_bsscfg(ndev, "wsec", &wsec, bssidx);
2048 err = brcmf_dev_intvar_get(ndev, "wsec", &wsec);
2049 if (err) { 2150 if (err) {
2050 WL_ERR("get wsec error (%d)\n", err); 2151 WL_ERR("get wsec error (%d)\n", err);
2051 goto done; 2152 goto done;
2052 } 2153 }
2053 wsec &= ~(WEP_ENABLED);
2054 wsec |= val; 2154 wsec |= val;
2055 err = brcmf_dev_intvar_set(ndev, "wsec", wsec); 2155 err = brcmf_dev_intvar_set_bsscfg(ndev, "wsec", wsec, bssidx);
2056 if (err) { 2156 if (err) {
2057 WL_ERR("set wsec error (%d)\n", err); 2157 WL_ERR("set wsec error (%d)\n", err);
2058 goto done; 2158 goto done;
2059 } 2159 }
2060 2160
2061 val = 1; /* assume shared key. otherwise 0 */
2062 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_AUTH, &val);
2063 if (err)
2064 WL_ERR("WLC_SET_AUTH error (%d)\n", err);
2065done: 2161done:
2066 WL_TRACE("Exit\n"); 2162 WL_TRACE("Exit\n");
2067 return err; 2163 return err;
@@ -2071,10 +2167,10 @@ static s32
2071brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev, 2167brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
2072 u8 key_idx, bool pairwise, const u8 *mac_addr) 2168 u8 key_idx, bool pairwise, const u8 *mac_addr)
2073{ 2169{
2170 struct brcmf_cfg80211_priv *cfg_priv = wiphy_to_cfg(wiphy);
2074 struct brcmf_wsec_key key; 2171 struct brcmf_wsec_key key;
2075 s32 err = 0; 2172 s32 err = 0;
2076 s32 val; 2173 s32 bssidx;
2077 s32 wsec;
2078 2174
2079 WL_TRACE("Enter\n"); 2175 WL_TRACE("Enter\n");
2080 if (!check_sys_up(wiphy)) 2176 if (!check_sys_up(wiphy))
@@ -2089,7 +2185,8 @@ brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
2089 WL_CONN("key index (%d)\n", key_idx); 2185 WL_CONN("key index (%d)\n", key_idx);
2090 2186
2091 /* Set the new key/index */ 2187 /* Set the new key/index */
2092 err = send_key_to_dongle(ndev, &key); 2188 bssidx = brcmf_find_bssidx(cfg_priv, ndev);
2189 err = send_key_to_dongle(cfg_priv, bssidx, ndev, &key);
2093 if (err) { 2190 if (err) {
2094 if (err == -EINVAL) { 2191 if (err == -EINVAL) {
2095 if (key.index >= DOT11_MAX_DEFAULT_KEYS) 2192 if (key.index >= DOT11_MAX_DEFAULT_KEYS)
@@ -2098,35 +2195,8 @@ brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
2098 } 2195 }
2099 /* Ignore this error, may happen during DISASSOC */ 2196 /* Ignore this error, may happen during DISASSOC */
2100 err = -EAGAIN; 2197 err = -EAGAIN;
2101 goto done;
2102 } 2198 }
2103 2199
2104 val = 0;
2105 err = brcmf_dev_intvar_get(ndev, "wsec", &wsec);
2106 if (err) {
2107 WL_ERR("get wsec error (%d)\n", err);
2108 /* Ignore this error, may happen during DISASSOC */
2109 err = -EAGAIN;
2110 goto done;
2111 }
2112 wsec &= ~(WEP_ENABLED);
2113 wsec |= val;
2114 err = brcmf_dev_intvar_set(ndev, "wsec", wsec);
2115 if (err) {
2116 WL_ERR("set wsec error (%d)\n", err);
2117 /* Ignore this error, may happen during DISASSOC */
2118 err = -EAGAIN;
2119 goto done;
2120 }
2121
2122 val = 0; /* assume open key. otherwise 1 */
2123 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_AUTH, &val);
2124 if (err) {
2125 WL_ERR("WLC_SET_AUTH error (%d)\n", err);
2126 /* Ignore this error, may happen during DISASSOC */
2127 err = -EAGAIN;
2128 }
2129done:
2130 WL_TRACE("Exit\n"); 2200 WL_TRACE("Exit\n");
2131 return err; 2201 return err;
2132} 2202}
@@ -2141,6 +2211,7 @@ brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
2141 struct brcmf_cfg80211_security *sec; 2211 struct brcmf_cfg80211_security *sec;
2142 s32 wsec; 2212 s32 wsec;
2143 s32 err = 0; 2213 s32 err = 0;
2214 s32 bssidx;
2144 2215
2145 WL_TRACE("Enter\n"); 2216 WL_TRACE("Enter\n");
2146 WL_CONN("key index (%d)\n", key_idx); 2217 WL_CONN("key index (%d)\n", key_idx);
@@ -2149,14 +2220,15 @@ brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
2149 2220
2150 memset(&params, 0, sizeof(params)); 2221 memset(&params, 0, sizeof(params));
2151 2222
2152 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_GET_WSEC, &wsec); 2223 bssidx = brcmf_find_bssidx(cfg_priv, ndev);
2224 err = brcmf_dev_intvar_get_bsscfg(ndev, "wsec", &wsec, bssidx);
2153 if (err) { 2225 if (err) {
2154 WL_ERR("WLC_GET_WSEC error (%d)\n", err); 2226 WL_ERR("WLC_GET_WSEC error (%d)\n", err);
2155 /* Ignore this error, may happen during DISASSOC */ 2227 /* Ignore this error, may happen during DISASSOC */
2156 err = -EAGAIN; 2228 err = -EAGAIN;
2157 goto done; 2229 goto done;
2158 } 2230 }
2159 switch (wsec) { 2231 switch (wsec & ~SES_OW_ENABLED) {
2160 case WEP_ENABLED: 2232 case WEP_ENABLED:
2161 sec = brcmf_read_prof(cfg_priv, WL_PROF_SEC); 2233 sec = brcmf_read_prof(cfg_priv, WL_PROF_SEC);
2162 if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) { 2234 if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) {