Commit 5fdf193b authored by Linus Torvalds's avatar Linus Torvalds

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

parents f3ed8b44 2ae2d77c
...@@ -1897,6 +1897,7 @@ static int cp_resume (struct pci_dev *pdev) ...@@ -1897,6 +1897,7 @@ static int cp_resume (struct pci_dev *pdev)
{ {
struct net_device *dev; struct net_device *dev;
struct cp_private *cp; struct cp_private *cp;
unsigned long flags;
dev = pci_get_drvdata (pdev); dev = pci_get_drvdata (pdev);
cp = netdev_priv(dev); cp = netdev_priv(dev);
...@@ -1911,6 +1912,12 @@ static int cp_resume (struct pci_dev *pdev) ...@@ -1911,6 +1912,12 @@ static int cp_resume (struct pci_dev *pdev)
cp_init_hw (cp); cp_init_hw (cp);
netif_start_queue (dev); netif_start_queue (dev);
spin_lock_irqsave (&cp->lock, flags);
mii_check_media(&cp->mii_if, netif_msg_link(cp), FALSE);
spin_unlock_irqrestore (&cp->lock, flags);
return 0; return 0;
} }
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
......
...@@ -48,6 +48,10 @@ ...@@ -48,6 +48,10 @@
* net_device_stats * net_device_stats
* * introduced tx_timeout function * * introduced tx_timeout function
* * reworked locking * * reworked locking
*
* 01-Jul-2005 Ben Dooks <ben@simtec.co.uk>
* * fixed spinlock call without pointer
* * ensure spinlock is initialised
*/ */
#include <linux/module.h> #include <linux/module.h>
...@@ -148,7 +152,6 @@ static int dm9000_probe(struct device *); ...@@ -148,7 +152,6 @@ static int dm9000_probe(struct device *);
static int dm9000_open(struct net_device *); static int dm9000_open(struct net_device *);
static int dm9000_start_xmit(struct sk_buff *, struct net_device *); static int dm9000_start_xmit(struct sk_buff *, struct net_device *);
static int dm9000_stop(struct net_device *); static int dm9000_stop(struct net_device *);
static int dm9000_do_ioctl(struct net_device *, struct ifreq *, int);
static void dm9000_timer(unsigned long); static void dm9000_timer(unsigned long);
...@@ -322,7 +325,7 @@ static void dm9000_timeout(struct net_device *dev) ...@@ -322,7 +325,7 @@ static void dm9000_timeout(struct net_device *dev)
/* Save previous register address */ /* Save previous register address */
reg_save = readb(db->io_addr); reg_save = readb(db->io_addr);
spin_lock_irqsave(db->lock,flags); spin_lock_irqsave(&db->lock,flags);
netif_stop_queue(dev); netif_stop_queue(dev);
dm9000_reset(db); dm9000_reset(db);
...@@ -333,7 +336,7 @@ static void dm9000_timeout(struct net_device *dev) ...@@ -333,7 +336,7 @@ static void dm9000_timeout(struct net_device *dev)
/* Restore previous register address */ /* Restore previous register address */
writeb(reg_save, db->io_addr); writeb(reg_save, db->io_addr);
spin_unlock_irqrestore(db->lock,flags); spin_unlock_irqrestore(&db->lock,flags);
} }
...@@ -387,8 +390,6 @@ dm9000_probe(struct device *dev) ...@@ -387,8 +390,6 @@ dm9000_probe(struct device *dev)
int i; int i;
u32 id_val; u32 id_val;
printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
/* Init network device */ /* Init network device */
ndev = alloc_etherdev(sizeof (struct board_info)); ndev = alloc_etherdev(sizeof (struct board_info));
if (!ndev) { if (!ndev) {
...@@ -405,6 +406,8 @@ dm9000_probe(struct device *dev) ...@@ -405,6 +406,8 @@ dm9000_probe(struct device *dev)
db = (struct board_info *) ndev->priv; db = (struct board_info *) ndev->priv;
memset(db, 0, sizeof (*db)); memset(db, 0, sizeof (*db));
spin_lock_init(&db->lock);
if (pdev->num_resources < 2) { if (pdev->num_resources < 2) {
ret = -ENODEV; ret = -ENODEV;
goto out; goto out;
...@@ -541,7 +544,6 @@ dm9000_probe(struct device *dev) ...@@ -541,7 +544,6 @@ dm9000_probe(struct device *dev)
ndev->stop = &dm9000_stop; ndev->stop = &dm9000_stop;
ndev->get_stats = &dm9000_get_stats; ndev->get_stats = &dm9000_get_stats;
ndev->set_multicast_list = &dm9000_hash_table; ndev->set_multicast_list = &dm9000_hash_table;
ndev->do_ioctl = &dm9000_do_ioctl;
#ifdef DM9000_PROGRAM_EEPROM #ifdef DM9000_PROGRAM_EEPROM
program_eeprom(db); program_eeprom(db);
...@@ -612,7 +614,7 @@ dm9000_open(struct net_device *dev) ...@@ -612,7 +614,7 @@ dm9000_open(struct net_device *dev)
/* set and active a timer process */ /* set and active a timer process */
init_timer(&db->timer); init_timer(&db->timer);
db->timer.expires = DM9000_TIMER_WUT * 2; db->timer.expires = DM9000_TIMER_WUT;
db->timer.data = (unsigned long) dev; db->timer.data = (unsigned long) dev;
db->timer.function = &dm9000_timer; db->timer.function = &dm9000_timer;
add_timer(&db->timer); add_timer(&db->timer);
...@@ -845,15 +847,6 @@ dm9000_get_stats(struct net_device *dev) ...@@ -845,15 +847,6 @@ dm9000_get_stats(struct net_device *dev)
return &db->stats; return &db->stats;
} }
/*
* Process the upper socket ioctl command
*/
static int
dm9000_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
PRINTK1("entering %s\n",__FUNCTION__);
return 0;
}
/* /*
* A periodic timer routine * A periodic timer routine
...@@ -864,21 +857,11 @@ dm9000_timer(unsigned long data) ...@@ -864,21 +857,11 @@ dm9000_timer(unsigned long data)
{ {
struct net_device *dev = (struct net_device *) data; struct net_device *dev = (struct net_device *) data;
board_info_t *db = (board_info_t *) dev->priv; board_info_t *db = (board_info_t *) dev->priv;
u8 reg_save;
unsigned long flags;
PRINTK3("dm9000_timer()\n"); PRINTK3("dm9000_timer()\n");
spin_lock_irqsave(db->lock,flags);
/* Save previous register address */
reg_save = readb(db->io_addr);
mii_check_media(&db->mii, netif_msg_link(db), 0); mii_check_media(&db->mii, netif_msg_link(db), 0);
/* Restore previous register address */
writeb(reg_save, db->io_addr);
spin_unlock_irqrestore(db->lock,flags);
/* Set timer again */ /* Set timer again */
db->timer.expires = DM9000_TIMER_WUT; db->timer.expires = DM9000_TIMER_WUT;
add_timer(&db->timer); add_timer(&db->timer);
...@@ -1098,9 +1081,14 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg) ...@@ -1098,9 +1081,14 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
{ {
board_info_t *db = (board_info_t *) dev->priv; board_info_t *db = (board_info_t *) dev->priv;
unsigned long flags; unsigned long flags;
unsigned int reg_save;
int ret; int ret;
spin_lock_irqsave(&db->lock,flags); spin_lock_irqsave(&db->lock,flags);
/* Save previous register address */
reg_save = readb(db->io_addr);
/* Fill the phyxcer register into REG_0C */ /* Fill the phyxcer register into REG_0C */
iow(db, DM9000_EPAR, DM9000_PHY | reg); iow(db, DM9000_EPAR, DM9000_PHY | reg);
...@@ -1111,6 +1099,9 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg) ...@@ -1111,6 +1099,9 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
/* The read data keeps on REG_0D & REG_0E */ /* The read data keeps on REG_0D & REG_0E */
ret = (ior(db, DM9000_EPDRH) << 8) | ior(db, DM9000_EPDRL); ret = (ior(db, DM9000_EPDRH) << 8) | ior(db, DM9000_EPDRL);
/* restore the previous address */
writeb(reg_save, db->io_addr);
spin_unlock_irqrestore(&db->lock,flags); spin_unlock_irqrestore(&db->lock,flags);
return ret; return ret;
...@@ -1124,9 +1115,13 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value) ...@@ -1124,9 +1115,13 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
{ {
board_info_t *db = (board_info_t *) dev->priv; board_info_t *db = (board_info_t *) dev->priv;
unsigned long flags; unsigned long flags;
unsigned long reg_save;
spin_lock_irqsave(&db->lock,flags); spin_lock_irqsave(&db->lock,flags);
/* Save previous register address */
reg_save = readb(db->io_addr);
/* Fill the phyxcer register into REG_0C */ /* Fill the phyxcer register into REG_0C */
iow(db, DM9000_EPAR, DM9000_PHY | reg); iow(db, DM9000_EPAR, DM9000_PHY | reg);
...@@ -1138,6 +1133,9 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value) ...@@ -1138,6 +1133,9 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
udelay(500); /* Wait write complete */ udelay(500); /* Wait write complete */
iow(db, DM9000_EPCR, 0x0); /* Clear phyxcer write command */ iow(db, DM9000_EPCR, 0x0); /* Clear phyxcer write command */
/* restore the previous address */
writeb(reg_save, db->io_addr);
spin_unlock_irqrestore(&db->lock,flags); spin_unlock_irqrestore(&db->lock,flags);
} }
...@@ -1202,6 +1200,8 @@ static struct device_driver dm9000_driver = { ...@@ -1202,6 +1200,8 @@ static struct device_driver dm9000_driver = {
static int __init static int __init
dm9000_init(void) dm9000_init(void)
{ {
printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
return driver_register(&dm9000_driver); /* search board and register */ return driver_register(&dm9000_driver); /* search board and register */
} }
......
...@@ -499,7 +499,7 @@ static int ioc3_mdio_read(struct net_device *dev, int phy, int reg) ...@@ -499,7 +499,7 @@ static int ioc3_mdio_read(struct net_device *dev, int phy, int reg)
ioc3_w_micr((phy << MICR_PHYADDR_SHIFT) | reg | MICR_READTRIG); ioc3_w_micr((phy << MICR_PHYADDR_SHIFT) | reg | MICR_READTRIG);
while (ioc3_r_micr() & MICR_BUSY); while (ioc3_r_micr() & MICR_BUSY);
return ioc3_r_micr() & MIDR_DATA_MASK; return ioc3_r_midr_r() & MIDR_DATA_MASK;
} }
static void ioc3_mdio_write(struct net_device *dev, int phy, int reg, int data) static void ioc3_mdio_write(struct net_device *dev, int phy, int reg, int data)
...@@ -1291,7 +1291,6 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1291,7 +1291,6 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
dev->features = NETIF_F_IP_CSUM; dev->features = NETIF_F_IP_CSUM;
#endif #endif
ioc3_setup_duplex(ip);
sw_physid1 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID1); sw_physid1 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID1);
sw_physid2 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID2); sw_physid2 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID2);
...@@ -1300,6 +1299,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1300,6 +1299,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
goto out_stop; goto out_stop;
mii_check_media(&ip->mii, 1, 1); mii_check_media(&ip->mii, 1, 1);
ioc3_setup_duplex(ip);
vendor = (sw_physid1 << 12) | (sw_physid2 >> 4); vendor = (sw_physid1 << 12) | (sw_physid2 >> 4);
model = (sw_physid2 >> 4) & 0x3f; model = (sw_physid2 >> 4) & 0x3f;
......
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