summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorRajeev Kumar <rajekuma@codeaurora.org>2016-09-16 13:29:43 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-21 17:06:02 -0700
commit25a0b21ce52c4d53d650de8efa412fe5debe82a1 (patch)
treed00db19967beccbf71d9d69a24dcdfecb4c7fc78 /core
parentc534cf6715c93bfec7c245d7627c35e9e06df5e2 (diff)
qcacld-3.0: WoW pattern id should be unique for each vdev
Current host driver is using default pattern id 0 for various WoW pattern configuration which is overwriting WoW rules in FW. WoW pattern id should be unique for each vdev. Same WoW pattern ID can be used on 2 different vdevs but on same vdev pattern id for various WoW patterns must be unique. Add fix to make sure unique pattern id is used for each vdev. Change-Id: I893044ae50bee44b5e986f3c30967fad601eb057 CRs-Fixed: 1067951
Diffstat (limited to 'core')
-rw-r--r--core/wma/src/wma_features.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index c559de4744c2..071b1fafdc18 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -3468,14 +3468,12 @@ static QDF_STATUS wma_send_wow_patterns_to_fw(tp_wma_handle wma,
{
struct wma_txrx_node *iface;
int ret;
- uint8_t default_patterns;
iface = &wma->interfaces[vdev_id];
- default_patterns = iface->num_wow_default_patterns++;
ret = wmi_unified_wow_patterns_to_fw_cmd(wma->wmi_handle,
vdev_id, ptrn_id, ptrn,
ptrn_len, ptrn_offset, mask,
- mask_len, user, default_patterns);
+ mask_len, user, 0);
if (ret) {
if (!user)
iface->num_wow_default_patterns--;
@@ -3502,10 +3500,16 @@ static QDF_STATUS wma_wow_ap(tp_wma_handle wma, uint8_t vdev_id)
QDF_STATUS ret;
uint8_t arp_offset = 20;
uint8_t mac_mask[IEEE80211_ADDR_LEN];
+ struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
- /* Setup unicast pkt pattern */
+ /*
+ * Setup unicast pkt pattern
+ * WoW pattern id should be unique for each vdev
+ * WoW pattern id can be same on 2 different VDEVs
+ */
qdf_mem_set(&mac_mask, IEEE80211_ADDR_LEN, 0xFF);
- ret = wma_send_wow_patterns_to_fw(wma, vdev_id, 0,
+ ret = wma_send_wow_patterns_to_fw(wma, vdev_id,
+ iface->num_wow_default_patterns++,
wma->interfaces[vdev_id].addr,
IEEE80211_ADDR_LEN, 0, mac_mask,
IEEE80211_ADDR_LEN, false);
@@ -3516,9 +3520,10 @@ static QDF_STATUS wma_wow_ap(tp_wma_handle wma, uint8_t vdev_id)
/*
* Setup all ARP pkt pattern. This is dummy pattern hence the length
- * is zero
+ * is zero. Pattern ID should be unique per vdev.
*/
- ret = wma_send_wow_patterns_to_fw(wma, vdev_id, 0,
+ ret = wma_send_wow_patterns_to_fw(wma, vdev_id,
+ iface->num_wow_default_patterns++,
arp_ptrn, 0, arp_offset, arp_mask, 0, false);
if (ret != QDF_STATUS_SUCCESS) {
WMA_LOGE("Failed to add WOW ARP pattern ret %d", ret);
@@ -3541,8 +3546,14 @@ static QDF_STATUS wma_configure_wow_ssdp(tp_wma_handle wma, uint8_t vdev_id)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint8_t discvr_offset = 30;
+ struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
- status = wma_send_wow_patterns_to_fw(wma, vdev_id, 0,
+ /*
+ * WoW pattern ID should be unique for each vdev
+ * Different WoW patterns can use same pattern ID
+ */
+ status = wma_send_wow_patterns_to_fw(wma, vdev_id,
+ iface->num_wow_default_patterns++,
discvr_ptrn, sizeof(discvr_ptrn), discvr_offset,
discvr_mask, sizeof(discvr_ptrn), false);
@@ -3638,10 +3649,16 @@ static QDF_STATUS wma_wow_sta(tp_wma_handle wma, uint8_t vdev_id)
uint8_t arp_offset = 12;
uint8_t mac_mask[IEEE80211_ADDR_LEN];
QDF_STATUS ret = QDF_STATUS_SUCCESS;
+ struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
- /* Setup unicast pkt pattern */
qdf_mem_set(&mac_mask, IEEE80211_ADDR_LEN, 0xFF);
- ret = wma_send_wow_patterns_to_fw(wma, vdev_id, 0,
+ /*
+ * Set up unicast wow pattern
+ * WoW pattern ID should be unique for each vdev
+ * Different WoW patterns can use same pattern ID
+ */
+ ret = wma_send_wow_patterns_to_fw(wma, vdev_id,
+ iface->num_wow_default_patterns++,
wma->interfaces[vdev_id].addr,
IEEE80211_ADDR_LEN, 0, mac_mask,
IEEE80211_ADDR_LEN, false);
@@ -3660,7 +3677,9 @@ static QDF_STATUS wma_wow_sta(tp_wma_handle wma, uint8_t vdev_id)
*/
if (!(wma->ol_ini_info & 0x1)) {
/* Setup all ARP pkt pattern */
- ret = wma_send_wow_patterns_to_fw(wma, vdev_id, 0,
+ WMA_LOGI("ARP offload is disabled in INI enable WoW for ARP");
+ ret = wma_send_wow_patterns_to_fw(wma, vdev_id,
+ iface->num_wow_default_patterns++,
arp_ptrn, sizeof(arp_ptrn), arp_offset,
arp_mask, sizeof(arp_mask), false);
if (ret != QDF_STATUS_SUCCESS) {
@@ -3672,7 +3691,9 @@ static QDF_STATUS wma_wow_sta(tp_wma_handle wma, uint8_t vdev_id)
/* for NS or NDP offload packets */
if (!(wma->ol_ini_info & 0x2)) {
/* Setup all NS pkt pattern */
- ret = wma_send_wow_patterns_to_fw(wma, vdev_id, 0,
+ WMA_LOGI("NS offload is disabled in INI enable WoW for NS");
+ ret = wma_send_wow_patterns_to_fw(wma, vdev_id,
+ iface->num_wow_default_patterns++,
ns_ptrn, sizeof(arp_ptrn), arp_offset,
arp_mask, sizeof(arp_mask), false);
if (ret != QDF_STATUS_SUCCESS) {