summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnjaneedevi Kapparapu <akappa@codeaurora.org>2015-03-06 19:51:48 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2015-03-06 19:52:50 +0530
commit29ce153a1af894ce6a803132d404e28900c745e2 (patch)
tree7f141bac82b9d5b163c60176556f82dc224510fd
parent903230916096d26fb412234595197922c9b730f5 (diff)
parent4963fd68ed4a1bf0592448e1a2572cb5ac9552f1 (diff)
Release 4.0.10.49 QCACLD WLAN Driver
Merge remote-tracking branch 'origin/caf/caf-wlan/master' into HEAD * origin/caf/caf-wlan/master: Cafstaging Release 4.0.10.49 qcacld: limit vdev_ll_pause_start_timer call with TXRX_VDEV_LL_TXQ. qcacld: Adjust Tx skb length by removing frag_head and ipa_head size qcacld: Support for 5.9 GHz channels in the regulatory domain. qcacld2.0: Adding debug count to track CE post nbuf errors. Change-Id: Iaed49060cba16f3048c0093c788705acc132f235
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx.h2
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_queue.c5
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c2
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c17
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c4
-rw-r--r--CORE/HDD/src/wlan_hdd_ipa.c5
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c348
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/sirApi.h1
-rw-r--r--CORE/MAC/inc/sirMacProtDef.h2
-rw-r--r--CORE/SERVICES/HIF/PCIe/hif_pci.c82
-rw-r--r--CORE/SERVICES/HIF/PCIe/hif_pci.h5
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c4
-rw-r--r--CORE/SERVICES/WMA/wlan_nv.c34
-rw-r--r--CORE/SERVICES/WMA/wma.c14
-rw-r--r--CORE/SERVICES/WMA/wma.h2
-rw-r--r--CORE/SME/inc/csrApi.h2
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c26
-rw-r--r--CORE/SME/src/csr/csrApiScan.c32
-rw-r--r--CORE/VOSS/src/vos_nvitem.c161
-rwxr-xr-xKbuild7
-rw-r--r--wcnss/inc/wlan_nv.h37
22 files changed, 563 insertions, 233 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.h b/CORE/CLD_TXRX/TXRX/ol_tx.h
index f099b1a58fbc..a2290ae0cc6b 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx.h
+++ b/CORE/CLD_TXRX/TXRX/ol_tx.h
@@ -73,6 +73,7 @@ ol_tx_reinject(struct ol_txrx_vdev_t *vdev, adf_nbuf_t msdu, u_int16_t peer_id);
void
ol_txrx_mgmt_tx_complete(void *ctxt, adf_nbuf_t netbuf, int err);
+#ifdef QCA_SUPPORT_TXRX_VDEV_LL_TXQ
/**
* ol_tx_vdev_ll_pause_start_timer() - Start ll-q pause timer for specific virtual device
* @vdev: the virtual device
@@ -86,6 +87,7 @@ ol_txrx_mgmt_tx_complete(void *ctxt, adf_nbuf_t netbuf, int err);
*/
void
ol_tx_vdev_ll_pause_start_timer(struct ol_txrx_vdev_t *vdev);
+#endif
void
ol_tx_pdev_ll_pause_queue_send_all(struct ol_txrx_pdev_t *pdev);
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_queue.c b/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
index 6022d229af45..235391a15eeb 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
@@ -588,11 +588,14 @@ ol_txrx_vdev_unpause(ol_txrx_vdev_handle vdev, u_int32_t reason)
if (vdev->ll_pause.paused_reason & reason)
{
vdev->ll_pause.paused_reason &= ~reason;
+#ifdef QCA_SUPPORT_TXRX_VDEV_LL_TXQ
if (reason == OL_TXQ_PAUSE_REASON_VDEV_SUSPEND) {
adf_os_spin_unlock_bh(&vdev->ll_pause.mutex);
ol_tx_vdev_ll_pause_start_timer(vdev);
}
- else if (!vdev->ll_pause.paused_reason) {
+ else
+#endif
+ if (!vdev->ll_pause.paused_reason) {
adf_os_spin_unlock_bh(&vdev->ll_pause.mutex);
ol_tx_vdev_ll_pause_queue_send(vdev);
} else {
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index a7c7314e7007..e993e3c7261d 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -192,7 +192,7 @@ eCsrBand hdd_connGetConnectedBand( hdd_station_ctx_t *pHddStaCtx )
if ( staChannel > 0 && staChannel < 14 )
return eCSR_BAND_24;
- else if (staChannel >= 36 && staChannel <= 165 )
+ else if (staChannel >= 36 && staChannel <= 184 )
return eCSR_BAND_5G;
else /* If station is not connected return as eCSR_BAND_ALL */
return eCSR_BAND_ALL;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 93c3947fabdf..0cdda413b49f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -306,6 +306,23 @@ static struct ieee80211_channel hdd_channels_5_GHZ[] =
HDD5GHZCHAN(5785,157, 0) ,
HDD5GHZCHAN(5805,161, 0) ,
HDD5GHZCHAN(5825,165, 0) ,
+#ifndef FEATURE_STATICALLY_ADD_11P_CHANNELS
+ HDD5GHZCHAN(5850,170, 0) ,
+ HDD5GHZCHAN(5855,171, 0) ,
+ HDD5GHZCHAN(5860,172, 0) ,
+ HDD5GHZCHAN(5865,173, 0) ,
+ HDD5GHZCHAN(5870,174, 0) ,
+ HDD5GHZCHAN(5875,175, 0) ,
+ HDD5GHZCHAN(5880,176, 0) ,
+ HDD5GHZCHAN(5885,177, 0) ,
+ HDD5GHZCHAN(5890,178, 0) ,
+ HDD5GHZCHAN(5895,179, 0) ,
+ HDD5GHZCHAN(5900,180, 0) ,
+ HDD5GHZCHAN(5905,181, 0) ,
+ HDD5GHZCHAN(5910,182, 0) ,
+ HDD5GHZCHAN(5915,183, 0) ,
+ HDD5GHZCHAN(5920,184, 0) ,
+#endif
};
static struct ieee80211_rate g_mode_rates[] =
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index e41c109d3985..88f5223dd55d 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -3758,7 +3758,7 @@ static int __iw_softap_get_channel_list(struct net_device *dev,
v_U32_t num_channels = 0;
v_U8_t i = 0;
v_U8_t bandStartChannel = RF_CHAN_1;
- v_U8_t bandEndChannel = RF_CHAN_165;
+ v_U8_t bandEndChannel = RF_CHAN_184;
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
tpChannelListInfo channel_list = (tpChannelListInfo) extra;
@@ -3780,7 +3780,7 @@ static int __iw_softap_get_channel_list(struct net_device *dev,
else if (eCSR_BAND_5G == curBand)
{
bandStartChannel = RF_CHAN_36;
- bandEndChannel = RF_CHAN_165;
+ bandEndChannel = RF_CHAN_184;
}
hddLog(LOG1, FL("curBand = %d, bandStartChannel = %hu, "
diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c
index ac1d22edcef0..bbb689658efc 100644
--- a/CORE/HDD/src/wlan_hdd_ipa.c
+++ b/CORE/HDD/src/wlan_hdd_ipa.c
@@ -2477,7 +2477,6 @@ static void hdd_ipa_send_pkt_to_tl(struct hdd_ipa_iface_context *iface_context,
interface_id = adapter->sessionId;
++adapter->stats.tx_packets;
- adapter->stats.tx_bytes += ipa_tx_desc->skb->len;
adf_os_spin_unlock_bh(&iface_context->interface_lock);
@@ -2489,12 +2488,16 @@ static void hdd_ipa_send_pkt_to_tl(struct hdd_ipa_iface_context *iface_context,
#ifdef IPA_UC_STA_OFFLOAD
NBUF_MAPPED_PADDR_LO(skb) = ipa_tx_desc->dma_addr
+ sizeof(struct frag_header) + sizeof(struct ipa_header);
+ ipa_tx_desc->skb->len -=
+ sizeof(struct frag_header) + sizeof(struct ipa_header);
#else
NBUF_MAPPED_PADDR_LO(skb) = ipa_tx_desc->dma_addr;
#endif
NBUF_OWNER_PRIV_DATA(skb) = (unsigned long)ipa_tx_desc;
+ adapter->stats.tx_bytes += ipa_tx_desc->skb->len;
+
skb = WLANTL_SendIPA_DataFrame(hdd_ipa->hdd_ctx->pvosContext,
iface_context->tl_context, ipa_tx_desc->skb,
interface_id);
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index f4e82261e009..6b5c1562f58c 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -129,7 +129,10 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2},
{5520, 104}, {5540, 108}, {5560, 112}, {5580, 116}, {5600, 120},
{5620, 124}, {5640, 128}, {5660, 132}, {5680, 136}, {5700, 140},
{5720, 144}, {5745, 149}, {5765, 153}, {5785, 157}, {5805, 161},
- {5825, 165} };
+ {5825, 165}, {5850, 170}, {5855, 171}, {5860, 172}, {5865, 173},
+ {5870, 174}, {5875, 175}, {5880, 176}, {5885, 177}, {5890, 178},
+ {5895, 179}, {5900, 180}, {5905, 181}, {5910, 182}, {5915, 183},
+ {5920, 184} };
#define FREQ_CHAN_MAP_TABLE_SIZE (sizeof(freq_chan_map)/sizeof(freq_chan_map[0]))
@@ -2898,18 +2901,12 @@ static int iw_get_linkspeed_priv(struct net_device *dev,
/* Structure definitions for WLAN_SET_DOT11P_CHANNEL_SCHED */
#define NUM_AC (4)
#define OCB_CHANNEL_MAX (5)
-#define DOT11P_TX_PWR_MAX (23)
#define AIFSN_MIN (2)
#define AIFSN_MAX (15)
#define CW_MIN (1)
#define CW_MAX (10)
#define HDD_OCB_SET_SCHED_TIME_OUT (1500)
-#define NUM_DOT11P_CHANNELS 9
-static const uint32_t valid_dot11p_channels[NUM_DOT11P_CHANNELS] = {
- 5860, 5870, 5880, 5890, 5900, 5910, 5920, 5875, 5905,
-};
-
/**
* struct ocb_qos_params - QoS Parameters for each AC
* @aifsn: Arbitration Inter-Frame Spacing
@@ -2942,6 +2939,7 @@ struct ocb_channel {
uint32_t tx_rate;
struct ocb_qos_params qos_params[NUM_AC];
uint32_t per_packet_rx_stats;
+ uint32_t bandwidth;
};
/**
@@ -2957,34 +2955,14 @@ struct dot11p_channel_sched {
};
/**
- * dot11p_validate_channel() - Check if specified channel is valid
- * @channel: Channel Frequency (MHz)
- *
- * Return: 0 on success. 1 on failure.
- */
-static int dot11p_validate_channel(uint32_t channel)
-{
- int i;
-
- for (i = 0; i < NUM_DOT11P_CHANNELS; i++) {
- if (channel == valid_dot11p_channels[i]) {
- return 0;
- }
- }
-
- return 1;
-}
-
-/**
- * dot11p_validate_qos_params() - Check if QoS parameters are valid
+ * dot11p_is_valid_qos() - Check if QoS parameters are valid
* @qos_params: Array of QoS parameters
*
- * Return: 0 on success. 1 on failure.
+ * Return: true if valid, false otherwise.
*/
-static int dot11p_validate_qos_params(struct ocb_qos_params qos_params[])
+static bool dot11p_is_valid_qos(struct ocb_qos_params qos_params[])
{
int i;
-
for (i = 0; i < NUM_AC; i++) {
if ((!qos_params[i].aifsn) && (!qos_params[i].cwmin)
&& (!qos_params[i].cwmax)) {
@@ -2994,50 +2972,177 @@ static int dot11p_validate_qos_params(struct ocb_qos_params qos_params[])
/* Validate AIFSN */
if ((qos_params[i].aifsn < AIFSN_MIN)
|| (qos_params[i].aifsn > AIFSN_MAX)) {
- return 1;
+ return false;
}
/* Validate CWMin */
if ((qos_params[i].cwmin < CW_MIN)
|| (qos_params[i].cwmin > CW_MAX)) {
- return 1;
+ return false;
}
/* Validate CWMax */
if ((qos_params[i].cwmax < CW_MIN)
|| (qos_params[i].cwmax > CW_MAX)) {
- return 1;
+ return false;
}
}
- return 0;
+ return true;
}
+#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
+
+#define DOT11P_TX_PWR_MAX (30)
+#define NUM_DOT11P_CHANNELS 9
+struct chan_info {
+ v_U32_t center_freq;
+ v_U32_t max_bandwidth;
+};
+
+struct chan_info valid_dot11p_channels[NUM_DOT11P_CHANNELS] = {
+ {5860, 10},
+ {5870, 10},
+ {5880, 10},
+ {5890, 10},
+ {5900, 10},
+ {5910, 10},
+ {5920, 10},
+ {5875, 20},
+ {5905, 20}
+};
+
/**
- * dot11p_validate_sched() - Check if schedule is valid
- * @sched: OCB channel schedule
+ * dot11p_is_valid_channel - returns true if the channel
+ * parameters is valid for a DSRC channel. This function of the
+ * function checks the channel parameters against a hardcoded
+ * list of valid channels based on the FCC rules.
+ *
+ * @param center_freq - the channel's center frequency
+ * @param bandwidth - the channel's bandwidth
+ * @param tx_power - transmit power
*
- * Return: 0 on success. 1 on failure.
+ * @return bool - true if the channel is valid, false otherwise
*/
-int dot11p_validate_sched(struct dot11p_channel_sched *sched)
+static bool dot11p_is_valid_channel(struct wiphy *wiphy,
+ struct ocb_channel *channel)
{
int i;
+ for (i = 0; i < NUM_DOT11P_CHANNELS; i++) {
+ if (channel->channel_freq == valid_dot11p_channels[i].center_freq) {
+ if (channel->bandwidth == 0)
+ channel->bandwidth = valid_dot11p_channels[i].max_bandwidth;
+ else if (channel->bandwidth >
+ valid_dot11p_channels[i].max_bandwidth)
+ return false;
+
+ if (channel->bandwidth != 5 && channel->bandwidth != 10 &&
+ channel->bandwidth != 20)
+ return false;
+ if (channel->tx_power > DOT11P_TX_PWR_MAX)
+ return false;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+#else
+
+/**
+ * dot11p_is_valid_channel - returns true if the channel
+ * parameters is valid for a DSRC channel.
+ *
+ * @param center_freq - the channel's center frequency
+ * @param bandwidth - the channel's bandwidth
+ * @param tx_power - transmit power
+ *
+ * @return bool - true if the channel is valid, false otherwise
+ */
+static bool dot11p_is_valid_channel(struct wiphy *wiphy,
+ struct ocb_channel *channel)
+{
+ int band_idx, channel_idx;
+ struct ieee80211_supported_band* current_band;
+ struct ieee80211_channel* current_channel;
+
+ for (band_idx = 0; band_idx < IEEE80211_NUM_BANDS; band_idx++) {
+ current_band = wiphy->bands[band_idx];
+ if (!current_band)
+ continue;
+
+ for (channel_idx = 0; channel_idx < current_band->n_channels;
+ channel_idx++) {
+ current_channel = &current_band->channels[channel_idx];
+
+ if (channel->channel_freq == current_channel->center_freq) {
+ if (current_channel->flags & IEEE80211_CHAN_DISABLED)
+ return false;
+
+ switch (channel->bandwidth) {
+ case 0:
+ if (current_channel->flags & IEEE80211_CHAN_NO_10MHZ)
+ channel->bandwidth = 5;
+ else if (current_channel->flags & IEEE80211_CHAN_NO_20MHZ)
+ channel->bandwidth = 10;
+ else
+ channel->bandwidth = 20;
+ break;
+ case 5:
+ break;
+ case 10:
+ if (current_channel->flags & IEEE80211_CHAN_NO_10MHZ)
+ return false;
+ break;
+ case 20:
+ if (current_channel->flags & IEEE80211_CHAN_NO_20MHZ)
+ return false;
+ break;
+ default:
+ return false;
+ }
+
+ if (channel->tx_power > current_channel->max_power)
+ return false;
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+#endif
+
+/**
+ * dot11p_validate_sched - validates the schedule against the
+ * current regulatory domain.
+ *
+ * @param pAdapter - The current adapter with the wiphy
+ * structure
+ * @param sched - The schedule that was provided from the user application
+ *
+ * @return int - 0 if the schedule was validated
+ */
+static int dot11p_validate_sched(hdd_adapter_t *pAdapter,
+ struct dot11p_channel_sched *sched)
+{
+ int i;
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+
if ((sched->num_channels > OCB_CHANNEL_MAX)
|| (sched->num_channels == 0)) {
goto error;
}
for (i = 0; i < sched->num_channels; i++) {
- /* Validate channel frequency */
- if (dot11p_validate_channel(sched->channels[i].channel_freq)) {
- goto error;
- }
-
- /* Validate TX Power */
- if (sched->channels[i].tx_power > DOT11P_TX_PWR_MAX) {
+ if (!dot11p_is_valid_channel(pHddCtx->wiphy,
+ &sched->channels[i]))
goto error;
- }
/* Validate TX Rate */
switch (sched->channels[i].tx_rate) {
@@ -3056,7 +3161,7 @@ int dot11p_validate_sched(struct dot11p_channel_sched *sched)
}
/* Validate QoS Params */
- if (dot11p_validate_qos_params(sched->channels[i].qos_params)) {
+ if (!(dot11p_is_valid_qos(sched->channels[i].qos_params))) {
goto error;
}
@@ -3069,7 +3174,7 @@ int dot11p_validate_sched(struct dot11p_channel_sched *sched)
return 0;
error:
- return 1;
+ return -1;
}
/**
@@ -3204,7 +3309,7 @@ static int __iw_set_dot11p_channel_sched(struct net_device *dev,
}
sched = (struct dot11p_channel_sched *)extra;
- if (dot11p_validate_sched(sched)) {
+ if (dot11p_validate_sched(adapter, sched)) {
hddLog(LOGE, FL("OCB schedule validation failed!"));
return -EINVAL;
}
@@ -3235,6 +3340,7 @@ static int __iw_set_dot11p_channel_sched(struct net_device *dev,
sched_ptr = &sched_req->sched;
sched_ptr->num_channels = 1;
sched_ptr->channels[0].chan_freq = sched->channels[0].channel_freq;
+ sched_ptr->channels[0].bandwidth = sched->channels[0].bandwidth;
sched_ptr->channels[0].tx_power = sched->channels[0].tx_power;
sched_ptr->channels[0].tx_rate = sched->channels[0].tx_rate;
for (i = 0; i < NUM_AC; i++) {
@@ -5998,25 +6104,25 @@ static int __iw_setint_getnone(struct net_device *dev,
break;
}
- case WE_SET_TXRX_FWSTATS:
- {
+ case WE_SET_TXRX_FWSTATS:
+ {
hddLog(LOG1, "WE_SET_TXRX_FWSTATS val %d", set_value);
ret = process_wma_set_command((int)pAdapter->sessionId,
- (int)WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID,
- set_value, VDEV_CMD);
- break;
- }
+ (int)WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID,
+ set_value, VDEV_CMD);
+ break;
+ }
- case WE_TXRX_FWSTATS_RESET:
- {
+ case WE_TXRX_FWSTATS_RESET:
+ {
hddLog(LOG1, "WE_TXRX_FWSTATS_RESET val %d", set_value);
ret = process_wma_set_command((int)pAdapter->sessionId,
- (int)WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
- set_value, VDEV_CMD);
- break;
- }
+ (int)WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
+ set_value, VDEV_CMD);
+ break;
+ }
- case WE_PPS_PAID_MATCH:
+ case WE_PPS_PAID_MATCH:
{
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
@@ -6028,19 +6134,19 @@ static int __iw_setint_getnone(struct net_device *dev,
break;
}
- case WE_PPS_GID_MATCH:
- {
- if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
- return EINVAL;
- hddLog(LOG1, "WMI_VDEV_PPS_GID_MATCH val %d ", set_value);
+ case WE_PPS_GID_MATCH:
+ {
+ if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
+ return EINVAL;
+ hddLog(LOG1, "WMI_VDEV_PPS_GID_MATCH val %d ", set_value);
ret = process_wma_set_command((int)pAdapter->sessionId,
(int)WMI_VDEV_PPS_GID_MATCH,
set_value, PPS_CMD);
break;
}
- case WE_PPS_EARLY_TIM_CLEAR:
- {
+ case WE_PPS_EARLY_TIM_CLEAR:
+ {
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
hddLog(LOG1, " WMI_VDEV_PPS_EARLY_TIM_CLEAR val %d ", set_value);
@@ -6050,7 +6156,7 @@ static int __iw_setint_getnone(struct net_device *dev,
break;
}
- case WE_PPS_EARLY_DTIM_CLEAR:
+ case WE_PPS_EARLY_DTIM_CLEAR:
{
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
@@ -6061,7 +6167,7 @@ static int __iw_setint_getnone(struct net_device *dev,
break;
}
- case WE_PPS_EOF_PAD_DELIM:
+ case WE_PPS_EOF_PAD_DELIM:
{
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
@@ -6072,7 +6178,7 @@ static int __iw_setint_getnone(struct net_device *dev,
break;
}
- case WE_PPS_MACADDR_MISMATCH:
+ case WE_PPS_MACADDR_MISMATCH:
{
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
@@ -6083,7 +6189,7 @@ static int __iw_setint_getnone(struct net_device *dev,
break;
}
- case WE_PPS_DELIM_CRC_FAIL:
+ case WE_PPS_DELIM_CRC_FAIL:
{
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
@@ -6095,7 +6201,7 @@ static int __iw_setint_getnone(struct net_device *dev,
}
- case WE_PPS_GID_NSTS_ZERO:
+ case WE_PPS_GID_NSTS_ZERO:
{
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
@@ -6107,7 +6213,7 @@ static int __iw_setint_getnone(struct net_device *dev,
}
- case WE_PPS_RSSI_CHECK:
+ case WE_PPS_RSSI_CHECK:
{
if(pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
return EINVAL;
@@ -6144,7 +6250,7 @@ static int __iw_setint_getnone(struct net_device *dev,
{
hddLog(LOG1, "WE_SET_QPOWER_MAX_PSPOLL_COUNT val %d",
set_value);
- ret = process_wma_set_command((int)pAdapter->sessionId,
+ ret = process_wma_set_command((int)pAdapter->sessionId,
(int)WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
set_value, QPOWER_CMD);
break;
@@ -6879,7 +6985,7 @@ static int __iw_setnone_getint(struct net_device *dev,
break;
}
- case WE_GET_PPS_PAID_MATCH:
+ case WE_GET_PPS_PAID_MATCH:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_PAID_MATCH");
*value = wma_cli_get_command(wmapvosContext,
@@ -6889,7 +6995,7 @@ static int __iw_setnone_getint(struct net_device *dev,
break;
}
- case WE_GET_PPS_GID_MATCH:
+ case WE_GET_PPS_GID_MATCH:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_GID_MATCH");
*value = wma_cli_get_command(wmapvosContext,
@@ -6897,9 +7003,9 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_GID_MATCH,
PPS_CMD);
break;
- }
+ }
- case WE_GET_PPS_EARLY_TIM_CLEAR:
+ case WE_GET_PPS_EARLY_TIM_CLEAR:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_EARLY_TIM_CLEAR");
*value = wma_cli_get_command(wmapvosContext,
@@ -6907,9 +7013,9 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_EARLY_TIM_CLEAR,
PPS_CMD);
break;
- }
+ }
- case WE_GET_PPS_EARLY_DTIM_CLEAR:
+ case WE_GET_PPS_EARLY_DTIM_CLEAR:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_EARLY_DTIM_CLEAR");
*value = wma_cli_get_command(wmapvosContext,
@@ -6917,9 +7023,9 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_EARLY_DTIM_CLEAR,
PPS_CMD);
break;
- }
+ }
- case WE_GET_PPS_EOF_PAD_DELIM:
+ case WE_GET_PPS_EOF_PAD_DELIM:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_EOF_PAD_DELIM");
*value = wma_cli_get_command(wmapvosContext,
@@ -6927,9 +7033,9 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_EOF_PAD_DELIM,
PPS_CMD);
break;
- }
+ }
- case WE_GET_PPS_MACADDR_MISMATCH:
+ case WE_GET_PPS_MACADDR_MISMATCH:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_MACADDR_MISMATCH");
*value = wma_cli_get_command(wmapvosContext,
@@ -6937,9 +7043,9 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_MACADDR_MISMATCH,
PPS_CMD);
break;
- }
+ }
- case WE_GET_PPS_DELIM_CRC_FAIL:
+ case WE_GET_PPS_DELIM_CRC_FAIL:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_DELIM_CRC_FAIL");
*value = wma_cli_get_command(wmapvosContext,
@@ -6947,9 +7053,9 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_DELIM_CRC_FAIL,
PPS_CMD);
break;
- }
+ }
- case WE_GET_PPS_GID_NSTS_ZERO:
+ case WE_GET_PPS_GID_NSTS_ZERO:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_GID_NSTS_ZERO");
*value = wma_cli_get_command(wmapvosContext,
@@ -6957,10 +7063,10 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_GID_NSTS_ZERO,
PPS_CMD);
break;
- }
+ }
- case WE_GET_PPS_RSSI_CHECK:
- {
+ case WE_GET_PPS_RSSI_CHECK:
+ {
hddLog(LOG1, "GET WMI_VDEV_PPS_RSSI_CHECK");
*value = wma_cli_get_command(wmapvosContext,
@@ -6968,7 +7074,7 @@ static int __iw_setnone_getint(struct net_device *dev,
(int)WMI_VDEV_PPS_RSSI_CHECK,
PPS_CMD);
break;
- }
+ }
case WE_GET_QPOWER_MAX_PSPOLL_COUNT:
{
@@ -10808,57 +10914,57 @@ static const struct iw_priv_args we_private_args[] = {
"get_pwrgating" },
{ WE_GET_PPS_PAID_MATCH,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_paid_match"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_paid_match"},
{ WE_GET_PPS_GID_MATCH,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_gid_match"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_gid_match"},
{ WE_GET_PPS_EARLY_TIM_CLEAR,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_tim_clear"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_tim_clear"},
{ WE_GET_PPS_EARLY_DTIM_CLEAR,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_dtim_clear"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_dtim_clear"},
{ WE_GET_PPS_EOF_PAD_DELIM,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_eof_delim"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_eof_delim"},
{ WE_GET_PPS_MACADDR_MISMATCH,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_mac_match"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_mac_match"},
{ WE_GET_PPS_DELIM_CRC_FAIL,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_delim_fail"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_delim_fail"},
{ WE_GET_PPS_GID_NSTS_ZERO,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_nsts_zero"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_nsts_zero"},
{ WE_GET_PPS_RSSI_CHECK,
- 0,
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
- "get_rssi_chk"},
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_rssi_chk"},
{ WE_GET_QPOWER_MAX_PSPOLL_COUNT,
0,
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 5683b9a2e08b..308d8278d40e 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 48
+#define QWLAN_VERSION_BUILD 49
-#define QWLAN_VERSIONSTR "4.0.10.48"
+#define QWLAN_VERSIONSTR "4.0.10.49"
#define AR6320_REV1_VERSION 0x5000000
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 022e6826dc04..353c9d932657 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -5625,6 +5625,7 @@ typedef struct sir_qos_params {
typedef struct sir_ocb_channel
{
uint32_t chan_freq;
+ uint32_t bandwidth;
uint32_t duration;
uint32_t start_guard_interval;
uint32_t end_guard_interval;
diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h
index ce040d1e6ef1..c22001747aeb 100644
--- a/CORE/MAC/inc/sirMacProtDef.h
+++ b/CORE/MAC/inc/sirMacProtDef.h
@@ -55,6 +55,8 @@
#define SIR_11B_CHANNEL_END 14
#define SIR_11A_FREQUENCY_OFFSET 4
#define SIR_11B_FREQUENCY_OFFSET 1
+#define SIR_11P_CHANNEL_BEGIN 170
+#define SIR_11P_CHANNEL_END 184
/// Current version of 802.11
#define SIR_MAC_PROTOCOL_VERSION 0
diff --git a/CORE/SERVICES/HIF/PCIe/hif_pci.c b/CORE/SERVICES/HIF/PCIe/hif_pci.c
index f325517b8813..21d3fd3f4083 100644
--- a/CORE/SERVICES/HIF/PCIe/hif_pci.c
+++ b/CORE/SERVICES/HIF/PCIe/hif_pci.c
@@ -1458,6 +1458,46 @@ HIFDiagWriteAccess(HIF_DEVICE *hif_device, A_UINT32 address, A_UINT32 data)
}
}
+/**
+ * hif_dump_pipe_debug_count() - Log error count
+ * @hif_device: HIF device pointer.
+ *
+ * Output the pipe error counts of each pipe to log file
+ *
+ * Return: N/A
+ */
+void hif_dump_pipe_debug_count(HIF_DEVICE *hif_device)
+{
+ struct HIF_CE_state *hif_state;
+ struct hif_pci_softc *sc;
+ int pipe_num;
+
+ if (hif_device == NULL) {
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (
+ "%s hif_device is NULL", __func__));
+ return;
+ }
+ hif_state = (struct HIF_CE_state *)hif_device;
+ if (hif_state == NULL) {
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (
+ "%s hif_state is NULL", __func__));
+ return;
+ }
+ sc = hif_state->sc;
+ for (pipe_num=0; pipe_num < sc->ce_count; pipe_num++) {
+ struct HIF_CE_pipe_info *pipe_info;
+
+ pipe_info = &hif_state->pipe_info[pipe_num];
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (
+ "%s pipe_id = %d, recv_bufs_needed = %d, nbuf_alloc_err_count = %u, nbuf_dma_err_count = %u, nbuf_ce_enqueue_err_count = %u",
+ __func__, pipe_info->pipe_num,
+ atomic_read(&pipe_info->recv_bufs_needed),
+ pipe_info->nbuf_alloc_err_count,
+ pipe_info->nbuf_dma_err_count,
+ pipe_info->nbuf_ce_enqueue_err_count));
+ }
+}
+
static int
hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
{
@@ -1467,6 +1507,7 @@ hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
struct hif_pci_softc *sc = hif_state->sc;
struct ol_softc *scn = sc->ol_sc;
a_status_t ret;
+ uint32_t bufs_posted = 0;
buf_sz = pipe_info->buf_sz;
if (buf_sz == 0) {
@@ -1487,8 +1528,14 @@ hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
nbuf = adf_nbuf_alloc(scn->adf_dev, buf_sz, 0, 4, FALSE);
if (!nbuf) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s buf alloc error [%d] needed %d\n", __FUNCTION__, pipe_info->pipe_num, atomic_read(&pipe_info->recv_bufs_needed)));
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
+ ("%s buf alloc error [%d] needed %d\n",
+ __func__, pipe_info->pipe_num,
+ atomic_read(&pipe_info->recv_bufs_needed)));
atomic_inc(&pipe_info->recv_bufs_needed);
+ adf_os_spin_lock_bh(&pipe_info->recv_bufs_needed_lock);
+ pipe_info->nbuf_alloc_err_count++;
+ adf_os_spin_unlock_bh(&pipe_info->recv_bufs_needed_lock);
return 1;
}
@@ -1516,20 +1563,47 @@ hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
ret = adf_nbuf_map_single(scn->adf_dev, nbuf, ADF_OS_DMA_FROM_DEVICE);
if (unlikely(ret != A_STATUS_OK)) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s mapping error\n", __FUNCTION__));
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s mapping error\n", __func__));
adf_nbuf_free(nbuf);
atomic_inc(&pipe_info->recv_bufs_needed);
+ adf_os_spin_lock_bh(&pipe_info->recv_bufs_needed_lock);
+ pipe_info->nbuf_dma_err_count++;
+ adf_os_spin_unlock_bh(&pipe_info->recv_bufs_needed_lock);
return 1;
}
CE_data = adf_nbuf_get_frag_paddr_lo(nbuf, 0);
- pci_dma_sync_single_for_device(scn->sc_osdev->bdev, CE_data, buf_sz, PCI_DMA_FROMDEVICE);
+ pci_dma_sync_single_for_device(scn->sc_osdev->bdev, CE_data,
+ buf_sz, PCI_DMA_FROMDEVICE);
status = CE_recv_buf_enqueue(ce_hdl, (void *)nbuf, CE_data);
A_ASSERT(status == EOK);
+ if (status != EOK) {
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
+ ("%s CE_recv_buf_enqueue error [%d] needed %d\n",
+ __func__, pipe_info->pipe_num,
+ atomic_read(&pipe_info->recv_bufs_needed)));
+ atomic_inc(&pipe_info->recv_bufs_needed);
+ adf_nbuf_free(nbuf);
+ adf_os_spin_lock_bh(&pipe_info->recv_bufs_needed_lock);
+ pipe_info->nbuf_ce_enqueue_err_count++;
+ adf_os_spin_unlock_bh(&pipe_info->recv_bufs_needed_lock);
+ return 1;
+ }
adf_os_spin_lock_bh(&pipe_info->recv_bufs_needed_lock);
- }
+ bufs_posted++;
+ }
+ pipe_info->nbuf_alloc_err_count =
+ (pipe_info->nbuf_alloc_err_count > bufs_posted)?
+ pipe_info->nbuf_alloc_err_count - bufs_posted : 0;
+ pipe_info->nbuf_dma_err_count =
+ (pipe_info->nbuf_dma_err_count > bufs_posted)?
+ pipe_info->nbuf_dma_err_count - bufs_posted : 0;
+ pipe_info->nbuf_ce_enqueue_err_count =
+ (pipe_info->nbuf_ce_enqueue_err_count > bufs_posted)?
+ pipe_info->nbuf_ce_enqueue_err_count - bufs_posted : 0;
+
adf_os_spin_unlock_bh(&pipe_info->recv_bufs_needed_lock);
return 0;
diff --git a/CORE/SERVICES/HIF/PCIe/hif_pci.h b/CORE/SERVICES/HIF/PCIe/hif_pci.h
index f2ae2dbefe34..2ab94a80e76a 100644
--- a/CORE/SERVICES/HIF/PCIe/hif_pci.h
+++ b/CORE/SERVICES/HIF/PCIe/hif_pci.h
@@ -90,6 +90,10 @@ struct HIF_CE_pipe_info {
struct HIF_CE_completion_state_list *completion_space_list;
struct HIF_CE_completion_state *completion_freeq_head;
struct HIF_CE_completion_state *completion_freeq_tail;
+ /* adding three counts for debugging ring buffer errors */
+ uint32_t nbuf_alloc_err_count;
+ uint32_t nbuf_dma_err_count;
+ uint32_t nbuf_ce_enqueue_err_count;
} ;
struct HIF_CE_state {
@@ -146,6 +150,7 @@ void priv_dump_agc(struct hif_pci_softc *sc);
void priv_start_cap_chaninfo(struct hif_pci_softc *sc);
void priv_dump_chaninfo(struct hif_pci_softc *sc);
void priv_dump_bbwatchdog(struct hif_pci_softc *sc);
+void hif_dump_pipe_debug_count(HIF_DEVICE *hif_device);
#define CE_HTT_T2H_MSG 1
#define CE_HTT_H2T_MSG 4
diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c
index 1f5c4fe02be2..4e253e4dc527 100644
--- a/CORE/SERVICES/HIF/PCIe/if_pci.c
+++ b/CORE/SERVICES/HIF/PCIe/if_pci.c
@@ -1671,6 +1671,8 @@ hif_pci_remove(struct pci_dev *pdev)
pci_disable_msi(pdev);
+ hif_dump_pipe_debug_count(sc->hif_device);
+
hif_deinit_adf_ctx(scn);
A_FREE(scn);
A_FREE(sc->hif_device);
@@ -1719,6 +1721,8 @@ void hif_pci_shutdown(struct pci_dev *pdev)
if (!vos_is_ssr_ready(__func__))
printk("Host driver is not ready for SSR, attempting anyway\n");
+ hif_dump_pipe_debug_count(sc->hif_device);
+
if (!WLAN_IS_EPPING_ENABLED(vos_get_conparam()))
hdd_wlan_shutdown();
diff --git a/CORE/SERVICES/WMA/wlan_nv.c b/CORE/SERVICES/WMA/wlan_nv.c
index d273e218ef69..14342c18cafb 100644
--- a/CORE/SERVICES/WMA/wlan_nv.c
+++ b/CORE/SERVICES/WMA/wlan_nv.c
@@ -896,6 +896,23 @@ const sHalNv nvDefaults =
{NV_CHANNEL_ENABLE, 30}, //RF_CHAN_161,
{NV_CHANNEL_ENABLE, 0}, //RF_CHAN_165,
+ // 802.11p
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_170,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_171,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_172,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_173,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_174,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_175,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_176,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_177,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_178,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_179,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_180,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_181,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_182,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_183,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_184,
+
//2.4GHz Band, channel bonded channels
{NV_CHANNEL_ENABLE, 22}, //RF_CHAN_BOND_3,
{NV_CHANNEL_ENABLE, 30}, //RF_CHAN_BOND_4,
@@ -1045,6 +1062,23 @@ const sHalNv nvDefaults =
{NV_CHANNEL_DISABLE, 0}, //RF_CHAN_161,
{NV_CHANNEL_DISABLE, 0}, //RF_CHAN_165,
+ // 802.11p
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_170,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_171,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_172,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_173,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_174,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_175,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_176,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_177,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_178,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_179,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_180,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_181,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_182,
+ {NV_CHANNEL_DISABLE, 30}, //RF_CHAN_183,
+ {NV_CHANNEL_ENABLE, 30}, //RF_CHAN_184,
+
//2.4GHz Band, channel bonded channels
{NV_CHANNEL_ENABLE, 20}, //RF_CHAN_BOND_3,
{NV_CHANNEL_ENABLE, 20}, //RF_CHAN_BOND_4,
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index e40e103b2a9f..ae4babb9a405 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -23196,7 +23196,19 @@ static void wma_ocb_set_sched_req(void *wma_handle,
req.chan = OCB_FREQ_TO_CHAN(sched->channels[0].chan_freq);
req.max_txpow = sched->channels[0].tx_power;
- req.is_half_rate = TRUE;
+ switch (sched->channels[0].bandwidth) {
+ case 10:
+ req.is_half_rate = true;
+ req.is_quarter_rate = false;
+ break;
+ case 5:
+ req.is_half_rate = false;
+ req.is_quarter_rate = true;
+ break;
+ default:
+ req.is_half_rate = false;
+ req.is_quarter_rate = false;
+ }
if (wma->interfaces[vdev_id].vdev_up) {
wma->interfaces[vdev_id].vdev_up = FALSE;
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 74b0c025c259..dfa249e08cdb 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -110,7 +110,7 @@
#define WMA_11G_CHANNEL_BEGIN 1
#define WMA_11G_CHANNEL_END 14
-#define WMA_11P_CHANNEL_BEGIN (172)
+#define WMA_11P_CHANNEL_BEGIN (170)
#define WMA_11P_CHANNEL_END (184)
#define WMA_LOGD(args...) \
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index dde4a284a76a..fda5849b635f 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -750,7 +750,7 @@ typedef enum
#define CSR_CB_CENTER_CHANNEL_OFFSET 2
#define CSR_MAX_24GHz_CHANNEL_NUMBER ( SIR_11B_CHANNEL_END )
#define CSR_MIN_5GHz_CHANNEL_NUMBER ( SIR_11A_CHANNEL_BEGIN )
-#define CSR_MAX_5GHz_CHANNEL_NUMBER ( SIR_11A_CHANNEL_END )
+#define CSR_MAX_5GHz_CHANNEL_NUMBER ( SIR_11P_CHANNEL_END )
// WEP keysize (in bits)...
typedef enum
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index fd651672a5f9..80b46879179f 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -453,7 +453,6 @@ static tChannelPwrLimit csrFindChannelPwr(tChannelListWithPower * pdefaultPowerT
return 0;
}
-#define NUM_DOT11P_CHANNELS 9
eHalStatus csrUpdateChannelList(tpAniSirGlobal pMac)
{
tSirUpdateChanList *pChanList;
@@ -465,13 +464,6 @@ eHalStatus csrUpdateChannelList(tpAniSirGlobal pMac)
tANI_U8 i, j, social_channel[MAX_SOCIAL_CHANNELS] = {1,6,11};
tANI_U8 channel_state;
- /* Temporarily add list of 802.11P channels statically */
- /* TODO-OCB: Remove after channels are added to reg domain */
- tANI_U8 dot11p_channels[NUM_DOT11P_CHANNELS] = {
- 172, 174, 176, 178, 180, 182, 184, 175, 181,
- };
- tANI_U8 dot11p_power = 23;
-
if (CSR_IS_5G_BAND_ONLY(pMac))
{
for (i = 0; i < MAX_SOCIAL_CHANNELS; i++)
@@ -482,10 +474,6 @@ eHalStatus csrUpdateChannelList(tpAniSirGlobal pMac)
}
}
- if (pMac->enable_dot11p) {
- numChan += NUM_DOT11P_CHANNELS;
- }
-
bufLen = sizeof(tSirUpdateChanList) +
(sizeof(tSirUpdateChanParam) * (numChan));
@@ -538,20 +526,6 @@ eHalStatus csrUpdateChannelList(tpAniSirGlobal pMac)
}
}
- if (pMac->enable_dot11p) {
- /* Add 5.9 GHz channels */
- for (j = 0; j < NUM_DOT11P_CHANNELS; j++) {
- pChanList->chanParam[num_channel].chanId = dot11p_channels[j];
- pChanList->chanParam[num_channel].pwr = dot11p_power;
- pChanList->chanParam[num_channel].dfsSet = VOS_FALSE;
- if ((pChanList->chanParam[num_channel].chanId != 175)
- && (pChanList->chanParam[num_channel].chanId != 181)) {
- pChanList->chanParam[num_channel].half_rate = VOS_TRUE;
- }
- num_channel++;
- }
- }
-
msg.type = WDA_UPDATE_CHAN_LIST_REQ;
msg.reserved = 0;
msg.bodyptr = pChanList;
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index e76c6311cdad..8590d6bff524 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -54,6 +54,7 @@
#define MIN_CHN_TIME_TO_FIND_GO 100
#define MAX_CHN_TIME_TO_FIND_GO 100
#define DIRECT_SSID_LEN 7
+#define MIN_11P_CHANNEL 170
/*
* Purpose of HIDDEN_TIMER
@@ -6185,9 +6186,10 @@ eHalStatus csrScanCopyRequest(tpAniSirGlobal pMac, tCsrScanRequest *pDstReq, tCs
{
NVchannel_state = vos_nv_getChannelEnabledState(
pSrcReq->ChannelInfo.ChannelList[index]);
- if ((NV_CHANNEL_ENABLE == NVchannel_state) ||
+ if (pSrcReq->ChannelInfo.ChannelList[index] < MIN_11P_CHANNEL &&
+ ((NV_CHANNEL_ENABLE == NVchannel_state) ||
((NV_CHANNEL_DFS == NVchannel_state) &&
- !skip_dfs_chnl))
+ !skip_dfs_chnl)))
{
pDstReq->ChannelInfo.ChannelList[new_index] =
pSrcReq->ChannelInfo.ChannelList[index];
@@ -6208,9 +6210,10 @@ eHalStatus csrScanCopyRequest(tpAniSirGlobal pMac, tCsrScanRequest *pDstReq, tCs
* that is the only way to find p2p peers.
* This can happen only if band is set to 5Ghz mode.
*/
- if((csrRoamIsValidChannel(pMac, pSrcReq->ChannelInfo.ChannelList[index])) ||
+ if(pSrcReq->ChannelInfo.ChannelList[index] < MIN_11P_CHANNEL &&
+ ((csrRoamIsValidChannel(pMac, pSrcReq->ChannelInfo.ChannelList[index])) ||
((eCSR_SCAN_P2P_DISCOVERY == pSrcReq->requestType) &&
- CSR_IS_SOCIAL_CHANNEL(pSrcReq->ChannelInfo.ChannelList[index])))
+ CSR_IS_SOCIAL_CHANNEL(pSrcReq->ChannelInfo.ChannelList[index]))))
{
if( ((pSrcReq->skipDfsChnlInP2pSearch ||
skip_dfs_chnl) &&
@@ -6273,13 +6276,22 @@ eHalStatus csrScanCopyRequest(tpAniSirGlobal pMac, tCsrScanRequest *pDstReq, tCs
}
else
{
- smsLog(pMac, LOGE, FL("Couldn't get the valid Channel"
+ smsLog(pMac, LOGE, FL("Couldn't get the valid Channel"
" List, keeping requester's list"));
- vos_mem_copy(pDstReq->ChannelInfo.ChannelList,
- pSrcReq->ChannelInfo.ChannelList,
- pSrcReq->ChannelInfo.numOfChannels
- * sizeof(*pDstReq->ChannelInfo.ChannelList));
- pDstReq->ChannelInfo.numOfChannels = pSrcReq->ChannelInfo.numOfChannels;
+ new_index = 0;
+ for ( index = 0;
+ index < pSrcReq->ChannelInfo.numOfChannels;
+ index++ )
+ {
+ if (pSrcReq->ChannelInfo.ChannelList[index] <
+ MIN_11P_CHANNEL)
+ {
+ pDstReq->ChannelInfo.ChannelList[new_index] =
+ pSrcReq->ChannelInfo.ChannelList[index];
+ new_index++;
+ }
+ }
+ pDstReq->ChannelInfo.numOfChannels = new_index;
}
}//Allocate memory for Channel List
}
diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c
index 72d1d8a4fb53..7897df5b2f48 100644
--- a/CORE/VOSS/src/vos_nvitem.c
+++ b/CORE/VOSS/src/vos_nvitem.c
@@ -85,32 +85,33 @@ static v_BOOL_t init_by_reg_core = VOS_FALSE;
*/
/* Only these channels all allow active scan on all world regulatory domains */
-#define REG_RULE_2GHZ_CH01_11 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0)
+#define REG_RULE_2GHZ_CH01_11 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0)
/* We enable active scan on these a case by case basis by regulatory domain */
-#define REG_RULE_2GHZ_CH12_13 REG_RULE(2467-10, 2472+10, 40, 0, 20,\
+#define REG_RULE_2GHZ_CH12_13 REG_RULE(2467-10, 2472+10, 40, 0, 20,\
NL80211_RRF_PASSIVE_SCAN)
-#define REG_RULE_2GHZ_CH14 REG_RULE(2484-10, 2484+10, 40, 0, 20,\
+#define REG_RULE_2GHZ_CH14 REG_RULE(2484-10, 2484+10, 40, 0, 20,\
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
/* We allow IBSS on these on a case by case basis by regulatory domain */
-#define REG_RULE_5GHZ_5150_5350 REG_RULE(5150-10, 5350+10, 80, 0, 30,\
+#define REG_RULE_5GHZ_5150_5350 REG_RULE(5150-10, 5350+10, 80, 0, 30,\
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
-#define REG_RULE_5GHZ_5470_5850 REG_RULE(5470-10, 5850+10, 80, 0, 30,\
+#define REG_RULE_5GHZ_5470_5925 REG_RULE(5470-10, 5925+10, 80, 0, 30,\
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
-#define REG_RULE_5GHZ_5725_5850 REG_RULE(5725-10, 5850+10, 80, 0, 30,\
+#define REG_RULE_5GHZ_5725_5925 REG_RULE(5725-10, 5925+10, 80, 0, 30,\
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
-#define REG_RULE_2GHZ_ALL REG_RULE_2GHZ_CH01_11, \
+#define REG_RULE_2GHZ_ALL REG_RULE_2GHZ_CH01_11, \
REG_RULE_2GHZ_CH12_13, \
REG_RULE_2GHZ_CH14
-#define REG_RULE_5GHZ_ALL REG_RULE_5GHZ_5150_5350, \
- REG_RULE_5GHZ_5470_5850
+#define REG_RULE_5GHZ_ALL REG_RULE_5GHZ_5150_5350, \
+ REG_RULE_5GHZ_5470_5925
/* This one skips what we call "mid band" */
-#define REG_RULE_5GHZ_NO_MIDBAND REG_RULE_5GHZ_5150_5350, \
- REG_RULE_5GHZ_5725_5850
+#define REG_RULE_5GHZ_NO_MIDBAND REG_RULE_5GHZ_5150_5350, \
+ REG_RULE_5GHZ_5725_5925
+
#define WORLD_SKU_MASK 0x00F0
#define WORLD_SKU_PREFIX 0x0060
@@ -402,6 +403,24 @@ const tRfChannelProps rfChannels[NUM_RF_CHANNELS] =
{ 5785, 157, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_157,
{ 5805, 161, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_161,
{ 5825, 165, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_165,
+
+ /* 5.9GHz 10 MHz bandwidth (802.11p) */
+ { 5850, 170, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_170,
+ { 5855, 171, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_171,
+ { 5860, 172, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_172,
+ { 5865, 173, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_173,
+ { 5870, 174, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_174,
+ { 5875, 175, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_175,
+ { 5880, 176, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_176,
+ { 5885, 177, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_177,
+ { 5890, 178, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_178,
+ { 5895, 179, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_179,
+ { 5900, 180, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_180,
+ { 5905, 181, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_181,
+ { 5910, 182, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_182,
+ { 5915, 183, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_183,
+ { 5920, 184, RF_SUBBAND_5_HIGH_GHZ}, //RF_CHAN_184,
+
{ 2422, 3 , NUM_RF_SUBBANDS}, //RF_CHAN_BOND_3,
{ 2427, 4 , NUM_RF_SUBBANDS}, //RF_CHAN_BOND_4,
{ 2432, 5 , NUM_RF_SUBBANDS}, //RF_CHAN_BOND_5,
@@ -863,7 +882,7 @@ VOS_STATUS vos_nv_getChannelListWithPower(tChannelListWithPower *channels20MHz /
channels20MHz[count++].pwr = regChannels[i].pwrLimit;
}
}
- for( i = RF_CHAN_36; i <= RF_CHAN_165; i++ )
+ for( i = RF_CHAN_36; i <= RF_CHAN_184; i++ )
{
if( regChannels[i].enabled )
{
@@ -938,7 +957,7 @@ VOS_STATUS vos_nv_getSupportedChannels( v_U8_t *p20MhzChannels, int *pNum20MhzCh
{
p20MhzChannels[count++] = rfChannels[i].channelNum;
}
- for( i = RF_CHAN_36; i <= RF_CHAN_165; i++ )
+ for( i = RF_CHAN_36; i <= RF_CHAN_184; i++ )
{
p20MhzChannels[count++] = rfChannels[i].channelNum;
}
@@ -986,7 +1005,7 @@ eNVChannelEnabledType vos_nv_getChannelEnabledState
v_U32_t channelLoop;
eRfChannels channelEnum = INVALID_RF_CHANNEL;
- for(channelLoop = 0; channelLoop <= RF_CHAN_165; channelLoop++)
+ for(channelLoop = 0; channelLoop <= RF_CHAN_184; channelLoop++)
{
if(rfChannels[channelLoop].channelNum == rfChannel)
{
@@ -1295,6 +1314,26 @@ VOS_STATUS vos_nv_getRegDomainFromCountryCode( v_REGDOMAIN_t *pRegDomain,
return VOS_STATUS_SUCCESS;
}
+#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
+#define DEFAULT_11P_POWER (30)
+// Returns whether a channel is valid for DSRC.
+static int is_dsrc_channel(v_U16_t center_freq)
+{
+ switch (center_freq) {
+ case 5860:
+ case 5870:
+ case 5880:
+ case 5890:
+ case 5900:
+ case 5910:
+ case 5920:
+ case 5875:
+ case 5905:
+ return 1;
+ }
+ return 0;
+}
+#endif
/* create_linux_regulatory_entry to populate internal structures from wiphy */
static int create_linux_regulatory_entry(struct wiphy *wiphy,
@@ -1307,7 +1346,7 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)) && !defined(WITH_BACKPORTS)
int err;
#endif
- const struct ieee80211_reg_rule *reg_rule;
+ const struct ieee80211_reg_rule *reg_rule;
pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
if (NULL != pVosContext)
@@ -1360,6 +1399,13 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy,
else
m = wiphy->bands[i-1]->n_channels + m;
+ if (pnvEFSTable == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "error: pnvEFSTable is NULL, probably not parsed nv.bin yet");
+ return -1;
+ }
+
for (j = 0; j < wiphy->bands[i]->n_channels; j++)
{
/* k = (m + j) is internal current channel index for 20MHz channel
@@ -1368,13 +1414,11 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy,
k = m + j;
n = bw20_ch_index_to_bw40_ch_index(k);
- if (n == -1)
- return -1;
-
/* If the regulatory rules for a country do not explicilty
* require a passive scan on a frequency, lift the passive
* scan restriction
- */
+ * When getting the regulatory rule, specify the smallest bandwidth.
+ * That's 5 MHz. A larger bandwidth may not fit into the frequency range. */
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0)) || defined(WITH_BACKPORTS)
reg_rule = freq_reg_info(wiphy,
MHZ_TO_KHZ(wiphy->bands[i]->channels[j].center_freq));
@@ -1416,18 +1460,25 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy,
}
}
+#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
+ if (is_dsrc_channel(wiphy->bands[i]->channels[j].center_freq))
+ {
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].
+ channels[k].enabled = NV_CHANNEL_ENABLE;
+
+ /* max_power is in dBm */
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[k].pwrLimit =
+ DEFAULT_11P_POWER;
+ }
+ else
+#endif
if (wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_DISABLED)
{
- if (pnvEFSTable == NULL)
- {
- VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
- "error: pnvEFSTable is NULL, probably not parsed nv.bin yet");
- return -1;
- }
pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[k].enabled =
NV_CHANNEL_DISABLE;
- pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
- NV_CHANNEL_DISABLE;
+ if (n != -1)
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
+ NV_CHANNEL_DISABLE;
}
/* nv cannot distinguish between DFS and passive channels */
@@ -1443,20 +1494,23 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy,
/* Disable the center channel if neither HT40+ nor HT40- is allowed
*/
- if ((wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_NO_HT40) ==
- IEEE80211_CHAN_NO_HT40 )
+ if (n != -1)
{
- pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
- NV_CHANNEL_DISABLE;
- }
- else
- {
- pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
- NV_CHANNEL_DFS;
+ if ((wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_NO_HT40) ==
+ IEEE80211_CHAN_NO_HT40 )
+ {
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
+ NV_CHANNEL_DISABLE;
+ }
+ else
+ {
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
+ NV_CHANNEL_DFS;
- /* 40MHz channel power is half of 20MHz (-3dB) ?? */
- pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].pwrLimit =
- (tANI_S8) (((wiphy->bands[i]->channels[j].max_power))-3);
+ /* 40MHz channel power is half of 20MHz (-3dB) ?? */
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].pwrLimit =
+ (tANI_S8) (((wiphy->bands[i]->channels[j].max_power))-3);
+ }
}
if ((wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_NO_80MHZ) == 0)
{
@@ -1482,19 +1536,22 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy,
/* Disable the center channel if neither HT40+ nor HT40- is allowed
*/
- if ((wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_NO_HT40) ==
- IEEE80211_CHAN_NO_HT40 )
- {
- pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
- NV_CHANNEL_DISABLE;
- }
- else
+ if (n != -1)
{
- pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
- NV_CHANNEL_ENABLE;
- /* 40MHz channel power is half of 20MHz (-3dB) */
- pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].pwrLimit =
- (tANI_S8) (((wiphy->bands[i]->channels[j].max_power))-3);
+ if ((wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_NO_HT40) ==
+ IEEE80211_CHAN_NO_HT40 )
+ {
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
+ NV_CHANNEL_DISABLE;
+ }
+ else
+ {
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].enabled =
+ NV_CHANNEL_ENABLE;
+ /* 40MHz channel power is half of 20MHz (-3dB) */
+ pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[n].pwrLimit =
+ (tANI_S8) (((wiphy->bands[i]->channels[j].max_power))-3);
+ }
}
if ((wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_NO_80MHZ) == 0)
{
@@ -1795,7 +1852,7 @@ VOS_STATUS vos_init_wiphy_from_nv_bin(void)
#endif
}
else if (REGDOMAIN_WORLD ==
- pnvEFSTable->halnv.tables.defaultCountryTable.regDomain) {
+ pnvEFSTable->halnv.tables.defaultCountryTable.regDomain) {
reg_domain = pnvEFSTable->halnv.tables.defaultCountryTable.regDomain;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) || defined(WITH_BACKPORTS)
diff --git a/Kbuild b/Kbuild
index d343bdea99a3..c7e2b541add0 100755
--- a/Kbuild
+++ b/Kbuild
@@ -264,6 +264,9 @@ CONFIG_TARGET_RAMDUMP_AFTER_KERNEL_PANIC := 1
#Flag to enable Stats Ext implementation
CONFIG_FEATURE_STATS_EXT := 1
+#Flag to force the inclusion of the 802.11p channels because support
+#for these channels has not yet been added to the kernel.
+CONFIG_STATICALLY_ADD_11P_CHANNELS := n
ifeq ($(CONFIG_CFG80211),y)
HAVE_CFG80211 := 1
@@ -1347,6 +1350,10 @@ ifdef CPTCFG_QCA_CLD_WLAN
CDEFINES += -DWITH_BACKPORTS
endif
+ifeq ($(CONFIG_STATICALLY_ADD_11P_CHANNELS),y)
+CDEFINES += -DFEATURE_STATICALLY_ADD_11P_CHANNELS
+endif
+
KBUILD_CPPFLAGS += $(CDEFINES)
# Currently, for versions of gcc which support it, the kernel Makefile
diff --git a/wcnss/inc/wlan_nv.h b/wcnss/inc/wlan_nv.h
index c4522fd7d241..5c00fbe57e62 100644
--- a/wcnss/inc/wlan_nv.h
+++ b/wcnss/inc/wlan_nv.h
@@ -286,6 +286,23 @@ typedef enum
RF_CHAN_161,
RF_CHAN_165,
+ // 802.11p
+ RF_CHAN_170,
+ RF_CHAN_171,
+ RF_CHAN_172,
+ RF_CHAN_173,
+ RF_CHAN_174,
+ RF_CHAN_175,
+ RF_CHAN_176,
+ RF_CHAN_177,
+ RF_CHAN_178,
+ RF_CHAN_179,
+ RF_CHAN_180,
+ RF_CHAN_181,
+ RF_CHAN_182,
+ RF_CHAN_183,
+ RF_CHAN_184,
+
//CHANNEL BONDED CHANNELS
RF_CHAN_BOND_3,
RF_CHAN_BOND_4,
@@ -332,11 +349,11 @@ typedef enum
MAX_2_4GHZ_CHANNEL = RF_CHAN_14,
MIN_5GHZ_CHANNEL = RF_CHAN_240,
- MAX_5GHZ_CHANNEL = RF_CHAN_165,
+ MAX_5GHZ_CHANNEL = RF_CHAN_184,
NUM_5GHZ_CHANNELS = (MAX_5GHZ_CHANNEL - MIN_5GHZ_CHANNEL + 1),
MIN_20MHZ_RF_CHANNEL = RF_CHAN_1,
- MAX_20MHZ_RF_CHANNEL = RF_CHAN_165,
+ MAX_20MHZ_RF_CHANNEL = RF_CHAN_184,
NUM_20MHZ_RF_CHANNELS = (MAX_20MHZ_RF_CHANNEL - MIN_20MHZ_RF_CHANNEL + 1),
MIN_40MHZ_RF_CHANNEL = RF_CHAN_BOND_3,
@@ -440,10 +457,10 @@ typedef PACKED_PRE struct PACKED_POST
uint8 nv_TxBBFSel9MHz : 1;
uint8 hwParam1 : 7;
uint8 hwParam2;
-
+
uint16 custom_tcxo_reg8;
uint16 custom_tcxo_reg9;
-
+
uint32 hwParam3;
uint32 hwParam4;
uint32 hwParam5;
@@ -598,7 +615,7 @@ typedef enum
#ifdef WCN_PRONTO
HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,
#endif
-
+
/*11AC rate 20MHZ Shortl GI*/
HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS,
HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,
@@ -612,7 +629,7 @@ typedef enum
#ifdef WCN_PRONTO
HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,
#endif
-
+
/*11AC rates 40MHZ normal GI*/
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS ,
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
@@ -624,7 +641,7 @@ typedef enum
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
-
+
/*11AC rates 40MHZ short GI*/
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS ,
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
@@ -636,7 +653,7 @@ typedef enum
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
-
+
/*11AC rates 80 MHZ normal GI*/
HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS ,
HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
@@ -648,7 +665,7 @@ typedef enum
HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
-
+
/*11AC rates 80 MHZ short GI*/
HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS ,
HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
@@ -705,7 +722,7 @@ typedef PACKED_PRE struct PACKED_POST
typedef PACKED_PRE struct PACKED_POST
{
- uint8 skuID;
+ uint8 skuID;
uint8 tpcMode2G;
uint8 tpcMode5G;
uint8 configItem1;