qcacld-3.0: Add support for set multicast filter command
Add support for WMI_SET_MULTIPLE_MCAST_FILTER_CMDID command that can add/delete multiple mcast filters. CRs-Fixed: 2096595 Change-Id: I3dc93c603a5a6676d97b5911a716277c7bef0ef8
This commit is contained in:

committed by
Nandini Suresh

parent
a9dd0d6dd2
commit
6fa3065430
@@ -100,6 +100,40 @@ QDF_STATUS target_if_pmo_set_mc_filter_req(struct wlan_objmgr_vdev *vdev,
|
||||
QDF_STATUS target_if_pmo_clear_mc_filter_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct qdf_mac_addr multicast_addr);
|
||||
|
||||
/**
|
||||
* target_if_pmo_get_multiple_mc_filter_support() - get multiple mc filter
|
||||
* request fw support
|
||||
* @psoc: the psoc containing the vdev to configure
|
||||
*
|
||||
* Return: true if fw supports else false
|
||||
*/
|
||||
bool target_if_pmo_get_multiple_mc_filter_support(
|
||||
struct wlan_objmgr_psoc *psoc);
|
||||
|
||||
/**
|
||||
* target_if_pmo_set_multiple_mc_filter_req() - set multiple mcast filter
|
||||
* command to fw
|
||||
* @vdev: objmgr vdev handle
|
||||
* @multicastAddr: mcast address
|
||||
*
|
||||
* Return: 0 for success or error code
|
||||
*/
|
||||
QDF_STATUS target_if_pmo_set_multiple_mc_filter_req(
|
||||
struct wlan_objmgr_vdev *vdev,
|
||||
struct pmo_mc_addr_list *mc_list);
|
||||
|
||||
/**
|
||||
* target_if_pmo_clear_multiple_mc_filter_req() - clear multiple mcast
|
||||
* filter command to fw
|
||||
* @vdev: objmgr vdev handle
|
||||
* @multicastAddr: mcast address
|
||||
*
|
||||
* Return: 0 for success or error code
|
||||
*/
|
||||
QDF_STATUS target_if_pmo_clear_multiple_mc_filter_req(
|
||||
struct wlan_objmgr_vdev *vdev,
|
||||
struct pmo_mc_addr_list *mc_list);
|
||||
|
||||
/**
|
||||
* target_if_pmo_send_ra_filter_req() - set RA filter pattern in fw
|
||||
* @vdev: objmgr vdev handle
|
||||
|
@@ -49,6 +49,12 @@ void target_if_pmo_register_tx_ops(struct wlan_pmo_tx_ops *pmo_tx_ops)
|
||||
target_if_pmo_set_mc_filter_req;
|
||||
pmo_tx_ops->send_clear_mc_filter_req =
|
||||
target_if_pmo_clear_mc_filter_req;
|
||||
pmo_tx_ops->get_multiple_mc_filter_support =
|
||||
target_if_pmo_get_multiple_mc_filter_support;
|
||||
pmo_tx_ops->send_set_multiple_mc_filter_req =
|
||||
target_if_pmo_set_multiple_mc_filter_req;
|
||||
pmo_tx_ops->send_clear_multiple_mc_filter_req =
|
||||
target_if_pmo_clear_multiple_mc_filter_req;
|
||||
pmo_tx_ops->send_ra_filter_req =
|
||||
target_if_pmo_send_ra_filter_req;
|
||||
pmo_tx_ops->send_gtk_offload_req =
|
||||
|
@@ -88,4 +88,87 @@ QDF_STATUS target_if_pmo_clear_mc_filter_req(
|
||||
|
||||
}
|
||||
|
||||
bool target_if_pmo_get_multiple_mc_filter_support(
|
||||
struct wlan_objmgr_psoc *psoc)
|
||||
{
|
||||
return WMI_SERVICE_IS_ENABLED(psoc->service_param.service_bitmap,
|
||||
WMI_SERVICE_MULTIPLE_MCAST_FILTER_SET);
|
||||
}
|
||||
|
||||
QDF_STATUS target_if_pmo_set_multiple_mc_filter_req(
|
||||
struct wlan_objmgr_vdev *vdev,
|
||||
struct pmo_mc_addr_list *mc_list)
|
||||
{
|
||||
uint8_t vdev_id;
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
struct pmo_mcast_filter_params filter_params;
|
||||
QDF_STATUS status;
|
||||
|
||||
if (!vdev) {
|
||||
target_if_err("vdev ptr passed is NULL");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
psoc = wlan_vdev_get_psoc(vdev);
|
||||
vdev_id = wlan_vdev_get_id(vdev);
|
||||
if (!psoc) {
|
||||
target_if_err("psoc handle is NULL");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
filter_params.multicast_addr_cnt = mc_list->mc_cnt;
|
||||
qdf_mem_copy(filter_params.multicast_addr,
|
||||
mc_list->mc_addr,
|
||||
mc_list->mc_cnt * ATH_MAC_LEN);
|
||||
/* add one/multiple mc list */
|
||||
filter_params.action = 1;
|
||||
|
||||
status = wmi_unified_multiple_add_clear_mcbc_filter_cmd(
|
||||
GET_WMI_HDL_FROM_PSOC(psoc),
|
||||
vdev_id,
|
||||
&filter_params);
|
||||
if (status)
|
||||
target_if_err("Failed to send add/clear mcbc filter cmd");
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
QDF_STATUS target_if_pmo_clear_multiple_mc_filter_req(
|
||||
struct wlan_objmgr_vdev *vdev,
|
||||
struct pmo_mc_addr_list *mc_list)
|
||||
{
|
||||
uint8_t vdev_id;
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
struct pmo_mcast_filter_params filter_params;
|
||||
QDF_STATUS status;
|
||||
|
||||
if (!vdev) {
|
||||
target_if_err("vdev ptr passed is NULL");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
psoc = wlan_vdev_get_psoc(vdev);
|
||||
vdev_id = wlan_vdev_get_id(vdev);
|
||||
if (!psoc) {
|
||||
target_if_err("psoc handle is NULL");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
filter_params.multicast_addr_cnt = mc_list->mc_cnt;
|
||||
qdf_mem_copy(filter_params.multicast_addr,
|
||||
mc_list->mc_addr,
|
||||
mc_list->mc_cnt * ATH_MAC_LEN);
|
||||
/* delete one/multiple mc list */
|
||||
filter_params.action = 0;
|
||||
|
||||
status = wmi_unified_multiple_add_clear_mcbc_filter_cmd(
|
||||
GET_WMI_HDL_FROM_PSOC(psoc),
|
||||
vdev_id,
|
||||
&filter_params);
|
||||
if (status)
|
||||
target_if_err("Failed to send add/clear mcbc filter cmd");
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user