Commit e62112c5 authored by David S. Miller's avatar David S. Miller

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

parents 031cf19e 68905eb4
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/ata_platform.h> #include <linux/ata_platform.h>
#include <linux/mv643xx_eth.h> #include <linux/mv643xx_eth.h>
#include <linux/ethtool.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
...@@ -69,6 +70,8 @@ static struct platform_device rd88f6281_nand_flash = { ...@@ -69,6 +70,8 @@ static struct platform_device rd88f6281_nand_flash = {
static struct mv643xx_eth_platform_data rd88f6281_ge00_data = { static struct mv643xx_eth_platform_data rd88f6281_ge00_data = {
.phy_addr = -1, .phy_addr = -1,
.speed = SPEED_1000,
.duplex = DUPLEX_FULL,
}; };
static struct mv_sata_platform_data rd88f6281_sata_data = { static struct mv_sata_platform_data rd88f6281_sata_data = {
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h> #include <linux/mv643xx_eth.h>
#include <linux/ethtool.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/gpio.h> #include <asm/gpio.h>
#include <asm/leds.h> #include <asm/leds.h>
...@@ -88,6 +89,8 @@ static struct orion5x_mpp_mode rd88f5181l_fxo_mpp_modes[] __initdata = { ...@@ -88,6 +89,8 @@ static struct orion5x_mpp_mode rd88f5181l_fxo_mpp_modes[] __initdata = {
static struct mv643xx_eth_platform_data rd88f5181l_fxo_eth_data = { static struct mv643xx_eth_platform_data rd88f5181l_fxo_eth_data = {
.phy_addr = -1, .phy_addr = -1,
.speed = SPEED_1000,
.duplex = DUPLEX_FULL,
}; };
static void __init rd88f5181l_fxo_init(void) static void __init rd88f5181l_fxo_init(void)
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h> #include <linux/mv643xx_eth.h>
#include <linux/ethtool.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/gpio.h> #include <asm/gpio.h>
...@@ -89,6 +90,8 @@ static struct orion5x_mpp_mode rd88f5181l_ge_mpp_modes[] __initdata = { ...@@ -89,6 +90,8 @@ static struct orion5x_mpp_mode rd88f5181l_ge_mpp_modes[] __initdata = {
static struct mv643xx_eth_platform_data rd88f5181l_ge_eth_data = { static struct mv643xx_eth_platform_data rd88f5181l_ge_eth_data = {
.phy_addr = -1, .phy_addr = -1,
.speed = SPEED_1000,
.duplex = DUPLEX_FULL,
}; };
static struct i2c_board_info __initdata rd88f5181l_ge_i2c_rtc = { static struct i2c_board_info __initdata rd88f5181l_ge_i2c_rtc = {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h> #include <linux/mv643xx_eth.h>
#include <linux/ethtool.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/gpio.h> #include <asm/gpio.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -92,6 +93,8 @@ static struct platform_device wnr854t_nor_flash = { ...@@ -92,6 +93,8 @@ static struct platform_device wnr854t_nor_flash = {
static struct mv643xx_eth_platform_data wnr854t_eth_data = { static struct mv643xx_eth_platform_data wnr854t_eth_data = {
.phy_addr = -1, .phy_addr = -1,
.speed = SPEED_1000,
.duplex = DUPLEX_FULL,
}; };
static void __init wnr854t_init(void) static void __init wnr854t_init(void)
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h> #include <linux/mv643xx_eth.h>
#include <linux/ethtool.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/gpio.h> #include <asm/gpio.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -100,6 +101,8 @@ static struct platform_device wrt350n_v2_nor_flash = { ...@@ -100,6 +101,8 @@ static struct platform_device wrt350n_v2_nor_flash = {
static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = { static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = {
.phy_addr = -1, .phy_addr = -1,
.speed = SPEED_1000,
.duplex = DUPLEX_FULL,
}; };
static void __init wrt350n_v2_init(void) static void __init wrt350n_v2_init(void)
......
...@@ -510,14 +510,14 @@ config STNIC ...@@ -510,14 +510,14 @@ config STNIC
config SH_ETH config SH_ETH
tristate "Renesas SuperH Ethernet support" tristate "Renesas SuperH Ethernet support"
depends on SUPERH && \ depends on SUPERH && \
(CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712) (CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || CPU_SUBTYPE_SH7763)
select CRC32 select CRC32
select MII select MII
select MDIO_BITBANG select MDIO_BITBANG
select PHYLIB select PHYLIB
help help
Renesas SuperH Ethernet device driver. Renesas SuperH Ethernet device driver.
This driver support SH7710 and SH7712. This driver support SH7710, SH7712 and SH7763.
config SUNLANCE config SUNLANCE
tristate "Sun LANCE support" tristate "Sun LANCE support"
......
...@@ -605,36 +605,87 @@ static void adjust_tx_list(void) ...@@ -605,36 +605,87 @@ static void adjust_tx_list(void)
static int bfin_mac_hard_start_xmit(struct sk_buff *skb, static int bfin_mac_hard_start_xmit(struct sk_buff *skb,
struct net_device *dev) struct net_device *dev)
{ {
unsigned int data; u16 *data;
current_tx_ptr->skb = skb; current_tx_ptr->skb = skb;
/* if (ANOMALY_05000285) {
* Is skb->data always 16-bit aligned? /*
* Do we need to memcpy((char *)(tail->packet + 2), skb->data, len)? * TXDWA feature is not avaible to older revision < 0.3 silicon
*/ * of BF537
if ((((unsigned int)(skb->data)) & 0x02) == 2) { *
/* move skb->data to current_tx_ptr payload */ * Only if data buffer is ODD WORD alignment, we do not
data = (unsigned int)(skb->data) - 2; * need to memcpy
*((unsigned short *)data) = (unsigned short)(skb->len); */
current_tx_ptr->desc_a.start_addr = (unsigned long)data; u32 data_align = (u32)(skb->data) & 0x3;
/* this is important! */ if (data_align == 0x2) {
blackfin_dcache_flush_range(data, (data + (skb->len)) + 2); /* move skb->data to current_tx_ptr payload */
data = (u16 *)(skb->data) - 1;
*data = (u16)(skb->len);
current_tx_ptr->desc_a.start_addr = (u32)data;
/* this is important! */
blackfin_dcache_flush_range((u32)data,
(u32)((u8 *)data + skb->len + 4));
} else {
*((u16 *)(current_tx_ptr->packet)) = (u16)(skb->len);
memcpy((u8 *)(current_tx_ptr->packet + 2), skb->data,
skb->len);
current_tx_ptr->desc_a.start_addr =
(u32)current_tx_ptr->packet;
if (current_tx_ptr->status.status_word != 0)
current_tx_ptr->status.status_word = 0;
blackfin_dcache_flush_range(
(u32)current_tx_ptr->packet,
(u32)(current_tx_ptr->packet + skb->len + 2));
}
} else { } else {
*((unsigned short *)(current_tx_ptr->packet)) = /*
(unsigned short)(skb->len); * TXDWA feature is avaible to revision < 0.3 silicon of
memcpy((char *)(current_tx_ptr->packet + 2), skb->data, * BF537 and always avaible to BF52x
(skb->len)); */
current_tx_ptr->desc_a.start_addr = u32 data_align = (u32)(skb->data) & 0x3;
(unsigned long)current_tx_ptr->packet; if (data_align == 0x0) {
if (current_tx_ptr->status.status_word != 0) u16 sysctl = bfin_read_EMAC_SYSCTL();
current_tx_ptr->status.status_word = 0; sysctl |= TXDWA;
blackfin_dcache_flush_range((unsigned int)current_tx_ptr-> bfin_write_EMAC_SYSCTL(sysctl);
packet,
(unsigned int)(current_tx_ptr-> /* move skb->data to current_tx_ptr payload */
packet + skb->len) + data = (u16 *)(skb->data) - 2;
2); *data = (u16)(skb->len);
current_tx_ptr->desc_a.start_addr = (u32)data;
/* this is important! */
blackfin_dcache_flush_range(
(u32)data,
(u32)((u8 *)data + skb->len + 4));
} else if (data_align == 0x2) {
u16 sysctl = bfin_read_EMAC_SYSCTL();
sysctl &= ~TXDWA;
bfin_write_EMAC_SYSCTL(sysctl);
/* move skb->data to current_tx_ptr payload */
data = (u16 *)(skb->data) - 1;
*data = (u16)(skb->len);
current_tx_ptr->desc_a.start_addr = (u32)data;
/* this is important! */
blackfin_dcache_flush_range(
(u32)data,
(u32)((u8 *)data + skb->len + 4));
} else {
u16 sysctl = bfin_read_EMAC_SYSCTL();
sysctl &= ~TXDWA;
bfin_write_EMAC_SYSCTL(sysctl);
*((u16 *)(current_tx_ptr->packet)) = (u16)(skb->len);
memcpy((u8 *)(current_tx_ptr->packet + 2), skb->data,
skb->len);
current_tx_ptr->desc_a.start_addr =
(u32)current_tx_ptr->packet;
if (current_tx_ptr->status.status_word != 0)
current_tx_ptr->status.status_word = 0;
blackfin_dcache_flush_range(
(u32)current_tx_ptr->packet,
(u32)(current_tx_ptr->packet + skb->len + 2));
}
} }
/* enable this packet's dma */ /* enable this packet's dma */
...@@ -691,7 +742,6 @@ static void bfin_mac_rx(struct net_device *dev) ...@@ -691,7 +742,6 @@ static void bfin_mac_rx(struct net_device *dev)
(unsigned long)skb->tail); (unsigned long)skb->tail);
dev->last_rx = jiffies; dev->last_rx = jiffies;
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
#if defined(BFIN_MAC_CSUM_OFFLOAD) #if defined(BFIN_MAC_CSUM_OFFLOAD)
skb->csum = current_rx_ptr->status.ip_payload_csum; skb->csum = current_rx_ptr->status.ip_payload_csum;
...@@ -920,6 +970,7 @@ static int bfin_mac_open(struct net_device *dev) ...@@ -920,6 +970,7 @@ static int bfin_mac_open(struct net_device *dev)
phy_start(lp->phydev); phy_start(lp->phydev);
phy_write(lp->phydev, MII_BMCR, BMCR_RESET); phy_write(lp->phydev, MII_BMCR, BMCR_RESET);
setup_system_regs(dev); setup_system_regs(dev);
setup_mac_addr(dev->dev_addr);
bfin_mac_disable(); bfin_mac_disable();
bfin_mac_enable(); bfin_mac_enable();
pr_debug("hardware init finished\n"); pr_debug("hardware init finished\n");
...@@ -955,7 +1006,7 @@ static int bfin_mac_close(struct net_device *dev) ...@@ -955,7 +1006,7 @@ static int bfin_mac_close(struct net_device *dev)
return 0; return 0;
} }
static int __init bfin_mac_probe(struct platform_device *pdev) static int __devinit bfin_mac_probe(struct platform_device *pdev)
{ {
struct net_device *ndev; struct net_device *ndev;
struct bfin_mac_local *lp; struct bfin_mac_local *lp;
...@@ -1081,7 +1132,7 @@ static int __init bfin_mac_probe(struct platform_device *pdev) ...@@ -1081,7 +1132,7 @@ static int __init bfin_mac_probe(struct platform_device *pdev)
return rc; return rc;
} }
static int bfin_mac_remove(struct platform_device *pdev) static int __devexit bfin_mac_remove(struct platform_device *pdev)
{ {
struct net_device *ndev = platform_get_drvdata(pdev); struct net_device *ndev = platform_get_drvdata(pdev);
struct bfin_mac_local *lp = netdev_priv(ndev); struct bfin_mac_local *lp = netdev_priv(ndev);
...@@ -1128,7 +1179,7 @@ static int bfin_mac_resume(struct platform_device *pdev) ...@@ -1128,7 +1179,7 @@ static int bfin_mac_resume(struct platform_device *pdev)
static struct platform_driver bfin_mac_driver = { static struct platform_driver bfin_mac_driver = {
.probe = bfin_mac_probe, .probe = bfin_mac_probe,
.remove = bfin_mac_remove, .remove = __devexit_p(bfin_mac_remove),
.resume = bfin_mac_resume, .resume = bfin_mac_resume,
.suspend = bfin_mac_suspend, .suspend = bfin_mac_suspend,
.driver = { .driver = {
......
...@@ -683,7 +683,7 @@ enum { ...@@ -683,7 +683,7 @@ enum {
SF_ERASE_SECTOR = 0xd8, /* erase sector */ SF_ERASE_SECTOR = 0xd8, /* erase sector */
FW_FLASH_BOOT_ADDR = 0x70000, /* start address of FW in flash */ FW_FLASH_BOOT_ADDR = 0x70000, /* start address of FW in flash */
FW_VERS_ADDR = 0x77ffc, /* flash address holding FW version */ FW_VERS_ADDR = 0x7fffc, /* flash address holding FW version */
FW_MIN_SIZE = 8 /* at least version and csum */ FW_MIN_SIZE = 8 /* at least version and csum */
}; };
......
...@@ -2937,9 +2937,9 @@ static void ehea_rereg_mrs(struct work_struct *work) ...@@ -2937,9 +2937,9 @@ static void ehea_rereg_mrs(struct work_struct *work)
} }
} }
} }
mutex_unlock(&dlpar_mem_lock); ehea_info("re-initializing driver complete");
ehea_info("re-initializing driver complete");
out: out:
mutex_unlock(&dlpar_mem_lock);
return; return;
} }
......
...@@ -1547,8 +1547,10 @@ static int __devinit enc28j60_probe(struct spi_device *spi) ...@@ -1547,8 +1547,10 @@ static int __devinit enc28j60_probe(struct spi_device *spi)
random_ether_addr(dev->dev_addr); random_ether_addr(dev->dev_addr);
enc28j60_set_hw_macaddr(dev); enc28j60_set_hw_macaddr(dev);
ret = request_irq(spi->irq, enc28j60_irq, IRQF_TRIGGER_FALLING, /* Board setup must set the relevant edge trigger type;
DRV_NAME, priv); * level triggers won't currently work.
*/
ret = request_irq(spi->irq, enc28j60_irq, 0, DRV_NAME, priv);
if (ret < 0) { if (ret < 0) {
if (netif_msg_probe(priv)) if (netif_msg_probe(priv))
dev_err(&spi->dev, DRV_NAME ": request irq %d failed " dev_err(&spi->dev, DRV_NAME ": request irq %d failed "
......
...@@ -333,6 +333,7 @@ enum { ...@@ -333,6 +333,7 @@ enum {
NvRegPowerState2 = 0x600, NvRegPowerState2 = 0x600,
#define NVREG_POWERSTATE2_POWERUP_MASK 0x0F11 #define NVREG_POWERSTATE2_POWERUP_MASK 0x0F11
#define NVREG_POWERSTATE2_POWERUP_REV_A3 0x0001 #define NVREG_POWERSTATE2_POWERUP_REV_A3 0x0001
#define NVREG_POWERSTATE2_PHY_RESET 0x0004
}; };
/* Big endian: should work, but is untested */ /* Big endian: should work, but is untested */
...@@ -529,6 +530,7 @@ union ring_type { ...@@ -529,6 +530,7 @@ union ring_type {
#define PHY_REALTEK_INIT_REG4 0x14 #define PHY_REALTEK_INIT_REG4 0x14
#define PHY_REALTEK_INIT_REG5 0x18 #define PHY_REALTEK_INIT_REG5 0x18
#define PHY_REALTEK_INIT_REG6 0x11 #define PHY_REALTEK_INIT_REG6 0x11
#define PHY_REALTEK_INIT_REG7 0x01
#define PHY_REALTEK_INIT1 0x0000 #define PHY_REALTEK_INIT1 0x0000
#define PHY_REALTEK_INIT2 0x8e00 #define PHY_REALTEK_INIT2 0x8e00
#define PHY_REALTEK_INIT3 0x0001 #define PHY_REALTEK_INIT3 0x0001
...@@ -537,6 +539,9 @@ union ring_type { ...@@ -537,6 +539,9 @@ union ring_type {
#define PHY_REALTEK_INIT6 0xf5c7 #define PHY_REALTEK_INIT6 0xf5c7
#define PHY_REALTEK_INIT7 0x1000 #define PHY_REALTEK_INIT7 0x1000
#define PHY_REALTEK_INIT8 0x0003 #define PHY_REALTEK_INIT8 0x0003
#define PHY_REALTEK_INIT9 0x0008
#define PHY_REALTEK_INIT10 0x0005
#define PHY_REALTEK_INIT11 0x0200
#define PHY_REALTEK_INIT_MSK1 0x0003 #define PHY_REALTEK_INIT_MSK1 0x0003
#define PHY_GIGABIT 0x0100 #define PHY_GIGABIT 0x0100
...@@ -1149,6 +1154,42 @@ static int phy_init(struct net_device *dev) ...@@ -1149,6 +1154,42 @@ static int phy_init(struct net_device *dev)
return PHY_ERROR; return PHY_ERROR;
} }
} }
if (np->phy_model == PHY_MODEL_REALTEK_8211 &&
np->phy_rev == PHY_REV_REALTEK_8211C) {
u32 powerstate = readl(base + NvRegPowerState2);
/* need to perform hw phy reset */
powerstate |= NVREG_POWERSTATE2_PHY_RESET;
writel(powerstate, base + NvRegPowerState2);
msleep(25);
powerstate &= ~NVREG_POWERSTATE2_PHY_RESET;
writel(powerstate, base + NvRegPowerState2);
msleep(25);
reg = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, MII_READ);
reg |= PHY_REALTEK_INIT9;
if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, reg)) {
printk(KERN_INFO "%s: phy init failed.\n", pci_name(np->pci_dev));
return PHY_ERROR;
}
if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT10)) {
printk(KERN_INFO "%s: phy init failed.\n", pci_name(np->pci_dev));
return PHY_ERROR;
}
reg = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG7, MII_READ);
if (!(reg & PHY_REALTEK_INIT11)) {
reg |= PHY_REALTEK_INIT11;
if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG7, reg)) {
printk(KERN_INFO "%s: phy init failed.\n", pci_name(np->pci_dev));
return PHY_ERROR;
}
}
if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1)) {
printk(KERN_INFO "%s: phy init failed.\n", pci_name(np->pci_dev));
return PHY_ERROR;
}
}
if (np->phy_model == PHY_MODEL_REALTEK_8201) { if (np->phy_model == PHY_MODEL_REALTEK_8201) {
if (np->device_id == PCI_DEVICE_ID_NVIDIA_NVENET_32 || if (np->device_id == PCI_DEVICE_ID_NVIDIA_NVENET_32 ||
np->device_id == PCI_DEVICE_ID_NVIDIA_NVENET_33 || np->device_id == PCI_DEVICE_ID_NVIDIA_NVENET_33 ||
...@@ -1201,12 +1242,23 @@ static int phy_init(struct net_device *dev) ...@@ -1201,12 +1242,23 @@ static int phy_init(struct net_device *dev)
mii_control = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); mii_control = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ);
mii_control |= BMCR_ANENABLE; mii_control |= BMCR_ANENABLE;
/* reset the phy if (np->phy_oui == PHY_OUI_REALTEK &&
* (certain phys need bmcr to be setup with reset) np->phy_model == PHY_MODEL_REALTEK_8211 &&
*/ np->phy_rev == PHY_REV_REALTEK_8211C) {
if (phy_reset(dev, mii_control)) { /* start autoneg since we already performed hw reset above */
printk(KERN_INFO "%s: phy reset failed\n", pci_name(np->pci_dev)); mii_control |= BMCR_ANRESTART;
return PHY_ERROR; if (mii_rw(dev, np->phyaddr, MII_BMCR, mii_control)) {
printk(KERN_INFO "%s: phy init failed\n", pci_name(np->pci_dev));
return PHY_ERROR;
}
} else {
/* reset the phy
* (certain phys need bmcr to be setup with reset)
*/
if (phy_reset(dev, mii_control)) {
printk(KERN_INFO "%s: phy reset failed\n", pci_name(np->pci_dev));
return PHY_ERROR;
}
} }
/* phy vendor specific configuration */ /* phy vendor specific configuration */
......
This diff is collapsed.
...@@ -536,7 +536,7 @@ static int __init ne_probe1(struct net_device *dev, unsigned long ioaddr) ...@@ -536,7 +536,7 @@ static int __init ne_probe1(struct net_device *dev, unsigned long ioaddr)
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = eip_poll; dev->poll_controller = eip_poll;
#endif #endif
NS8390_init(dev, 0); NS8390p_init(dev, 0);
ret = register_netdev(dev); ret = register_netdev(dev);
if (ret) if (ret)
...@@ -794,7 +794,7 @@ static void ne_block_output(struct net_device *dev, int count, ...@@ -794,7 +794,7 @@ static void ne_block_output(struct net_device *dev, int count,
if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name); printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev,1); NS8390p_init(dev, 1);
break; break;
} }
...@@ -855,7 +855,7 @@ static int ne_drv_resume(struct platform_device *pdev) ...@@ -855,7 +855,7 @@ static int ne_drv_resume(struct platform_device *pdev)
if (netif_running(dev)) { if (netif_running(dev)) {
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev, 1); NS8390p_init(dev, 1);
netif_device_attach(dev); netif_device_attach(dev);
} }
return 0; return 0;
......
...@@ -3143,7 +3143,7 @@ static void tx_intr_handler(struct fifo_info *fifo_data) ...@@ -3143,7 +3143,7 @@ static void tx_intr_handler(struct fifo_info *fifo_data)
pkt_cnt++; pkt_cnt++;
/* Updating the statistics block */ /* Updating the statistics block */
nic->stats.tx_bytes += skb->len; nic->dev->stats.tx_bytes += skb->len;
nic->mac_control.stats_info->sw_stat.mem_freed += skb->truesize; nic->mac_control.stats_info->sw_stat.mem_freed += skb->truesize;
dev_kfree_skb_irq(skb); dev_kfree_skb_irq(skb);
...@@ -4896,25 +4896,42 @@ static struct net_device_stats *s2io_get_stats(struct net_device *dev) ...@@ -4896,25 +4896,42 @@ static struct net_device_stats *s2io_get_stats(struct net_device *dev)
/* Configure Stats for immediate updt */ /* Configure Stats for immediate updt */
s2io_updt_stats(sp); s2io_updt_stats(sp);
/* Using sp->stats as a staging area, because reset (due to mtu
change, for example) will clear some hardware counters */
dev->stats.tx_packets +=
le32_to_cpu(mac_control->stats_info->tmac_frms) -
sp->stats.tx_packets;
sp->stats.tx_packets = sp->stats.tx_packets =
le32_to_cpu(mac_control->stats_info->tmac_frms); le32_to_cpu(mac_control->stats_info->tmac_frms);
dev->stats.tx_errors +=
le32_to_cpu(mac_control->stats_info->tmac_any_err_frms) -
sp->stats.tx_errors;
sp->stats.tx_errors = sp->stats.tx_errors =
le32_to_cpu(mac_control->stats_info->tmac_any_err_frms); le32_to_cpu(mac_control->stats_info->tmac_any_err_frms);
dev->stats.rx_errors +=
le64_to_cpu(mac_control->stats_info->rmac_drop_frms) -
sp->stats.rx_errors;
sp->stats.rx_errors = sp->stats.rx_errors =
le64_to_cpu(mac_control->stats_info->rmac_drop_frms); le64_to_cpu(mac_control->stats_info->rmac_drop_frms);
dev->stats.multicast =
le32_to_cpu(mac_control->stats_info->rmac_vld_mcst_frms) -
sp->stats.multicast;
sp->stats.multicast = sp->stats.multicast =
le32_to_cpu(mac_control->stats_info->rmac_vld_mcst_frms); le32_to_cpu(mac_control->stats_info->rmac_vld_mcst_frms);
dev->stats.rx_length_errors =
le64_to_cpu(mac_control->stats_info->rmac_long_frms) -
sp->stats.rx_length_errors;
sp->stats.rx_length_errors = sp->stats.rx_length_errors =
le64_to_cpu(mac_control->stats_info->rmac_long_frms); le64_to_cpu(mac_control->stats_info->rmac_long_frms);
/* collect per-ring rx_packets and rx_bytes */ /* collect per-ring rx_packets and rx_bytes */
sp->stats.rx_packets = sp->stats.rx_bytes = 0; dev->stats.rx_packets = dev->stats.rx_bytes = 0;
for (i = 0; i < config->rx_ring_num; i++) { for (i = 0; i < config->rx_ring_num; i++) {
sp->stats.rx_packets += mac_control->rings[i].rx_packets; dev->stats.rx_packets += mac_control->rings[i].rx_packets;
sp->stats.rx_bytes += mac_control->rings[i].rx_bytes; dev->stats.rx_bytes += mac_control->rings[i].rx_bytes;
} }
return (&sp->stats); return (&dev->stats);
} }
/** /**
...@@ -7419,7 +7436,7 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp) ...@@ -7419,7 +7436,7 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)
if (err_mask != 0x5) { if (err_mask != 0x5) {
DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%x\n", DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%x\n",
dev->name, err_mask); dev->name, err_mask);
sp->stats.rx_crc_errors++; dev->stats.rx_crc_errors++;
sp->mac_control.stats_info->sw_stat.mem_freed sp->mac_control.stats_info->sw_stat.mem_freed
+= skb->truesize; += skb->truesize;
dev_kfree_skb(skb); dev_kfree_skb(skb);
......
This diff is collapsed.
This diff is collapsed.
...@@ -55,12 +55,28 @@ ...@@ -55,12 +55,28 @@
static int dm_read(struct usbnet *dev, u8 reg, u16 length, void *data) static int dm_read(struct usbnet *dev, u8 reg, u16 length, void *data)
{ {
void *buf;
int err = -ENOMEM;
devdbg(dev, "dm_read() reg=0x%02x length=%d", reg, length); devdbg(dev, "dm_read() reg=0x%02x length=%d", reg, length);
return usb_control_msg(dev->udev,
usb_rcvctrlpipe(dev->udev, 0), buf = kmalloc(length, GFP_KERNEL);
DM_READ_REGS, if (!buf)
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, goto out;
0, reg, data, length, USB_CTRL_SET_TIMEOUT);
err = usb_control_msg(dev->udev,
usb_rcvctrlpipe(dev->udev, 0),
DM_READ_REGS,
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
0, reg, buf, length, USB_CTRL_SET_TIMEOUT);
if (err == length)
memcpy(data, buf, length);
else if (err >= 0)
err = -EINVAL;
kfree(buf);
out:
return err;
} }
static int dm_read_reg(struct usbnet *dev, u8 reg, u8 *value) static int dm_read_reg(struct usbnet *dev, u8 reg, u8 *value)
...@@ -70,12 +86,28 @@ static int dm_read_reg(struct usbnet *dev, u8 reg, u8 *value) ...@@ -70,12 +86,28 @@ static int dm_read_reg(struct usbnet *dev, u8 reg, u8 *value)
static int dm_write(struct usbnet *dev, u8 reg, u16 length, void *data) static int dm_write(struct usbnet *dev, u8 reg, u16 length, void *data)
{ {
void *buf = NULL;
int err = -ENOMEM;
devdbg(dev, "dm_write() reg=0x%02x, length=%d", reg, length); devdbg(dev, "dm_write() reg=0x%02x, length=%d", reg, length);
return usb_control_msg(dev->udev,
usb_sndctrlpipe(dev->udev, 0), if (data) {
DM_WRITE_REGS, buf = kmalloc(length, GFP_KERNEL);
USB_DIR_OUT | USB_TYPE_VENDOR |USB_RECIP_DEVICE, if (!buf)
0, reg, data, length, USB_CTRL_SET_TIMEOUT); goto out;
memcpy(buf, data, length);
}
err = usb_control_msg(dev->udev,
usb_sndctrlpipe(dev->udev, 0),
DM_WRITE_REGS,
USB_DIR_OUT | USB_TYPE_VENDOR |USB_RECIP_DEVICE,
0, reg, buf, length, USB_CTRL_SET_TIMEOUT);
kfree(buf);
if (err >= 0 && err < length)
err = -EINVAL;
out:
return err;
} }
static int dm_write_reg(struct usbnet *dev, u8 reg, u8 value) static int dm_write_reg(struct usbnet *dev, u8 reg, u8 value)
......
...@@ -337,7 +337,7 @@ static int __init wd_probe1(struct net_device *dev, int ioaddr) ...@@ -337,7 +337,7 @@ static int __init wd_probe1(struct net_device *dev, int ioaddr)
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = ei_poll; dev->poll_controller = ei_poll;
#endif #endif
NS8390_init(dev, 0); NS8390p_init(dev, 0);
#if 1 #if 1
/* Enable interrupt generation on softconfig cards -- M.U */ /* Enable interrupt generation on softconfig cards -- M.U */
......
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