|
@@ -57,12 +57,6 @@ MODULE_PARM_DESC(reset_mode, "0: auto, 1: warm only (default: 0)");
|
|
|
#define ATH10K_PCI_TARGET_WAIT 3000
|
|
|
#define ATH10K_PCI_NUM_WARM_RESET_ATTEMPTS 3
|
|
|
|
|
|
-#define QCA988X_2_0_DEVICE_ID (0x003c)
|
|
|
-#define QCA6164_2_1_DEVICE_ID (0x0041)
|
|
|
-#define QCA6174_2_1_DEVICE_ID (0x003e)
|
|
|
-#define QCA99X0_2_0_DEVICE_ID (0x0040)
|
|
|
-#define QCA9377_1_0_DEVICE_ID (0x0042)
|
|
|
-
|
|
|
static const struct pci_device_id ath10k_pci_id_table[] = {
|
|
|
{ PCI_VDEVICE(ATHEROS, QCA988X_2_0_DEVICE_ID) }, /* PCI-E QCA988X V2 */
|
|
|
{ PCI_VDEVICE(ATHEROS, QCA6164_2_1_DEVICE_ID) }, /* PCI-E QCA6164 V2.1 */
|
|
@@ -92,7 +86,9 @@ static const struct ath10k_pci_supp_chip ath10k_pci_supp_chips[] = {
|
|
|
{ QCA6174_2_1_DEVICE_ID, QCA6174_HW_3_2_CHIP_ID_REV },
|
|
|
|
|
|
{ QCA99X0_2_0_DEVICE_ID, QCA99X0_HW_2_0_CHIP_ID_REV },
|
|
|
+
|
|
|
{ QCA9377_1_0_DEVICE_ID, QCA9377_HW_1_0_CHIP_ID_REV },
|
|
|
+ { QCA9377_1_0_DEVICE_ID, QCA9377_HW_1_1_CHIP_ID_REV },
|
|
|
};
|
|
|
|
|
|
static void ath10k_pci_buffer_cleanup(struct ath10k *ar);
|
|
@@ -111,8 +107,9 @@ static void ath10k_pci_htc_tx_cb(struct ath10k_ce_pipe *ce_state);
|
|
|
static void ath10k_pci_htc_rx_cb(struct ath10k_ce_pipe *ce_state);
|
|
|
static void ath10k_pci_htt_tx_cb(struct ath10k_ce_pipe *ce_state);
|
|
|
static void ath10k_pci_htt_rx_cb(struct ath10k_ce_pipe *ce_state);
|
|
|
+static void ath10k_pci_htt_htc_rx_cb(struct ath10k_ce_pipe *ce_state);
|
|
|
|
|
|
-static const struct ce_attr host_ce_config_wlan[] = {
|
|
|
+static struct ce_attr host_ce_config_wlan[] = {
|
|
|
/* CE0: host->target HTC control and raw streams */
|
|
|
{
|
|
|
.flags = CE_ATTR_FLAGS,
|
|
@@ -128,7 +125,7 @@ static const struct ce_attr host_ce_config_wlan[] = {
|
|
|
.src_nentries = 0,
|
|
|
.src_sz_max = 2048,
|
|
|
.dest_nentries = 512,
|
|
|
- .recv_cb = ath10k_pci_htc_rx_cb,
|
|
|
+ .recv_cb = ath10k_pci_htt_htc_rx_cb,
|
|
|
},
|
|
|
|
|
|
/* CE2: target->host WMI */
|
|
@@ -217,7 +214,7 @@ static const struct ce_attr host_ce_config_wlan[] = {
|
|
|
};
|
|
|
|
|
|
/* Target firmware's Copy Engine configuration. */
|
|
|
-static const struct ce_pipe_config target_ce_config_wlan[] = {
|
|
|
+static struct ce_pipe_config target_ce_config_wlan[] = {
|
|
|
/* CE0: host->target HTC control and raw streams */
|
|
|
{
|
|
|
.pipenum = __cpu_to_le32(0),
|
|
@@ -330,7 +327,7 @@ static const struct ce_pipe_config target_ce_config_wlan[] = {
|
|
|
* This table is derived from the CE_PCI TABLE, above.
|
|
|
* It is passed to the Target at startup for use by firmware.
|
|
|
*/
|
|
|
-static const struct service_to_pipe target_service_to_ce_map_wlan[] = {
|
|
|
+static struct service_to_pipe target_service_to_ce_map_wlan[] = {
|
|
|
{
|
|
|
__cpu_to_le32(ATH10K_HTC_SVC_ID_WMI_DATA_VO),
|
|
|
__cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
|
|
@@ -1208,6 +1205,16 @@ static void ath10k_pci_htc_rx_cb(struct ath10k_ce_pipe *ce_state)
|
|
|
ath10k_pci_process_rx_cb(ce_state, ath10k_htc_rx_completion_handler);
|
|
|
}
|
|
|
|
|
|
+static void ath10k_pci_htt_htc_rx_cb(struct ath10k_ce_pipe *ce_state)
|
|
|
+{
|
|
|
+ /* CE4 polling needs to be done whenever CE pipe which transports
|
|
|
+ * HTT Rx (target->host) is processed.
|
|
|
+ */
|
|
|
+ ath10k_ce_per_engine_service(ce_state->ar, 4);
|
|
|
+
|
|
|
+ ath10k_pci_process_rx_cb(ce_state, ath10k_htc_rx_completion_handler);
|
|
|
+}
|
|
|
+
|
|
|
/* Called by lower (CE) layer when a send to HTT Target completes. */
|
|
|
static void ath10k_pci_htt_tx_cb(struct ath10k_ce_pipe *ce_state)
|
|
|
{
|
|
@@ -2027,6 +2034,29 @@ static int ath10k_pci_init_config(struct ath10k *ar)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void ath10k_pci_override_ce_config(struct ath10k *ar)
|
|
|
+{
|
|
|
+ struct ce_attr *attr;
|
|
|
+ struct ce_pipe_config *config;
|
|
|
+
|
|
|
+ /* For QCA6174 we're overriding the Copy Engine 5 configuration,
|
|
|
+ * since it is currently used for other feature.
|
|
|
+ */
|
|
|
+
|
|
|
+ /* Override Host's Copy Engine 5 configuration */
|
|
|
+ attr = &host_ce_config_wlan[5];
|
|
|
+ attr->src_sz_max = 0;
|
|
|
+ attr->dest_nentries = 0;
|
|
|
+
|
|
|
+ /* Override Target firmware's Copy Engine configuration */
|
|
|
+ config = &target_ce_config_wlan[5];
|
|
|
+ config->pipedir = __cpu_to_le32(PIPEDIR_OUT);
|
|
|
+ config->nbytes_max = __cpu_to_le32(2048);
|
|
|
+
|
|
|
+ /* Map from service/endpoint to Copy Engine */
|
|
|
+ target_service_to_ce_map_wlan[15].pipenum = __cpu_to_le32(1);
|
|
|
+}
|
|
|
+
|
|
|
static int ath10k_pci_alloc_pipes(struct ath10k *ar)
|
|
|
{
|
|
|
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
|
@@ -3020,6 +3050,9 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
|
|
goto err_core_destroy;
|
|
|
}
|
|
|
|
|
|
+ if (QCA_REV_6174(ar))
|
|
|
+ ath10k_pci_override_ce_config(ar);
|
|
|
+
|
|
|
ret = ath10k_pci_alloc_pipes(ar);
|
|
|
if (ret) {
|
|
|
ath10k_err(ar, "failed to allocate copy engine pipes: %d\n",
|