diff options
Diffstat (limited to 'drivers/net/ni52.c')
-rw-r--r-- | drivers/net/ni52.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/drivers/net/ni52.c b/drivers/net/ni52.c index 3b1c4af615b6..fa611f6a8563 100644 --- a/drivers/net/ni52.c +++ b/drivers/net/ni52.c | |||
@@ -294,21 +294,38 @@ static int ni52_open(struct net_device *dev) | |||
294 | return 0; /* most done by init */ | 294 | return 0; /* most done by init */ |
295 | } | 295 | } |
296 | 296 | ||
297 | static int check_iscp(struct net_device *dev, void __iomem *addr) | ||
298 | { | ||
299 | struct iscp_struct __iomem *iscp = addr; | ||
300 | struct priv *p = dev->priv; | ||
301 | memset_io(iscp, 0, sizeof(struct iscp_struct)); | ||
302 | |||
303 | writel(make24(iscp), &p->scp->iscp); | ||
304 | writeb(1, &iscp->busy); | ||
305 | |||
306 | ni_reset586(); | ||
307 | ni_attn586(); | ||
308 | mdelay(32); /* wait a while... */ | ||
309 | /* i82586 clears 'busy' after successful init */ | ||
310 | if (readb(&iscp->busy)) | ||
311 | return 0; | ||
312 | return 1; | ||
313 | } | ||
314 | |||
297 | /********************************************** | 315 | /********************************************** |
298 | * Check to see if there's an 82586 out there. | 316 | * Check to see if there's an 82586 out there. |
299 | */ | 317 | */ |
300 | static int check586(struct net_device *dev, unsigned size) | 318 | static int check586(struct net_device *dev, unsigned size) |
301 | { | 319 | { |
302 | unsigned long where = dev->mem_start; | ||
303 | struct priv *p = dev->priv; | 320 | struct priv *p = dev->priv; |
304 | char __iomem *iscp_addrs[2]; | ||
305 | int i; | 321 | int i; |
306 | 322 | ||
307 | p->mapped = (char __iomem *)isa_bus_to_virt(where); | 323 | p->mapped = (char __iomem *)isa_bus_to_virt(dev->mem_start); |
308 | p->base = p->mapped + size - 0x01000000; | 324 | p->base = p->mapped + size - 0x01000000; |
309 | p->memtop = p->mapped + size; | 325 | p->memtop = p->mapped + size; |
310 | p->scp = (struct scp_struct __iomem *)(p->base + SCP_DEFAULT_ADDRESS); | 326 | p->scp = (struct scp_struct __iomem *)(p->base + SCP_DEFAULT_ADDRESS); |
311 | p->scb = (struct scb_struct __iomem *) p->mapped; | 327 | p->scb = (struct scb_struct __iomem *) p->mapped; |
328 | p->iscp = (struct iscp_struct __iomem *)p->scp - 1; | ||
312 | memset_io(p->scp, 0, sizeof(struct scp_struct)); | 329 | memset_io(p->scp, 0, sizeof(struct scp_struct)); |
313 | for (i = 0; i < sizeof(struct scp_struct); i++) | 330 | for (i = 0; i < sizeof(struct scp_struct); i++) |
314 | /* memory was writeable? */ | 331 | /* memory was writeable? */ |
@@ -318,26 +335,10 @@ static int check586(struct net_device *dev, unsigned size) | |||
318 | if (readb(&p->scp->sysbus) != SYSBUSVAL) | 335 | if (readb(&p->scp->sysbus) != SYSBUSVAL) |
319 | return 0; | 336 | return 0; |
320 | 337 | ||
321 | iscp_addrs[0] = p->mapped; | 338 | if (!check_iscp(dev, p->mapped)) |
322 | iscp_addrs[1] = (char __iomem *)p->scp - sizeof(struct iscp_struct); | 339 | return 0; |
323 | 340 | if (!check_iscp(dev, p->iscp)) | |
324 | for (i = 0; i < 2; i++) { | 341 | return 0; |
325 | p->iscp = (struct iscp_struct __iomem *) iscp_addrs[i]; | ||
326 | memset_io(p->iscp, 0, sizeof(struct iscp_struct)); | ||
327 | |||
328 | writel(make24(p->iscp), &p->scp->iscp); | ||
329 | writeb(1, &p->iscp->busy); | ||
330 | |||
331 | ni_reset586(); | ||
332 | ni_attn586(); | ||
333 | mdelay(32); /* wait a while... */ | ||
334 | /* i82586 clears 'busy' after successful init */ | ||
335 | if (readb(&p->iscp->busy)) | ||
336 | return 0; | ||
337 | } | ||
338 | |||
339 | p->iscp = (struct iscp_struct __iomem *) | ||
340 | ((char __iomem *)p->scp - sizeof(struct iscp_struct)); | ||
341 | return 1; | 342 | return 1; |
342 | } | 343 | } |
343 | 344 | ||