diff options
Diffstat (limited to 'drivers/net/forcedeth.c')
-rw-r--r-- | drivers/net/forcedeth.c | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 7667a62ac31f..36342230a6de 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -13,7 +13,7 @@ | |||
13 | * Copyright (C) 2004 Andrew de Quincey (wol support) | 13 | * Copyright (C) 2004 Andrew de Quincey (wol support) |
14 | * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane | 14 | * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane |
15 | * IRQ rate fixes, bigendian fixes, cleanups, verification) | 15 | * IRQ rate fixes, bigendian fixes, cleanups, verification) |
16 | * Copyright (c) 2004,5,6 NVIDIA Corporation | 16 | * Copyright (c) 2004,2005,2006,2007,2008 NVIDIA Corporation |
17 | * | 17 | * |
18 | * This program is free software; you can redistribute it and/or modify | 18 | * This program is free software; you can redistribute it and/or modify |
19 | * it under the terms of the GNU General Public License as published by | 19 | * it under the terms of the GNU General Public License as published by |
@@ -226,7 +226,7 @@ enum { | |||
226 | #define NVREG_MISC1_HD 0x02 | 226 | #define NVREG_MISC1_HD 0x02 |
227 | #define NVREG_MISC1_FORCE 0x3b0f3c | 227 | #define NVREG_MISC1_FORCE 0x3b0f3c |
228 | 228 | ||
229 | NvRegMacReset = 0x3c, | 229 | NvRegMacReset = 0x34, |
230 | #define NVREG_MAC_RESET_ASSERT 0x0F3 | 230 | #define NVREG_MAC_RESET_ASSERT 0x0F3 |
231 | NvRegTransmitterControl = 0x084, | 231 | NvRegTransmitterControl = 0x084, |
232 | #define NVREG_XMITCTL_START 0x01 | 232 | #define NVREG_XMITCTL_START 0x01 |
@@ -277,7 +277,9 @@ enum { | |||
277 | #define NVREG_MCASTADDRA_FORCE 0x01 | 277 | #define NVREG_MCASTADDRA_FORCE 0x01 |
278 | NvRegMulticastAddrB = 0xB4, | 278 | NvRegMulticastAddrB = 0xB4, |
279 | NvRegMulticastMaskA = 0xB8, | 279 | NvRegMulticastMaskA = 0xB8, |
280 | #define NVREG_MCASTMASKA_NONE 0xffffffff | ||
280 | NvRegMulticastMaskB = 0xBC, | 281 | NvRegMulticastMaskB = 0xBC, |
282 | #define NVREG_MCASTMASKB_NONE 0xffff | ||
281 | 283 | ||
282 | NvRegPhyInterface = 0xC0, | 284 | NvRegPhyInterface = 0xC0, |
283 | #define PHY_RGMII 0x10000000 | 285 | #define PHY_RGMII 0x10000000 |
@@ -316,8 +318,8 @@ enum { | |||
316 | NvRegTxRingPhysAddrHigh = 0x148, | 318 | NvRegTxRingPhysAddrHigh = 0x148, |
317 | NvRegRxRingPhysAddrHigh = 0x14C, | 319 | NvRegRxRingPhysAddrHigh = 0x14C, |
318 | NvRegTxPauseFrame = 0x170, | 320 | NvRegTxPauseFrame = 0x170, |
319 | #define NVREG_TX_PAUSEFRAME_DISABLE 0x1ff0080 | 321 | #define NVREG_TX_PAUSEFRAME_DISABLE 0x01ff0080 |
320 | #define NVREG_TX_PAUSEFRAME_ENABLE 0x0c00030 | 322 | #define NVREG_TX_PAUSEFRAME_ENABLE 0x01800010 |
321 | NvRegMIIStatus = 0x180, | 323 | NvRegMIIStatus = 0x180, |
322 | #define NVREG_MIISTAT_ERROR 0x0001 | 324 | #define NVREG_MIISTAT_ERROR 0x0001 |
323 | #define NVREG_MIISTAT_LINKCHANGE 0x0008 | 325 | #define NVREG_MIISTAT_LINKCHANGE 0x0008 |
@@ -471,9 +473,9 @@ union ring_type { | |||
471 | #define NV_RX_AVAIL (1<<31) | 473 | #define NV_RX_AVAIL (1<<31) |
472 | 474 | ||
473 | #define NV_RX2_CHECKSUMMASK (0x1C000000) | 475 | #define NV_RX2_CHECKSUMMASK (0x1C000000) |
474 | #define NV_RX2_CHECKSUMOK1 (0x10000000) | 476 | #define NV_RX2_CHECKSUM_IP (0x10000000) |
475 | #define NV_RX2_CHECKSUMOK2 (0x14000000) | 477 | #define NV_RX2_CHECKSUM_IP_TCP (0x14000000) |
476 | #define NV_RX2_CHECKSUMOK3 (0x18000000) | 478 | #define NV_RX2_CHECKSUM_IP_UDP (0x18000000) |
477 | #define NV_RX2_DESCRIPTORVALID (1<<29) | 479 | #define NV_RX2_DESCRIPTORVALID (1<<29) |
478 | #define NV_RX2_SUBSTRACT1 (1<<25) | 480 | #define NV_RX2_SUBSTRACT1 (1<<25) |
479 | #define NV_RX2_ERROR1 (1<<18) | 481 | #define NV_RX2_ERROR1 (1<<18) |
@@ -2375,14 +2377,9 @@ static int nv_rx_process(struct net_device *dev, int limit) | |||
2375 | goto next_pkt; | 2377 | goto next_pkt; |
2376 | } | 2378 | } |
2377 | } | 2379 | } |
2378 | if ((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUMOK2)/*ip and tcp */ { | 2380 | if (((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUM_IP_TCP) || /*ip and tcp */ |
2381 | ((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUM_IP_UDP)) /*ip and udp */ | ||
2379 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 2382 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
2380 | } else { | ||
2381 | if ((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUMOK1 || | ||
2382 | (flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUMOK3) { | ||
2383 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
2384 | } | ||
2385 | } | ||
2386 | } else { | 2383 | } else { |
2387 | dev_kfree_skb(skb); | 2384 | dev_kfree_skb(skb); |
2388 | goto next_pkt; | 2385 | goto next_pkt; |
@@ -2474,14 +2471,9 @@ static int nv_rx_process_optimized(struct net_device *dev, int limit) | |||
2474 | } | 2471 | } |
2475 | } | 2472 | } |
2476 | 2473 | ||
2477 | if ((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUMOK2)/*ip and tcp */ { | 2474 | if (((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUM_IP_TCP) || /*ip and tcp */ |
2475 | ((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUM_IP_UDP)) /*ip and udp */ | ||
2478 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 2476 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
2479 | } else { | ||
2480 | if ((flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUMOK1 || | ||
2481 | (flags & NV_RX2_CHECKSUMMASK) == NV_RX2_CHECKSUMOK3) { | ||
2482 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
2483 | } | ||
2484 | } | ||
2485 | 2477 | ||
2486 | /* got a valid packet - forward it to the network core */ | 2478 | /* got a valid packet - forward it to the network core */ |
2487 | skb_put(skb, len); | 2479 | skb_put(skb, len); |
@@ -2703,6 +2695,9 @@ static void nv_set_multicast(struct net_device *dev) | |||
2703 | addr[1] = alwaysOn[1]; | 2695 | addr[1] = alwaysOn[1]; |
2704 | mask[0] = alwaysOn[0] | alwaysOff[0]; | 2696 | mask[0] = alwaysOn[0] | alwaysOff[0]; |
2705 | mask[1] = alwaysOn[1] | alwaysOff[1]; | 2697 | mask[1] = alwaysOn[1] | alwaysOff[1]; |
2698 | } else { | ||
2699 | mask[0] = NVREG_MCASTMASKA_NONE; | ||
2700 | mask[1] = NVREG_MCASTMASKB_NONE; | ||
2706 | } | 2701 | } |
2707 | } | 2702 | } |
2708 | addr[0] |= NVREG_MCASTADDRA_FORCE; | 2703 | addr[0] |= NVREG_MCASTADDRA_FORCE; |
@@ -4813,8 +4808,8 @@ static int nv_open(struct net_device *dev) | |||
4813 | nv_mac_reset(dev); | 4808 | nv_mac_reset(dev); |
4814 | writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA); | 4809 | writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA); |
4815 | writel(0, base + NvRegMulticastAddrB); | 4810 | writel(0, base + NvRegMulticastAddrB); |
4816 | writel(0, base + NvRegMulticastMaskA); | 4811 | writel(NVREG_MCASTMASKA_NONE, base + NvRegMulticastMaskA); |
4817 | writel(0, base + NvRegMulticastMaskB); | 4812 | writel(NVREG_MCASTMASKB_NONE, base + NvRegMulticastMaskB); |
4818 | writel(0, base + NvRegPacketFilterFlags); | 4813 | writel(0, base + NvRegPacketFilterFlags); |
4819 | 4814 | ||
4820 | writel(0, base + NvRegTransmitterControl); | 4815 | writel(0, base + NvRegTransmitterControl); |
@@ -4908,8 +4903,8 @@ static int nv_open(struct net_device *dev) | |||
4908 | spin_lock_irq(&np->lock); | 4903 | spin_lock_irq(&np->lock); |
4909 | writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA); | 4904 | writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA); |
4910 | writel(0, base + NvRegMulticastAddrB); | 4905 | writel(0, base + NvRegMulticastAddrB); |
4911 | writel(0, base + NvRegMulticastMaskA); | 4906 | writel(NVREG_MCASTMASKA_NONE, base + NvRegMulticastMaskA); |
4912 | writel(0, base + NvRegMulticastMaskB); | 4907 | writel(NVREG_MCASTMASKB_NONE, base + NvRegMulticastMaskB); |
4913 | writel(NVREG_PFF_ALWAYS|NVREG_PFF_MYADDR, base + NvRegPacketFilterFlags); | 4908 | writel(NVREG_PFF_ALWAYS|NVREG_PFF_MYADDR, base + NvRegPacketFilterFlags); |
4914 | /* One manual link speed update: Interrupts are enabled, future link | 4909 | /* One manual link speed update: Interrupts are enabled, future link |
4915 | * speed changes cause interrupts and are handled by nv_link_irq(). | 4910 | * speed changes cause interrupts and are handled by nv_link_irq(). |
@@ -5603,35 +5598,35 @@ static struct pci_device_id pci_tbl[] = { | |||
5603 | }, | 5598 | }, |
5604 | { /* MCP77 Ethernet Controller */ | 5599 | { /* MCP77 Ethernet Controller */ |
5605 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32), | 5600 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32), |
5606 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5601 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5607 | }, | 5602 | }, |
5608 | { /* MCP77 Ethernet Controller */ | 5603 | { /* MCP77 Ethernet Controller */ |
5609 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33), | 5604 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33), |
5610 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5605 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5611 | }, | 5606 | }, |
5612 | { /* MCP77 Ethernet Controller */ | 5607 | { /* MCP77 Ethernet Controller */ |
5613 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34), | 5608 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34), |
5614 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5609 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5615 | }, | 5610 | }, |
5616 | { /* MCP77 Ethernet Controller */ | 5611 | { /* MCP77 Ethernet Controller */ |
5617 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35), | 5612 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35), |
5618 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5613 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5619 | }, | 5614 | }, |
5620 | { /* MCP79 Ethernet Controller */ | 5615 | { /* MCP79 Ethernet Controller */ |
5621 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_36), | 5616 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_36), |
5622 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5617 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5623 | }, | 5618 | }, |
5624 | { /* MCP79 Ethernet Controller */ | 5619 | { /* MCP79 Ethernet Controller */ |
5625 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_37), | 5620 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_37), |
5626 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5621 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5627 | }, | 5622 | }, |
5628 | { /* MCP79 Ethernet Controller */ | 5623 | { /* MCP79 Ethernet Controller */ |
5629 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_38), | 5624 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_38), |
5630 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5625 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5631 | }, | 5626 | }, |
5632 | { /* MCP79 Ethernet Controller */ | 5627 | { /* MCP79 Ethernet Controller */ |
5633 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_39), | 5628 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_39), |
5634 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | 5629 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, |
5635 | }, | 5630 | }, |
5636 | {0,}, | 5631 | {0,}, |
5637 | }; | 5632 | }; |