|
@@ -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
|