hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/scsi/mpt3sas/mpt3sas_base.c
....@@ -131,6 +131,9 @@
131131 static void
132132 _base_clear_outstanding_commands(struct MPT3SAS_ADAPTER *ioc);
133133
134
+static u32
135
+_base_readl_ext_retry(const volatile void __iomem *addr);
136
+
134137 /**
135138 * mpt3sas_base_check_cmd_timeout - Function
136139 * to check timeout and command termination due
....@@ -202,6 +205,20 @@
202205 ret_val = readl(addr);
203206 i++;
204207 } while (ret_val == 0 && i < 3);
208
+
209
+ return ret_val;
210
+}
211
+
212
+static u32
213
+_base_readl_ext_retry(const volatile void __iomem *addr)
214
+{
215
+ u32 i, ret_val;
216
+
217
+ for (i = 0 ; i < 30 ; i++) {
218
+ ret_val = readl(addr);
219
+ if (ret_val == 0)
220
+ continue;
221
+ }
205222
206223 return ret_val;
207224 }
....@@ -861,7 +878,7 @@
861878
862879 dump_stack();
863880
864
- doorbell = ioc->base_readl(&ioc->chip->Doorbell);
881
+ doorbell = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
865882 if ((doorbell & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
866883 mpt3sas_print_fault_code(ioc, doorbell &
867884 MPI2_DOORBELL_DATA_MASK);
....@@ -2822,19 +2839,25 @@
28222839 _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev)
28232840 {
28242841 struct sysinfo s;
2842
+ u64 coherent_dma_mask, dma_mask;
28252843
2826
- if (ioc->is_mcpu_endpoint ||
2827
- sizeof(dma_addr_t) == 4 || ioc->use_32bit_dma ||
2828
- dma_get_required_mask(&pdev->dev) <= DMA_BIT_MASK(32))
2844
+ if (ioc->is_mcpu_endpoint || sizeof(dma_addr_t) == 4) {
28292845 ioc->dma_mask = 32;
2846
+ coherent_dma_mask = dma_mask = DMA_BIT_MASK(32);
28302847 /* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */
2831
- else if (ioc->hba_mpi_version_belonged > MPI2_VERSION)
2848
+ } else if (ioc->hba_mpi_version_belonged > MPI2_VERSION) {
28322849 ioc->dma_mask = 63;
2833
- else
2850
+ coherent_dma_mask = dma_mask = DMA_BIT_MASK(63);
2851
+ } else {
28342852 ioc->dma_mask = 64;
2853
+ coherent_dma_mask = dma_mask = DMA_BIT_MASK(64);
2854
+ }
28352855
2836
- if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(ioc->dma_mask)) ||
2837
- dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(ioc->dma_mask)))
2856
+ if (ioc->use_32bit_dma)
2857
+ coherent_dma_mask = DMA_BIT_MASK(32);
2858
+
2859
+ if (dma_set_mask(&pdev->dev, dma_mask) ||
2860
+ dma_set_coherent_mask(&pdev->dev, coherent_dma_mask))
28382861 return -ENODEV;
28392862
28402863 if (ioc->dma_mask > 32) {
....@@ -4905,6 +4928,9 @@
49054928 }
49064929 dma_pool_destroy(ioc->pcie_sgl_dma_pool);
49074930 }
4931
+ kfree(ioc->pcie_sg_lookup);
4932
+ ioc->pcie_sg_lookup = NULL;
4933
+
49084934 if (ioc->config_page) {
49094935 dexitprintk(ioc,
49104936 ioc_info(ioc, "config_page(0x%p): free\n",
....@@ -5658,7 +5684,7 @@
56585684 {
56595685 u32 s, sc;
56605686
5661
- s = ioc->base_readl(&ioc->chip->Doorbell);
5687
+ s = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
56625688 sc = s & MPI2_IOC_STATE_MASK;
56635689 return cooked ? sc : s;
56645690 }
....@@ -5803,7 +5829,7 @@
58035829 __func__, count, timeout));
58045830 return 0;
58055831 } else if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) {
5806
- doorbell = ioc->base_readl(&ioc->chip->Doorbell);
5832
+ doorbell = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
58075833 if ((doorbell & MPI2_IOC_STATE_MASK) ==
58085834 MPI2_IOC_STATE_FAULT) {
58095835 mpt3sas_print_fault_code(ioc, doorbell);
....@@ -5843,7 +5869,7 @@
58435869 count = 0;
58445870 cntdn = 1000 * timeout;
58455871 do {
5846
- doorbell_reg = ioc->base_readl(&ioc->chip->Doorbell);
5872
+ doorbell_reg = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
58475873 if (!(doorbell_reg & MPI2_DOORBELL_USED)) {
58485874 dhsprintk(ioc,
58495875 ioc_info(ioc, "%s: successful count(%d), timeout(%d)\n",
....@@ -5980,7 +6006,7 @@
59806006 __le32 *mfp;
59816007
59826008 /* make sure doorbell is not in use */
5983
- if ((ioc->base_readl(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
6009
+ if ((ioc->base_readl_ext_retry(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
59846010 ioc_err(ioc, "doorbell is in use (line=%d)\n", __LINE__);
59856011 return -EFAULT;
59866012 }
....@@ -6029,7 +6055,7 @@
60296055 }
60306056
60316057 /* read the first two 16-bits, it gives the total length of the reply */
6032
- reply[0] = le16_to_cpu(ioc->base_readl(&ioc->chip->Doorbell)
6058
+ reply[0] = le16_to_cpu(ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
60336059 & MPI2_DOORBELL_DATA_MASK);
60346060 writel(0, &ioc->chip->HostInterruptStatus);
60356061 if ((_base_wait_for_doorbell_int(ioc, 5))) {
....@@ -6037,7 +6063,7 @@
60376063 __LINE__);
60386064 return -EFAULT;
60396065 }
6040
- reply[1] = le16_to_cpu(ioc->base_readl(&ioc->chip->Doorbell)
6066
+ reply[1] = le16_to_cpu(ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
60416067 & MPI2_DOORBELL_DATA_MASK);
60426068 writel(0, &ioc->chip->HostInterruptStatus);
60436069
....@@ -6048,10 +6074,10 @@
60486074 return -EFAULT;
60496075 }
60506076 if (i >= reply_bytes/2) /* overflow case */
6051
- ioc->base_readl(&ioc->chip->Doorbell);
6077
+ ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
60526078 else
60536079 reply[i] = le16_to_cpu(
6054
- ioc->base_readl(&ioc->chip->Doorbell)
6080
+ ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
60556081 & MPI2_DOORBELL_DATA_MASK);
60566082 writel(0, &ioc->chip->HostInterruptStatus);
60576083 }
....@@ -6897,7 +6923,7 @@
68976923 goto out;
68986924 }
68996925
6900
- host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic);
6926
+ host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic);
69016927 drsprintk(ioc,
69026928 ioc_info(ioc, "wrote magic sequence: count(%d), host_diagnostic(0x%08x)\n",
69036929 count, host_diagnostic));
....@@ -6917,7 +6943,7 @@
69176943 for (count = 0; count < (300000000 /
69186944 MPI2_HARD_RESET_PCIE_SECOND_READ_DELAY_MICRO_SEC); count++) {
69196945
6920
- host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic);
6946
+ host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic);
69216947
69226948 if (host_diagnostic == 0xFFFFFFFF) {
69236949 ioc_info(ioc,
....@@ -7304,10 +7330,13 @@
73047330 ioc->rdpq_array_enable_assigned = 0;
73057331 ioc->use_32bit_dma = false;
73067332 ioc->dma_mask = 64;
7307
- if (ioc->is_aero_ioc)
7333
+ if (ioc->is_aero_ioc) {
73087334 ioc->base_readl = &_base_readl_aero;
7309
- else
7335
+ ioc->base_readl_ext_retry = &_base_readl_ext_retry;
7336
+ } else {
73107337 ioc->base_readl = &_base_readl;
7338
+ ioc->base_readl_ext_retry = &_base_readl;
7339
+ }
73117340 r = mpt3sas_base_map_resources(ioc);
73127341 if (r)
73137342 goto out_free_resources;