Просмотр исходного кода

qcacmn: Support per mac CE for WMI commands

Firmware requires WMI commands to be sent on different copy engine for
each MAC. Change CE assignement to support this.

Change-Id: I91a2422a944741dc25c3bf45b18cde30e7409632
CRs-Fixed: 2005214
Kiran Venkatappa 8 лет назад
Родитель
Сommit
e17e3b63e0
7 измененных файлов с 295 добавлено и 111 удалено
  1. 1 0
      hif/src/ce/ce_api.h
  2. 182 101
      hif/src/ce/ce_assignment.h
  3. 13 2
      hif/src/ce/ce_diag.c
  4. 21 1
      hif/src/ce/ce_main.c
  5. 52 5
      htc/htc.c
  6. 18 1
      htc/htc_api.h
  7. 8 1
      htc/htc_internal.h

+ 1 - 0
hif/src/ce/ce_api.h

@@ -399,6 +399,7 @@ bool ce_get_rx_pending(struct hif_softc *scn);
 #define CE_ATTR_SWIZZLE_DESCRIPTORS  0x04 /* Swizzle descriptors? */
 #define CE_ATTR_DISABLE_INTR         0x08 /* no interrupt on copy completion */
 #define CE_ATTR_ENABLE_POLL          0x10 /* poll for residue descriptors */
+#define CE_ATTR_DIAG                 0x20 /* Diag CE */
 
 /* Attributes of an instance of a Copy Engine */
 struct CE_attr {

+ 182 - 101
hif/src/ce/ce_assignment.h

@@ -76,7 +76,6 @@ static void hif_target_dump_access_log(void);
 #define CE_HTT_H2T_MSG_SRC_NENTRIES 2048
 #define CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B 4096
 
-#define DIAG_CE_ID           7
 #define EPPING_CE_FLAGS_POLL \
 	(CE_ATTR_DISABLE_INTR|CE_ATTR_ENABLE_POLL|CE_ATTR_FLAGS)
 
@@ -84,6 +83,9 @@ static void hif_target_dump_access_log(void);
 #define PIPEDIR_INOUT_H2H 4
 #endif
 
+#define CE_ATTR_DIAG_FLAGS \
+	(CE_ATTR_FLAGS | CE_ATTR_DIAG)
+
 #ifdef QCA_WIFI_3_0
 static struct CE_attr host_ce_config_wlan[] = {
 	/* host->target HTC control and raw streams */
@@ -103,7 +105,7 @@ static struct CE_attr host_ce_config_wlan[] = {
 	/* Target autonomous HIF_memcpy */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
 	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
+	{ /* CE7 */ (CE_ATTR_DIAG_FLAGS | CE_ATTR_DISABLE_INTR) , 0,
 		2, DIAG_TRANSFER_LIMIT, 2, NULL,},
 	/* Target to uMC */
 	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
@@ -162,7 +164,7 @@ static struct CE_attr host_ce_config_wlan_epping_poll[] = {
 	/* unused */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0,   0, 0, NULL,},
 	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2,   DIAG_TRANSFER_LIMIT, 2, NULL,},
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2,   DIAG_TRANSFER_LIMIT, 2, NULL,},
 };
 
 static struct CE_attr host_ce_config_wlan_epping_irq[] = {
@@ -181,7 +183,7 @@ static struct CE_attr host_ce_config_wlan_epping_irq[] = {
 	/* unused */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0,   0, 0, 0, NULL,},
 	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0,   2, DIAG_TRANSFER_LIMIT, 2, NULL,},
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0,   2, DIAG_TRANSFER_LIMIT, 2, NULL,},
 };
 /*
  * EP-ping firmware's CE configuration
@@ -225,7 +227,7 @@ static struct CE_attr host_ce_config_wlan[] = {
 	/* Target autonomous HIF_memcpy */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
 	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR,
+	{ /* CE7 */ (CE_ATTR_DIAG_FLAGS | CE_ATTR_DISABLE_INTR),
 		0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
 };
 
@@ -267,7 +269,7 @@ static struct CE_attr host_ce_config_wlan_epping_poll[] = {
 	/* unused */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0,   0, 0, NULL,},
 	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2,   DIAG_TRANSFER_LIMIT, 2, NULL,},
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2,   DIAG_TRANSFER_LIMIT, 2, NULL,},
 	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
 	/* The following CEs are not being used yet */
 	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0,  0, 0, NULL,},
@@ -290,7 +292,7 @@ static struct CE_attr host_ce_config_wlan_epping_irq[] = {
 	/* unused */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
 	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
 	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
 	/* The following CEs are not being used yet */
 	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0,  0, 0, NULL,},
@@ -326,151 +328,232 @@ static struct CE_pipe_config target_ce_config_wlan_epping[] = {
 #endif
 
 static struct CE_attr host_ce_config_wlan_ar9888[] = {
-	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, }, /* host->target HTC control and raw streams */
+	/* host->target HTC control and raw streams */
+	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, },
+	/* target->host BMI + HTC control */
 	/* could be moved to share CE3 */
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },/* target->host BMI + HTC control */
-	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },/* target->host WMI */
-	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },/* host->target WMI */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
+	/* target->host WMI */
+	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },
+	/* host->target WMI */
+	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },
+	/* host->target HTT */
 	{ /* CE4 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR, 0,
-		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, }, /* host->target HTT */
+		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, },
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },    /* target->host HTT messages */
+	/* target->host HTT messages */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #else   /* WLAN_FEATURE_FASTPATH */
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* unused */
+	/* unused */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 #endif  /* WLAN_FEATURE_FASTPATH */
-	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, }, /* ce_diag, the Diagnostic Window */
-	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
+	/* Target autonomous HIF_memcpy */
+	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* ce_diag, the Diagnostic Window */
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 };
 
 static struct CE_attr host_ce_config_wlan_ar900b[] = {
-	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, }, /* host->target HTC control and raw streams */
+	/* host->target HTC control and raw streams */
+	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, },
+	/* target->host BMI + HTC control */
 	/* could be moved to share CE3 */
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },/* target->host BMI + HTC control */
-	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },/* target->host WMI */
-	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },/* host->target WMI */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
+	/* target->host WMI */
+	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },
+	/* host->target WMI */
+	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },
+	/* host->target HTT */
 	{ /* CE4 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR, 0,
-		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, }, /* host->target HTT */
+		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, },
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },    /* target->host HTT messages */
+	/* target->host HTT messages */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #else   /* WLAN_FEATURE_FASTPATH */
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* unused */
+	/* unused */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 #endif  /* WLAN_FEATURE_FASTPATH */
-	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, }, /* ce_diag, the Diagnostic Window */
-	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },/* target->host pktlog */
-	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },   /* Target autonomous HIF_memcpy */
-	{ /* CE11 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },   /* Target autonomous HIF_memcpy */
+	/* Target autonomous HIF_memcpy */
+	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* ce_diag, the Diagnostic Window */
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, },
+	/* target->host pktlog */
+	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE11 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 };
 
 static struct CE_attr host_lowdesc_ce_cfg_wlan_ar9888[] = {
-	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, }, /* host->target HTC control and raw streams */
+	/* host->target HTC control and raw streams */
+	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, },
 	/* could be moved to share CE3 */
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 64, NULL, },/* target->host BMI + HTC control */
+	/* target->host BMI + HTC control */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 64, NULL, },
 #else
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },/* target->host BMI + HTC control */
+	/* target->host BMI + HTC control */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #endif
-	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },/* target->host WMI */
-	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },/* host->target WMI */
+	/* target->host WMI */
+	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },
+	/* host->target WMI */
+	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },
+	/* host->target HTT */
 	{ /* CE4 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR, 0,
-		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, }, /* host->target HTT */
+		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, },
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },    /* target->host HTT messages */
+	/* target->host HTT messages */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #else   /* WLAN_FEATURE_FASTPATH */
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* unused */
+	/* unused */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 #endif  /* WLAN_FEATURE_FASTPATH */
-	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, }, /* ce_diag, the Diagnostic Window */
-	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
+	/* Target autonomous HIF_memcpy */
+	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* ce_diag, the Diagnostic Window */
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 };
 
 static struct CE_attr host_lowdesc_ce_cfg_wlan_ar900b[] = {
-	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, }, /* host->target HTC control and raw streams */
+	/* host->target HTC control and raw streams */
+	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, },
 	/* could be moved to share CE3 */
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 64, NULL, },/* target->host BMI + HTC control */
+	/* target->host BMI + HTC control */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 64, NULL, },
 #else
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },/* target->host BMI + HTC control */
+	/* target->host BMI + HTC control */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #endif
-	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },/* target->host WMI */
-	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },/* host->target WMI */
+	/* target->host WMI */
+	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },
+	/* host->target WMI */
+	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },
+	/* host->target HTT */
 	{ /* CE4 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR, 0,
-		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, }, /* host->target HTT */
+		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, },
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },    /* target->host HTT messages */
+	/* target->host HTT messages */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #else   /* WLAN_FEATURE_FASTPATH */
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* unused */
+	/* unused */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 #endif  /* WLAN_FEATURE_FASTPATH */
-	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, }, /* ce_diag, the Diagnostic Window */
-	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },/* target->host pktlog */
-	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },   /* Target autonomous HIF_memcpy */
-	{ /* CE11 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },   /* Target autonomous HIF_memcpy */
+	/* Target autonomous HIF_memcpy */
+	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* ce_diag, the Diagnostic Window */
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, },
+	/* target->host pktlog */
+	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE11 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 };
 
 static struct CE_attr host_lowdesc_ce_cfg_wlan_ar900b_nopktlog[] = {
-	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, }, /* host->target HTC control and raw streams */
+	/* host->target HTC control and raw streams */
+	{ /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL, },
 	/* could be moved to share CE3 */
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 64, NULL, },/* target->host BMI + HTC control */
+	/* target->host BMI + HTC control */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 64, NULL, },
 #else
-	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },/* target->host BMI + HTC control */
+	/* target->host BMI + HTC control */
+	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #endif
-	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },/* target->host WMI */
-	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },/* host->target WMI */
+	/* target->host WMI */
+	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL, },
+	/* host->target WMI */
+	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL, },
+	/* host->target HTT */
 	{ /* CE4 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR, 0,
-		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, }, /* host->target HTT */
+		CE_HTT_H2T_MSG_SRC_NENTRIES_AR900B, 256, 0, NULL, },
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },    /* target->host HTT messages */
+	/* target->host HTT messages */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 512, 512, NULL, },
 #else   /* WLAN_FEATURE_FASTPATH */
-	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* unused */
+	/* unused */
+	{ /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 #endif  /* WLAN_FEATURE_FASTPATH */
-	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, }, /* ce_diag, the Diagnostic Window */
-	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },/* target->host pktlog */
-	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },    /* Target autonomous HIF_memcpy */
-	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },   /* Target autonomous HIF_memcpy */
-	{ /* CE11 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },   /* Target autonomous HIF_memcpy */
+	/* Target autonomous HIF_memcpy */
+	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* ce_diag, the Diagnostic Window */
+	{ /* CE7 */ CE_ATTR_DIAG_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL, },
+	/* target->host pktlog */
+	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
+	/* Target autonomous HIF_memcpy */
+	{ /* CE11 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL, },
 };
 
 static struct CE_pipe_config target_ce_config_wlan_ar9888[] = {
-	{ /* CE0 */ 0, PIPEDIR_OUT, 32, 256, CE_ATTR_FLAGS, 0, },   /* host->target HTC control and raw streams */
-	{ /* CE1 */ 1, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },    /* target->host HTC control */
-	{ /* CE2 */ 2, PIPEDIR_IN, 64, 2048, CE_ATTR_FLAGS, 0, },   /* target->host WMI */
-	{ /* CE3 */ 3, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },  /* host->target WMI */
-	{ /* CE4 */ 4, PIPEDIR_OUT, 256, 256, CE_ATTR_FLAGS, 0, },  /* host->target HTT */
+	/* host->target HTC control and raw streams */
+	{ /* CE0 */ 0, PIPEDIR_OUT, 32, 256, CE_ATTR_FLAGS, 0, },
+	/* target->host HTC control */
+	{ /* CE1 */ 1, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },
+	/* target->host WMI */
+	{ /* CE2 */ 2, PIPEDIR_IN, 64, 2048, CE_ATTR_FLAGS, 0, },
+	/* host->target WMI */
+	{ /* CE3 */ 3, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },
+	/* host->target HTT */
+	{ /* CE4 */ 4, PIPEDIR_OUT, 256, 256, CE_ATTR_FLAGS, 0, },
 	/* NB: 50% of src nentries, since tx has 2 frags */
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE5 */ 5, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },    /* target->host HTT */
+	/* target->host HTT */
+	{ /* CE5 */ 5, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },
 #else
-	{ /* CE5 */ 5, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },  /* unused */
+	/* unused */
+	{ /* CE5 */ 5, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },
 #endif
-	{ /* CE6 */ 6, PIPEDIR_INOUT, 32, 4096, CE_ATTR_FLAGS, 0, },/* Reserved for target autonomous HIF_memcpy */
+	/* Reserved for target autonomous HIF_memcpy */
+	{ /* CE6 */ 6, PIPEDIR_INOUT, 32, 4096, CE_ATTR_FLAGS, 0, },
 	/* CE7 used only by Host */
 };
 
 static struct CE_pipe_config target_ce_config_wlan_ar900b[] = {
-	{ /* CE0 */ 0, PIPEDIR_OUT, 32, 256, CE_ATTR_FLAGS, 0, },   /* host->target HTC control and raw streams */
-	{ /* CE1 */ 1, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },    /* target->host HTC control */
-	{ /* CE2 */ 2, PIPEDIR_IN, 64, 2048, CE_ATTR_FLAGS, 0, },   /* target->host WMI */
-	{ /* CE3 */ 3, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },  /* host->target WMI */
-	{ /* CE4 */ 4, PIPEDIR_OUT, 256, 256, CE_ATTR_FLAGS, 0, },  /* host->target HTT */
+	/* host->target HTC control and raw streams */
+	{ /* CE0 */ 0, PIPEDIR_OUT, 32, 256, CE_ATTR_FLAGS, 0, },
+	/* target->host HTC control */
+	{ /* CE1 */ 1, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },
+	/* target->host WMI */
+	{ /* CE2 */ 2, PIPEDIR_IN, 64, 2048, CE_ATTR_FLAGS, 0, },
+	/* host->target WMI */
+	{ /* CE3 */ 3, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },
+	/* host->target HTT */
+	{ /* CE4 */ 4, PIPEDIR_OUT, 256, 256, CE_ATTR_FLAGS, 0, },
 	/* NB: 50% of src nentries, since tx has 2 frags */
 #if WLAN_FEATURE_FASTPATH
-	{ /* CE5 */ 5, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },    /* target->host HTT */
+	/* target->host HTT */
+	{ /* CE5 */ 5, PIPEDIR_IN, 32, 512, CE_ATTR_FLAGS, 0, },
 #else
-	{ /* CE5 */ 5, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },  /* unused */
+	/* unused */
+	{ /* CE5 */ 5, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0, },
 #endif
-	{ /* CE6 */ 6, PIPEDIR_INOUT, 32, 4096, CE_ATTR_FLAGS, 0, },/* Reserved for target autonomous HIF_memcpy */
-	{ /* CE7 */ 7, PIPEDIR_INOUT, 0, 0, 0, 0, },                /* CE7 used only by Host */
+	/* Reserved for target autonomous HIF_memcpy */
+	{ /* CE6 */ 6, PIPEDIR_INOUT, 32, 4096, CE_ATTR_FLAGS, 0, },
+	/* CE7 used only by Host */
+	{ /* CE7 */ 7, PIPEDIR_INOUT, 0, 0, 0, 0, },
 	{ /* CE8 */ 8, PIPEDIR_IN, 64, 2048, CE_ATTR_FLAGS
-		| CE_ATTR_DISABLE_INTR, 0, }, /* target->host packtlog */
+		/* target->host packtlog */
+		| CE_ATTR_DISABLE_INTR, 0, },
 #if PEER_CACHEING_HOST_ENABLE
+	/* target autonomous qcache memcpy */
 	{ /* CE9 */ 9, PIPEDIR_INOUT, 32, 2048, CE_ATTR_FLAGS |
-		CE_ATTR_DISABLE_INTR, 0, }, /* target autonomous qcache memcpy */
+		CE_ATTR_DISABLE_INTR, 0, },
 #endif
 };
 
@@ -481,7 +564,7 @@ static struct CE_attr host_ce_config_wlan_qca8074[] = {
 	{ /* CE1 */ CE_ATTR_FLAGS, 0, 0,  2048, 512, NULL,},
 	/* target->host WMI */
 	{ /* CE2 */ CE_ATTR_FLAGS, 0, 0,  2048, 32, NULL,},
-	/* host->target WMI */
+	/* host->target WMI (mac0) */
 	{ /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL,},
 	/* host->target HTT */
 	{ /* CE4 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
@@ -491,13 +574,12 @@ static struct CE_attr host_ce_config_wlan_qca8074[] = {
 		1024, 512, 0, NULL,},
 	/* Target autonomous HIF_memcpy */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
-	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
-		8, DIAG_TRANSFER_LIMIT, 8, NULL,},
+	/* host->target WMI (mac1) */
+	{ /* CE7 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL,},
 	/* Target to uMC */
 	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
-	/* target->host HTT */
-	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0,  2048, 512, NULL,},
+	/* host->target WMI (mac2) */
+	{ /* CE9 */ CE_ATTR_FLAGS, 0, 32,  2048, 0, NULL,},
 	/* target->host HTT */
 	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0,  2048, 512, NULL,},
 	/* target -> host PKTLOG */
@@ -542,7 +624,7 @@ static struct CE_attr host_ce_config_wlan_qca8074_pci[] = {
 	{ /* CE1 */ EPPING_CE_FLAGS_POLL, 0, 0,  2048, 512, NULL,},
 	/* target->host WMI */
 	{ /* CE2 */ EPPING_CE_FLAGS_POLL, 0, 0,  2048, 32, NULL,},
-	/* host->target WMI */
+	/* host->target WMI (mac0) */
 	{ /* CE3 */ EPPING_CE_FLAGS_POLL, 0, 32, 2048, 0, NULL,},
 	/* host->target HTT */
 	{ /* CE4 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
@@ -552,13 +634,12 @@ static struct CE_attr host_ce_config_wlan_qca8074_pci[] = {
 		1024, 512, 0, NULL,},
 	/* Target autonomous HIF_memcpy */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
-	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
-		2, DIAG_TRANSFER_LIMIT, 2, NULL,},
+	/* host->target WMI (mac1) */
+	{ /* CE7 */ EPPING_CE_FLAGS_POLL, 0, 32, 2048, 0, NULL,},
 	/* Target to uMC */
 	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
-	/* target->host HTT */
-	{ /* CE9 */ CE_ATTR_FLAGS, 0, 0,  2048, 512, NULL,},
+	/* host->target WMI (mac2) */
+	{ /* CE9 */ EPPING_CE_FLAGS_POLL, 0, 32,  2048, 0, NULL,},
 	/* target->host HTT */
 	{ /* CE10 */ CE_ATTR_FLAGS, 0, 0,  2048, 512, NULL,},
 	/* target -> host PKTLOG */
@@ -613,7 +694,7 @@ static struct CE_attr host_ce_config_wlan_qca6290[] = {
 	/* Target autonomous HIF_memcpy */
 	{ /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
 	/* ce_diag, the Diagnostic Window */
-	{ /* CE7 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
+	{ /* CE7 */ (CE_ATTR_DIAG_FLAGS | CE_ATTR_DISABLE_INTR), 0,
 		2, DIAG_TRANSFER_LIMIT, 2, NULL,},
 	/* Reserved for target */
 	{ /* CE8 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},

+ 13 - 2
hif/src/ce/ce_diag.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2017 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -168,6 +168,12 @@ QDF_STATUS hif_diag_read_mem(struct hif_opaque_softc *hif_ctx,
 	unsigned int target_type = 0;
 	unsigned int boundary_addr = 0;
 
+	ce_diag = hif_state->ce_diag;
+	if (ce_diag == NULL) {
+		HIF_ERROR("%s: DIAG CE not present", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+
 	transaction_id = (mux_id & MUX_ID_MASK) |
 		 (transaction_id & TRANSACTION_ID_MASK);
 #ifdef QCA_WIFI_3_0
@@ -206,7 +212,6 @@ QDF_STATUS hif_diag_read_mem(struct hif_opaque_softc *hif_ctx,
 
 		return status;
 	}
-	ce_diag = hif_state->ce_diag;
 
 	A_TARGET_ACCESS_LIKELY(scn);
 
@@ -361,7 +366,13 @@ QDF_STATUS hif_diag_write_mem(struct hif_opaque_softc *hif_ctx,
 	unsigned int toeplitz_hash_result;
 	unsigned int user_flags = 0;
 	unsigned int target_type = 0;
+
 	ce_diag = hif_state->ce_diag;
+	if (ce_diag == NULL) {
+		HIF_ERROR("%s: DIAG CE not present", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+
 	transaction_id = (mux_id & MUX_ID_MASK) |
 		(transaction_id & TRANSACTION_ID_MASK);
 #ifdef QCA_WIFI_3_0

+ 21 - 1
hif/src/ce/ce_main.c

@@ -320,6 +320,26 @@ static struct service_to_pipe target_service_to_ce_map_wlan[] = {
 		PIPEDIR_IN,     /* in = DL = target -> host */
 		2,
 	},
+	{
+		WMI_CONTROL_SVC_WMAC1,
+		PIPEDIR_OUT,    /* out = UL = host -> target */
+		7,
+	},
+	{
+		WMI_CONTROL_SVC_WMAC1,
+		PIPEDIR_IN,     /* in = DL = target -> host */
+		2,
+	},
+	{
+		WMI_CONTROL_SVC_WMAC2,
+		PIPEDIR_OUT,    /* out = UL = host -> target */
+		9,
+	},
+	{
+		WMI_CONTROL_SVC_WMAC2,
+		PIPEDIR_IN,     /* in = DL = target -> host */
+		2,
+	},
 	{
 		HTC_CTRL_RSVD_SVC,
 		PIPEDIR_OUT,    /* out = UL = host -> target */
@@ -2334,7 +2354,7 @@ int hif_config_ce(struct hif_softc *scn)
 			goto err;
 		}
 
-		if (pipe_num == DIAG_CE_ID) {
+		if (attr->flags & CE_ATTR_DIAG) {
 			/* Reserve the ultimate CE for
 			 * Diagnostic Window support */
 			hif_state->ce_diag = pipe_info->ce_hdl;

+ 52 - 5
htc/htc.c

@@ -266,6 +266,7 @@ HTC_HANDLE htc_create(void *ol_sc, HTC_INIT_INFO *pInfo, qdf_device_t osdev,
 	qdf_spinlock_create(&target->HTCTxLock);
 	qdf_spinlock_create(&target->HTCCreditLock);
 	target->is_nodrop_pkt = false;
+	target->wmi_ep_count = 1;
 
 	do {
 		qdf_mem_copy(&target->HTCInitInfo, pInfo,
@@ -410,17 +411,16 @@ A_STATUS htc_setup_target_buffer_assignments(HTC_TARGET *target)
 	credits = target->TotalTransmitCredits;
 	pEntry = &target->ServiceTxAllocTable[0];
 
+	status = A_OK;
 	/*
 	 * Allocate all credists/HTC buffers to WMI.
 	 * no buffers are used/required for data. data always
 	 * remains on host.
 	 */
-	status = A_OK;
-	pEntry++;
-	pEntry->service_id = WMI_CONTROL_SVC;
-	pEntry->CreditAllocation = credits;
-
 	if (HTC_IS_EPPING_ENABLED(target->con_mode)) {
+		pEntry++;
+		pEntry->service_id = WMI_CONTROL_SVC;
+		pEntry->CreditAllocation = credits;
 		/* endpoint ping is a testing tool directly on top of HTC in
 		 * both target and host sides.
 		 * In target side, the endppint ping fw has no wlan stack and the
@@ -447,6 +447,26 @@ A_STATUS htc_setup_target_buffer_assignments(HTC_TARGET *target)
 
 		htc_setup_epping_credit_allocation(target->hif_dev,
 						   pEntry, credits);
+	} else {
+		int i;
+		uint32_t svc_id[] = {WMI_CONTROL_SVC, WMI_CONTROL_SVC_WMAC1,
+						WMI_CONTROL_SVC_WMAC2};
+		uint32_t max_wmi_svc = (sizeof(svc_id) / sizeof(uint32_t));
+
+		if ((target->wmi_ep_count == 0) ||
+				(target->wmi_ep_count > max_wmi_svc))
+			return A_ERROR;
+
+		/*
+		 * Divide credit among number of endpoints for WMI
+		 */
+		credits = credits / target->wmi_ep_count;
+		for (i = 0; i < target->wmi_ep_count; i++) {
+			status = A_OK;
+			pEntry++;
+			pEntry->service_id = svc_id[i];
+			pEntry->CreditAllocation = credits;
+		}
 	}
 
 	if (A_SUCCESS(status)) {
@@ -1030,3 +1050,30 @@ int htc_pm_runtime_put(HTC_HANDLE htc_handle)
 	return hif_pm_runtime_put(target->hif_dev);
 }
 #endif
+
+/**
+ * htc_set_wmi_endpoint_count: Set number of WMI endpoint
+ * @htc_handle: HTC handle
+ * @wmi_ep_count: WMI enpoint count
+ *
+ * return: None
+ */
+void htc_set_wmi_endpoint_count(HTC_HANDLE htc_handle, uint8_t wmi_ep_count)
+{
+	HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc_handle);
+
+	target->wmi_ep_count = wmi_ep_count;
+}
+
+/**
+ * htc_get_wmi_endpoint_count: Get number of WMI endpoint
+ * @htc_handle: HTC handle
+ *
+ * return: WMI enpoint count
+ */
+uint8_t htc_get_wmi_endpoint_count(HTC_HANDLE htc_handle)
+{
+	HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc_handle);
+
+	return target->wmi_ep_count;
+}

+ 18 - 1
htc/htc_api.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2014, 2016-2017 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -784,4 +784,21 @@ static inline int htc_pm_runtime_put(HTC_HANDLE htc_handle) { return 0; }
 
 void htc_set_async_ep(HTC_HANDLE HTCHandle,
 			HTC_ENDPOINT_ID htc_ep_id, bool value);
+
+/**
+ * htc_set_wmi_endpoint_count: Set number of WMI endpoint
+ * @htc_handle: HTC handle
+ * @wmi_ep_count: WMI enpoint count
+ *
+ * return: None
+ */
+void htc_set_wmi_endpoint_count(HTC_HANDLE htc_handle, uint8_t wmi_ep_count);
+
+/**
+ * htc_get_wmi_endpoint_count: Get number of WMI endpoint
+ * @htc_handle: HTC handle
+ *
+ * return: WMI enpoint count
+ */
+uint8_t  htc_get_wmi_endpoint_count(HTC_HANDLE htc_handle);
 #endif /* _HTC_API_H_ */

+ 8 - 1
htc/htc_internal.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -208,6 +208,13 @@ typedef struct _HTC_TARGET {
 	 * drop it. Besides, nodrop pkts have higher priority than normal pkts.
 	 */
 	A_BOOL is_nodrop_pkt;
+
+	/*
+	 * Number of WMI endpoints used.
+	 * Default value is 1. But it should be overidden after htc_create to
+	 * reflect the actual count.
+	 */
+	uint8_t wmi_ep_count;
 } HTC_TARGET;
 
 #if defined ENABLE_BUNDLE_TX