Commit 2304c3ac authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6:
  [netdrvr] forcedeth: add MCP77 device IDs
  rndis_host: reduce MTU instead of refusing to talk to devices with low max packet size
  cpmac: update to new fixed phy driver interface
  cpmac: convert to napi_struct interface
  cpmac: use print_mac() instead of MAC_FMT
  natsemi: fix oops, link back netdevice from private-struct
  ehea: fix port_napi_disable/enable
  bonding/bond_main.c: fix cut'n'paste error
  make bonding/bond_main.c:bond_deinit() static
  drivers/net/ipg.c: cleanups
  remove Documentation/networking/net-modules.txt
parents fcd05809 96fd4cd3
...@@ -80,8 +80,6 @@ multicast.txt ...@@ -80,8 +80,6 @@ multicast.txt
- Behaviour of cards under Multicast - Behaviour of cards under Multicast
ncsa-telnet ncsa-telnet
- notes on how NCSA telnet (DOS) breaks with MTU discovery enabled. - notes on how NCSA telnet (DOS) breaks with MTU discovery enabled.
net-modules.txt
- info and "insmod" parameters for all network driver modules.
netdevices.txt netdevices.txt
- info on network device driver functions exported to the kernel. - info on network device driver functions exported to the kernel.
olympic.txt olympic.txt
......
This diff is collapsed.
...@@ -188,6 +188,7 @@ struct bond_parm_tbl arp_validate_tbl[] = { ...@@ -188,6 +188,7 @@ struct bond_parm_tbl arp_validate_tbl[] = {
/*-------------------------- Forward declarations ---------------------------*/ /*-------------------------- Forward declarations ---------------------------*/
static void bond_send_gratuitous_arp(struct bonding *bond); static void bond_send_gratuitous_arp(struct bonding *bond);
static void bond_deinit(struct net_device *bond_dev);
/*---------------------------- General routines -----------------------------*/ /*---------------------------- General routines -----------------------------*/
...@@ -3681,7 +3682,7 @@ static int bond_open(struct net_device *bond_dev) ...@@ -3681,7 +3682,7 @@ static int bond_open(struct net_device *bond_dev)
} }
if (bond->params.mode == BOND_MODE_8023AD) { if (bond->params.mode == BOND_MODE_8023AD) {
INIT_DELAYED_WORK(&bond->ad_work, bond_alb_monitor); INIT_DELAYED_WORK(&bond->ad_work, bond_3ad_state_machine_handler);
queue_delayed_work(bond->wq, &bond->ad_work, 0); queue_delayed_work(bond->wq, &bond->ad_work, 0);
/* register to receive LACPDUs */ /* register to receive LACPDUs */
bond_register_lacpdu(bond); bond_register_lacpdu(bond);
...@@ -4449,7 +4450,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params) ...@@ -4449,7 +4450,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
/* De-initialize device specific data. /* De-initialize device specific data.
* Caller must hold rtnl_lock. * Caller must hold rtnl_lock.
*/ */
void bond_deinit(struct net_device *bond_dev) static void bond_deinit(struct net_device *bond_dev)
{ {
struct bonding *bond = bond_dev->priv; struct bonding *bond = bond_dev->priv;
......
...@@ -302,7 +302,6 @@ int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_de ...@@ -302,7 +302,6 @@ int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_de
int bond_create(char *name, struct bond_params *params, struct bonding **newbond); int bond_create(char *name, struct bond_params *params, struct bonding **newbond);
void bond_destroy(struct bonding *bond); void bond_destroy(struct bonding *bond);
int bond_release_and_destroy(struct net_device *bond_dev, struct net_device *slave_dev); int bond_release_and_destroy(struct net_device *bond_dev, struct net_device *slave_dev);
void bond_deinit(struct net_device *bond_dev);
int bond_create_sysfs(void); int bond_create_sysfs(void);
void bond_destroy_sysfs(void); void bond_destroy_sysfs(void);
void bond_destroy_sysfs_entry(struct bonding *bond); void bond_destroy_sysfs_entry(struct bonding *bond);
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/phy_fixed.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <asm/gpio.h> #include <asm/gpio.h>
...@@ -53,12 +54,6 @@ MODULE_PARM_DESC(debug_level, "Number of NETIF_MSG bits to enable"); ...@@ -53,12 +54,6 @@ MODULE_PARM_DESC(debug_level, "Number of NETIF_MSG bits to enable");
MODULE_PARM_DESC(dumb_switch, "Assume switch is not connected to MDIO bus"); MODULE_PARM_DESC(dumb_switch, "Assume switch is not connected to MDIO bus");
#define CPMAC_VERSION "0.5.0" #define CPMAC_VERSION "0.5.0"
/* stolen from net/ieee80211.h */
#ifndef MAC_FMT
#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
#define MAC_ARG(x) ((u8*)(x))[0], ((u8*)(x))[1], ((u8*)(x))[2], \
((u8*)(x))[3], ((u8*)(x))[4], ((u8*)(x))[5]
#endif
/* frame size + 802.1q tag */ /* frame size + 802.1q tag */
#define CPMAC_SKB_SIZE (ETH_FRAME_LEN + 4) #define CPMAC_SKB_SIZE (ETH_FRAME_LEN + 4)
#define CPMAC_QUEUES 8 #define CPMAC_QUEUES 8
...@@ -211,6 +206,7 @@ struct cpmac_priv { ...@@ -211,6 +206,7 @@ struct cpmac_priv {
struct net_device *dev; struct net_device *dev;
struct work_struct reset_work; struct work_struct reset_work;
struct platform_device *pdev; struct platform_device *pdev;
struct napi_struct napi;
}; };
static irqreturn_t cpmac_irq(int, void *); static irqreturn_t cpmac_irq(int, void *);
...@@ -362,47 +358,48 @@ static void cpmac_set_multicast_list(struct net_device *dev) ...@@ -362,47 +358,48 @@ static void cpmac_set_multicast_list(struct net_device *dev)
} }
} }
static struct sk_buff *cpmac_rx_one(struct net_device *dev, static struct sk_buff *cpmac_rx_one(struct cpmac_priv *priv,
struct cpmac_priv *priv,
struct cpmac_desc *desc) struct cpmac_desc *desc)
{ {
struct sk_buff *skb, *result = NULL; struct sk_buff *skb, *result = NULL;
if (unlikely(netif_msg_hw(priv))) if (unlikely(netif_msg_hw(priv)))
cpmac_dump_desc(dev, desc); cpmac_dump_desc(priv->dev, desc);
cpmac_write(priv->regs, CPMAC_RX_ACK(0), (u32)desc->mapping); cpmac_write(priv->regs, CPMAC_RX_ACK(0), (u32)desc->mapping);
if (unlikely(!desc->datalen)) { if (unlikely(!desc->datalen)) {
if (netif_msg_rx_err(priv) && net_ratelimit()) if (netif_msg_rx_err(priv) && net_ratelimit())
printk(KERN_WARNING "%s: rx: spurious interrupt\n", printk(KERN_WARNING "%s: rx: spurious interrupt\n",
dev->name); priv->dev->name);
return NULL; return NULL;
} }
skb = netdev_alloc_skb(dev, CPMAC_SKB_SIZE); skb = netdev_alloc_skb(priv->dev, CPMAC_SKB_SIZE);
if (likely(skb)) { if (likely(skb)) {
skb_reserve(skb, 2); skb_reserve(skb, 2);
skb_put(desc->skb, desc->datalen); skb_put(desc->skb, desc->datalen);
desc->skb->protocol = eth_type_trans(desc->skb, dev); desc->skb->protocol = eth_type_trans(desc->skb, priv->dev);
desc->skb->ip_summed = CHECKSUM_NONE; desc->skb->ip_summed = CHECKSUM_NONE;
dev->stats.rx_packets++; priv->dev->stats.rx_packets++;
dev->stats.rx_bytes += desc->datalen; priv->dev->stats.rx_bytes += desc->datalen;
result = desc->skb; result = desc->skb;
dma_unmap_single(&dev->dev, desc->data_mapping, CPMAC_SKB_SIZE, dma_unmap_single(&priv->dev->dev, desc->data_mapping,
DMA_FROM_DEVICE); CPMAC_SKB_SIZE, DMA_FROM_DEVICE);
desc->skb = skb; desc->skb = skb;
desc->data_mapping = dma_map_single(&dev->dev, skb->data, desc->data_mapping = dma_map_single(&priv->dev->dev, skb->data,
CPMAC_SKB_SIZE, CPMAC_SKB_SIZE,
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
desc->hw_data = (u32)desc->data_mapping; desc->hw_data = (u32)desc->data_mapping;
if (unlikely(netif_msg_pktdata(priv))) { if (unlikely(netif_msg_pktdata(priv))) {
printk(KERN_DEBUG "%s: received packet:\n", dev->name); printk(KERN_DEBUG "%s: received packet:\n",
cpmac_dump_skb(dev, result); priv->dev->name);
cpmac_dump_skb(priv->dev, result);
} }
} else { } else {
if (netif_msg_rx_err(priv) && net_ratelimit()) if (netif_msg_rx_err(priv) && net_ratelimit())
printk(KERN_WARNING printk(KERN_WARNING
"%s: low on skbs, dropping packet\n", dev->name); "%s: low on skbs, dropping packet\n",
dev->stats.rx_dropped++; priv->dev->name);
priv->dev->stats.rx_dropped++;
} }
desc->buflen = CPMAC_SKB_SIZE; desc->buflen = CPMAC_SKB_SIZE;
...@@ -411,25 +408,25 @@ static struct sk_buff *cpmac_rx_one(struct net_device *dev, ...@@ -411,25 +408,25 @@ static struct sk_buff *cpmac_rx_one(struct net_device *dev,
return result; return result;
} }
static int cpmac_poll(struct net_device *dev, int *budget) static int cpmac_poll(struct napi_struct *napi, int budget)
{ {
struct sk_buff *skb; struct sk_buff *skb;
struct cpmac_desc *desc; struct cpmac_desc *desc;
int received = 0, quota = min(dev->quota, *budget); int received = 0;
struct cpmac_priv *priv = netdev_priv(dev); struct cpmac_priv *priv = container_of(napi, struct cpmac_priv, napi);
spin_lock(&priv->rx_lock); spin_lock(&priv->rx_lock);
if (unlikely(!priv->rx_head)) { if (unlikely(!priv->rx_head)) {
if (netif_msg_rx_err(priv) && net_ratelimit()) if (netif_msg_rx_err(priv) && net_ratelimit())
printk(KERN_WARNING "%s: rx: polling, but no queue\n", printk(KERN_WARNING "%s: rx: polling, but no queue\n",
dev->name); priv->dev->name);
netif_rx_complete(dev); netif_rx_complete(priv->dev, napi);
return 0; return 0;
} }
desc = priv->rx_head; desc = priv->rx_head;
while ((received < quota) && ((desc->dataflags & CPMAC_OWN) == 0)) { while (((desc->dataflags & CPMAC_OWN) == 0) && (received < budget)) {
skb = cpmac_rx_one(dev, priv, desc); skb = cpmac_rx_one(priv, desc);
if (likely(skb)) { if (likely(skb)) {
netif_receive_skb(skb); netif_receive_skb(skb);
received++; received++;
...@@ -439,13 +436,11 @@ static int cpmac_poll(struct net_device *dev, int *budget) ...@@ -439,13 +436,11 @@ static int cpmac_poll(struct net_device *dev, int *budget)
priv->rx_head = desc; priv->rx_head = desc;
spin_unlock(&priv->rx_lock); spin_unlock(&priv->rx_lock);
*budget -= received;
dev->quota -= received;
if (unlikely(netif_msg_rx_status(priv))) if (unlikely(netif_msg_rx_status(priv)))
printk(KERN_DEBUG "%s: poll processed %d packets\n", dev->name, printk(KERN_DEBUG "%s: poll processed %d packets\n",
received); priv->dev->name, received);
if (desc->dataflags & CPMAC_OWN) { if (desc->dataflags & CPMAC_OWN) {
netif_rx_complete(dev); netif_rx_complete(priv->dev, napi);
cpmac_write(priv->regs, CPMAC_RX_PTR(0), (u32)desc->mapping); cpmac_write(priv->regs, CPMAC_RX_PTR(0), (u32)desc->mapping);
cpmac_write(priv->regs, CPMAC_RX_INT_ENABLE, 1); cpmac_write(priv->regs, CPMAC_RX_INT_ENABLE, 1);
return 0; return 0;
...@@ -655,6 +650,7 @@ static void cpmac_hw_error(struct work_struct *work) ...@@ -655,6 +650,7 @@ static void cpmac_hw_error(struct work_struct *work)
spin_unlock(&priv->rx_lock); spin_unlock(&priv->rx_lock);
cpmac_clear_tx(priv->dev); cpmac_clear_tx(priv->dev);
cpmac_hw_start(priv->dev); cpmac_hw_start(priv->dev);
napi_enable(&priv->napi);
netif_start_queue(priv->dev); netif_start_queue(priv->dev);
} }
...@@ -681,8 +677,10 @@ static irqreturn_t cpmac_irq(int irq, void *dev_id) ...@@ -681,8 +677,10 @@ static irqreturn_t cpmac_irq(int irq, void *dev_id)
if (status & MAC_INT_RX) { if (status & MAC_INT_RX) {
queue = (status >> 8) & 7; queue = (status >> 8) & 7;
netif_rx_schedule(dev); if (netif_rx_schedule_prep(dev, &priv->napi)) {
cpmac_write(priv->regs, CPMAC_RX_INT_CLEAR, 1 << queue); cpmac_write(priv->regs, CPMAC_RX_INT_CLEAR, 1 << queue);
__netif_rx_schedule(dev, &priv->napi);
}
} }
cpmac_write(priv->regs, CPMAC_MAC_EOI_VECTOR, 0); cpmac_write(priv->regs, CPMAC_MAC_EOI_VECTOR, 0);
...@@ -692,6 +690,7 @@ static irqreturn_t cpmac_irq(int irq, void *dev_id) ...@@ -692,6 +690,7 @@ static irqreturn_t cpmac_irq(int irq, void *dev_id)
printk(KERN_ERR "%s: hw error, resetting...\n", printk(KERN_ERR "%s: hw error, resetting...\n",
dev->name); dev->name);
netif_stop_queue(dev); netif_stop_queue(dev);
napi_disable(&priv->napi);
cpmac_hw_stop(dev); cpmac_hw_stop(dev);
schedule_work(&priv->reset_work); schedule_work(&priv->reset_work);
if (unlikely(netif_msg_hw(priv))) if (unlikely(netif_msg_hw(priv)))
...@@ -849,6 +848,15 @@ static void cpmac_adjust_link(struct net_device *dev) ...@@ -849,6 +848,15 @@ static void cpmac_adjust_link(struct net_device *dev)
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
} }
static int cpmac_link_update(struct net_device *dev,
struct fixed_phy_status *status)
{
status->link = 1;
status->speed = 100;
status->duplex = 1;
return 0;
}
static int cpmac_open(struct net_device *dev) static int cpmac_open(struct net_device *dev)
{ {
int i, size, res; int i, size, res;
...@@ -857,15 +865,6 @@ static int cpmac_open(struct net_device *dev) ...@@ -857,15 +865,6 @@ static int cpmac_open(struct net_device *dev)
struct cpmac_desc *desc; struct cpmac_desc *desc;
struct sk_buff *skb; struct sk_buff *skb;
priv->phy = phy_connect(dev, priv->phy_name, &cpmac_adjust_link,
0, PHY_INTERFACE_MODE_MII);
if (IS_ERR(priv->phy)) {
if (netif_msg_drv(priv))
printk(KERN_ERR "%s: Could not attach to PHY\n",
dev->name);
return PTR_ERR(priv->phy);
}
mem = platform_get_resource_byname(priv->pdev, IORESOURCE_MEM, "regs"); mem = platform_get_resource_byname(priv->pdev, IORESOURCE_MEM, "regs");
if (!request_mem_region(mem->start, mem->end - mem->start, dev->name)) { if (!request_mem_region(mem->start, mem->end - mem->start, dev->name)) {
if (netif_msg_drv(priv)) if (netif_msg_drv(priv))
...@@ -927,6 +926,7 @@ static int cpmac_open(struct net_device *dev) ...@@ -927,6 +926,7 @@ static int cpmac_open(struct net_device *dev)
INIT_WORK(&priv->reset_work, cpmac_hw_error); INIT_WORK(&priv->reset_work, cpmac_hw_error);
cpmac_hw_start(dev); cpmac_hw_start(dev);
napi_enable(&priv->napi);
priv->phy->state = PHY_CHANGELINK; priv->phy->state = PHY_CHANGELINK;
phy_start(priv->phy); phy_start(priv->phy);
...@@ -951,8 +951,6 @@ static int cpmac_open(struct net_device *dev) ...@@ -951,8 +951,6 @@ static int cpmac_open(struct net_device *dev)
release_mem_region(mem->start, mem->end - mem->start); release_mem_region(mem->start, mem->end - mem->start);
fail_reserve: fail_reserve:
phy_disconnect(priv->phy);
return res; return res;
} }
...@@ -965,9 +963,8 @@ static int cpmac_stop(struct net_device *dev) ...@@ -965,9 +963,8 @@ static int cpmac_stop(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
cancel_work_sync(&priv->reset_work); cancel_work_sync(&priv->reset_work);
napi_disable(&priv->napi);
phy_stop(priv->phy); phy_stop(priv->phy);
phy_disconnect(priv->phy);
priv->phy = NULL;
cpmac_hw_stop(dev); cpmac_hw_stop(dev);
...@@ -1001,11 +998,13 @@ static int external_switch; ...@@ -1001,11 +998,13 @@ static int external_switch;
static int __devinit cpmac_probe(struct platform_device *pdev) static int __devinit cpmac_probe(struct platform_device *pdev)
{ {
int rc, phy_id; int rc, phy_id, i;
struct resource *mem; struct resource *mem;
struct cpmac_priv *priv; struct cpmac_priv *priv;
struct net_device *dev; struct net_device *dev;
struct plat_cpmac_data *pdata; struct plat_cpmac_data *pdata;
struct fixed_info *fixed_phy;
DECLARE_MAC_BUF(mac);
pdata = pdev->dev.platform_data; pdata = pdev->dev.platform_data;
...@@ -1053,21 +1052,51 @@ static int __devinit cpmac_probe(struct platform_device *pdev) ...@@ -1053,21 +1052,51 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
dev->set_multicast_list = cpmac_set_multicast_list; dev->set_multicast_list = cpmac_set_multicast_list;
dev->tx_timeout = cpmac_tx_timeout; dev->tx_timeout = cpmac_tx_timeout;
dev->ethtool_ops = &cpmac_ethtool_ops; dev->ethtool_ops = &cpmac_ethtool_ops;
dev->poll = cpmac_poll;
dev->weight = 64;
dev->features |= NETIF_F_MULTI_QUEUE; dev->features |= NETIF_F_MULTI_QUEUE;
netif_napi_add(dev, &priv->napi, cpmac_poll, 64);
spin_lock_init(&priv->lock); spin_lock_init(&priv->lock);
spin_lock_init(&priv->rx_lock); spin_lock_init(&priv->rx_lock);
priv->dev = dev; priv->dev = dev;
priv->ring_size = 64; priv->ring_size = 64;
priv->msg_enable = netif_msg_init(debug_level, 0xff); priv->msg_enable = netif_msg_init(debug_level, 0xff);
memcpy(dev->dev_addr, pdata->dev_addr, sizeof(dev->dev_addr)); memcpy(dev->dev_addr, pdata->dev_addr, sizeof(dev->dev_addr));
if (phy_id == 31) { if (phy_id == 31) {
snprintf(priv->phy_name, BUS_ID_SIZE, PHY_ID_FMT, snprintf(priv->phy_name, BUS_ID_SIZE, PHY_ID_FMT, cpmac_mii.id,
cpmac_mii.id, phy_id); phy_id);
} else } else {
snprintf(priv->phy_name, BUS_ID_SIZE, "fixed@%d:%d", 100, 1); /* Let's try to get a free fixed phy... */
for (i = 0; i < MAX_PHY_AMNT; i++) {
fixed_phy = fixed_mdio_get_phydev(i);
if (!fixed_phy)
continue;
if (!fixed_phy->phydev->attached_dev) {
strncpy(priv->phy_name,
fixed_phy->phydev->dev.bus_id,
BUS_ID_SIZE);
fixed_mdio_set_link_update(fixed_phy->phydev,
&cpmac_link_update);
goto phy_found;
}
}
if (netif_msg_drv(priv))
printk(KERN_ERR "%s: Could not find fixed PHY\n",
dev->name);
rc = -ENODEV;
goto fail;
}
phy_found:
priv->phy = phy_connect(dev, priv->phy_name, &cpmac_adjust_link, 0,
PHY_INTERFACE_MODE_MII);
if (IS_ERR(priv->phy)) {
if (netif_msg_drv(priv))
printk(KERN_ERR "%s: Could not attach to PHY\n",
dev->name);
return PTR_ERR(priv->phy);
}
if ((rc = register_netdev(dev))) { if ((rc = register_netdev(dev))) {
printk(KERN_ERR "cpmac: error %i registering device %s\n", rc, printk(KERN_ERR "cpmac: error %i registering device %s\n", rc,
...@@ -1077,9 +1106,9 @@ static int __devinit cpmac_probe(struct platform_device *pdev) ...@@ -1077,9 +1106,9 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
if (netif_msg_probe(priv)) { if (netif_msg_probe(priv)) {
printk(KERN_INFO printk(KERN_INFO
"cpmac: device %s (regs: %p, irq: %d, phy: %s, mac: " "cpmac: device %s (regs: %p, irq: %d, phy: %s, "
MAC_FMT ")\n", dev->name, (void *)mem->start, dev->irq, "mac: %s)\n", dev->name, (void *)mem->start, dev->irq,
priv->phy_name, MAC_ARG(dev->dev_addr)); priv->phy_name, print_mac(mac, dev->dev_addr));
} }
return 0; return 0;
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "ehea" #define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_0078" #define DRV_VERSION "EHEA_0079"
/* eHEA capability flags */ /* eHEA capability flags */
#define DLPAR_PORT_ADD_REM 1 #define DLPAR_PORT_ADD_REM 1
......
...@@ -2329,7 +2329,7 @@ static void port_napi_disable(struct ehea_port *port) ...@@ -2329,7 +2329,7 @@ static void port_napi_disable(struct ehea_port *port)
{ {
int i; int i;
for (i = 0; i < port->num_def_qps; i++) for (i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++)
napi_disable(&port->port_res[i].napi); napi_disable(&port->port_res[i].napi);
} }
...@@ -2337,7 +2337,7 @@ static void port_napi_enable(struct ehea_port *port) ...@@ -2337,7 +2337,7 @@ static void port_napi_enable(struct ehea_port *port)
{ {
int i; int i;
for (i = 0; i < port->num_def_qps; i++) for (i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++)
napi_enable(&port->port_res[i].napi); napi_enable(&port->port_res[i].napi);
} }
...@@ -2373,8 +2373,6 @@ static int ehea_down(struct net_device *dev) ...@@ -2373,8 +2373,6 @@ static int ehea_down(struct net_device *dev)
ehea_drop_multicast_list(dev); ehea_drop_multicast_list(dev);
ehea_free_interrupts(dev); ehea_free_interrupts(dev);
port_napi_disable(port);
port->state = EHEA_PORT_DOWN; port->state = EHEA_PORT_DOWN;
ret = ehea_clean_all_portres(port); ret = ehea_clean_all_portres(port);
...@@ -2396,6 +2394,7 @@ static int ehea_stop(struct net_device *dev) ...@@ -2396,6 +2394,7 @@ static int ehea_stop(struct net_device *dev)
flush_scheduled_work(); flush_scheduled_work();
down(&port->port_lock); down(&port->port_lock);
netif_stop_queue(dev); netif_stop_queue(dev);
port_napi_disable(port);
ret = ehea_down(dev); ret = ehea_down(dev);
up(&port->port_lock); up(&port->port_lock);
return ret; return ret;
......
...@@ -5597,6 +5597,22 @@ static struct pci_device_id pci_tbl[] = { ...@@ -5597,6 +5597,22 @@ static struct pci_device_id pci_tbl[] = {
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_31), PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_31),
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
}, },
{ /* MCP77 Ethernet Controller */
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32),
.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,
},
{ /* MCP77 Ethernet Controller */
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33),
.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,
},
{ /* MCP77 Ethernet Controller */
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34),
.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,
},
{ /* MCP77 Ethernet Controller */
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35),
.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,
},
{0,}, {0,},
}; };
......
...@@ -55,6 +55,26 @@ MODULE_DESCRIPTION("IC Plus IP1000 Gigabit Ethernet Adapter Linux Driver " ...@@ -55,6 +55,26 @@ MODULE_DESCRIPTION("IC Plus IP1000 Gigabit Ethernet Adapter Linux Driver "
DrvVer); DrvVer);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
//variable record -- index by leading revision/length
//Revision/Length(=N*4), Address1, Data1, Address2, Data2,...,AddressN,DataN
static unsigned short DefaultPhyParam[] = {
// 11/12/03 IP1000A v1-3 rev=0x40
/*--------------------------------------------------------------------------
(0x4000|(15*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 22, 0x85bd, 24, 0xfff2,
27, 0x0c10, 28, 0x0c10, 29, 0x2c10, 31, 0x0003, 23, 0x92f6,
31, 0x0000, 23, 0x003d, 30, 0x00de, 20, 0x20e7, 9, 0x0700,
--------------------------------------------------------------------------*/
// 12/17/03 IP1000A v1-4 rev=0x40
(0x4000 | (07 * 4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31,
0x0000,
30, 0x005e, 9, 0x0700,
// 01/09/04 IP1000A v1-5 rev=0x41
(0x4100 | (07 * 4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31,
0x0000,
30, 0x005e, 9, 0x0700,
0x0000
};
static const char *ipg_brand_name[] = { static const char *ipg_brand_name[] = {
"IC PLUS IP1000 1000/100/10 based NIC", "IC PLUS IP1000 1000/100/10 based NIC",
"Sundance Technology ST2021 based NIC", "Sundance Technology ST2021 based NIC",
...@@ -990,7 +1010,7 @@ static void ipg_nic_txcleanup(struct net_device *dev) ...@@ -990,7 +1010,7 @@ static void ipg_nic_txcleanup(struct net_device *dev)
} }
/* Provides statistical information about the IPG NIC. */ /* Provides statistical information about the IPG NIC. */
struct net_device_stats *ipg_nic_get_stats(struct net_device *dev) static struct net_device_stats *ipg_nic_get_stats(struct net_device *dev)
{ {
struct ipg_nic_private *sp = netdev_priv(dev); struct ipg_nic_private *sp = netdev_priv(dev);
void __iomem *ioaddr = sp->ioaddr; void __iomem *ioaddr = sp->ioaddr;
......
...@@ -833,24 +833,4 @@ struct ipg_nic_private { ...@@ -833,24 +833,4 @@ struct ipg_nic_private {
struct delayed_work task; struct delayed_work task;
}; };
//variable record -- index by leading revision/length
//Revision/Length(=N*4), Address1, Data1, Address2, Data2,...,AddressN,DataN
unsigned short DefaultPhyParam[] = {
// 11/12/03 IP1000A v1-3 rev=0x40
/*--------------------------------------------------------------------------
(0x4000|(15*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 22, 0x85bd, 24, 0xfff2,
27, 0x0c10, 28, 0x0c10, 29, 0x2c10, 31, 0x0003, 23, 0x92f6,
31, 0x0000, 23, 0x003d, 30, 0x00de, 20, 0x20e7, 9, 0x0700,
--------------------------------------------------------------------------*/
// 12/17/03 IP1000A v1-4 rev=0x40
(0x4000 | (07 * 4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31,
0x0000,
30, 0x005e, 9, 0x0700,
// 01/09/04 IP1000A v1-5 rev=0x41
(0x4100 | (07 * 4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31,
0x0000,
30, 0x005e, 9, 0x0700,
0x0000
};
#endif /* __LINUX_IPG_H */ #endif /* __LINUX_IPG_H */
...@@ -864,6 +864,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, ...@@ -864,6 +864,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
np = netdev_priv(dev); np = netdev_priv(dev);
netif_napi_add(dev, &np->napi, natsemi_poll, 64); netif_napi_add(dev, &np->napi, natsemi_poll, 64);
np->dev = dev;
np->pci_dev = pdev; np->pci_dev = pdev;
pci_set_drvdata(pdev, dev); pci_set_drvdata(pdev, dev);
......
...@@ -512,11 +512,19 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) ...@@ -512,11 +512,19 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
} }
tmp = le32_to_cpu(u.init_c->max_transfer_size); tmp = le32_to_cpu(u.init_c->max_transfer_size);
if (tmp < dev->hard_mtu) { if (tmp < dev->hard_mtu) {
dev_err(&intf->dev, if (tmp <= net->hard_header_len) {
"dev can't take %u byte packets (max %u)\n", dev_err(&intf->dev,
dev->hard_mtu, tmp); "dev can't take %u byte packets (max %u)\n",
retval = -EINVAL; dev->hard_mtu, tmp);
goto fail_and_release; retval = -EINVAL;
goto fail_and_release;
}
dev->hard_mtu = tmp;
net->mtu = dev->hard_mtu - net->hard_header_len;
dev_warn(&intf->dev,
"dev can't take %u byte packets (max %u), "
"adjusting MTU to %u\n",
dev->hard_mtu, tmp, net->mtu);
} }
/* REVISIT: peripheral "alignment" request is ignored ... */ /* REVISIT: peripheral "alignment" request is ignored ... */
......
...@@ -1236,6 +1236,10 @@ ...@@ -1236,6 +1236,10 @@
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759
#define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760
#define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761
#define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762
#define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763
#define PCI_VENDOR_ID_IMS 0x10e0 #define PCI_VENDOR_ID_IMS 0x10e0
#define PCI_DEVICE_ID_IMS_TT128 0x9128 #define PCI_DEVICE_ID_IMS_TT128 0x9128
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment