Browse Source

qcacld-3.0: Add policy mgr changes to support NDI concurrencies

If Firmware supports NDI DBS mode, driver can support NDI
concurrency along with NAN and STA type connecitons. Use
Policy Manager API's to add support for these concurrencies.

Add policy mgr related changes to support NDI concurrencies.

Change-Id: If272be34606c0897d0b145c602b4bc2ba4462cb0
CRs-Fixed: 2384549
Nachiket Kukade 6 years ago
parent
commit
58159102ce

+ 38 - 0
cmn_services/policy_mgr/src/wlan_policy_mgr_core.c

@@ -990,6 +990,9 @@ static uint32_t policy_mgr_dump_current_concurrency_one_connection(
 	case PM_NAN_DISC_MODE:
 		count = strlcat(cc_mode, "NAN DISC", length);
 		break;
+	case PM_NDI_MODE:
+		count = strlcat(cc_mode, "NDI", length);
+		break;
 	default:
 		policy_mgr_err("unexpected mode %d", mode);
 		break;
@@ -1047,6 +1050,12 @@ static uint32_t policy_mgr_dump_current_concurrency_two_connection(
 		count += strlcat(cc_mode, "+IBSS",
 					length);
 		break;
+	case PM_NDI_MODE:
+		count = policy_mgr_dump_current_concurrency_one_connection(
+				cc_mode, length);
+		count += strlcat(cc_mode, "+NDI",
+					length);
+		break;
 	default:
 		policy_mgr_err("unexpected mode %d", mode);
 		break;
@@ -1104,6 +1113,18 @@ static uint32_t policy_mgr_dump_current_concurrency_three_connection(
 		count += strlcat(cc_mode, "+IBSS",
 					length);
 		break;
+	case PM_NAN_DISC_MODE:
+		count = policy_mgr_dump_current_concurrency_two_connection(
+				cc_mode, length);
+		count += strlcat(cc_mode, "+NAN Disc",
+					length);
+		break;
+	case PM_NDI_MODE:
+		count = policy_mgr_dump_current_concurrency_two_connection(
+				cc_mode, length);
+		count += strlcat(cc_mode, "+NDI",
+					length);
+		break;
 	default:
 		policy_mgr_err("unexpected mode %d", mode);
 		break;
@@ -1486,6 +1507,8 @@ enum policy_mgr_con_mode policy_mgr_get_mode(uint8_t type,
 		mode = PM_IBSS_MODE;
 	} else if (type == WMI_VDEV_TYPE_NAN) {
 		mode = PM_NAN_DISC_MODE;
+	} else if (type == WMI_VDEV_TYPE_NDI) {
+		mode = PM_NDI_MODE;
 	} else {
 		policy_mgr_err("Unknown type %d", type);
 	}
@@ -2432,6 +2455,21 @@ bool policy_mgr_allow_new_home_channel(struct wlan_objmgr_psoc *psoc,
 					policy_mgr_err("don't allow 3rd home channel on same MAC");
 					status = false;
 				}
+			} else if ((pm_conc_connection_list[0].mode ==
+							    PM_NAN_DISC_MODE &&
+				    pm_conc_connection_list[1].mode ==
+								PM_NDI_MODE) ||
+				   (pm_conc_connection_list[0].mode ==
+								PM_NDI_MODE &&
+				    pm_conc_connection_list[1].mode ==
+							    PM_NAN_DISC_MODE)) {
+				/*
+				 * NAN + NDI are managed in Firmware by dividing
+				 * up slots. Connection on NDI is re-negotiable
+				 * and therefore a 3rd connection with the
+				 * same MAC is possible.
+				 */
+				status = true;
 			} else if (((WLAN_REG_IS_24GHZ_CH(channel)) &&
 				(WLAN_REG_IS_24GHZ_CH
 				(pm_conc_connection_list[0].chan)) &&

+ 9 - 0
cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -1767,6 +1767,9 @@ bool policy_mgr_map_concurrency_mode(enum QDF_OPMODE *old_mode,
 	case QDF_NAN_DISC_MODE:
 		*new_mode = PM_NAN_DISC_MODE;
 		break;
+	case QDF_NDI_MODE:
+		*new_mode = PM_NDI_MODE;
+		break;
 	default:
 		*new_mode = PM_MAX_NUM_OF_MODE;
 		status = false;
@@ -2486,6 +2489,9 @@ enum policy_mgr_con_mode policy_mgr_convert_device_mode_to_qdf_type(
 	case QDF_NAN_DISC_MODE:
 		mode = PM_NAN_DISC_MODE;
 		break;
+	case QDF_NDI_MODE:
+		mode = PM_NDI_MODE;
+		break;
 	default:
 		policy_mgr_debug("Unsupported mode (%d)",
 				 device_mode);
@@ -2518,6 +2524,9 @@ enum QDF_OPMODE policy_mgr_get_qdf_mode_from_pm(
 	case PM_NAN_DISC_MODE:
 		mode = QDF_NAN_DISC_MODE;
 		break;
+	case PM_NDI_MODE:
+		mode = QDF_NDI_MODE;
+		break;
 	default:
 		policy_mgr_debug("Unsupported policy mgr mode (%d)",
 				 device_mode);

+ 74 - 0
cmn_services/policy_mgr/src/wlan_policy_mgr_pcl.c

@@ -1324,6 +1324,68 @@ static enum policy_mgr_two_connection_mode
 	return index;
 }
 
+static enum policy_mgr_two_connection_mode
+		policy_mgr_get_third_connection_pcl_table_index_nan_ndi(void)
+{
+	enum policy_mgr_two_connection_mode index = PM_MAX_TWO_CONNECTION_MODE;
+	/* SCC */
+	if (pm_conc_connection_list[0].chan ==
+		pm_conc_connection_list[1].chan) {
+		/* NAN Discovery can only be on 2.4GHz */
+		if (POLICY_MGR_ONE_ONE == pm_conc_connection_list[0].chain_mask)
+			index = PM_NAN_DISC_NDI_SCC_24_1x1;
+		else
+			index = PM_NAN_DISC_NDI_SCC_24_2x2;
+	/* MCC */
+	} else if (pm_conc_connection_list[0].mac ==
+		pm_conc_connection_list[1].mac) {
+		/* NAN Discovery can only be on 2.4GHz */
+		if (POLICY_MGR_ONE_ONE == pm_conc_connection_list[0].chain_mask)
+			index = PM_NAN_DISC_NDI_MCC_24_1x1;
+		else
+			index = PM_NAN_DISC_NDI_MCC_24_2x2;
+	/* DBS */
+	} else if (pm_conc_connection_list[0].mac !=
+			pm_conc_connection_list[1].mac) {
+		if (POLICY_MGR_ONE_ONE == pm_conc_connection_list[0].chain_mask)
+			index = PM_NAN_DISC_NDI_DBS_1x1;
+		else
+			index = PM_NAN_DISC_NDI_DBS_2x2;
+	}
+	return index;
+}
+
+static enum policy_mgr_two_connection_mode
+		policy_mgr_get_third_connection_pcl_table_index_sta_nan(void)
+{
+	enum policy_mgr_two_connection_mode index = PM_MAX_TWO_CONNECTION_MODE;
+	/* SCC */
+	if (pm_conc_connection_list[0].chan ==
+		pm_conc_connection_list[1].chan) {
+		/* NAN Discovery can only be on 2.4GHz */
+		if (POLICY_MGR_ONE_ONE == pm_conc_connection_list[0].chain_mask)
+			index = PM_STA_NAN_DISC_SCC_24_1x1;
+		else
+			index = PM_STA_NAN_DISC_SCC_24_2x2;
+	/* MCC */
+	} else if (pm_conc_connection_list[0].mac ==
+		pm_conc_connection_list[1].mac) {
+		/* NAN Discovery can only be on 2.4GHz */
+		if (POLICY_MGR_ONE_ONE == pm_conc_connection_list[0].chain_mask)
+			index = PM_STA_NAN_DISC_MCC_24_1x1;
+		else
+			index = PM_STA_NAN_DISC_MCC_24_2x2;
+	/* DBS */
+	} else if (pm_conc_connection_list[0].mac !=
+			pm_conc_connection_list[1].mac) {
+		if (POLICY_MGR_ONE_ONE == pm_conc_connection_list[0].chain_mask)
+			index = PM_STA_NAN_DISC_DBS_1x1;
+		else
+			index = PM_STA_NAN_DISC_DBS_2x2;
+	}
+	return index;
+}
+
 enum policy_mgr_two_connection_mode
 		policy_mgr_get_third_connection_pcl_table_index(
 		struct wlan_objmgr_psoc *psoc)
@@ -1384,6 +1446,18 @@ enum policy_mgr_two_connection_mode
 		(PM_STA_MODE == pm_conc_connection_list[1].mode)))
 		index =
 		policy_mgr_get_third_connection_pcl_table_index_sta_sta();
+	else if (((PM_NAN_DISC_MODE == pm_conc_connection_list[0].mode) &&
+		(PM_STA_MODE == pm_conc_connection_list[1].mode)) ||
+		((PM_STA_MODE == pm_conc_connection_list[0].mode) &&
+		(PM_NAN_DISC_MODE == pm_conc_connection_list[1].mode)))
+		index =
+		policy_mgr_get_third_connection_pcl_table_index_sta_nan();
+	else if (((PM_NAN_DISC_MODE == pm_conc_connection_list[0].mode) &&
+		(PM_NDI_MODE == pm_conc_connection_list[1].mode)) ||
+		((PM_NDI_MODE == pm_conc_connection_list[0].mode) &&
+		(PM_NAN_DISC_MODE == pm_conc_connection_list[1].mode)))
+		index =
+		policy_mgr_get_third_connection_pcl_table_index_nan_ndi();
 
 	policy_mgr_debug("mode0:%d mode1:%d chan0:%d chan1:%d chain:%d index:%d",
 		pm_conc_connection_list[0].mode,

+ 33 - 8
nan/core/src/nan_main.c

@@ -431,16 +431,18 @@ ndi_remove_and_update_primary_connection(struct wlan_objmgr_psoc *psoc,
 	}
 
 	if (!peer && psoc_nan_obj->nan_caps.ndi_dbs_supported) {
-		/* TODO: Remove connection from policy manager tables */
+		policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE,
+						wlan_vdev_get_id(vdev));
 		return QDF_STATUS_SUCCESS;
 	}
 
 	if (peer_nan_obj && psoc_nan_obj->nan_caps.ndi_dbs_supported) {
 		psoc_nan_obj->cb_obj.update_ndi_conn(wlan_vdev_get_id(vdev),
 						 &peer_nan_obj->home_chan_info);
-		/* TODO: Update policy mgr with connection info */
+		policy_mgr_update_connection_info(psoc, wlan_vdev_get_id(vdev));
 		qdf_mem_copy(vdev_nan_obj->primary_peer_mac.bytes,
 			     wlan_peer_get_macaddr(peer), QDF_MAC_ADDR_SIZE);
+		policy_mgr_check_n_start_opportunistic_timer(psoc);
 	}
 
 	wlan_objmgr_peer_release_ref(peer, WLAN_NAN_ID);
@@ -506,10 +508,11 @@ ndi_update_ndp_session(struct wlan_objmgr_vdev *vdev,
 static QDF_STATUS nan_handle_confirm(
 				struct nan_datapath_confirm_event *confirm)
 {
-	uint8_t vdev_id;
+	uint8_t vdev_id, channel;
 	struct wlan_objmgr_psoc *psoc;
 	struct nan_psoc_priv_obj *psoc_nan_obj;
 	struct nan_vdev_priv_obj *vdev_nan_obj;
+	QDF_STATUS status;
 
 	vdev_id = wlan_vdev_get_id(confirm->vdev);
 	psoc = wlan_vdev_get_psoc(confirm->vdev);
@@ -564,11 +567,33 @@ static QDF_STATUS nan_handle_confirm(
 		psoc_nan_obj->cb_obj.update_ndi_conn(vdev_id, &confirm->ch[0]);
 
 		if (psoc_nan_obj->nan_caps.ndi_dbs_supported) {
-			/*
-			* TODO: Update connection in Policy Manager if NDI
-			* concurrencies are supported and this is the first
-			* active NDP for the NDI.
-			*/
+			channel = wlan_freq_to_chan(confirm->ch[0].freq);
+			status = policy_mgr_reset_connection_update(psoc);
+			if (!QDF_IS_STATUS_SUCCESS(status)) {
+				nan_err("Policy mgr reset connection failed-%d",
+					status);
+				return status;
+			}
+
+			status = policy_mgr_current_connections_update(psoc,
+					   vdev_id, channel,
+					   POLICY_MGR_UPDATE_REASON_NDP_UPDATE);
+			if (QDF_STATUS_E_FAILURE == status) {
+				nan_err("connections update failed!!");
+				return status;
+			}
+
+			if (QDF_STATUS_SUCCESS == status) {
+				status = policy_mgr_wait_for_connection_update(
+									  psoc);
+				if (!QDF_IS_STATUS_SUCCESS(status)) {
+					nan_err("qdf wait for event failed!!");
+					return status;
+				}
+			}
+
+			policy_mgr_incr_active_session(psoc, QDF_NDI_MODE,
+						       vdev_id);
 		}
 	}