diff options
| author | Mukul Sharma <mukul@codeaurora.org> | 2016-09-08 13:05:35 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-09-24 13:03:50 -0700 |
| commit | 8d2d9ecdca1739195593803c8128fce81555c0f1 (patch) | |
| tree | 939bc7df7cbe2846db7d8ce834954c9d429fa161 | |
| parent | 4133c00bece0c449ee157b9d6bc7e14f011a680c (diff) | |
qcacld-3.0: Cache ARP/NS offload request at wma layer
qcacld-2.0 to qcacld-3.0 propagation
As Current WMI interface need both the ARP/NS configuration
in single command. To support active offload host need to
cache the ARP/NS at wma layer so host can fill the other
request and configure down to firmware complete request
(ARP+NS).
Change-Id: Ie0a57d216379817ff0ae48f4f582c9108e8ecca1
CRs-Fixed: 1059739
| -rw-r--r-- | core/wma/inc/wma.h | 5 | ||||
| -rw-r--r-- | core/wma/src/wma_dev_if.c | 7 | ||||
| -rw-r--r-- | core/wma/src/wma_features.c | 54 |
3 files changed, 54 insertions, 12 deletions
diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 5a5d738f573d..b82ba1f1738d 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -907,7 +907,8 @@ typedef struct { * @chain_mask: chain mask can be used by the vdev * @mac_id: the mac on which vdev is on * @wep_default_key_idx: wep default index for group key - * + * @arp_offload_req: cached arp offload request + * @ns_offload_req: cached ns offload request * It stores parameters per vdev in wma. */ struct wma_txrx_node { @@ -985,6 +986,8 @@ struct wma_txrx_node { uint8_t nss_5g; bool p2p_lo_in_progress; uint8_t wep_default_key_idx; + tSirHostOffloadReq arp_offload_req; + tSirHostOffloadReq ns_offload_req; }; #if defined(QCA_WIFI_FTM) diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 3bdecdd02ca7..4a9426bf692d 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1407,6 +1407,13 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, status = -EINVAL; goto free_req_msg; } + + /* Clear arp and ns offload cache */ + qdf_mem_zero(&iface->ns_offload_req, + sizeof(iface->ns_offload_req)); + qdf_mem_zero(&iface->arp_offload_req, + sizeof(iface->arp_offload_req)); + if (wma_is_vdev_in_ibss_mode(wma, resp_event->vdev_id)) wma_delete_all_ibss_peers(wma, resp_event->vdev_id); else if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index bfe160e80e10..98aa53f37a08 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -5336,7 +5336,7 @@ out: * wma_enable_arp_ns_offload() - enable ARP NS offload * @wma: wma handle * @tpSirHostOffloadReq: offload request - * @arp_only: flag + * @config_arp: config arp flag * * To configure ARP NS off load data to firmware * when target goes to wow mode. @@ -5345,41 +5345,73 @@ out: */ QDF_STATUS wma_enable_arp_ns_offload(tp_wma_handle wma, tpSirHostOffloadReq - pHostOffloadParams, bool arp_only) + offload_req, bool config_arp) { int32_t res; uint8_t vdev_id; + tpSirHostOffloadReq ns_offload_req; + tpSirHostOffloadReq arp_offload_req; /* Get the vdev id */ - if (!wma_find_vdev_by_bssid(wma, pHostOffloadParams->bssid.bytes, + if (!wma_find_vdev_by_bssid(wma, offload_req->bssid.bytes, &vdev_id)) { WMA_LOGE("vdev handle is invalid for %pM", - pHostOffloadParams->bssid.bytes); - qdf_mem_free(pHostOffloadParams); + offload_req->bssid.bytes); + qdf_mem_free(offload_req); return QDF_STATUS_E_INVAL; } if (!wma->interfaces[vdev_id].vdev_up) { WMA_LOGE("vdev %d is not up skipping arp/ns offload", vdev_id); - qdf_mem_free(pHostOffloadParams); + qdf_mem_free(offload_req); return QDF_STATUS_E_FAILURE; } + /* + * config_arp is true means arp request comes from upper layer + * Hence ns request need to used from wma cached request. + */ + if (config_arp) { + arp_offload_req = offload_req; + ns_offload_req = &wma->interfaces[vdev_id].ns_offload_req; + WMA_LOGD(" %s: ARP Offload vdev_id: %d enable: %d", + __func__, vdev_id, + offload_req->enableOrDisable); + } else { + ns_offload_req = offload_req; + arp_offload_req = &wma->interfaces[vdev_id].arp_offload_req; + WMA_LOGD(" %s: NS Offload vdev_id: %d enable: %d ns_count: %u", + __func__, vdev_id, + offload_req->enableOrDisable, + offload_req->num_ns_offload_count); + } res = wmi_unified_enable_arp_ns_offload_cmd(wma->wmi_handle, - (struct host_offload_req_param *)pHostOffloadParams, - arp_only, - vdev_id); + (struct host_offload_req_param *)arp_offload_req, + (struct host_offload_req_param *)ns_offload_req, + config_arp, + vdev_id); if (res) { WMA_LOGE("Failed to enable ARP NDP/NSffload"); - qdf_mem_free(pHostOffloadParams); + qdf_mem_free(offload_req); return QDF_STATUS_E_FAILURE; } - qdf_mem_free(pHostOffloadParams); + if (config_arp) { + qdf_mem_copy(&wma->interfaces[vdev_id].arp_offload_req, + offload_req, + sizeof(wma->interfaces[vdev_id].arp_offload_req)); + } else { + qdf_mem_copy(&wma->interfaces[vdev_id].ns_offload_req, + offload_req, + sizeof(wma->interfaces[vdev_id].ns_offload_req)); + } + + qdf_mem_free(offload_req); return QDF_STATUS_SUCCESS; } + /** * wma_process_cesium_enable_ind() - enables cesium functionality in target * @wma: wma handle |
