You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6:
WOL bugfix for 3c59x.c
skge 1.12
skge: add a debug interface
skge: eeprom support
skge: internal stats
skge: XM PHY handling fixes
skge: changing MTU while running causes problems
skge: fix ram buffer size calculation
gianfar: Fix compile regression caused by 09f75cd7
net: Fix new EMAC driver for NAPI changes
bonding: two small fixes for IPoIB support
e1000e: don't poke PHY registers to retreive link status
e1000e: fix error checks
e1000e: Fix debug printk macro
tokenring/3c359.c: fixed array index problem
[netdrvr] forcedeth: remove in-driver copy of net_device_stats
[netdrvr] forcedeth: improved probe info; dev_printk() cleanups
forcedeth: fix NAPI rx poll function
This commit is contained in:
+7
-1
@@ -3118,7 +3118,13 @@ static void acpi_set_WOL(struct net_device *dev)
|
||||
iowrite16(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
|
||||
iowrite16(RxEnable, ioaddr + EL3_CMD);
|
||||
|
||||
pci_enable_wake(VORTEX_PCI(vp), 0, 1);
|
||||
if (pci_enable_wake(VORTEX_PCI(vp), PCI_D3hot, 1)) {
|
||||
printk(KERN_INFO "%s: WOL not supported.\n",
|
||||
pci_name(VORTEX_PCI(vp)));
|
||||
|
||||
vp->enable_wol = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Change the power state to D3; RxEnable doesn't take effect. */
|
||||
pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot);
|
||||
|
||||
@@ -2173,6 +2173,16 @@ config SKGE
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called skge. This is recommended.
|
||||
|
||||
config SKGE_DEBUG
|
||||
bool "Debugging interface"
|
||||
depends on SKGE && DEBUG_FS
|
||||
help
|
||||
This option adds the ability to dump driver state for debugging.
|
||||
The file debugfs/skge/ethX displays the state of the internal
|
||||
transmit and receive rings.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config SKY2
|
||||
tristate "SysKonnect Yukon2 support"
|
||||
depends on PCI
|
||||
|
||||
@@ -1263,6 +1263,7 @@ static void bond_setup_by_slave(struct net_device *bond_dev,
|
||||
struct bonding *bond = bond_dev->priv;
|
||||
|
||||
bond_dev->neigh_setup = slave_dev->neigh_setup;
|
||||
bond_dev->header_ops = slave_dev->header_ops;
|
||||
|
||||
bond_dev->type = slave_dev->type;
|
||||
bond_dev->hard_header_len = slave_dev->hard_header_len;
|
||||
@@ -3351,7 +3352,10 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave
|
||||
switch (event) {
|
||||
case NETDEV_UNREGISTER:
|
||||
if (bond_dev) {
|
||||
bond_release(bond_dev, slave_dev);
|
||||
if (bond->setup_by_slave)
|
||||
bond_release_and_destroy(bond_dev, slave_dev);
|
||||
else
|
||||
bond_release(bond_dev, slave_dev);
|
||||
}
|
||||
break;
|
||||
case NETDEV_CHANGE:
|
||||
@@ -3366,11 +3370,6 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave
|
||||
* ... Or is it this?
|
||||
*/
|
||||
break;
|
||||
case NETDEV_GOING_DOWN:
|
||||
dprintk("slave %s is going down\n", slave_dev->name);
|
||||
if (bond->setup_by_slave)
|
||||
bond_release_and_destroy(bond_dev, slave_dev);
|
||||
break;
|
||||
case NETDEV_CHANGEMTU:
|
||||
/*
|
||||
* TODO: Should slaves be allowed to
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
#include "bond_3ad.h"
|
||||
#include "bond_alb.h"
|
||||
|
||||
#define DRV_VERSION "3.2.0"
|
||||
#define DRV_RELDATE "September 13, 2007"
|
||||
#define DRV_VERSION "3.2.1"
|
||||
#define DRV_RELDATE "October 15, 2007"
|
||||
#define DRV_NAME "bonding"
|
||||
#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@ static int e1000_get_settings(struct net_device *netdev,
|
||||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
u32 status;
|
||||
|
||||
if (hw->media_type == e1000_media_type_copper) {
|
||||
|
||||
@@ -147,16 +148,16 @@ static int e1000_get_settings(struct net_device *netdev,
|
||||
ecmd->transceiver = XCVR_EXTERNAL;
|
||||
}
|
||||
|
||||
if (er32(STATUS) & E1000_STATUS_LU) {
|
||||
status = er32(STATUS);
|
||||
if (status & E1000_STATUS_LU) {
|
||||
if (status & E1000_STATUS_SPEED_1000)
|
||||
ecmd->speed = 1000;
|
||||
else if (status & E1000_STATUS_SPEED_100)
|
||||
ecmd->speed = 100;
|
||||
else
|
||||
ecmd->speed = 10;
|
||||
|
||||
adapter->hw.mac.ops.get_link_up_info(hw, &adapter->link_speed,
|
||||
&adapter->link_duplex);
|
||||
ecmd->speed = adapter->link_speed;
|
||||
|
||||
/* unfortunately FULL_DUPLEX != DUPLEX_FULL
|
||||
* and HALF_DUPLEX != DUPLEX_HALF */
|
||||
|
||||
if (adapter->link_duplex == FULL_DUPLEX)
|
||||
if (status & E1000_STATUS_FD)
|
||||
ecmd->duplex = DUPLEX_FULL;
|
||||
else
|
||||
ecmd->duplex = DUPLEX_HALF;
|
||||
@@ -170,6 +171,16 @@ static int e1000_get_settings(struct net_device *netdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 e1000_get_link(struct net_device *netdev)
|
||||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
u32 status;
|
||||
|
||||
status = er32(STATUS);
|
||||
return (status & E1000_STATUS_LU);
|
||||
}
|
||||
|
||||
static int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
|
||||
{
|
||||
struct e1000_mac_info *mac = &adapter->hw.mac;
|
||||
@@ -1451,11 +1462,11 @@ static int e1000_loopback_test(struct e1000_adapter *adapter, u64 *data)
|
||||
}
|
||||
|
||||
*data = e1000_setup_desc_rings(adapter);
|
||||
if (data)
|
||||
if (*data)
|
||||
goto out;
|
||||
|
||||
*data = e1000_setup_loopback_test(adapter);
|
||||
if (data)
|
||||
if (*data)
|
||||
goto err_loopback;
|
||||
|
||||
*data = e1000_run_loopback_test(adapter);
|
||||
@@ -1751,7 +1762,7 @@ static const struct ethtool_ops e1000_ethtool_ops = {
|
||||
.get_msglevel = e1000_get_msglevel,
|
||||
.set_msglevel = e1000_set_msglevel,
|
||||
.nway_reset = e1000_nway_reset,
|
||||
.get_link = ethtool_op_get_link,
|
||||
.get_link = e1000_get_link,
|
||||
.get_eeprom_len = e1000_get_eeprom_len,
|
||||
.get_eeprom = e1000_get_eeprom,
|
||||
.set_eeprom = e1000_set_eeprom,
|
||||
|
||||
@@ -852,7 +852,7 @@ struct e1000_hw {
|
||||
|
||||
#ifdef DEBUG
|
||||
#define hw_dbg(hw, format, arg...) \
|
||||
printk(KERN_DEBUG, "%s: " format, e1000e_get_hw_dev_name(hw), ##arg);
|
||||
printk(KERN_DEBUG "%s: " format, e1000e_get_hw_dev_name(hw), ##arg)
|
||||
#else
|
||||
static inline int __attribute__ ((format (printf, 2, 3)))
|
||||
hw_dbg(struct e1000_hw *hw, const char *format, ...)
|
||||
|
||||
+97
-69
@@ -128,7 +128,7 @@
|
||||
#else
|
||||
#define DRIVERNAPI
|
||||
#endif
|
||||
#define FORCEDETH_VERSION "0.60"
|
||||
#define FORCEDETH_VERSION "0.61"
|
||||
#define DRV_NAME "forcedeth"
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -752,7 +752,6 @@ struct fe_priv {
|
||||
|
||||
/* General data:
|
||||
* Locking: spin_lock(&np->lock); */
|
||||
struct net_device_stats stats;
|
||||
struct nv_ethtool_stats estats;
|
||||
int in_shutdown;
|
||||
u32 linkspeed;
|
||||
@@ -1505,15 +1504,16 @@ static struct net_device_stats *nv_get_stats(struct net_device *dev)
|
||||
nv_get_hw_stats(dev);
|
||||
|
||||
/* copy to net_device stats */
|
||||
np->stats.tx_bytes = np->estats.tx_bytes;
|
||||
np->stats.tx_fifo_errors = np->estats.tx_fifo_errors;
|
||||
np->stats.tx_carrier_errors = np->estats.tx_carrier_errors;
|
||||
np->stats.rx_crc_errors = np->estats.rx_crc_errors;
|
||||
np->stats.rx_over_errors = np->estats.rx_over_errors;
|
||||
np->stats.rx_errors = np->estats.rx_errors_total;
|
||||
np->stats.tx_errors = np->estats.tx_errors_total;
|
||||
dev->stats.tx_bytes = np->estats.tx_bytes;
|
||||
dev->stats.tx_fifo_errors = np->estats.tx_fifo_errors;
|
||||
dev->stats.tx_carrier_errors = np->estats.tx_carrier_errors;
|
||||
dev->stats.rx_crc_errors = np->estats.rx_crc_errors;
|
||||
dev->stats.rx_over_errors = np->estats.rx_over_errors;
|
||||
dev->stats.rx_errors = np->estats.rx_errors_total;
|
||||
dev->stats.tx_errors = np->estats.tx_errors_total;
|
||||
}
|
||||
return &np->stats;
|
||||
|
||||
return &dev->stats;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1733,7 +1733,7 @@ static void nv_drain_tx(struct net_device *dev)
|
||||
np->tx_ring.ex[i].buflow = 0;
|
||||
}
|
||||
if (nv_release_txskb(dev, &np->tx_skb[i]))
|
||||
np->stats.tx_dropped++;
|
||||
dev->stats.tx_dropped++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2049,13 +2049,13 @@ static void nv_tx_done(struct net_device *dev)
|
||||
if (flags & NV_TX_LASTPACKET) {
|
||||
if (flags & NV_TX_ERROR) {
|
||||
if (flags & NV_TX_UNDERFLOW)
|
||||
np->stats.tx_fifo_errors++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
if (flags & NV_TX_CARRIERLOST)
|
||||
np->stats.tx_carrier_errors++;
|
||||
np->stats.tx_errors++;
|
||||
dev->stats.tx_carrier_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
} else {
|
||||
np->stats.tx_packets++;
|
||||
np->stats.tx_bytes += np->get_tx_ctx->skb->len;
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += np->get_tx_ctx->skb->len;
|
||||
}
|
||||
dev_kfree_skb_any(np->get_tx_ctx->skb);
|
||||
np->get_tx_ctx->skb = NULL;
|
||||
@@ -2064,13 +2064,13 @@ static void nv_tx_done(struct net_device *dev)
|
||||
if (flags & NV_TX2_LASTPACKET) {
|
||||
if (flags & NV_TX2_ERROR) {
|
||||
if (flags & NV_TX2_UNDERFLOW)
|
||||
np->stats.tx_fifo_errors++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
if (flags & NV_TX2_CARRIERLOST)
|
||||
np->stats.tx_carrier_errors++;
|
||||
np->stats.tx_errors++;
|
||||
dev->stats.tx_carrier_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
} else {
|
||||
np->stats.tx_packets++;
|
||||
np->stats.tx_bytes += np->get_tx_ctx->skb->len;
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += np->get_tx_ctx->skb->len;
|
||||
}
|
||||
dev_kfree_skb_any(np->get_tx_ctx->skb);
|
||||
np->get_tx_ctx->skb = NULL;
|
||||
@@ -2107,7 +2107,7 @@ static void nv_tx_done_optimized(struct net_device *dev, int limit)
|
||||
|
||||
if (flags & NV_TX2_LASTPACKET) {
|
||||
if (!(flags & NV_TX2_ERROR))
|
||||
np->stats.tx_packets++;
|
||||
dev->stats.tx_packets++;
|
||||
dev_kfree_skb_any(np->get_tx_ctx->skb);
|
||||
np->get_tx_ctx->skb = NULL;
|
||||
}
|
||||
@@ -2268,13 +2268,13 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
u32 flags;
|
||||
u32 rx_processed_cnt = 0;
|
||||
int rx_work = 0;
|
||||
struct sk_buff *skb;
|
||||
int len;
|
||||
|
||||
while((np->get_rx.orig != np->put_rx.orig) &&
|
||||
!((flags = le32_to_cpu(np->get_rx.orig->flaglen)) & NV_RX_AVAIL) &&
|
||||
(rx_processed_cnt++ < limit)) {
|
||||
(rx_work < limit)) {
|
||||
|
||||
dprintk(KERN_DEBUG "%s: nv_rx_process: flags 0x%x.\n",
|
||||
dev->name, flags);
|
||||
@@ -2308,7 +2308,7 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
if (flags & NV_RX_ERROR4) {
|
||||
len = nv_getlen(dev, skb->data, len);
|
||||
if (len < 0) {
|
||||
np->stats.rx_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
dev_kfree_skb(skb);
|
||||
goto next_pkt;
|
||||
}
|
||||
@@ -2322,12 +2322,12 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
/* the rest are hard errors */
|
||||
else {
|
||||
if (flags & NV_RX_MISSEDFRAME)
|
||||
np->stats.rx_missed_errors++;
|
||||
dev->stats.rx_missed_errors++;
|
||||
if (flags & NV_RX_CRCERR)
|
||||
np->stats.rx_crc_errors++;
|
||||
dev->stats.rx_crc_errors++;
|
||||
if (flags & NV_RX_OVERFLOW)
|
||||
np->stats.rx_over_errors++;
|
||||
np->stats.rx_errors++;
|
||||
dev->stats.rx_over_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
dev_kfree_skb(skb);
|
||||
goto next_pkt;
|
||||
}
|
||||
@@ -2343,7 +2343,7 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
if (flags & NV_RX2_ERROR4) {
|
||||
len = nv_getlen(dev, skb->data, len);
|
||||
if (len < 0) {
|
||||
np->stats.rx_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
dev_kfree_skb(skb);
|
||||
goto next_pkt;
|
||||
}
|
||||
@@ -2357,10 +2357,10 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
/* the rest are hard errors */
|
||||
else {
|
||||
if (flags & NV_RX2_CRCERR)
|
||||
np->stats.rx_crc_errors++;
|
||||
dev->stats.rx_crc_errors++;
|
||||
if (flags & NV_RX2_OVERFLOW)
|
||||
np->stats.rx_over_errors++;
|
||||
np->stats.rx_errors++;
|
||||
dev->stats.rx_over_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
dev_kfree_skb(skb);
|
||||
goto next_pkt;
|
||||
}
|
||||
@@ -2389,16 +2389,18 @@ static int nv_rx_process(struct net_device *dev, int limit)
|
||||
netif_rx(skb);
|
||||
#endif
|
||||
dev->last_rx = jiffies;
|
||||
np->stats.rx_packets++;
|
||||
np->stats.rx_bytes += len;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += len;
|
||||
next_pkt:
|
||||
if (unlikely(np->get_rx.orig++ == np->last_rx.orig))
|
||||
np->get_rx.orig = np->first_rx.orig;
|
||||
if (unlikely(np->get_rx_ctx++ == np->last_rx_ctx))
|
||||
np->get_rx_ctx = np->first_rx_ctx;
|
||||
|
||||
rx_work++;
|
||||
}
|
||||
|
||||
return rx_processed_cnt;
|
||||
return rx_work;
|
||||
}
|
||||
|
||||
static int nv_rx_process_optimized(struct net_device *dev, int limit)
|
||||
@@ -2505,8 +2507,8 @@ static int nv_rx_process_optimized(struct net_device *dev, int limit)
|
||||
}
|
||||
|
||||
dev->last_rx = jiffies;
|
||||
np->stats.rx_packets++;
|
||||
np->stats.rx_bytes += len;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += len;
|
||||
} else {
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
@@ -3727,7 +3729,7 @@ static void nv_do_stats_poll(unsigned long data)
|
||||
static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
|
||||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
strcpy(info->driver, "forcedeth");
|
||||
strcpy(info->driver, DRV_NAME);
|
||||
strcpy(info->version, FORCEDETH_VERSION);
|
||||
strcpy(info->bus_info, pci_name(np->pci_dev));
|
||||
}
|
||||
@@ -4991,6 +4993,11 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
u32 phystate_orig = 0, phystate;
|
||||
int phyinitialized = 0;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
static int printed_version;
|
||||
|
||||
if (!printed_version++)
|
||||
printk(KERN_INFO "%s: Reverse Engineered nForce ethernet"
|
||||
" driver. Version %s.\n", DRV_NAME, FORCEDETH_VERSION);
|
||||
|
||||
dev = alloc_etherdev(sizeof(struct fe_priv));
|
||||
err = -ENOMEM;
|
||||
@@ -5014,11 +5021,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
np->stats_poll.function = &nv_do_stats_poll; /* timer handler */
|
||||
|
||||
err = pci_enable_device(pci_dev);
|
||||
if (err) {
|
||||
printk(KERN_INFO "forcedeth: pci_enable_dev failed (%d) for device %s\n",
|
||||
err, pci_name(pci_dev));
|
||||
if (err)
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
pci_set_master(pci_dev);
|
||||
|
||||
@@ -5047,8 +5051,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
}
|
||||
}
|
||||
if (i == DEVICE_COUNT_RESOURCE) {
|
||||
printk(KERN_INFO "forcedeth: Couldn't find register window for device %s.\n",
|
||||
pci_name(pci_dev));
|
||||
dev_printk(KERN_INFO, &pci_dev->dev,
|
||||
"Couldn't find register window\n");
|
||||
goto out_relreg;
|
||||
}
|
||||
|
||||
@@ -5061,16 +5065,14 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
np->desc_ver = DESC_VER_3;
|
||||
np->txrxctl_bits = NVREG_TXRXCTL_DESC_3;
|
||||
if (dma_64bit) {
|
||||
if (pci_set_dma_mask(pci_dev, DMA_39BIT_MASK)) {
|
||||
printk(KERN_INFO "forcedeth: 64-bit DMA failed, using 32-bit addressing for device %s.\n",
|
||||
pci_name(pci_dev));
|
||||
} else {
|
||||
if (pci_set_dma_mask(pci_dev, DMA_39BIT_MASK))
|
||||
dev_printk(KERN_INFO, &pci_dev->dev,
|
||||
"64-bit DMA failed, using 32-bit addressing\n");
|
||||
else
|
||||
dev->features |= NETIF_F_HIGHDMA;
|
||||
printk(KERN_INFO "forcedeth: using HIGHDMA\n");
|
||||
}
|
||||
if (pci_set_consistent_dma_mask(pci_dev, DMA_39BIT_MASK)) {
|
||||
printk(KERN_INFO "forcedeth: 64-bit DMA (consistent) failed, using 32-bit ring buffers for device %s.\n",
|
||||
pci_name(pci_dev));
|
||||
dev_printk(KERN_INFO, &pci_dev->dev,
|
||||
"64-bit DMA (consistent) failed, using 32-bit ring buffers\n");
|
||||
}
|
||||
}
|
||||
} else if (id->driver_data & DEV_HAS_LARGEDESC) {
|
||||
@@ -5205,9 +5207,11 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
* Bad mac address. At least one bios sets the mac address
|
||||
* to 01:23:45:67:89:ab
|
||||
*/
|
||||
printk(KERN_ERR "%s: Invalid Mac address detected: %s\n",
|
||||
pci_name(pci_dev), print_mac(mac, dev->dev_addr));
|
||||
printk(KERN_ERR "Please complain to your hardware vendor. Switching to a random MAC.\n");
|
||||
dev_printk(KERN_ERR, &pci_dev->dev,
|
||||
"Invalid Mac address detected: %s\n",
|
||||
print_mac(mac, dev->dev_addr));
|
||||
dev_printk(KERN_ERR, &pci_dev->dev,
|
||||
"Please complain to your hardware vendor. Switching to a random MAC.\n");
|
||||
dev->dev_addr[0] = 0x00;
|
||||
dev->dev_addr[1] = 0x00;
|
||||
dev->dev_addr[2] = 0x6c;
|
||||
@@ -5321,8 +5325,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
break;
|
||||
}
|
||||
if (i == 33) {
|
||||
printk(KERN_INFO "%s: open: Could not find a valid PHY.\n",
|
||||
pci_name(pci_dev));
|
||||
dev_printk(KERN_INFO, &pci_dev->dev,
|
||||
"open: Could not find a valid PHY.\n");
|
||||
goto out_error;
|
||||
}
|
||||
|
||||
@@ -5344,12 +5348,37 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
printk(KERN_INFO "forcedeth: unable to register netdev: %d\n", err);
|
||||
dev_printk(KERN_INFO, &pci_dev->dev,
|
||||
"unable to register netdev: %d\n", err);
|
||||
goto out_error;
|
||||
}
|
||||
printk(KERN_INFO "%s: forcedeth.c: subsystem: %05x:%04x bound to %s\n",
|
||||
dev->name, pci_dev->subsystem_vendor, pci_dev->subsystem_device,
|
||||
pci_name(pci_dev));
|
||||
|
||||
dev_printk(KERN_INFO, &pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, "
|
||||
"addr %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
|
||||
dev->name,
|
||||
np->phy_oui,
|
||||
np->phyaddr,
|
||||
dev->dev_addr[0],
|
||||
dev->dev_addr[1],
|
||||
dev->dev_addr[2],
|
||||
dev->dev_addr[3],
|
||||
dev->dev_addr[4],
|
||||
dev->dev_addr[5]);
|
||||
|
||||
dev_printk(KERN_INFO, &pci_dev->dev, "%s%s%s%s%s%s%s%s%s%sdesc-v%u\n",
|
||||
dev->features & NETIF_F_HIGHDMA ? "highdma " : "",
|
||||
dev->features & (NETIF_F_HW_CSUM | NETIF_F_SG) ?
|
||||
"csum " : "",
|
||||
dev->features & (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX) ?
|
||||
"vlan " : "",
|
||||
id->driver_data & DEV_HAS_POWER_CNTRL ? "pwrctl " : "",
|
||||
id->driver_data & DEV_HAS_MGMT_UNIT ? "mgmt " : "",
|
||||
id->driver_data & DEV_NEED_TIMERIRQ ? "timirq " : "",
|
||||
np->gigabit == PHY_GIGABIT ? "gbit " : "",
|
||||
np->need_linktimer ? "lnktim " : "",
|
||||
np->msi_flags & NV_MSI_CAPABLE ? "msi " : "",
|
||||
np->msi_flags & NV_MSI_X_CAPABLE ? "msi-x " : "",
|
||||
np->desc_ver);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -5567,17 +5596,16 @@ static struct pci_device_id pci_tbl[] = {
|
||||
};
|
||||
|
||||
static struct pci_driver driver = {
|
||||
.name = "forcedeth",
|
||||
.id_table = pci_tbl,
|
||||
.probe = nv_probe,
|
||||
.remove = __devexit_p(nv_remove),
|
||||
.suspend = nv_suspend,
|
||||
.resume = nv_resume,
|
||||
.name = DRV_NAME,
|
||||
.id_table = pci_tbl,
|
||||
.probe = nv_probe,
|
||||
.remove = __devexit_p(nv_remove),
|
||||
.suspend = nv_suspend,
|
||||
.resume = nv_resume,
|
||||
};
|
||||
|
||||
static int __init init_nic(void)
|
||||
{
|
||||
printk(KERN_INFO "forcedeth.c: Reverse Engineered nForce ethernet driver. Version %s.\n", FORCEDETH_VERSION);
|
||||
return pci_register_driver(&driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -1237,8 +1237,6 @@ static int gfar_change_mtu(struct net_device *dev, int new_mtu)
|
||||
* starting over will fix the problem. */
|
||||
static void gfar_timeout(struct net_device *dev)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
|
||||
dev->stats.tx_errors++;
|
||||
|
||||
if (dev->flags & IFF_UP) {
|
||||
@@ -1344,8 +1342,9 @@ struct sk_buff * gfar_new_skb(struct net_device *dev, struct rxbd8 *bdp)
|
||||
return skb;
|
||||
}
|
||||
|
||||
static inline void count_errors(unsigned short status, struct gfar_private *priv)
|
||||
static inline void count_errors(unsigned short status, struct net_device *dev)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
struct gfar_extra_stats *estats = &priv->extra_stats;
|
||||
|
||||
@@ -1539,7 +1538,7 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
|
||||
|
||||
dev->stats.rx_bytes += pkt_len;
|
||||
} else {
|
||||
count_errors(bdp->status, priv);
|
||||
count_errors(bdp->status, dev);
|
||||
|
||||
if (skb)
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
@@ -45,6 +45,8 @@ int __devinit mal_register_commac(struct mal_instance *mal,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (list_empty(&mal->list))
|
||||
napi_enable(&mal->napi);
|
||||
mal->tx_chan_mask |= commac->tx_chan_mask;
|
||||
mal->rx_chan_mask |= commac->rx_chan_mask;
|
||||
list_add(&commac->list, &mal->list);
|
||||
@@ -67,6 +69,8 @@ void __devexit mal_unregister_commac(struct mal_instance *mal,
|
||||
mal->tx_chan_mask &= ~commac->tx_chan_mask;
|
||||
mal->rx_chan_mask &= ~commac->rx_chan_mask;
|
||||
list_del_init(&commac->list);
|
||||
if (list_empty(&mal->list))
|
||||
napi_disable(&mal->napi);
|
||||
|
||||
spin_unlock_irqrestore(&mal->lock, flags);
|
||||
}
|
||||
@@ -182,7 +186,7 @@ static inline void mal_enable_eob_irq(struct mal_instance *mal)
|
||||
set_mal_dcrn(mal, MAL_CFG, get_mal_dcrn(mal, MAL_CFG) | MAL_CFG_EOPIE);
|
||||
}
|
||||
|
||||
/* synchronized by __LINK_STATE_RX_SCHED bit in ndev->state */
|
||||
/* synchronized by NAPI state */
|
||||
static inline void mal_disable_eob_irq(struct mal_instance *mal)
|
||||
{
|
||||
// XXX might want to cache MAL_CFG as the DCR read can be slooooow
|
||||
@@ -317,8 +321,8 @@ void mal_poll_disable(struct mal_instance *mal, struct mal_commac *commac)
|
||||
while (test_and_set_bit(MAL_COMMAC_POLL_DISABLED, &commac->flags))
|
||||
msleep(1);
|
||||
|
||||
/* Synchronize with the MAL NAPI poller. */
|
||||
napi_disable(&mal->napi);
|
||||
/* Synchronize with the MAL NAPI poller */
|
||||
__napi_synchronize(&mal->napi);
|
||||
}
|
||||
|
||||
void mal_poll_enable(struct mal_instance *mal, struct mal_commac *commac)
|
||||
@@ -326,7 +330,12 @@ void mal_poll_enable(struct mal_instance *mal, struct mal_commac *commac)
|
||||
smp_wmb();
|
||||
clear_bit(MAL_COMMAC_POLL_DISABLED, &commac->flags);
|
||||
|
||||
// XXX might want to kick a poll now...
|
||||
/* Feels better to trigger a poll here to catch up with events that
|
||||
* may have happened on this channel while disabled. It will most
|
||||
* probably be delayed until the next interrupt but that's mostly a
|
||||
* non-issue in the context where this is called.
|
||||
*/
|
||||
napi_schedule(&mal->napi);
|
||||
}
|
||||
|
||||
static int mal_poll(struct napi_struct *napi, int budget)
|
||||
@@ -336,8 +345,7 @@ static int mal_poll(struct napi_struct *napi, int budget)
|
||||
int received = 0;
|
||||
unsigned long flags;
|
||||
|
||||
MAL_DBG2(mal, "poll(%d) %d ->" NL, *budget,
|
||||
rx_work_limit);
|
||||
MAL_DBG2(mal, "poll(%d)" NL, budget);
|
||||
again:
|
||||
/* Process TX skbs */
|
||||
list_for_each(l, &mal->poll_list) {
|
||||
@@ -528,11 +536,12 @@ static int __devinit mal_probe(struct of_device *ofdev,
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&mal->poll_list);
|
||||
mal->napi.weight = CONFIG_IBM_NEW_EMAC_POLL_WEIGHT;
|
||||
mal->napi.poll = mal_poll;
|
||||
INIT_LIST_HEAD(&mal->list);
|
||||
spin_lock_init(&mal->lock);
|
||||
|
||||
netif_napi_add(NULL, &mal->napi, mal_poll,
|
||||
CONFIG_IBM_NEW_EMAC_POLL_WEIGHT);
|
||||
|
||||
/* Load power-on reset defaults */
|
||||
mal_reset(mal);
|
||||
|
||||
|
||||
+383
-104
File diff suppressed because it is too large
Load Diff
+9
-8
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Definitions for the new Marvell Yukon / SysKonenct driver.
|
||||
* Definitions for the new Marvell Yukon / SysKonnect driver.
|
||||
*/
|
||||
#ifndef _SKGE_H
|
||||
#define _SKGE_H
|
||||
@@ -8,8 +8,10 @@
|
||||
#define PCI_DEV_REG1 0x40
|
||||
#define PCI_PHY_COMA 0x8000000
|
||||
#define PCI_VIO 0x2000000
|
||||
|
||||
#define PCI_DEV_REG2 0x44
|
||||
#define PCI_REV_DESC 0x4
|
||||
#define PCI_VPD_ROM_SZ 7L<<14 /* VPD ROM size 0=256, 1=512, ... */
|
||||
#define PCI_REV_DESC 1<<2 /* Reverse Descriptor bytes */
|
||||
|
||||
#define PCI_STATUS_ERROR_BITS (PCI_STATUS_DETECTED_PARITY | \
|
||||
PCI_STATUS_SIG_SYSTEM_ERROR | \
|
||||
@@ -2191,12 +2193,10 @@ enum {
|
||||
XM_IS_TXF_UR = 1<<2, /* Bit 2: Transmit FIFO Underrun */
|
||||
XM_IS_TX_COMP = 1<<1, /* Bit 1: Frame Tx Complete */
|
||||
XM_IS_RX_COMP = 1<<0, /* Bit 0: Frame Rx Complete */
|
||||
|
||||
XM_IMSK_DISABLE = 0xffff,
|
||||
};
|
||||
|
||||
#define XM_DEF_MSK (~(XM_IS_INP_ASS | XM_IS_LIPA_RC | \
|
||||
XM_IS_RXF_OV | XM_IS_TXF_UR))
|
||||
|
||||
|
||||
/* XM_HW_CFG 16 bit r/w Hardware Config Register */
|
||||
enum {
|
||||
XM_HW_GEN_EOP = 1<<3, /* Bit 3: generate End of Packet pulse */
|
||||
@@ -2469,8 +2469,9 @@ struct skge_port {
|
||||
void *mem; /* PCI memory for rings */
|
||||
dma_addr_t dma;
|
||||
unsigned long mem_size;
|
||||
|
||||
struct net_device_stats net_stats;
|
||||
#ifdef CONFIG_SKGE_DEBUG
|
||||
struct dentry *debugfs;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -760,7 +760,7 @@ static int xl_open_hw(struct net_device *dev)
|
||||
if (xl_priv->xl_laa[0]) { /* If using a LAA address */
|
||||
for (i=10;i<16;i++) {
|
||||
writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb) + i, xl_mmio + MMIO_MAC_ACCESS_CMD) ;
|
||||
writeb(xl_priv->xl_laa[i],xl_mmio + MMIO_MACDATA) ;
|
||||
writeb(xl_priv->xl_laa[i-10],xl_mmio + MMIO_MACDATA) ;
|
||||
}
|
||||
memcpy(dev->dev_addr,xl_priv->xl_laa,dev->addr_len) ;
|
||||
} else { /* Regular hardware address */
|
||||
|
||||
Reference in New Issue
Block a user