qcacld-3.0: Consider old peer phymode to set the new phymode

If peer phymode is not same as vdev phymode on channel switch the
peer phymode is updated with vdev phymode.

It should consider the prev peer phymode to calculate the new
phymode.

Change-Id: I33b57ad991a5899742e7aa4334089762cd325c59
CRs-Fixed: 2736158
This commit is contained in:
gaurank kathpalia 2020-07-20 14:38:44 +05:30 committed by snandini
parent eb5898e905
commit 9f7c94b95b

View File

@ -879,46 +879,8 @@ static void wma_handle_hidden_ssid_restart(tp_wma_handle wma,
0, NULL);
}
static void
wma_update_peer_phymode_sta(tp_wma_handle wma, struct wma_txrx_node *iface)
{
wmi_host_channel_width ch_width;
uint8_t vdev_id;
enum wlan_phymode bss_phymode;
uint32_t fw_phymode;
uint8_t *bssid;
struct wlan_channel *des_chan;
QDF_STATUS status;
vdev_id = wlan_vdev_get_id(iface->vdev);
/* for CSA case firmware expects phymode before ch_wd */
bssid = wma_get_vdev_bssid(iface->vdev);
if (!bssid) {
wma_err("Failed to get bssid for vdev_id %d", vdev_id);
return;
}
des_chan = wlan_vdev_mlme_get_des_chan(iface->vdev);
bss_phymode = des_chan->ch_phymode;
/* update new phymode to peer */
wma_objmgr_set_peer_mlme_phymode(wma, bssid, bss_phymode);
fw_phymode = wma_host_to_fw_phymode(bss_phymode);
/* for CSA case firmware expects phymode before ch_wd */
status = wma_set_peer_param(wma, bssid, WMI_PEER_PHYMODE, fw_phymode,
vdev_id);
ch_width = wmi_get_ch_width_from_phy_mode(wma->wmi_handle, fw_phymode);
status = wma_set_peer_param(wma, bssid, WMI_PEER_CHWIDTH, ch_width,
vdev_id);
wma_debug("vdev_id %d fw_phy_mode %d bss_phymode %d chanwidth %d",
vdev_id, fw_phymode, bss_phymode, ch_width);
}
static void wma_sap_peer_send_phymode(struct wlan_objmgr_vdev *vdev,
void *object, void *arg)
static void wma_peer_send_phymode(struct wlan_objmgr_vdev *vdev,
void *object, void *arg)
{
struct wlan_objmgr_peer *peer = object;
enum wlan_phymode old_peer_phymode;
@ -979,34 +941,6 @@ static void wma_sap_peer_send_phymode(struct wlan_objmgr_vdev *vdev,
max_ch_width_supported, QDF_MAC_ADDR_ARRAY(peer_mac_addr));
}
static void
wma_update_peer_phymode_sap(struct wlan_objmgr_vdev *vdev)
{
wlan_objmgr_iterate_peerobj_list(vdev,
wma_sap_peer_send_phymode,
NULL,
WLAN_LEGACY_WMA_ID);
}
/**
* wma_update_peer_phymode_after_vdev_restart() - Set new peer phymode after
* vdev restart according to previous phymode and new chan width.
*
* @wma: wma handle
* @iface: interfcae pointer
*
* Return: none
*/
static
void wma_update_peer_phymode_after_vdev_restart(tp_wma_handle wma,
struct wma_txrx_node *iface)
{
if (iface->type == WMI_VDEV_TYPE_AP)
wma_update_peer_phymode_sap(iface->vdev);
else if (iface->type == WMI_VDEV_TYPE_STA)
wma_update_peer_phymode_sta(wma, iface);
}
static
void wma_update_rate_flags_after_vdev_restart(tp_wma_handle wma,
struct wma_txrx_node *iface)
@ -1086,9 +1020,12 @@ QDF_STATUS wma_handle_channel_switch_resp(tp_wma_handle wma,
if (QDF_IS_STATUS_SUCCESS(rsp->status) &&
rsp->resp_type == WMI_VDEV_RESTART_RESP_EVENT) {
wma_update_peer_phymode_after_vdev_restart(wma, iface);
wlan_objmgr_iterate_peerobj_list(iface->vdev,
wma_peer_send_phymode, NULL,
WLAN_LEGACY_WMA_ID);
wma_update_rate_flags_after_vdev_restart(wma, iface);
}
if (wma_is_vdev_in_ap_mode(wma, rsp->vdev_id) ||
mlme_is_chan_switch_in_progress(iface->vdev))
event = WLAN_VDEV_SM_EV_RESTART_RESP;