|
@@ -168,6 +168,8 @@ struct sis900_private {
|
|
|
unsigned int cur_phy;
|
|
|
struct mii_if_info mii_info;
|
|
|
|
|
|
+ void __iomem *ioaddr;
|
|
|
+
|
|
|
struct timer_list timer; /* Link status detection timer. */
|
|
|
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(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
|
|
|
static void sis900_poll(struct net_device *dev);
|
|
|
#endif
|
|
|
static int sis900_open(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 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 void mdio_write(struct net_device *net_dev, int phy_id, int location, int val);
|
|
|
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 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_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;
|
|
|
|
|
|
/**
|
|
@@ -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)
|
|
|
{
|
|
|
- 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;
|
|
|
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,
|
|
|
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 i;
|
|
|
|
|
|
- rfcrSave = inl(rfcr + ioaddr);
|
|
|
+ rfcrSave = sr32(rfcr);
|
|
|
|
|
|
- outl(rfcrSave | RELOAD, ioaddr + cr);
|
|
|
- outl(0, ioaddr + cr);
|
|
|
+ sw32(cr, rfcrSave | RELOAD);
|
|
|
+ sw32(cr, 0);
|
|
|
|
|
|
/* disable packet filtering before setting filter */
|
|
|
- outl(rfcrSave & ~RFEN, rfcr + ioaddr);
|
|
|
+ sw32(rfcr, rfcrSave & ~RFEN);
|
|
|
|
|
|
/* load MAC addr to filter data register */
|
|
|
for (i = 0 ; i < 3 ; i++) {
|
|
|
- outl((i << RFADDR_shift), ioaddr + rfcr);
|
|
|
- *( ((u16 *)net_dev->dev_addr) + i) = inw(ioaddr + rfdr);
|
|
|
+ sw32(rfcr, (i << RFADDR_shift));
|
|
|
+ *( ((u16 *)net_dev->dev_addr) + i) = sr16(rfdr);
|
|
|
}
|
|
|
|
|
|
/* Store MAC Address in perm_addr */
|
|
|
memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
|
|
|
|
|
|
/* enable packet filtering */
|
|
|
- outl(rfcrSave | RFEN, rfcr + ioaddr);
|
|
|
+ sw32(rfcr, rfcrSave | RFEN);
|
|
|
|
|
|
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,
|
|
|
struct net_device *net_dev)
|
|
|
{
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
- long ee_addr = ioaddr + mear;
|
|
|
- u32 waittime = 0;
|
|
|
- int i;
|
|
|
+ struct sis900_private *sis_priv = netdev_priv(net_dev);
|
|
|
+ void __iomem *ioaddr = sis_priv->ioaddr;
|
|
|
+ int wait, rc = 0;
|
|
|
|
|
|
- outl(EEREQ, ee_addr);
|
|
|
- while(waittime < 2000) {
|
|
|
- if(inl(ee_addr) & EEGNT) {
|
|
|
+ sw32(mear, EEREQ);
|
|
|
+ for (wait = 0; wait < 2000; wait++) {
|
|
|
+ if (sr32(mear) & EEGNT) {
|
|
|
+ u16 *mac = (u16 *)net_dev->dev_addr;
|
|
|
+ int i;
|
|
|
|
|
|
/* get MAC address from EEPROM */
|
|
|
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 */
|
|
|
memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
|
|
|
|
|
|
- outl(EEDONE, ee_addr);
|
|
|
- return 1;
|
|
|
- } else {
|
|
|
- udelay(1);
|
|
|
- waittime ++;
|
|
|
+ rc = 1;
|
|
|
+ break;
|
|
|
}
|
|
|
+ udelay(1);
|
|
|
}
|
|
|
- outl(EEDONE, ee_addr);
|
|
|
- return 0;
|
|
|
+ sw32(mear, EEDONE);
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
dma_addr_t ring_dma;
|
|
|
void *ring_space;
|
|
|
- long ioaddr;
|
|
|
+ void __iomem *ioaddr;
|
|
|
int i, ret;
|
|
|
const char *card_name = card_names[pci_id->driver_data];
|
|
|
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);
|
|
|
|
|
|
/* We do a request_region() to register /proc/ioports info. */
|
|
|
- ioaddr = pci_resource_start(pci_dev, 0);
|
|
|
ret = pci_request_regions(pci_dev, "sis900");
|
|
|
if (ret)
|
|
|
goto err_out;
|
|
|
|
|
|
+ /* IO region. */
|
|
|
+ ioaddr = pci_iomap(pci_dev, 0, 0);
|
|
|
+ if (!ioaddr)
|
|
|
+ goto err_out_cleardev;
|
|
|
+
|
|
|
sis_priv = netdev_priv(net_dev);
|
|
|
- net_dev->base_addr = ioaddr;
|
|
|
- net_dev->irq = pci_dev->irq;
|
|
|
+ sis_priv->ioaddr = ioaddr;
|
|
|
sis_priv->pci_dev = pci_dev;
|
|
|
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);
|
|
|
if (!ring_space) {
|
|
|
ret = -ENOMEM;
|
|
|
- goto err_out_cleardev;
|
|
|
+ goto err_out_unmap;
|
|
|
}
|
|
|
sis_priv->tx_ring = ring_space;
|
|
|
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 */
|
|
|
if (sis_priv->chipset_rev == SIS630ET_900_REV)
|
|
|
- outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr);
|
|
|
+ sw32(cr, ACCESSMODE | sr32(cr));
|
|
|
|
|
|
/* probe for mii transceiver */
|
|
|
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;
|
|
|
|
|
|
/* print some information about our NIC */
|
|
|
- printk(KERN_INFO "%s: %s at %#lx, IRQ %d, %pM\n",
|
|
|
- net_dev->name, card_name, ioaddr, net_dev->irq,
|
|
|
+ printk(KERN_INFO "%s: %s at 0x%p, IRQ %d, %pM\n",
|
|
|
+ net_dev->name, card_name, ioaddr, pci_dev->irq,
|
|
|
net_dev->dev_addr);
|
|
|
|
|
|
/* 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)
|
|
|
printk(KERN_INFO "%s: Wake on LAN only available from suspend to RAM.", net_dev->name);
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
- err_unmap_rx:
|
|
|
+err_unmap_rx:
|
|
|
pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring,
|
|
|
sis_priv->rx_ring_dma);
|
|
|
- err_unmap_tx:
|
|
|
+err_unmap_tx:
|
|
|
pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring,
|
|
|
sis_priv->tx_ring_dma);
|
|
|
- err_out_cleardev:
|
|
|
- pci_set_drvdata(pci_dev, NULL);
|
|
|
+err_out_unmap:
|
|
|
+ pci_iounmap(pci_dev, ioaddr);
|
|
|
+err_out_cleardev:
|
|
|
+ pci_set_drvdata(pci_dev, NULL);
|
|
|
pci_release_regions(pci_dev);
|
|
|
err_out:
|
|
|
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. */
|
|
|
-#define eeprom_delay() inl(ee_addr)
|
|
|
+#define eeprom_delay() sr32(mear)
|
|
|
|
|
|
/**
|
|
|
* 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
|
|
|
*/
|
|
|
|
|
|
-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;
|
|
|
u16 retval = 0;
|
|
|
- long ee_addr = ioaddr + mear;
|
|
|
- u32 read_cmd = location | EEread;
|
|
|
|
|
|
- outl(0, ee_addr);
|
|
|
+ sw32(mear, 0);
|
|
|
eeprom_delay();
|
|
|
- outl(EECS, ee_addr);
|
|
|
+ sw32(mear, EECS);
|
|
|
eeprom_delay();
|
|
|
|
|
|
/* Shift the read command (9) bits out. */
|
|
|
for (i = 8; i >= 0; i--) {
|
|
|
u32 dataval = (read_cmd & (1 << i)) ? EEDI | EECS : EECS;
|
|
|
- outl(dataval, ee_addr);
|
|
|
+
|
|
|
+ sw32(mear, dataval);
|
|
|
eeprom_delay();
|
|
|
- outl(dataval | EECLK, ee_addr);
|
|
|
+ sw32(mear, dataval | EECLK);
|
|
|
eeprom_delay();
|
|
|
}
|
|
|
- outl(EECS, ee_addr);
|
|
|
+ sw32(mear, EECS);
|
|
|
eeprom_delay();
|
|
|
|
|
|
/* read the 16-bits data in */
|
|
|
for (i = 16; i > 0; i--) {
|
|
|
- outl(EECS, ee_addr);
|
|
|
+ sw32(mear, EECS);
|
|
|
eeprom_delay();
|
|
|
- outl(EECS | EECLK, ee_addr);
|
|
|
+ sw32(mear, EECS | EECLK);
|
|
|
eeprom_delay();
|
|
|
- retval = (retval << 1) | ((inl(ee_addr) & EEDO) ? 1 : 0);
|
|
|
+ retval = (retval << 1) | ((sr32(mear) & EEDO) ? 1 : 0);
|
|
|
eeprom_delay();
|
|
|
}
|
|
|
|
|
|
/* Terminate the EEPROM access. */
|
|
|
- outl(0, ee_addr);
|
|
|
+ sw32(mear, 0);
|
|
|
eeprom_delay();
|
|
|
|
|
|
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
|
|
|
serial MDIO protocol. Note that the command bits and data bits are
|
|
|
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();
|
|
|
- outl(MDIO | MDDIR | MDC, mdio_addr);
|
|
|
+ sw32(mear, MDIO | MDDIR | MDC);
|
|
|
}
|
|
|
|
|
|
-/* Syncronize the MII management interface by shifting 32 one bits out. */
|
|
|
-static void mdio_reset(long mdio_addr)
|
|
|
+/* Synchronize the MII management interface by shifting 32 one bits out. */
|
|
|
+static void mdio_reset(struct sis900_private *sp)
|
|
|
{
|
|
|
+ void __iomem *ioaddr = sp->ioaddr;
|
|
|
int i;
|
|
|
|
|
|
for (i = 31; i >= 0; i--) {
|
|
|
- outl(MDDIR | MDIO, mdio_addr);
|
|
|
+ sw32(mear, MDDIR | MDIO);
|
|
|
mdio_delay();
|
|
|
- outl(MDDIR | MDIO | MDC, mdio_addr);
|
|
|
+ sw32(mear, MDDIR | MDIO | MDC);
|
|
|
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)
|
|
|
{
|
|
|
- long mdio_addr = net_dev->base_addr + mear;
|
|
|
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;
|
|
|
int i;
|
|
|
|
|
|
- mdio_reset(mdio_addr);
|
|
|
- mdio_idle(mdio_addr);
|
|
|
+ mdio_reset(sp);
|
|
|
+ mdio_idle(sp);
|
|
|
|
|
|
for (i = 15; i >= 0; i--) {
|
|
|
int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR;
|
|
|
- outl(dataval, mdio_addr);
|
|
|
+
|
|
|
+ sw32(mear, dataval);
|
|
|
mdio_delay();
|
|
|
- outl(dataval | MDC, mdio_addr);
|
|
|
+ sw32(mear, dataval | MDC);
|
|
|
mdio_delay();
|
|
|
}
|
|
|
|
|
|
/* Read the 16 data bits. */
|
|
|
for (i = 16; i > 0; i--) {
|
|
|
- outl(0, mdio_addr);
|
|
|
+ sw32(mear, 0);
|
|
|
mdio_delay();
|
|
|
- retval = (retval << 1) | ((inl(mdio_addr) & MDIO) ? 1 : 0);
|
|
|
- outl(MDC, mdio_addr);
|
|
|
+ retval = (retval << 1) | ((sr32(mear) & MDIO) ? 1 : 0);
|
|
|
+ sw32(mear, MDC);
|
|
|
mdio_delay();
|
|
|
}
|
|
|
- outl(0x00, mdio_addr);
|
|
|
+ sw32(mear, 0x00);
|
|
|
|
|
|
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,
|
|
|
int value)
|
|
|
{
|
|
|
- long mdio_addr = net_dev->base_addr + mear;
|
|
|
int mii_cmd = MIIwrite|(phy_id<<MIIpmdShift)|(location<<MIIregShift);
|
|
|
+ struct sis900_private *sp = netdev_priv(net_dev);
|
|
|
+ void __iomem *ioaddr = sp->ioaddr;
|
|
|
int i;
|
|
|
|
|
|
- mdio_reset(mdio_addr);
|
|
|
- mdio_idle(mdio_addr);
|
|
|
+ mdio_reset(sp);
|
|
|
+ mdio_idle(sp);
|
|
|
|
|
|
/* Shift the command bits out. */
|
|
|
for (i = 15; i >= 0; i--) {
|
|
|
int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR;
|
|
|
- outb(dataval, mdio_addr);
|
|
|
+
|
|
|
+ sw8(mear, dataval);
|
|
|
mdio_delay();
|
|
|
- outb(dataval | MDC, mdio_addr);
|
|
|
+ sw8(mear, dataval | MDC);
|
|
|
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. */
|
|
|
for (i = 15; i >= 0; i--) {
|
|
|
int dataval = (value & (1 << i)) ? MDDIR | MDIO : MDDIR;
|
|
|
- outl(dataval, mdio_addr);
|
|
|
+
|
|
|
+ sw32(mear, dataval);
|
|
|
mdio_delay();
|
|
|
- outl(dataval | MDC, mdio_addr);
|
|
|
+ sw32(mear, dataval | MDC);
|
|
|
mdio_delay();
|
|
|
}
|
|
|
mdio_delay();
|
|
|
|
|
|
/* Clear out extra bits. */
|
|
|
for (i = 2; i > 0; i--) {
|
|
|
- outb(0, mdio_addr);
|
|
|
+ sw8(mear, 0);
|
|
|
mdio_delay();
|
|
|
- outb(MDC, mdio_addr);
|
|
|
+ sw8(mear, MDC);
|
|
|
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)
|
|
|
{
|
|
|
- disable_irq(dev->irq);
|
|
|
- sis900_interrupt(dev->irq, dev);
|
|
|
- enable_irq(dev->irq);
|
|
|
+ struct sis900_private *sp = netdev_priv(dev);
|
|
|
+ const int irq = sp->pci_dev->irq;
|
|
|
+
|
|
|
+ disable_irq(irq);
|
|
|
+ sis900_interrupt(irq, dev);
|
|
|
+ enable_irq(irq);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -1018,7 +1042,7 @@ static int
|
|
|
sis900_open(struct net_device *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;
|
|
|
|
|
|
/* Soft reset the chip. */
|
|
@@ -1027,8 +1051,8 @@ sis900_open(struct net_device *net_dev)
|
|
|
/* Equalizer workaround Rule */
|
|
|
sis630_set_eq(net_dev, sis_priv->chipset_rev);
|
|
|
|
|
|
- ret = request_irq(net_dev->irq, sis900_interrupt, IRQF_SHARED,
|
|
|
- net_dev->name, net_dev);
|
|
|
+ ret = request_irq(sis_priv->pci_dev->irq, sis900_interrupt, IRQF_SHARED,
|
|
|
+ net_dev->name, net_dev);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -1042,12 +1066,12 @@ sis900_open(struct net_device *net_dev)
|
|
|
netif_start_queue(net_dev);
|
|
|
|
|
|
/* 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. */
|
|
|
- outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr);
|
|
|
- outl(RxENA | inl(ioaddr + cr), ioaddr + cr);
|
|
|
- outl(IE, ioaddr + ier);
|
|
|
+ sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
|
|
|
+ sw32(cr, RxENA | sr32(cr));
|
|
|
+ sw32(ier, IE);
|
|
|
|
|
|
sis900_check_mode(net_dev, sis_priv->mii);
|
|
|
|
|
@@ -1074,31 +1098,30 @@ static void
|
|
|
sis900_init_rxfilter (struct net_device * 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 i;
|
|
|
|
|
|
- rfcrSave = inl(rfcr + ioaddr);
|
|
|
+ rfcrSave = sr32(rfcr);
|
|
|
|
|
|
/* disable packet filtering before setting filter */
|
|
|
- outl(rfcrSave & ~RFEN, rfcr + ioaddr);
|
|
|
+ sw32(rfcr, rfcrSave & ~RFEN);
|
|
|
|
|
|
/* load MAC addr to filter data register */
|
|
|
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);
|
|
|
- outl((i << RFADDR_shift), ioaddr + rfcr);
|
|
|
- outl(w, ioaddr + rfdr);
|
|
|
+ sw32(rfcr, i << RFADDR_shift);
|
|
|
+ sw32(rfdr, w);
|
|
|
|
|
|
if (netif_msg_hw(sis_priv)) {
|
|
|
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 */
|
|
|
- outl(rfcrSave | RFEN, rfcr + ioaddr);
|
|
|
+ sw32(rfcr, rfcrSave | RFEN);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1112,7 +1135,7 @@ static void
|
|
|
sis900_init_tx_ring(struct net_device *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;
|
|
|
|
|
|
sis_priv->tx_full = 0;
|
|
@@ -1128,10 +1151,10 @@ sis900_init_tx_ring(struct net_device *net_dev)
|
|
|
}
|
|
|
|
|
|
/* 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))
|
|
|
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)
|
|
|
{
|
|
|
struct sis900_private *sis_priv = netdev_priv(net_dev);
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
+ void __iomem *ioaddr = sis_priv->ioaddr;
|
|
|
int i;
|
|
|
|
|
|
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);
|
|
|
|
|
|
/* 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))
|
|
|
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);
|
|
|
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);
|
|
|
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)
|
|
|
{
|
|
|
struct sis900_private *sis_priv = netdev_priv(net_dev);
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
+ void __iomem *ioaddr = sis_priv->ioaddr;
|
|
|
int speed, duplex;
|
|
|
|
|
|
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_auto_negotiate(net_dev, sis_priv->cur_phy);
|
|
|
} else {
|
|
|
- outl(EXD | inl(ioaddr + cfg), ioaddr + cfg);
|
|
|
+ sw32(cfg, EXD | sr32(cfg));
|
|
|
speed = HW_SPEED_HOME;
|
|
|
duplex = FDX_CAPABLE_HALF_SELECTED;
|
|
|
- sis900_set_mode(ioaddr, speed, duplex);
|
|
|
+ sis900_set_mode(sis_priv, speed, duplex);
|
|
|
sis_priv->autong_complete = 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 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
|
|
|
* @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.
|
|
|
*/
|
|
|
|
|
|
-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;
|
|
|
|
|
|
- if (inl(ioaddr + cfg) & EDB_MASTER_EN) {
|
|
|
+ if (sr32( cfg) & EDB_MASTER_EN) {
|
|
|
tx_flags = TxATP | (DMA_BURST_64 << TxMXDMA_shift) |
|
|
|
(TX_FILL_THRESH << TxFILLT_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;
|
|
|
#endif
|
|
|
|
|
|
- outl (tx_flags, ioaddr + txcfg);
|
|
|
- outl (rx_flags, ioaddr + rxcfg);
|
|
|
+ sw32(txcfg, tx_flags);
|
|
|
+ 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)
|
|
|
{
|
|
|
struct sis900_private *sis_priv = netdev_priv(net_dev);
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
+ void __iomem *ioaddr = sis_priv->ioaddr;
|
|
|
unsigned long flags;
|
|
|
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",
|
|
|
- net_dev->name, inl(ioaddr + cr), inl(ioaddr + isr));
|
|
|
+ net_dev->name, sr32(cr), sr32(isr));
|
|
|
+ }
|
|
|
|
|
|
/* Disable interrupts by clearing the interrupt mask. */
|
|
|
- outl(0x0000, ioaddr + imr);
|
|
|
+ sw32(imr, 0x0000);
|
|
|
|
|
|
/* use spinlock to prevent interrupt handler accessing buffer ring */
|
|
|
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 */
|
|
|
|
|
|
/* 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. */
|
|
|
- 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)
|
|
|
{
|
|
|
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 long flags;
|
|
|
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,
|
|
|
skb->data, skb->len, PCI_DMA_TODEVICE);
|
|
|
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 ++;
|
|
|
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 sis900_private *sis_priv = netdev_priv(net_dev);
|
|
|
int boguscnt = max_interrupt_work;
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
+ void __iomem *ioaddr = sis_priv->ioaddr;
|
|
|
u32 status;
|
|
|
unsigned int handled = 0;
|
|
|
|
|
|
spin_lock (&sis_priv->lock);
|
|
|
|
|
|
do {
|
|
|
- status = inl(ioaddr + isr);
|
|
|
+ status = sr32(isr);
|
|
|
|
|
|
if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0)
|
|
|
/* nothing intresting happened */
|
|
@@ -1696,7 +1721,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)
|
|
|
if(netif_msg_intr(sis_priv))
|
|
|
printk(KERN_DEBUG "%s: exiting interrupt, "
|
|
|
"interrupt status = 0x%#8.8x.\n",
|
|
|
- net_dev->name, inl(ioaddr + isr));
|
|
|
+ net_dev->name, sr32(isr));
|
|
|
|
|
|
spin_unlock (&sis_priv->lock);
|
|
|
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)
|
|
|
{
|
|
|
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;
|
|
|
u32 rx_status = sis_priv->rx_ring[entry].cmdsts;
|
|
|
int rx_work_limit;
|
|
@@ -1847,7 +1872,7 @@ refill_rx_ring:
|
|
|
}
|
|
|
}
|
|
|
/* re-enable the potentially idle receive state matchine */
|
|
|
- outl(RxENA | inl(ioaddr + cr), ioaddr + cr );
|
|
|
+ sw32(cr , RxENA | sr32(cr));
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
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;
|
|
|
int i;
|
|
|
|
|
|
netif_stop_queue(net_dev);
|
|
|
|
|
|
/* Disable interrupts by clearing the interrupt mask. */
|
|
|
- outl(0x0000, ioaddr + imr);
|
|
|
- outl(0x0000, ioaddr + ier);
|
|
|
+ sw32(imr, 0x0000);
|
|
|
+ sw32(ier, 0x0000);
|
|
|
|
|
|
/* 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);
|
|
|
|
|
|
- free_irq(net_dev->irq, net_dev);
|
|
|
+ free_irq(pdev->irq, net_dev);
|
|
|
|
|
|
/* Free Tx and RX skbuff */
|
|
|
for (i = 0; i < NUM_RX_DESC; i++) {
|
|
|
skb = sis_priv->rx_skbuff[i];
|
|
|
if (skb) {
|
|
|
- pci_unmap_single(sis_priv->pci_dev,
|
|
|
- sis_priv->rx_ring[i].bufptr,
|
|
|
- RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
|
|
|
+ pci_unmap_single(pdev, sis_priv->rx_ring[i].bufptr,
|
|
|
+ RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
|
|
|
dev_kfree_skb(skb);
|
|
|
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++) {
|
|
|
skb = sis_priv->tx_skbuff[i];
|
|
|
if (skb) {
|
|
|
- pci_unmap_single(sis_priv->pci_dev,
|
|
|
- sis_priv->tx_ring[i].bufptr, skb->len,
|
|
|
- PCI_DMA_TODEVICE);
|
|
|
+ pci_unmap_single(pdev, sis_priv->tx_ring[i].bufptr,
|
|
|
+ skb->len, PCI_DMA_TODEVICE);
|
|
|
dev_kfree_skb(skb);
|
|
|
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)
|
|
|
{
|
|
|
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;
|
|
|
|
|
|
if (wol->wolopts == 0) {
|
|
|
pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr);
|
|
|
cfgpmcsr &= ~PME_EN;
|
|
|
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))
|
|
|
printk(KERN_DEBUG "%s: Wake on LAN disabled\n", net_dev->name);
|
|
|
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)
|
|
|
pmctrl_bits |= LINKON;
|
|
|
|
|
|
- outl(pmctrl_bits, pmctrl_addr);
|
|
|
+ sw32(pmctrl, pmctrl_bits);
|
|
|
|
|
|
pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr);
|
|
|
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)
|
|
|
{
|
|
|
- long pmctrl_addr = net_dev->base_addr + pmctrl;
|
|
|
+ struct sis900_private *sp = netdev_priv(net_dev);
|
|
|
+ void __iomem *ioaddr = sp->ioaddr;
|
|
|
u32 pmctrl_bits;
|
|
|
|
|
|
- pmctrl_bits = inl(pmctrl_addr);
|
|
|
+ pmctrl_bits = sr32(pmctrl);
|
|
|
if (pmctrl_bits & MAGICPKT)
|
|
|
wol->wolopts |= WAKE_MAGIC;
|
|
|
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)
|
|
|
{
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
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 */
|
|
|
int i, table_entries;
|
|
|
u32 rx_mode;
|
|
@@ -2322,24 +2347,24 @@ static void set_rx_mode(struct net_device *net_dev)
|
|
|
/* update Multicast Hash Table in Receive Filter */
|
|
|
for (i = 0; i < table_entries; i++) {
|
|
|
/* why plus 0x04 ??, That makes the correct value for hash table. */
|
|
|
- outl((u32)(0x00000004+i) << RFADDR_shift, ioaddr + rfcr);
|
|
|
- outl(mc_filter[i], ioaddr + rfdr);
|
|
|
+ sw32(rfcr, (u32)(0x00000004 + i) << RFADDR_shift);
|
|
|
+ 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
|
|
|
* debugging purpose */
|
|
|
if (net_dev->flags & IFF_LOOPBACK) {
|
|
|
u32 cr_saved;
|
|
|
/* We must disable Tx/Rx before setting loopback mode */
|
|
|
- cr_saved = inl(ioaddr + cr);
|
|
|
- outl(cr_saved | TxDIS | RxDIS, ioaddr + cr);
|
|
|
+ cr_saved = sr32(cr);
|
|
|
+ sw32(cr, cr_saved | TxDIS | RxDIS);
|
|
|
/* enable loopback */
|
|
|
- outl(inl(ioaddr + txcfg) | TxMLB, ioaddr + txcfg);
|
|
|
- outl(inl(ioaddr + rxcfg) | RxATX, ioaddr + rxcfg);
|
|
|
+ sw32(txcfg, sr32(txcfg) | TxMLB);
|
|
|
+ sw32(rxcfg, sr32(rxcfg) | RxATX);
|
|
|
/* 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)
|
|
|
{
|
|
|
struct sis900_private *sis_priv = netdev_priv(net_dev);
|
|
|
- long ioaddr = net_dev->base_addr;
|
|
|
- int i = 0;
|
|
|
+ void __iomem *ioaddr = sis_priv->ioaddr;
|
|
|
u32 status = TxRCMP | RxRCMP;
|
|
|
+ int i;
|
|
|
|
|
|
- outl(0, ioaddr + ier);
|
|
|
- outl(0, ioaddr + imr);
|
|
|
- outl(0, ioaddr + rfcr);
|
|
|
+ sw32(ier, 0);
|
|
|
+ sw32(imr, 0);
|
|
|
+ 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. */
|
|
|
- while (status && (i++ < 1000)) {
|
|
|
- status ^= (inl(isr + ioaddr) & status);
|
|
|
- }
|
|
|
+ for (i = 0; status && (i < 1000); i++)
|
|
|
+ status ^= sr32(isr) & status;
|
|
|
|
|
|
- if( (sis_priv->chipset_rev >= SIS635A_900_REV) ||
|
|
|
- (sis_priv->chipset_rev == SIS900B_900_REV) )
|
|
|
- outl(PESEL | RND_CNT, ioaddr + cfg);
|
|
|
+ if (sis_priv->chipset_rev >= SIS635A_900_REV ||
|
|
|
+ sis_priv->chipset_rev == SIS900B_900_REV)
|
|
|
+ sw32(cfg, PESEL | RND_CNT);
|
|
|
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 sis900_private *sis_priv = netdev_priv(net_dev);
|
|
|
- struct mii_phy *phy = NULL;
|
|
|
+
|
|
|
+ unregister_netdev(net_dev);
|
|
|
|
|
|
while (sis_priv->first_mii) {
|
|
|
- phy = sis_priv->first_mii;
|
|
|
+ struct mii_phy *phy = sis_priv->first_mii;
|
|
|
+
|
|
|
sis_priv->first_mii = phy->next;
|
|
|
kfree(phy);
|
|
|
}
|
|
@@ -2400,7 +2426,7 @@ static void __devexit sis900_remove(struct pci_dev *pci_dev)
|
|
|
sis_priv->rx_ring_dma);
|
|
|
pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring,
|
|
|
sis_priv->tx_ring_dma);
|
|
|
- unregister_netdev(net_dev);
|
|
|
+ pci_iounmap(pci_dev, sis_priv->ioaddr);
|
|
|
free_netdev(net_dev);
|
|
|
pci_release_regions(pci_dev);
|
|
|
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)
|
|
|
{
|
|
|
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))
|
|
|
return 0;
|
|
@@ -2420,7 +2447,7 @@ static int sis900_suspend(struct pci_dev *pci_dev, pm_message_t state)
|
|
|
netif_device_detach(net_dev);
|
|
|
|
|
|
/* 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_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 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))
|
|
|
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);
|
|
|
|
|
|
/* Enable all known interrupts by setting the interrupt mask. */
|
|
|
- outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr);
|
|
|
- outl(RxENA | inl(ioaddr + cr), ioaddr + cr);
|
|
|
- outl(IE, ioaddr + ier);
|
|
|
+ sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
|
|
|
+ sw32(cr, RxENA | sr32(cr));
|
|
|
+ sw32(ier, IE);
|
|
|
|
|
|
sis900_check_mode(net_dev, sis_priv->mii);
|
|
|
|