qcacld-3.0: Update HDD for using channel frequency for STA connection

Due to channel number ambiguity with 6ghz, update channel references
in HDD STA connection path to use channel frequency.

Change-Id: I81f3449c9087030e4d98c17a5b12c731f99b39ab
CRs-fixed: 2552009
This commit is contained in:
Manikandan Mohan
2019-10-23 15:45:35 -07:00
committed by nshrivas
szülő 9328e053f2
commit 5c1e9aeb3d
6 fájl változott, egészen pontosan 69 új sor hozzáadva és 75 régi sor törölve

Fájl megtekintése

@@ -441,7 +441,7 @@ QDF_STATUS hdd_roam_deregister_sta(struct hdd_adapter *adapter,
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS
hdd_wma_send_fastreassoc_cmd(struct hdd_adapter *adapter,
const tSirMacAddr bssid, int channel);
const tSirMacAddr bssid, uint32_t ch_freq);
/**
* hdd_save_gtk_params() - Save GTK offload params
* @adapter: HDD adapter
@@ -455,7 +455,7 @@ void hdd_save_gtk_params(struct hdd_adapter *adapter,
#else
static inline QDF_STATUS
hdd_wma_send_fastreassoc_cmd(struct hdd_adapter *adapter,
const tSirMacAddr bssid, int channel)
const tSirMacAddr bssid, uint32_t ch_freq)
{
return QDF_STATUS_SUCCESS;
}

Fájl megtekintése

@@ -2906,8 +2906,20 @@ QDF_STATUS hdd_sme_open_session_callback(uint8_t vdev_id,
QDF_STATUS qdf_status);
QDF_STATUS hdd_sme_close_session_callback(uint8_t vdev_id);
/**
* hdd_reassoc() - perform a userspace-directed reassoc
* @adapter: Adapter upon which the command was received
* @bssid: BSSID with which to reassociate
* @ch_freq: channel upon which to reassociate
* @src: The source for the trigger of this action
*
* This function performs a userspace-directed reassoc operation
*
* Return: 0 for success non-zero for failure
*/
int hdd_reassoc(struct hdd_adapter *adapter, const uint8_t *bssid,
uint8_t channel, const handoff_src src);
uint32_t ch_freq, const handoff_src src);
int hdd_register_cb(struct hdd_context *hdd_ctx);
void hdd_deregister_cb(struct hdd_context *hdd_ctx);
int hdd_start_station_adapter(struct hdd_adapter *adapter);

Fájl megtekintése

@@ -17559,32 +17559,31 @@ void hdd_mon_select_cbmode(struct hdd_adapter *adapter,
*
* Return: none
*/
void hdd_select_cbmode(struct hdd_adapter *adapter, uint8_t op_chan,
void hdd_select_cbmode(struct hdd_adapter *adapter, uint32_t oper_freq,
struct ch_params *ch_params)
{
uint8_t sec_ch = 0;
uint32_t sec_ch_freq = 0;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
struct hdd_station_ctx *station_ctx =
WLAN_HDD_GET_STATION_CTX_PTR(adapter);
eConnectionState connstate;
bool cbmode_select = false;
uint32_t op_freq = wlan_reg_chan_to_freq(hdd_ctx->pdev, op_chan);
/*
* CDS api expects secondary channel for calculating
* the channel params
*/
if ((ch_params->ch_width == CH_WIDTH_40MHZ) &&
(WLAN_REG_IS_24GHZ_CH(op_chan))) {
if (op_chan >= 1 && op_chan <= 5)
sec_ch = op_chan + 4;
else if (op_chan >= 6 && op_chan <= 13)
sec_ch = op_chan - 4;
(WLAN_REG_IS_24GHZ_CH_FREQ(oper_freq))) {
if (oper_freq >= 2412 && oper_freq <= 2432)
sec_ch_freq = oper_freq + 20;
else if (oper_freq >= 2437 && oper_freq <= 2472)
sec_ch_freq = oper_freq - 20;
}
/* This call decides required channel bonding mode */
wlan_reg_set_channel_params(hdd_ctx->pdev, op_chan,
sec_ch, ch_params);
wlan_reg_set_channel_params_for_freq(hdd_ctx->pdev, oper_freq,
sec_ch_freq, ch_params);
if (adapter->device_mode == QDF_STA_MODE &&
ucfg_mlme_is_change_channel_bandwidth_enabled(hdd_ctx->psoc)) {
@@ -17596,7 +17595,7 @@ void hdd_select_cbmode(struct hdd_adapter *adapter, uint8_t op_chan,
}
if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE || cbmode_select)
hdd_mon_select_cbmode(adapter, op_freq, ch_params);
hdd_mon_select_cbmode(adapter, oper_freq, ch_params);
}
/**
@@ -17771,7 +17770,7 @@ int wlan_hdd_cfg80211_check_pmf_valid(struct csr_roam_profile *roam_profile)
static int wlan_hdd_cfg80211_connect_start(struct hdd_adapter *adapter,
const u8 *ssid, size_t ssid_len,
const u8 *bssid, const u8 *bssid_hint,
u8 operatingChannel,
uint32_t oper_freq,
enum nl80211_chan_width ch_width)
{
int status = 0;
@@ -17787,7 +17786,6 @@ static int wlan_hdd_cfg80211_connect_start(struct hdd_adapter *adapter,
uint8_t value = 0;
struct wlan_objmgr_vdev *vdev;
uint32_t channel_bonding_mode;
uint32_t oper_freq;
hdd_enter();
@@ -17914,11 +17912,9 @@ static int wlan_hdd_cfg80211_connect_start(struct hdd_adapter *adapter,
bssid_hint);
}
hdd_debug("vdevid %d: Connect to SSID: %.*s operating Channel: %u",
adapter->vdev_id,
hdd_debug("Connect to SSID: %.*s operating Ch freq: %u",
roam_profile->SSIDs.SSIDList->SSID.length,
roam_profile->SSIDs.SSIDList->SSID.ssId,
operatingChannel);
roam_profile->SSIDs.SSIDList->SSID.ssId, oper_freq);
if (hdd_sta_ctx->wpa_versions) {
hdd_set_genie_to_csr(adapter, &rsn_auth_type);
@@ -17971,17 +17967,14 @@ static int wlan_hdd_cfg80211_connect_start(struct hdd_adapter *adapter,
hdd_objmgr_put_vdev(vdev);
roam_profile->csrPersona = adapter->device_mode;
if (operatingChannel) {
oper_freq = wlan_reg_chan_to_freq(hdd_ctx->pdev,
operatingChannel);
if (oper_freq) {
roam_profile->ChannelInfo.freq_list = &oper_freq;
roam_profile->ChannelInfo.numOfChannels = 1;
} else {
roam_profile->ChannelInfo.freq_list = NULL;
roam_profile->ChannelInfo.numOfChannels = 0;
}
if ((QDF_IBSS_MODE == adapter->device_mode)
&& operatingChannel) {
if (QDF_IBSS_MODE == adapter->device_mode && oper_freq) {
/*
* Need to post the IBSS power save parameters
* to WMA. WMA will configure this parameters
@@ -18001,10 +17994,10 @@ static int wlan_hdd_cfg80211_connect_start(struct hdd_adapter *adapter,
* In IBSS mode while operating in 2.4 GHz,
* the device supports only 20 MHz.
*/
if (WLAN_REG_IS_24GHZ_CH(operatingChannel))
if (WLAN_REG_IS_24GHZ_CH_FREQ(oper_freq))
roam_profile->ch_params.ch_width =
CH_WIDTH_20MHZ;
hdd_select_cbmode(adapter, operatingChannel,
hdd_select_cbmode(adapter, oper_freq,
&roam_profile->ch_params);
}
@@ -20132,7 +20125,7 @@ static int wlan_hdd_reassoc_bssid_hint(struct hdd_adapter *adapter,
{
int status = -EINVAL;
const uint8_t *bssid = NULL;
uint16_t channel = 0;
uint32_t ch_freq = 0;
struct hdd_station_ctx *sta_ctx;
if (req->bssid)
@@ -20141,13 +20134,13 @@ static int wlan_hdd_reassoc_bssid_hint(struct hdd_adapter *adapter,
bssid = req->bssid_hint;
if (req->channel)
channel = req->channel->hw_value;
ch_freq = req->channel->center_freq;
else if (req->channel_hint)
channel = req->channel_hint->hw_value;
ch_freq = req->channel_hint->center_freq;
if (bssid && channel && req->prev_bssid) {
hdd_debug("REASSOC Attempt on channel %d to " QDF_MAC_ADDR_STR,
channel, QDF_MAC_ADDR_ARRAY(bssid));
if (bssid && ch_freq && req->prev_bssid) {
hdd_debug("REASSOC Attempt on ch freq %d to " QDF_MAC_ADDR_STR,
ch_freq, QDF_MAC_ADDR_ARRAY(bssid));
/*
* Save BSSID in a separate variable as
* roam_profile's BSSID is getting zeroed out in the
@@ -20158,8 +20151,8 @@ static int wlan_hdd_reassoc_bssid_hint(struct hdd_adapter *adapter,
qdf_mem_copy(sta_ctx->requested_bssid.bytes, bssid,
QDF_MAC_ADDR_SIZE);
status = hdd_reassoc(adapter, bssid, channel,
CONNECT_CMD_USERSPACE);
status = hdd_reassoc(adapter, bssid, ch_freq,
CONNECT_CMD_USERSPACE);
hdd_debug("hdd_reassoc: status: %d", status);
}
return status;
@@ -20239,7 +20232,7 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
struct cfg80211_connect_params *req)
{
int status;
u16 channel, sap_cnt, sta_cnt;
uint32_t ch_freq, sap_cnt, sta_cnt;
const u8 *bssid = NULL;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))
const u8 *bssid_hint = req->bssid_hint;
@@ -20370,12 +20363,12 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
if (req->channel) {
bool ok = false;
if (req->channel->hw_value && policy_mgr_is_chan_ok_for_dnbs(
if (req->channel->center_freq && policy_mgr_is_chan_ok_for_dnbs(
hdd_ctx->psoc,
req->channel->center_freq,
&ok)) {
hdd_warn("Unable to get channel:%d eligibility for DNBS",
req->channel->hw_value);
hdd_warn("Unable to get ch freq:%d eligibility for DNBS",
req->channel->center_freq);
return -EINVAL;
}
/**
@@ -20383,13 +20376,12 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
* blacklist us.
*/
if (!ok) {
struct ieee80211_channel *chan =
ieee80211_get_channel(wiphy,
wlan_chan_to_freq(req->channel->hw_value));
struct ieee80211_channel *chan = ieee80211_get_channel(
wiphy, req->channel->center_freq);
struct cfg80211_bss *bss;
hdd_warn("Channel:%d not OK for DNBS",
req->channel->hw_value);
hdd_warn("Ch freq:%d not OK for DNBS",
req->channel->center_freq);
if (chan) {
bss = wlan_cfg80211_get_bss(wiphy, chan,
req->bssid,
@@ -20422,15 +20414,15 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
}
if (req->channel)
channel = req->channel->hw_value;
ch_freq = req->channel->center_freq;
else
channel = 0;
ch_freq = 0;
wlan_hdd_check_ht20_ht40_ind(hdd_ctx, adapter, req);
status = wlan_hdd_cfg80211_connect_start(adapter, req->ssid,
req->ssid_len, req->bssid,
bssid_hint, channel, 0);
bssid_hint, ch_freq, 0);
if (0 > status)
hdd_err("connect failed");
@@ -22777,7 +22769,8 @@ static int __wlan_hdd_cfg80211_set_mon_ch(struct wiphy *wiphy,
roam_profile.ChannelInfo.numOfChannels = 1;
roam_profile.phyMode = ch_info->phy_mode;
roam_profile.ch_params.ch_width = hdd_map_nl_chan_width(chandef->width);
hdd_select_cbmode(adapter, chan_num, &roam_profile.ch_params);
hdd_select_cbmode(adapter, chandef->chan->center_freq,
&roam_profile.ch_params);
qdf_mem_copy(bssid.bytes, adapter->mac_addr.bytes,
QDF_MAC_ADDR_SIZE);

Fájl megtekintése

@@ -318,7 +318,7 @@ void hdd_reg_notifier(struct wiphy *wiphy,
QDF_STATUS wlan_hdd_validate_operation_channel(struct hdd_adapter *adapter,
uint32_t ch_freq);
void hdd_select_cbmode(struct hdd_adapter *adapter, uint8_t op_chan,
void hdd_select_cbmode(struct hdd_adapter *adapter, uint32_t oper_freq,
struct ch_params *ch_params);
/**

Fájl megtekintése

@@ -1297,7 +1297,7 @@ static int hdd_parse_reassoc_command_v1_data(const uint8_t *command,
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS hdd_wma_send_fastreassoc_cmd(struct hdd_adapter *adapter,
const tSirMacAddr bssid,
int channel)
uint32_t ch_freq)
{
struct hdd_station_ctx *hdd_sta_ctx =
WLAN_HDD_GET_STATION_CTX_PTR(adapter);
@@ -1308,24 +1308,13 @@ QDF_STATUS hdd_wma_send_fastreassoc_cmd(struct hdd_adapter *adapter,
qdf_mem_copy(connected_bssid, hdd_sta_ctx->conn_info.bssid.bytes,
ETH_ALEN);
return sme_fast_reassoc(adapter->hdd_ctx->mac_handle,
roam_profile, bssid, channel,
roam_profile, bssid, ch_freq,
adapter->vdev_id, connected_bssid);
}
#endif
/**
* hdd_reassoc() - perform a userspace-directed reassoc
* @adapter: Adapter upon which the command was received
* @bssid: BSSID with which to reassociate
* @channel: channel upon which to reassociate
* @src: The source for the trigger of this action
*
* This function performs a userspace-directed reassoc operation
*
* Return: 0 for success non-zero for failure
*/
int hdd_reassoc(struct hdd_adapter *adapter, const uint8_t *bssid,
uint8_t channel, const handoff_src src)
uint32_t ch_freq, const handoff_src src)
{
struct hdd_station_ctx *sta_ctx;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
@@ -1368,24 +1357,21 @@ int hdd_reassoc(struct hdd_adapter *adapter, const uint8_t *bssid,
* use the current connections's channel.
*/
if (!memcmp(bssid, sta_ctx->conn_info.bssid.bytes,
QDF_MAC_ADDR_SIZE)) {
QDF_MAC_ADDR_SIZE)) {
hdd_warn("Reassoc BSSID is same as currently associated AP bssid");
channel = wlan_reg_freq_to_chan(hdd_ctx->pdev,
sta_ctx->conn_info.chan_freq);
ch_freq = sta_ctx->conn_info.chan_freq;
}
/* Check channel number is a valid channel number */
if (QDF_STATUS_SUCCESS !=
wlan_hdd_validate_operation_channel(adapter, channel)) {
hdd_err("Invalid Channel: %d", channel);
wlan_hdd_validate_operation_channel(adapter, ch_freq)) {
hdd_err("Invalid Ch freq: %d", ch_freq);
ret = -EINVAL;
goto exit;
}
/* Proceed with reassoc */
if (roaming_offload_enabled(hdd_ctx)) {
status = hdd_wma_send_fastreassoc_cmd(adapter,
bssid, (int)channel);
status = hdd_wma_send_fastreassoc_cmd(adapter, bssid, ch_freq);
if (status != QDF_STATUS_SUCCESS) {
hdd_err("Failed to send fast reassoc cmd");
ret = -EINVAL;
@@ -1393,7 +1379,7 @@ int hdd_reassoc(struct hdd_adapter *adapter, const uint8_t *bssid,
} else {
tCsrHandoffRequest handoff;
handoff.ch_freq = wlan_reg_chan_to_freq(hdd_ctx->pdev, channel);
handoff.ch_freq = ch_freq;
handoff.src = src;
qdf_mem_copy(handoff.bssid.bytes, bssid, QDF_MAC_ADDR_SIZE);
sme_handoff_request(hdd_ctx->mac_handle, adapter->vdev_id,
@@ -1430,7 +1416,8 @@ static int hdd_parse_reassoc_v1(struct hdd_adapter *adapter, const char *command
if (ret)
hdd_err("Failed to parse reassoc command data");
else
ret = hdd_reassoc(adapter, bssid, channel, REASSOC);
ret = hdd_reassoc(adapter, bssid,
wlan_chan_to_freq(channel), REASSOC);
return ret;
}
@@ -1468,7 +1455,8 @@ static int hdd_parse_reassoc_v2(struct hdd_adapter *adapter,
hdd_err("MAC address parsing failed");
ret = -EINVAL;
} else {
ret = hdd_reassoc(adapter, bssid, params.channel, REASSOC);
ret = hdd_reassoc(adapter, bssid,
wlan_chan_to_freq(params.channel), REASSOC);
}
return ret;
}

Fájl megtekintése

@@ -6892,7 +6892,8 @@ int wlan_hdd_set_mon_chan(struct hdd_adapter *adapter, uint32_t chan,
roam_profile.ChannelInfo.numOfChannels = 1;
roam_profile.phyMode = ch_info->phy_mode;
roam_profile.ch_params.ch_width = bandwidth;
hdd_select_cbmode(adapter, chan, &roam_profile.ch_params);
hdd_select_cbmode(adapter, wlan_chan_to_freq(chan),
&roam_profile.ch_params);
if (ucfg_mlme_is_change_channel_bandwidth_enabled(hdd_ctx->psoc) &&
(!sme_find_session_by_bssid(mac_handle, adapter->mac_addr.bytes))) {
status = sme_create_mon_session(mac_handle,