Commit e5dfa928 authored by Linus Torvalds's avatar Linus Torvalds

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

parents 5dd96249 b2ab040d
...@@ -777,7 +777,7 @@ doing so is the same as described in the "Configuring Multiple Bonds ...@@ -777,7 +777,7 @@ doing so is the same as described in the "Configuring Multiple Bonds
Manually" section, below. Manually" section, below.
NOTE: It has been observed that some Red Hat supplied kernels NOTE: It has been observed that some Red Hat supplied kernels
are apparently unable to rename modules at load time (the "-obonding1" are apparently unable to rename modules at load time (the "-o bond1"
part). Attempts to pass that option to modprobe will produce an part). Attempts to pass that option to modprobe will produce an
"Operation not permitted" error. This has been reported on some "Operation not permitted" error. This has been reported on some
Fedora Core kernels, and has been seen on RHEL 4 as well. On kernels Fedora Core kernels, and has been seen on RHEL 4 as well. On kernels
...@@ -883,7 +883,8 @@ the above does not work, and the second bonding instance never sees ...@@ -883,7 +883,8 @@ the above does not work, and the second bonding instance never sees
its options. In that case, the second options line can be substituted its options. In that case, the second options line can be substituted
as follows: as follows:
install bonding1 /sbin/modprobe bonding -obond1 mode=balance-alb miimon=50 install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
mode=balance-alb miimon=50
This may be repeated any number of times, specifying a new and This may be repeated any number of times, specifying a new and
unique name in place of bond1 for each subsequent instance. unique name in place of bond1 for each subsequent instance.
......
...@@ -1027,8 +1027,7 @@ static void cp_reset_hw (struct cp_private *cp) ...@@ -1027,8 +1027,7 @@ static void cp_reset_hw (struct cp_private *cp)
if (!(cpr8(Cmd) & CmdReset)) if (!(cpr8(Cmd) & CmdReset))
return; return;
set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout_uninterruptible(10);
schedule_timeout(10);
} }
printk(KERN_ERR "%s: hardware reset timeout\n", cp->dev->name); printk(KERN_ERR "%s: hardware reset timeout\n", cp->dev->name);
...@@ -1575,6 +1574,7 @@ static struct ethtool_ops cp_ethtool_ops = { ...@@ -1575,6 +1574,7 @@ static struct ethtool_ops cp_ethtool_ops = {
.set_wol = cp_set_wol, .set_wol = cp_set_wol,
.get_strings = cp_get_strings, .get_strings = cp_get_strings,
.get_ethtool_stats = cp_get_ethtool_stats, .get_ethtool_stats = cp_get_ethtool_stats,
.get_perm_addr = ethtool_op_get_perm_addr,
}; };
static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
...@@ -1773,6 +1773,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1773,6 +1773,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((u16 *) (dev->dev_addr))[i] = ((u16 *) (dev->dev_addr))[i] =
le16_to_cpu (read_eeprom (regs, i + 7, addr_len)); le16_to_cpu (read_eeprom (regs, i + 7, addr_len));
memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
dev->open = cp_open; dev->open = cp_open;
dev->stop = cp_close; dev->stop = cp_close;
......
...@@ -552,7 +552,8 @@ const static struct { ...@@ -552,7 +552,8 @@ const static struct {
{ "RTL-8100B/8139D", { "RTL-8100B/8139D",
HW_REVID(1, 1, 1, 0, 1, 0, 1), HW_REVID(1, 1, 1, 0, 1, 0, 1),
HasLWake, HasHltClk /* XXX undocumented? */
| HasLWake,
}, },
{ "RTL-8101", { "RTL-8101",
...@@ -970,6 +971,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev, ...@@ -970,6 +971,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev,
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((u16 *) (dev->dev_addr))[i] = ((u16 *) (dev->dev_addr))[i] =
le16_to_cpu (read_eeprom (ioaddr, i + 7, addr_len)); le16_to_cpu (read_eeprom (ioaddr, i + 7, addr_len));
memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
/* The Rtl8139-specific entries in the device structure. */ /* The Rtl8139-specific entries in the device structure. */
dev->open = rtl8139_open; dev->open = rtl8139_open;
...@@ -2465,6 +2467,7 @@ static struct ethtool_ops rtl8139_ethtool_ops = { ...@@ -2465,6 +2467,7 @@ static struct ethtool_ops rtl8139_ethtool_ops = {
.get_strings = rtl8139_get_strings, .get_strings = rtl8139_get_strings,
.get_stats_count = rtl8139_get_stats_count, .get_stats_count = rtl8139_get_stats_count,
.get_ethtool_stats = rtl8139_get_ethtool_stats, .get_ethtool_stats = rtl8139_get_ethtool_stats,
.get_perm_addr = ethtool_op_get_perm_addr,
}; };
static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
......
...@@ -475,6 +475,14 @@ config SGI_IOC3_ETH_HW_TX_CSUM ...@@ -475,6 +475,14 @@ config SGI_IOC3_ETH_HW_TX_CSUM
the moment only acceleration of IPv4 is supported. This option the moment only acceleration of IPv4 is supported. This option
enables offloading for checksums on transmit. If unsure, say Y. enables offloading for checksums on transmit. If unsure, say Y.
config MIPS_SIM_NET
tristate "MIPS simulator Network device (EXPERIMENTAL)"
depends on NETDEVICES && MIPS_SIM && EXPERIMENTAL
help
The MIPSNET device is a simple Ethernet network device which is
emulated by the MIPS Simulator.
If you are not using a MIPSsim or are unsure, say N.
config SGI_O2MACE_ETH config SGI_O2MACE_ETH
tristate "SGI O2 MACE Fast Ethernet support" tristate "SGI O2 MACE Fast Ethernet support"
depends on NET_ETHERNET && SGI_IP32=y depends on NET_ETHERNET && SGI_IP32=y
...@@ -2083,6 +2091,7 @@ config SPIDER_NET ...@@ -2083,6 +2091,7 @@ config SPIDER_NET
config GIANFAR config GIANFAR
tristate "Gianfar Ethernet" tristate "Gianfar Ethernet"
depends on 85xx || 83xx depends on 85xx || 83xx
select PHYLIB
help help
This driver supports the Gigabit TSEC on the MPC85xx This driver supports the Gigabit TSEC on the MPC85xx
family of chips, and the FEC on the 8540 family of chips, and the FEC on the 8540
...@@ -2243,6 +2252,20 @@ config ISERIES_VETH ...@@ -2243,6 +2252,20 @@ config ISERIES_VETH
tristate "iSeries Virtual Ethernet driver support" tristate "iSeries Virtual Ethernet driver support"
depends on PPC_ISERIES depends on PPC_ISERIES
config RIONET
tristate "RapidIO Ethernet over messaging driver support"
depends on NETDEVICES && RAPIDIO
config RIONET_TX_SIZE
int "Number of outbound queue entries"
depends on RIONET
default "128"
config RIONET_RX_SIZE
int "Number of inbound queue entries"
depends on RIONET
default "128"
config FDDI config FDDI
bool "FDDI driver support" bool "FDDI driver support"
depends on (PCI || EISA) depends on (PCI || EISA)
......
...@@ -13,7 +13,7 @@ obj-$(CONFIG_CHELSIO_T1) += chelsio/ ...@@ -13,7 +13,7 @@ obj-$(CONFIG_CHELSIO_T1) += chelsio/
obj-$(CONFIG_BONDING) += bonding/ obj-$(CONFIG_BONDING) += bonding/
obj-$(CONFIG_GIANFAR) += gianfar_driver.o obj-$(CONFIG_GIANFAR) += gianfar_driver.o
gianfar_driver-objs := gianfar.o gianfar_ethtool.o gianfar_phy.o gianfar_driver-objs := gianfar.o gianfar_ethtool.o gianfar_mii.o
# #
# link order important here # link order important here
...@@ -64,6 +64,7 @@ obj-$(CONFIG_SKFP) += skfp/ ...@@ -64,6 +64,7 @@ obj-$(CONFIG_SKFP) += skfp/
obj-$(CONFIG_VIA_RHINE) += via-rhine.o obj-$(CONFIG_VIA_RHINE) += via-rhine.o
obj-$(CONFIG_VIA_VELOCITY) += via-velocity.o obj-$(CONFIG_VIA_VELOCITY) += via-velocity.o
obj-$(CONFIG_ADAPTEC_STARFIRE) += starfire.o obj-$(CONFIG_ADAPTEC_STARFIRE) += starfire.o
obj-$(CONFIG_RIONET) += rionet.o
# #
# end link order section # end link order section
...@@ -166,6 +167,7 @@ obj-$(CONFIG_EQUALIZER) += eql.o ...@@ -166,6 +167,7 @@ obj-$(CONFIG_EQUALIZER) += eql.o
obj-$(CONFIG_MIPS_JAZZ_SONIC) += jazzsonic.o obj-$(CONFIG_MIPS_JAZZ_SONIC) += jazzsonic.o
obj-$(CONFIG_MIPS_GT96100ETH) += gt96100eth.o obj-$(CONFIG_MIPS_GT96100ETH) += gt96100eth.o
obj-$(CONFIG_MIPS_AU1X00_ENET) += au1000_eth.o obj-$(CONFIG_MIPS_AU1X00_ENET) += au1000_eth.o
obj-$(CONFIG_MIPS_SIM_NET) += mipsnet.o
obj-$(CONFIG_SGI_IOC3_ETH) += ioc3-eth.o obj-$(CONFIG_SGI_IOC3_ETH) += ioc3-eth.o
obj-$(CONFIG_DECLANCE) += declance.o obj-$(CONFIG_DECLANCE) += declance.o
obj-$(CONFIG_ATARILANCE) += atarilance.o obj-$(CONFIG_ATARILANCE) += atarilance.o
......
...@@ -151,13 +151,6 @@ struct au1000_private *au_macs[NUM_ETH_INTERFACES]; ...@@ -151,13 +151,6 @@ struct au1000_private *au_macs[NUM_ETH_INTERFACES];
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \ SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \
SUPPORTED_Autoneg SUPPORTED_Autoneg
static char *phy_link[] =
{ "unknown",
"10Base2", "10BaseT",
"AUI",
"100BaseT", "100BaseTX", "100BaseFX"
};
int bcm_5201_init(struct net_device *dev, int phy_addr) int bcm_5201_init(struct net_device *dev, int phy_addr)
{ {
s16 data; s16 data;
...@@ -785,6 +778,7 @@ static struct mii_chip_info { ...@@ -785,6 +778,7 @@ static struct mii_chip_info {
{"Broadcom BCM5201 10/100 BaseT PHY",0x0040,0x6212, &bcm_5201_ops,0}, {"Broadcom BCM5201 10/100 BaseT PHY",0x0040,0x6212, &bcm_5201_ops,0},
{"Broadcom BCM5221 10/100 BaseT PHY",0x0040,0x61e4, &bcm_5201_ops,0}, {"Broadcom BCM5221 10/100 BaseT PHY",0x0040,0x61e4, &bcm_5201_ops,0},
{"Broadcom BCM5222 10/100 BaseT PHY",0x0040,0x6322, &bcm_5201_ops,1}, {"Broadcom BCM5222 10/100 BaseT PHY",0x0040,0x6322, &bcm_5201_ops,1},
{"NS DP83847 PHY", 0x2000, 0x5c30, &bcm_5201_ops ,0},
{"AMD 79C901 HomePNA PHY",0x0000,0x35c8, &am79c901_ops,0}, {"AMD 79C901 HomePNA PHY",0x0000,0x35c8, &am79c901_ops,0},
{"AMD 79C874 10/100 BaseT PHY",0x0022,0x561b, &am79c874_ops,0}, {"AMD 79C874 10/100 BaseT PHY",0x0022,0x561b, &am79c874_ops,0},
{"LSI 80227 10/100 BaseT PHY",0x0016,0xf840, &lsi_80227_ops,0}, {"LSI 80227 10/100 BaseT PHY",0x0016,0xf840, &lsi_80227_ops,0},
...@@ -1045,7 +1039,7 @@ static int mii_probe (struct net_device * dev) ...@@ -1045,7 +1039,7 @@ static int mii_probe (struct net_device * dev)
#endif #endif
if (aup->mii->chip_info == NULL) { if (aup->mii->chip_info == NULL) {
printk(KERN_ERR "%s: Au1x No MII transceivers found!\n", printk(KERN_ERR "%s: Au1x No known MII transceivers found!\n",
dev->name); dev->name);
return -1; return -1;
} }
...@@ -1546,6 +1540,9 @@ au1000_probe(u32 ioaddr, int irq, int port_num) ...@@ -1546,6 +1540,9 @@ au1000_probe(u32 ioaddr, int irq, int port_num)
printk(KERN_ERR "%s: out of memory\n", dev->name); printk(KERN_ERR "%s: out of memory\n", dev->name);
goto err_out; goto err_out;
} }
aup->mii->next = NULL;
aup->mii->chip_info = NULL;
aup->mii->status = 0;
aup->mii->mii_control_reg = 0; aup->mii->mii_control_reg = 0;
aup->mii->mii_data_reg = 0; aup->mii->mii_data_reg = 0;
......
...@@ -106,6 +106,29 @@ static int b44_poll(struct net_device *dev, int *budget); ...@@ -106,6 +106,29 @@ static int b44_poll(struct net_device *dev, int *budget);
static void b44_poll_controller(struct net_device *dev); static void b44_poll_controller(struct net_device *dev);
#endif #endif
static int dma_desc_align_mask;
static int dma_desc_sync_size;
static inline void b44_sync_dma_desc_for_device(struct pci_dev *pdev,
dma_addr_t dma_base,
unsigned long offset,
enum dma_data_direction dir)
{
dma_sync_single_range_for_device(&pdev->dev, dma_base,
offset & dma_desc_align_mask,
dma_desc_sync_size, dir);
}
static inline void b44_sync_dma_desc_for_cpu(struct pci_dev *pdev,
dma_addr_t dma_base,
unsigned long offset,
enum dma_data_direction dir)
{
dma_sync_single_range_for_cpu(&pdev->dev, dma_base,
offset & dma_desc_align_mask,
dma_desc_sync_size, dir);
}
static inline unsigned long br32(const struct b44 *bp, unsigned long reg) static inline unsigned long br32(const struct b44 *bp, unsigned long reg)
{ {
return readl(bp->regs + reg); return readl(bp->regs + reg);
...@@ -668,6 +691,11 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked) ...@@ -668,6 +691,11 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
dp->ctrl = cpu_to_le32(ctrl); dp->ctrl = cpu_to_le32(ctrl);
dp->addr = cpu_to_le32((u32) mapping + bp->rx_offset + bp->dma_offset); dp->addr = cpu_to_le32((u32) mapping + bp->rx_offset + bp->dma_offset);
if (bp->flags & B44_FLAG_RX_RING_HACK)
b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma,
dest_idx * sizeof(dp),
DMA_BIDIRECTIONAL);
return RX_PKT_BUF_SZ; return RX_PKT_BUF_SZ;
} }
...@@ -692,6 +720,11 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked) ...@@ -692,6 +720,11 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
pci_unmap_addr_set(dest_map, mapping, pci_unmap_addr_set(dest_map, mapping,
pci_unmap_addr(src_map, mapping)); pci_unmap_addr(src_map, mapping));
if (bp->flags & B44_FLAG_RX_RING_HACK)
b44_sync_dma_desc_for_cpu(bp->pdev, bp->rx_ring_dma,
src_idx * sizeof(src_desc),
DMA_BIDIRECTIONAL);
ctrl = src_desc->ctrl; ctrl = src_desc->ctrl;
if (dest_idx == (B44_RX_RING_SIZE - 1)) if (dest_idx == (B44_RX_RING_SIZE - 1))
ctrl |= cpu_to_le32(DESC_CTRL_EOT); ctrl |= cpu_to_le32(DESC_CTRL_EOT);
...@@ -700,8 +733,14 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked) ...@@ -700,8 +733,14 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
dest_desc->ctrl = ctrl; dest_desc->ctrl = ctrl;
dest_desc->addr = src_desc->addr; dest_desc->addr = src_desc->addr;
src_map->skb = NULL; src_map->skb = NULL;
if (bp->flags & B44_FLAG_RX_RING_HACK)
b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma,
dest_idx * sizeof(dest_desc),
DMA_BIDIRECTIONAL);
pci_dma_sync_single_for_device(bp->pdev, src_desc->addr, pci_dma_sync_single_for_device(bp->pdev, src_desc->addr,
RX_PKT_BUF_SZ, RX_PKT_BUF_SZ,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
...@@ -959,6 +998,11 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -959,6 +998,11 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
bp->tx_ring[entry].ctrl = cpu_to_le32(ctrl); bp->tx_ring[entry].ctrl = cpu_to_le32(ctrl);
bp->tx_ring[entry].addr = cpu_to_le32((u32) mapping+bp->dma_offset); bp->tx_ring[entry].addr = cpu_to_le32((u32) mapping+bp->dma_offset);
if (bp->flags & B44_FLAG_TX_RING_HACK)
b44_sync_dma_desc_for_device(bp->pdev, bp->tx_ring_dma,
entry * sizeof(bp->tx_ring[0]),
DMA_TO_DEVICE);
entry = NEXT_TX(entry); entry = NEXT_TX(entry);
bp->tx_prod = entry; bp->tx_prod = entry;
...@@ -1064,6 +1108,16 @@ static void b44_init_rings(struct b44 *bp) ...@@ -1064,6 +1108,16 @@ static void b44_init_rings(struct b44 *bp)
memset(bp->rx_ring, 0, B44_RX_RING_BYTES); memset(bp->rx_ring, 0, B44_RX_RING_BYTES);
memset(bp->tx_ring, 0, B44_TX_RING_BYTES); memset(bp->tx_ring, 0, B44_TX_RING_BYTES);
if (bp->flags & B44_FLAG_RX_RING_HACK)
dma_sync_single_for_device(&bp->pdev->dev, bp->rx_ring_dma,
DMA_TABLE_BYTES,
PCI_DMA_BIDIRECTIONAL);
if (bp->flags & B44_FLAG_TX_RING_HACK)
dma_sync_single_for_device(&bp->pdev->dev, bp->tx_ring_dma,
DMA_TABLE_BYTES,
PCI_DMA_TODEVICE);
for (i = 0; i < bp->rx_pending; i++) { for (i = 0; i < bp->rx_pending; i++) {
if (b44_alloc_rx_skb(bp, -1, i) < 0) if (b44_alloc_rx_skb(bp, -1, i) < 0)
break; break;
...@@ -1085,14 +1139,28 @@ static void b44_free_consistent(struct b44 *bp) ...@@ -1085,14 +1139,28 @@ static void b44_free_consistent(struct b44 *bp)
bp->tx_buffers = NULL; bp->tx_buffers = NULL;
} }
if (bp->rx_ring) { if (bp->rx_ring) {
pci_free_consistent(bp->pdev, DMA_TABLE_BYTES, if (bp->flags & B44_FLAG_RX_RING_HACK) {
bp->rx_ring, bp->rx_ring_dma); dma_unmap_single(&bp->pdev->dev, bp->rx_ring_dma,
DMA_TABLE_BYTES,
DMA_BIDIRECTIONAL);
kfree(bp->rx_ring);
} else
pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
bp->rx_ring, bp->rx_ring_dma);
bp->rx_ring = NULL; bp->rx_ring = NULL;
bp->flags &= ~B44_FLAG_RX_RING_HACK;
} }
if (bp->tx_ring) { if (bp->tx_ring) {
pci_free_consistent(bp->pdev, DMA_TABLE_BYTES, if (bp->flags & B44_FLAG_TX_RING_HACK) {
bp->tx_ring, bp->tx_ring_dma); dma_unmap_single(&bp->pdev->dev, bp->tx_ring_dma,
DMA_TABLE_BYTES,
DMA_TO_DEVICE);
kfree(bp->tx_ring);
} else
pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
bp->tx_ring, bp->tx_ring_dma);
bp->tx_ring = NULL; bp->tx_ring = NULL;
bp->flags &= ~B44_FLAG_TX_RING_HACK;
} }
} }
...@@ -1118,12 +1186,56 @@ static int b44_alloc_consistent(struct b44 *bp) ...@@ -1118,12 +1186,56 @@ static int b44_alloc_consistent(struct b44 *bp)
size = DMA_TABLE_BYTES; size = DMA_TABLE_BYTES;
bp->rx_ring = pci_alloc_consistent(bp->pdev, size, &bp->rx_ring_dma); bp->rx_ring = pci_alloc_consistent(bp->pdev, size, &bp->rx_ring_dma);
if (!bp->rx_ring) if (!bp->rx_ring) {
goto out_err; /* Allocation may have failed due to pci_alloc_consistent
insisting on use of GFP_DMA, which is more restrictive
than necessary... */
struct dma_desc *rx_ring;
dma_addr_t rx_ring_dma;
if (!(rx_ring = (struct dma_desc *)kmalloc(size, GFP_KERNEL)))
goto out_err;
memset(rx_ring, 0, size);
rx_ring_dma = dma_map_single(&bp->pdev->dev, rx_ring,
DMA_TABLE_BYTES,
DMA_BIDIRECTIONAL);
if (rx_ring_dma + size > B44_DMA_MASK) {
kfree(rx_ring);
goto out_err;
}
bp->rx_ring = rx_ring;
bp->rx_ring_dma = rx_ring_dma;
bp->flags |= B44_FLAG_RX_RING_HACK;
}
bp->tx_ring = pci_alloc_consistent(bp->pdev, size, &bp->tx_ring_dma); bp->tx_ring = pci_alloc_consistent(bp->pdev, size, &bp->tx_ring_dma);
if (!bp->tx_ring) if (!bp->tx_ring) {
goto out_err; /* Allocation may have failed due to pci_alloc_consistent
insisting on use of GFP_DMA, which is more restrictive
than necessary... */
struct dma_desc *tx_ring;
dma_addr_t tx_ring_dma;
if (!(tx_ring = (struct dma_desc *)kmalloc(size, GFP_KERNEL)))
goto out_err;
memset(tx_ring, 0, size);
tx_ring_dma = dma_map_single(&bp->pdev->dev, tx_ring,
DMA_TABLE_BYTES,
DMA_TO_DEVICE);
if (tx_ring_dma + size > B44_DMA_MASK) {
kfree(tx_ring);
goto out_err;
}
bp->tx_ring = tx_ring;
bp->tx_ring_dma = tx_ring_dma;
bp->flags |= B44_FLAG_TX_RING_HACK;
}
return 0; return 0;
...@@ -1676,6 +1788,7 @@ static struct ethtool_ops b44_ethtool_ops = { ...@@ -1676,6 +1788,7 @@ static struct ethtool_ops b44_ethtool_ops = {
.set_pauseparam = b44_set_pauseparam, .set_pauseparam = b44_set_pauseparam,
.get_msglevel = b44_get_msglevel, .get_msglevel = b44_get_msglevel,
.set_msglevel = b44_set_msglevel, .set_msglevel = b44_set_msglevel,
.get_perm_addr = ethtool_op_get_perm_addr,
}; };
static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
...@@ -1718,6 +1831,7 @@ static int __devinit b44_get_invariants(struct b44 *bp) ...@@ -1718,6 +1831,7 @@ static int __devinit b44_get_invariants(struct b44 *bp)
bp->dev->dev_addr[3] = eeprom[80]; bp->dev->dev_addr[3] = eeprom[80];
bp->dev->dev_addr[4] = eeprom[83]; bp->dev->dev_addr[4] = eeprom[83];
bp->dev->dev_addr[5] = eeprom[82]; bp->dev->dev_addr[5] = eeprom[82];
memcpy(bp->dev->perm_addr, bp->dev->dev_addr, bp->dev->addr_len);
bp->phy_addr = eeprom[90] & 0x1f; bp->phy_addr = eeprom[90] & 0x1f;
...@@ -1971,6 +2085,12 @@ static struct pci_driver b44_driver = { ...@@ -1971,6 +2085,12 @@ static struct pci_driver b44_driver = {
static int __init b44_init(void) static int __init b44_init(void)
{ {
unsigned int dma_desc_align_size = dma_get_cache_alignment();
/* Setup paramaters for syncing RX/TX DMA descriptors */
dma_desc_align_mask = ~(dma_desc_align_size - 1);
dma_desc_sync_size = max(dma_desc_align_size, sizeof(struct dma_desc));
return pci_module_init(&b44_driver); return pci_module_init(&b44_driver);
} }
......
...@@ -400,6 +400,8 @@ struct b44 { ...@@ -400,6 +400,8 @@ struct b44 {
#define B44_FLAG_ADV_100HALF 0x04000000 #define B44_FLAG_ADV_100HALF 0x04000000
#define B44_FLAG_ADV_100FULL 0x08000000 #define B44_FLAG_ADV_100FULL 0x08000000
#define B44_FLAG_INTERNAL_PHY 0x10000000 #define B44_FLAG_INTERNAL_PHY 0x10000000
#define B44_FLAG_RX_RING_HACK 0x20000000
#define B44_FLAG_TX_RING_HACK 0x40000000
u32 rx_offset; u32 rx_offset;
......
...@@ -4241,6 +4241,43 @@ static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev ...@@ -4241,6 +4241,43 @@ static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev
return 0; return 0;
} }
static void bond_activebackup_xmit_copy(struct sk_buff *skb,
struct bonding *bond,
struct slave *slave)
{
struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
struct ethhdr *eth_data;
u8 *hwaddr;
int res;
if (!skb2) {
printk(KERN_ERR DRV_NAME ": Error: "
"bond_activebackup_xmit_copy(): skb_copy() failed\n");
return;
}
skb2->mac.raw = (unsigned char *)skb2->data;
eth_data = eth_hdr(skb2);
/* Pick an appropriate source MAC address
* -- use slave's perm MAC addr, unless used by bond
* -- otherwise, borrow active slave's perm MAC addr
* since that will not be used
*/
hwaddr = slave->perm_hwaddr;
if (!memcmp(eth_data->h_source, hwaddr, ETH_ALEN))
hwaddr = bond->curr_active_slave->perm_hwaddr;
/* Set source MAC address appropriately */
memcpy(eth_data->h_source, hwaddr, ETH_ALEN);
res = bond_dev_queue_xmit(bond, skb2, slave->dev);
if (res)
dev_kfree_skb(skb2);
return;
}
/* /*
* in active-backup mode, we know that bond->curr_active_slave is always valid if * in active-backup mode, we know that bond->curr_active_slave is always valid if
* the bond has a usable interface. * the bond has a usable interface.
...@@ -4257,10 +4294,26 @@ static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *bond_d ...@@ -4257,10 +4294,26 @@ static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *bond_d
goto out; goto out;
} }
if (bond->curr_active_slave) { /* one usable interface */ if (!bond->curr_active_slave)
res = bond_dev_queue_xmit(bond, skb, bond->curr_active_slave->dev); goto out;
/* Xmit IGMP frames on all slaves to ensure rapid fail-over
for multicast traffic on snooping switches */
if (skb->protocol == __constant_htons(ETH_P_IP) &&
skb->nh.iph->protocol == IPPROTO_IGMP) {
struct slave *slave, *active_slave;
int i;
active_slave = bond->curr_active_slave;
bond_for_each_slave_from_to(bond, slave, i, active_slave->next,
active_slave->prev)
if (IS_UP(slave->dev) &&
(slave->link == BOND_LINK_UP))
bond_activebackup_xmit_copy(skb, bond, slave);
} }
res = bond_dev_queue_xmit(bond, skb, bond->curr_active_slave->dev);
out: out:
if (res) { if (res) {
/* no suitable interface, frame not sent */ /* no suitable interface, frame not sent */
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* adopted from sunlance.c by Richard van den Berg * adopted from sunlance.c by Richard van den Berg
* *
* Copyright (C) 2002, 2003 Maciej W. Rozycki * Copyright (C) 2002, 2003, 2005 Maciej W. Rozycki
* *
* additional sources: * additional sources:
* - PMAD-AA TURBOchannel Ethernet Module Functional Specification, * - PMAD-AA TURBOchannel Ethernet Module Functional Specification,
...@@ -57,13 +57,15 @@ ...@@ -57,13 +57,15 @@
#include <linux/string.h> #include <linux/string.h>
#include <asm/addrspace.h> #include <asm/addrspace.h>
#include <asm/system.h>
#include <asm/dec/interrupts.h> #include <asm/dec/interrupts.h>
#include <asm/dec/ioasic.h> #include <asm/dec/ioasic.h>
#include <asm/dec/ioasic_addrs.h> #include <asm/dec/ioasic_addrs.h>
#include <asm/dec/kn01.h> #include <asm/dec/kn01.h>
#include <asm/dec/machtype.h> #include <asm/dec/machtype.h>
#include <asm/dec/system.h>
#include <asm/dec/tc.h> #include <asm/dec/tc.h>
#include <asm/system.h>
static char version[] __devinitdata = static char version[] __devinitdata =
"declance.c: v0.009 by Linux MIPS DECstation task force\n"; "declance.c: v0.009 by Linux MIPS DECstation task force\n";
...@@ -79,10 +81,6 @@ MODULE_LICENSE("GPL"); ...@@ -79,10 +81,6 @@ MODULE_LICENSE("GPL");
#define PMAD_LANCE 2 #define PMAD_LANCE 2
#define PMAX_LANCE 3 #define PMAX_LANCE 3
#ifndef CONFIG_TC
unsigned long system_base;
unsigned long dmaptr;
#endif
#define LE_CSR0 0 #define LE_CSR0 0
#define LE_CSR1 1 #define LE_CSR1 1
...@@ -237,7 +235,7 @@ struct lance_init_block { ...@@ -237,7 +235,7 @@ struct lance_init_block {
/* /*
* This works *only* for the ring descriptors * This works *only* for the ring descriptors
*/ */
#define LANCE_ADDR(x) (PHYSADDR(x) >> 1) #define LANCE_ADDR(x) (CPHYSADDR(x) >> 1)
struct lance_private { struct lance_private {
struct net_device *next; struct net_device *next;
...@@ -697,12 +695,13 @@ static void lance_tx(struct net_device *dev) ...@@ -697,12 +695,13 @@ static void lance_tx(struct net_device *dev)
spin_unlock(&lp->lock); spin_unlock(&lp->lock);
} }
static void lance_dma_merr_int(const int irq, void *dev_id, static irqreturn_t lance_dma_merr_int(const int irq, void *dev_id,
struct pt_regs *regs) struct pt_regs *regs)
{ {
struct net_device *dev = (struct net_device *) dev_id; struct net_device *dev = (struct net_device *) dev_id;
printk("%s: DMA error\n", dev->name); printk("%s: DMA error\n", dev->name);
return IRQ_HANDLED;
} }
static irqreturn_t static irqreturn_t
...@@ -1026,10 +1025,6 @@ static int __init dec_lance_init(const int type, const int slot) ...@@ -1026,10 +1025,6 @@ static int __init dec_lance_init(const int type, const int slot)
unsigned long esar_base; unsigned long esar_base;
unsigned char *esar; unsigned char *esar;
#ifndef CONFIG_TC
system_base = KN01_LANCE_BASE;
#endif
if (dec_lance_debug && version_printed++ == 0) if (dec_lance_debug && version_printed++ == 0)
printk(version); printk(version);
...@@ -1062,16 +1057,16 @@ static int __init dec_lance_init(const int type, const int slot) ...@@ -1062,16 +1057,16 @@ static int __init dec_lance_init(const int type, const int slot)
switch (type) { switch (type) {
#ifdef CONFIG_TC #ifdef CONFIG_TC
case ASIC_LANCE: case ASIC_LANCE:
dev->base_addr = system_base + IOASIC_LANCE; dev->base_addr = CKSEG1ADDR(dec_kn_slot_base + IOASIC_LANCE);
/* buffer space for the on-board LANCE shared memory */ /* buffer space for the on-board LANCE shared memory */
/* /*
* FIXME: ugly hack! * FIXME: ugly hack!
*/ */
dev->mem_start = KSEG1ADDR(0x00020000); dev->mem_start = CKSEG1ADDR(0x00020000);
dev->mem_end = dev->mem_start + 0x00020000; dev->mem_end = dev->mem_start + 0x00020000;
dev->irq = dec_interrupt[DEC_IRQ_LANCE]; dev->irq = dec_interrupt[DEC_IRQ_LANCE];
esar_base = system_base + IOASIC_ESAR; esar_base = CKSEG1ADDR(dec_kn_slot_base + IOASIC_ESAR);
/* Workaround crash with booting KN04 2.1k from Disk */ /* Workaround crash with booting KN04 2.1k from Disk */
memset((void *)dev->mem_start, 0, memset((void *)dev->mem_start, 0,
...@@ -1101,14 +1096,14 @@ static int __init dec_lance_init(const int type, const int slot) ...@@ -1101,14 +1096,14 @@ static int __init dec_lance_init(const int type, const int slot)
/* Setup I/O ASIC LANCE DMA. */ /* Setup I/O ASIC LANCE DMA. */
lp->dma_irq = dec_interrupt[DEC_IRQ_LANCE_MERR]; lp->dma_irq = dec_interrupt[DEC_IRQ_LANCE_MERR];
ioasic_write(IO_REG_LANCE_DMA_P, ioasic_write(IO_REG_LANCE_DMA_P,
PHYSADDR(dev->mem_start) << 3); CPHYSADDR(dev->mem_start) << 3);
break; break;
case PMAD_LANCE: case PMAD_LANCE:
claim_tc_card(slot); claim_tc_card(slot);
dev->mem_start = get_tc_base_addr(slot); dev->mem_start = CKSEG1ADDR(get_tc_base_addr(slot));
dev->base_addr = dev->mem_start + 0x100000; dev->base_addr = dev->mem_start + 0x100000;
dev->irq = get_tc_irq_nr(slot); dev->irq = get_tc_irq_nr(slot);
esar_base = dev->mem_start + 0x1c0002; esar_base = dev->mem_start + 0x1c0002;
...@@ -1137,9 +1132,9 @@ static int __init dec_lance_init(const int type, const int slot) ...@@ -1137,9 +1132,9 @@ static int __init dec_lance_init(const int type, const int slot)
case PMAX_LANCE: case PMAX_LANCE:
dev->irq = dec_interrupt[DEC_IRQ_LANCE]; dev->irq = dec_interrupt[DEC_IRQ_LANCE];
dev->base_addr = KN01_LANCE_BASE; dev->base_addr = CKSEG1ADDR(KN01_SLOT_BASE + KN01_LANCE);
dev->mem_start = KN01_LANCE_BASE + 0x01000000; dev->mem_start = CKSEG1ADDR(KN01_SLOT_BASE + KN01_LANCE_MEM);
esar_base = KN01_RTC_BASE + 1; esar_base = CKSEG1ADDR(KN01_SLOT_BASE + KN01_ESAR + 1);
lp->dma_irq = -1; lp->dma_irq = -1;
/* /*
......
...@@ -2201,6 +2201,7 @@ static struct ethtool_ops e100_ethtool_ops = { ...@@ -2201,6 +2201,7 @@ static struct ethtool_ops e100_ethtool_ops = {
.phys_id = e100_phys_id, .phys_id = e100_phys_id,
.get_stats_count = e100_get_stats_count, .get_stats_count = e100_get_stats_count,
.get_ethtool_stats = e100_get_ethtool_stats, .get_ethtool_stats = e100_get_ethtool_stats,
.get_perm_addr = ethtool_op_get_perm_addr,
}; };
static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
...@@ -2351,7 +2352,8 @@ static int __devinit e100_probe(struct pci_dev *pdev, ...@@ -2351,7 +2352,8 @@ static int __devinit e100_probe(struct pci_dev *pdev,
e100_phy_init(nic); e100_phy_init(nic);
memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN); memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN);
if(!is_valid_ether_addr(netdev->dev_addr)) { memcpy(netdev->perm_addr, nic->eeprom, ETH_ALEN);
if(!is_valid_ether_addr(netdev->perm_addr)) {
DPRINTK(PROBE, ERR, "Invalid MAC address from " DPRINTK(PROBE, ERR, "Invalid MAC address from "
"EEPROM, aborting.\n"); "EEPROM, aborting.\n");
err = -EAGAIN; err = -EAGAIN;
......
...@@ -72,6 +72,10 @@ ...@@ -72,6 +72,10 @@
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#ifdef CONFIG_E1000_MQ
#include <linux/cpu.h>
#include <linux/smp.h>
#endif
#define BAR_0 0 #define BAR_0 0
#define BAR_1 1 #define BAR_1 1
...@@ -165,10 +169,33 @@ struct e1000_buffer { ...@@ -165,10 +169,33 @@ struct e1000_buffer {
uint16_t next_to_watch; uint16_t next_to_watch;
}; };
struct e1000_ps_page { struct page *ps_page[MAX_PS_BUFFERS]; }; struct e1000_ps_page { struct page *ps_page[PS_PAGE_BUFFERS]; };
struct e1000_ps_page_dma { uint64_t ps_page_dma[MAX_PS_BUFFERS]; }; struct e1000_ps_page_dma { uint64_t ps_page_dma[PS_PAGE_BUFFERS]; };
struct e1000_tx_ring {
/* pointer to the descriptor ring memory */
void *desc;
/* physical address of the descriptor ring */
dma_addr_t dma;
/* length of descriptor ring in bytes */
unsigned int size;
/* number of descriptors in the ring */
unsigned int count;
/* next descriptor to associate a buffer with */
unsigned int next_to_use;
/* next descriptor to check for DD status bit */
unsigned int next_to_clean;
/* array of buffer information structs */
struct e1000_buffer *buffer_info;
struct e1000_buffer previous_buffer_info;
spinlock_t tx_lock;
uint16_t tdh;
uint16_t tdt;
uint64_t pkt;
};
struct e1000_desc_ring { struct e1000_rx_ring {
/* pointer to the descriptor ring memory */ /* pointer to the descriptor ring memory */
void *desc; void *desc;
/* physical address of the descriptor ring */ /* physical address of the descriptor ring */
...@@ -186,6 +213,10 @@ struct e1000_desc_ring { ...@@ -186,6 +213,10 @@ struct e1000_desc_ring {
/* arrays of page information for packet split */ /* arrays of page information for packet split */
struct e1000_ps_page *ps_page; struct e1000_ps_page *ps_page;
struct e1000_ps_page_dma *ps_page_dma; struct e1000_ps_page_dma *ps_page_dma;
uint16_t rdh;
uint16_t rdt;
uint64_t pkt;
}; };
#define E1000_DESC_UNUSED(R) \ #define E1000_DESC_UNUSED(R) \
...@@ -227,9 +258,10 @@ struct e1000_adapter { ...@@ -227,9 +258,10 @@ struct e1000_adapter {
unsigned long led_status; unsigned long led_status;
/* TX */ /* TX */
struct e1000_desc_ring tx_ring; struct e1000_tx_ring *tx_ring; /* One per active queue */
struct e1000_buffer previous_buffer_info; #ifdef CONFIG_E1000_MQ
spinlock_t tx_lock; struct e1000_tx_ring **cpu_tx_ring; /* per-cpu */
#endif
uint32_t txd_cmd; uint32_t txd_cmd;
uint32_t tx_int_delay; uint32_t tx_int_delay;
uint32_t tx_abs_int_delay; uint32_t tx_abs_int_delay;
...@@ -246,19 +278,33 @@ struct e1000_adapter { ...@@ -246,19 +278,33 @@ struct e1000_adapter {
/* RX */ /* RX */
#ifdef CONFIG_E1000_NAPI #ifdef CONFIG_E1000_NAPI
boolean_t (*clean_rx) (struct e1000_adapter *adapter, int *work_done, boolean_t (*clean_rx) (struct e1000_adapter *adapter,
int work_to_do); struct e1000_rx_ring *rx_ring,
int *work_done, int work_to_do);
#else #else
boolean_t (*clean_rx) (struct e1000_adapter *adapter); boolean_t (*clean_rx) (struct e1000_adapter *adapter,
struct e1000_rx_ring *rx_ring);
#endif #endif
void (*alloc_rx_buf) (struct e1000_adapter *adapter); void (*alloc_rx_buf) (struct e1000_adapter *adapter,
struct e1000_desc_ring rx_ring; struct e1000_rx_ring *rx_ring);
struct e1000_rx_ring *rx_ring; /* One per active queue */
#ifdef CONFIG_E1000_NAPI
struct net_device *polling_netdev; /* One per active queue */
#endif
#ifdef CONFIG_E1000_MQ
struct net_device **cpu_netdev; /* per-cpu */
struct call_async_data_struct rx_sched_call_data;
int cpu_for_queue[4];
#endif
int num_queues;
uint64_t hw_csum_err; uint64_t hw_csum_err;
uint64_t hw_csum_good; uint64_t hw_csum_good;
uint64_t rx_hdr_split;
uint32_t rx_int_delay; uint32_t rx_int_delay;
uint32_t rx_abs_int_delay; uint32_t rx_abs_int_delay;
boolean_t rx_csum; boolean_t rx_csum;
boolean_t rx_ps; unsigned int rx_ps_pages;
uint32_t gorcl; uint32_t gorcl;
uint64_t gorcl_old; uint64_t gorcl_old;
uint16_t rx_ps_bsize0; uint16_t rx_ps_bsize0;
...@@ -278,8 +324,8 @@ struct e1000_adapter { ...@@ -278,8 +324,8 @@ struct e1000_adapter {
struct e1000_phy_stats phy_stats; struct e1000_phy_stats phy_stats;
uint32_t test_icr; uint32_t test_icr;
struct e1000_desc_ring test_tx_ring; struct e1000_tx_ring test_tx_ring;
struct e1000_desc_ring test_rx_ring; struct e1000_rx_ring test_rx_ring;
int msg_enable; int msg_enable;
......
...@@ -39,10 +39,10 @@ extern int e1000_up(struct e1000_adapter *adapter); ...@@ -39,10 +39,10 @@ extern int e1000_up(struct e1000_adapter *adapter);
extern void e1000_down(struct e1000_adapter *adapter); extern void e1000_down(struct e1000_adapter *adapter);
extern void e1000_reset(struct e1000_adapter *adapter); extern void e1000_reset(struct e1000_adapter *adapter);
extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx); extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx);
extern int e1000_setup_rx_resources(struct e1000_adapter *adapter); extern int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
extern int e1000_setup_tx_resources(struct e1000_adapter *adapter); extern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
extern void e1000_free_rx_resources(struct e1000_adapter *adapter); extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
extern void e1000_free_tx_resources(struct e1000_adapter *adapter); extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
extern void e1000_update_stats(struct e1000_adapter *adapter); extern void e1000_update_stats(struct e1000_adapter *adapter);
struct e1000_stats { struct e1000_stats {
...@@ -91,7 +91,8 @@ static const struct e1000_stats e1000_gstrings_stats[] = { ...@@ -91,7 +91,8 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{ "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) }, { "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) },
{ "rx_long_byte_count", E1000_STAT(stats.gorcl) }, { "rx_long_byte_count", E1000_STAT(stats.gorcl) },
{ "rx_csum_offload_good", E1000_STAT(hw_csum_good) }, { "rx_csum_offload_good", E1000_STAT(hw_csum_good) },
{ "rx_csum_offload_errors", E1000_STAT(hw_csum_err) } { "rx_csum_offload_errors", E1000_STAT(hw_csum_err) },
{ "rx_header_split", E1000_STAT(rx_hdr_split) },
}; };
#define E1000_STATS_LEN \ #define E1000_STATS_LEN \
sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats) sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats)
...@@ -546,8 +547,10 @@ e1000_set_eeprom(struct net_device *netdev, ...@@ -546,8 +547,10 @@ e1000_set_eeprom(struct net_device *netdev,
ret_val = e1000_write_eeprom(hw, first_word, ret_val = e1000_write_eeprom(hw, first_word,
last_word - first_word + 1, eeprom_buff); last_word - first_word + 1, eeprom_buff);
/* Update the checksum over the first part of the EEPROM if needed */ /* Update the checksum over the first part of the EEPROM if needed
if((ret_val == 0) && first_word <= EEPROM_CHECKSUM_REG) * and flush shadow RAM for 82573 conrollers */
if((ret_val == 0) && ((first_word <= EEPROM_CHECKSUM_REG) ||
(hw->mac_type == e1000_82573)))
e1000_update_eeprom_checksum(hw); e1000_update_eeprom_checksum(hw);
kfree(eeprom_buff); kfree(eeprom_buff);
...@@ -576,8 +579,8 @@ e1000_get_ringparam(struct net_device *netdev, ...@@ -576,8 +579,8 @@ e1000_get_ringparam(struct net_device *netdev,
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
e1000_mac_type mac_type = adapter->hw.mac_type; e1000_mac_type mac_type = adapter->hw.mac_type;
struct e1000_desc_ring *txdr = &adapter->tx_ring; struct e1000_tx_ring *txdr = adapter->tx_ring;
struct e1000_desc_ring *rxdr = &adapter->rx_ring; struct e1000_rx_ring *rxdr = adapter->rx_ring;
ring->rx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_RXD : ring->rx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_RXD :
E1000_MAX_82544_RXD; E1000_MAX_82544_RXD;
...@@ -597,20 +600,40 @@ e1000_set_ringparam(struct net_device *netdev, ...@@ -597,20 +600,40 @@ e1000_set_ringparam(struct net_device *netdev,
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
e1000_mac_type mac_type = adapter->hw.mac_type; e1000_mac_type mac_type = adapter->hw.mac_type;
struct e1000_desc_ring *txdr = &adapter->tx_ring; struct e1000_tx_ring *txdr, *tx_old, *tx_new;
struct e1000_desc_ring *rxdr = &adapter->rx_ring; struct e1000_rx_ring *rxdr, *rx_old, *rx_new;
struct e1000_desc_ring tx_old, tx_new, rx_old, rx_new; int i, err, tx_ring_size, rx_ring_size;
int err;
tx_ring_size = sizeof(struct e1000_tx_ring) * adapter->num_queues;
rx_ring_size = sizeof(struct e1000_rx_ring) * adapter->num_queues;
if (netif_running(adapter->netdev))
e1000_down(adapter);
tx_old = adapter->tx_ring; tx_old = adapter->tx_ring;
rx_old = adapter->rx_ring; rx_old = adapter->rx_ring;
adapter->tx_ring = kmalloc(tx_ring_size, GFP_KERNEL);
if (!adapter->tx_ring) {
err = -ENOMEM;
goto err_setup_rx;
}
memset(adapter->tx_ring, 0, tx_ring_size);
adapter->rx_ring = kmalloc(rx_ring_size, GFP_KERNEL);
if (!adapter->rx_ring) {
kfree(adapter->tx_ring);
err = -ENOMEM;
goto err_setup_rx;
}
memset(adapter->rx_ring, 0, rx_ring_size);
txdr = adapter->tx_ring;
rxdr = adapter->rx_ring;
if((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) if((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
return -EINVAL; return -EINVAL;
if(netif_running(adapter->netdev))
e1000_down(adapter);
rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD); rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD);
rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ? rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ?
E1000_MAX_RXD : E1000_MAX_82544_RXD)); E1000_MAX_RXD : E1000_MAX_82544_RXD));
...@@ -621,11 +644,16 @@ e1000_set_ringparam(struct net_device *netdev, ...@@ -621,11 +644,16 @@ e1000_set_ringparam(struct net_device *netdev,
E1000_MAX_TXD : E1000_MAX_82544_TXD)); E1000_MAX_TXD : E1000_MAX_82544_TXD));
E1000_ROUNDUP(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE); E1000_ROUNDUP(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE);
for (i = 0; i < adapter->num_queues; i++) {
txdr[i].count = txdr->count;
rxdr[i].count = rxdr->count;
}
if(netif_running(adapter->netdev)) { if(netif_running(adapter->netdev)) {
/* Try to get new resources before deleting old */ /* Try to get new resources before deleting old */
if((err = e1000_setup_rx_resources(adapter))) if ((err = e1000_setup_all_rx_resources(adapter)))
goto err_setup_rx; goto err_setup_rx;
if((err = e1000_setup_tx_resources(adapter))) if ((err = e1000_setup_all_tx_resources(adapter)))
goto err_setup_tx; goto err_setup_tx;
/* save the new, restore the old in order to free it, /* save the new, restore the old in order to free it,
...@@ -635,8 +663,10 @@ e1000_set_ringparam(struct net_device *netdev, ...@@ -635,8 +663,10 @@ e1000_set_ringparam(struct net_device *netdev,
tx_new = adapter->tx_ring; tx_new = adapter->tx_ring;
adapter->rx_ring = rx_old; adapter->rx_ring = rx_old;
adapter->tx_ring = tx_old; adapter->tx_ring = tx_old;
e1000_free_rx_resources(adapter); e1000_free_all_rx_resources(adapter);
e1000_free_tx_resources(adapter); e1000_free_all_tx_resources(adapter);
kfree(tx_old);
kfree(rx_old);
adapter->rx_ring = rx_new; adapter->rx_ring = rx_new;
adapter->tx_ring = tx_new; adapter->tx_ring = tx_new;
if((err = e1000_up(adapter))) if((err = e1000_up(adapter)))
...@@ -645,7 +675,7 @@ e1000_set_ringparam(struct net_device *netdev, ...@@ -645,7 +675,7 @@ e1000_set_ringparam(struct net_device *netdev,
return 0; return 0;
err_setup_tx: err_setup_tx:
e1000_free_rx_resources(adapter); e1000_free_all_rx_resources(adapter);
err_setup_rx: err_setup_rx:
adapter->rx_ring = rx_old; adapter->rx_ring = rx_old;
adapter->tx_ring = tx_old; adapter->tx_ring = tx_old;
...@@ -696,6 +726,11 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) ...@@ -696,6 +726,11 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
* Some bits that get toggled are ignored. * Some bits that get toggled are ignored.
*/ */
switch (adapter->hw.mac_type) { switch (adapter->hw.mac_type) {
/* there are several bits on newer hardware that are r/w */
case e1000_82571:
case e1000_82572:
toggle = 0x7FFFF3FF;
break;
case e1000_82573: case e1000_82573:
toggle = 0x7FFFF033; toggle = 0x7FFFF033;
break; break;
...@@ -898,8 +933,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) ...@@ -898,8 +933,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
static void static void
e1000_free_desc_rings(struct e1000_adapter *adapter) e1000_free_desc_rings(struct e1000_adapter *adapter)
{ {
struct e1000_desc_ring *txdr = &adapter->test_tx_ring; struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
struct e1000_desc_ring *rxdr = &adapter->test_rx_ring; struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
int i; int i;
...@@ -941,8 +976,8 @@ e1000_free_desc_rings(struct e1000_adapter *adapter) ...@@ -941,8 +976,8 @@ e1000_free_desc_rings(struct e1000_adapter *adapter)
static int static int
e1000_setup_desc_rings(struct e1000_adapter *adapter) e1000_setup_desc_rings(struct e1000_adapter *adapter)
{ {
struct e1000_desc_ring *txdr = &adapter->test_tx_ring; struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
struct e1000_desc_ring *rxdr = &adapter->test_rx_ring; struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
uint32_t rctl; uint32_t rctl;
int size, i, ret_val; int size, i, ret_val;
...@@ -1245,6 +1280,8 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter) ...@@ -1245,6 +1280,8 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
case e1000_82541_rev_2: case e1000_82541_rev_2:
case e1000_82547: case e1000_82547:
case e1000_82547_rev_2: case e1000_82547_rev_2:
case e1000_82571:
case e1000_82572:
case e1000_82573: case e1000_82573:
return e1000_integrated_phy_loopback(adapter); return e1000_integrated_phy_loopback(adapter);
break; break;
...@@ -1340,8 +1377,8 @@ e1000_check_lbtest_frame(struct sk_buff *skb, unsigned int frame_size) ...@@ -1340,8 +1377,8 @@ e1000_check_lbtest_frame(struct sk_buff *skb, unsigned int frame_size)
static int static int
e1000_run_loopback_test(struct e1000_adapter *adapter) e1000_run_loopback_test(struct e1000_adapter *adapter)
{ {
struct e1000_desc_ring *txdr = &adapter->test_tx_ring; struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
struct e1000_desc_ring *rxdr = &adapter->test_rx_ring; struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
int i, j, k, l, lc, good_cnt, ret_val=0; int i, j, k, l, lc, good_cnt, ret_val=0;
unsigned long time; unsigned long time;
...@@ -1509,6 +1546,7 @@ e1000_diag_test(struct net_device *netdev, ...@@ -1509,6 +1546,7 @@ e1000_diag_test(struct net_device *netdev,
data[2] = 0; data[2] = 0;
data[3] = 0; data[3] = 0;
} }
msleep_interruptible(4 * 1000);
} }
static void static void
...@@ -1625,7 +1663,7 @@ e1000_phys_id(struct net_device *netdev, uint32_t data) ...@@ -1625,7 +1663,7 @@ e1000_phys_id(struct net_device *netdev, uint32_t data)
if(!data || data > (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ)) if(!data || data > (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ))
data = (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ); data = (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ);
if(adapter->hw.mac_type < e1000_82573) { if(adapter->hw.mac_type < e1000_82571) {
if(!adapter->blink_timer.function) { if(!adapter->blink_timer.function) {
init_timer(&adapter->blink_timer); init_timer(&adapter->blink_timer);
adapter->blink_timer.function = e1000_led_blink_callback; adapter->blink_timer.function = e1000_led_blink_callback;
...@@ -1739,6 +1777,7 @@ struct ethtool_ops e1000_ethtool_ops = { ...@@ -1739,6 +1777,7 @@ struct ethtool_ops e1000_ethtool_ops = {
.phys_id = e1000_phys_id, .phys_id = e1000_phys_id,
.get_stats_count = e1000_get_stats_count, .get_stats_count = e1000_get_stats_count,
.get_ethtool_stats = e1000_get_ethtool_stats, .get_ethtool_stats = e1000_get_ethtool_stats,
.get_perm_addr = ethtool_op_get_perm_addr,
}; };
void e1000_set_ethtool_ops(struct net_device *netdev) void e1000_set_ethtool_ops(struct net_device *netdev)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -306,7 +306,8 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -306,7 +306,8 @@ e1000_check_options(struct e1000_adapter *adapter)
.def = E1000_DEFAULT_TXD, .def = E1000_DEFAULT_TXD,
.arg = { .r = { .min = E1000_MIN_TXD }} .arg = { .r = { .min = E1000_MIN_TXD }}
}; };
struct e1000_desc_ring *tx_ring = &adapter->tx_ring; struct e1000_tx_ring *tx_ring = adapter->tx_ring;
int i;
e1000_mac_type mac_type = adapter->hw.mac_type; e1000_mac_type mac_type = adapter->hw.mac_type;
opt.arg.r.max = mac_type < e1000_82544 ? opt.arg.r.max = mac_type < e1000_82544 ?
E1000_MAX_TXD : E1000_MAX_82544_TXD; E1000_MAX_TXD : E1000_MAX_82544_TXD;
...@@ -319,6 +320,8 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -319,6 +320,8 @@ e1000_check_options(struct e1000_adapter *adapter)
} else { } else {
tx_ring->count = opt.def; tx_ring->count = opt.def;
} }
for (i = 0; i < adapter->num_queues; i++)
tx_ring[i].count = tx_ring->count;
} }
{ /* Receive Descriptor Count */ { /* Receive Descriptor Count */
struct e1000_option opt = { struct e1000_option opt = {
...@@ -329,7 +332,8 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -329,7 +332,8 @@ e1000_check_options(struct e1000_adapter *adapter)
.def = E1000_DEFAULT_RXD, .def = E1000_DEFAULT_RXD,
.arg = { .r = { .min = E1000_MIN_RXD }} .arg = { .r = { .min = E1000_MIN_RXD }}
}; };
struct e1000_desc_ring *rx_ring = &adapter->rx_ring; struct e1000_rx_ring *rx_ring = adapter->rx_ring;
int i;
e1000_mac_type mac_type = adapter->hw.mac_type; e1000_mac_type mac_type = adapter->hw.mac_type;
opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD :
E1000_MAX_82544_RXD; E1000_MAX_82544_RXD;
...@@ -342,6 +346,8 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -342,6 +346,8 @@ e1000_check_options(struct e1000_adapter *adapter)
} else { } else {
rx_ring->count = opt.def; rx_ring->count = opt.def;
} }
for (i = 0; i < adapter->num_queues; i++)
rx_ring[i].count = rx_ring->count;
} }
{ /* Checksum Offload Enable/Disable */ { /* Checksum Offload Enable/Disable */
struct e1000_option opt = { struct e1000_option opt = {
......
...@@ -1334,7 +1334,7 @@ static void epic_rx_err(struct net_device *dev, struct epic_private *ep) ...@@ -1334,7 +1334,7 @@ static void epic_rx_err(struct net_device *dev, struct epic_private *ep)
static int epic_poll(struct net_device *dev, int *budget) static int epic_poll(struct net_device *dev, int *budget)
{ {
struct epic_private *ep = dev->priv; struct epic_private *ep = dev->priv;
int work_done, orig_budget; int work_done = 0, orig_budget;
long ioaddr = dev->base_addr; long ioaddr = dev->base_addr;
orig_budget = (*budget > dev->quota) ? dev->quota : *budget; orig_budget = (*budget > dev->quota) ? dev->quota : *budget;
...@@ -1343,7 +1343,7 @@ static int epic_poll(struct net_device *dev, int *budget) ...@@ -1343,7 +1343,7 @@ static int epic_poll(struct net_device *dev, int *budget)
epic_tx(dev, ep); epic_tx(dev, ep);
work_done = epic_rx(dev, *budget); work_done += epic_rx(dev, *budget);
epic_rx_err(dev, ep); epic_rx_err(dev, ep);
......
This diff is collapsed.
This diff is collapsed.
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
* *
* Still left to do: * Still left to do:
* -Add support for module parameters * -Add support for module parameters
* -Add support for ethtool -s
* -Add patch for ethtool phys id * -Add patch for ethtool phys id
*/ */
#ifndef __GIANFAR_H #ifndef __GIANFAR_H
...@@ -37,7 +36,8 @@ ...@@ -37,7 +36,8 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/fsl_devices.h> #include <linux/mii.h>
#include <linux/phy.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -48,7 +48,8 @@ ...@@ -48,7 +48,8 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include "gianfar_phy.h" #include <linux/fsl_devices.h>
#include "gianfar_mii.h"
/* The maximum number of packets to be handled in one call of gfar_poll */ /* The maximum number of packets to be handled in one call of gfar_poll */
#define GFAR_DEV_WEIGHT 64 #define GFAR_DEV_WEIGHT 64
...@@ -73,7 +74,7 @@ ...@@ -73,7 +74,7 @@
#define PHY_INIT_TIMEOUT 100000 #define PHY_INIT_TIMEOUT 100000
#define GFAR_PHY_CHANGE_TIME 2 #define GFAR_PHY_CHANGE_TIME 2
#define DEVICE_NAME "%s: Gianfar Ethernet Controller Version 1.1, " #define DEVICE_NAME "%s: Gianfar Ethernet Controller Version 1.2, "
#define DRV_NAME "gfar-enet" #define DRV_NAME "gfar-enet"
extern const char gfar_driver_name[]; extern const char gfar_driver_name[];
extern const char gfar_driver_version[]; extern const char gfar_driver_version[];
...@@ -578,12 +579,7 @@ struct gfar { ...@@ -578,12 +579,7 @@ struct gfar {
u32 hafdup; /* 0x.50c - Half Duplex Register */ u32 hafdup; /* 0x.50c - Half Duplex Register */
u32 maxfrm; /* 0x.510 - Maximum Frame Length Register */ u32 maxfrm; /* 0x.510 - Maximum Frame Length Register */
u8 res18[12]; u8 res18[12];
u32 miimcfg; /* 0x.520 - MII Management Configuration Register */ u8 gfar_mii_regs[24]; /* See gianfar_phy.h */
u32 miimcom; /* 0x.524 - MII Management Command Register */
u32 miimadd; /* 0x.528 - MII Management Address Register */
u32 miimcon; /* 0x.52c - MII Management Control Register */
u32 miimstat; /* 0x.530 - MII Management Status Register */
u32 miimind; /* 0x.534 - MII Management Indicator Register */
u8 res19[4]; u8 res19[4];
u32 ifstat; /* 0x.53c - Interface Status Register */ u32 ifstat; /* 0x.53c - Interface Status Register */
u32 macstnaddr1; /* 0x.540 - Station Address Part 1 Register */ u32 macstnaddr1; /* 0x.540 - Station Address Part 1 Register */
...@@ -688,9 +684,6 @@ struct gfar_private { ...@@ -688,9 +684,6 @@ struct gfar_private {
struct gfar *regs; /* Pointer to the GFAR memory mapped Registers */ struct gfar *regs; /* Pointer to the GFAR memory mapped Registers */
u32 *hash_regs[16]; u32 *hash_regs[16];
int hash_width; int hash_width;
struct gfar *phyregs;
struct work_struct tq;
struct timer_list phy_info_timer;
struct net_device_stats stats; /* linux network statistics */ struct net_device_stats stats; /* linux network statistics */
struct gfar_extra_stats extra_stats; struct gfar_extra_stats extra_stats;
spinlock_t lock; spinlock_t lock;
...@@ -710,7 +703,8 @@ struct gfar_private { ...@@ -710,7 +703,8 @@ struct gfar_private {
unsigned int interruptError; unsigned int interruptError;
struct gianfar_platform_data *einfo; struct gianfar_platform_data *einfo;
struct gfar_mii_info *mii_info; struct phy_device *phydev;
struct mii_bus *mii_bus;
int oldspeed; int oldspeed;
int oldduplex; int oldduplex;
int oldlink; int oldlink;
...@@ -732,4 +726,12 @@ extern inline void gfar_write(volatile unsigned *addr, u32 val) ...@@ -732,4 +726,12 @@ extern inline void gfar_write(volatile unsigned *addr, u32 val)
extern struct ethtool_ops *gfar_op_array[]; extern struct ethtool_ops *gfar_op_array[];
extern irqreturn_t gfar_receive(int irq, void *dev_id, struct pt_regs *regs);
extern int startup_gfar(struct net_device *dev);
extern void stop_gfar(struct net_device *dev);
extern void gfar_halt(struct net_device *dev);
extern void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev,
int enable, u32 regnum, u32 read);
void gfar_setup_stashing(struct net_device *dev);
#endif /* __GIANFAR_H */ #endif /* __GIANFAR_H */
This diff is collapsed.
This diff is collapsed.
/*
* drivers/net/gianfar_mii.h
*
* Gianfar Ethernet Driver -- MII Management Bus Implementation
* Driver for the MDIO bus controller in the Gianfar register space
*
* Author: Andy Fleming
* Maintainer: Kumar Gala (kumar.gala@freescale.com)
*
* Copyright (c) 2002-2004 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#ifndef __GIANFAR_MII_H
#define __GIANFAR_MII_H
#define MIIMIND_BUSY 0x00000001
#define MIIMIND_NOTVALID 0x00000004
#define MII_READ_COMMAND 0x00000001
#define GFAR_SUPPORTED (SUPPORTED_10baseT_Half \
| SUPPORTED_100baseT_Half \
| SUPPORTED_100baseT_Full \
| SUPPORTED_Autoneg \
| SUPPORTED_MII)
struct gfar_mii {
u32 miimcfg; /* 0x.520 - MII Management Config Register */
u32 miimcom; /* 0x.524 - MII Management Command Register */
u32 miimadd; /* 0x.528 - MII Management Address Register */
u32 miimcon; /* 0x.52c - MII Management Control Register */
u32 miimstat; /* 0x.530 - MII Management Status Register */
u32 miimind; /* 0x.534 - MII Management Indicator Register */
};
int gfar_mdio_read(struct mii_bus *bus, int mii_id, int regnum);
int gfar_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value);
int __init gfar_mdio_init(void);
void __exit gfar_mdio_exit(void);
#endif /* GIANFAR_PHY_H */
This diff is collapsed.
This diff is collapsed.
config MKISS config MKISS
tristate "Serial port KISS driver" tristate "Serial port KISS driver"
depends on AX25 depends on AX25
select CRC16
---help--- ---help---
KISS is a protocol used for the exchange of data between a computer KISS is a protocol used for the exchange of data between a computer
and a Terminal Node Controller (a small embedded system commonly and a Terminal Node Controller (a small embedded system commonly
......
...@@ -144,7 +144,7 @@ static inline struct net_device *bpq_get_ax25_dev(struct net_device *dev) ...@@ -144,7 +144,7 @@ static inline struct net_device *bpq_get_ax25_dev(struct net_device *dev)
{ {
struct bpqdev *bpq; struct bpqdev *bpq;
list_for_each_entry(bpq, &bpq_devices, bpq_list) { list_for_each_entry_rcu(bpq, &bpq_devices, bpq_list) {
if (bpq->ethdev == dev) if (bpq->ethdev == dev)
return bpq->axdev; return bpq->axdev;
} }
...@@ -399,7 +399,7 @@ static void *bpq_seq_start(struct seq_file *seq, loff_t *pos) ...@@ -399,7 +399,7 @@ static void *bpq_seq_start(struct seq_file *seq, loff_t *pos)
if (*pos == 0) if (*pos == 0)
return SEQ_START_TOKEN; return SEQ_START_TOKEN;
list_for_each_entry(bpqdev, &bpq_devices, bpq_list) { list_for_each_entry_rcu(bpqdev, &bpq_devices, bpq_list) {
if (i == *pos) if (i == *pos)
return bpqdev; return bpqdev;
} }
...@@ -418,7 +418,7 @@ static void *bpq_seq_next(struct seq_file *seq, void *v, loff_t *pos) ...@@ -418,7 +418,7 @@ static void *bpq_seq_next(struct seq_file *seq, void *v, loff_t *pos)
p = ((struct bpqdev *)v)->bpq_list.next; p = ((struct bpqdev *)v)->bpq_list.next;
return (p == &bpq_devices) ? NULL return (p == &bpq_devices) ? NULL
: list_entry(p, struct bpqdev, bpq_list); : rcu_dereference(list_entry(p, struct bpqdev, bpq_list));
} }
static void bpq_seq_stop(struct seq_file *seq, void *v) static void bpq_seq_stop(struct seq_file *seq, void *v)
...@@ -561,8 +561,6 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi ...@@ -561,8 +561,6 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi
if (!dev_is_ethdev(dev)) if (!dev_is_ethdev(dev))
return NOTIFY_DONE; return NOTIFY_DONE;
rcu_read_lock();
switch (event) { switch (event) {
case NETDEV_UP: /* new ethernet device -> new BPQ interface */ case NETDEV_UP: /* new ethernet device -> new BPQ interface */
if (bpq_get_ax25_dev(dev) == NULL) if (bpq_get_ax25_dev(dev) == NULL)
...@@ -581,7 +579,6 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi ...@@ -581,7 +579,6 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi
default: default:
break; break;
} }
rcu_read_unlock();
return NOTIFY_DONE; return NOTIFY_DONE;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -678,10 +678,9 @@ static void turnaround_delay(const struct stir_cb *stir, long us) ...@@ -678,10 +678,9 @@ static void turnaround_delay(const struct stir_cb *stir, long us)
return; return;
ticks = us / (1000000 / HZ); ticks = us / (1000000 / HZ);
if (ticks > 0) { if (ticks > 0)
current->state = TASK_INTERRUPTIBLE; schedule_timeout_interruptible(1 + ticks);
schedule_timeout(1 + ticks); else
} else
udelay(us); udelay(us);
} }
......
...@@ -645,11 +645,10 @@ ixgb_phys_id(struct net_device *netdev, uint32_t data) ...@@ -645,11 +645,10 @@ ixgb_phys_id(struct net_device *netdev, uint32_t data)
mod_timer(&adapter->blink_timer, jiffies); mod_timer(&adapter->blink_timer, jiffies);
set_current_state(TASK_INTERRUPTIBLE); if (data)
if(data) schedule_timeout_interruptible(data * HZ);
schedule_timeout(data * HZ);
else else
schedule_timeout(MAX_SCHEDULE_TIMEOUT); schedule_timeout_interruptible(MAX_SCHEDULE_TIMEOUT);
del_timer_sync(&adapter->blink_timer); del_timer_sync(&adapter->blink_timer);
ixgb_led_off(&adapter->hw); ixgb_led_off(&adapter->hw);
...@@ -723,6 +722,7 @@ struct ethtool_ops ixgb_ethtool_ops = { ...@@ -723,6 +722,7 @@ struct ethtool_ops ixgb_ethtool_ops = {
.phys_id = ixgb_phys_id, .phys_id = ixgb_phys_id,
.get_stats_count = ixgb_get_stats_count, .get_stats_count = ixgb_get_stats_count,
.get_ethtool_stats = ixgb_get_ethtool_stats, .get_ethtool_stats = ixgb_get_ethtool_stats,
.get_perm_addr = ethtool_op_get_perm_addr,
}; };
void ixgb_set_ethtool_ops(struct net_device *netdev) void ixgb_set_ethtool_ops(struct net_device *netdev)
......
...@@ -460,8 +460,9 @@ ixgb_probe(struct pci_dev *pdev, ...@@ -460,8 +460,9 @@ ixgb_probe(struct pci_dev *pdev,
} }
ixgb_get_ee_mac_addr(&adapter->hw, netdev->dev_addr); ixgb_get_ee_mac_addr(&adapter->hw, netdev->dev_addr);
memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
if(!is_valid_ether_addr(netdev->dev_addr)) { if(!is_valid_ether_addr(netdev->perm_addr)) {
err = -EIO; err = -EIO;
goto err_eeprom; goto err_eeprom;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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