diff options
| author | David S. Miller <davem@davemloft.net> | 2005-05-19 01:50:10 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2005-05-19 01:50:10 -0400 |
| commit | 59e6b4343299373bc10dd131ab5142f53ddd838a (patch) | |
| tree | 1381e9d661f4ff83e89cb17678ce4813a90c4afb | |
| parent | 15f9850d3c2d46f5851a424d2990a18b5bb5ebfd (diff) | |
[TG3]: Refine DMA boundary setting.
Extract DMA boundary bit selection into a seperate
function, tg3_calc_dma_bndry(). Call this from
tg3_test_dma().
Make DMA test more reliable by using no DMA boundry
setting during the test. If the test passes, then
use the setting we selected before the test.
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Michael Chan <mchan@broadcom.com>
| -rw-r--r-- | drivers/net/tg3.c | 207 |
1 files changed, 163 insertions, 44 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 3df5b78d2693..4ab9680ffbd2 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -8775,6 +8775,146 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) | |||
| 8775 | return 0; | 8775 | return 0; |
| 8776 | } | 8776 | } |
| 8777 | 8777 | ||
| 8778 | #define BOUNDARY_SINGLE_CACHELINE 1 | ||
| 8779 | #define BOUNDARY_MULTI_CACHELINE 2 | ||
| 8780 | |||
| 8781 | static u32 __devinit tg3_calc_dma_bndry(struct tg3 *tp, u32 val) | ||
| 8782 | { | ||
| 8783 | int cacheline_size; | ||
| 8784 | u8 byte; | ||
| 8785 | int goal; | ||
| 8786 | |||
| 8787 | pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte); | ||
| 8788 | if (byte == 0) | ||
| 8789 | cacheline_size = 1024; | ||
| 8790 | else | ||
| 8791 | cacheline_size = (int) byte * 4; | ||
| 8792 | |||
| 8793 | /* On 5703 and later chips, the boundary bits have no | ||
| 8794 | * effect. | ||
| 8795 | */ | ||
| 8796 | if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 && | ||
| 8797 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 && | ||
| 8798 | !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) | ||
| 8799 | goto out; | ||
| 8800 | |||
| 8801 | #if defined(CONFIG_PPC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC) | ||
| 8802 | goal = BOUNDARY_MULTI_CACHELINE; | ||
| 8803 | #else | ||
| 8804 | #if defined(CONFIG_SPARC64) || defined(CONFIG_ALPHA) | ||
| 8805 | goal = BOUNDARY_SINGLE_CACHELINE; | ||
| 8806 | #else | ||
| 8807 | goal = 0; | ||
| 8808 | #endif | ||
| 8809 | #endif | ||
| 8810 | |||
| 8811 | if (!goal) | ||
| 8812 | goto out; | ||
| 8813 | |||
| 8814 | /* PCI controllers on most RISC systems tend to disconnect | ||
| 8815 | * when a device tries to burst across a cache-line boundary. | ||
| 8816 | * Therefore, letting tg3 do so just wastes PCI bandwidth. | ||
| 8817 | * | ||
| 8818 | * Unfortunately, for PCI-E there are only limited | ||
| 8819 | * write-side controls for this, and thus for reads | ||
| 8820 | * we will still get the disconnects. We'll also waste | ||
| 8821 | * these PCI cycles for both read and write for chips | ||
| 8822 | * other than 5700 and 5701 which do not implement the | ||
| 8823 | * boundary bits. | ||
| 8824 | */ | ||
| 8825 | if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) && | ||
| 8826 | !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) { | ||
| 8827 | switch (cacheline_size) { | ||
| 8828 | case 16: | ||
| 8829 | case 32: | ||
| 8830 | case 64: | ||
| 8831 | case 128: | ||
| 8832 | if (goal == BOUNDARY_SINGLE_CACHELINE) { | ||
| 8833 | val |= (DMA_RWCTRL_READ_BNDRY_128_PCIX | | ||
| 8834 | DMA_RWCTRL_WRITE_BNDRY_128_PCIX); | ||
| 8835 | } else { | ||
| 8836 | val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX | | ||
| 8837 | DMA_RWCTRL_WRITE_BNDRY_384_PCIX); | ||
| 8838 | } | ||
| 8839 | break; | ||
| 8840 | |||
| 8841 | case 256: | ||
| 8842 | val |= (DMA_RWCTRL_READ_BNDRY_256_PCIX | | ||
| 8843 | DMA_RWCTRL_WRITE_BNDRY_256_PCIX); | ||
| 8844 | break; | ||
| 8845 | |||
| 8846 | default: | ||
| 8847 | val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX | | ||
| 8848 | DMA_RWCTRL_WRITE_BNDRY_384_PCIX); | ||
| 8849 | break; | ||
| 8850 | }; | ||
| 8851 | } else if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { | ||
| 8852 | switch (cacheline_size) { | ||
| 8853 | case 16: | ||
| 8854 | case 32: | ||
| 8855 | case 64: | ||
| 8856 | if (goal == BOUNDARY_SINGLE_CACHELINE) { | ||
| 8857 | val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE; | ||
| 8858 | val |= DMA_RWCTRL_WRITE_BNDRY_64_PCIE; | ||
| 8859 | break; | ||
| 8860 | } | ||
| 8861 | /* fallthrough */ | ||
| 8862 | case 128: | ||
| 8863 | default: | ||
| 8864 | val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE; | ||
| 8865 | val |= DMA_RWCTRL_WRITE_BNDRY_128_PCIE; | ||
| 8866 | break; | ||
| 8867 | }; | ||
| 8868 | } else { | ||
| 8869 | switch (cacheline_size) { | ||
| 8870 | case 16: | ||
| 8871 | if (goal == BOUNDARY_SINGLE_CACHELINE) { | ||
| 8872 | val |= (DMA_RWCTRL_READ_BNDRY_16 | | ||
| 8873 | DMA_RWCTRL_WRITE_BNDRY_16); | ||
| 8874 | break; | ||
| 8875 | } | ||
| 8876 | /* fallthrough */ | ||
| 8877 | case 32: | ||
| 8878 | if (goal == BOUNDARY_SINGLE_CACHELINE) { | ||
| 8879 | val |= (DMA_RWCTRL_READ_BNDRY_32 | | ||
| 8880 | DMA_RWCTRL_WRITE_BNDRY_32); | ||
| 8881 | break; | ||
| 8882 | } | ||
| 8883 | /* fallthrough */ | ||
| 8884 | case 64: | ||
| 8885 | if (goal == BOUNDARY_SINGLE_CACHELINE) { | ||
| 8886 | val |= (DMA_RWCTRL_READ_BNDRY_64 | | ||
| 8887 | DMA_RWCTRL_WRITE_BNDRY_64); | ||
| 8888 | break; | ||
| 8889 | } | ||
| 8890 | /* fallthrough */ | ||
| 8891 | case 128: | ||
| 8892 | if (goal == BOUNDARY_SINGLE_CACHELINE) { | ||
| 8893 | val |= (DMA_RWCTRL_READ_BNDRY_128 | | ||
| 8894 | DMA_RWCTRL_WRITE_BNDRY_128); | ||
| 8895 | break; | ||
| 8896 | } | ||
| 8897 | /* fallthrough */ | ||
| 8898 | case 256: | ||
| 8899 | val |= (DMA_RWCTRL_READ_BNDRY_256 | | ||
| 8900 | DMA_RWCTRL_WRITE_BNDRY_256); | ||
| 8901 | break; | ||
| 8902 | case 512: | ||
| 8903 | val |= (DMA_RWCTRL_READ_BNDRY_512 | | ||
| 8904 | DMA_RWCTRL_WRITE_BNDRY_512); | ||
| 8905 | break; | ||
| 8906 | case 1024: | ||
| 8907 | default: | ||
| 8908 | val |= (DMA_RWCTRL_READ_BNDRY_1024 | | ||
| 8909 | DMA_RWCTRL_WRITE_BNDRY_1024); | ||
| 8910 | break; | ||
| 8911 | }; | ||
| 8912 | } | ||
| 8913 | |||
| 8914 | out: | ||
| 8915 | return val; | ||
| 8916 | } | ||
| 8917 | |||
| 8778 | static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, int size, int to_device) | 8918 | static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, int size, int to_device) |
| 8779 | { | 8919 | { |
| 8780 | struct tg3_internal_buffer_desc test_desc; | 8920 | struct tg3_internal_buffer_desc test_desc; |
| @@ -8861,7 +9001,7 @@ static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dm | |||
| 8861 | static int __devinit tg3_test_dma(struct tg3 *tp) | 9001 | static int __devinit tg3_test_dma(struct tg3 *tp) |
| 8862 | { | 9002 | { |
| 8863 | dma_addr_t buf_dma; | 9003 | dma_addr_t buf_dma; |
| 8864 | u32 *buf; | 9004 | u32 *buf, saved_dma_rwctrl; |
| 8865 | int ret; | 9005 | int ret; |
| 8866 | 9006 | ||
| 8867 | buf = pci_alloc_consistent(tp->pdev, TEST_BUFFER_SIZE, &buf_dma); | 9007 | buf = pci_alloc_consistent(tp->pdev, TEST_BUFFER_SIZE, &buf_dma); |
| @@ -8873,46 +9013,7 @@ static int __devinit tg3_test_dma(struct tg3 *tp) | |||
| 8873 | tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) | | 9013 | tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) | |
| 8874 | (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT)); | 9014 | (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT)); |
| 8875 | 9015 | ||
| 8876 | #ifndef CONFIG_X86 | 9016 | tp->dma_rwctrl = tg3_calc_dma_bndry(tp, tp->dma_rwctrl); |
| 8877 | { | ||
| 8878 | u8 byte; | ||
| 8879 | int cacheline_size; | ||
| 8880 | pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte); | ||
| 8881 | |||
| 8882 | if (byte == 0) | ||
| 8883 | cacheline_size = 1024; | ||
| 8884 | else | ||
| 8885 | cacheline_size = (int) byte * 4; | ||
| 8886 | |||
| 8887 | switch (cacheline_size) { | ||
| 8888 | case 16: | ||
| 8889 | case 32: | ||
| 8890 | case 64: | ||
| 8891 | case 128: | ||
| 8892 | if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) && | ||
| 8893 | !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) { | ||
| 8894 | tp->dma_rwctrl |= | ||
| 8895 | DMA_RWCTRL_WRITE_BNDRY_384_PCIX; | ||
| 8896 | break; | ||
| 8897 | } else if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { | ||
| 8898 | tp->dma_rwctrl &= | ||
| 8899 | ~(DMA_RWCTRL_PCI_WRITE_CMD); | ||
| 8900 | tp->dma_rwctrl |= | ||
| 8901 | DMA_RWCTRL_WRITE_BNDRY_128_PCIE; | ||
| 8902 | break; | ||
| 8903 | } | ||
| 8904 | /* fallthrough */ | ||
| 8905 | case 256: | ||
| 8906 | if (!(tp->tg3_flags & TG3_FLAG_PCIX_MODE) && | ||
| 8907 | !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) | ||
| 8908 | tp->dma_rwctrl |= | ||
| 8909 | DMA_RWCTRL_WRITE_BNDRY_256; | ||
| 8910 | else if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) | ||
| 8911 | tp->dma_rwctrl |= | ||
| 8912 | DMA_RWCTRL_WRITE_BNDRY_256_PCIX; | ||
| 8913 | }; | ||
| 8914 | } | ||
| 8915 | #endif | ||
| 8916 | 9017 | ||
| 8917 | if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { | 9018 | if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { |
| 8918 | /* DMA read watermark not used on PCIE */ | 9019 | /* DMA read watermark not used on PCIE */ |
| @@ -8931,7 +9032,7 @@ static int __devinit tg3_test_dma(struct tg3 *tp) | |||
| 8931 | if (ccval == 0x6 || ccval == 0x7) | 9032 | if (ccval == 0x6 || ccval == 0x7) |
| 8932 | tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA; | 9033 | tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA; |
| 8933 | 9034 | ||
| 8934 | /* Set bit 23 to renable PCIX hw bug fix */ | 9035 | /* Set bit 23 to enable PCIX hw bug fix */ |
| 8935 | tp->dma_rwctrl |= 0x009f0000; | 9036 | tp->dma_rwctrl |= 0x009f0000; |
| 8936 | } else { | 9037 | } else { |
| 8937 | tp->dma_rwctrl |= 0x001b000f; | 9038 | tp->dma_rwctrl |= 0x001b000f; |
| @@ -8972,6 +9073,13 @@ static int __devinit tg3_test_dma(struct tg3 *tp) | |||
| 8972 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) | 9073 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) |
| 8973 | goto out; | 9074 | goto out; |
| 8974 | 9075 | ||
| 9076 | /* It is best to perform DMA test with maximum write burst size | ||
| 9077 | * to expose the 5700/5701 write DMA bug. | ||
| 9078 | */ | ||
| 9079 | saved_dma_rwctrl = tp->dma_rwctrl; | ||
| 9080 | tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK; | ||
| 9081 | tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); | ||
| 9082 | |||
| 8975 | while (1) { | 9083 | while (1) { |
| 8976 | u32 *p = buf, i; | 9084 | u32 *p = buf, i; |
| 8977 | 9085 | ||
| @@ -9010,8 +9118,9 @@ static int __devinit tg3_test_dma(struct tg3 *tp) | |||
| 9010 | if (p[i] == i) | 9118 | if (p[i] == i) |
| 9011 | continue; | 9119 | continue; |
| 9012 | 9120 | ||
| 9013 | if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) == | 9121 | if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) != |
| 9014 | DMA_RWCTRL_WRITE_BNDRY_DISAB) { | 9122 | DMA_RWCTRL_WRITE_BNDRY_16) { |
| 9123 | tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK; | ||
| 9015 | tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16; | 9124 | tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16; |
| 9016 | tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); | 9125 | tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); |
| 9017 | break; | 9126 | break; |
| @@ -9028,6 +9137,14 @@ static int __devinit tg3_test_dma(struct tg3 *tp) | |||
| 9028 | break; | 9137 | break; |
| 9029 | } | 9138 | } |
| 9030 | } | 9139 | } |
| 9140 | if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) != | ||
| 9141 | DMA_RWCTRL_WRITE_BNDRY_16) { | ||
| 9142 | /* DMA test passed without adjusting DMA boundary, | ||
| 9143 | * just restore the calculated DMA boundary | ||
| 9144 | */ | ||
| 9145 | tp->dma_rwctrl = saved_dma_rwctrl; | ||
| 9146 | tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); | ||
| 9147 | } | ||
| 9031 | 9148 | ||
| 9032 | out: | 9149 | out: |
| 9033 | pci_free_consistent(tp->pdev, TEST_BUFFER_SIZE, buf, buf_dma); | 9150 | pci_free_consistent(tp->pdev, TEST_BUFFER_SIZE, buf, buf_dma); |
| @@ -9429,6 +9546,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
| 9429 | (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) != 0, | 9546 | (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) != 0, |
| 9430 | (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0, | 9547 | (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0, |
| 9431 | (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0); | 9548 | (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0); |
| 9549 | printk(KERN_INFO "%s: dma_rwctrl[%08x]\n", | ||
| 9550 | dev->name, tp->dma_rwctrl); | ||
| 9432 | 9551 | ||
| 9433 | return 0; | 9552 | return 0; |
| 9434 | 9553 | ||
