qcacld-3.0: Use freq instead of chan num for TDLS pref offchannel

Use frequency instead of chan num for processing TDLS offchannel
req for preferred offchannel.
Since, after introduction of TDLS on 6 GHz band it is better to
process offchannel in frequency instead of channel numbers as
some of the channel numbers are repeated for 6 GHz.

Change-Id: Icd7084b9f3c407ad0ad104b7f0d2230e31e0b10d
CRs-Fixed: 3234920
This commit is contained in:
Utkarsh Bhatnagar
2022-06-30 02:43:36 +05:30
committed by Madan Koyyalamudi
parent c71b2f66dc
commit fa29fba7e4
7 changed files with 205 additions and 75 deletions

View File

@@ -1918,16 +1918,16 @@ static QDF_STATUS tdls_config_force_peer(
} }
soc_obj->tdls_external_peer_count++; soc_obj->tdls_external_peer_count++;
chan_freq = wlan_reg_legacy_chan_to_freq(pdev, req->chan); chan_freq = req->ch_freq;
/* Validate if off channel is DFS channel */ /* Validate if off channel is DFS channel */
if (wlan_reg_is_dfs_for_freq(pdev, chan_freq)) { if (wlan_reg_is_dfs_for_freq(pdev, chan_freq)) {
tdls_err("Resetting TDLS off-channel from %d to %d", tdls_err("Resetting TDLS off-channel freq from %d to %d",
req->chan, WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF); req->ch_freq, WLAN_TDLS_PREFERRED_OFF_CHANNEL_FRQ_DEF);
req->chan = WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF; req->ch_freq = WLAN_TDLS_PREFERRED_OFF_CHANNEL_FRQ_DEF;
} }
tdls_set_extctrl_param(peer, req->chan, req->max_latency, req->op_class, tdls_set_extctrl_param(peer, req->ch_freq, req->max_latency,
req->min_bandwidth); req->op_class, req->min_bandwidth);
tdls_set_callback(peer, req->callback); tdls_set_callback(peer, req->callback);
@@ -1954,7 +1954,10 @@ QDF_STATUS tdls_process_setup_peer(struct tdls_oper_request *req)
struct tdls_soc_priv_obj *soc_obj; struct tdls_soc_priv_obj *soc_obj;
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
QDF_STATUS status; QDF_STATUS status;
uint8_t reg_bw_offset; uint8_t reg_bw_offset = 0;
qdf_freq_t pref_freq;
uint32_t pref_width;
struct wlan_objmgr_pdev *pdev;
tdls_debug("Configure external TDLS peer " QDF_MAC_ADDR_FMT, tdls_debug("Configure external TDLS peer " QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(req->peer_addr)); QDF_MAC_ADDR_REF(req->peer_addr));
@@ -1978,15 +1981,27 @@ QDF_STATUS tdls_process_setup_peer(struct tdls_oper_request *req)
goto error; goto error;
} }
peer_req.chan = soc_obj->tdls_configs.tdls_pre_off_chan_num; pref_freq = tdls_get_offchan_freq(vdev, soc_obj);
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
tdls_err("NULL pdev object");
status = QDF_STATUS_E_INVAL;
goto error;
}
peer_req.ch_freq = pref_freq;
pref_width = tdls_get_offchan_bw(soc_obj, pref_freq);
if (!peer_req.op_class) if (!peer_req.op_class)
peer_req.op_class = tdls_get_opclass_from_bandwidth( peer_req.op_class = tdls_get_opclass_from_bandwidth(vdev,
soc_obj, peer_req.chan, pref_freq,
soc_obj->tdls_configs.tdls_pre_off_chan_bw, pref_width,
&reg_bw_offset); &reg_bw_offset);
tdls_debug("peer chan %d peer opclass %d", peer_req.chan, tdls_debug("peer chan %d peer opclass %d reg_bw_offset %d",
peer_req.op_class); peer_req.ch_freq,
peer_req.op_class,
reg_bw_offset);
status = tdls_config_force_peer(&peer_req); status = tdls_config_force_peer(&peer_req);
error: error:
wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID); wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);

View File

@@ -27,6 +27,7 @@
#include "wlan_tdls_peer.h" #include "wlan_tdls_peer.h"
#include "wlan_tdls_ct.h" #include "wlan_tdls_ct.h"
#include "wlan_tdls_cmds_process.h" #include "wlan_tdls_cmds_process.h"
#include "wlan_reg_services_api.h"
bool tdls_is_vdev_authenticated(struct wlan_objmgr_vdev *vdev) bool tdls_is_vdev_authenticated(struct wlan_objmgr_vdev *vdev)
{ {
@@ -1053,7 +1054,7 @@ int tdls_set_tdls_offchannelmode(struct wlan_objmgr_vdev *vdev,
struct tdls_vdev_priv_obj *tdls_vdev; struct tdls_vdev_priv_obj *tdls_vdev;
struct tdls_soc_priv_obj *tdls_soc; struct tdls_soc_priv_obj *tdls_soc;
uint32_t tdls_feature_flags; uint32_t tdls_feature_flags;
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
status = tdls_get_vdev_objects(vdev, &tdls_vdev, &tdls_soc); status = tdls_get_vdev_objects(vdev, &tdls_vdev, &tdls_soc);
@@ -1120,13 +1121,14 @@ int tdls_set_tdls_offchannelmode(struct wlan_objmgr_vdev *vdev,
chan_switch_params.oper_class); chan_switch_params.oper_class);
} }
} else if (conn_peer->off_channel_capable && } else if (conn_peer->off_channel_capable &&
conn_peer->pref_off_chan_num) { conn_peer->pref_off_chan_freq) {
chan_switch_params.tdls_off_ch = chan_switch_params.tdls_off_ch =
conn_peer->pref_off_chan_num; wlan_reg_freq_to_chan(pdev,
conn_peer->pref_off_chan_freq);
chan_switch_params.oper_class = chan_switch_params.oper_class =
tdls_get_opclass_from_bandwidth( tdls_get_opclass_from_bandwidth(
tdls_soc, conn_peer->pref_off_chan_num, vdev, conn_peer->pref_off_chan_freq,
tdls_soc->tdls_configs.tdls_pre_off_chan_bw, conn_peer->pref_off_chan_width,
&chan_switch_params.tdls_off_ch_bw_offset); &chan_switch_params.tdls_off_ch_bw_offset);
} else { } else {
tdls_err("TDLS off-channel parameters are not set yet!!!"); tdls_err("TDLS off-channel parameters are not set yet!!!");
@@ -1177,8 +1179,10 @@ int tdls_set_tdls_offchannelmode(struct wlan_objmgr_vdev *vdev,
tdls_err("No TDLS Connected Peer"); tdls_err("No TDLS Connected Peer");
return -EPERM; return -EPERM;
} }
conn_peer->pref_off_chan_num = conn_peer->pref_off_chan_freq = wlan_reg_chan_opclass_to_freq(
chan_switch_params.tdls_off_ch; chan_switch_params.tdls_off_ch,
chan_switch_params.oper_class,
false);
conn_peer->op_class_for_pref_off_chan = conn_peer->op_class_for_pref_off_chan =
chan_switch_params.oper_class; chan_switch_params.oper_class;
} }

View File

@@ -1956,37 +1956,62 @@ void tdls_scan_serialization_comp_info_cb(struct wlan_objmgr_vdev *vdev,
comp_info->scan_info.is_tdls_in_progress = true; comp_info->scan_info.is_tdls_in_progress = true;
} }
static uint8_t tdls_find_opclass_frm_freq(struct wlan_objmgr_vdev *vdev,
qdf_freq_t ch_freq, uint8_t bw_offset,
uint16_t behav_limit)
{
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
uint8_t channel, opclass;
uint8_t tdls_get_opclass_from_bandwidth(struct tdls_soc_priv_obj *soc_obj, if (!pdev) {
uint8_t channel, uint8_t bw_offset, tdls_err("pdev is NULL");
return 0;
}
wlan_reg_freq_width_to_chan_op_class(pdev, ch_freq, bw_offset, false,
BIT(behav_limit), &opclass,
&channel);
return opclass;
}
uint8_t tdls_get_opclass_from_bandwidth(struct wlan_objmgr_vdev *vdev,
qdf_freq_t freq, uint8_t bw_offset,
uint8_t *reg_bw_offset) uint8_t *reg_bw_offset)
{ {
uint8_t opclass; uint8_t opclass;
if (bw_offset & (1 << BW_160_OFFSET_BIT)) { if (bw_offset & (1 << BW_160_OFFSET_BIT)) {
opclass = tdls_find_opclass(soc_obj->soc, opclass = tdls_find_opclass_frm_freq(vdev,
channel, BWALL); freq, BW_160_MHZ,
BEHAV_NONE);
*reg_bw_offset = BWALL; *reg_bw_offset = BWALL;
} else if (bw_offset & (1 << BW_80_OFFSET_BIT)) { } else if (bw_offset & (1 << BW_80_OFFSET_BIT)) {
opclass = tdls_find_opclass(soc_obj->soc, opclass = tdls_find_opclass_frm_freq(vdev,
channel, BW80); freq, BW_80_MHZ,
BEHAV_NONE);
*reg_bw_offset = BW80; *reg_bw_offset = BW80;
} else if (bw_offset & (1 << BW_40_OFFSET_BIT)) { } else if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
opclass = tdls_find_opclass(soc_obj->soc, opclass = tdls_find_opclass_frm_freq(vdev,
channel, BW40_LOW_PRIMARY); freq, BW_40_MHZ,
BEHAV_BW40_LOW_PRIMARY);
*reg_bw_offset = BW40_LOW_PRIMARY; *reg_bw_offset = BW40_LOW_PRIMARY;
if (!opclass) { if (!opclass) {
opclass = tdls_find_opclass(soc_obj->soc, opclass = tdls_find_opclass_frm_freq(vdev,
channel, BW40_HIGH_PRIMARY); freq,
BW_40_MHZ,
BEHAV_BW40_HIGH_PRIMARY);
*reg_bw_offset = BW40_HIGH_PRIMARY; *reg_bw_offset = BW40_HIGH_PRIMARY;
} }
} else if (bw_offset & (1 << BW_20_OFFSET_BIT)) { } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
opclass = tdls_find_opclass(soc_obj->soc, opclass = tdls_find_opclass_frm_freq(vdev,
channel, BW20); freq, BW_20_MHZ,
BEHAV_NONE);
*reg_bw_offset = BW20; *reg_bw_offset = BW20;
} else { } else {
opclass = tdls_find_opclass(soc_obj->soc, opclass = tdls_find_opclass_frm_freq(vdev,
channel, BWALL); freq, BW_160_MHZ,
BEHAV_NONE);
*reg_bw_offset = BWALL; *reg_bw_offset = BWALL;
} }

View File

@@ -319,7 +319,7 @@ struct tdls_peer_mlme_info {
* @supported_oper_classes: supported operation classes * @supported_oper_classes: supported operation classes
* @is_forced_peer: is forced peer * @is_forced_peer: is forced peer
* @op_class_for_pref_off_chan: op class for preferred off channel * @op_class_for_pref_off_chan: op class for preferred off channel
* @pref_off_chan_num: preferred off channel number * @pref_off_chan_freq: preferred off channel frequency
* @pref_off_chan_width: preferred off channel width * @pref_off_chan_width: preferred off channel width
* @peer_idle_timer: time to check idle traffic in tdls peers * @peer_idle_timer: time to check idle traffic in tdls peers
* @is_peer_idle_timer_initialised: Flag to check idle timer init * @is_peer_idle_timer_initialised: Flag to check idle timer init
@@ -351,7 +351,7 @@ struct tdls_peer {
uint8_t supported_oper_classes[WLAN_MAX_SUPP_OPER_CLASSES]; uint8_t supported_oper_classes[WLAN_MAX_SUPP_OPER_CLASSES];
bool is_forced_peer; bool is_forced_peer;
uint8_t op_class_for_pref_off_chan; uint8_t op_class_for_pref_off_chan;
uint8_t pref_off_chan_num; qdf_freq_t pref_off_chan_freq;
uint8_t pref_off_chan_width; uint8_t pref_off_chan_width;
qdf_mc_timer_t peer_idle_timer; qdf_mc_timer_t peer_idle_timer;
bool is_peer_idle_timer_initialised; bool is_peer_idle_timer_initialised;
@@ -803,8 +803,8 @@ QDF_STATUS tdls_delete_all_peers_indication(struct wlan_objmgr_psoc *psoc,
/** /**
* tdls_get_opclass_from_bandwidth() - Return opclass for corresponding BW and * tdls_get_opclass_from_bandwidth() - Return opclass for corresponding BW and
* channel. * channel.
* @soc_obj: tdls soc object. * @vdev: Pointer to vdev
* @channel: Channel number. * @freq: Channel frequency.
* @bw_offset: Bandwidth offset. * @bw_offset: Bandwidth offset.
* @reg_bw_offset: enum offset_t type bandwidth * @reg_bw_offset: enum offset_t type bandwidth
* *
@@ -812,7 +812,7 @@ QDF_STATUS tdls_delete_all_peers_indication(struct wlan_objmgr_psoc *psoc,
* *
* Return: opclass * Return: opclass
*/ */
uint8_t tdls_get_opclass_from_bandwidth(struct tdls_soc_priv_obj *soc_obj, uint8_t tdls_get_opclass_from_bandwidth(struct wlan_objmgr_vdev *vdev,
uint8_t channel, uint8_t bw_offset, qdf_freq_t freq, uint8_t bw_offset,
uint8_t *reg_bw_offset); uint8_t *reg_bw_offset);
#endif #endif

View File

@@ -147,31 +147,77 @@ uint8_t tdls_find_opclass(struct wlan_objmgr_psoc *psoc, uint8_t channel,
bw_offset); bw_offset);
} }
static void tdls_fill_pref_off_chan_num(struct tdls_vdev_priv_obj *vdev_obj, #ifdef WLAN_FEATURE_11AX
qdf_freq_t tdls_get_offchan_freq(struct wlan_objmgr_vdev *vdev,
struct tdls_soc_priv_obj *soc_obj)
{
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
qdf_freq_t pref_freq, pref_6g_freq;
uint8_t pref_non6g_ch;
if (!pdev) {
tdls_err("pdev is NULL");
return 0;
}
pref_6g_freq = soc_obj->tdls_configs.tdls_pre_off_chan_freq_6g;
pref_non6g_ch = soc_obj->tdls_configs.tdls_pre_off_chan_num;
/*
* Fill preffered offchannel frequency here. If TDLS on 6 GHz is
* allowed then fill pref 6 GHz frequency
* Otherwise, fill 5 GHz preferred frequency
*/
if (pref_6g_freq && tdls_is_6g_freq_allowed(vdev, pref_6g_freq))
pref_freq = pref_6g_freq;
else
pref_freq = wlan_reg_legacy_chan_to_freq(pdev, pref_non6g_ch);
return pref_freq;
}
#else
qdf_freq_t tdls_get_offchan_freq(struct wlan_objmgr_vdev *vdev,
struct tdls_soc_priv_obj *soc_obj)
{
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
uint32_t pref_leg_chan = soc_obj->tdls_configs.tdls_pre_off_chan_num;
if (!pdev) {
tdls_err("pdev is NULL");
return 0;
}
return wlan_reg_legacy_chan_to_freq(pdev, pref_leg_chan);
}
#endif
uint32_t tdls_get_offchan_bw(struct tdls_soc_priv_obj *soc_obj,
qdf_freq_t off_chan_freq)
{
uint32_t pre_off_chan_bw;
if (wlan_reg_is_5ghz_ch_freq(off_chan_freq) &&
CHECK_BIT(soc_obj->tdls_configs.tdls_pre_off_chan_bw,
BW_160_OFFSET_BIT))
pre_off_chan_bw = soc_obj->tdls_configs.tdls_pre_off_chan_bw &
~(1 << BW_160_OFFSET_BIT);
else
pre_off_chan_bw = soc_obj->tdls_configs.tdls_pre_off_chan_bw;
return pre_off_chan_bw;
}
static void tdls_fill_pref_off_chan_info(struct tdls_vdev_priv_obj *vdev_obj,
struct tdls_soc_priv_obj *soc_obj, struct tdls_soc_priv_obj *soc_obj,
struct tdls_peer *peer) struct tdls_peer *peer)
{ {
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev_obj->vdev); peer->pref_off_chan_freq = tdls_get_offchan_freq(vdev_obj->vdev,
soc_obj);
/* peer->pref_off_chan_width = tdls_get_offchan_bw(soc_obj,
* Fill preffered offchannel number here and prefferd bw here. peer->pref_off_chan_freq);
* Bw and channel number can be used to later calculate Op_class tdls_debug("Pref off channel freq %d chan width %d",
* which will be used to identify the channels peer->pref_off_chan_freq, peer->pref_off_chan_width);
*/
peer->pref_off_chan_width = soc_obj->tdls_configs.tdls_pre_off_chan_bw;
if (soc_obj->tdls_configs.tdls_pre_off_chan_freq_6g &&
tdls_is_6g_freq_allowed(vdev_obj->vdev,
soc_obj->tdls_configs.tdls_pre_off_chan_freq_6g)) {
peer->pref_off_chan_num =
wlan_reg_freq_to_chan(pdev,
soc_obj->tdls_configs.tdls_pre_off_chan_freq_6g);
} else {
peer->pref_off_chan_num =
soc_obj->tdls_configs.tdls_pre_off_chan_num;
if (CHECK_BIT(peer->pref_off_chan_width, BW_160_OFFSET_BIT))
peer->pref_off_chan_width &= ~(1 << BW_160_OFFSET_BIT);
}
} }
/** /**
@@ -208,11 +254,11 @@ static struct tdls_peer *tdls_add_peer(struct tdls_vdev_priv_obj *vdev_obj,
qdf_mem_copy(&peer->peer_mac, macaddr, sizeof(peer->peer_mac)); qdf_mem_copy(&peer->peer_mac, macaddr, sizeof(peer->peer_mac));
peer->vdev_priv = vdev_obj; peer->vdev_priv = vdev_obj;
tdls_fill_pref_off_chan_num(vdev_obj, soc_obj, peer); tdls_fill_pref_off_chan_info(vdev_obj, soc_obj, peer);
peer->op_class_for_pref_off_chan = peer->op_class_for_pref_off_chan =
tdls_get_opclass_from_bandwidth( tdls_get_opclass_from_bandwidth(
soc_obj, peer->pref_off_chan_num, vdev_obj->vdev, peer->pref_off_chan_freq,
soc_obj->tdls_configs.tdls_pre_off_chan_bw, peer->pref_off_chan_width,
&reg_bw_offset); &reg_bw_offset);
peer->valid_entry = false; peer->valid_entry = false;
@@ -436,7 +482,8 @@ static void tdls_determine_channel_opclass(struct tdls_soc_priv_obj *soc_obj,
&vdev_id)); &vdev_id));
*opclass = 0; *opclass = 0;
} else { } else {
*channel = peer->pref_off_chan_num; *channel = wlan_reg_freq_to_chan(pdev,
peer->pref_off_chan_freq);
*opclass = peer->op_class_for_pref_off_chan; *opclass = peer->op_class_for_pref_off_chan;
} }
tdls_debug("channel:%d opclass:%d", *channel, *opclass); tdls_debug("channel:%d opclass:%d", *channel, *opclass);
@@ -531,11 +578,13 @@ void tdls_extract_peer_state_param(struct tdls_peer_update_state *peer_param,
peer_param->peer_cap.peer_curr_operclass = 0; peer_param->peer_cap.peer_curr_operclass = 0;
peer_param->peer_cap.self_curr_operclass = peer_param->peer_cap.self_curr_operclass =
peer->op_class_for_pref_off_chan; peer->op_class_for_pref_off_chan;
peer_param->peer_cap.pref_off_channum = peer->pref_off_chan_num; peer_param->peer_cap.pref_off_channum = wlan_reg_freq_to_chan(pdev,
peer->pref_off_chan_freq);
peer_param->peer_cap.pref_off_chan_bandwidth = peer_param->peer_cap.pref_off_chan_bandwidth =
peer->pref_off_chan_width; peer->pref_off_chan_width;
peer_param->peer_cap.opclass_for_prefoffchan = peer_param->peer_cap.opclass_for_prefoffchan =
peer->op_class_for_pref_off_chan; peer->op_class_for_pref_off_chan;
peer_param->peer_cap.pref_offchan_freq = peer->pref_off_chan_freq;
if (QDF_STATUS_SUCCESS != ucfg_reg_get_band(pdev, &cur_band)) { if (QDF_STATUS_SUCCESS != ucfg_reg_get_band(pdev, &cur_band)) {
tdls_err("not able get the current frequency band"); tdls_err("not able get the current frequency band");
@@ -546,16 +595,22 @@ void tdls_extract_peer_state_param(struct tdls_peer_update_state *peer_param,
tdls_err("sending the offchannel value as 0 as only 2g is supported"); tdls_err("sending the offchannel value as 0 as only 2g is supported");
peer_param->peer_cap.pref_off_channum = 0; peer_param->peer_cap.pref_off_channum = 0;
peer_param->peer_cap.opclass_for_prefoffchan = 0; peer_param->peer_cap.opclass_for_prefoffchan = 0;
peer_param->peer_cap.pref_offchan_freq = 0;
} }
ch_freq = wlan_reg_legacy_chan_to_freq(pdev, ch_freq = peer->pref_off_chan_freq;
peer_param->peer_cap.pref_off_channum);
if (wlan_reg_is_dfs_for_freq(pdev, ch_freq)) { if (wlan_reg_is_dfs_for_freq(pdev, ch_freq)) {
/*
* If pref_off_chan_freq is DFS frequency, that means it is 5Ghz
* case. So, reset to default 5 GHz frequency
*/
tdls_err("Resetting TDLS off-channel from %d to %d", tdls_err("Resetting TDLS off-channel from %d to %d",
peer_param->peer_cap.pref_off_channum, peer_param->peer_cap.pref_off_channum,
WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF); WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF);
peer_param->peer_cap.pref_off_channum = peer_param->peer_cap.pref_off_channum =
WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF; WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF;
peer_param->peer_cap.pref_offchan_freq =
WLAN_TDLS_PREFERRED_OFF_CHANNEL_FRQ_DEF;
} }
num = 0; num = 0;
@@ -862,7 +917,7 @@ QDF_STATUS tdls_set_callback(struct tdls_peer *peer,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS tdls_set_extctrl_param(struct tdls_peer *peer, uint32_t chan, QDF_STATUS tdls_set_extctrl_param(struct tdls_peer *peer, qdf_freq_t ch_freq,
uint32_t max_latency, uint32_t op_class, uint32_t max_latency, uint32_t op_class,
uint32_t min_bandwidth) uint32_t min_bandwidth)
{ {
@@ -871,7 +926,7 @@ QDF_STATUS tdls_set_extctrl_param(struct tdls_peer *peer, uint32_t chan,
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
peer->op_class_for_pref_off_chan = (uint8_t)op_class; peer->op_class_for_pref_off_chan = (uint8_t)op_class;
peer->pref_off_chan_num = (uint8_t)chan; peer->pref_off_chan_freq = ch_freq;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -898,11 +953,11 @@ QDF_STATUS tdls_reset_peer(struct tdls_vdev_priv_obj *vdev_obj,
if (!curr_peer->is_forced_peer) { if (!curr_peer->is_forced_peer) {
config = &soc_obj->tdls_configs; config = &soc_obj->tdls_configs;
tdls_fill_pref_off_chan_num(vdev_obj, soc_obj, curr_peer); tdls_fill_pref_off_chan_info(vdev_obj, soc_obj, curr_peer);
curr_peer->op_class_for_pref_off_chan = curr_peer->op_class_for_pref_off_chan =
tdls_get_opclass_from_bandwidth( tdls_get_opclass_from_bandwidth(
soc_obj, curr_peer->pref_off_chan_num, vdev_obj->vdev, curr_peer->pref_off_chan_freq,
soc_obj->tdls_configs.tdls_pre_off_chan_bw, curr_peer->pref_off_chan_width,
&reg_bw_offset); &reg_bw_offset);
} }

View File

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -122,6 +123,32 @@ tdls_find_first_connected_peer(struct tdls_vdev_priv_obj *vdev_obj);
struct tdls_peer *tdls_is_progress(struct tdls_vdev_priv_obj *vdev_obj, struct tdls_peer *tdls_is_progress(struct tdls_vdev_priv_obj *vdev_obj,
const uint8_t *macaddr, uint8_t skip_self); const uint8_t *macaddr, uint8_t skip_self);
/**
* tdls_get_offchan_freq() - Get preffered offchannel frequency
* @vdev: Pointer to vdev
* @soc_obj: TDLS SOC object
*
* This function gets preffered offchannel frequency.
*
* Return: Preferred offchannel frequency
*/
qdf_freq_t tdls_get_offchan_freq(struct wlan_objmgr_vdev *vdev,
struct tdls_soc_priv_obj *soc_obj);
/**
* tdls_get_offchan_freq() - Get preffered offchannel bandwidth on basis of
* frequency
* @soc_obj: TDLS SOC object
* @off_chan_freq: Offchannel frequency
*
*
* This function gets preffered offchannel bandwidth on basis of frequency.
*
* Return: Preferred offchannel bw
*/
uint32_t tdls_get_offchan_bw(struct tdls_soc_priv_obj *soc_obj,
qdf_freq_t off_chan_freq);
/** /**
* tdls_extract_peer_state_param() - extract peer update params from TDL peer * tdls_extract_peer_state_param() - extract peer update params from TDL peer
* @peer_param: output peer update params * @peer_param: output peer update params
@@ -200,7 +227,7 @@ QDF_STATUS tdls_set_callback(struct tdls_peer *peer,
/** /**
* tdls_set_extctrl_param() - set external control parameter on TDLS peer * tdls_set_extctrl_param() - set external control parameter on TDLS peer
* @peer: TDLS peer * @peer: TDLS peer
* @chan: channel * @ch_freq: channel frequency
* @max_latency: maximum latency * @max_latency: maximum latency
* @op_class: operation class * @op_class: operation class
* @min_bandwidth: minimal bandwidth * @min_bandwidth: minimal bandwidth
@@ -209,7 +236,7 @@ QDF_STATUS tdls_set_callback(struct tdls_peer *peer,
* *
* Return: QDF_STATUS_SUCCESS if success; other values if failed * Return: QDF_STATUS_SUCCESS if success; other values if failed
*/ */
QDF_STATUS tdls_set_extctrl_param(struct tdls_peer *peer, uint32_t chan, QDF_STATUS tdls_set_extctrl_param(struct tdls_peer *peer, qdf_freq_t ch_freq,
uint32_t max_latency, uint32_t op_class, uint32_t max_latency, uint32_t op_class,
uint32_t min_bandwidth); uint32_t min_bandwidth);

View File

@@ -50,6 +50,8 @@
#define WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_MIN 1 #define WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_MIN 1
#define WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_MAX 165 #define WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_MAX 165
#define WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF 36 #define WLAN_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEF 36
#define WLAN_TDLS_PREFERRED_OFF_CHANNEL_FRQ_DEF 5180
#define AC_PRIORITY_NUM 4 #define AC_PRIORITY_NUM 4
@@ -847,6 +849,7 @@ struct tdls_oper_request {
* @vdev: vdev object * @vdev: vdev object
* @peer_addr: MAC address of the TDLS peer * @peer_addr: MAC address of the TDLS peer
* @chan: channel * @chan: channel
* @ch_freq: ch_freq
* @max_latency: maximum latency * @max_latency: maximum latency
* @op_class: operation class * @op_class: operation class
* @min_bandwidth: minimal bandwidth * @min_bandwidth: minimal bandwidth
@@ -856,6 +859,7 @@ struct tdls_oper_config_force_peer_request {
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
uint8_t peer_addr[QDF_MAC_ADDR_SIZE]; uint8_t peer_addr[QDF_MAC_ADDR_SIZE];
uint32_t chan; uint32_t chan;
qdf_freq_t ch_freq;
uint32_t max_latency; uint32_t max_latency;
uint32_t op_class; uint32_t op_class;
uint32_t min_bandwidth; uint32_t min_bandwidth;