qcacld-3.0: Check for max allowed STA vdevs in change interface API

In FW CFG_TGT_DEFAULT_MAX_STA_VDEVS considers total no of
STA and P2P-CLI vdevs. Check CFG_TGT_DEFAULT_MAX_STA_VDEVS
in change interface APIs for P2P CLI case.

Change-Id: I195d1cdda2d66f3187698254accf4bc3646d78c2
CRs-Fixed: 2701798
This commit is contained in:
Nirav Shah 2020-06-03 14:46:58 +05:30 • committed by nshrivas
commit 10c77d2379
3 changed files with 38 additions and 13 deletions

View file

@ -4466,4 +4466,13 @@ void hdd_init_start_completion(void);
*/
int hdd_update_phymode(struct hdd_adapter *adapter, eCsrPhyMode phymode,
enum band_info band, uint32_t chwidth);
/**
* hdd_max_sta_vdev_count_reached() - check sta vdev count
* @hdd_ctx: global hdd context
*
* Return: true if vdev limit reached
*/
bool hdd_max_sta_vdev_count_reached(struct hdd_context *hdd_ctx);
#endif /* end #if !defined(WLAN_HDD_MAIN_H) */

View file

@ -16603,6 +16603,13 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
qdf_opmode_str(adapter->device_mode),
qdf_opmode_str(new_mode));
if ((new_mode == QDF_STA_MODE || new_mode == QDF_P2P_CLIENT_MODE) &&
(adapter->device_mode != QDF_STA_MODE &&
adapter->device_mode != QDF_P2P_CLIENT_MODE)) {
if (hdd_max_sta_vdev_count_reached(adapter->hdd_ctx))
return -EINVAL;
}
errno = hdd_trigger_psoc_idle_restart(hdd_ctx);
if (errno) {
hdd_err("Failed to restart psoc; errno:%d", errno);

View file

@ -6044,6 +6044,27 @@ static u8 hdd_get_mode_specific_interface_count(struct hdd_context *hdd_ctx,
return intf_count;
}
bool hdd_max_sta_vdev_count_reached(struct hdd_context *hdd_ctx)
{
u8 intf_count;
/*
* Check for max no of supported STA/P2PCLI VDEVs before
* creating another one.
*/
intf_count = hdd_get_mode_specific_interface_count(hdd_ctx,
QDF_STA_MODE);
intf_count += hdd_get_mode_specific_interface_count(hdd_ctx,
QDF_P2P_CLIENT_MODE);
if (CFG_TGT_DEFAULT_MAX_STA_VDEVS &&
(intf_count >= CFG_TGT_DEFAULT_MAX_STA_VDEVS)) {
hdd_err("Max limit reached sta vdev-current %d max %d",
intf_count, CFG_TGT_DEFAULT_MAX_STA_VDEVS);
return true;
}
return false;
}
/**
* hdd_open_adapter() - open and setup the hdd adatper
* @hdd_ctx: global hdd context
@ -6066,7 +6087,6 @@ struct hdd_adapter *hdd_open_adapter(struct hdd_context *hdd_ctx, uint8_t sessio
{
struct net_device *ndev = NULL;
struct hdd_adapter *adapter = NULL;
u8 intf_count = 0;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
if (hdd_ctx->current_intf_count >= WLAN_MAX_VDEVS) {
@ -6116,19 +6136,8 @@ struct hdd_adapter *hdd_open_adapter(struct hdd_context *hdd_ctx, uint8_t sessio
/* fall through */
case QDF_P2P_CLIENT_MODE:
/* Check for max no of supported STA/P2PCLI VDEVs before
* creating another one.
*/
intf_count += hdd_get_mode_specific_interface_count(hdd_ctx,
QDF_STA_MODE);
intf_count += hdd_get_mode_specific_interface_count(hdd_ctx,
QDF_P2P_CLIENT_MODE);
if (CFG_TGT_DEFAULT_MAX_STA_VDEVS &&
(intf_count >= CFG_TGT_DEFAULT_MAX_STA_VDEVS)) {
hdd_err("Max limit reached sta vdev-current %d max %d",
intf_count, CFG_TGT_DEFAULT_MAX_STA_VDEVS);
if (hdd_max_sta_vdev_count_reached(hdd_ctx))
return NULL;
}
/* fall through */
case QDF_P2P_DEVICE_MODE: