sis900: stop using net_device.{base_addr, irq} and convert to __iomem.

- pci_resource_start() can be removed from sis900_get_mac_addr() because
  the IO range is maped and stored into the device private struct early
  in the device probe function.
- the driver contains a few direct accesses to low IO ports that forbid
  to re(#)define the usual out{l, w, b} macros.

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Cc: Daniele Venzano <venza@brownhat.org>
This commit is contained in:
Francois Romieu 2012-03-13 11:14:17 +01:00
parent 5820e97a29
commit 57d6d456cf
1 changed files with 201 additions and 174 deletions

View File

@ -168,6 +168,8 @@ struct sis900_private {
unsigned int cur_phy; unsigned int cur_phy;
struct mii_if_info mii_info; struct mii_if_info mii_info;
void __iomem *ioaddr;
struct timer_list timer; /* Link status detection timer. */ struct timer_list timer; /* Link status detection timer. */
u8 autong_complete; /* 1: auto-negotiate complete */ u8 autong_complete; /* 1: auto-negotiate complete */
@ -201,13 +203,18 @@ MODULE_PARM_DESC(multicast_filter_limit, "SiS 900/7016 maximum number of filtere
MODULE_PARM_DESC(max_interrupt_work, "SiS 900/7016 maximum events handled per interrupt"); MODULE_PARM_DESC(max_interrupt_work, "SiS 900/7016 maximum events handled per interrupt");
MODULE_PARM_DESC(sis900_debug, "SiS 900/7016 bitmapped debugging message level"); MODULE_PARM_DESC(sis900_debug, "SiS 900/7016 bitmapped debugging message level");
#define sw32(reg, val) iowrite32(val, ioaddr + (reg))
#define sw8(reg, val) iowrite8(val, ioaddr + (reg))
#define sr32(reg) ioread32(ioaddr + (reg))
#define sr16(reg) ioread16(ioaddr + (reg))
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
static void sis900_poll(struct net_device *dev); static void sis900_poll(struct net_device *dev);
#endif #endif
static int sis900_open(struct net_device *net_dev); static int sis900_open(struct net_device *net_dev);
static int sis900_mii_probe (struct net_device * net_dev); static int sis900_mii_probe (struct net_device * net_dev);
static void sis900_init_rxfilter (struct net_device * net_dev); static void sis900_init_rxfilter (struct net_device * net_dev);
static u16 read_eeprom(long ioaddr, int location); static u16 read_eeprom(void __iomem *ioaddr, int location);
static int mdio_read(struct net_device *net_dev, int phy_id, int location); static int mdio_read(struct net_device *net_dev, int phy_id, int location);
static void mdio_write(struct net_device *net_dev, int phy_id, int location, int val); static void mdio_write(struct net_device *net_dev, int phy_id, int location, int val);
static void sis900_timer(unsigned long data); static void sis900_timer(unsigned long data);
@ -231,7 +238,7 @@ static u16 sis900_default_phy(struct net_device * net_dev);
static void sis900_set_capability( struct net_device *net_dev ,struct mii_phy *phy); static void sis900_set_capability( struct net_device *net_dev ,struct mii_phy *phy);
static u16 sis900_reset_phy(struct net_device *net_dev, int phy_addr); static u16 sis900_reset_phy(struct net_device *net_dev, int phy_addr);
static void sis900_auto_negotiate(struct net_device *net_dev, int phy_addr); static void sis900_auto_negotiate(struct net_device *net_dev, int phy_addr);
static void sis900_set_mode (long ioaddr, int speed, int duplex); static void sis900_set_mode(struct sis900_private *, int speed, int duplex);
static const struct ethtool_ops sis900_ethtool_ops; static const struct ethtool_ops sis900_ethtool_ops;
/** /**
@ -246,7 +253,8 @@ static const struct ethtool_ops sis900_ethtool_ops;
static int __devinit sis900_get_mac_addr(struct pci_dev * pci_dev, struct net_device *net_dev) static int __devinit sis900_get_mac_addr(struct pci_dev * pci_dev, struct net_device *net_dev)
{ {
long ioaddr = pci_resource_start(pci_dev, 0); struct sis900_private *sis_priv = netdev_priv(net_dev);
void __iomem *ioaddr = sis_priv->ioaddr;
u16 signature; u16 signature;
int i; int i;
@ -325,29 +333,30 @@ static int __devinit sis630e_get_mac_addr(struct pci_dev * pci_dev,
static int __devinit sis635_get_mac_addr(struct pci_dev * pci_dev, static int __devinit sis635_get_mac_addr(struct pci_dev * pci_dev,
struct net_device *net_dev) struct net_device *net_dev)
{ {
long ioaddr = net_dev->base_addr; struct sis900_private *sis_priv = netdev_priv(net_dev);
void __iomem *ioaddr = sis_priv->ioaddr;
u32 rfcrSave; u32 rfcrSave;
u32 i; u32 i;
rfcrSave = inl(rfcr + ioaddr); rfcrSave = sr32(rfcr);
outl(rfcrSave | RELOAD, ioaddr + cr); sw32(cr, rfcrSave | RELOAD);
outl(0, ioaddr + cr); sw32(cr, 0);
/* disable packet filtering before setting filter */ /* disable packet filtering before setting filter */
outl(rfcrSave & ~RFEN, rfcr + ioaddr); sw32(rfcr, rfcrSave & ~RFEN);
/* load MAC addr to filter data register */ /* load MAC addr to filter data register */
for (i = 0 ; i < 3 ; i++) { for (i = 0 ; i < 3 ; i++) {
outl((i << RFADDR_shift), ioaddr + rfcr); sw32(rfcr, (i << RFADDR_shift));
*( ((u16 *)net_dev->dev_addr) + i) = inw(ioaddr + rfdr); *( ((u16 *)net_dev->dev_addr) + i) = sr16(rfdr);
} }
/* Store MAC Address in perm_addr */ /* Store MAC Address in perm_addr */
memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN); memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
/* enable packet filtering */ /* enable packet filtering */
outl(rfcrSave | RFEN, rfcr + ioaddr); sw32(rfcr, rfcrSave | RFEN);
return 1; return 1;
} }
@ -371,31 +380,30 @@ static int __devinit sis635_get_mac_addr(struct pci_dev * pci_dev,
static int __devinit sis96x_get_mac_addr(struct pci_dev * pci_dev, static int __devinit sis96x_get_mac_addr(struct pci_dev * pci_dev,
struct net_device *net_dev) struct net_device *net_dev)
{ {
long ioaddr = net_dev->base_addr; struct sis900_private *sis_priv = netdev_priv(net_dev);
long ee_addr = ioaddr + mear; void __iomem *ioaddr = sis_priv->ioaddr;
u32 waittime = 0; int wait, rc = 0;
int i;
outl(EEREQ, ee_addr); sw32(mear, EEREQ);
while(waittime < 2000) { for (wait = 0; wait < 2000; wait++) {
if(inl(ee_addr) & EEGNT) { if (sr32(mear) & EEGNT) {
u16 *mac = (u16 *)net_dev->dev_addr;
int i;
/* get MAC address from EEPROM */ /* get MAC address from EEPROM */
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((u16 *)(net_dev->dev_addr))[i] = read_eeprom(ioaddr, i+EEPROMMACAddr); mac[i] = read_eeprom(ioaddr, i + EEPROMMACAddr);
/* Store MAC Address in perm_addr */ /* Store MAC Address in perm_addr */
memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN); memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
outl(EEDONE, ee_addr); rc = 1;
return 1; break;
} else {
udelay(1);
waittime ++;
} }
udelay(1);
} }
outl(EEDONE, ee_addr); sw32(mear, EEDONE);
return 0; return rc;
} }
static const struct net_device_ops sis900_netdev_ops = { static const struct net_device_ops sis900_netdev_ops = {
@ -433,7 +441,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
struct pci_dev *dev; struct pci_dev *dev;
dma_addr_t ring_dma; dma_addr_t ring_dma;
void *ring_space; void *ring_space;
long ioaddr; void __iomem *ioaddr;
int i, ret; int i, ret;
const char *card_name = card_names[pci_id->driver_data]; const char *card_name = card_names[pci_id->driver_data];
const char *dev_name = pci_name(pci_dev); const char *dev_name = pci_name(pci_dev);
@ -464,14 +472,17 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
SET_NETDEV_DEV(net_dev, &pci_dev->dev); SET_NETDEV_DEV(net_dev, &pci_dev->dev);
/* We do a request_region() to register /proc/ioports info. */ /* We do a request_region() to register /proc/ioports info. */
ioaddr = pci_resource_start(pci_dev, 0);
ret = pci_request_regions(pci_dev, "sis900"); ret = pci_request_regions(pci_dev, "sis900");
if (ret) if (ret)
goto err_out; goto err_out;
/* IO region. */
ioaddr = pci_iomap(pci_dev, 0, 0);
if (!ioaddr)
goto err_out_cleardev;
sis_priv = netdev_priv(net_dev); sis_priv = netdev_priv(net_dev);
net_dev->base_addr = ioaddr; sis_priv->ioaddr = ioaddr;
net_dev->irq = pci_dev->irq;
sis_priv->pci_dev = pci_dev; sis_priv->pci_dev = pci_dev;
spin_lock_init(&sis_priv->lock); spin_lock_init(&sis_priv->lock);
@ -480,7 +491,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
ring_space = pci_alloc_consistent(pci_dev, TX_TOTAL_SIZE, &ring_dma); ring_space = pci_alloc_consistent(pci_dev, TX_TOTAL_SIZE, &ring_dma);
if (!ring_space) { if (!ring_space) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_out_cleardev; goto err_out_unmap;
} }
sis_priv->tx_ring = ring_space; sis_priv->tx_ring = ring_space;
sis_priv->tx_ring_dma = ring_dma; sis_priv->tx_ring_dma = ring_dma;
@ -534,7 +545,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
/* 630ET : set the mii access mode as software-mode */ /* 630ET : set the mii access mode as software-mode */
if (sis_priv->chipset_rev == SIS630ET_900_REV) if (sis_priv->chipset_rev == SIS630ET_900_REV)
outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr); sw32(cr, ACCESSMODE | sr32(cr));
/* probe for mii transceiver */ /* probe for mii transceiver */
if (sis900_mii_probe(net_dev) == 0) { if (sis900_mii_probe(net_dev) == 0) {
@ -556,25 +567,27 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
goto err_unmap_rx; goto err_unmap_rx;
/* print some information about our NIC */ /* print some information about our NIC */
printk(KERN_INFO "%s: %s at %#lx, IRQ %d, %pM\n", printk(KERN_INFO "%s: %s at 0x%p, IRQ %d, %pM\n",
net_dev->name, card_name, ioaddr, net_dev->irq, net_dev->name, card_name, ioaddr, pci_dev->irq,
net_dev->dev_addr); net_dev->dev_addr);
/* Detect Wake on Lan support */ /* Detect Wake on Lan support */
ret = (inl(net_dev->base_addr + CFGPMC) & PMESP) >> 27; ret = (sr32(CFGPMC) & PMESP) >> 27;
if (netif_msg_probe(sis_priv) && (ret & PME_D3C) == 0) if (netif_msg_probe(sis_priv) && (ret & PME_D3C) == 0)
printk(KERN_INFO "%s: Wake on LAN only available from suspend to RAM.", net_dev->name); printk(KERN_INFO "%s: Wake on LAN only available from suspend to RAM.", net_dev->name);
return 0; return 0;
err_unmap_rx: err_unmap_rx:
pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring, pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring,
sis_priv->rx_ring_dma); sis_priv->rx_ring_dma);
err_unmap_tx: err_unmap_tx:
pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring, pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring,
sis_priv->tx_ring_dma); sis_priv->tx_ring_dma);
err_out_cleardev: err_out_unmap:
pci_set_drvdata(pci_dev, NULL); pci_iounmap(pci_dev, ioaddr);
err_out_cleardev:
pci_set_drvdata(pci_dev, NULL);
pci_release_regions(pci_dev); pci_release_regions(pci_dev);
err_out: err_out:
free_netdev(net_dev); free_netdev(net_dev);
@ -798,7 +811,7 @@ static void sis900_set_capability(struct net_device *net_dev, struct mii_phy *ph
/* Delay between EEPROM clock transitions. */ /* Delay between EEPROM clock transitions. */
#define eeprom_delay() inl(ee_addr) #define eeprom_delay() sr32(mear)
/** /**
* read_eeprom - Read Serial EEPROM * read_eeprom - Read Serial EEPROM
@ -809,41 +822,41 @@ static void sis900_set_capability(struct net_device *net_dev, struct mii_phy *ph
* Note that location is in word (16 bits) unit * Note that location is in word (16 bits) unit
*/ */
static u16 __devinit read_eeprom(long ioaddr, int location) static u16 __devinit read_eeprom(void __iomem *ioaddr, int location)
{ {
u32 read_cmd = location | EEread;
int i; int i;
u16 retval = 0; u16 retval = 0;
long ee_addr = ioaddr + mear;
u32 read_cmd = location | EEread;
outl(0, ee_addr); sw32(mear, 0);
eeprom_delay(); eeprom_delay();
outl(EECS, ee_addr); sw32(mear, EECS);
eeprom_delay(); eeprom_delay();
/* Shift the read command (9) bits out. */ /* Shift the read command (9) bits out. */
for (i = 8; i >= 0; i--) { for (i = 8; i >= 0; i--) {
u32 dataval = (read_cmd & (1 << i)) ? EEDI | EECS : EECS; u32 dataval = (read_cmd & (1 << i)) ? EEDI | EECS : EECS;
outl(dataval, ee_addr);
sw32(mear, dataval);
eeprom_delay(); eeprom_delay();
outl(dataval | EECLK, ee_addr); sw32(mear, dataval | EECLK);
eeprom_delay(); eeprom_delay();
} }
outl(EECS, ee_addr); sw32(mear, EECS);
eeprom_delay(); eeprom_delay();
/* read the 16-bits data in */ /* read the 16-bits data in */
for (i = 16; i > 0; i--) { for (i = 16; i > 0; i--) {
outl(EECS, ee_addr); sw32(mear, EECS);
eeprom_delay(); eeprom_delay();
outl(EECS | EECLK, ee_addr); sw32(mear, EECS | EECLK);
eeprom_delay(); eeprom_delay();
retval = (retval << 1) | ((inl(ee_addr) & EEDO) ? 1 : 0); retval = (retval << 1) | ((sr32(mear) & EEDO) ? 1 : 0);
eeprom_delay(); eeprom_delay();
} }
/* Terminate the EEPROM access. */ /* Terminate the EEPROM access. */
outl(0, ee_addr); sw32(mear, 0);
eeprom_delay(); eeprom_delay();
return retval; return retval;
@ -852,24 +865,27 @@ static u16 __devinit read_eeprom(long ioaddr, int location)
/* Read and write the MII management registers using software-generated /* Read and write the MII management registers using software-generated
serial MDIO protocol. Note that the command bits and data bits are serial MDIO protocol. Note that the command bits and data bits are
send out separately */ send out separately */
#define mdio_delay() inl(mdio_addr) #define mdio_delay() sr32(mear)
static void mdio_idle(long mdio_addr) static void mdio_idle(struct sis900_private *sp)
{ {
outl(MDIO | MDDIR, mdio_addr); void __iomem *ioaddr = sp->ioaddr;
sw32(mear, MDIO | MDDIR);
mdio_delay(); mdio_delay();
outl(MDIO | MDDIR | MDC, mdio_addr); sw32(mear, MDIO | MDDIR | MDC);
} }
/* Syncronize the MII management interface by shifting 32 one bits out. */ /* Synchronize the MII management interface by shifting 32 one bits out. */
static void mdio_reset(long mdio_addr) static void mdio_reset(struct sis900_private *sp)
{ {
void __iomem *ioaddr = sp->ioaddr;
int i; int i;
for (i = 31; i >= 0; i--) { for (i = 31; i >= 0; i--) {
outl(MDDIR | MDIO, mdio_addr); sw32(mear, MDDIR | MDIO);
mdio_delay(); mdio_delay();
outl(MDDIR | MDIO | MDC, mdio_addr); sw32(mear, MDDIR | MDIO | MDC);
mdio_delay(); mdio_delay();
} }
} }
@ -887,31 +903,33 @@ static void mdio_reset(long mdio_addr)
static int mdio_read(struct net_device *net_dev, int phy_id, int location) static int mdio_read(struct net_device *net_dev, int phy_id, int location)
{ {
long mdio_addr = net_dev->base_addr + mear;
int mii_cmd = MIIread|(phy_id<<MIIpmdShift)|(location<<MIIregShift); int mii_cmd = MIIread|(phy_id<<MIIpmdShift)|(location<<MIIregShift);
struct sis900_private *sp = netdev_priv(net_dev);
void __iomem *ioaddr = sp->ioaddr;
u16 retval = 0; u16 retval = 0;
int i; int i;
mdio_reset(mdio_addr); mdio_reset(sp);
mdio_idle(mdio_addr); mdio_idle(sp);
for (i = 15; i >= 0; i--) { for (i = 15; i >= 0; i--) {
int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR; int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR;
outl(dataval, mdio_addr);
sw32(mear, dataval);
mdio_delay(); mdio_delay();
outl(dataval | MDC, mdio_addr); sw32(mear, dataval | MDC);
mdio_delay(); mdio_delay();
} }
/* Read the 16 data bits. */ /* Read the 16 data bits. */
for (i = 16; i > 0; i--) { for (i = 16; i > 0; i--) {
outl(0, mdio_addr); sw32(mear, 0);
mdio_delay(); mdio_delay();
retval = (retval << 1) | ((inl(mdio_addr) & MDIO) ? 1 : 0); retval = (retval << 1) | ((sr32(mear) & MDIO) ? 1 : 0);
outl(MDC, mdio_addr); sw32(mear, MDC);
mdio_delay(); mdio_delay();
} }
outl(0x00, mdio_addr); sw32(mear, 0x00);
return retval; return retval;
} }
@ -931,19 +949,21 @@ static int mdio_read(struct net_device *net_dev, int phy_id, int location)
static void mdio_write(struct net_device *net_dev, int phy_id, int location, static void mdio_write(struct net_device *net_dev, int phy_id, int location,
int value) int value)
{ {
long mdio_addr = net_dev->base_addr + mear;
int mii_cmd = MIIwrite|(phy_id<<MIIpmdShift)|(location<<MIIregShift); int mii_cmd = MIIwrite|(phy_id<<MIIpmdShift)|(location<<MIIregShift);
struct sis900_private *sp = netdev_priv(net_dev);
void __iomem *ioaddr = sp->ioaddr;
int i; int i;
mdio_reset(mdio_addr); mdio_reset(sp);
mdio_idle(mdio_addr); mdio_idle(sp);
/* Shift the command bits out. */ /* Shift the command bits out. */
for (i = 15; i >= 0; i--) { for (i = 15; i >= 0; i--) {
int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR; int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR;
outb(dataval, mdio_addr);
sw8(mear, dataval);
mdio_delay(); mdio_delay();
outb(dataval | MDC, mdio_addr); sw8(mear, dataval | MDC);
mdio_delay(); mdio_delay();
} }
mdio_delay(); mdio_delay();
@ -951,21 +971,22 @@ static void mdio_write(struct net_device *net_dev, int phy_id, int location,
/* Shift the value bits out. */ /* Shift the value bits out. */
for (i = 15; i >= 0; i--) { for (i = 15; i >= 0; i--) {
int dataval = (value & (1 << i)) ? MDDIR | MDIO : MDDIR; int dataval = (value & (1 << i)) ? MDDIR | MDIO : MDDIR;
outl(dataval, mdio_addr);
sw32(mear, dataval);
mdio_delay(); mdio_delay();
outl(dataval | MDC, mdio_addr); sw32(mear, dataval | MDC);
mdio_delay(); mdio_delay();
} }
mdio_delay(); mdio_delay();
/* Clear out extra bits. */ /* Clear out extra bits. */
for (i = 2; i > 0; i--) { for (i = 2; i > 0; i--) {
outb(0, mdio_addr); sw8(mear, 0);
mdio_delay(); mdio_delay();
outb(MDC, mdio_addr); sw8(mear, MDC);
mdio_delay(); mdio_delay();
} }
outl(0x00, mdio_addr); sw32(mear, 0x00);
} }
@ -1000,9 +1021,12 @@ static u16 sis900_reset_phy(struct net_device *net_dev, int phy_addr)
*/ */
static void sis900_poll(struct net_device *dev) static void sis900_poll(struct net_device *dev)
{ {
disable_irq(dev->irq); struct sis900_private *sp = netdev_priv(dev);
sis900_interrupt(dev->irq, dev); const int irq = sp->pci_dev->irq;
enable_irq(dev->irq);
disable_irq(irq);
sis900_interrupt(irq, dev);
enable_irq(irq);
} }
#endif #endif
@ -1018,7 +1042,7 @@ static int
sis900_open(struct net_device *net_dev) sis900_open(struct net_device *net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
int ret; int ret;
/* Soft reset the chip. */ /* Soft reset the chip. */
@ -1027,8 +1051,8 @@ sis900_open(struct net_device *net_dev)
/* Equalizer workaround Rule */ /* Equalizer workaround Rule */
sis630_set_eq(net_dev, sis_priv->chipset_rev); sis630_set_eq(net_dev, sis_priv->chipset_rev);
ret = request_irq(net_dev->irq, sis900_interrupt, IRQF_SHARED, ret = request_irq(sis_priv->pci_dev->irq, sis900_interrupt, IRQF_SHARED,
net_dev->name, net_dev); net_dev->name, net_dev);
if (ret) if (ret)
return ret; return ret;
@ -1042,12 +1066,12 @@ sis900_open(struct net_device *net_dev)
netif_start_queue(net_dev); netif_start_queue(net_dev);
/* Workaround for EDB */ /* Workaround for EDB */
sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
/* Enable all known interrupts by setting the interrupt mask. */ /* Enable all known interrupts by setting the interrupt mask. */
outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr); sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
outl(RxENA | inl(ioaddr + cr), ioaddr + cr); sw32(cr, RxENA | sr32(cr));
outl(IE, ioaddr + ier); sw32(ier, IE);
sis900_check_mode(net_dev, sis_priv->mii); sis900_check_mode(net_dev, sis_priv->mii);
@ -1074,31 +1098,30 @@ static void
sis900_init_rxfilter (struct net_device * net_dev) sis900_init_rxfilter (struct net_device * net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
u32 rfcrSave; u32 rfcrSave;
u32 i; u32 i;
rfcrSave = inl(rfcr + ioaddr); rfcrSave = sr32(rfcr);
/* disable packet filtering before setting filter */ /* disable packet filtering before setting filter */
outl(rfcrSave & ~RFEN, rfcr + ioaddr); sw32(rfcr, rfcrSave & ~RFEN);
/* load MAC addr to filter data register */ /* load MAC addr to filter data register */
for (i = 0 ; i < 3 ; i++) { for (i = 0 ; i < 3 ; i++) {
u32 w; u32 w = (u32) *((u16 *)(net_dev->dev_addr)+i);
w = (u32) *((u16 *)(net_dev->dev_addr)+i); sw32(rfcr, i << RFADDR_shift);
outl((i << RFADDR_shift), ioaddr + rfcr); sw32(rfdr, w);
outl(w, ioaddr + rfdr);
if (netif_msg_hw(sis_priv)) { if (netif_msg_hw(sis_priv)) {
printk(KERN_DEBUG "%s: Receive Filter Addrss[%d]=%x\n", printk(KERN_DEBUG "%s: Receive Filter Addrss[%d]=%x\n",
net_dev->name, i, inl(ioaddr + rfdr)); net_dev->name, i, sr32(rfdr));
} }
} }
/* enable packet filtering */ /* enable packet filtering */
outl(rfcrSave | RFEN, rfcr + ioaddr); sw32(rfcr, rfcrSave | RFEN);
} }
/** /**
@ -1112,7 +1135,7 @@ static void
sis900_init_tx_ring(struct net_device *net_dev) sis900_init_tx_ring(struct net_device *net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
int i; int i;
sis_priv->tx_full = 0; sis_priv->tx_full = 0;
@ -1128,10 +1151,10 @@ sis900_init_tx_ring(struct net_device *net_dev)
} }
/* load Transmit Descriptor Register */ /* load Transmit Descriptor Register */
outl(sis_priv->tx_ring_dma, ioaddr + txdp); sw32(txdp, sis_priv->tx_ring_dma);
if (netif_msg_hw(sis_priv)) if (netif_msg_hw(sis_priv))
printk(KERN_DEBUG "%s: TX descriptor register loaded with: %8.8x\n", printk(KERN_DEBUG "%s: TX descriptor register loaded with: %8.8x\n",
net_dev->name, inl(ioaddr + txdp)); net_dev->name, sr32(txdp));
} }
/** /**
@ -1146,7 +1169,7 @@ static void
sis900_init_rx_ring(struct net_device *net_dev) sis900_init_rx_ring(struct net_device *net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
int i; int i;
sis_priv->cur_rx = 0; sis_priv->cur_rx = 0;
@ -1181,10 +1204,10 @@ sis900_init_rx_ring(struct net_device *net_dev)
sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC); sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC);
/* load Receive Descriptor Register */ /* load Receive Descriptor Register */
outl(sis_priv->rx_ring_dma, ioaddr + rxdp); sw32(rxdp, sis_priv->rx_ring_dma);
if (netif_msg_hw(sis_priv)) if (netif_msg_hw(sis_priv))
printk(KERN_DEBUG "%s: RX descriptor register loaded with: %8.8x\n", printk(KERN_DEBUG "%s: RX descriptor register loaded with: %8.8x\n",
net_dev->name, inl(ioaddr + rxdp)); net_dev->name, sr32(rxdp));
} }
/** /**
@ -1298,7 +1321,7 @@ static void sis900_timer(unsigned long data)
sis900_read_mode(net_dev, &speed, &duplex); sis900_read_mode(net_dev, &speed, &duplex);
if (duplex){ if (duplex){
sis900_set_mode(net_dev->base_addr, speed, duplex); sis900_set_mode(sis_priv, speed, duplex);
sis630_set_eq(net_dev, sis_priv->chipset_rev); sis630_set_eq(net_dev, sis_priv->chipset_rev);
netif_start_queue(net_dev); netif_start_queue(net_dev);
} }
@ -1359,25 +1382,25 @@ static void sis900_timer(unsigned long data)
static void sis900_check_mode(struct net_device *net_dev, struct mii_phy *mii_phy) static void sis900_check_mode(struct net_device *net_dev, struct mii_phy *mii_phy)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
int speed, duplex; int speed, duplex;
if (mii_phy->phy_types == LAN) { if (mii_phy->phy_types == LAN) {
outl(~EXD & inl(ioaddr + cfg), ioaddr + cfg); sw32(cfg, ~EXD & sr32(cfg));
sis900_set_capability(net_dev , mii_phy); sis900_set_capability(net_dev , mii_phy);
sis900_auto_negotiate(net_dev, sis_priv->cur_phy); sis900_auto_negotiate(net_dev, sis_priv->cur_phy);
} else { } else {
outl(EXD | inl(ioaddr + cfg), ioaddr + cfg); sw32(cfg, EXD | sr32(cfg));
speed = HW_SPEED_HOME; speed = HW_SPEED_HOME;
duplex = FDX_CAPABLE_HALF_SELECTED; duplex = FDX_CAPABLE_HALF_SELECTED;
sis900_set_mode(ioaddr, speed, duplex); sis900_set_mode(sis_priv, speed, duplex);
sis_priv->autong_complete = 1; sis_priv->autong_complete = 1;
} }
} }
/** /**
* sis900_set_mode - Set the media mode of mac register. * sis900_set_mode - Set the media mode of mac register.
* @ioaddr: the address of the device * @sp: the device private data
* @speed : the transmit speed to be determined * @speed : the transmit speed to be determined
* @duplex: the duplex mode to be determined * @duplex: the duplex mode to be determined
* *
@ -1388,11 +1411,12 @@ static void sis900_check_mode(struct net_device *net_dev, struct mii_phy *mii_ph
* double words. * double words.
*/ */
static void sis900_set_mode (long ioaddr, int speed, int duplex) static void sis900_set_mode(struct sis900_private *sp, int speed, int duplex)
{ {
void __iomem *ioaddr = sp->ioaddr;
u32 tx_flags = 0, rx_flags = 0; u32 tx_flags = 0, rx_flags = 0;
if (inl(ioaddr + cfg) & EDB_MASTER_EN) { if (sr32( cfg) & EDB_MASTER_EN) {
tx_flags = TxATP | (DMA_BURST_64 << TxMXDMA_shift) | tx_flags = TxATP | (DMA_BURST_64 << TxMXDMA_shift) |
(TX_FILL_THRESH << TxFILLT_shift); (TX_FILL_THRESH << TxFILLT_shift);
rx_flags = DMA_BURST_64 << RxMXDMA_shift; rx_flags = DMA_BURST_64 << RxMXDMA_shift;
@ -1420,8 +1444,8 @@ static void sis900_set_mode (long ioaddr, int speed, int duplex)
rx_flags |= RxAJAB; rx_flags |= RxAJAB;
#endif #endif
outl (tx_flags, ioaddr + txcfg); sw32(txcfg, tx_flags);
outl (rx_flags, ioaddr + rxcfg); sw32(rxcfg, rx_flags);
} }
/** /**
@ -1528,16 +1552,17 @@ static void sis900_read_mode(struct net_device *net_dev, int *speed, int *duplex
static void sis900_tx_timeout(struct net_device *net_dev) static void sis900_tx_timeout(struct net_device *net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
unsigned long flags; unsigned long flags;
int i; int i;
if(netif_msg_tx_err(sis_priv)) if (netif_msg_tx_err(sis_priv)) {
printk(KERN_INFO "%s: Transmit timeout, status %8.8x %8.8x\n", printk(KERN_INFO "%s: Transmit timeout, status %8.8x %8.8x\n",
net_dev->name, inl(ioaddr + cr), inl(ioaddr + isr)); net_dev->name, sr32(cr), sr32(isr));
}
/* Disable interrupts by clearing the interrupt mask. */ /* Disable interrupts by clearing the interrupt mask. */
outl(0x0000, ioaddr + imr); sw32(imr, 0x0000);
/* use spinlock to prevent interrupt handler accessing buffer ring */ /* use spinlock to prevent interrupt handler accessing buffer ring */
spin_lock_irqsave(&sis_priv->lock, flags); spin_lock_irqsave(&sis_priv->lock, flags);
@ -1566,10 +1591,10 @@ static void sis900_tx_timeout(struct net_device *net_dev)
net_dev->trans_start = jiffies; /* prevent tx timeout */ net_dev->trans_start = jiffies; /* prevent tx timeout */
/* load Transmit Descriptor Register */ /* load Transmit Descriptor Register */
outl(sis_priv->tx_ring_dma, ioaddr + txdp); sw32(txdp, sis_priv->tx_ring_dma);
/* Enable all known interrupts by setting the interrupt mask. */ /* Enable all known interrupts by setting the interrupt mask. */
outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr); sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
} }
/** /**
@ -1586,7 +1611,7 @@ static netdev_tx_t
sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev) sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
unsigned int entry; unsigned int entry;
unsigned long flags; unsigned long flags;
unsigned int index_cur_tx, index_dirty_tx; unsigned int index_cur_tx, index_dirty_tx;
@ -1608,7 +1633,7 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
sis_priv->tx_ring[entry].bufptr = pci_map_single(sis_priv->pci_dev, sis_priv->tx_ring[entry].bufptr = pci_map_single(sis_priv->pci_dev,
skb->data, skb->len, PCI_DMA_TODEVICE); skb->data, skb->len, PCI_DMA_TODEVICE);
sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len); sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len);
outl(TxENA | inl(ioaddr + cr), ioaddr + cr); sw32(cr, TxENA | sr32(cr));
sis_priv->cur_tx ++; sis_priv->cur_tx ++;
index_cur_tx = sis_priv->cur_tx; index_cur_tx = sis_priv->cur_tx;
@ -1654,14 +1679,14 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
struct net_device *net_dev = dev_instance; struct net_device *net_dev = dev_instance;
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
int boguscnt = max_interrupt_work; int boguscnt = max_interrupt_work;
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
u32 status; u32 status;
unsigned int handled = 0; unsigned int handled = 0;
spin_lock (&sis_priv->lock); spin_lock (&sis_priv->lock);
do { do {
status = inl(ioaddr + isr); status = sr32(isr);
if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0) if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0)
/* nothing intresting happened */ /* nothing intresting happened */
@ -1696,7 +1721,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
if(netif_msg_intr(sis_priv)) if(netif_msg_intr(sis_priv))
printk(KERN_DEBUG "%s: exiting interrupt, " printk(KERN_DEBUG "%s: exiting interrupt, "
"interrupt status = 0x%#8.8x.\n", "interrupt status = 0x%#8.8x.\n",
net_dev->name, inl(ioaddr + isr)); net_dev->name, sr32(isr));
spin_unlock (&sis_priv->lock); spin_unlock (&sis_priv->lock);
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);
@ -1715,7 +1740,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
static int sis900_rx(struct net_device *net_dev) static int sis900_rx(struct net_device *net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
unsigned int entry = sis_priv->cur_rx % NUM_RX_DESC; unsigned int entry = sis_priv->cur_rx % NUM_RX_DESC;
u32 rx_status = sis_priv->rx_ring[entry].cmdsts; u32 rx_status = sis_priv->rx_ring[entry].cmdsts;
int rx_work_limit; int rx_work_limit;
@ -1847,7 +1872,7 @@ refill_rx_ring:
} }
} }
/* re-enable the potentially idle receive state matchine */ /* re-enable the potentially idle receive state matchine */
outl(RxENA | inl(ioaddr + cr), ioaddr + cr ); sw32(cr , RxENA | sr32(cr));
return 0; return 0;
} }
@ -1932,31 +1957,31 @@ static void sis900_finish_xmit (struct net_device *net_dev)
static int sis900_close(struct net_device *net_dev) static int sis900_close(struct net_device *net_dev)
{ {
long ioaddr = net_dev->base_addr;
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
struct pci_dev *pdev = sis_priv->pci_dev;
void __iomem *ioaddr = sis_priv->ioaddr;
struct sk_buff *skb; struct sk_buff *skb;
int i; int i;
netif_stop_queue(net_dev); netif_stop_queue(net_dev);
/* Disable interrupts by clearing the interrupt mask. */ /* Disable interrupts by clearing the interrupt mask. */
outl(0x0000, ioaddr + imr); sw32(imr, 0x0000);
outl(0x0000, ioaddr + ier); sw32(ier, 0x0000);
/* Stop the chip's Tx and Rx Status Machine */ /* Stop the chip's Tx and Rx Status Machine */
outl(RxDIS | TxDIS | inl(ioaddr + cr), ioaddr + cr); sw32(cr, RxDIS | TxDIS | sr32(cr));
del_timer(&sis_priv->timer); del_timer(&sis_priv->timer);
free_irq(net_dev->irq, net_dev); free_irq(pdev->irq, net_dev);
/* Free Tx and RX skbuff */ /* Free Tx and RX skbuff */
for (i = 0; i < NUM_RX_DESC; i++) { for (i = 0; i < NUM_RX_DESC; i++) {
skb = sis_priv->rx_skbuff[i]; skb = sis_priv->rx_skbuff[i];
if (skb) { if (skb) {
pci_unmap_single(sis_priv->pci_dev, pci_unmap_single(pdev, sis_priv->rx_ring[i].bufptr,
sis_priv->rx_ring[i].bufptr, RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
dev_kfree_skb(skb); dev_kfree_skb(skb);
sis_priv->rx_skbuff[i] = NULL; sis_priv->rx_skbuff[i] = NULL;
} }
@ -1964,9 +1989,8 @@ static int sis900_close(struct net_device *net_dev)
for (i = 0; i < NUM_TX_DESC; i++) { for (i = 0; i < NUM_TX_DESC; i++) {
skb = sis_priv->tx_skbuff[i]; skb = sis_priv->tx_skbuff[i];
if (skb) { if (skb) {
pci_unmap_single(sis_priv->pci_dev, pci_unmap_single(pdev, sis_priv->tx_ring[i].bufptr,
sis_priv->tx_ring[i].bufptr, skb->len, skb->len, PCI_DMA_TODEVICE);
PCI_DMA_TODEVICE);
dev_kfree_skb(skb); dev_kfree_skb(skb);
sis_priv->tx_skbuff[i] = NULL; sis_priv->tx_skbuff[i] = NULL;
} }
@ -2055,14 +2079,14 @@ static int sis900_nway_reset(struct net_device *net_dev)
static int sis900_set_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol) static int sis900_set_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long pmctrl_addr = net_dev->base_addr + pmctrl; void __iomem *ioaddr = sis_priv->ioaddr;
u32 cfgpmcsr = 0, pmctrl_bits = 0; u32 cfgpmcsr = 0, pmctrl_bits = 0;
if (wol->wolopts == 0) { if (wol->wolopts == 0) {
pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr); pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr);
cfgpmcsr &= ~PME_EN; cfgpmcsr &= ~PME_EN;
pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr); pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr);
outl(pmctrl_bits, pmctrl_addr); sw32(pmctrl, pmctrl_bits);
if (netif_msg_wol(sis_priv)) if (netif_msg_wol(sis_priv))
printk(KERN_DEBUG "%s: Wake on LAN disabled\n", net_dev->name); printk(KERN_DEBUG "%s: Wake on LAN disabled\n", net_dev->name);
return 0; return 0;
@ -2077,7 +2101,7 @@ static int sis900_set_wol(struct net_device *net_dev, struct ethtool_wolinfo *wo
if (wol->wolopts & WAKE_PHY) if (wol->wolopts & WAKE_PHY)
pmctrl_bits |= LINKON; pmctrl_bits |= LINKON;
outl(pmctrl_bits, pmctrl_addr); sw32(pmctrl, pmctrl_bits);
pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr); pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr);
cfgpmcsr |= PME_EN; cfgpmcsr |= PME_EN;
@ -2090,10 +2114,11 @@ static int sis900_set_wol(struct net_device *net_dev, struct ethtool_wolinfo *wo
static void sis900_get_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol) static void sis900_get_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol)
{ {
long pmctrl_addr = net_dev->base_addr + pmctrl; struct sis900_private *sp = netdev_priv(net_dev);
void __iomem *ioaddr = sp->ioaddr;
u32 pmctrl_bits; u32 pmctrl_bits;
pmctrl_bits = inl(pmctrl_addr); pmctrl_bits = sr32(pmctrl);
if (pmctrl_bits & MAGICPKT) if (pmctrl_bits & MAGICPKT)
wol->wolopts |= WAKE_MAGIC; wol->wolopts |= WAKE_MAGIC;
if (pmctrl_bits & LINKON) if (pmctrl_bits & LINKON)
@ -2279,8 +2304,8 @@ static inline u16 sis900_mcast_bitnr(u8 *addr, u8 revision)
static void set_rx_mode(struct net_device *net_dev) static void set_rx_mode(struct net_device *net_dev)
{ {
long ioaddr = net_dev->base_addr;
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
void __iomem *ioaddr = sis_priv->ioaddr;
u16 mc_filter[16] = {0}; /* 256/128 bits multicast hash table */ u16 mc_filter[16] = {0}; /* 256/128 bits multicast hash table */
int i, table_entries; int i, table_entries;
u32 rx_mode; u32 rx_mode;
@ -2322,24 +2347,24 @@ static void set_rx_mode(struct net_device *net_dev)
/* update Multicast Hash Table in Receive Filter */ /* update Multicast Hash Table in Receive Filter */
for (i = 0; i < table_entries; i++) { for (i = 0; i < table_entries; i++) {
/* why plus 0x04 ??, That makes the correct value for hash table. */ /* why plus 0x04 ??, That makes the correct value for hash table. */
outl((u32)(0x00000004+i) << RFADDR_shift, ioaddr + rfcr); sw32(rfcr, (u32)(0x00000004 + i) << RFADDR_shift);
outl(mc_filter[i], ioaddr + rfdr); sw32(rfdr, mc_filter[i]);
} }
outl(RFEN | rx_mode, ioaddr + rfcr); sw32(rfcr, RFEN | rx_mode);
/* sis900 is capable of looping back packets at MAC level for /* sis900 is capable of looping back packets at MAC level for
* debugging purpose */ * debugging purpose */
if (net_dev->flags & IFF_LOOPBACK) { if (net_dev->flags & IFF_LOOPBACK) {
u32 cr_saved; u32 cr_saved;
/* We must disable Tx/Rx before setting loopback mode */ /* We must disable Tx/Rx before setting loopback mode */
cr_saved = inl(ioaddr + cr); cr_saved = sr32(cr);
outl(cr_saved | TxDIS | RxDIS, ioaddr + cr); sw32(cr, cr_saved | TxDIS | RxDIS);
/* enable loopback */ /* enable loopback */
outl(inl(ioaddr + txcfg) | TxMLB, ioaddr + txcfg); sw32(txcfg, sr32(txcfg) | TxMLB);
outl(inl(ioaddr + rxcfg) | RxATX, ioaddr + rxcfg); sw32(rxcfg, sr32(rxcfg) | RxATX);
/* restore cr */ /* restore cr */
outl(cr_saved, ioaddr + cr); sw32(cr, cr_saved);
} }
} }
@ -2355,26 +2380,25 @@ static void set_rx_mode(struct net_device *net_dev)
static void sis900_reset(struct net_device *net_dev) static void sis900_reset(struct net_device *net_dev)
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
int i = 0;
u32 status = TxRCMP | RxRCMP; u32 status = TxRCMP | RxRCMP;
int i;
outl(0, ioaddr + ier); sw32(ier, 0);
outl(0, ioaddr + imr); sw32(imr, 0);
outl(0, ioaddr + rfcr); sw32(rfcr, 0);
outl(RxRESET | TxRESET | RESET | inl(ioaddr + cr), ioaddr + cr); sw32(cr, RxRESET | TxRESET | RESET | sr32(cr));
/* Check that the chip has finished the reset. */ /* Check that the chip has finished the reset. */
while (status && (i++ < 1000)) { for (i = 0; status && (i < 1000); i++)
status ^= (inl(isr + ioaddr) & status); status ^= sr32(isr) & status;
}
if( (sis_priv->chipset_rev >= SIS635A_900_REV) || if (sis_priv->chipset_rev >= SIS635A_900_REV ||
(sis_priv->chipset_rev == SIS900B_900_REV) ) sis_priv->chipset_rev == SIS900B_900_REV)
outl(PESEL | RND_CNT, ioaddr + cfg); sw32(cfg, PESEL | RND_CNT);
else else
outl(PESEL, ioaddr + cfg); sw32(cfg, PESEL);
} }
/** /**
@ -2388,10 +2412,12 @@ static void __devexit sis900_remove(struct pci_dev *pci_dev)
{ {
struct net_device *net_dev = pci_get_drvdata(pci_dev); struct net_device *net_dev = pci_get_drvdata(pci_dev);
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
struct mii_phy *phy = NULL;
unregister_netdev(net_dev);
while (sis_priv->first_mii) { while (sis_priv->first_mii) {
phy = sis_priv->first_mii; struct mii_phy *phy = sis_priv->first_mii;
sis_priv->first_mii = phy->next; sis_priv->first_mii = phy->next;
kfree(phy); kfree(phy);
} }
@ -2400,7 +2426,7 @@ static void __devexit sis900_remove(struct pci_dev *pci_dev)
sis_priv->rx_ring_dma); sis_priv->rx_ring_dma);
pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring, pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring,
sis_priv->tx_ring_dma); sis_priv->tx_ring_dma);
unregister_netdev(net_dev); pci_iounmap(pci_dev, sis_priv->ioaddr);
free_netdev(net_dev); free_netdev(net_dev);
pci_release_regions(pci_dev); pci_release_regions(pci_dev);
pci_set_drvdata(pci_dev, NULL); pci_set_drvdata(pci_dev, NULL);
@ -2411,7 +2437,8 @@ static void __devexit sis900_remove(struct pci_dev *pci_dev)
static int sis900_suspend(struct pci_dev *pci_dev, pm_message_t state) static int sis900_suspend(struct pci_dev *pci_dev, pm_message_t state)
{ {
struct net_device *net_dev = pci_get_drvdata(pci_dev); struct net_device *net_dev = pci_get_drvdata(pci_dev);
long ioaddr = net_dev->base_addr; struct sis900_private *sis_priv = netdev_priv(net_dev);
void __iomem *ioaddr = sis_priv->ioaddr;
if(!netif_running(net_dev)) if(!netif_running(net_dev))
return 0; return 0;
@ -2420,7 +2447,7 @@ static int sis900_suspend(struct pci_dev *pci_dev, pm_message_t state)
netif_device_detach(net_dev); netif_device_detach(net_dev);
/* Stop the chip's Tx and Rx Status Machine */ /* Stop the chip's Tx and Rx Status Machine */
outl(RxDIS | TxDIS | inl(ioaddr + cr), ioaddr + cr); sw32(cr, RxDIS | TxDIS | sr32(cr));
pci_set_power_state(pci_dev, PCI_D3hot); pci_set_power_state(pci_dev, PCI_D3hot);
pci_save_state(pci_dev); pci_save_state(pci_dev);
@ -2432,7 +2459,7 @@ static int sis900_resume(struct pci_dev *pci_dev)
{ {
struct net_device *net_dev = pci_get_drvdata(pci_dev); struct net_device *net_dev = pci_get_drvdata(pci_dev);
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
long ioaddr = net_dev->base_addr; void __iomem *ioaddr = sis_priv->ioaddr;
if(!netif_running(net_dev)) if(!netif_running(net_dev))
return 0; return 0;
@ -2453,9 +2480,9 @@ static int sis900_resume(struct pci_dev *pci_dev)
sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
/* Enable all known interrupts by setting the interrupt mask. */ /* Enable all known interrupts by setting the interrupt mask. */
outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr); sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
outl(RxENA | inl(ioaddr + cr), ioaddr + cr); sw32(cr, RxENA | sr32(cr));
outl(IE, ioaddr + ier); sw32(ier, IE);
sis900_check_mode(net_dev, sis_priv->mii); sis900_check_mode(net_dev, sis_priv->mii);