qcacmn: Get channel properly from conc_connection_list table

The channel information is obtained from the conc_connetion_list
table using the index equal to the session_id. But the session in
conc_connection_list table is not kept in the increasing order of
session_id. Thus, the wrong channel information can be obtained.

Thus, the fix is to obtain the channel information from the
conc_connection_list table corresponding to the index whose
vdev_id matches the session_id.

Change-Id: If289ea7c0567b892dba495b878540f9cb5df5668
CRs-Fixed: 2039474
This commit is contained in:
Nitesh Shah 2017-04-26 20:02:34 +05:30 • committed by snandini
commit b79fb55f0e
2 changed files with 55 additions and 4 deletions

View file

@ -1180,6 +1180,19 @@ bool policy_mgr_is_any_mode_active_on_band_along_with_session(
struct wlan_objmgr_psoc *psoc, uint8_t session_id,
enum policy_mgr_band band);
/**
* policy_mgr_get_chan_by_session_id() - Get channel for a given session ID
* @psoc: PSOC object information
* @session_id: Session ID
* @chan: Pointer to the channel
*
* Gets the channel for a given session ID
*
* Return: QDF_STATUS
*/
QDF_STATUS policy_mgr_get_chan_by_session_id(struct wlan_objmgr_psoc *psoc,
uint8_t session_id, uint8_t *chan);
/**
* policy_mgr_get_mac_id_by_session_id() - Get MAC ID for a given session ID
* @psoc: PSOC object information

View file

@ -2219,6 +2219,32 @@ send_status:
return status;
}
QDF_STATUS policy_mgr_get_chan_by_session_id(struct wlan_objmgr_psoc *psoc,
uint8_t session_id, uint8_t *chan)
{
uint32_t i;
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
for (i = 0; i < MAX_NUMBER_OF_CONC_CONNECTIONS; i++) {
if ((pm_conc_connection_list[i].vdev_id == session_id) &&
(pm_conc_connection_list[i].in_use)) {
*chan = pm_conc_connection_list[i].chan;
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
return QDF_STATUS_SUCCESS;
}
}
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS policy_mgr_get_mac_id_by_session_id(struct wlan_objmgr_psoc *psoc,
uint8_t session_id, uint8_t *mac_id)
{
@ -2250,7 +2276,8 @@ QDF_STATUS policy_mgr_get_mcc_session_id_on_mac(struct wlan_objmgr_psoc *psoc,
uint8_t *mcc_session_id)
{
uint32_t i;
uint8_t chan = pm_conc_connection_list[session_id].chan;
QDF_STATUS status;
uint8_t chan;
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
@ -2259,6 +2286,13 @@ QDF_STATUS policy_mgr_get_mcc_session_id_on_mac(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_E_FAILURE;
}
status = policy_mgr_get_chan_by_session_id(psoc, session_id, &chan);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("Failed to get channel for session id:%d",
session_id);
return QDF_STATUS_E_FAILURE;
}
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
for (i = 0; i < MAX_NUMBER_OF_CONC_CONNECTIONS; i++) {
if (pm_conc_connection_list[i].mac != mac_id)
@ -2305,9 +2339,13 @@ uint8_t policy_mgr_get_mcc_operating_channel(struct wlan_objmgr_psoc *psoc,
return INVALID_CHANNEL_ID;
}
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
chan = pm_conc_connection_list[mcc_session_id].chan;
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
status = policy_mgr_get_chan_by_session_id(psoc, mcc_session_id,
&chan);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("Failed to get channel for MCC session ID:%d",
mcc_session_id);
return INVALID_CHANNEL_ID;
}
return chan;
}