diff options
-rw-r--r-- | drivers/net/ns83820.c | 69 |
1 files changed, 29 insertions, 40 deletions
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index 2fcc181a8624..c336b46bd332 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c | |||
@@ -1,4 +1,4 @@ | |||
1 | #define _VERSION "0.20" | 1 | #define VERSION "0.22" |
2 | /* ns83820.c by Benjamin LaHaise with contributions. | 2 | /* ns83820.c by Benjamin LaHaise with contributions. |
3 | * | 3 | * |
4 | * Questions/comments/discussion to linux-ns83820@kvack.org. | 4 | * Questions/comments/discussion to linux-ns83820@kvack.org. |
@@ -63,9 +63,11 @@ | |||
63 | * - fix missed txok introduced during performance | 63 | * - fix missed txok introduced during performance |
64 | * tuning | 64 | * tuning |
65 | * 0.20 - fix stupid RFEN thinko. i am such a smurf. | 65 | * 0.20 - fix stupid RFEN thinko. i am such a smurf. |
66 | * | ||
67 | * 20040828 0.21 - add hardware vlan accleration | 66 | * 20040828 0.21 - add hardware vlan accleration |
68 | * by Neil Horman <nhorman@redhat.com> | 67 | * by Neil Horman <nhorman@redhat.com> |
68 | * 20050406 0.22 - improved DAC ifdefs from Andi Kleen | ||
69 | * - removal of dead code from Adrian Bunk | ||
70 | * - fix half duplex collision behaviour | ||
69 | * Driver Overview | 71 | * Driver Overview |
70 | * =============== | 72 | * =============== |
71 | * | 73 | * |
@@ -129,18 +131,6 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */ | |||
129 | #undef Dprintk | 131 | #undef Dprintk |
130 | #define Dprintk dprintk | 132 | #define Dprintk dprintk |
131 | 133 | ||
132 | #if defined(CONFIG_HIGHMEM64G) || defined(__ia64__) | ||
133 | #define USE_64BIT_ADDR "+" | ||
134 | #endif | ||
135 | |||
136 | #if defined(USE_64BIT_ADDR) | ||
137 | #define VERSION _VERSION USE_64BIT_ADDR | ||
138 | #define TRY_DAC 1 | ||
139 | #else | ||
140 | #define VERSION _VERSION | ||
141 | #define TRY_DAC 0 | ||
142 | #endif | ||
143 | |||
144 | /* tunables */ | 134 | /* tunables */ |
145 | #define RX_BUF_SIZE 1500 /* 8192 */ | 135 | #define RX_BUF_SIZE 1500 /* 8192 */ |
146 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | 136 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
@@ -386,22 +376,16 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */ | |||
386 | #define LINK_DOWN 0x02 | 376 | #define LINK_DOWN 0x02 |
387 | #define LINK_UP 0x04 | 377 | #define LINK_UP 0x04 |
388 | 378 | ||
389 | #ifdef USE_64BIT_ADDR | 379 | #define HW_ADDR_LEN sizeof(dma_addr_t) |
390 | #define HW_ADDR_LEN 8 | ||
391 | #define desc_addr_set(desc, addr) \ | 380 | #define desc_addr_set(desc, addr) \ |
392 | do { \ | 381 | do { \ |
393 | u64 __addr = (addr); \ | 382 | ((desc)[0] = cpu_to_le32(addr)); \ |
394 | (desc)[0] = cpu_to_le32(__addr); \ | 383 | if (HW_ADDR_LEN == 8) \ |
395 | (desc)[1] = cpu_to_le32(__addr >> 32); \ | 384 | (desc)[1] = cpu_to_le32(((u64)addr) >> 32); \ |
396 | } while(0) | 385 | } while(0) |
397 | #define desc_addr_get(desc) \ | 386 | #define desc_addr_get(desc) \ |
398 | (((u64)le32_to_cpu((desc)[1]) << 32) \ | 387 | (le32_to_cpu((desc)[0]) | \ |
399 | | le32_to_cpu((desc)[0])) | 388 | (HW_ADDR_LEN == 8 ? ((dma_addr_t)le32_to_cpu((desc)[1]))<<32 : 0)) |
400 | #else | ||
401 | #define HW_ADDR_LEN 4 | ||
402 | #define desc_addr_set(desc, addr) ((desc)[0] = cpu_to_le32(addr)) | ||
403 | #define desc_addr_get(desc) (le32_to_cpu((desc)[0])) | ||
404 | #endif | ||
405 | 389 | ||
406 | #define DESC_LINK 0 | 390 | #define DESC_LINK 0 |
407 | #define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4) | 391 | #define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4) |
@@ -727,11 +711,23 @@ static void fastcall phy_intr(struct net_device *ndev) | |||
727 | speed = ((cfg / CFG_SPDSTS0) & 3); | 711 | speed = ((cfg / CFG_SPDSTS0) & 3); |
728 | fullduplex = (cfg & CFG_DUPSTS); | 712 | fullduplex = (cfg & CFG_DUPSTS); |
729 | 713 | ||
730 | if (fullduplex) | 714 | if (fullduplex) { |
731 | new_cfg |= CFG_SB; | 715 | new_cfg |= CFG_SB; |
716 | writel(readl(dev->base + TXCFG) | ||
717 | | TXCFG_CSI | TXCFG_HBI, | ||
718 | dev->base + TXCFG); | ||
719 | writel(readl(dev->base + RXCFG) | RXCFG_RX_FD, | ||
720 | dev->base + RXCFG); | ||
721 | } else { | ||
722 | writel(readl(dev->base + TXCFG) | ||
723 | & ~(TXCFG_CSI | TXCFG_HBI), | ||
724 | dev->base + TXCFG); | ||
725 | writel(readl(dev->base + RXCFG) & ~(RXCFG_RX_FD), | ||
726 | dev->base + RXCFG); | ||
727 | } | ||
732 | 728 | ||
733 | if ((cfg & CFG_LNKSTS) && | 729 | if ((cfg & CFG_LNKSTS) && |
734 | ((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) { | 730 | ((new_cfg ^ dev->CFG_cache) != 0)) { |
735 | writel(new_cfg, dev->base + CFG); | 731 | writel(new_cfg, dev->base + CFG); |
736 | dev->CFG_cache = new_cfg; | 732 | dev->CFG_cache = new_cfg; |
737 | } | 733 | } |
@@ -1189,7 +1185,6 @@ again: | |||
1189 | 1185 | ||
1190 | for (;;) { | 1186 | for (;;) { |
1191 | volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE); | 1187 | volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE); |
1192 | u32 residue = 0; | ||
1193 | 1188 | ||
1194 | dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len, | 1189 | dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len, |
1195 | (unsigned long long)buf); | 1190 | (unsigned long long)buf); |
@@ -1199,17 +1194,11 @@ again: | |||
1199 | desc_addr_set(desc + DESC_BUFPTR, buf); | 1194 | desc_addr_set(desc + DESC_BUFPTR, buf); |
1200 | desc[DESC_EXTSTS] = cpu_to_le32(extsts); | 1195 | desc[DESC_EXTSTS] = cpu_to_le32(extsts); |
1201 | 1196 | ||
1202 | cmdsts = ((nr_frags|residue) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0); | 1197 | cmdsts = ((nr_frags) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0); |
1203 | cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN; | 1198 | cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN; |
1204 | cmdsts |= len; | 1199 | cmdsts |= len; |
1205 | desc[DESC_CMDSTS] = cpu_to_le32(cmdsts); | 1200 | desc[DESC_CMDSTS] = cpu_to_le32(cmdsts); |
1206 | 1201 | ||
1207 | if (residue) { | ||
1208 | buf += len; | ||
1209 | len = residue; | ||
1210 | continue; | ||
1211 | } | ||
1212 | |||
1213 | if (!nr_frags) | 1202 | if (!nr_frags) |
1214 | break; | 1203 | break; |
1215 | 1204 | ||
@@ -1841,7 +1830,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ | |||
1841 | int using_dac = 0; | 1830 | int using_dac = 0; |
1842 | 1831 | ||
1843 | /* See if we can set the dma mask early on; failure is fatal. */ | 1832 | /* See if we can set the dma mask early on; failure is fatal. */ |
1844 | if (TRY_DAC && !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) { | 1833 | if (sizeof(dma_addr_t) == 8 && |
1834 | !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) { | ||
1845 | using_dac = 1; | 1835 | using_dac = 1; |
1846 | } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) { | 1836 | } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) { |
1847 | using_dac = 0; | 1837 | using_dac = 0; |
@@ -1972,9 +1962,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ | |||
1972 | /* When compiled with 64 bit addressing, we must always enable | 1962 | /* When compiled with 64 bit addressing, we must always enable |
1973 | * the 64 bit descriptor format. | 1963 | * the 64 bit descriptor format. |
1974 | */ | 1964 | */ |
1975 | #ifdef USE_64BIT_ADDR | 1965 | if (sizeof(dma_addr_t) == 8) |
1976 | dev->CFG_cache |= CFG_M64ADDR; | 1966 | dev->CFG_cache |= CFG_M64ADDR; |
1977 | #endif | ||
1978 | if (using_dac) | 1967 | if (using_dac) |
1979 | dev->CFG_cache |= CFG_T64ADDR; | 1968 | dev->CFG_cache |= CFG_T64ADDR; |
1980 | 1969 | ||