diff options
| author | Dustin Brown <dustinb@codeaurora.org> | 2017-04-28 11:21:07 -0700 |
|---|---|---|
| committer | snandini <snandini@codeaurora.org> | 2017-04-28 18:06:49 -0700 |
| commit | e4e25ecb27d8b9eaae491cc7aab5f59d2f2379a5 (patch) | |
| tree | add959e8e772a40ec843218badf75ea3e9664d9d | |
| parent | 6f860de796fa7aeba9bbabd4f9cf188653b6f7cc (diff) | |
qcacmn: Expose full hardware filter capabilities via WMI
The WMI API exposes the broadcast hardware filter. Modify the WMI API
to expose all of the supported modes of the hardware filter.
Change-Id: I185b149f4d1ad38692d8ff5810acd52bf84565b2
CRs-Fixed: 2040419
| -rw-r--r-- | wmi/inc/wmi_unified_api.h | 16 | ||||
| -rw-r--r-- | wmi/inc/wmi_unified_priv.h | 4 | ||||
| -rw-r--r-- | wmi/inc/wmi_unified_tlv.h | 16 | ||||
| -rw-r--r-- | wmi/src/wmi_unified_api.c | 15 | ||||
| -rw-r--r-- | wmi/src/wmi_unified_tlv.c | 52 |
5 files changed, 46 insertions, 57 deletions
diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index e6d8e05dacea..36213899eb62 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -841,18 +841,20 @@ QDF_STATUS wmi_unified_enable_arp_ns_offload_cmd(void *wmi_hdl, uint8_t vdev_id); /** - * wmi_unified_configure_broadcast_filter_cmd() - Enable/Disable Broadcast - * filter - * when target goes to wow suspend/resume mode + * wmi_unified_conf_hw_filter_mode_cmd() - Configure hardware filter * @wmi_hdl: wmi handle * @vdev_id: device identifier - * @bc_filter: enable/disable Broadcast filter + * @config_bitmap: bitmap of packet types to drop * + * The hardware filter is only effective in DTIM mode. Use this configuration + * to blanket drop broadcast/multicast packets at the hardware level, without + * waking up the firmware * - * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + * Return: QDF_STATUS */ -QDF_STATUS wmi_unified_configure_broadcast_filter_cmd(void *wmi_hdl, - uint8_t vdev_id, bool bc_filter); +QDF_STATUS wmi_unified_conf_hw_filter_mode_cmd(void *wmi_hdl, + uint8_t vdev_id, + uint8_t config_bitmap); QDF_STATUS wmi_unified_set_led_flashing_cmd(void *wmi_hdl, struct flashing_req_params *flashing); diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 546a01e09e4e..433960bb9e21 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -180,8 +180,8 @@ QDF_STATUS (*send_vdev_delete_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*send_vdev_stop_cmd)(wmi_unified_t wmi, uint8_t vdev_id); -QDF_STATUS (*send_enable_broadcast_filter_cmd)(wmi_unified_t wmi_handle, - uint8_t vdev_id, bool enable); +QDF_STATUS (*send_conf_hw_filter_mode_cmd)(wmi_unified_t wmi, uint8_t vdev_id, + uint8_t mode_bitmap); QDF_STATUS (*send_vdev_down_cmd)(wmi_unified_t wmi, uint8_t vdev_id); diff --git a/wmi/inc/wmi_unified_tlv.h b/wmi/inc/wmi_unified_tlv.h index 3ec87efc49ee..0d54f81bcd65 100644 --- a/wmi/inc/wmi_unified_tlv.h +++ b/wmi/inc/wmi_unified_tlv.h @@ -528,17 +528,15 @@ QDF_STATUS send_enable_arp_ns_offload_cmd_tlv(wmi_unified_t wmi_handle, uint8_t vdev_id); /** - * send_enable_broadcast_filter_cmd_tlv() - Enable/Disable Broadcast filter - * when target goes to wow suspend/resume mode - * @wma: wmi handle - * @vdev_id: device identifier - * @enable: enable/disable broadcast filter + * send_conf_hw_filter_cmd_tlv() - configure hw filter mode to firmware + * @wmi: wmi handle + * @vdev_id: Id of the vdev to configure + * @mode_bitmap: the hw filter mode to configure * - * - * Return: QDF Status + * Return: QDF_STATUS */ -QDF_STATUS send_enable_broadcast_filter_cmd_tlv(wmi_unified_t wmi_handle, - uint8_t vdev_id, bool enable); +QDF_STATUS send_conf_hw_filter_cmd_tlv(wmi_unified_t wmi, uint8_t vdev_id, + uint8_t mode_bitmap); QDF_STATUS send_set_led_flashing_cmd_tlv(wmi_unified_t wmi_handle, struct flashing_req_params *flashing); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index a81b0bc9ba6b..c48920b4ddc0 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -3171,16 +3171,17 @@ QDF_STATUS wmi_unified_enable_arp_ns_offload_cmd(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } -QDF_STATUS wmi_unified_configure_broadcast_filter_cmd(void *wmi_hdl, - uint8_t vdev_id, bool bc_filter) +QDF_STATUS wmi_unified_conf_hw_filter_mode_cmd(void *wmi_hdl, + uint8_t vdev_id, + uint8_t mode_bitmap) { - wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + wmi_unified_t wmi = wmi_hdl; - if (wmi_handle->ops->send_enable_broadcast_filter_cmd) - return wmi_handle->ops->send_enable_broadcast_filter_cmd( - wmi_handle, vdev_id, bc_filter); + if (!wmi->ops->send_conf_hw_filter_mode_cmd) + return QDF_STATUS_E_FAILURE; - return QDF_STATUS_E_FAILURE; + return wmi->ops->send_conf_hw_filter_mode_cmd(wmi, vdev_id, + mode_bitmap); } /** diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 5c11dcb1330b..0ad31cf2d21a 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -10607,47 +10607,36 @@ QDF_STATUS send_enable_arp_ns_offload_cmd_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } -QDF_STATUS send_enable_broadcast_filter_cmd_tlv(wmi_unified_t wmi_handle, - uint8_t vdev_id, bool enable) +QDF_STATUS send_conf_hw_filter_cmd_tlv(wmi_unified_t wmi, uint8_t vdev_id, + uint8_t mode_bitmap) { - int32_t res; + QDF_STATUS status; wmi_hw_data_filter_cmd_fixed_param *cmd; - A_UINT8 *buf_ptr; - wmi_buf_t buf; - int32_t len; - - /* - * TLV place holder size for array of ARP tuples - */ - len = sizeof(wmi_hw_data_filter_cmd_fixed_param); + wmi_buf_t wmi_buf; - buf = wmi_buf_alloc(wmi_handle, len); - if (!buf) { - WMI_LOGE("%s: wmi_buf_alloc failed", __func__); + wmi_buf = wmi_buf_alloc(wmi, sizeof(*cmd)); + if (!wmi_buf) { + WMI_LOGE(FL("Out of memory")); return QDF_STATUS_E_NOMEM; } - buf_ptr = (A_UINT8 *) wmi_buf_data(buf); - cmd = (wmi_hw_data_filter_cmd_fixed_param *) buf_ptr; + cmd = (wmi_hw_data_filter_cmd_fixed_param *)wmi_buf_data(wmi_buf); WMITLV_SET_HDR(&cmd->tlv_header, - WMITLV_TAG_STRUC_wmi_hw_data_filter_cmd_fixed_param, - WMITLV_GET_STRUCT_TLVLEN - (wmi_hw_data_filter_cmd_fixed_param)); + WMITLV_TAG_STRUC_wmi_hw_data_filter_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_hw_data_filter_cmd_fixed_param)); cmd->vdev_id = vdev_id; - cmd->enable = enable; - cmd->hw_filter_bitmap = WMI_HW_DATA_FILTER_DROP_NON_ARP_BC; - - WMI_LOGD("HW Broadcast Filter vdev_id: %d", cmd->vdev_id); + cmd->enable = mode_bitmap != 0; + cmd->hw_filter_bitmap = mode_bitmap; - res = wmi_unified_cmd_send(wmi_handle, buf, len, - WMI_HW_DATA_FILTER_CMDID); - if (res) { - WMI_LOGE("Failed to enable ARP NDP/NSffload"); - wmi_buf_free(buf); - return QDF_STATUS_E_FAILURE; + WMI_LOGD("conf hw filter vdev_id: %d, mode: %u", vdev_id, mode_bitmap); + status = wmi_unified_cmd_send(wmi, wmi_buf, sizeof(*cmd), + WMI_HW_DATA_FILTER_CMDID); + if (QDF_IS_STATUS_ERROR(status)) { + WMI_LOGE("Failed to configure hw filter"); + wmi_buf_free(wmi_buf); } - return QDF_STATUS_SUCCESS; + return status; } /** @@ -13279,8 +13268,7 @@ struct wmi_ops tlv_ops = { send_pdev_set_dual_mac_config_cmd_tlv, .send_enable_arp_ns_offload_cmd = send_enable_arp_ns_offload_cmd_tlv, - .send_enable_broadcast_filter_cmd = - send_enable_broadcast_filter_cmd_tlv, + .send_conf_hw_filter_mode_cmd = send_conf_hw_filter_cmd_tlv, .send_app_type1_params_in_fw_cmd = send_app_type1_params_in_fw_cmd_tlv, .send_set_ssid_hotlist_cmd = send_set_ssid_hotlist_cmd_tlv, |
