wifi: iwlwifi: pcie: point invalid TFDs to invalid data
[platform/kernel/linux-starfive.git] / drivers / net / wireless / intel / iwlwifi / pcie / trans.c
index 3e988da..198933f 100644 (file)
@@ -2018,6 +2018,30 @@ void iwl_trans_pcie_free_pnvm_dram_regions(struct iwl_dram_regions *dram_regions
        memset(desc_dram, 0, sizeof(*desc_dram));
 }
 
+static void iwl_pcie_free_invalid_tx_cmd(struct iwl_trans *trans)
+{
+       iwl_pcie_free_dma_ptr(trans, &trans->invalid_tx_cmd);
+}
+
+static int iwl_pcie_alloc_invalid_tx_cmd(struct iwl_trans *trans)
+{
+       struct iwl_cmd_header_wide bad_cmd = {
+               .cmd = INVALID_WR_PTR_CMD,
+               .group_id = DEBUG_GROUP,
+               .sequence = cpu_to_le16(0xffff),
+               .length = cpu_to_le16(0),
+               .version = 0,
+       };
+       int ret;
+
+       ret = iwl_pcie_alloc_dma_ptr(trans, &trans->invalid_tx_cmd,
+                                    sizeof(bad_cmd));
+       if (ret)
+               return ret;
+       memcpy(trans->invalid_tx_cmd.addr, &bad_cmd, sizeof(bad_cmd));
+       return 0;
+}
+
 void iwl_trans_pcie_free(struct iwl_trans *trans)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
@@ -2048,6 +2072,8 @@ void iwl_trans_pcie_free(struct iwl_trans *trans)
                iwl_pcie_free_ict(trans);
        }
 
+       iwl_pcie_free_invalid_tx_cmd(trans);
+
        iwl_pcie_free_fw_monitor(trans);
 
        iwl_trans_pcie_free_pnvm_dram_regions(&trans_pcie->pnvm_data,
@@ -3617,8 +3643,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
                                       PCIE_LINK_STATE_CLKPM);
        }
 
-       trans_pcie->def_rx_queue = 0;
-
        pci_set_master(pdev);
 
        addr_size = trans->txqs.tfd.addr_size;
@@ -3686,6 +3710,9 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
 
        init_waitqueue_head(&trans_pcie->sx_waitq);
 
+       ret = iwl_pcie_alloc_invalid_tx_cmd(trans);
+       if (ret)
+               goto out_no_pci;
 
        if (trans_pcie->msix_enabled) {
                ret = iwl_pcie_init_msix_handler(pdev, trans_pcie);