From a23b01405b15fca6b20030083a2343df09084025 Mon Sep 17 00:00:00 2001 From: Arif Hussain Date: Tue, 25 Apr 2017 23:27:54 -0700 Subject: [PATCH] qcacmn: Implement converting freq/chan within dfs Implement converting freq to chan and chan to freq within dfs module. Change-Id: Id9b39dbe90264621b0702a99a8df69fff9af9dd3 CRs-Fixed: 2017481 --- umac/dfs/core/src/misc/dfs_nol.c | 4 +- .../src/misc/dfs_process_radar_found_ind.c | 6 +-- umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h | 44 +++++++++++++++--- umac/dfs/dispatcher/src/wlan_dfs_utils_api.c | 46 +++++++++++++++---- 4 files changed, 80 insertions(+), 20 deletions(-) diff --git a/umac/dfs/core/src/misc/dfs_nol.c b/umac/dfs/core/src/misc/dfs_nol.c index 1fcb3a187b..2eb73921cd 100644 --- a/umac/dfs/core/src/misc/dfs_nol.c +++ b/umac/dfs/core/src/misc/dfs_nol.c @@ -105,7 +105,7 @@ static os_timer_func(dfs_remove_from_nol) struct wlan_dfs *dfs; uint16_t delfreq; uint16_t delchwidth; - uint32_t chan; + uint8_t chan; OS_GET_TIMER_ARG(nol_arg, struct dfs_nol_timer_arg *); @@ -120,7 +120,7 @@ static os_timer_func(dfs_remove_from_nol) dfs_nol_update(dfs); dfs_mlme_nol_timeout_notification(dfs->dfs_pdev_obj); - chan = utils_dfs_freq_to_chan(dfs->dfs_pdev_obj, delfreq); + chan = utils_dfs_freq_to_chan(delfreq); DFS_DPRINTK(dfs, WLAN_DEBUG_DFS_NOL, "%s: remove channel %d from nol\n", __func__, chan); utils_dfs_reg_update_nol_ch(dfs->dfs_pdev_obj, diff --git a/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c b/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c index 126e5cffd3..57600fb318 100644 --- a/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c +++ b/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c @@ -230,10 +230,10 @@ void dfs_process_radar_found_indication(struct wlan_dfs *dfs, sidx = DFS_FREQ_OFFSET_TO_SIDX(radar_found->freq_offset); if (!radar_found->segment_id) - freq_center = utils_dfs_chan_to_freq(dfs->dfs_pdev_obj, + freq_center = utils_dfs_chan_to_freq( dfs->dfs_curchan->ic_vhtop_ch_freq_seg1); else { - freq_center = utils_dfs_chan_to_freq(dfs->dfs_pdev_obj, + freq_center = utils_dfs_chan_to_freq( dfs->dfs_curchan->ic_vhtop_ch_freq_seg2); if (flag & IEEE80211_CHAN_VHT160) freq_center += DFS_160MHZ_SECOND_SEG_OFFSET; @@ -273,7 +273,7 @@ void dfs_process_radar_found_indication(struct wlan_dfs *dfs, for (i = 0; i < DFS_NUM_FREQ_OFFSET; i++) { freq_offset.chan_num[i] = utils_dfs_freq_to_chan( - dfs->dfs_pdev_obj, freq_offset.freq[i]); + freq_offset.freq[i]); DFS_PRINTK("%s: offset=%d, channel%d\n", __func__, i, freq_offset.chan_num[i]); } diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h index 47a72c4052..9e8965250f 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h @@ -37,6 +37,42 @@ /* Max nol channels */ #define DFS_MAX_NOL_CHANNEL 80 +/* WLAN 2.4GHz start freq */ +#define DFS_24_GHZ_BASE_FREQ (2407) + +/* WLAN 5GHz start freq */ +#define DFS_5_GHZ_BASE_FREQ (5000) + +/* WLAN 2.4 GHz channel number 6 */ +#define DFS_24_GHZ_CHANNEL_6 (6) + +/* WLAN 2.4 GHz channel number 14 */ +#define DFS_24_GHZ_CHANNEL_14 (14) + +/* WLAN 2.4 GHz channel number 15 */ +#define DFS_24_GHZ_CHANNEL_15 (15) + +/* WLAN 2.4 GHz channel number 27 */ +#define DFS_24_GHZ_CHANNEL_27 (27) + +/* WLAN 5GHz channel number 170 */ +#define DFS_5_GHZ_CHANNEL_170 (170) + +/* WLAN 5MHz channel spacing */ +#define DFS_CHAN_SPACING_5MHZ (5) + +/* WLAN 20Hz channel spacing */ +#define DFS_CHAN_SPACING_20MHZ (20) + +/* WLAN 2.4GHz channel number 14 freq */ +#define DFS_CHAN_14_FREQ (2484) + +/* WLAN 2.4GHz channel number 15 freq */ +#define DFS_CHAN_15_FREQ (2512) + +/* WLAN 5GHz channel number 170 freq */ +#define DFS_CHAN_170_FREQ (5852) + /* dfs offload service bit */ #define DFS_SERVICE_PHYERR_OFFLOAD 113 @@ -389,22 +425,18 @@ void utils_dfs_reg_update_nol_ch(struct wlan_objmgr_pdev *pdev, /** * utils_dfs_freq_to_chan () - convert channel freq to channel number - * @pdev: pdev ptr * @freq: frequency * * Return: channel number */ -uint32_t utils_dfs_freq_to_chan(struct wlan_objmgr_pdev *pdev, - uint32_t freq); +uint8_t utils_dfs_freq_to_chan(uint32_t freq); /** * utils_dfs__chan_to_freq () - convert channel number to frequency - * @pdev: pdev ptr * @chan: channel number * * Return: frequency */ -uint32_t utils_dfs_chan_to_freq(struct wlan_objmgr_pdev *pdev, - uint32_t chan); +uint32_t utils_dfs_chan_to_freq(uint8_t chan); #endif /* _WLAN_DFS_UTILS_API_H_ */ diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c index b858dcb719..157f4e0bbf 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c @@ -530,6 +530,8 @@ QDF_STATUS dfs_get_random_channel( ch_params->center_freq_seg0 = cur_chan.ic_vhtop_ch_freq_seg1; ch_params->center_freq_seg1 = cur_chan.ic_vhtop_ch_freq_seg2; + DFS_PRINTK("%s: input width=%d\n", __func__, ch_params->ch_width); + if (*target_chan) { wlan_reg_set_channel_params(pdev, (uint8_t)*target_chan, 0, ch_params); @@ -537,6 +539,9 @@ QDF_STATUS dfs_get_random_channel( status = QDF_STATUS_SUCCESS; } + DFS_PRINTK("%s: ch=%d, seg0=%d, seg1=%d, width=%d\n", + __func__, *target_chan, ch_params->center_freq_seg0, + ch_params->center_freq_seg1, ch_params->ch_width); random_chan_error: qdf_mem_free(chan_list); @@ -575,10 +580,13 @@ void dfs_init_nol(struct wlan_objmgr_pdev *pdev) qdf_mem_zero(&dfs_nolinfo, sizeof(dfs_nolinfo)); len = pld_wlan_get_dfs_nol(qdf_dev->dev, (void *)&dfs_nolinfo, (uint16_t)sizeof(dfs_nolinfo)); - if (len > 0) + if (len > 0) { dfs_set_nol(dfs, dfs_nolinfo.dfs_nol, dfs_nolinfo.num_chans); - else - DFS_PRINTK("%s: nol nol in pld\n", __func__); + DFS_PRINTK("%s: nol channels in pld\n", __func__); + dfs_print_nol(dfs); + } else { + DFS_PRINTK("%s: no nol in pld\n", __func__); + } } #endif EXPORT_SYMBOL(dfs_init_nol); @@ -685,16 +693,36 @@ void utils_dfs_reg_update_nol_ch(struct wlan_objmgr_pdev *pdev, } EXPORT_SYMBOL(utils_dfs_reg_update_nol_ch); -uint32_t utils_dfs_freq_to_chan(struct wlan_objmgr_pdev *pdev, - uint32_t freq) +uint8_t utils_dfs_freq_to_chan(uint32_t freq) { - return wlan_reg_freq_to_chan(pdev, freq); + uint8_t chan; + + if (freq > DFS_24_GHZ_BASE_FREQ && freq < DFS_CHAN_14_FREQ) + chan = ((freq - DFS_24_GHZ_BASE_FREQ) / DFS_CHAN_SPACING_5MHZ); + else if (freq == DFS_CHAN_14_FREQ) + chan = DFS_24_GHZ_CHANNEL_14; + else if ((freq > DFS_24_GHZ_BASE_FREQ) && (freq < DFS_5_GHZ_BASE_FREQ)) + chan = (((freq - DFS_CHAN_15_FREQ) / DFS_CHAN_SPACING_20MHZ) + + DFS_24_GHZ_CHANNEL_15); + else + chan = (freq - DFS_5_GHZ_BASE_FREQ) / DFS_CHAN_SPACING_5MHZ; + + return chan; } EXPORT_SYMBOL(utils_dfs_freq_to_chan); -uint32_t utils_dfs_chan_to_freq(struct wlan_objmgr_pdev *pdev, - uint32_t chan) +uint32_t utils_dfs_chan_to_freq(uint8_t chan) { - return wlan_reg_chan_to_freq(pdev, chan); + if (chan < DFS_24_GHZ_CHANNEL_14) + return DFS_24_GHZ_BASE_FREQ + (chan * DFS_CHAN_SPACING_5MHZ); + else if (chan == DFS_24_GHZ_CHANNEL_14) + return DFS_CHAN_14_FREQ; + else if (chan < DFS_24_GHZ_CHANNEL_27) + return DFS_CHAN_15_FREQ + ((chan - DFS_24_GHZ_CHANNEL_15) * + DFS_CHAN_SPACING_20MHZ); + else if (chan == DFS_5_GHZ_CHANNEL_170) + return DFS_CHAN_170_FREQ; + else + return DFS_5_GHZ_BASE_FREQ + (chan * DFS_CHAN_SPACING_5MHZ); } EXPORT_SYMBOL(utils_dfs_chan_to_freq);