qcacmn: Enable WDS learning only when configured

Add support to make WDS source port learning in lithium datapath
to be configurable.

Change-Id: I63eb64d6f46560a31f8e40a806d05d1dceddd784
CRs-Fixed: 2004658
This commit is contained in:
Karunakar Dasineni
2017-01-16 10:08:58 -08:00
committed by Sandeep Puligilla
parent 7e19ec5b53
commit ca792543cf
6 changed files with 46 additions and 13 deletions

View File

@@ -521,7 +521,7 @@ struct cdp_wds_ops {
void void
(*txrx_set_wds_rx_policy)(struct cdp_vdev *vdev, (*txrx_set_wds_rx_policy)(struct cdp_vdev *vdev,
u_int32_t val); u_int32_t val);
int (*vdev_set_wds)(void *vdev, uint32_t val);
}; };
struct cdp_raw_ops { struct cdp_raw_ops {

View File

@@ -58,4 +58,21 @@ cdp_set_wds_rx_policy(ol_txrx_soc_handle soc,
return; return;
} }
/**
* cdp_vdev_set_wds() - Set/unset wds_enable flag in vdev
* @soc - data path soc handle
* @vdev - data path vap handle
* @val - value to be set in wds_en flag
*
* This flag enables WDS source port learning feature on a vdev
*
* return 1 on success
*/
static inline int
cdp_vdev_set_wds(ol_txrx_soc_handle soc, void *vdev, uint32_t val)
{
if (soc->ops->wds_ops->vdev_set_wds)
return soc->ops->wds_ops->vdev_set_wds(vdev, val);
return 0;
}
#endif #endif

View File

@@ -2116,10 +2116,24 @@ static void dp_peer_delete_wifi3(void *peer_handle)
static uint8 *dp_get_vdev_mac_addr_wifi3(struct cdp_vdev *pvdev) static uint8 *dp_get_vdev_mac_addr_wifi3(struct cdp_vdev *pvdev)
{ {
struct dp_vdev *vdev = (struct dp_vdev *)pvdev; struct dp_vdev *vdev = (struct dp_vdev *)pvdev;
return vdev->mac_addr.raw; return vdev->mac_addr.raw;
} }
/*
* dp_vdev_set_wds() - Enable per packet stats
* @vdev_handle: DP VDEV handle
* @val: value
*
* Return: none
*/
static int dp_vdev_set_wds(void *vdev_handle, uint32_t val)
{
struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
vdev->wds_enabled = val;
return 0;
}
/* /*
* dp_get_vdev_from_vdev_id_wifi3() Detach txrx peer * dp_get_vdev_from_vdev_id_wifi3() Detach txrx peer
* @peer_handle: Datapath peer handle * @peer_handle: Datapath peer handle
@@ -3332,6 +3346,10 @@ static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value)
} }
static struct cdp_wds_ops dp_ops_wds = {
.vdev_set_wds = dp_vdev_set_wds,
};
static struct cdp_cmn_ops dp_ops_cmn = { static struct cdp_cmn_ops dp_ops_cmn = {
.txrx_soc_attach_target = dp_soc_attach_target_wifi3, .txrx_soc_attach_target = dp_soc_attach_target_wifi3,
.txrx_vdev_attach = dp_vdev_attach_wifi3, .txrx_vdev_attach = dp_vdev_attach_wifi3,
@@ -3400,10 +3418,6 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
/* TODO */ /* TODO */
}; };
static struct cdp_wds_ops dp_ops_wds = {
/* TODO */
};
static struct cdp_raw_ops dp_ops_raw = { static struct cdp_raw_ops dp_ops_raw = {
/* TODO */ /* TODO */
}; };

View File

@@ -964,10 +964,11 @@ done:
#endif /* NAPIER_EMULATION */ #endif /* NAPIER_EMULATION */
/* WDS Source Port Learning */ /* WDS Source Port Learning */
if (qdf_likely(vdev->rx_decap_type == if (qdf_likely((vdev->wds_enabled) &&
htt_cmn_pkt_type_ethernet)) (vdev->rx_decap_type ==
htt_cmn_pkt_type_ethernet)))
dp_rx_wds_srcport_learn(soc, rx_tlv_hdr, peer, dp_rx_wds_srcport_learn(soc, rx_tlv_hdr, peer,
nbuf); nbuf);
/* Intrabss-fwd */ /* Intrabss-fwd */
if (vdev->opmode != wlan_op_mode_sta) if (vdev->opmode != wlan_op_mode_sta)

View File

@@ -298,7 +298,8 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc,
__func__, __LINE__, sgi, rate_mcs, tid); __func__, __LINE__, sgi, rate_mcs, tid);
/* WDS Source Port Learning */ /* WDS Source Port Learning */
if (qdf_likely(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet)) if (qdf_likely(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet) &&
(vdev->wds_enabled))
dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf); dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf);
/* /*
@@ -310,9 +311,6 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc,
if (l2_hdr_offset) if (l2_hdr_offset)
qdf_nbuf_pull_head(nbuf, l2_hdr_offset); qdf_nbuf_pull_head(nbuf, l2_hdr_offset);
/* WDS Source Port Learning */
dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf);
if (hal_rx_mpdu_start_mpdu_qos_control_valid_get( if (hal_rx_mpdu_start_mpdu_qos_control_valid_get(
rx_desc->rx_buf_start)) { rx_desc->rx_buf_start)) {
/* TODO: Assuming that qos_control_valid also indicates /* TODO: Assuming that qos_control_valid also indicates

View File

@@ -896,6 +896,9 @@ struct dp_vdev {
/* BSS peer */ /* BSS peer */
struct dp_peer *vap_bss_peer; struct dp_peer *vap_bss_peer;
/* WDS enabled */
bool wds_enabled;
/* NAWDS enabled */ /* NAWDS enabled */
bool nawds_enabled; bool nawds_enabled;