summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnjaneedevi Kapparapu <akappa@codeaurora.org>2015-05-12 20:06:40 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2015-05-12 20:07:37 +0530
commit5e097f58efbe87433fe959697ed301be9fd6149c (patch)
treeb66b3819357d379a6af37f1b6a47ce4911b8cfca
parentd05f25844f1c3daf84632d73c2ea1e3ac2d932f3 (diff)
parentb9cfa0ffdef8559af4fdde8ea2387dabdf342891 (diff)
Release 4.0.10.96 QCACLD WLAN Driver
Merge remote-tracking branch 'origin/caf/caf-wlan/master' into HEAD * origin/caf/caf-wlan/master: Cafstaging Release 4.0.10.96 qcacld: Kbuild: Enable Runtime PM Support. qcacld: protect mgmt flow in SSR case qcacld: Make the OCB RX stats header optional qcacld: setUnitTestCmd is no longer dependent on WLAN_FEATURE_ROAM_OFFLOAD qcacld: Fix having wlan0 and wlanocb0 up concurrently SAP: update VHT SGI capability based on channel bandwidth qcacld-2.0: Remove unused header file inclusion Change-Id: Ib91147c054243c45dc785bcb42d54d6170588c77
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c5
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx.c86
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx_types.h9
-rw-r--r--CORE/HDD/src/wlan_hdd_ocb.c26
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/sirApi.h7
-rw-r--r--CORE/SERVICES/WMA/wma.c13
-rw-r--r--CORE/SERVICES/WMA/wma_ocb.c60
-rw-r--r--CORE/SERVICES/WMI/wmi_unified.c21
-rw-r--r--CORE/SYS/legacy/src/utils/src/parserApi.c35
-rw-r--r--Kbuild2
11 files changed, 194 insertions, 74 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index b1d9bb683e56..5523c90bb191 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -768,6 +768,11 @@ static int tlshim_mgmt_rx_wmi_handler(void *context, u_int8_t *data,
vos_ctx);
VOS_STATUS ret = VOS_STATUS_SUCCESS;
+ if (vos_is_logp_in_progress(VOS_MODULE_ID_TL, NULL)) {
+ TLSHIM_LOGE("%s: LOPG in progress\n", __func__);
+ return (-1);
+ }
+
adf_os_spin_lock_bh(&tl_shim->mgmt_lock);
ret = tlshim_mgmt_rx_process(context, data, data_len, FALSE, 0);
adf_os_spin_unlock_bh(&tl_shim->mgmt_lock);
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx.c b/CORE/CLD_TXRX/TXRX/ol_rx.c
index 67d17a140ac8..00f9d48e0fa1 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx.c
@@ -950,20 +950,35 @@ DONE:
} else {
/* If this is for OCB, then prepend the RX stats header. */
if (vdev->opmode == wlan_op_mode_ocb) {
- struct ether_header eth_header = {{0}};
- struct ocb_rx_stats_hdr_t rx_header = {0};
- /* Construct the RX stats header and push that to the front
- of the packet. */
- rx_header.version = 1;
- rx_header.length = sizeof(rx_header);
- rx_header.channel_freq = (vdev->ocb_channel_event.is_valid) ?
- vdev->ocb_channel_event.mhz
- : 0;
- rx_header.rssi_cmb = peer->last_pkt_rssi_cmb;
- adf_os_mem_copy(rx_header.rssi, peer->last_pkt_rssi,
- sizeof(rx_header.rssi));
- if (peer->last_pkt_legacy_rate_sel == 0) {
- switch (peer->last_pkt_legacy_rate) {
+ int i;
+ struct ol_txrx_ocb_chan_info *chan_info = 0;
+ int packet_freq = (vdev->ocb_channel_event.is_valid) ?
+ vdev->ocb_channel_event.mhz : 0;
+ for (i = 0; i < vdev->ocb_channel_count; i++) {
+ if (vdev->ocb_channel_info[i].chan_freq == packet_freq) {
+ chan_info = &vdev->ocb_channel_info[i];
+ break;
+ }
+ }
+ if (!chan_info || !chan_info->disable_rx_stats_hdr) {
+ struct ether_header eth_header = { {0} };
+ struct ocb_rx_stats_hdr_t rx_header = {0};
+
+ /*
+ * Construct the RX stats header and push that to the front
+ * of the packet.
+ */
+ rx_header.version = 1;
+ rx_header.length = sizeof(rx_header);
+ rx_header.channel_freq =
+ (vdev->ocb_channel_event.is_valid) ?
+ vdev->ocb_channel_event.mhz
+ : 0;
+ rx_header.rssi_cmb = peer->last_pkt_rssi_cmb;
+ adf_os_mem_copy(rx_header.rssi, peer->last_pkt_rssi,
+ sizeof(rx_header.rssi));
+ if (peer->last_pkt_legacy_rate_sel == 0) {
+ switch (peer->last_pkt_legacy_rate) {
case 0x8:
rx_header.datarate = 6;
break;
@@ -991,29 +1006,30 @@ DONE:
default:
rx_header.datarate = 0xFF;
break;
+ }
+ } else {
+ rx_header.datarate = 0xFF;
}
- } else {
- rx_header.datarate = 0xFF;
- }
- rx_header.timestamp_microsec =
- peer->last_pkt_timestamp_microsec;
- rx_header.timestamp_submicrosec =
- peer->last_pkt_timestamp_submicrosec;
- rx_header.tsf32 = peer->last_pkt_tsf;
- rx_header.ext_tid = peer->last_pkt_tid;
-
- adf_nbuf_push_head(msdu, sizeof(rx_header));
- adf_os_mem_copy(adf_nbuf_data(msdu), &rx_header,
- sizeof(rx_header));
-
- /* Construct the ethernet header with type 0x8152 and push
- that to the front of the packet to indicate the RX stats
- header. */
- eth_header.ether_type = adf_os_htons(ETHERTYPE_OCB_RX);
- adf_nbuf_push_head(msdu, sizeof(eth_header));
- adf_os_mem_copy(adf_nbuf_data(msdu), &eth_header,
- sizeof(eth_header));
+ rx_header.timestamp_microsec =
+ peer->last_pkt_timestamp_microsec;
+ rx_header.timestamp_submicrosec =
+ peer->last_pkt_timestamp_submicrosec;
+ rx_header.tsf32 = peer->last_pkt_tsf;
+ rx_header.ext_tid = peer->last_pkt_tid;
+
+ adf_nbuf_push_head(msdu, sizeof(rx_header));
+ adf_os_mem_copy(adf_nbuf_data(msdu), &rx_header,
+ sizeof(rx_header));
+
+ /* Construct the ethernet header with type 0x8152 and push
+ that to the front of the packet to indicate the RX stats
+ header. */
+ eth_header.ether_type = adf_os_htons(ETHERTYPE_OCB_RX);
+ adf_nbuf_push_head(msdu, sizeof(eth_header));
+ adf_os_mem_copy(adf_nbuf_data(msdu), &eth_header,
+ sizeof(eth_header));
+ }
}
OL_RX_PEER_STATS_UPDATE(peer, msdu);
OL_RX_ERR_STATISTICS_1(pdev, vdev, peer, rx_desc, OL_RX_ERR_NONE);
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
index d4b526d9aed1..68a215a25426 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
@@ -775,6 +775,11 @@ struct ol_txrx_pdev_t {
u_int16_t tx_pkt_histrogram[TXRX_DATA_HISTROGRAM_NUM_INTERVALS];
};
+struct ol_txrx_ocb_chan_info {
+ uint32_t chan_freq;
+ uint16_t disable_rx_stats_hdr:1;
+};
+
struct ol_txrx_vdev_t {
/* pdev - the physical device that is the parent of this virtual device */
struct ol_txrx_pdev_t *pdev;
@@ -873,6 +878,10 @@ struct ol_txrx_vdev_t {
uint16_t band_center_freq2;
WLAN_PHY_MODE phy_mode;
} ocb_channel_event;
+
+ /* Information about the schedules in the schedule */
+ struct ol_txrx_ocb_chan_info *ocb_channel_info;
+ uint32_t ocb_channel_count;
};
struct ol_rx_reorder_array_elem_t {
diff --git a/CORE/HDD/src/wlan_hdd_ocb.c b/CORE/HDD/src/wlan_hdd_ocb.c
index 379e53c39491..66780509a0f5 100644
--- a/CORE/HDD/src/wlan_hdd_ocb.c
+++ b/CORE/HDD/src/wlan_hdd_ocb.c
@@ -346,6 +346,7 @@ static int hdd_ocb_register_sta(hdd_adapter_t *adapter)
VOS_STATUS vos_status = VOS_STATUS_E_FAILURE;
WLAN_STADescType sta_desc = {0};
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+ hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
u_int8_t peer_id;
v_MACADDR_t wildcardBSSID = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
@@ -359,12 +360,7 @@ static int hdd_ocb_register_sta(hdd_adapter_t *adapter)
return -EINVAL;
}
- /*
- * Register adapter for STA ID 0
- * TODO-OCB: This is for standalone 802.11p only. We need to change this
- * for concurrent mode
- */
- hdd_ctx->sta_to_adapter[0] = adapter;
+ hdd_ctx->sta_to_adapter[peer_id] = adapter;
sta_desc.ucSTAId = peer_id;
/* Fill in MAC addresses */
@@ -389,6 +385,15 @@ static int hdd_ocb_register_sta(hdd_adapter_t *adapter)
return -EINVAL;
}
+ if (pHddStaCtx->conn_info.staId[0] != 0 &&
+ pHddStaCtx->conn_info.staId[0] != peer_id) {
+ hddLog(LOGE, FL("The ID for the OCB station has changed."));
+ }
+
+ pHddStaCtx->conn_info.staId[0] = peer_id;
+ vos_copy_macaddr(&pHddStaCtx->conn_info.peerMacAddress[0],
+ &adapter->macAddressCurrent);
+
return 0;
}
@@ -823,7 +828,8 @@ static const struct nla_policy qca_wlan_vendor_dcc_update_ndl[
struct wlan_hdd_ocb_config_channel {
uint32_t chan_freq;
uint32_t bandwidth;
- tSirMacAddr mac_address;
+ uint16_t flags;
+ uint8_t reserved[4];
sir_qos_params_t qos_params[MAX_NUM_AC];
uint32_t max_pwr;
uint32_t min_pwr;
@@ -841,8 +847,6 @@ static void wlan_hdd_ocb_config_channel_to_sir_ocb_config_channel(
for (i = 0; i < channel_count; i++) {
dest[i].chan_freq = src[i].chan_freq;
dest[i].bandwidth = src[i].bandwidth;
- vos_mem_copy(dest[i].mac_address, src[i].mac_address,
- sizeof(dest[i].mac_address));
vos_mem_copy(dest[i].qos_params, src[i].qos_params,
sizeof(dest[i].qos_params));
/*
@@ -854,6 +858,7 @@ static void wlan_hdd_ocb_config_channel_to_sir_ocb_config_channel(
*/
dest[i].max_pwr = src[i].max_pwr / 2;
dest[i].min_pwr = (src[i].min_pwr + 1) / 2;
+ dest[i].flags = src[i].flags;
}
}
@@ -958,6 +963,9 @@ int wlan_hdd_cfg80211_ocb_set_config(struct wiphy *wiphy,
wlan_hdd_ocb_config_channel_to_sir_ocb_config_channel(
config->channels, nla_data(channel_array), channel_count);
+ /* Identify the vdev interface */
+ config->session_id = adapter->sessionId;
+
/* Release all the mac addresses used for OCB */
for (i = 0; i < adapter->ocb_mac_addr_count; i++) {
wlan_hdd_release_intf_addr(adapter->pHddCtx,
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index b51be0a92d2d..4e98a6afbb7c 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 10
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 95
+#define QWLAN_VERSION_BUILD 96
-#define QWLAN_VERSIONSTR "4.0.10.95A"
+#define QWLAN_VERSIONSTR "4.0.10.96"
#define AR6320_REV1_VERSION 0x5000000
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 2ed46f1c4fcb..8d136ef4efef 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -5906,9 +5906,16 @@ struct sir_ocb_config_channel {
uint32_t min_pwr;
uint8_t reg_pwr;
uint8_t antenna_max;
+ uint16_t flags;
};
/**
+ * OCB_CHANNEL_FLAG_NO_RX_HDR - Don't add the RX stats header to packets
+ * received on this channel.
+ */
+#define OCB_CHANNEL_FLAG_DISABLE_RX_STATS_HDR (1 << 0)
+
+/**
* struct sir_ocb_config_sched
* @chan_freq: frequency of the channel
* @total_duration: duration of the schedule
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 9a9dd04fbb83..9b3fb1cee136 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -59,7 +59,6 @@
#include "aniGlobal.h"
#include "wmi_unified.h"
#include "wniCfgAp.h"
-#include "wlan_hal_cfg.h"
#include "cfgApi.h"
#include "ol_txrx_ctrl_api.h"
#if defined(CONFIG_HL_SUPPORT)
@@ -23960,7 +23959,6 @@ static VOS_STATUS wma_nan_req(void *wda_handle, tpNanRequest nan_req)
}
#endif
-#ifdef WLAN_FEATURE_ROAM_OFFLOAD
static void wma_process_unit_test_cmd(WMA_HANDLE handle,
t_wma_unit_test_cmd *wma_utest)
{
@@ -24010,7 +24008,6 @@ static void wma_process_unit_test_cmd(WMA_HANDLE handle,
}
return;
}
-#endif
VOS_STATUS wma_scan_probe_setoui(tp_wma_handle wma,
tSirScanMacOui *psetoui)
@@ -25310,17 +25307,17 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg)
vos_mem_free(msg->bodyptr);
break;
#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+ case SIR_HAL_UNIT_TEST_CMD:
+ wma_process_unit_test_cmd(wma_handle,
+ (t_wma_unit_test_cmd *)msg->bodyptr);
+ vos_mem_free(msg->bodyptr);
+ break;
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
case WDA_ROAM_OFFLOAD_SYNCH_CNF:
wma_process_roam_synch_complete(wma_handle,
(tSirSmeRoamOffloadSynchCnf *)msg->bodyptr);
vos_mem_free(msg->bodyptr);
break;
- case SIR_HAL_UNIT_TEST_CMD:
- wma_process_unit_test_cmd(wma_handle,
- (t_wma_unit_test_cmd *)msg->bodyptr);
- vos_mem_free(msg->bodyptr);
- break;
case WDA_ROAM_OFFLOAD_SYNCH_FAIL:
wma_process_roam_synch_fail(wma_handle,
(tSirRoamOffloadSynchFail *)msg->bodyptr);
diff --git a/CORE/SERVICES/WMA/wma_ocb.c b/CORE/SERVICES/WMA/wma_ocb.c
index bbf127e0af5d..b283122b6320 100644
--- a/CORE/SERVICES/WMA/wma_ocb.c
+++ b/CORE/SERVICES/WMA/wma_ocb.c
@@ -44,6 +44,44 @@ int wma_ocb_set_config_resp(tp_wma_handle wma_handle, uint8_t status)
VOS_STATUS vos_status;
struct sir_ocb_set_config_response *resp;
vos_msg_t msg = {0};
+ struct sir_ocb_config *req = wma_handle->ocb_config_req;
+ ol_txrx_vdev_handle vdev = (req ?
+ wma_handle->interfaces[req->session_id].handle : 0);
+
+ /*
+ * If the command was successful, save the channel information in the
+ * vdev.
+ */
+ if (status == VOS_STATUS_SUCCESS) {
+ if (vdev && req) {
+ if (vdev->ocb_channel_info)
+ vos_mem_free(vdev->ocb_channel_info);
+ vdev->ocb_channel_count =
+ req->channel_count;
+ if (req->channel_count) {
+ int i;
+ int buf_size = sizeof(*vdev->ocb_channel_info) *
+ req->channel_count;
+ vdev->ocb_channel_info =
+ vos_mem_malloc(buf_size);
+ vos_mem_zero(vdev->ocb_channel_info, buf_size);
+ for (i = 0; i < req->channel_count; i++) {
+ vdev->ocb_channel_info[i].chan_freq =
+ req->channels[i].chan_freq;
+ if (req->channels[i].flags &
+ OCB_CHANNEL_FLAG_DISABLE_RX_STATS_HDR)
+ vdev->ocb_channel_info[i].
+ disable_rx_stats_hdr = 1;
+ }
+ } else {
+ vdev->ocb_channel_info = 0;
+ }
+ }
+ }
+
+ /* Free the configuration that was saved in wma_ocb_set_config. */
+ vos_mem_free(wma_handle->ocb_config_req);
+ wma_handle->ocb_config_req = 0;
resp = vos_mem_malloc(sizeof(*resp));
if (!resp)
@@ -139,6 +177,7 @@ int wma_ocb_set_config_req(tp_wma_handle wma_handle,
return status;
}
req.chan = OCB_FREQ_TO_CHAN(config_req->channels[0].chan_freq);
+ req.vdev_id = msg->vdev_id;
if (wma_handle->ocb_config_req)
vos_mem_free(wma_handle->ocb_config_req);
@@ -166,12 +205,6 @@ int wma_ocb_start_resp_ind_cont(tp_wma_handle wma_handle)
}
vos_status = wma_ocb_set_config(wma_handle, wma_handle->ocb_config_req);
- /*
- * Depending on the return value from the request handler, either
- * we need to save the context or delete it.
- */
- vos_mem_free(wma_handle->ocb_config_req);
- wma_handle->ocb_config_req = 0;
return vos_status;
}
@@ -368,9 +401,24 @@ int wma_ocb_set_config(tp_wma_handle wma_handle, struct sir_ocb_config *config)
buf_ptr += sizeof(*sched_elem);
}
+ /*
+ * Save the configuration so that it can be used in
+ * wma_ocb_set_config_event_handler.
+ */
+ if (wma_handle->ocb_config_req != config) {
+ if (wma_handle->ocb_config_req)
+ vos_mem_free(wma_handle->ocb_config_req);
+ wma_handle->ocb_config_req = copy_sir_ocb_config(config);
+ }
+
ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
WMI_OCB_SET_CONFIG_CMDID);
if (ret != EOK) {
+ if (wma_handle->ocb_config_req) {
+ vos_mem_free(wma_handle->ocb_config_req);
+ wma_handle->ocb_config_req = 0;
+ }
+
WMA_LOGE("Failed to set OCB config");
wmi_buf_free(buf);
return -EIO;
diff --git a/CORE/SERVICES/WMI/wmi_unified.c b/CORE/SERVICES/WMI/wmi_unified.c
index d3a3813ee064..a76a505ba4ca 100644
--- a/CORE/SERVICES/WMI/wmi_unified.c
+++ b/CORE/SERVICES/WMI/wmi_unified.c
@@ -761,6 +761,7 @@ int wmi_unified_register_event_handler(wmi_unified_t wmi_handle,
wmi_handle->event_handler[idx] = handler_func;
wmi_handle->event_id[idx] = event_id;
wmi_handle->max_event_idx++;
+
return 0;
}
@@ -843,6 +844,12 @@ void wmi_control_rx(void *ctx, HTC_PACKET *htc_packet)
u_int32_t id;
u_int8_t *data;
#endif
+
+ if (vos_is_logp_in_progress(VOS_MODULE_ID_WDA, NULL)) {
+ pr_err("%s: LOPG in progress\n", __func__);
+ return;
+ }
+
evt_buf = (wmi_buf_t) htc_packet->pPktContext;
#ifndef QCA_CONFIG_SMP
id = WMI_GET_FIELD(adf_nbuf_data(evt_buf), WMI_CMD_HDR, COMMANDID);
@@ -903,6 +910,11 @@ void __wmi_control_rx(struct wmi_unified *wmi_handle, wmi_buf_t evt_buf)
void *wmi_cmd_struct_ptr = NULL;
int tlv_ok_status = 0;
+ if (vos_is_logp_in_progress(VOS_MODULE_ID_WDA, NULL)) {
+ pr_err("%s: LOPG in progress\n", __func__);
+ return;
+ }
+
id = WMI_GET_FIELD(adf_nbuf_data(evt_buf), WMI_CMD_HDR, COMMANDID);
if (adf_nbuf_pull_head(evt_buf, sizeof(WMI_CMD_HDR)) == NULL)
@@ -967,7 +979,7 @@ end:
adf_nbuf_free(evt_buf);
}
-void wmi_rx_event_work(struct work_struct *work)
+void __wmi_rx_event_work(struct work_struct *work)
{
struct wmi_unified *wmi = container_of(work, struct wmi_unified,
rx_event_work);
@@ -984,6 +996,13 @@ void wmi_rx_event_work(struct work_struct *work)
}
}
+void wmi_rx_event_work(struct work_struct *work)
+{
+ vos_ssr_protect(__func__);
+ __wmi_rx_event_work(work);
+ vos_ssr_unprotect(__func__);
+}
+
/* WMI Initialization functions */
void *
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index e72288496acb..423e555a6d4b 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -906,21 +906,32 @@ PopulateDot11fVHTCaps(tpAniSirGlobal pMac,
nCfgValue );
pDot11f->ldpcCodingCap = (nCfgValue & 0x0001);
+ /* In AP mode set the SGI80 based on channel bandwidth */
+ if (psessionEntry->vhtTxChannelWidthSet !=
+ WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
+ pDot11f->shortGI80MHz= 0;
+ else {
+ nCfgValue = 0;
+ if (psessionEntry->htConfig.ht_sgi)
+ CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SHORT_GI_80MHZ,
+ nCfgValue );
- nCfgValue = 0;
- if (psessionEntry->htConfig.ht_sgi)
- CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SHORT_GI_80MHZ,
- nCfgValue );
-
- pDot11f->shortGI80MHz= (nCfgValue & 0x0001);
+ pDot11f->shortGI80MHz= (nCfgValue & 0x0001);
+ }
- nCfgValue = 0;
- if (psessionEntry->htConfig.ht_sgi)
- CFG_GET_INT( nStatus, pMac,
- WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ,
- nCfgValue );
+ /* In AP mode set the SGI 160/(80+80) based on channel bandwidth */
+ if (psessionEntry->vhtTxChannelWidthSet <
+ WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
+ pDot11f->shortGI160and80plus80MHz = 0;
+ else {
+ nCfgValue = 0;
+ if (psessionEntry->htConfig.ht_sgi)
+ CFG_GET_INT( nStatus, pMac,
+ WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ,
+ nCfgValue );
- pDot11f->shortGI160and80plus80MHz = (nCfgValue & 0x0001);
+ pDot11f->shortGI160and80plus80MHz = (nCfgValue & 0x0001);
+ }
nCfgValue = 0;
if (psessionEntry->htConfig.ht_tx_stbc)
diff --git a/Kbuild b/Kbuild
index 6bcd47f4831a..b79ac8a5df7f 100644
--- a/Kbuild
+++ b/Kbuild
@@ -1326,7 +1326,7 @@ endif
# Flag to enable bus auto suspend
ifeq ($(CONFIG_BUS_AUTO_SUSPEND), 1)
-CDEFINES += -DFEATURE_BUS_AUTO_SUSPEND
+CDEFINES += -DFEATURE_RUNTIME_PM
endif
# Some kernel include files are being moved. Check to see if