|
@@ -2293,16 +2293,20 @@ static int ath10k_pci_warm_reset(struct ath10k *ar)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int ath10k_pci_qca99x0_soft_chip_reset(struct ath10k *ar)
|
|
|
+{
|
|
|
+ ath10k_pci_irq_disable(ar);
|
|
|
+ return ath10k_pci_qca99x0_chip_reset(ar);
|
|
|
+}
|
|
|
+
|
|
|
static int ath10k_pci_safe_chip_reset(struct ath10k *ar)
|
|
|
{
|
|
|
- if (QCA_REV_988X(ar) || QCA_REV_6174(ar)) {
|
|
|
- return ath10k_pci_warm_reset(ar);
|
|
|
- } else if (QCA_REV_99X0(ar)) {
|
|
|
- ath10k_pci_irq_disable(ar);
|
|
|
- return ath10k_pci_qca99x0_chip_reset(ar);
|
|
|
- } else {
|
|
|
+ struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
|
|
+
|
|
|
+ if (!ar_pci->pci_soft_reset)
|
|
|
return -ENOTSUPP;
|
|
|
- }
|
|
|
+
|
|
|
+ return ar_pci->pci_soft_reset(ar);
|
|
|
}
|
|
|
|
|
|
static int ath10k_pci_qca988x_chip_reset(struct ath10k *ar)
|
|
@@ -2437,16 +2441,12 @@ static int ath10k_pci_qca99x0_chip_reset(struct ath10k *ar)
|
|
|
|
|
|
static int ath10k_pci_chip_reset(struct ath10k *ar)
|
|
|
{
|
|
|
- if (QCA_REV_988X(ar))
|
|
|
- return ath10k_pci_qca988x_chip_reset(ar);
|
|
|
- else if (QCA_REV_6174(ar))
|
|
|
- return ath10k_pci_qca6174_chip_reset(ar);
|
|
|
- else if (QCA_REV_9377(ar))
|
|
|
- return ath10k_pci_qca6174_chip_reset(ar);
|
|
|
- else if (QCA_REV_99X0(ar))
|
|
|
- return ath10k_pci_qca99x0_chip_reset(ar);
|
|
|
- else
|
|
|
+ struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
|
|
+
|
|
|
+ if (WARN_ON(!ar_pci->pci_hard_reset))
|
|
|
return -ENOTSUPP;
|
|
|
+
|
|
|
+ return ar_pci->pci_hard_reset(ar);
|
|
|
}
|
|
|
|
|
|
static int ath10k_pci_hif_power_up(struct ath10k *ar)
|
|
@@ -2976,24 +2976,34 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
|
|
enum ath10k_hw_rev hw_rev;
|
|
|
u32 chip_id;
|
|
|
bool pci_ps;
|
|
|
+ int (*pci_soft_reset)(struct ath10k *ar);
|
|
|
+ int (*pci_hard_reset)(struct ath10k *ar);
|
|
|
|
|
|
switch (pci_dev->device) {
|
|
|
case QCA988X_2_0_DEVICE_ID:
|
|
|
hw_rev = ATH10K_HW_QCA988X;
|
|
|
pci_ps = false;
|
|
|
+ pci_soft_reset = ath10k_pci_warm_reset;
|
|
|
+ pci_hard_reset = ath10k_pci_qca988x_chip_reset;
|
|
|
break;
|
|
|
case QCA6164_2_1_DEVICE_ID:
|
|
|
case QCA6174_2_1_DEVICE_ID:
|
|
|
hw_rev = ATH10K_HW_QCA6174;
|
|
|
pci_ps = true;
|
|
|
+ pci_soft_reset = ath10k_pci_warm_reset;
|
|
|
+ pci_hard_reset = ath10k_pci_qca6174_chip_reset;
|
|
|
break;
|
|
|
case QCA99X0_2_0_DEVICE_ID:
|
|
|
hw_rev = ATH10K_HW_QCA99X0;
|
|
|
pci_ps = false;
|
|
|
+ pci_soft_reset = ath10k_pci_qca99x0_soft_chip_reset;
|
|
|
+ pci_hard_reset = ath10k_pci_qca99x0_chip_reset;
|
|
|
break;
|
|
|
case QCA9377_1_0_DEVICE_ID:
|
|
|
hw_rev = ATH10K_HW_QCA9377;
|
|
|
pci_ps = true;
|
|
|
+ pci_soft_reset = NULL;
|
|
|
+ pci_hard_reset = ath10k_pci_qca6174_chip_reset;
|
|
|
break;
|
|
|
default:
|
|
|
WARN_ON(1);
|
|
@@ -3018,6 +3028,8 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
|
|
ar->dev_id = pci_dev->device;
|
|
|
ar_pci->pci_ps = pci_ps;
|
|
|
ar_pci->bus_ops = &ath10k_pci_bus_ops;
|
|
|
+ ar_pci->pci_soft_reset = pci_soft_reset;
|
|
|
+ ar_pci->pci_hard_reset = pci_hard_reset;
|
|
|
|
|
|
ar->id.vendor = pdev->vendor;
|
|
|
ar->id.device = pdev->device;
|