Commit d46c65c5 authored by Alexander Viro's avatar Alexander Viro Committed by David S. Miller

[SPARC]: sunlance iomem annotations.

Signed-off-by: default avatarAl Viro <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e42391ab
...@@ -232,7 +232,8 @@ struct lance_init_block { ...@@ -232,7 +232,8 @@ struct lance_init_block {
struct lance_private { struct lance_private {
void __iomem *lregs; /* Lance RAP/RDP regs. */ void __iomem *lregs; /* Lance RAP/RDP regs. */
void __iomem *dregs; /* DMA controller regs. */ void __iomem *dregs; /* DMA controller regs. */
struct lance_init_block *init_block; struct lance_init_block __iomem *init_block_iomem;
struct lance_init_block *init_block_mem;
spinlock_t lock; spinlock_t lock;
...@@ -314,7 +315,7 @@ static void load_csrs(struct lance_private *lp) ...@@ -314,7 +315,7 @@ static void load_csrs(struct lance_private *lp)
static void lance_init_ring_dvma(struct net_device *dev) static void lance_init_ring_dvma(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block; struct lance_init_block *ib = lp->init_block_mem;
dma_addr_t aib = lp->init_block_dvma; dma_addr_t aib = lp->init_block_dvma;
__u32 leptr; __u32 leptr;
int i; int i;
...@@ -371,7 +372,7 @@ static void lance_init_ring_dvma(struct net_device *dev) ...@@ -371,7 +372,7 @@ static void lance_init_ring_dvma(struct net_device *dev)
static void lance_init_ring_pio(struct net_device *dev) static void lance_init_ring_pio(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block; struct lance_init_block __iomem *ib = lp->init_block_iomem;
u32 leptr; u32 leptr;
int i; int i;
...@@ -501,7 +502,7 @@ static int init_restart_lance(struct lance_private *lp) ...@@ -501,7 +502,7 @@ static int init_restart_lance(struct lance_private *lp)
static void lance_rx_dvma(struct net_device *dev) static void lance_rx_dvma(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block; struct lance_init_block *ib = lp->init_block_mem;
struct lance_rx_desc *rd; struct lance_rx_desc *rd;
u8 bits; u8 bits;
int len, entry = lp->rx_new; int len, entry = lp->rx_new;
...@@ -564,7 +565,7 @@ static void lance_rx_dvma(struct net_device *dev) ...@@ -564,7 +565,7 @@ static void lance_rx_dvma(struct net_device *dev)
static void lance_tx_dvma(struct net_device *dev) static void lance_tx_dvma(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block; struct lance_init_block *ib = lp->init_block_mem;
int i, j; int i, j;
spin_lock(&lp->lock); spin_lock(&lp->lock);
...@@ -674,8 +675,8 @@ static void lance_piocopy_to_skb(struct sk_buff *skb, void __iomem *piobuf, int ...@@ -674,8 +675,8 @@ static void lance_piocopy_to_skb(struct sk_buff *skb, void __iomem *piobuf, int
static void lance_rx_pio(struct net_device *dev) static void lance_rx_pio(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block; struct lance_init_block __iomem *ib = lp->init_block_iomem;
struct lance_rx_desc *rd; struct lance_rx_desc __iomem *rd;
unsigned char bits; unsigned char bits;
int len, entry; int len, entry;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -736,14 +737,14 @@ static void lance_rx_pio(struct net_device *dev) ...@@ -736,14 +737,14 @@ static void lance_rx_pio(struct net_device *dev)
static void lance_tx_pio(struct net_device *dev) static void lance_tx_pio(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block; struct lance_init_block __iomem *ib = lp->init_block_iomem;
int i, j; int i, j;
spin_lock(&lp->lock); spin_lock(&lp->lock);
j = lp->tx_old; j = lp->tx_old;
for (i = j; i != lp->tx_new; i = j) { for (i = j; i != lp->tx_new; i = j) {
struct lance_tx_desc *td = &ib->btx_ring [i]; struct lance_tx_desc __iomem *td = &ib->btx_ring [i];
u8 bits = sbus_readb(&td->tmd1_bits); u8 bits = sbus_readb(&td->tmd1_bits);
/* If we hit a packet not owned by us, stop */ /* If we hit a packet not owned by us, stop */
...@@ -880,15 +881,13 @@ static irqreturn_t lance_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -880,15 +881,13 @@ static irqreturn_t lance_interrupt(int irq, void *dev_id, struct pt_regs *regs)
static void build_fake_packet(struct lance_private *lp) static void build_fake_packet(struct lance_private *lp)
{ {
struct net_device *dev = lp->dev; struct net_device *dev = lp->dev;
struct lance_init_block *ib = lp->init_block;
u16 *packet;
struct ethhdr *eth;
int i, entry; int i, entry;
entry = lp->tx_new & TX_RING_MOD_MASK; entry = lp->tx_new & TX_RING_MOD_MASK;
packet = (u16 *) &(ib->tx_buf[entry][0]);
eth = (struct ethhdr *) packet;
if (lp->pio_buffer) { if (lp->pio_buffer) {
struct lance_init_block __iomem *ib = lp->init_block_iomem;
u16 __iomem *packet = (u16 __iomem *) &(ib->tx_buf[entry][0]);
struct ethhdr __iomem *eth = (struct ethhdr __iomem *) packet;
for (i = 0; i < (ETH_ZLEN / sizeof(u16)); i++) for (i = 0; i < (ETH_ZLEN / sizeof(u16)); i++)
sbus_writew(0, &packet[i]); sbus_writew(0, &packet[i]);
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
...@@ -899,6 +898,9 @@ static void build_fake_packet(struct lance_private *lp) ...@@ -899,6 +898,9 @@ static void build_fake_packet(struct lance_private *lp)
sbus_writew(0, &ib->btx_ring[entry].misc); sbus_writew(0, &ib->btx_ring[entry].misc);
sbus_writeb(LE_T1_POK|LE_T1_OWN, &ib->btx_ring[entry].tmd1_bits); sbus_writeb(LE_T1_POK|LE_T1_OWN, &ib->btx_ring[entry].tmd1_bits);
} else { } else {
struct lance_init_block *ib = lp->init_block_mem;
u16 *packet = (u16 *) &(ib->tx_buf[entry][0]);
struct ethhdr *eth = (struct ethhdr *) packet;
memset(packet, 0, ETH_ZLEN); memset(packet, 0, ETH_ZLEN);
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
eth->h_dest[i] = dev->dev_addr[i]; eth->h_dest[i] = dev->dev_addr[i];
...@@ -916,7 +918,6 @@ struct net_device *last_dev; ...@@ -916,7 +918,6 @@ struct net_device *last_dev;
static int lance_open(struct net_device *dev) static int lance_open(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block;
int status = 0; int status = 0;
last_dev = dev; last_dev = dev;
...@@ -943,10 +944,12 @@ static int lance_open(struct net_device *dev) ...@@ -943,10 +944,12 @@ static int lance_open(struct net_device *dev)
* BTW it is common bug in all lance drivers! --ANK * BTW it is common bug in all lance drivers! --ANK
*/ */
if (lp->pio_buffer) { if (lp->pio_buffer) {
struct lance_init_block __iomem *ib = lp->init_block_iomem;
sbus_writew(0, &ib->mode); sbus_writew(0, &ib->mode);
sbus_writel(0, &ib->filter[0]); sbus_writel(0, &ib->filter[0]);
sbus_writel(0, &ib->filter[1]); sbus_writel(0, &ib->filter[1]);
} else { } else {
struct lance_init_block *ib = lp->init_block_mem;
ib->mode = 0; ib->mode = 0;
ib->filter [0] = 0; ib->filter [0] = 0;
ib->filter [1] = 0; ib->filter [1] = 0;
...@@ -1113,7 +1116,6 @@ static void lance_tx_timeout(struct net_device *dev) ...@@ -1113,7 +1116,6 @@ static void lance_tx_timeout(struct net_device *dev)
static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block;
int entry, skblen, len; int entry, skblen, len;
skblen = skb->len; skblen = skb->len;
...@@ -1126,6 +1128,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1126,6 +1128,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
entry = lp->tx_new & TX_RING_MOD_MASK; entry = lp->tx_new & TX_RING_MOD_MASK;
if (lp->pio_buffer) { if (lp->pio_buffer) {
struct lance_init_block __iomem *ib = lp->init_block_iomem;
sbus_writew((-len) | 0xf000, &ib->btx_ring[entry].length); sbus_writew((-len) | 0xf000, &ib->btx_ring[entry].length);
sbus_writew(0, &ib->btx_ring[entry].misc); sbus_writew(0, &ib->btx_ring[entry].misc);
lance_piocopy_from_skb(&ib->tx_buf[entry][0], skb->data, skblen); lance_piocopy_from_skb(&ib->tx_buf[entry][0], skb->data, skblen);
...@@ -1133,6 +1136,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1133,6 +1136,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
lance_piozero(&ib->tx_buf[entry][skblen], len - skblen); lance_piozero(&ib->tx_buf[entry][skblen], len - skblen);
sbus_writeb(LE_T1_POK | LE_T1_OWN, &ib->btx_ring[entry].tmd1_bits); sbus_writeb(LE_T1_POK | LE_T1_OWN, &ib->btx_ring[entry].tmd1_bits);
} else { } else {
struct lance_init_block *ib = lp->init_block_mem;
ib->btx_ring [entry].length = (-len) | 0xf000; ib->btx_ring [entry].length = (-len) | 0xf000;
ib->btx_ring [entry].misc = 0; ib->btx_ring [entry].misc = 0;
memcpy((char *)&ib->tx_buf [entry][0], skb->data, skblen); memcpy((char *)&ib->tx_buf [entry][0], skb->data, skblen);
...@@ -1174,33 +1178,31 @@ static struct net_device_stats *lance_get_stats(struct net_device *dev) ...@@ -1174,33 +1178,31 @@ static struct net_device_stats *lance_get_stats(struct net_device *dev)
static void lance_load_multicast(struct net_device *dev) static void lance_load_multicast(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block;
u16 *mcast_table = (u16 *) &ib->filter;
struct dev_mc_list *dmi = dev->mc_list; struct dev_mc_list *dmi = dev->mc_list;
char *addrs; char *addrs;
int i; int i;
u32 crc; u32 crc;
u32 val;
/* set all multicast bits */ /* set all multicast bits */
if (dev->flags & IFF_ALLMULTI) { if (dev->flags & IFF_ALLMULTI)
if (lp->pio_buffer) { val = ~0;
sbus_writel(0xffffffff, &ib->filter[0]); else
sbus_writel(0xffffffff, &ib->filter[1]); val = 0;
} else {
ib->filter [0] = 0xffffffff;
ib->filter [1] = 0xffffffff;
}
return;
}
/* clear the multicast filter */
if (lp->pio_buffer) { if (lp->pio_buffer) {
sbus_writel(0, &ib->filter[0]); struct lance_init_block __iomem *ib = lp->init_block_iomem;
sbus_writel(0, &ib->filter[1]); sbus_writel(val, &ib->filter[0]);
sbus_writel(val, &ib->filter[1]);
} else { } else {
ib->filter [0] = 0; struct lance_init_block *ib = lp->init_block_mem;
ib->filter [1] = 0; ib->filter [0] = val;
ib->filter [1] = val;
} }
if (dev->flags & IFF_ALLMULTI)
return;
/* Add addresses */ /* Add addresses */
for (i = 0; i < dev->mc_count; i++) { for (i = 0; i < dev->mc_count; i++) {
addrs = dmi->dmi_addr; addrs = dmi->dmi_addr;
...@@ -1212,10 +1214,14 @@ static void lance_load_multicast(struct net_device *dev) ...@@ -1212,10 +1214,14 @@ static void lance_load_multicast(struct net_device *dev)
crc = ether_crc_le(6, addrs); crc = ether_crc_le(6, addrs);
crc = crc >> 26; crc = crc >> 26;
if (lp->pio_buffer) { if (lp->pio_buffer) {
struct lance_init_block __iomem *ib = lp->init_block_iomem;
u16 __iomem *mcast_table = (u16 __iomem *) &ib->filter;
u16 tmp = sbus_readw(&mcast_table[crc>>4]); u16 tmp = sbus_readw(&mcast_table[crc>>4]);
tmp |= 1 << (crc & 0xf); tmp |= 1 << (crc & 0xf);
sbus_writew(tmp, &mcast_table[crc>>4]); sbus_writew(tmp, &mcast_table[crc>>4]);
} else { } else {
struct lance_init_block *ib = lp->init_block_mem;
u16 *mcast_table = (u16 *) &ib->filter;
mcast_table [crc >> 4] |= 1 << (crc & 0xf); mcast_table [crc >> 4] |= 1 << (crc & 0xf);
} }
} }
...@@ -1224,7 +1230,8 @@ static void lance_load_multicast(struct net_device *dev) ...@@ -1224,7 +1230,8 @@ static void lance_load_multicast(struct net_device *dev)
static void lance_set_multicast(struct net_device *dev) static void lance_set_multicast(struct net_device *dev)
{ {
struct lance_private *lp = netdev_priv(dev); struct lance_private *lp = netdev_priv(dev);
struct lance_init_block *ib = lp->init_block; struct lance_init_block *ib_mem = lp->init_block_mem;
struct lance_init_block __iomem *ib_iomem = lp->init_block_iomem;
u16 mode; u16 mode;
if (!netif_running(dev)) if (!netif_running(dev))
...@@ -1242,21 +1249,21 @@ static void lance_set_multicast(struct net_device *dev) ...@@ -1242,21 +1249,21 @@ static void lance_set_multicast(struct net_device *dev)
lp->init_ring(dev); lp->init_ring(dev);
if (lp->pio_buffer) if (lp->pio_buffer)
mode = sbus_readw(&ib->mode); mode = sbus_readw(&ib_iomem->mode);
else else
mode = ib->mode; mode = ib_mem->mode;
if (dev->flags & IFF_PROMISC) { if (dev->flags & IFF_PROMISC) {
mode |= LE_MO_PROM; mode |= LE_MO_PROM;
if (lp->pio_buffer) if (lp->pio_buffer)
sbus_writew(mode, &ib->mode); sbus_writew(mode, &ib_iomem->mode);
else else
ib->mode = mode; ib_mem->mode = mode;
} else { } else {
mode &= ~LE_MO_PROM; mode &= ~LE_MO_PROM;
if (lp->pio_buffer) if (lp->pio_buffer)
sbus_writew(mode, &ib->mode); sbus_writew(mode, &ib_iomem->mode);
else else
ib->mode = mode; ib_mem->mode = mode;
lance_load_multicast(dev); lance_load_multicast(dev);
} }
load_csrs(lp); load_csrs(lp);
...@@ -1275,16 +1282,14 @@ static void lance_free_hwresources(struct lance_private *lp) ...@@ -1275,16 +1282,14 @@ static void lance_free_hwresources(struct lance_private *lp)
{ {
if (lp->lregs) if (lp->lregs)
sbus_iounmap(lp->lregs, LANCE_REG_SIZE); sbus_iounmap(lp->lregs, LANCE_REG_SIZE);
if (lp->init_block != NULL) { if (lp->init_block_iomem) {
if (lp->pio_buffer) { sbus_iounmap(lp->init_block_iomem,
sbus_iounmap(lp->init_block, sizeof(struct lance_init_block));
sizeof(struct lance_init_block)); } else if (lp->init_block_mem) {
} else { sbus_free_consistent(lp->sdev,
sbus_free_consistent(lp->sdev, sizeof(struct lance_init_block),
sizeof(struct lance_init_block), lp->init_block_mem,
lp->init_block, lp->init_block_dvma);
lp->init_block_dvma);
}
} }
} }
...@@ -1326,6 +1331,7 @@ static int __init sparc_lance_init(struct sbus_dev *sdev, ...@@ -1326,6 +1331,7 @@ static int __init sparc_lance_init(struct sbus_dev *sdev,
return -ENOMEM; return -ENOMEM;
lp = netdev_priv(dev); lp = netdev_priv(dev);
memset(lp, 0, sizeof(*lp));
if (sparc_lance_debug && version_printed++ == 0) if (sparc_lance_debug && version_printed++ == 0)
printk (KERN_INFO "%s", version); printk (KERN_INFO "%s", version);
...@@ -1342,17 +1348,22 @@ static int __init sparc_lance_init(struct sbus_dev *sdev, ...@@ -1342,17 +1348,22 @@ static int __init sparc_lance_init(struct sbus_dev *sdev,
/* Get the IO region */ /* Get the IO region */
lp->lregs = sbus_ioremap(&sdev->resource[0], 0, lp->lregs = sbus_ioremap(&sdev->resource[0], 0,
LANCE_REG_SIZE, lancestr); LANCE_REG_SIZE, lancestr);
if (lp->lregs == 0UL) { if (!lp->lregs) {
printk(KERN_ERR "SunLance: Cannot map registers.\n"); printk(KERN_ERR "SunLance: Cannot map registers.\n");
goto fail; goto fail;
} }
lp->sdev = sdev; lp->sdev = sdev;
if (lebuffer) { if (lebuffer) {
lp->init_block = /* sanity check */
if (lebuffer->resource[0].start & 7) {
printk(KERN_ERR "SunLance: ERROR: Rx and Tx rings not on even boundary.\n");
goto fail;
}
lp->init_block_iomem =
sbus_ioremap(&lebuffer->resource[0], 0, sbus_ioremap(&lebuffer->resource[0], 0,
sizeof(struct lance_init_block), "lebuffer"); sizeof(struct lance_init_block), "lebuffer");
if (lp->init_block == NULL) { if (!lp->init_block_iomem) {
printk(KERN_ERR "SunLance: Cannot map PIO buffer.\n"); printk(KERN_ERR "SunLance: Cannot map PIO buffer.\n");
goto fail; goto fail;
} }
...@@ -1362,11 +1373,10 @@ static int __init sparc_lance_init(struct sbus_dev *sdev, ...@@ -1362,11 +1373,10 @@ static int __init sparc_lance_init(struct sbus_dev *sdev,
lp->rx = lance_rx_pio; lp->rx = lance_rx_pio;
lp->tx = lance_tx_pio; lp->tx = lance_tx_pio;
} else { } else {
lp->init_block = lp->init_block_mem =
sbus_alloc_consistent(sdev, sizeof(struct lance_init_block), sbus_alloc_consistent(sdev, sizeof(struct lance_init_block),
&lp->init_block_dvma); &lp->init_block_dvma);
if (lp->init_block == NULL || if (!lp->init_block_mem || lp->init_block_dvma == 0) {
lp->init_block_dvma == 0) {
printk(KERN_ERR "SunLance: Cannot allocate consistent DMA memory.\n"); printk(KERN_ERR "SunLance: Cannot allocate consistent DMA memory.\n");
goto fail; goto fail;
} }
...@@ -1449,13 +1459,7 @@ static int __init sparc_lance_init(struct sbus_dev *sdev, ...@@ -1449,13 +1459,7 @@ static int __init sparc_lance_init(struct sbus_dev *sdev,
udelay(200); udelay(200);
sbus_writel(csr & ~DMA_RST_ENET, lp->dregs + DMA_CSR); sbus_writel(csr & ~DMA_RST_ENET, lp->dregs + DMA_CSR);
} else } else
lp->dregs = 0; lp->dregs = NULL;
/* This should never happen. */
if ((unsigned long)(lp->init_block->brx_ring) & 0x07) {
printk(KERN_ERR "SunLance: ERROR: Rx and Tx rings not on even boundary.\n");
goto fail;
}
lp->dev = dev; lp->dev = dev;
SET_MODULE_OWNER(dev); SET_MODULE_OWNER(dev);
...@@ -1499,8 +1503,7 @@ static int __init sparc_lance_init(struct sbus_dev *sdev, ...@@ -1499,8 +1503,7 @@ static int __init sparc_lance_init(struct sbus_dev *sdev,
return 0; return 0;
fail: fail:
if (lp != NULL) lance_free_hwresources(lp);
lance_free_hwresources(lp);
free_netdev(dev); free_netdev(dev);
return -ENODEV; return -ENODEV;
} }
...@@ -1539,7 +1542,7 @@ static int __init sparc_lance_probe(void) ...@@ -1539,7 +1542,7 @@ static int __init sparc_lance_probe(void)
memset(&sdev, 0, sizeof(sdev)); memset(&sdev, 0, sizeof(sdev));
sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr;
sdev.irqs[0] = 6; sdev.irqs[0] = 6;
return sparc_lance_init(&sdev, 0, 0); return sparc_lance_init(&sdev, NULL, NULL);
} }
return -ENODEV; return -ENODEV;
} }
......
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