提交 d3143e71 编写于 作者: L Linus Torvalds

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:
  Broadcom 4400 resume small fix
  b44: src_desc->addr is little-endian
  e100: fix irq leak on suspend/resume
  bonding: ARP monitoring broken on x86_64
  ehea: Fixed missing tasklet_kill() call
  ehea: Fixed wrong jumbo frames status query
  82596 warning fixes
  FS_ENET: OF-related fixup for FEC and SCC MAC's
  net: ifb error path loop fix
  b44: Fix frequent link changes
...@@ -1066,8 +1066,8 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1066,8 +1066,8 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev)
short length = skb->len; short length = skb->len;
dev->trans_start = jiffies; dev->trans_start = jiffies;
DEB(DEB_STARTTX,printk(KERN_DEBUG "%s: i596_start_xmit(%x,%x) called\n", dev->name, DEB(DEB_STARTTX,printk(KERN_DEBUG "%s: i596_start_xmit(%x,%p) called\n",
skb->len, (unsigned int)skb->data)); dev->name, skb->len, skb->data));
if (skb->len < ETH_ZLEN) { if (skb->len < ETH_ZLEN) {
if (skb_padto(skb, ETH_ZLEN)) if (skb_padto(skb, ETH_ZLEN))
...@@ -1246,7 +1246,8 @@ struct net_device * __init i82596_probe(int unit) ...@@ -1246,7 +1246,8 @@ struct net_device * __init i82596_probe(int unit)
dev->priv = (void *)(dev->mem_start); dev->priv = (void *)(dev->mem_start);
lp = dev->priv; lp = dev->priv;
DEB(DEB_INIT,printk(KERN_DEBUG "%s: lp at 0x%08lx (%d bytes), lp->scb at 0x%08lx\n", DEB(DEB_INIT,printk(KERN_DEBUG "%s: lp at 0x%08lx (%zd bytes), "
"lp->scb at 0x%08lx\n",
dev->name, (unsigned long)lp, dev->name, (unsigned long)lp,
sizeof(struct i596_private), (unsigned long)&lp->scb)); sizeof(struct i596_private), (unsigned long)&lp->scb));
memset((void *) lp, 0, sizeof(struct i596_private)); memset((void *) lp, 0, sizeof(struct i596_private));
......
...@@ -110,6 +110,11 @@ MODULE_DEVICE_TABLE(pci, b44_pci_tbl); ...@@ -110,6 +110,11 @@ MODULE_DEVICE_TABLE(pci, b44_pci_tbl);
static void b44_halt(struct b44 *); static void b44_halt(struct b44 *);
static void b44_init_rings(struct b44 *); static void b44_init_rings(struct b44 *);
#define B44_FULL_RESET 1
#define B44_FULL_RESET_SKIP_PHY 2
#define B44_PARTIAL_RESET 3
static void b44_init_hw(struct b44 *, int); static void b44_init_hw(struct b44 *, int);
static int dma_desc_align_mask; static int dma_desc_align_mask;
...@@ -884,7 +889,7 @@ static int b44_poll(struct net_device *netdev, int *budget) ...@@ -884,7 +889,7 @@ static int b44_poll(struct net_device *netdev, int *budget)
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
b44_halt(bp); b44_halt(bp);
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp, 1); b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY);
netif_wake_queue(bp->dev); netif_wake_queue(bp->dev);
spin_unlock_irqrestore(&bp->lock, flags); spin_unlock_irqrestore(&bp->lock, flags);
done = 1; done = 1;
...@@ -954,7 +959,7 @@ static void b44_tx_timeout(struct net_device *dev) ...@@ -954,7 +959,7 @@ static void b44_tx_timeout(struct net_device *dev)
b44_halt(bp); b44_halt(bp);
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp, 1); b44_init_hw(bp, B44_FULL_RESET);
spin_unlock_irq(&bp->lock); spin_unlock_irq(&bp->lock);
...@@ -1071,7 +1076,7 @@ static int b44_change_mtu(struct net_device *dev, int new_mtu) ...@@ -1071,7 +1076,7 @@ static int b44_change_mtu(struct net_device *dev, int new_mtu)
b44_halt(bp); b44_halt(bp);
dev->mtu = new_mtu; dev->mtu = new_mtu;
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp, 1); b44_init_hw(bp, B44_FULL_RESET);
spin_unlock_irq(&bp->lock); spin_unlock_irq(&bp->lock);
b44_enable_ints(bp); b44_enable_ints(bp);
...@@ -1368,12 +1373,12 @@ static int b44_set_mac_addr(struct net_device *dev, void *p) ...@@ -1368,12 +1373,12 @@ static int b44_set_mac_addr(struct net_device *dev, void *p)
* packet processing. Invoked with bp->lock held. * packet processing. Invoked with bp->lock held.
*/ */
static void __b44_set_rx_mode(struct net_device *); static void __b44_set_rx_mode(struct net_device *);
static void b44_init_hw(struct b44 *bp, int full_reset) static void b44_init_hw(struct b44 *bp, int reset_kind)
{ {
u32 val; u32 val;
b44_chip_reset(bp); b44_chip_reset(bp);
if (full_reset) { if (reset_kind == B44_FULL_RESET) {
b44_phy_reset(bp); b44_phy_reset(bp);
b44_setup_phy(bp); b44_setup_phy(bp);
} }
...@@ -1390,7 +1395,10 @@ static void b44_init_hw(struct b44 *bp, int full_reset) ...@@ -1390,7 +1395,10 @@ static void b44_init_hw(struct b44 *bp, int full_reset)
bw32(bp, B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN); bw32(bp, B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
bw32(bp, B44_TX_WMARK, 56); /* XXX magic */ bw32(bp, B44_TX_WMARK, 56); /* XXX magic */
if (full_reset) { if (reset_kind == B44_PARTIAL_RESET) {
bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
(bp->rx_offset << DMARX_CTRL_ROSHIFT)));
} else {
bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE); bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE);
bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset); bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset);
bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE | bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
...@@ -1401,9 +1409,6 @@ static void b44_init_hw(struct b44 *bp, int full_reset) ...@@ -1401,9 +1409,6 @@ static void b44_init_hw(struct b44 *bp, int full_reset)
bp->rx_prod = bp->rx_pending; bp->rx_prod = bp->rx_pending;
bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ); bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
} else {
bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
(bp->rx_offset << DMARX_CTRL_ROSHIFT)));
} }
val = br32(bp, B44_ENET_CTRL); val = br32(bp, B44_ENET_CTRL);
...@@ -1420,7 +1425,7 @@ static int b44_open(struct net_device *dev) ...@@ -1420,7 +1425,7 @@ static int b44_open(struct net_device *dev)
goto out; goto out;
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp, 1); b44_init_hw(bp, B44_FULL_RESET);
b44_check_phy(bp); b44_check_phy(bp);
...@@ -1629,7 +1634,7 @@ static int b44_close(struct net_device *dev) ...@@ -1629,7 +1634,7 @@ static int b44_close(struct net_device *dev)
netif_poll_enable(dev); netif_poll_enable(dev);
if (bp->flags & B44_FLAG_WOL_ENABLE) { if (bp->flags & B44_FLAG_WOL_ENABLE) {
b44_init_hw(bp, 0); b44_init_hw(bp, B44_PARTIAL_RESET);
b44_setup_wol(bp); b44_setup_wol(bp);
} }
...@@ -1905,7 +1910,7 @@ static int b44_set_ringparam(struct net_device *dev, ...@@ -1905,7 +1910,7 @@ static int b44_set_ringparam(struct net_device *dev,
b44_halt(bp); b44_halt(bp);
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp, 1); b44_init_hw(bp, B44_FULL_RESET);
netif_wake_queue(bp->dev); netif_wake_queue(bp->dev);
spin_unlock_irq(&bp->lock); spin_unlock_irq(&bp->lock);
...@@ -1948,7 +1953,7 @@ static int b44_set_pauseparam(struct net_device *dev, ...@@ -1948,7 +1953,7 @@ static int b44_set_pauseparam(struct net_device *dev,
if (bp->flags & B44_FLAG_PAUSE_AUTO) { if (bp->flags & B44_FLAG_PAUSE_AUTO) {
b44_halt(bp); b44_halt(bp);
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp, 1); b44_init_hw(bp, B44_FULL_RESET);
} else { } else {
__b44_set_flow_ctrl(bp, bp->flags); __b44_set_flow_ctrl(bp, bp->flags);
} }
...@@ -2304,7 +2309,7 @@ static int b44_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -2304,7 +2309,7 @@ static int b44_suspend(struct pci_dev *pdev, pm_message_t state)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (bp->flags & B44_FLAG_WOL_ENABLE) { if (bp->flags & B44_FLAG_WOL_ENABLE) {
b44_init_hw(bp, 0); b44_init_hw(bp, B44_PARTIAL_RESET);
b44_setup_wol(bp); b44_setup_wol(bp);
} }
pci_disable_device(pdev); pci_disable_device(pdev);
...@@ -2315,21 +2320,32 @@ static int b44_resume(struct pci_dev *pdev) ...@@ -2315,21 +2320,32 @@ static int b44_resume(struct pci_dev *pdev)
{ {
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = pci_get_drvdata(pdev);
struct b44 *bp = netdev_priv(dev); struct b44 *bp = netdev_priv(dev);
int rc = 0;
pci_restore_state(pdev); pci_restore_state(pdev);
pci_enable_device(pdev); rc = pci_enable_device(pdev);
if (rc) {
printk(KERN_ERR PFX "%s: pci_enable_device failed\n",
dev->name);
return rc;
}
pci_set_master(pdev); pci_set_master(pdev);
if (!netif_running(dev)) if (!netif_running(dev))
return 0; return 0;
if (request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev)) rc = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
if (rc) {
printk(KERN_ERR PFX "%s: request_irq failed\n", dev->name); printk(KERN_ERR PFX "%s: request_irq failed\n", dev->name);
pci_disable_device(pdev);
return rc;
}
spin_lock_irq(&bp->lock); spin_lock_irq(&bp->lock);
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp, 1); b44_init_hw(bp, B44_FULL_RESET);
netif_device_attach(bp->dev); netif_device_attach(bp->dev);
spin_unlock_irq(&bp->lock); spin_unlock_irq(&bp->lock);
......
...@@ -151,8 +151,8 @@ struct slave { ...@@ -151,8 +151,8 @@ struct slave {
struct slave *next; struct slave *next;
struct slave *prev; struct slave *prev;
int delay; int delay;
u32 jiffies; unsigned long jiffies;
u32 last_arp_rx; unsigned long last_arp_rx;
s8 link; /* one of BOND_LINK_XXXX */ s8 link; /* one of BOND_LINK_XXXX */
s8 state; /* one of BOND_STATE_XXXX */ s8 state; /* one of BOND_STATE_XXXX */
u32 original_flags; u32 original_flags;
...@@ -242,7 +242,8 @@ extern inline int slave_do_arp_validate(struct bonding *bond, struct slave *slav ...@@ -242,7 +242,8 @@ extern inline int slave_do_arp_validate(struct bonding *bond, struct slave *slav
return bond->params.arp_validate & (1 << slave->state); return bond->params.arp_validate & (1 << slave->state);
} }
extern inline u32 slave_last_rx(struct bonding *bond, struct slave *slave) extern inline unsigned long slave_last_rx(struct bonding *bond,
struct slave *slave)
{ {
if (slave_do_arp_validate(bond, slave)) if (slave_do_arp_validate(bond, slave))
return slave->last_arp_rx; return slave->last_arp_rx;
......
...@@ -2725,6 +2725,7 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -2725,6 +2725,7 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
del_timer_sync(&nic->watchdog); del_timer_sync(&nic->watchdog);
netif_carrier_off(nic->netdev); netif_carrier_off(nic->netdev);
netif_device_detach(netdev);
pci_save_state(pdev); pci_save_state(pdev);
if ((nic->flags & wol_magic) | e100_asf(nic)) { if ((nic->flags & wol_magic) | e100_asf(nic)) {
...@@ -2736,6 +2737,7 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -2736,6 +2737,7 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
} }
pci_disable_device(pdev); pci_disable_device(pdev);
free_irq(pdev->irq, netdev);
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
return 0; return 0;
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "ehea" #define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_0044" #define DRV_VERSION "EHEA_0045"
#define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
| NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
......
...@@ -2316,6 +2316,7 @@ static int ehea_setup_single_port(struct ehea_port *port, ...@@ -2316,6 +2316,7 @@ static int ehea_setup_single_port(struct ehea_port *port,
struct ehea_adapter *adapter = port->adapter; struct ehea_adapter *adapter = port->adapter;
struct hcp_ehea_port_cb4 *cb4; struct hcp_ehea_port_cb4 *cb4;
u32 *dn_log_port_id; u32 *dn_log_port_id;
int jumbo = 0;
sema_init(&port->port_lock, 1); sema_init(&port->port_lock, 1);
port->state = EHEA_PORT_DOWN; port->state = EHEA_PORT_DOWN;
...@@ -2357,13 +2358,25 @@ static int ehea_setup_single_port(struct ehea_port *port, ...@@ -2357,13 +2358,25 @@ static int ehea_setup_single_port(struct ehea_port *port,
if (!cb4) { if (!cb4) {
ehea_error("no mem for cb4"); ehea_error("no mem for cb4");
} else { } else {
cb4->jumbo_frame = 1; hret = ehea_h_query_ehea_port(adapter->handle,
hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
port->logical_port_id, H_PORT_CB4,
H_PORT_CB4, H_PORT_CB4_JUMBO, H_PORT_CB4_JUMBO, cb4);
cb4);
if (hret != H_SUCCESS) { if (hret == H_SUCCESS) {
ehea_info("Jumbo frames not activated"); if (cb4->jumbo_frame)
jumbo = 1;
else {
cb4->jumbo_frame = 1;
hret = ehea_h_modify_ehea_port(adapter->handle,
port->
logical_port_id,
H_PORT_CB4,
H_PORT_CB4_JUMBO,
cb4);
if (hret == H_SUCCESS)
jumbo = 1;
}
} }
kfree(cb4); kfree(cb4);
} }
...@@ -2402,6 +2415,9 @@ static int ehea_setup_single_port(struct ehea_port *port, ...@@ -2402,6 +2415,9 @@ static int ehea_setup_single_port(struct ehea_port *port,
goto out_free; goto out_free;
} }
ehea_info("%s: Jumbo frames are %sabled", dev->name,
jumbo == 1 ? "en" : "dis");
port->netdev = dev; port->netdev = dev;
ret = 0; ret = 0;
goto out; goto out;
...@@ -2582,6 +2598,7 @@ static int __devexit ehea_remove(struct ibmebus_dev *dev) ...@@ -2582,6 +2598,7 @@ static int __devexit ehea_remove(struct ibmebus_dev *dev)
destroy_workqueue(adapter->ehea_wq); destroy_workqueue(adapter->ehea_wq);
ibmebus_free_irq(NULL, adapter->neq->attr.ist1, adapter); ibmebus_free_irq(NULL, adapter->neq->attr.ist1, adapter);
tasklet_kill(&adapter->neq_tasklet);
ehea_destroy_eq(adapter->neq); ehea_destroy_eq(adapter->neq);
......
...@@ -104,9 +104,9 @@ static int do_pd_setup(struct fs_enet_private *fep) ...@@ -104,9 +104,9 @@ static int do_pd_setup(struct fs_enet_private *fep)
fep->interrupt = platform_get_irq_byname(pdev,"interrupt"); fep->interrupt = platform_get_irq_byname(pdev,"interrupt");
if (fep->interrupt < 0) if (fep->interrupt < 0)
return -EINVAL; return -EINVAL;
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
fep->fec.fecp =(void*)r->start; fep->fec.fecp = ioremap(r->start, r->end - r->start + 1);
if(fep->fec.fecp == NULL) if(fep->fec.fecp == NULL)
return -EINVAL; return -EINVAL;
...@@ -319,11 +319,14 @@ static void restart(struct net_device *dev) ...@@ -319,11 +319,14 @@ static void restart(struct net_device *dev)
* Clear any outstanding interrupt. * Clear any outstanding interrupt.
*/ */
FW(fecp, ievent, 0xffc0); FW(fecp, ievent, 0xffc0);
#ifndef CONFIG_PPC_MERGE
FW(fecp, ivec, (fep->interrupt / 2) << 29); FW(fecp, ivec, (fep->interrupt / 2) << 29);
#else
FW(fecp, ivec, (virq_to_hw(fep->interrupt) / 2) << 29);
#endif
/* /*
* adjust to speed (only for DUET & RMII) * adjust to speed (only for DUET & RMII)
*/ */
#ifdef CONFIG_DUET #ifdef CONFIG_DUET
if (fpi->use_rmii) { if (fpi->use_rmii) {
...@@ -418,6 +421,7 @@ static void stop(struct net_device *dev) ...@@ -418,6 +421,7 @@ static void stop(struct net_device *dev)
static void pre_request_irq(struct net_device *dev, int irq) static void pre_request_irq(struct net_device *dev, int irq)
{ {
#ifndef CONFIG_PPC_MERGE
immap_t *immap = fs_enet_immap; immap_t *immap = fs_enet_immap;
u32 siel; u32 siel;
...@@ -431,6 +435,7 @@ static void pre_request_irq(struct net_device *dev, int irq) ...@@ -431,6 +435,7 @@ static void pre_request_irq(struct net_device *dev, int irq)
siel &= ~(0x80000000 >> (irq & ~1)); siel &= ~(0x80000000 >> (irq & ~1));
out_be32(&immap->im_siu_conf.sc_siel, siel); out_be32(&immap->im_siu_conf.sc_siel, siel);
} }
#endif
} }
static void post_free_irq(struct net_device *dev, int irq) static void post_free_irq(struct net_device *dev, int irq)
......
...@@ -121,13 +121,13 @@ static int do_pd_setup(struct fs_enet_private *fep) ...@@ -121,13 +121,13 @@ static int do_pd_setup(struct fs_enet_private *fep)
return -EINVAL; return -EINVAL;
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
fep->scc.sccp = (void *)r->start; fep->scc.sccp = ioremap(r->start, r->end - r->start + 1);
if (fep->scc.sccp == NULL) if (fep->scc.sccp == NULL)
return -EINVAL; return -EINVAL;
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pram"); r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pram");
fep->scc.ep = (void *)r->start; fep->scc.ep = ioremap(r->start, r->end - r->start + 1);
if (fep->scc.ep == NULL) if (fep->scc.ep == NULL)
return -EINVAL; return -EINVAL;
...@@ -397,6 +397,7 @@ static void stop(struct net_device *dev) ...@@ -397,6 +397,7 @@ static void stop(struct net_device *dev)
static void pre_request_irq(struct net_device *dev, int irq) static void pre_request_irq(struct net_device *dev, int irq)
{ {
#ifndef CONFIG_PPC_MERGE
immap_t *immap = fs_enet_immap; immap_t *immap = fs_enet_immap;
u32 siel; u32 siel;
...@@ -410,6 +411,7 @@ static void pre_request_irq(struct net_device *dev, int irq) ...@@ -410,6 +411,7 @@ static void pre_request_irq(struct net_device *dev, int irq)
siel &= ~(0x80000000 >> (irq & ~1)); siel &= ~(0x80000000 >> (irq & ~1));
out_be32(&immap->im_siu_conf.sc_siel, siel); out_be32(&immap->im_siu_conf.sc_siel, siel);
} }
#endif
} }
static void post_free_irq(struct net_device *dev, int irq) static void post_free_irq(struct net_device *dev, int irq)
......
...@@ -271,8 +271,7 @@ static int __init ifb_init_module(void) ...@@ -271,8 +271,7 @@ static int __init ifb_init_module(void)
for (i = 0; i < numifbs && !err; i++) for (i = 0; i < numifbs && !err; i++)
err = ifb_init_one(i); err = ifb_init_one(i);
if (err) { if (err) {
i--; while (i--)
while (--i >= 0)
ifb_free_one(i); ifb_free_one(i);
} }
......
...@@ -349,7 +349,7 @@ static int __init fixed_init(void) ...@@ -349,7 +349,7 @@ static int __init fixed_init(void)
fixed_mdio_register_device(0, 100, 1); fixed_mdio_register_device(0, 100, 1);
#endif #endif
#ifdef CONFIX_FIXED_MII_10_FDX #ifdef CONFIG_FIXED_MII_10_FDX
fixed_mdio_register_device(0, 10, 1); fixed_mdio_register_device(0, 10, 1);
#endif #endif
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册