Explorar o código

qcacmn: Add hif support for qca8074v2

Add new target type for qca8074v2 and extend target
type checks of QCA8074 for QCA8074V2.

Change-Id: Ib3ff4505e2057fc843b492b9720004dcac042a65
CRs-Fixed: 2292271
Venkateswara Swamy Bandaru %!s(int64=6) %!d(string=hai) anos
pai
achega
dbacd5e70f

+ 1 - 0
hif/inc/hif.h

@@ -60,6 +60,7 @@ typedef void *hif_handle_t;
 #define HIF_TYPE_QCA6290 16
 #define HIF_TYPE_QCN7605 17
 #define HIF_TYPE_QCA6390 18
+#define HIF_TYPE_QCA8074V2 19
 
 #ifdef IPA_OFFLOAD
 #define DMA_COHERENT_MASK_IPA_VER_3_AND_ABOVE   37

+ 1 - 0
hif/inc/hostdef.h

@@ -39,5 +39,6 @@ extern struct hostdef_s *QCA6390_HOSTdef;
 extern struct hostdef_s *IPQ4019_HOSTdef;
 #endif
 extern struct hostdef_s *QCA8074_HOSTdef;
+extern struct hostdef_s *QCA8074V2_HOSTDEF;
 
 #endif

+ 3 - 0
hif/inc/target_type.h

@@ -67,6 +67,9 @@ extern "C" {
 #ifndef TARGET_TYPE_QCA6390
 #define TARGET_TYPE_QCA6390   23
 #endif
+#ifndef TARGET_TYPE_QCA8074V2
+#define TARGET_TYPE_QCA8074V2 24
+#endif
 
 #ifdef __cplusplus
 }

+ 2 - 0
hif/inc/targetdef.h

@@ -39,6 +39,7 @@ extern struct targetdef_s *QCA6390_TARGETdef;
 extern struct targetdef_s *IPQ4019_TARGETdef;
 #endif
 extern struct targetdef_s *QCA8074_TARGETdef;
+extern struct targetdef_s *QCA8074V2_TARGETDEF;
 
 extern struct ce_reg_def *AR6002_CE_TARGETdef;
 extern struct ce_reg_def *AR6003_CE_TARGETdef;
@@ -55,6 +56,7 @@ extern struct ce_reg_def *QCA6390_CE_TARGETdef;
 extern struct ce_reg_def *IPQ4019_CE_TARGETdef;
 #endif
 extern struct ce_reg_def *QCA8074_CE_TARGETdef;
+extern struct ce_reg_def *QCA8074V2_CE_TARGETDEF;
 
 
 #endif

+ 12 - 10
hif/src/ath_procfs.c

@@ -81,11 +81,12 @@ static ssize_t ath_procfs_diag_read(struct file *file, char __user *buf,
 		 read_buffer, count, (int)*pos, buf);
 
 	tgt_info = hif_get_target_info_handle(GET_HIF_OPAQUE_HDL(hif_hdl));
-	if (scn->bus_type == QDF_BUS_TYPE_SNOC ||
-			(scn->bus_type ==  QDF_BUS_TYPE_PCI &&
-			 (tgt_info->target_type == TARGET_TYPE_QCA6290 ||
-			  tgt_info->target_type == TARGET_TYPE_QCA6390 ||
-			  tgt_info->target_type == TARGET_TYPE_QCA8074))) {
+	if ((scn->bus_type == QDF_BUS_TYPE_SNOC) ||
+	    (scn->bus_type ==  QDF_BUS_TYPE_PCI &&
+	    ((tgt_info->target_type == TARGET_TYPE_QCA6290) ||
+	     (tgt_info->target_type == TARGET_TYPE_QCA6390) ||
+	     (tgt_info->target_type == TARGET_TYPE_QCA8074) ||
+	     (tgt_info->target_type == TARGET_TYPE_QCA8074V2)))) {
 		memtype = ((uint32_t)(*pos) & 0xff000000) >> 24;
 		offset = (uint32_t)(*pos) & 0xffffff;
 		HIF_TRACE("%s: offset 0x%x memtype 0x%x, datalen %zu\n",
@@ -153,11 +154,12 @@ static ssize_t ath_procfs_diag_write(struct file *file,
 		 (int)*pos, *((uint32_t *) write_buffer));
 
 	tgt_info = hif_get_target_info_handle(GET_HIF_OPAQUE_HDL(hif_hdl));
-	if (scn->bus_type == QDF_BUS_TYPE_SNOC ||
-			(scn->bus_type ==  QDF_BUS_TYPE_PCI &&
-			 (tgt_info->target_type == TARGET_TYPE_QCA6290 ||
-			  tgt_info->target_type == TARGET_TYPE_QCA6390 ||
-			  tgt_info->target_type == TARGET_TYPE_QCA8074))) {
+	if ((scn->bus_type == QDF_BUS_TYPE_SNOC) ||
+	    ((scn->bus_type ==  QDF_BUS_TYPE_PCI) &&
+	     ((tgt_info->target_type == TARGET_TYPE_QCA6290) ||
+	      (tgt_info->target_type == TARGET_TYPE_QCA6390) ||
+	      (tgt_info->target_type == TARGET_TYPE_QCA8074) ||
+	      (tgt_info->target_type == TARGET_TYPE_QCA8074V2)))) {
 		memtype = ((uint32_t)(*pos) & 0xff000000) >> 24;
 		offset = (uint32_t)(*pos) & 0xffffff;
 		HIF_TRACE("%s: offset 0x%x memtype 0x%x, datalen %zu\n",

+ 3 - 0
hif/src/ce/ce_main.c

@@ -718,6 +718,7 @@ static void hif_select_service_to_pipe_map(struct hif_softc *scn,
 				sizeof(target_service_to_ce_map_qca6390);
 			break;
 		case TARGET_TYPE_QCA8074:
+		case TARGET_TYPE_QCA8074V2:
 			*tgt_svc_map_to_use = target_service_to_ce_map_qca8074;
 			*sz_tgt_svc_map_to_use =
 				sizeof(target_service_to_ce_map_qca8074);
@@ -902,6 +903,7 @@ bool ce_srng_based(struct hif_softc *scn)
 
 	switch (tgt_info->target_type) {
 	case TARGET_TYPE_QCA8074:
+	case TARGET_TYPE_QCA8074V2:
 	case TARGET_TYPE_QCA6290:
 	case TARGET_TYPE_QCA6390:
 		return true;
@@ -2803,6 +2805,7 @@ void hif_ce_prepare_config(struct hif_softc *scn)
 		break;
 
 	case TARGET_TYPE_QCA8074:
+	case TARGET_TYPE_QCA8074V2:
 		if (scn->bus_type == QDF_BUS_TYPE_PCI) {
 			hif_state->host_ce_config =
 					host_ce_config_wlan_qca8074_pci;

+ 10 - 4
hif/src/hif_main.c

@@ -800,10 +800,6 @@ int hif_get_device_type(uint32_t device_id,
 		break;
 
 	case QCA8074_DEVICE_ID:
-	case RUMIM2M_DEVICE_ID_NODE0:
-	case RUMIM2M_DEVICE_ID_NODE1:
-	case RUMIM2M_DEVICE_ID_NODE2:
-	case RUMIM2M_DEVICE_ID_NODE3:
 		*hif_type = HIF_TYPE_QCA8074;
 		*target_type = TARGET_TYPE_QCA8074;
 		HIF_INFO(" *********** QCA8074  *************\n");
@@ -830,6 +826,16 @@ int hif_get_device_type(uint32_t device_id,
 		HIF_INFO(" *********** QCA6390 *************\n");
 		break;
 
+	case QCA8074V2_DEVICE_ID:
+	case RUMIM2M_DEVICE_ID_NODE0:
+	case RUMIM2M_DEVICE_ID_NODE1:
+	case RUMIM2M_DEVICE_ID_NODE2:
+	case RUMIM2M_DEVICE_ID_NODE3:
+		*hif_type = HIF_TYPE_QCA8074V2;
+		*target_type = TARGET_TYPE_QCA8074V2;
+		HIF_INFO(" *********** QCA8074V2 *************\n");
+		break;
+
 	default:
 		HIF_ERROR("%s: Unsupported device ID = 0x%x!",
 			  __func__, device_id);

+ 1 - 0
hif/src/hif_main.h

@@ -94,6 +94,7 @@
 					actual number once available.
 					currently defining this to 0xffff for
 					emulation purpose */
+#define QCA8074V2_DEVICE_ID (0xfffe) /* Todo: replace this with actual number */
 /* Genoa */
 #define QCN7605_COMPOSITE  (0x9900)
 #define QCN7605_STANDALONE  (0x9901)

+ 7 - 4
hif/src/pcie/if_pci.c

@@ -2014,8 +2014,9 @@ int hif_pci_bus_configure(struct hif_softc *hif_sc)
 	}
 
 	/* todo: consider replacing this with an srng field */
-	if ((hif_sc->target_info.target_type == TARGET_TYPE_QCA8074) &&
-			(hif_sc->bus_type == QDF_BUS_TYPE_AHB)) {
+	if (((hif_sc->target_info.target_type == TARGET_TYPE_QCA8074) ||
+	     (hif_sc->target_info.target_type == TARGET_TYPE_QCA8074V2)) &&
+	    (hif_sc->bus_type == QDF_BUS_TYPE_AHB)) {
 		hif_sc->per_ce_irq = true;
 	}
 
@@ -2034,8 +2035,9 @@ int hif_pci_bus_configure(struct hif_softc *hif_sc)
 		hif_register_bmi_callbacks(hif_sc);
 	}
 
-	if ((hif_sc->target_info.target_type == TARGET_TYPE_QCA8074) &&
-			(hif_sc->bus_type == QDF_BUS_TYPE_PCI))
+	if (((hif_sc->target_info.target_type == TARGET_TYPE_QCA8074) ||
+	     (hif_sc->target_info.target_type == TARGET_TYPE_QCA8074V2)) &&
+	    (hif_sc->bus_type == QDF_BUS_TYPE_PCI))
 		HIF_INFO_MED("%s: Skip irq config for PCI based 8074 target",
 						__func__);
 	else {
@@ -3703,6 +3705,7 @@ int hif_configure_irq(struct hif_softc *scn)
 		ret = hif_ahb_configure_legacy_irq(sc);
 		break;
 	case TARGET_TYPE_QCA8074:
+	case TARGET_TYPE_QCA8074V2:
 		ret = hif_ahb_configure_irq(sc);
 		break;
 	default:

+ 11 - 1
hif/src/regtable.c

@@ -113,6 +113,12 @@ void hif_target_register_tbl_attach(struct hif_softc *scn, u32 target_type)
 		scn->target_ce_def = QCA6290_CE_TARGETdef;
 		break;
 #endif
+#if defined(QCA8074V2_HEADERS_DEF)
+	case TARGET_TYPE_QCA8074V2:
+		scn->targetdef = QCA8074V2_TARGETDEF;
+		scn->target_ce_def = QCA8074V2_CE_TARGETDEF;
+		break;
+#endif
 
 #if defined(QCA6390_HEADERS_DEF)
 	case TARGET_TYPE_QCA6390:
@@ -194,7 +200,11 @@ void hif_register_tbl_attach(struct hif_softc *scn, u32 hif_type)
 		scn->hostdef = QCA8074_HOSTdef;
 		break;
 #endif
-
+#if defined(QCA8074V2_HEADERS_DEF)
+	case HIF_TYPE_QCA8074V2:
+		scn->hostdef = QCA8074V2_HOSTDEF;
+		break;
+#endif
 #if defined(QCA6290_HEADERS_DEF)
 	case HIF_TYPE_QCA6290:
 		scn->hostdef = QCA6290_HOSTdef;

+ 6 - 3
hif/src/snoc/if_ahb.c

@@ -436,7 +436,8 @@ void hif_ahb_disable_bus(struct hif_softc *scn)
 		mem_pa_size = memres->end - memres->start + 1;
 
 		/* Should not be executed on 8074 platform */
-		if (tgt_info->target_type != TARGET_TYPE_QCA8074) {
+		if ((tgt_info->target_type != TARGET_TYPE_QCA8074) &&
+		    (tgt_info->target_type != TARGET_TYPE_QCA8074V2)) {
 			hif_ahb_clk_enable_disable(&pdev->dev, 0);
 
 			hif_ahb_device_reset(scn);
@@ -538,7 +539,8 @@ QDF_STATUS hif_ahb_enable_bus(struct hif_softc *ol_sc,
 	hif_target_register_tbl_attach(ol_sc, target_type);
 
 	/* QCA_WIFI_QCA8074_VP:Should not be executed on 8074 VP platform */
-	if (tgt_info->target_type != TARGET_TYPE_QCA8074) {
+	if ((tgt_info->target_type != TARGET_TYPE_QCA8074) &&
+	    (tgt_info->target_type != TARGET_TYPE_QCA8074V2)) {
 		if (hif_ahb_enable_radio(sc, pdev, id) != 0) {
 			HIF_INFO("error in enabling soc\n");
 			return -EIO;
@@ -555,7 +557,8 @@ QDF_STATUS hif_ahb_enable_bus(struct hif_softc *ol_sc,
 	return QDF_STATUS_SUCCESS;
 err_target_sync:
 	/* QCA_WIFI_QCA8074_VP:Should not be executed on 8074 VP platform */
-	if (tgt_info->target_type != TARGET_TYPE_QCA8074) {
+	if ((tgt_info->target_type != TARGET_TYPE_QCA8074) &&
+	    (tgt_info->target_type != TARGET_TYPE_QCA8074V2)) {
 		HIF_INFO("Error: Disabling target\n");
 		hif_ahb_disable_bus(ol_sc);
 	}