Loading drivers/net/ns83820.c +29 −40 Original line number Original line Diff line number Diff line #define _VERSION "0.20" #define VERSION "0.22" /* ns83820.c by Benjamin LaHaise with contributions. /* ns83820.c by Benjamin LaHaise with contributions. * * * Questions/comments/discussion to linux-ns83820@kvack.org. * Questions/comments/discussion to linux-ns83820@kvack.org. Loading Loading @@ -63,9 +63,11 @@ * - fix missed txok introduced during performance * - fix missed txok introduced during performance * tuning * tuning * 0.20 - fix stupid RFEN thinko. i am such a smurf. * 0.20 - fix stupid RFEN thinko. i am such a smurf. * * 20040828 0.21 - add hardware vlan accleration * 20040828 0.21 - add hardware vlan accleration * by Neil Horman <nhorman@redhat.com> * by Neil Horman <nhorman@redhat.com> * 20050406 0.22 - improved DAC ifdefs from Andi Kleen * - removal of dead code from Adrian Bunk * - fix half duplex collision behaviour * Driver Overview * Driver Overview * =============== * =============== * * Loading Loading @@ -129,18 +131,6 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */ #undef Dprintk #undef Dprintk #define Dprintk dprintk #define Dprintk dprintk #if defined(CONFIG_HIGHMEM64G) || defined(__ia64__) #define USE_64BIT_ADDR "+" #endif #if defined(USE_64BIT_ADDR) #define VERSION _VERSION USE_64BIT_ADDR #define TRY_DAC 1 #else #define VERSION _VERSION #define TRY_DAC 0 #endif /* tunables */ /* tunables */ #define RX_BUF_SIZE 1500 /* 8192 */ #define RX_BUF_SIZE 1500 /* 8192 */ #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) Loading Loading @@ -386,22 +376,16 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */ #define LINK_DOWN 0x02 #define LINK_DOWN 0x02 #define LINK_UP 0x04 #define LINK_UP 0x04 #ifdef USE_64BIT_ADDR #define HW_ADDR_LEN sizeof(dma_addr_t) #define HW_ADDR_LEN 8 #define desc_addr_set(desc, addr) \ #define desc_addr_set(desc, addr) \ do { \ do { \ u64 __addr = (addr); \ ((desc)[0] = cpu_to_le32(addr)); \ (desc)[0] = cpu_to_le32(__addr); \ if (HW_ADDR_LEN == 8) \ (desc)[1] = cpu_to_le32(__addr >> 32); \ (desc)[1] = cpu_to_le32(((u64)addr) >> 32); \ } while(0) } while(0) #define desc_addr_get(desc) \ #define desc_addr_get(desc) \ (((u64)le32_to_cpu((desc)[1]) << 32) \ (le32_to_cpu((desc)[0]) | \ | le32_to_cpu((desc)[0])) (HW_ADDR_LEN == 8 ? ((dma_addr_t)le32_to_cpu((desc)[1]))<<32 : 0)) #else #define HW_ADDR_LEN 4 #define desc_addr_set(desc, addr) ((desc)[0] = cpu_to_le32(addr)) #define desc_addr_get(desc) (le32_to_cpu((desc)[0])) #endif #define DESC_LINK 0 #define DESC_LINK 0 #define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4) #define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4) Loading Loading @@ -727,11 +711,23 @@ static void fastcall phy_intr(struct net_device *ndev) speed = ((cfg / CFG_SPDSTS0) & 3); speed = ((cfg / CFG_SPDSTS0) & 3); fullduplex = (cfg & CFG_DUPSTS); fullduplex = (cfg & CFG_DUPSTS); if (fullduplex) if (fullduplex) { new_cfg |= CFG_SB; new_cfg |= CFG_SB; writel(readl(dev->base + TXCFG) | TXCFG_CSI | TXCFG_HBI, dev->base + TXCFG); writel(readl(dev->base + RXCFG) | RXCFG_RX_FD, dev->base + RXCFG); } else { writel(readl(dev->base + TXCFG) & ~(TXCFG_CSI | TXCFG_HBI), dev->base + TXCFG); writel(readl(dev->base + RXCFG) & ~(RXCFG_RX_FD), dev->base + RXCFG); } if ((cfg & CFG_LNKSTS) && if ((cfg & CFG_LNKSTS) && ((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) { ((new_cfg ^ dev->CFG_cache) != 0)) { writel(new_cfg, dev->base + CFG); writel(new_cfg, dev->base + CFG); dev->CFG_cache = new_cfg; dev->CFG_cache = new_cfg; } } Loading Loading @@ -1189,7 +1185,6 @@ static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) for (;;) { for (;;) { volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE); volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE); u32 residue = 0; dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len, dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len, (unsigned long long)buf); (unsigned long long)buf); Loading @@ -1199,17 +1194,11 @@ static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) desc_addr_set(desc + DESC_BUFPTR, buf); desc_addr_set(desc + DESC_BUFPTR, buf); desc[DESC_EXTSTS] = cpu_to_le32(extsts); desc[DESC_EXTSTS] = cpu_to_le32(extsts); cmdsts = ((nr_frags|residue) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0); cmdsts = ((nr_frags) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0); cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN; cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN; cmdsts |= len; cmdsts |= len; desc[DESC_CMDSTS] = cpu_to_le32(cmdsts); desc[DESC_CMDSTS] = cpu_to_le32(cmdsts); if (residue) { buf += len; len = residue; continue; } if (!nr_frags) if (!nr_frags) break; break; Loading Loading @@ -1841,7 +1830,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ int using_dac = 0; int using_dac = 0; /* See if we can set the dma mask early on; failure is fatal. */ /* See if we can set the dma mask early on; failure is fatal. */ if (TRY_DAC && !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) { if (sizeof(dma_addr_t) == 8 && !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) { using_dac = 1; using_dac = 1; } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) { } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) { using_dac = 0; using_dac = 0; Loading Loading @@ -1972,9 +1962,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ /* When compiled with 64 bit addressing, we must always enable /* When compiled with 64 bit addressing, we must always enable * the 64 bit descriptor format. * the 64 bit descriptor format. */ */ #ifdef USE_64BIT_ADDR if (sizeof(dma_addr_t) == 8) dev->CFG_cache |= CFG_M64ADDR; dev->CFG_cache |= CFG_M64ADDR; #endif if (using_dac) if (using_dac) dev->CFG_cache |= CFG_T64ADDR; dev->CFG_cache |= CFG_T64ADDR; Loading Loading
drivers/net/ns83820.c +29 −40 Original line number Original line Diff line number Diff line #define _VERSION "0.20" #define VERSION "0.22" /* ns83820.c by Benjamin LaHaise with contributions. /* ns83820.c by Benjamin LaHaise with contributions. * * * Questions/comments/discussion to linux-ns83820@kvack.org. * Questions/comments/discussion to linux-ns83820@kvack.org. Loading Loading @@ -63,9 +63,11 @@ * - fix missed txok introduced during performance * - fix missed txok introduced during performance * tuning * tuning * 0.20 - fix stupid RFEN thinko. i am such a smurf. * 0.20 - fix stupid RFEN thinko. i am such a smurf. * * 20040828 0.21 - add hardware vlan accleration * 20040828 0.21 - add hardware vlan accleration * by Neil Horman <nhorman@redhat.com> * by Neil Horman <nhorman@redhat.com> * 20050406 0.22 - improved DAC ifdefs from Andi Kleen * - removal of dead code from Adrian Bunk * - fix half duplex collision behaviour * Driver Overview * Driver Overview * =============== * =============== * * Loading Loading @@ -129,18 +131,6 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */ #undef Dprintk #undef Dprintk #define Dprintk dprintk #define Dprintk dprintk #if defined(CONFIG_HIGHMEM64G) || defined(__ia64__) #define USE_64BIT_ADDR "+" #endif #if defined(USE_64BIT_ADDR) #define VERSION _VERSION USE_64BIT_ADDR #define TRY_DAC 1 #else #define VERSION _VERSION #define TRY_DAC 0 #endif /* tunables */ /* tunables */ #define RX_BUF_SIZE 1500 /* 8192 */ #define RX_BUF_SIZE 1500 /* 8192 */ #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) Loading Loading @@ -386,22 +376,16 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */ #define LINK_DOWN 0x02 #define LINK_DOWN 0x02 #define LINK_UP 0x04 #define LINK_UP 0x04 #ifdef USE_64BIT_ADDR #define HW_ADDR_LEN sizeof(dma_addr_t) #define HW_ADDR_LEN 8 #define desc_addr_set(desc, addr) \ #define desc_addr_set(desc, addr) \ do { \ do { \ u64 __addr = (addr); \ ((desc)[0] = cpu_to_le32(addr)); \ (desc)[0] = cpu_to_le32(__addr); \ if (HW_ADDR_LEN == 8) \ (desc)[1] = cpu_to_le32(__addr >> 32); \ (desc)[1] = cpu_to_le32(((u64)addr) >> 32); \ } while(0) } while(0) #define desc_addr_get(desc) \ #define desc_addr_get(desc) \ (((u64)le32_to_cpu((desc)[1]) << 32) \ (le32_to_cpu((desc)[0]) | \ | le32_to_cpu((desc)[0])) (HW_ADDR_LEN == 8 ? ((dma_addr_t)le32_to_cpu((desc)[1]))<<32 : 0)) #else #define HW_ADDR_LEN 4 #define desc_addr_set(desc, addr) ((desc)[0] = cpu_to_le32(addr)) #define desc_addr_get(desc) (le32_to_cpu((desc)[0])) #endif #define DESC_LINK 0 #define DESC_LINK 0 #define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4) #define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4) Loading Loading @@ -727,11 +711,23 @@ static void fastcall phy_intr(struct net_device *ndev) speed = ((cfg / CFG_SPDSTS0) & 3); speed = ((cfg / CFG_SPDSTS0) & 3); fullduplex = (cfg & CFG_DUPSTS); fullduplex = (cfg & CFG_DUPSTS); if (fullduplex) if (fullduplex) { new_cfg |= CFG_SB; new_cfg |= CFG_SB; writel(readl(dev->base + TXCFG) | TXCFG_CSI | TXCFG_HBI, dev->base + TXCFG); writel(readl(dev->base + RXCFG) | RXCFG_RX_FD, dev->base + RXCFG); } else { writel(readl(dev->base + TXCFG) & ~(TXCFG_CSI | TXCFG_HBI), dev->base + TXCFG); writel(readl(dev->base + RXCFG) & ~(RXCFG_RX_FD), dev->base + RXCFG); } if ((cfg & CFG_LNKSTS) && if ((cfg & CFG_LNKSTS) && ((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) { ((new_cfg ^ dev->CFG_cache) != 0)) { writel(new_cfg, dev->base + CFG); writel(new_cfg, dev->base + CFG); dev->CFG_cache = new_cfg; dev->CFG_cache = new_cfg; } } Loading Loading @@ -1189,7 +1185,6 @@ static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) for (;;) { for (;;) { volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE); volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE); u32 residue = 0; dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len, dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len, (unsigned long long)buf); (unsigned long long)buf); Loading @@ -1199,17 +1194,11 @@ static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) desc_addr_set(desc + DESC_BUFPTR, buf); desc_addr_set(desc + DESC_BUFPTR, buf); desc[DESC_EXTSTS] = cpu_to_le32(extsts); desc[DESC_EXTSTS] = cpu_to_le32(extsts); cmdsts = ((nr_frags|residue) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0); cmdsts = ((nr_frags) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0); cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN; cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN; cmdsts |= len; cmdsts |= len; desc[DESC_CMDSTS] = cpu_to_le32(cmdsts); desc[DESC_CMDSTS] = cpu_to_le32(cmdsts); if (residue) { buf += len; len = residue; continue; } if (!nr_frags) if (!nr_frags) break; break; Loading Loading @@ -1841,7 +1830,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ int using_dac = 0; int using_dac = 0; /* See if we can set the dma mask early on; failure is fatal. */ /* See if we can set the dma mask early on; failure is fatal. */ if (TRY_DAC && !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) { if (sizeof(dma_addr_t) == 8 && !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) { using_dac = 1; using_dac = 1; } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) { } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) { using_dac = 0; using_dac = 0; Loading Loading @@ -1972,9 +1962,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ /* When compiled with 64 bit addressing, we must always enable /* When compiled with 64 bit addressing, we must always enable * the 64 bit descriptor format. * the 64 bit descriptor format. */ */ #ifdef USE_64BIT_ADDR if (sizeof(dma_addr_t) == 8) dev->CFG_cache |= CFG_M64ADDR; dev->CFG_cache |= CFG_M64ADDR; #endif if (using_dac) if (using_dac) dev->CFG_cache |= CFG_T64ADDR; dev->CFG_cache |= CFG_T64ADDR; Loading