diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/mwifiex/cfg80211.c | 99 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/decl.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/fw.h | 18 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/ioctl.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/uap_cmd.c | 47 |
6 files changed, 150 insertions, 20 deletions
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index a8fa5cba2028..daa7b4b1a250 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
@@ -428,18 +428,13 @@ mwifiex_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, | |||
428 | static int | 428 | static int |
429 | mwifiex_set_frag(struct mwifiex_private *priv, u32 frag_thr) | 429 | mwifiex_set_frag(struct mwifiex_private *priv, u32 frag_thr) |
430 | { | 430 | { |
431 | int ret; | ||
432 | |||
433 | if (frag_thr < MWIFIEX_FRAG_MIN_VALUE || | 431 | if (frag_thr < MWIFIEX_FRAG_MIN_VALUE || |
434 | frag_thr > MWIFIEX_FRAG_MAX_VALUE) | 432 | frag_thr > MWIFIEX_FRAG_MAX_VALUE) |
435 | return -EINVAL; | 433 | frag_thr = MWIFIEX_FRAG_MAX_VALUE; |
436 | |||
437 | /* Send request to firmware */ | ||
438 | ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | ||
439 | HostCmd_ACT_GEN_SET, FRAG_THRESH_I, | ||
440 | &frag_thr); | ||
441 | 434 | ||
442 | return ret; | 435 | return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, |
436 | HostCmd_ACT_GEN_SET, FRAG_THRESH_I, | ||
437 | &frag_thr); | ||
443 | } | 438 | } |
444 | 439 | ||
445 | /* | 440 | /* |
@@ -469,20 +464,84 @@ static int | |||
469 | mwifiex_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) | 464 | mwifiex_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) |
470 | { | 465 | { |
471 | struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy); | 466 | struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy); |
472 | struct mwifiex_private *priv = mwifiex_get_priv(adapter, | 467 | struct mwifiex_private *priv; |
473 | MWIFIEX_BSS_ROLE_STA); | 468 | struct mwifiex_uap_bss_param *bss_cfg; |
474 | int ret = 0; | 469 | int ret, bss_started, i; |
470 | |||
471 | for (i = 0; i < adapter->priv_num; i++) { | ||
472 | priv = adapter->priv[i]; | ||
473 | |||
474 | switch (priv->bss_role) { | ||
475 | case MWIFIEX_BSS_ROLE_UAP: | ||
476 | bss_cfg = kzalloc(sizeof(struct mwifiex_uap_bss_param), | ||
477 | GFP_KERNEL); | ||
478 | if (!bss_cfg) | ||
479 | return -ENOMEM; | ||
480 | |||
481 | mwifiex_set_sys_config_invalid_data(bss_cfg); | ||
482 | |||
483 | if (changed & WIPHY_PARAM_RTS_THRESHOLD) | ||
484 | bss_cfg->rts_threshold = wiphy->rts_threshold; | ||
485 | if (changed & WIPHY_PARAM_FRAG_THRESHOLD) | ||
486 | bss_cfg->frag_threshold = wiphy->frag_threshold; | ||
487 | if (changed & WIPHY_PARAM_RETRY_LONG) | ||
488 | bss_cfg->retry_limit = wiphy->retry_long; | ||
489 | |||
490 | bss_started = priv->bss_started; | ||
491 | |||
492 | ret = mwifiex_send_cmd_sync(priv, | ||
493 | HostCmd_CMD_UAP_BSS_STOP, | ||
494 | HostCmd_ACT_GEN_SET, 0, | ||
495 | NULL); | ||
496 | if (ret) { | ||
497 | wiphy_err(wiphy, "Failed to stop the BSS\n"); | ||
498 | kfree(bss_cfg); | ||
499 | return ret; | ||
500 | } | ||
475 | 501 | ||
476 | if (changed & WIPHY_PARAM_RTS_THRESHOLD) { | 502 | ret = mwifiex_send_cmd_async(priv, |
477 | ret = mwifiex_set_rts(priv, wiphy->rts_threshold); | 503 | HostCmd_CMD_UAP_SYS_CONFIG, |
478 | if (ret) | 504 | HostCmd_ACT_GEN_SET, |
479 | return ret; | 505 | 0, bss_cfg); |
480 | } | ||
481 | 506 | ||
482 | if (changed & WIPHY_PARAM_FRAG_THRESHOLD) | 507 | kfree(bss_cfg); |
483 | ret = mwifiex_set_frag(priv, wiphy->frag_threshold); | ||
484 | 508 | ||
485 | return ret; | 509 | if (ret) { |
510 | wiphy_err(wiphy, "Failed to set bss config\n"); | ||
511 | return ret; | ||
512 | } | ||
513 | |||
514 | if (!bss_started) | ||
515 | break; | ||
516 | |||
517 | ret = mwifiex_send_cmd_async(priv, | ||
518 | HostCmd_CMD_UAP_BSS_START, | ||
519 | HostCmd_ACT_GEN_SET, 0, | ||
520 | NULL); | ||
521 | if (ret) { | ||
522 | wiphy_err(wiphy, "Failed to start BSS\n"); | ||
523 | return ret; | ||
524 | } | ||
525 | |||
526 | break; | ||
527 | case MWIFIEX_BSS_ROLE_STA: | ||
528 | if (changed & WIPHY_PARAM_RTS_THRESHOLD) { | ||
529 | ret = mwifiex_set_rts(priv, | ||
530 | wiphy->rts_threshold); | ||
531 | if (ret) | ||
532 | return ret; | ||
533 | } | ||
534 | if (changed & WIPHY_PARAM_FRAG_THRESHOLD) { | ||
535 | ret = mwifiex_set_frag(priv, | ||
536 | wiphy->frag_threshold); | ||
537 | if (ret) | ||
538 | return ret; | ||
539 | } | ||
540 | break; | ||
541 | } | ||
542 | } | ||
543 | |||
544 | return 0; | ||
486 | } | 545 | } |
487 | 546 | ||
488 | /* | 547 | /* |
diff --git a/drivers/net/wireless/mwifiex/decl.h b/drivers/net/wireless/mwifiex/decl.h index 6b8f9129b704..31dc2bada512 100644 --- a/drivers/net/wireless/mwifiex/decl.h +++ b/drivers/net/wireless/mwifiex/decl.h | |||
@@ -60,6 +60,7 @@ | |||
60 | #define MWIFIEX_FRAG_MIN_VALUE (256) | 60 | #define MWIFIEX_FRAG_MIN_VALUE (256) |
61 | #define MWIFIEX_FRAG_MAX_VALUE (2346) | 61 | #define MWIFIEX_FRAG_MAX_VALUE (2346) |
62 | 62 | ||
63 | #define MWIFIEX_RETRY_LIMIT 14 | ||
63 | #define MWIFIEX_SDIO_BLOCK_SIZE 256 | 64 | #define MWIFIEX_SDIO_BLOCK_SIZE 256 |
64 | 65 | ||
65 | #define MWIFIEX_BUF_FLAG_REQUEUED_PKT BIT(0) | 66 | #define MWIFIEX_BUF_FLAG_REQUEUED_PKT BIT(0) |
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h index a3e9c28465bf..a4c2fc3e3d71 100644 --- a/drivers/net/wireless/mwifiex/fw.h +++ b/drivers/net/wireless/mwifiex/fw.h | |||
@@ -106,9 +106,12 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { | |||
106 | #define TLV_TYPE_AUTH_TYPE (PROPRIETARY_TLV_BASE_ID + 31) | 106 | #define TLV_TYPE_AUTH_TYPE (PROPRIETARY_TLV_BASE_ID + 31) |
107 | #define TLV_TYPE_STA_MAC_ADDR (PROPRIETARY_TLV_BASE_ID + 32) | 107 | #define TLV_TYPE_STA_MAC_ADDR (PROPRIETARY_TLV_BASE_ID + 32) |
108 | #define TLV_TYPE_CHANNELBANDLIST (PROPRIETARY_TLV_BASE_ID + 42) | 108 | #define TLV_TYPE_CHANNELBANDLIST (PROPRIETARY_TLV_BASE_ID + 42) |
109 | #define TLV_TYPE_UAP_RTS_THRESHOLD (PROPRIETARY_TLV_BASE_ID + 51) | ||
110 | #define TLV_TYPE_UAP_FRAG_THRESHOLD (PROPRIETARY_TLV_BASE_ID + 70) | ||
109 | #define TLV_TYPE_RATE_DROP_CONTROL (PROPRIETARY_TLV_BASE_ID + 82) | 111 | #define TLV_TYPE_RATE_DROP_CONTROL (PROPRIETARY_TLV_BASE_ID + 82) |
110 | #define TLV_TYPE_RATE_SCOPE (PROPRIETARY_TLV_BASE_ID + 83) | 112 | #define TLV_TYPE_RATE_SCOPE (PROPRIETARY_TLV_BASE_ID + 83) |
111 | #define TLV_TYPE_POWER_GROUP (PROPRIETARY_TLV_BASE_ID + 84) | 113 | #define TLV_TYPE_POWER_GROUP (PROPRIETARY_TLV_BASE_ID + 84) |
114 | #define TLV_TYPE_UAP_RETRY_LIMIT (PROPRIETARY_TLV_BASE_ID + 93) | ||
112 | #define TLV_TYPE_WAPI_IE (PROPRIETARY_TLV_BASE_ID + 94) | 115 | #define TLV_TYPE_WAPI_IE (PROPRIETARY_TLV_BASE_ID + 94) |
113 | #define TLV_TYPE_MGMT_IE (PROPRIETARY_TLV_BASE_ID + 105) | 116 | #define TLV_TYPE_MGMT_IE (PROPRIETARY_TLV_BASE_ID + 105) |
114 | #define TLV_TYPE_AUTO_DS_PARAM (PROPRIETARY_TLV_BASE_ID + 113) | 117 | #define TLV_TYPE_AUTO_DS_PARAM (PROPRIETARY_TLV_BASE_ID + 113) |
@@ -1117,6 +1120,21 @@ struct host_cmd_ds_sys_config { | |||
1117 | u8 tlv[0]; | 1120 | u8 tlv[0]; |
1118 | }; | 1121 | }; |
1119 | 1122 | ||
1123 | struct host_cmd_tlv_frag_threshold { | ||
1124 | struct host_cmd_tlv tlv; | ||
1125 | __le16 frag_thr; | ||
1126 | } __packed; | ||
1127 | |||
1128 | struct host_cmd_tlv_rts_threshold { | ||
1129 | struct host_cmd_tlv tlv; | ||
1130 | __le16 rts_thr; | ||
1131 | } __packed; | ||
1132 | |||
1133 | struct host_cmd_tlv_retry_limit { | ||
1134 | struct host_cmd_tlv tlv; | ||
1135 | u8 limit; | ||
1136 | } __packed; | ||
1137 | |||
1120 | struct host_cmd_tlv_mac_addr { | 1138 | struct host_cmd_tlv_mac_addr { |
1121 | struct host_cmd_tlv tlv; | 1139 | struct host_cmd_tlv tlv; |
1122 | u8 mac_addr[ETH_ALEN]; | 1140 | u8 mac_addr[ETH_ALEN]; |
diff --git a/drivers/net/wireless/mwifiex/ioctl.h b/drivers/net/wireless/mwifiex/ioctl.h index 50e9b7767da7..535a57a3f96e 100644 --- a/drivers/net/wireless/mwifiex/ioctl.h +++ b/drivers/net/wireless/mwifiex/ioctl.h | |||
@@ -66,6 +66,9 @@ enum { | |||
66 | struct mwifiex_uap_bss_param { | 66 | struct mwifiex_uap_bss_param { |
67 | u8 channel; | 67 | u8 channel; |
68 | u8 band_cfg; | 68 | u8 band_cfg; |
69 | u16 rts_threshold; | ||
70 | u16 frag_threshold; | ||
71 | u8 retry_limit; | ||
69 | }; | 72 | }; |
70 | 73 | ||
71 | enum { | 74 | enum { |
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index 014a13f443ef..acea8d41c048 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
@@ -993,6 +993,8 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy, | |||
993 | u32 *flags, struct vif_params *params); | 993 | u32 *flags, struct vif_params *params); |
994 | int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev); | 994 | int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev); |
995 | 995 | ||
996 | void mwifiex_set_sys_config_invalid_data(struct mwifiex_uap_bss_param *config); | ||
997 | |||
996 | u8 *mwifiex_11d_code_2_region(u8 code); | 998 | u8 *mwifiex_11d_code_2_region(u8 code); |
997 | 999 | ||
998 | #ifdef CONFIG_DEBUG_FS | 1000 | #ifdef CONFIG_DEBUG_FS |
diff --git a/drivers/net/wireless/mwifiex/uap_cmd.c b/drivers/net/wireless/mwifiex/uap_cmd.c index 795a72b94465..2225baca896a 100644 --- a/drivers/net/wireless/mwifiex/uap_cmd.c +++ b/drivers/net/wireless/mwifiex/uap_cmd.c | |||
@@ -19,6 +19,17 @@ | |||
19 | 19 | ||
20 | #include "main.h" | 20 | #include "main.h" |
21 | 21 | ||
22 | /* This function initializes some of mwifiex_uap_bss_param variables. | ||
23 | * This helps FW in ignoring invalid values. These values may or may not | ||
24 | * be get updated to valid ones at later stage. | ||
25 | */ | ||
26 | void mwifiex_set_sys_config_invalid_data(struct mwifiex_uap_bss_param *config) | ||
27 | { | ||
28 | config->rts_threshold = 0x7FFF; | ||
29 | config->frag_threshold = 0x7FFF; | ||
30 | config->retry_limit = 0x7F; | ||
31 | } | ||
32 | |||
22 | /* Parse AP config structure and prepare TLV based command structure | 33 | /* Parse AP config structure and prepare TLV based command structure |
23 | * to be sent to FW for uAP configuration | 34 | * to be sent to FW for uAP configuration |
24 | */ | 35 | */ |
@@ -28,6 +39,9 @@ static int mwifiex_cmd_uap_sys_config(struct host_cmd_ds_command *cmd, | |||
28 | u8 *tlv; | 39 | u8 *tlv; |
29 | struct host_cmd_ds_sys_config *sys_config = &cmd->params.uap_sys_config; | 40 | struct host_cmd_ds_sys_config *sys_config = &cmd->params.uap_sys_config; |
30 | struct host_cmd_tlv_channel_band *chan_band; | 41 | struct host_cmd_tlv_channel_band *chan_band; |
42 | struct host_cmd_tlv_frag_threshold *frag_threshold; | ||
43 | struct host_cmd_tlv_rts_threshold *rts_threshold; | ||
44 | struct host_cmd_tlv_retry_limit *retry_limit; | ||
31 | struct mwifiex_uap_bss_param *bss_cfg = cmd_buf; | 45 | struct mwifiex_uap_bss_param *bss_cfg = cmd_buf; |
32 | u16 cmd_size; | 46 | u16 cmd_size; |
33 | 47 | ||
@@ -49,6 +63,39 @@ static int mwifiex_cmd_uap_sys_config(struct host_cmd_ds_command *cmd, | |||
49 | cmd_size += sizeof(struct host_cmd_tlv_channel_band); | 63 | cmd_size += sizeof(struct host_cmd_tlv_channel_band); |
50 | tlv += sizeof(struct host_cmd_tlv_channel_band); | 64 | tlv += sizeof(struct host_cmd_tlv_channel_band); |
51 | } | 65 | } |
66 | if (bss_cfg->rts_threshold <= MWIFIEX_RTS_MAX_VALUE) { | ||
67 | rts_threshold = (struct host_cmd_tlv_rts_threshold *)tlv; | ||
68 | rts_threshold->tlv.type = | ||
69 | cpu_to_le16(TLV_TYPE_UAP_RTS_THRESHOLD); | ||
70 | rts_threshold->tlv.len = | ||
71 | cpu_to_le16(sizeof(struct host_cmd_tlv_rts_threshold) - | ||
72 | sizeof(struct host_cmd_tlv)); | ||
73 | rts_threshold->rts_thr = cpu_to_le16(bss_cfg->rts_threshold); | ||
74 | cmd_size += sizeof(struct host_cmd_tlv_frag_threshold); | ||
75 | tlv += sizeof(struct host_cmd_tlv_frag_threshold); | ||
76 | } | ||
77 | if ((bss_cfg->frag_threshold >= MWIFIEX_FRAG_MIN_VALUE) && | ||
78 | (bss_cfg->frag_threshold <= MWIFIEX_FRAG_MAX_VALUE)) { | ||
79 | frag_threshold = (struct host_cmd_tlv_frag_threshold *)tlv; | ||
80 | frag_threshold->tlv.type = | ||
81 | cpu_to_le16(TLV_TYPE_UAP_FRAG_THRESHOLD); | ||
82 | frag_threshold->tlv.len = | ||
83 | cpu_to_le16(sizeof(struct host_cmd_tlv_frag_threshold) - | ||
84 | sizeof(struct host_cmd_tlv)); | ||
85 | frag_threshold->frag_thr = cpu_to_le16(bss_cfg->frag_threshold); | ||
86 | cmd_size += sizeof(struct host_cmd_tlv_frag_threshold); | ||
87 | tlv += sizeof(struct host_cmd_tlv_frag_threshold); | ||
88 | } | ||
89 | if (bss_cfg->retry_limit <= MWIFIEX_RETRY_LIMIT) { | ||
90 | retry_limit = (struct host_cmd_tlv_retry_limit *)tlv; | ||
91 | retry_limit->tlv.type = cpu_to_le16(TLV_TYPE_UAP_RETRY_LIMIT); | ||
92 | retry_limit->tlv.len = | ||
93 | cpu_to_le16(sizeof(struct host_cmd_tlv_retry_limit) - | ||
94 | sizeof(struct host_cmd_tlv)); | ||
95 | retry_limit->limit = (u8)bss_cfg->retry_limit; | ||
96 | cmd_size += sizeof(struct host_cmd_tlv_retry_limit); | ||
97 | tlv += sizeof(struct host_cmd_tlv_retry_limit); | ||
98 | } | ||
52 | 99 | ||
53 | cmd->size = cpu_to_le16(cmd_size); | 100 | cmd->size = cpu_to_le16(cmd_size); |
54 | return 0; | 101 | return 0; |