[PATCH] ns83820 update
Changes: - improved DAC ifdefs from Andi Kleen - removal of dead code from Adrian Bunk - fix half duplex collision behaviour
This commit is contained in:
Родитель
88d7bd8cb9
Коммит
c16ef1ceed
|
@ -1,4 +1,4 @@
|
|||
#define _VERSION "0.20"
|
||||
#define VERSION "0.22"
|
||||
/* ns83820.c by Benjamin LaHaise with contributions.
|
||||
*
|
||||
* Questions/comments/discussion to linux-ns83820@kvack.org.
|
||||
|
@ -63,9 +63,11 @@
|
|||
* - fix missed txok introduced during performance
|
||||
* tuning
|
||||
* 0.20 - fix stupid RFEN thinko. i am such a smurf.
|
||||
*
|
||||
* 20040828 0.21 - add hardware vlan accleration
|
||||
* 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
|
||||
* ===============
|
||||
*
|
||||
|
@ -129,18 +131,6 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */
|
|||
#undef 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 */
|
||||
#define RX_BUF_SIZE 1500 /* 8192 */
|
||||
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
|
||||
|
@ -386,22 +376,16 @@ static int lnksts = 0; /* CFG_LNKSTS bit polarity */
|
|||
#define LINK_DOWN 0x02
|
||||
#define LINK_UP 0x04
|
||||
|
||||
#ifdef USE_64BIT_ADDR
|
||||
#define HW_ADDR_LEN 8
|
||||
#define HW_ADDR_LEN sizeof(dma_addr_t)
|
||||
#define desc_addr_set(desc, addr) \
|
||||
do { \
|
||||
u64 __addr = (addr); \
|
||||
(desc)[0] = cpu_to_le32(__addr); \
|
||||
(desc)[1] = cpu_to_le32(__addr >> 32); \
|
||||
((desc)[0] = cpu_to_le32(addr)); \
|
||||
if (HW_ADDR_LEN == 8) \
|
||||
(desc)[1] = cpu_to_le32(((u64)addr) >> 32); \
|
||||
} while(0)
|
||||
#define desc_addr_get(desc) \
|
||||
(((u64)le32_to_cpu((desc)[1]) << 32) \
|
||||
| le32_to_cpu((desc)[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
|
||||
(le32_to_cpu((desc)[0]) | \
|
||||
(HW_ADDR_LEN == 8 ? ((dma_addr_t)le32_to_cpu((desc)[1]))<<32 : 0))
|
||||
|
||||
#define DESC_LINK 0
|
||||
#define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4)
|
||||
|
@ -727,11 +711,23 @@ static void fastcall phy_intr(struct net_device *ndev)
|
|||
speed = ((cfg / CFG_SPDSTS0) & 3);
|
||||
fullduplex = (cfg & CFG_DUPSTS);
|
||||
|
||||
if (fullduplex)
|
||||
if (fullduplex) {
|
||||
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) &&
|
||||
((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) {
|
||||
((new_cfg ^ dev->CFG_cache) != 0)) {
|
||||
writel(new_cfg, dev->base + CFG);
|
||||
dev->CFG_cache = new_cfg;
|
||||
}
|
||||
|
@ -1189,7 +1185,6 @@ again:
|
|||
|
||||
for (;;) {
|
||||
volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE);
|
||||
u32 residue = 0;
|
||||
|
||||
dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len,
|
||||
(unsigned long long)buf);
|
||||
|
@ -1199,17 +1194,11 @@ again:
|
|||
desc_addr_set(desc + DESC_BUFPTR, buf);
|
||||
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 |= len;
|
||||
desc[DESC_CMDSTS] = cpu_to_le32(cmdsts);
|
||||
|
||||
if (residue) {
|
||||
buf += len;
|
||||
len = residue;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!nr_frags)
|
||||
break;
|
||||
|
||||
|
@ -1841,7 +1830,8 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
|
|||
int using_dac = 0;
|
||||
|
||||
/* 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;
|
||||
} else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) {
|
||||
using_dac = 0;
|
||||
|
@ -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
|
||||
* the 64 bit descriptor format.
|
||||
*/
|
||||
#ifdef USE_64BIT_ADDR
|
||||
dev->CFG_cache |= CFG_M64ADDR;
|
||||
#endif
|
||||
if (sizeof(dma_addr_t) == 8)
|
||||
dev->CFG_cache |= CFG_M64ADDR;
|
||||
if (using_dac)
|
||||
dev->CFG_cache |= CFG_T64ADDR;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче