diff options
| author | Rajeev Kumar <rajekuma@codeaurora.org> | 2016-09-16 13:29:43 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-09-21 17:06:02 -0700 |
| commit | 25a0b21ce52c4d53d650de8efa412fe5debe82a1 (patch) | |
| tree | d00db19967beccbf71d9d69a24dcdfecb4c7fc78 | |
| parent | c534cf6715c93bfec7c245d7627c35e9e06df5e2 (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
| -rw-r--r-- | core/wma/src/wma_features.c | 45 |
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) { |
