提交 36b30ea9 编写于 作者: J Jeff Garzik 提交者: Jeff Garzik

[netdrvr] forcedeth: internal simplifications; changelog removal

* remove changelog from source; its kept in git repository

* consolidate descriptor version tests using nv_optimized()

* consolidate NIC DMA start, stop and drain into
  nv_start_txrx(), nv_stop_txrx(), nv_drain_txrx()
Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
上级 cac1f3c8
...@@ -29,90 +29,6 @@ ...@@ -29,90 +29,6 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* Changelog:
* 0.01: 05 Oct 2003: First release that compiles without warnings.
* 0.02: 05 Oct 2003: Fix bug for nv_drain_tx: do not try to free NULL skbs.
* Check all PCI BARs for the register window.
* udelay added to mii_rw.
* 0.03: 06 Oct 2003: Initialize dev->irq.
* 0.04: 07 Oct 2003: Initialize np->lock, reduce handled irqs, add printks.
* 0.05: 09 Oct 2003: printk removed again, irq status print tx_timeout.
* 0.06: 10 Oct 2003: MAC Address read updated, pff flag generation updated,
* irq mask updated
* 0.07: 14 Oct 2003: Further irq mask updates.
* 0.08: 20 Oct 2003: rx_desc.Length initialization added, nv_alloc_rx refill
* added into irq handler, NULL check for drain_ring.
* 0.09: 20 Oct 2003: Basic link speed irq implementation. Only handle the
* requested interrupt sources.
* 0.10: 20 Oct 2003: First cleanup for release.
* 0.11: 21 Oct 2003: hexdump for tx added, rx buffer sizes increased.
* MAC Address init fix, set_multicast cleanup.
* 0.12: 23 Oct 2003: Cleanups for release.
* 0.13: 25 Oct 2003: Limit for concurrent tx packets increased to 10.
* Set link speed correctly. start rx before starting
* tx (nv_start_rx sets the link speed).
* 0.14: 25 Oct 2003: Nic dependant irq mask.
* 0.15: 08 Nov 2003: fix smp deadlock with set_multicast_list during
* open.
* 0.16: 15 Nov 2003: include file cleanup for ppc64, rx buffer size
* increased to 1628 bytes.
* 0.17: 16 Nov 2003: undo rx buffer size increase. Substract 1 from
* the tx length.
* 0.18: 17 Nov 2003: fix oops due to late initialization of dev_stats
* 0.19: 29 Nov 2003: Handle RxNoBuf, detect & handle invalid mac
* addresses, really stop rx if already running
* in nv_start_rx, clean up a bit.
* 0.20: 07 Dec 2003: alloc fixes
* 0.21: 12 Jan 2004: additional alloc fix, nic polling fix.
* 0.22: 19 Jan 2004: reprogram timer to a sane rate, avoid lockup
* on close.
* 0.23: 26 Jan 2004: various small cleanups
* 0.24: 27 Feb 2004: make driver even less anonymous in backtraces
* 0.25: 09 Mar 2004: wol support
* 0.26: 03 Jun 2004: netdriver specific annotation, sparse-related fixes
* 0.27: 19 Jun 2004: Gigabit support, new descriptor rings,
* added CK804/MCP04 device IDs, code fixes
* for registers, link status and other minor fixes.
* 0.28: 21 Jun 2004: Big cleanup, making driver mostly endian safe
* 0.29: 31 Aug 2004: Add backup timer for link change notification.
* 0.30: 25 Sep 2004: rx checksum support for nf 250 Gb. Add rx reset
* into nv_close, otherwise reenabling for wol can
* cause DMA to kfree'd memory.
* 0.31: 14 Nov 2004: ethtool support for getting/setting link
* capabilities.
* 0.32: 16 Apr 2005: RX_ERROR4 handling added.
* 0.33: 16 May 2005: Support for MCP51 added.
* 0.34: 18 Jun 2005: Add DEV_NEED_LINKTIMER to all nForce nics.
* 0.35: 26 Jun 2005: Support for MCP55 added.
* 0.36: 28 Jun 2005: Add jumbo frame support.
* 0.37: 10 Jul 2005: Additional ethtool support, cleanup of pci id list
* 0.38: 16 Jul 2005: tx irq rewrite: Use global flags instead of
* per-packet flags.
* 0.39: 18 Jul 2005: Add 64bit descriptor support.
* 0.40: 19 Jul 2005: Add support for mac address change.
* 0.41: 30 Jul 2005: Write back original MAC in nv_close instead
* of nv_remove
* 0.42: 06 Aug 2005: Fix lack of link speed initialization
* in the second (and later) nv_open call
* 0.43: 10 Aug 2005: Add support for tx checksum.
* 0.44: 20 Aug 2005: Add support for scatter gather and segmentation.
* 0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check
* 0.46: 20 Oct 2005: Add irq optimization modes.
* 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan.
* 0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single
* 0.49: 10 Dec 2005: Fix tso for large buffers.
* 0.50: 20 Jan 2006: Add 8021pq tagging support.
* 0.51: 20 Jan 2006: Add 64bit consistent memory allocation for rings.
* 0.52: 20 Jan 2006: Add MSI/MSIX support.
* 0.53: 19 Mar 2006: Fix init from low power mode and add hw reset.
* 0.54: 21 Mar 2006: Fix spin locks for multi irqs and cleanup.
* 0.55: 22 Mar 2006: Add flow control (pause frame).
* 0.56: 22 Mar 2006: Additional ethtool config and moduleparam support.
* 0.57: 14 May 2006: Mac address set in probe/remove and order corrections.
* 0.58: 30 Oct 2006: Added support for sideband management unit.
* 0.59: 30 Oct 2006: Added support for recoverable error.
* 0.60: 20 Jan 2007: Code optimizations for rings, rx & tx data paths, and stats.
*
* Known bugs: * Known bugs:
* We suspect that on some hardware no TX done interrupts are generated. * We suspect that on some hardware no TX done interrupts are generated.
* This means recovery from netif_stop_queue only happens if the hw timer * This means recovery from netif_stop_queue only happens if the hw timer
...@@ -123,11 +39,6 @@ ...@@ -123,11 +39,6 @@
* DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few
* superfluous timer interrupts from the nic. * superfluous timer interrupts from the nic.
*/ */
#ifdef CONFIG_FORCEDETH_NAPI
#define DRIVERNAPI "-NAPI"
#else
#define DRIVERNAPI
#endif
#define FORCEDETH_VERSION "0.61" #define FORCEDETH_VERSION "0.61"
#define DRV_NAME "forcedeth" #define DRV_NAME "forcedeth"
...@@ -930,6 +841,13 @@ static inline u32 nv_descr_getlength_ex(struct ring_desc_ex *prd, u32 v) ...@@ -930,6 +841,13 @@ static inline u32 nv_descr_getlength_ex(struct ring_desc_ex *prd, u32 v)
return le32_to_cpu(prd->flaglen) & LEN_MASK_V2; return le32_to_cpu(prd->flaglen) & LEN_MASK_V2;
} }
static bool nv_optimized(struct fe_priv *np)
{
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
return false;
return true;
}
static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target, static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target,
int delay, int delaymax, const char *msg) int delay, int delaymax, const char *msg)
{ {
...@@ -966,7 +884,7 @@ static void setup_hw_rings(struct net_device *dev, int rxtx_flags) ...@@ -966,7 +884,7 @@ static void setup_hw_rings(struct net_device *dev, int rxtx_flags)
struct fe_priv *np = get_nvpriv(dev); struct fe_priv *np = get_nvpriv(dev);
u8 __iomem *base = get_hwbase(dev); u8 __iomem *base = get_hwbase(dev);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
if (rxtx_flags & NV_SETUP_RX_RING) { if (rxtx_flags & NV_SETUP_RX_RING) {
writel(dma_low(np->ring_addr), base + NvRegRxRingPhysAddr); writel(dma_low(np->ring_addr), base + NvRegRxRingPhysAddr);
} }
...@@ -989,7 +907,7 @@ static void free_rings(struct net_device *dev) ...@@ -989,7 +907,7 @@ static void free_rings(struct net_device *dev)
{ {
struct fe_priv *np = get_nvpriv(dev); struct fe_priv *np = get_nvpriv(dev);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
if (np->rx_ring.orig) if (np->rx_ring.orig)
pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (np->rx_ring_size + np->tx_ring_size), pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (np->rx_ring_size + np->tx_ring_size),
np->rx_ring.orig, np->ring_addr); np->rx_ring.orig, np->ring_addr);
...@@ -1435,6 +1353,18 @@ static void nv_stop_tx(struct net_device *dev) ...@@ -1435,6 +1353,18 @@ static void nv_stop_tx(struct net_device *dev)
base + NvRegTransmitPoll); base + NvRegTransmitPoll);
} }
static void nv_start_rxtx(struct net_device *dev)
{
nv_start_rx(dev);
nv_start_tx(dev);
}
static void nv_stop_rxtx(struct net_device *dev)
{
nv_stop_rx(dev);
nv_stop_tx(dev);
}
static void nv_txrx_reset(struct net_device *dev) static void nv_txrx_reset(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
...@@ -1657,7 +1587,7 @@ static void nv_do_rx_refill(unsigned long data) ...@@ -1657,7 +1587,7 @@ static void nv_do_rx_refill(unsigned long data)
} else { } else {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
} }
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) if (!nv_optimized(np))
retcode = nv_alloc_rx(dev); retcode = nv_alloc_rx(dev);
else else
retcode = nv_alloc_rx_optimized(dev); retcode = nv_alloc_rx_optimized(dev);
...@@ -1682,8 +1612,10 @@ static void nv_init_rx(struct net_device *dev) ...@@ -1682,8 +1612,10 @@ static void nv_init_rx(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
int i; int i;
np->get_rx = np->put_rx = np->first_rx = np->rx_ring; np->get_rx = np->put_rx = np->first_rx = np->rx_ring;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
if (!nv_optimized(np))
np->last_rx.orig = &np->rx_ring.orig[np->rx_ring_size-1]; np->last_rx.orig = &np->rx_ring.orig[np->rx_ring_size-1];
else else
np->last_rx.ex = &np->rx_ring.ex[np->rx_ring_size-1]; np->last_rx.ex = &np->rx_ring.ex[np->rx_ring_size-1];
...@@ -1691,7 +1623,7 @@ static void nv_init_rx(struct net_device *dev) ...@@ -1691,7 +1623,7 @@ static void nv_init_rx(struct net_device *dev)
np->last_rx_ctx = &np->rx_skb[np->rx_ring_size-1]; np->last_rx_ctx = &np->rx_skb[np->rx_ring_size-1];
for (i = 0; i < np->rx_ring_size; i++) { for (i = 0; i < np->rx_ring_size; i++) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
np->rx_ring.orig[i].flaglen = 0; np->rx_ring.orig[i].flaglen = 0;
np->rx_ring.orig[i].buf = 0; np->rx_ring.orig[i].buf = 0;
} else { } else {
...@@ -1709,8 +1641,10 @@ static void nv_init_tx(struct net_device *dev) ...@@ -1709,8 +1641,10 @@ static void nv_init_tx(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
int i; int i;
np->get_tx = np->put_tx = np->first_tx = np->tx_ring; np->get_tx = np->put_tx = np->first_tx = np->tx_ring;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
if (!nv_optimized(np))
np->last_tx.orig = &np->tx_ring.orig[np->tx_ring_size-1]; np->last_tx.orig = &np->tx_ring.orig[np->tx_ring_size-1];
else else
np->last_tx.ex = &np->tx_ring.ex[np->tx_ring_size-1]; np->last_tx.ex = &np->tx_ring.ex[np->tx_ring_size-1];
...@@ -1721,7 +1655,7 @@ static void nv_init_tx(struct net_device *dev) ...@@ -1721,7 +1655,7 @@ static void nv_init_tx(struct net_device *dev)
np->tx_end_flip = NULL; np->tx_end_flip = NULL;
for (i = 0; i < np->tx_ring_size; i++) { for (i = 0; i < np->tx_ring_size; i++) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
np->tx_ring.orig[i].flaglen = 0; np->tx_ring.orig[i].flaglen = 0;
np->tx_ring.orig[i].buf = 0; np->tx_ring.orig[i].buf = 0;
} else { } else {
...@@ -1744,7 +1678,8 @@ static int nv_init_ring(struct net_device *dev) ...@@ -1744,7 +1678,8 @@ static int nv_init_ring(struct net_device *dev)
nv_init_tx(dev); nv_init_tx(dev);
nv_init_rx(dev); nv_init_rx(dev);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
if (!nv_optimized(np))
return nv_alloc_rx(dev); return nv_alloc_rx(dev);
else else
return nv_alloc_rx_optimized(dev); return nv_alloc_rx_optimized(dev);
...@@ -1775,7 +1710,7 @@ static void nv_drain_tx(struct net_device *dev) ...@@ -1775,7 +1710,7 @@ static void nv_drain_tx(struct net_device *dev)
unsigned int i; unsigned int i;
for (i = 0; i < np->tx_ring_size; i++) { for (i = 0; i < np->tx_ring_size; i++) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
np->tx_ring.orig[i].flaglen = 0; np->tx_ring.orig[i].flaglen = 0;
np->tx_ring.orig[i].buf = 0; np->tx_ring.orig[i].buf = 0;
} else { } else {
...@@ -1802,7 +1737,7 @@ static void nv_drain_rx(struct net_device *dev) ...@@ -1802,7 +1737,7 @@ static void nv_drain_rx(struct net_device *dev)
int i; int i;
for (i = 0; i < np->rx_ring_size; i++) { for (i = 0; i < np->rx_ring_size; i++) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
np->rx_ring.orig[i].flaglen = 0; np->rx_ring.orig[i].flaglen = 0;
np->rx_ring.orig[i].buf = 0; np->rx_ring.orig[i].buf = 0;
} else { } else {
...@@ -1823,7 +1758,7 @@ static void nv_drain_rx(struct net_device *dev) ...@@ -1823,7 +1758,7 @@ static void nv_drain_rx(struct net_device *dev)
} }
} }
static void drain_ring(struct net_device *dev) static void nv_drain_rxtx(struct net_device *dev)
{ {
nv_drain_tx(dev); nv_drain_tx(dev);
nv_drain_rx(dev); nv_drain_rx(dev);
...@@ -2260,7 +2195,7 @@ static void nv_tx_timeout(struct net_device *dev) ...@@ -2260,7 +2195,7 @@ static void nv_tx_timeout(struct net_device *dev)
} }
printk(KERN_INFO "%s: Dumping tx ring\n", dev->name); printk(KERN_INFO "%s: Dumping tx ring\n", dev->name);
for (i=0;i<np->tx_ring_size;i+= 4) { for (i=0;i<np->tx_ring_size;i+= 4) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
printk(KERN_INFO "%03x: %08x %08x // %08x %08x // %08x %08x // %08x %08x\n", printk(KERN_INFO "%03x: %08x %08x // %08x %08x // %08x %08x // %08x %08x\n",
i, i,
le32_to_cpu(np->tx_ring.orig[i].buf), le32_to_cpu(np->tx_ring.orig[i].buf),
...@@ -2296,7 +2231,7 @@ static void nv_tx_timeout(struct net_device *dev) ...@@ -2296,7 +2231,7 @@ static void nv_tx_timeout(struct net_device *dev)
nv_stop_tx(dev); nv_stop_tx(dev);
/* 2) check that the packets were not sent already: */ /* 2) check that the packets were not sent already: */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) if (!nv_optimized(np))
nv_tx_done(dev); nv_tx_done(dev);
else else
nv_tx_done_optimized(dev, np->tx_ring_size); nv_tx_done_optimized(dev, np->tx_ring_size);
...@@ -2663,12 +2598,10 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) ...@@ -2663,12 +2598,10 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
netif_tx_lock_bh(dev); netif_tx_lock_bh(dev);
spin_lock(&np->lock); spin_lock(&np->lock);
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
nv_txrx_reset(dev); nv_txrx_reset(dev);
/* drain rx queue */ /* drain rx queue */
nv_drain_rx(dev); nv_drain_rxtx(dev);
nv_drain_tx(dev);
/* reinit driver view of the rx queue */ /* reinit driver view of the rx queue */
set_bufsize(dev); set_bufsize(dev);
if (nv_init_ring(dev)) { if (nv_init_ring(dev)) {
...@@ -2685,8 +2618,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) ...@@ -2685,8 +2618,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
pci_push(base); pci_push(base);
/* restart rx engine */ /* restart rx engine */
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
netif_tx_unlock_bh(dev); netif_tx_unlock_bh(dev);
nv_enable_irq(dev); nv_enable_irq(dev);
...@@ -3393,7 +3325,7 @@ static int nv_napi_poll(struct napi_struct *napi, int budget) ...@@ -3393,7 +3325,7 @@ static int nv_napi_poll(struct napi_struct *napi, int budget)
unsigned long flags; unsigned long flags;
int pkts, retcode; int pkts, retcode;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
pkts = nv_rx_process(dev, budget); pkts = nv_rx_process(dev, budget);
retcode = nv_alloc_rx(dev); retcode = nv_alloc_rx(dev);
} else { } else {
...@@ -3634,7 +3566,7 @@ static int nv_request_irq(struct net_device *dev, int intr_test) ...@@ -3634,7 +3566,7 @@ static int nv_request_irq(struct net_device *dev, int intr_test)
if (intr_test) { if (intr_test) {
handler = nv_nic_irq_test; handler = nv_nic_irq_test;
} else { } else {
if (np->desc_ver == DESC_VER_3) if (nv_optimized(np))
handler = nv_nic_irq_optimized; handler = nv_nic_irq_optimized;
else else
handler = nv_nic_irq; handler = nv_nic_irq;
...@@ -3787,12 +3719,10 @@ static void nv_do_nic_poll(unsigned long data) ...@@ -3787,12 +3719,10 @@ static void nv_do_nic_poll(unsigned long data)
netif_tx_lock_bh(dev); netif_tx_lock_bh(dev);
spin_lock(&np->lock); spin_lock(&np->lock);
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
nv_txrx_reset(dev); nv_txrx_reset(dev);
/* drain rx queue */ /* drain rx queue */
nv_drain_rx(dev); nv_drain_rxtx(dev);
nv_drain_tx(dev);
/* reinit driver view of the rx queue */ /* reinit driver view of the rx queue */
set_bufsize(dev); set_bufsize(dev);
if (nv_init_ring(dev)) { if (nv_init_ring(dev)) {
...@@ -3809,8 +3739,7 @@ static void nv_do_nic_poll(unsigned long data) ...@@ -3809,8 +3739,7 @@ static void nv_do_nic_poll(unsigned long data)
pci_push(base); pci_push(base);
/* restart rx engine */ /* restart rx engine */
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
netif_tx_unlock_bh(dev); netif_tx_unlock_bh(dev);
} }
...@@ -3821,7 +3750,7 @@ static void nv_do_nic_poll(unsigned long data) ...@@ -3821,7 +3750,7 @@ static void nv_do_nic_poll(unsigned long data)
pci_push(base); pci_push(base);
if (!using_multi_irqs(dev)) { if (!using_multi_irqs(dev)) {
if (np->desc_ver == DESC_VER_3) if (nv_optimized(np))
nv_nic_irq_optimized(0, dev); nv_nic_irq_optimized(0, dev);
else else
nv_nic_irq(0, dev); nv_nic_irq(0, dev);
...@@ -4019,8 +3948,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) ...@@ -4019,8 +3948,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
netif_tx_lock_bh(dev); netif_tx_lock_bh(dev);
spin_lock(&np->lock); spin_lock(&np->lock);
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
netif_tx_unlock_bh(dev); netif_tx_unlock_bh(dev);
} }
...@@ -4126,8 +4054,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) ...@@ -4126,8 +4054,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
} }
if (netif_running(dev)) { if (netif_running(dev)) {
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
nv_enable_irq(dev); nv_enable_irq(dev);
} }
...@@ -4170,8 +4097,7 @@ static int nv_nway_reset(struct net_device *dev) ...@@ -4170,8 +4097,7 @@ static int nv_nway_reset(struct net_device *dev)
netif_tx_lock_bh(dev); netif_tx_lock_bh(dev);
spin_lock(&np->lock); spin_lock(&np->lock);
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
netif_tx_unlock_bh(dev); netif_tx_unlock_bh(dev);
printk(KERN_INFO "%s: link down.\n", dev->name); printk(KERN_INFO "%s: link down.\n", dev->name);
...@@ -4191,8 +4117,7 @@ static int nv_nway_reset(struct net_device *dev) ...@@ -4191,8 +4117,7 @@ static int nv_nway_reset(struct net_device *dev)
} }
if (netif_running(dev)) { if (netif_running(dev)) {
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
nv_enable_irq(dev); nv_enable_irq(dev);
} }
ret = 0; ret = 0;
...@@ -4249,7 +4174,7 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri ...@@ -4249,7 +4174,7 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri
} }
/* allocate new rings */ /* allocate new rings */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
rxtx_ring = pci_alloc_consistent(np->pci_dev, rxtx_ring = pci_alloc_consistent(np->pci_dev,
sizeof(struct ring_desc) * (ring->rx_pending + ring->tx_pending), sizeof(struct ring_desc) * (ring->rx_pending + ring->tx_pending),
&ring_addr); &ring_addr);
...@@ -4262,7 +4187,7 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri ...@@ -4262,7 +4187,7 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri
tx_skbuff = kmalloc(sizeof(struct nv_skb_map) * ring->tx_pending, GFP_KERNEL); tx_skbuff = kmalloc(sizeof(struct nv_skb_map) * ring->tx_pending, GFP_KERNEL);
if (!rxtx_ring || !rx_skbuff || !tx_skbuff) { if (!rxtx_ring || !rx_skbuff || !tx_skbuff) {
/* fall back to old rings */ /* fall back to old rings */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
if (rxtx_ring) if (rxtx_ring)
pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (ring->rx_pending + ring->tx_pending), pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (ring->rx_pending + ring->tx_pending),
rxtx_ring, ring_addr); rxtx_ring, ring_addr);
...@@ -4283,12 +4208,10 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri ...@@ -4283,12 +4208,10 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri
netif_tx_lock_bh(dev); netif_tx_lock_bh(dev);
spin_lock(&np->lock); spin_lock(&np->lock);
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
nv_txrx_reset(dev); nv_txrx_reset(dev);
/* drain queues */ /* drain queues */
nv_drain_rx(dev); nv_drain_rxtx(dev);
nv_drain_tx(dev);
/* delete queues */ /* delete queues */
free_rings(dev); free_rings(dev);
} }
...@@ -4296,7 +4219,8 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri ...@@ -4296,7 +4219,8 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri
/* set new values */ /* set new values */
np->rx_ring_size = ring->rx_pending; np->rx_ring_size = ring->rx_pending;
np->tx_ring_size = ring->tx_pending; np->tx_ring_size = ring->tx_pending;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
if (!nv_optimized(np)) {
np->rx_ring.orig = (struct ring_desc*)rxtx_ring; np->rx_ring.orig = (struct ring_desc*)rxtx_ring;
np->tx_ring.orig = &np->rx_ring.orig[np->rx_ring_size]; np->tx_ring.orig = &np->rx_ring.orig[np->rx_ring_size];
} else { } else {
...@@ -4328,8 +4252,7 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri ...@@ -4328,8 +4252,7 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri
pci_push(base); pci_push(base);
/* restart engines */ /* restart engines */
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
netif_tx_unlock_bh(dev); netif_tx_unlock_bh(dev);
nv_enable_irq(dev); nv_enable_irq(dev);
...@@ -4370,8 +4293,7 @@ static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam* ...@@ -4370,8 +4293,7 @@ static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam*
netif_tx_lock_bh(dev); netif_tx_lock_bh(dev);
spin_lock(&np->lock); spin_lock(&np->lock);
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
netif_tx_unlock_bh(dev); netif_tx_unlock_bh(dev);
} }
...@@ -4412,8 +4334,7 @@ static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam* ...@@ -4412,8 +4334,7 @@ static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam*
} }
if (netif_running(dev)) { if (netif_running(dev)) {
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
nv_enable_irq(dev); nv_enable_irq(dev);
} }
return 0; return 0;
...@@ -4649,8 +4570,7 @@ static int nv_loopback_test(struct net_device *dev) ...@@ -4649,8 +4570,7 @@ static int nv_loopback_test(struct net_device *dev)
pci_push(base); pci_push(base);
/* restart rx engine */ /* restart rx engine */
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
/* setup packet for tx */ /* setup packet for tx */
pkt_len = ETH_DATA_LEN; pkt_len = ETH_DATA_LEN;
...@@ -4668,7 +4588,7 @@ static int nv_loopback_test(struct net_device *dev) ...@@ -4668,7 +4588,7 @@ static int nv_loopback_test(struct net_device *dev)
for (i = 0; i < pkt_len; i++) for (i = 0; i < pkt_len; i++)
pkt_data[i] = (u8)(i & 0xff); pkt_data[i] = (u8)(i & 0xff);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
np->tx_ring.orig[0].buf = cpu_to_le32(test_dma_addr); np->tx_ring.orig[0].buf = cpu_to_le32(test_dma_addr);
np->tx_ring.orig[0].flaglen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra); np->tx_ring.orig[0].flaglen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra);
} else { } else {
...@@ -4682,7 +4602,7 @@ static int nv_loopback_test(struct net_device *dev) ...@@ -4682,7 +4602,7 @@ static int nv_loopback_test(struct net_device *dev)
msleep(500); msleep(500);
/* check for rx of the packet */ /* check for rx of the packet */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
flags = le32_to_cpu(np->rx_ring.orig[0].flaglen); flags = le32_to_cpu(np->rx_ring.orig[0].flaglen);
len = nv_descr_getlength(&np->rx_ring.orig[0], np->desc_ver); len = nv_descr_getlength(&np->rx_ring.orig[0], np->desc_ver);
...@@ -4728,12 +4648,10 @@ static int nv_loopback_test(struct net_device *dev) ...@@ -4728,12 +4648,10 @@ static int nv_loopback_test(struct net_device *dev)
dev_kfree_skb_any(tx_skb); dev_kfree_skb_any(tx_skb);
out: out:
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
nv_txrx_reset(dev); nv_txrx_reset(dev);
/* drain rx queue */ /* drain rx queue */
nv_drain_rx(dev); nv_drain_rxtx(dev);
nv_drain_tx(dev);
if (netif_running(dev)) { if (netif_running(dev)) {
writel(misc1_flags, base + NvRegMisc1); writel(misc1_flags, base + NvRegMisc1);
...@@ -4771,12 +4689,10 @@ static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64 ...@@ -4771,12 +4689,10 @@ static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64
writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus); writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus);
} }
/* stop engines */ /* stop engines */
nv_stop_rx(dev); nv_stop_rxtx(dev);
nv_stop_tx(dev);
nv_txrx_reset(dev); nv_txrx_reset(dev);
/* drain rx queue */ /* drain rx queue */
nv_drain_rx(dev); nv_drain_rxtx(dev);
nv_drain_tx(dev);
spin_unlock_irq(&np->lock); spin_unlock_irq(&np->lock);
netif_tx_unlock_bh(dev); netif_tx_unlock_bh(dev);
} }
...@@ -4817,8 +4733,7 @@ static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64 ...@@ -4817,8 +4733,7 @@ static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64
writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl);
pci_push(base); pci_push(base);
/* restart rx engine */ /* restart rx engine */
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
netif_start_queue(dev); netif_start_queue(dev);
#ifdef CONFIG_FORCEDETH_NAPI #ifdef CONFIG_FORCEDETH_NAPI
napi_enable(&np->napi); napi_enable(&np->napi);
...@@ -5047,8 +4962,7 @@ static int nv_open(struct net_device *dev) ...@@ -5047,8 +4962,7 @@ static int nv_open(struct net_device *dev)
* to init hw */ * to init hw */
np->linkspeed = 0; np->linkspeed = 0;
ret = nv_update_linkspeed(dev); ret = nv_update_linkspeed(dev);
nv_start_rx(dev); nv_start_rxtx(dev);
nv_start_tx(dev);
netif_start_queue(dev); netif_start_queue(dev);
#ifdef CONFIG_FORCEDETH_NAPI #ifdef CONFIG_FORCEDETH_NAPI
napi_enable(&np->napi); napi_enable(&np->napi);
...@@ -5072,7 +4986,7 @@ static int nv_open(struct net_device *dev) ...@@ -5072,7 +4986,7 @@ static int nv_open(struct net_device *dev)
return 0; return 0;
out_drain: out_drain:
drain_ring(dev); nv_drain_rxtx(dev);
return ret; return ret;
} }
...@@ -5095,8 +5009,7 @@ static int nv_close(struct net_device *dev) ...@@ -5095,8 +5009,7 @@ static int nv_close(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
spin_lock_irq(&np->lock); spin_lock_irq(&np->lock);
nv_stop_tx(dev); nv_stop_rxtx(dev);
nv_stop_rx(dev);
nv_txrx_reset(dev); nv_txrx_reset(dev);
/* disable interrupts on the nic or we will lock up */ /* disable interrupts on the nic or we will lock up */
...@@ -5109,7 +5022,7 @@ static int nv_close(struct net_device *dev) ...@@ -5109,7 +5022,7 @@ static int nv_close(struct net_device *dev)
nv_free_irq(dev); nv_free_irq(dev);
drain_ring(dev); nv_drain_rxtx(dev);
if (np->wolenabled) { if (np->wolenabled) {
writel(NVREG_PFF_ALWAYS|NVREG_PFF_MYADDR, base + NvRegPacketFilterFlags); writel(NVREG_PFF_ALWAYS|NVREG_PFF_MYADDR, base + NvRegPacketFilterFlags);
...@@ -5269,7 +5182,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i ...@@ -5269,7 +5182,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
np->rx_ring_size = RX_RING_DEFAULT; np->rx_ring_size = RX_RING_DEFAULT;
np->tx_ring_size = TX_RING_DEFAULT; np->tx_ring_size = TX_RING_DEFAULT;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (!nv_optimized(np)) {
np->rx_ring.orig = pci_alloc_consistent(pci_dev, np->rx_ring.orig = pci_alloc_consistent(pci_dev,
sizeof(struct ring_desc) * (np->rx_ring_size + np->tx_ring_size), sizeof(struct ring_desc) * (np->rx_ring_size + np->tx_ring_size),
&np->ring_addr); &np->ring_addr);
...@@ -5291,7 +5204,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i ...@@ -5291,7 +5204,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
dev->open = nv_open; dev->open = nv_open;
dev->stop = nv_close; dev->stop = nv_close;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
if (!nv_optimized(np))
dev->hard_start_xmit = nv_start_xmit; dev->hard_start_xmit = nv_start_xmit;
else else
dev->hard_start_xmit = nv_start_xmit_optimized; dev->hard_start_xmit = nv_start_xmit_optimized;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册