.. | .. |
---|
131 | 131 | static void |
---|
132 | 132 | _base_clear_outstanding_commands(struct MPT3SAS_ADAPTER *ioc); |
---|
133 | 133 | |
---|
| 134 | +static u32 |
---|
| 135 | +_base_readl_ext_retry(const volatile void __iomem *addr); |
---|
| 136 | + |
---|
134 | 137 | /** |
---|
135 | 138 | * mpt3sas_base_check_cmd_timeout - Function |
---|
136 | 139 | * to check timeout and command termination due |
---|
.. | .. |
---|
202 | 205 | ret_val = readl(addr); |
---|
203 | 206 | i++; |
---|
204 | 207 | } 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 | + } |
---|
205 | 222 | |
---|
206 | 223 | return ret_val; |
---|
207 | 224 | } |
---|
.. | .. |
---|
861 | 878 | |
---|
862 | 879 | dump_stack(); |
---|
863 | 880 | |
---|
864 | | - doorbell = ioc->base_readl(&ioc->chip->Doorbell); |
---|
| 881 | + doorbell = ioc->base_readl_ext_retry(&ioc->chip->Doorbell); |
---|
865 | 882 | if ((doorbell & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) { |
---|
866 | 883 | mpt3sas_print_fault_code(ioc, doorbell & |
---|
867 | 884 | MPI2_DOORBELL_DATA_MASK); |
---|
.. | .. |
---|
2822 | 2839 | _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev) |
---|
2823 | 2840 | { |
---|
2824 | 2841 | struct sysinfo s; |
---|
| 2842 | + u64 coherent_dma_mask, dma_mask; |
---|
2825 | 2843 | |
---|
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) { |
---|
2829 | 2845 | ioc->dma_mask = 32; |
---|
| 2846 | + coherent_dma_mask = dma_mask = DMA_BIT_MASK(32); |
---|
2830 | 2847 | /* 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) { |
---|
2832 | 2849 | ioc->dma_mask = 63; |
---|
2833 | | - else |
---|
| 2850 | + coherent_dma_mask = dma_mask = DMA_BIT_MASK(63); |
---|
| 2851 | + } else { |
---|
2834 | 2852 | ioc->dma_mask = 64; |
---|
| 2853 | + coherent_dma_mask = dma_mask = DMA_BIT_MASK(64); |
---|
| 2854 | + } |
---|
2835 | 2855 | |
---|
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)) |
---|
2838 | 2861 | return -ENODEV; |
---|
2839 | 2862 | |
---|
2840 | 2863 | if (ioc->dma_mask > 32) { |
---|
.. | .. |
---|
4905 | 4928 | } |
---|
4906 | 4929 | dma_pool_destroy(ioc->pcie_sgl_dma_pool); |
---|
4907 | 4930 | } |
---|
| 4931 | + kfree(ioc->pcie_sg_lookup); |
---|
| 4932 | + ioc->pcie_sg_lookup = NULL; |
---|
| 4933 | + |
---|
4908 | 4934 | if (ioc->config_page) { |
---|
4909 | 4935 | dexitprintk(ioc, |
---|
4910 | 4936 | ioc_info(ioc, "config_page(0x%p): free\n", |
---|
.. | .. |
---|
5658 | 5684 | { |
---|
5659 | 5685 | u32 s, sc; |
---|
5660 | 5686 | |
---|
5661 | | - s = ioc->base_readl(&ioc->chip->Doorbell); |
---|
| 5687 | + s = ioc->base_readl_ext_retry(&ioc->chip->Doorbell); |
---|
5662 | 5688 | sc = s & MPI2_IOC_STATE_MASK; |
---|
5663 | 5689 | return cooked ? sc : s; |
---|
5664 | 5690 | } |
---|
.. | .. |
---|
5803 | 5829 | __func__, count, timeout)); |
---|
5804 | 5830 | return 0; |
---|
5805 | 5831 | } 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); |
---|
5807 | 5833 | if ((doorbell & MPI2_IOC_STATE_MASK) == |
---|
5808 | 5834 | MPI2_IOC_STATE_FAULT) { |
---|
5809 | 5835 | mpt3sas_print_fault_code(ioc, doorbell); |
---|
.. | .. |
---|
5843 | 5869 | count = 0; |
---|
5844 | 5870 | cntdn = 1000 * timeout; |
---|
5845 | 5871 | do { |
---|
5846 | | - doorbell_reg = ioc->base_readl(&ioc->chip->Doorbell); |
---|
| 5872 | + doorbell_reg = ioc->base_readl_ext_retry(&ioc->chip->Doorbell); |
---|
5847 | 5873 | if (!(doorbell_reg & MPI2_DOORBELL_USED)) { |
---|
5848 | 5874 | dhsprintk(ioc, |
---|
5849 | 5875 | ioc_info(ioc, "%s: successful count(%d), timeout(%d)\n", |
---|
.. | .. |
---|
5980 | 6006 | __le32 *mfp; |
---|
5981 | 6007 | |
---|
5982 | 6008 | /* 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)) { |
---|
5984 | 6010 | ioc_err(ioc, "doorbell is in use (line=%d)\n", __LINE__); |
---|
5985 | 6011 | return -EFAULT; |
---|
5986 | 6012 | } |
---|
.. | .. |
---|
6029 | 6055 | } |
---|
6030 | 6056 | |
---|
6031 | 6057 | /* 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) |
---|
6033 | 6059 | & MPI2_DOORBELL_DATA_MASK); |
---|
6034 | 6060 | writel(0, &ioc->chip->HostInterruptStatus); |
---|
6035 | 6061 | if ((_base_wait_for_doorbell_int(ioc, 5))) { |
---|
.. | .. |
---|
6037 | 6063 | __LINE__); |
---|
6038 | 6064 | return -EFAULT; |
---|
6039 | 6065 | } |
---|
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) |
---|
6041 | 6067 | & MPI2_DOORBELL_DATA_MASK); |
---|
6042 | 6068 | writel(0, &ioc->chip->HostInterruptStatus); |
---|
6043 | 6069 | |
---|
.. | .. |
---|
6048 | 6074 | return -EFAULT; |
---|
6049 | 6075 | } |
---|
6050 | 6076 | if (i >= reply_bytes/2) /* overflow case */ |
---|
6051 | | - ioc->base_readl(&ioc->chip->Doorbell); |
---|
| 6077 | + ioc->base_readl_ext_retry(&ioc->chip->Doorbell); |
---|
6052 | 6078 | else |
---|
6053 | 6079 | reply[i] = le16_to_cpu( |
---|
6054 | | - ioc->base_readl(&ioc->chip->Doorbell) |
---|
| 6080 | + ioc->base_readl_ext_retry(&ioc->chip->Doorbell) |
---|
6055 | 6081 | & MPI2_DOORBELL_DATA_MASK); |
---|
6056 | 6082 | writel(0, &ioc->chip->HostInterruptStatus); |
---|
6057 | 6083 | } |
---|
.. | .. |
---|
6897 | 6923 | goto out; |
---|
6898 | 6924 | } |
---|
6899 | 6925 | |
---|
6900 | | - host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic); |
---|
| 6926 | + host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic); |
---|
6901 | 6927 | drsprintk(ioc, |
---|
6902 | 6928 | ioc_info(ioc, "wrote magic sequence: count(%d), host_diagnostic(0x%08x)\n", |
---|
6903 | 6929 | count, host_diagnostic)); |
---|
.. | .. |
---|
6917 | 6943 | for (count = 0; count < (300000000 / |
---|
6918 | 6944 | MPI2_HARD_RESET_PCIE_SECOND_READ_DELAY_MICRO_SEC); count++) { |
---|
6919 | 6945 | |
---|
6920 | | - host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic); |
---|
| 6946 | + host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic); |
---|
6921 | 6947 | |
---|
6922 | 6948 | if (host_diagnostic == 0xFFFFFFFF) { |
---|
6923 | 6949 | ioc_info(ioc, |
---|
.. | .. |
---|
7304 | 7330 | ioc->rdpq_array_enable_assigned = 0; |
---|
7305 | 7331 | ioc->use_32bit_dma = false; |
---|
7306 | 7332 | ioc->dma_mask = 64; |
---|
7307 | | - if (ioc->is_aero_ioc) |
---|
| 7333 | + if (ioc->is_aero_ioc) { |
---|
7308 | 7334 | ioc->base_readl = &_base_readl_aero; |
---|
7309 | | - else |
---|
| 7335 | + ioc->base_readl_ext_retry = &_base_readl_ext_retry; |
---|
| 7336 | + } else { |
---|
7310 | 7337 | ioc->base_readl = &_base_readl; |
---|
| 7338 | + ioc->base_readl_ext_retry = &_base_readl; |
---|
| 7339 | + } |
---|
7311 | 7340 | r = mpt3sas_base_map_resources(ioc); |
---|
7312 | 7341 | if (r) |
---|
7313 | 7342 | goto out_free_resources; |
---|