Procházet zdrojové kódy

qcacmn: Define channel structure per vdev

Save BSS and desired channel information per vdev to access
it across all the modules.

Change-Id: I7729e0ae902643d0a2c61184b9ddc2babd07179e
CRs-Fixed: 2166359
Abhijit Pradhan před 7 roky
rodič
revize
3373194c4e

+ 47 - 1
umac/cmn_services/inc/wlan_cmn.h

@@ -310,6 +310,17 @@ typedef enum {
  *  @WLAN_PHYMODE_11AC_VHT80:     5Ghz, VHT80
  *  @WLAN_PHYMODE_11AC_VHT160:    5Ghz, VHT160
  *  @WLAN_PHYMODE_11AC_VHT80_80:  5Ghz, VHT80_80
+ *  @WLAN_PHYMODE_11AXA_HE20:     5GHz, HE20
+ *  @WLAN_PHYMODE_11AXG_HE20:     2GHz, HE20
+ *  @WLAN_PHYMODE_11AXA_HE40PLUS: 5GHz, HE40 (ext ch +1)
+ *  @WLAN_PHYMODE_11AXA_HE40MINUS:5GHz, HE40 (ext ch -1)
+ *  @WLAN_PHYMODE_11AXG_HE40PLUS: 2GHz, HE40 (ext ch +1)
+ *  @WLAN_PHYMODE_11AXG_HE40MINUS:2GHz, HE40 (ext ch -1)
+ *  @WLAN_PHYMODE_11AXA_HE40:     5GHz, HE40
+ *  @WLAN_PHYMODE_11AXG_HE40:     2GHz, HE40
+ *  @WLAN_PHYMODE_11AXA_HE80:     5GHz, HE80
+ *  @WLAN_PHYMODE_11AXA_HE160:    5GHz, HE160
+ *  @WLAN_PHYMODE_11AXA_HE80_80:  5GHz, HE80_80
  */
 enum wlan_phymode {
 	WLAN_PHYMODE_AUTO             = 0,
@@ -331,9 +342,44 @@ enum wlan_phymode {
 	WLAN_PHYMODE_11AC_VHT80       = 16,
 	WLAN_PHYMODE_11AC_VHT160      = 17,
 	WLAN_PHYMODE_11AC_VHT80_80    = 18,
+	WLAN_PHYMODE_11AXA_HE20       = 19,
+	WLAN_PHYMODE_11AXG_HE20       = 20,
+	WLAN_PHYMODE_11AXA_HE40PLUS   = 21,
+	WLAN_PHYMODE_11AXA_HE40MINUS  = 22,
+	WLAN_PHYMODE_11AXG_HE40PLUS   = 23,
+	WLAN_PHYMODE_11AXG_HE40MINUS  = 24,
+	WLAN_PHYMODE_11AXA_HE40       = 25,
+	WLAN_PHYMODE_11AXG_HE40       = 26,
+	WLAN_PHYMODE_11AXA_HE80       = 27,
+	WLAN_PHYMODE_11AXA_HE160      = 28,
+	WLAN_PHYMODE_11AXA_HE80_80    = 29,
 };
 
-#define WLAN_PHYMODE_MAX      (WLAN_PHYMODE_11AC_VHT80_80 + 1)
+#define WLAN_PHYMODE_MAX      (WLAN_PHYMODE_11AXA_HE80_80 + 1)
+
+/**
+ * enum wlan_phy_ch_width - channel width
+ * @WLAN_CH_WIDTH_20MHZ: 20 mhz width
+ * @WLAN_CH_WIDTH_40MHZ: 40 mhz width
+ * @WLAN_CH_WIDTH_80MHZ: 80 mhz width
+ * @WLAN_CH_WIDTH_160MHZ: 160 mhz width
+ * @WLAN_CH_WIDTH_80P80HZ: 80+80 mhz width
+ * @WLAN_CH_WIDTH_5MHZ: 5 mhz width
+ * @WLAN_CH_WIDTH_10MHZ: 10 mhz width
+ * @WLAN_CH_WIDTH_INVALID: invalid width
+ * @WLAN_CH_WIDTH_MAX: max possible width
+ */
+enum wlan_phy_ch_width {
+	WLAN_CH_WIDTH_20MHZ = 0,
+	WLAN_CH_WIDTH_40MHZ,
+	WLAN_CH_WIDTH_80MHZ,
+	WLAN_CH_WIDTH_160MHZ,
+	WLAN_CH_WIDTH_80P80MHZ,
+	WLAN_CH_WIDTH_5MHZ,
+	WLAN_CH_WIDTH_10MHZ,
+	WLAN_CH_WIDTH_INVALID,
+	WLAN_CH_WIDTH_MAX
+};
 
 /**
  * enum wifi_traffic_ac - access category type

+ 18 - 1
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -259,9 +259,26 @@ struct wlan_vdev_create_params {
 
 /**
  * struct wlan_channel - channel structure
+ * @ch_freq:      Channel in Mhz.
+ * @ch_ieee:      IEEE channel number.
+ * @ch_flags:     Channel flags.
+ * @ch_flagext:   Channel extension flags.
+ * @ch_maxpower:  Maximum tx power in dBm.
+ * @ch_freq_seg1: Channel Center frequeny for VHT80/160 and HE80/160.
+ * @ch_freq_seg2: Second channel Center frequency applicable for 80+80MHz mode.
+ * @ch_width:     Channel width.
+ * @ch_phymode:   Channel phymode.
  */
 struct wlan_channel {
-
+	uint16_t     ch_freq;
+	uint8_t      ch_ieee;
+	uint64_t     ch_flags;
+	uint16_t     ch_flagext;
+	int8_t       ch_maxpower;
+	uint8_t      ch_freq_seg1;
+	uint8_t      ch_freq_seg2;
+	enum wlan_phy_ch_width ch_width;
+	enum wlan_phymode ch_phymode;
 };
 
 /**

+ 28 - 1
umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

@@ -104,6 +104,9 @@ static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev)
 		return QDF_STATUS_E_FAILURE;
 
 	qdf_spinlock_destroy(&vdev->vdev_lock);
+
+	qdf_mem_free(vdev->vdev_mlme.bss_chan);
+	qdf_mem_free(vdev->vdev_mlme.des_chan);
 	qdf_mem_free(vdev);
 
 	return QDF_STATUS_SUCCESS;
@@ -140,11 +143,33 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
 		return NULL;
 	}
 	vdev->obj_state = WLAN_OBJ_STATE_ALLOCATED;
+
+	vdev->vdev_mlme.bss_chan = (struct wlan_channel *)qdf_mem_malloc(
+			sizeof(struct wlan_channel));
+	if (vdev->vdev_mlme.bss_chan == NULL) {
+		QDF_TRACE(QDF_MODULE_ID_MLME, QDF_TRACE_LEVEL_ERROR,
+				"%s:bss_chan is NULL", __func__);
+		qdf_mem_free(vdev);
+		return NULL;
+	}
+
+	vdev->vdev_mlme.des_chan = (struct wlan_channel *)qdf_mem_malloc(
+			sizeof(struct wlan_channel));
+	if (vdev->vdev_mlme.des_chan == NULL) {
+		QDF_TRACE(QDF_MODULE_ID_MLME, QDF_TRACE_LEVEL_ERROR,
+				"%s:des_chan is NULL", __func__);
+		qdf_mem_free(vdev->vdev_mlme.bss_chan);
+		qdf_mem_free(vdev);
+		return NULL;
+	}
+
 	/* Attach VDEV to PSOC VDEV's list */
 	if (wlan_objmgr_psoc_vdev_attach(psoc, vdev) !=
 				QDF_STATUS_SUCCESS) {
 		obj_mgr_err("psoc vdev attach failed for vdev-id:%d",
 					vdev->vdev_objmgr.vdev_id);
+		qdf_mem_free(vdev->vdev_mlme.bss_chan);
+		qdf_mem_free(vdev->vdev_mlme.des_chan);
 		qdf_mem_free(vdev);
 		return NULL;
 	}
@@ -156,6 +181,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
 		obj_mgr_err("pdev vdev attach failed for vdev-id:%d",
 				vdev->vdev_objmgr.vdev_id);
 		wlan_objmgr_psoc_vdev_detach(psoc, vdev);
+		qdf_mem_free(vdev->vdev_mlme.bss_chan);
+		qdf_mem_free(vdev->vdev_mlme.des_chan);
 		qdf_mem_free(vdev);
 		return NULL;
 	}
@@ -257,7 +284,7 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev)
 		WLAN_OBJMGR_BUG(0);
 	}
 
-	/* Invoke registered create handlers */
+	/* Invoke registered destroy handlers */
 	for (id = 0; id < WLAN_UMAC_MAX_COMPONENTS; id++) {
 		handler = g_umac_glb_obj->vdev_destroy_handler[id];
 		arg = g_umac_glb_obj->vdev_destroy_handler_arg[id];