From 041409f98fd3c5214e80da4bc63044a6e1d739a3 Mon Sep 17 00:00:00 2001 From: Aditya Sathish Date: Wed, 29 Jan 2020 15:14:02 +0530 Subject: [PATCH] qcacmn: Add 6GHz support for chan/freq/band usage in mesh mode Currently mesh mode uses channel numbering which is derived from APIs that don't support 6GHz channels numbering due to the overloading of 6GHz channels with 2.4GHz and 5GHz. Add support to obtain the correct channel number (and auxiliary information like band and frequency) through the new APIs that support 6GHz. Change-Id: Ib0b39ebae2a22bd6b2b5d17b9058c3c2100e0d59 CRs-Fixed: 2605229 --- dp/inc/cdp_txrx_ops.h | 5 ++++- dp/wifi3.0/dp_htt.c | 14 +++++++++++--- dp/wifi3.0/dp_rx.c | 16 +++++++++++++++- dp/wifi3.0/dp_tx.c | 3 ++- dp/wifi3.0/dp_types.h | 6 +++++- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 56c4e649acea..4dc61558e263 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1052,7 +1052,10 @@ struct ol_if_ops { uint16_t hdr_space); uint8_t (*freq_to_channel)(struct cdp_ctrl_objmgr_psoc *psoc, - uint8_t vdev_id, uint16_t freq); + uint8_t pdev_id, uint16_t freq); + + uint8_t (*freq_to_band)(struct cdp_ctrl_objmgr_psoc *psoc, + uint8_t pdev_id, uint16_t freq); #ifdef ATH_SUPPORT_NAC_RSSI int (*config_fw_for_nac_rssi)(struct cdp_ctrl_objmgr_psoc *psoc, diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 71760521c64d..1998ce04284f 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -2136,10 +2136,18 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, if (freq != ppdu_desc->channel) { soc = pdev->soc; ppdu_desc->channel = freq; + pdev->operating_channel.freq = freq; if (soc && soc->cdp_soc.ol_ops->freq_to_channel) - pdev->operating_channel = - soc->cdp_soc.ol_ops->freq_to_channel(soc->ctrl_psoc, - pdev->pdev_id, freq); + pdev->operating_channel.num = + soc->cdp_soc.ol_ops->freq_to_channel(soc->ctrl_psoc, + pdev->pdev_id, + freq); + + if (soc && soc->cdp_soc.ol_ops->freq_to_band) + pdev->operating_channel.band = + soc->cdp_soc.ol_ops->freq_to_band(soc->ctrl_psoc, + pdev->pdev_id, + freq); } ppdu_desc->phy_mode = HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_GET(*tag_buf); diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index b94801e1dd9f..f1912109cb94 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -546,6 +546,9 @@ void dp_rx_fill_mesh_stats(struct dp_vdev *vdev, qdf_nbuf_t nbuf, uint32_t nss; uint32_t rate_mcs; uint32_t bw; + uint8_t primary_chan_num; + uint32_t center_chan_freq; + struct dp_soc *soc; /* fill recv mesh stats */ rx_info = qdf_mem_malloc(sizeof(struct mesh_recv_hdr_s)); @@ -577,7 +580,18 @@ void dp_rx_fill_mesh_stats(struct dp_vdev *vdev, qdf_nbuf_t nbuf, } rx_info->rs_rssi = hal_rx_msdu_start_get_rssi(rx_tlv_hdr); - rx_info->rs_channel = hal_rx_msdu_start_get_freq(rx_tlv_hdr); + + soc = vdev->pdev->soc; + primary_chan_num = hal_rx_msdu_start_get_freq(rx_tlv_hdr); + center_chan_freq = hal_rx_msdu_start_get_freq(rx_tlv_hdr) >> 16; + + if (soc->cdp_soc.ol_ops && soc->cdp_soc.ol_ops->freq_to_band) { + rx_info->rs_band = soc->cdp_soc.ol_ops->freq_to_band( + soc->ctrl_psoc, + vdev->pdev->pdev_id, + center_chan_freq); + } + rx_info->rs_channel = primary_chan_num; pkt_type = hal_rx_msdu_start_get_pkt_type(rx_tlv_hdr); rate_mcs = hal_rx_msdu_start_rate_mcs_get(rx_tlv_hdr); bw = hal_rx_msdu_start_bw_get(rx_tlv_hdr); diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index ef04175b8dc9..c2ea5f4d3802 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -2834,7 +2834,8 @@ void dp_tx_comp_fill_tx_completion_stats(struct dp_tx_desc_s *tx_desc, mhdr = (struct meta_hdr_s *)qdf_nbuf_data(netbuf); mhdr->rssi = ts->ack_frame_rssi; - mhdr->channel = tx_desc->pdev->operating_channel; + mhdr->band = tx_desc->pdev->operating_channel.band; + mhdr->channel = tx_desc->pdev->operating_channel.num; } #else diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 3b30f89863a5..3c24f1f1a9d0 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1581,7 +1581,11 @@ struct dp_pdev { struct hal_rx_ppdu_info ppdu_info; /* operating channel */ - uint8_t operating_channel; + struct { + uint8_t num; + uint8_t band; + uint16_t freq; + } operating_channel; qdf_nbuf_queue_t rx_status_q; uint32_t mon_ppdu_status;