mirror of https://gitee.com/openkylin/linux.git
Merge head 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
This commit is contained in:
commit
5fdf193b15
|
@ -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)
|
||||||
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 @@
|
||||||
* 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 *);
|
||||||
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)
|
||||||
|
|
||||||
/* 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)
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
/* 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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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 = {
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue