ni52: clean up check586()
authorAl Viro <viro@ftp.linux.org.uk>
Wed, 19 Mar 2008 09:44:19 +0000 (09:44 +0000)
committerJeff Garzik <jeff@garzik.org>
Wed, 26 Mar 2008 04:18:02 +0000 (00:18 -0400)
take iscp-based testing into helper, kill the loop, stop
wanking with reassignments of priv->iscp

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/net/ni52.c

index 3b1c4af615b6043418fa4e3e5ab7607a66d5078e..fa611f6a856374dc38108cce9546237b8dabf76b 100644 (file)
@@ -294,21 +294,38 @@ static int ni52_open(struct net_device *dev)
        return 0; /* most done by init */
 }
 
+static int check_iscp(struct net_device *dev, void __iomem *addr)
+{
+       struct iscp_struct __iomem *iscp = addr;
+       struct priv *p = dev->priv;
+       memset_io(iscp, 0, sizeof(struct iscp_struct));
+
+       writel(make24(iscp), &p->scp->iscp);
+       writeb(1, &iscp->busy);
+
+       ni_reset586();
+       ni_attn586();
+       mdelay(32);     /* wait a while... */
+       /* i82586 clears 'busy' after successful init */
+       if (readb(&iscp->busy))
+               return 0;
+       return 1;
+}
+
 /**********************************************
  * Check to see if there's an 82586 out there.
  */
 static int check586(struct net_device *dev, unsigned size)
 {
-       unsigned long where = dev->mem_start;
        struct priv *p = dev->priv;
-       char __iomem *iscp_addrs[2];
        int i;
 
-       p->mapped = (char __iomem *)isa_bus_to_virt(where);
+       p->mapped = (char __iomem *)isa_bus_to_virt(dev->mem_start);
        p->base = p->mapped + size - 0x01000000;
        p->memtop = p->mapped + size;
        p->scp = (struct scp_struct __iomem *)(p->base + SCP_DEFAULT_ADDRESS);
        p->scb  = (struct scb_struct __iomem *) p->mapped;
+       p->iscp = (struct iscp_struct __iomem *)p->scp - 1;
        memset_io(p->scp, 0, sizeof(struct scp_struct));
        for (i = 0; i < sizeof(struct scp_struct); i++)
                /* memory was writeable? */
@@ -318,26 +335,10 @@ static int check586(struct net_device *dev, unsigned size)
        if (readb(&p->scp->sysbus) != SYSBUSVAL)
                return 0;
 
-       iscp_addrs[0] = p->mapped;
-       iscp_addrs[1] = (char __iomem *)p->scp - sizeof(struct iscp_struct);
-
-       for (i = 0; i < 2; i++) {
-               p->iscp = (struct iscp_struct __iomem *) iscp_addrs[i];
-               memset_io(p->iscp, 0, sizeof(struct iscp_struct));
-
-               writel(make24(p->iscp), &p->scp->iscp);
-               writeb(1, &p->iscp->busy);
-
-               ni_reset586();
-               ni_attn586();
-               mdelay(32);     /* wait a while... */
-               /* i82586 clears 'busy' after successful init */
-               if (readb(&p->iscp->busy))
-                       return 0;
-       }
-
-       p->iscp = (struct iscp_struct __iomem *)
-                       ((char __iomem *)p->scp - sizeof(struct iscp_struct));
+       if (!check_iscp(dev, p->mapped))
+               return 0;
+       if (!check_iscp(dev, p->iscp))
+               return 0;
        return 1;
 }