patch-2.4.19 linux-2.4.19/drivers/net/cs89x0.c
Next file: linux-2.4.19/drivers/net/cs89x0.h
Previous file: linux-2.4.19/drivers/net/bonding.c
Back to the patch index
Back to the overall index
- Lines: 168
- Date:
Fri Aug 2 17:39:44 2002
- Orig file:
linux-2.4.18/drivers/net/cs89x0.c
- Orig date:
Mon Feb 25 11:37:59 2002
diff -urN linux-2.4.18/drivers/net/cs89x0.c linux-2.4.19/drivers/net/cs89x0.c
@@ -81,6 +81,9 @@
: Make `version[]' __initdata
: Uninlined the read/write reg/word functions.
+ Oskar Schirmer : oskar@scara.com
+ : HiCO.SH4 (superh) support added (irq#1, cs89x0_media=)
+
*/
/* Always include 'config.h' first in case the user wants to turn on
@@ -156,6 +159,10 @@
static unsigned int netcard_portlist[] __initdata =
{ 0x80090303, 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
static unsigned int cs8900_irq_map[] = {12,0,0,0};
+#elif defined(CONFIG_SH_HICOSH4)
+static unsigned int netcard_portlist[] __initdata =
+ { 0x0300, 0};
+static unsigned int cs8900_irq_map[] = {1,0,0,0};
#else
static unsigned int netcard_portlist[] __initdata =
{ 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
@@ -247,6 +254,20 @@
__setup("cs89x0_dma=", dma_fn);
#endif /* !defined(MODULE) && (ALLOW_DMA != 0) */
+#ifndef MODULE
+static int g_cs89x0_media__force;
+
+static int __init media_fn(char *str)
+{
+ if (!strcmp(str, "rj45")) g_cs89x0_media__force = FORCE_RJ45;
+ else if (!strcmp(str, "aui")) g_cs89x0_media__force = FORCE_AUI;
+ else if (!strcmp(str, "bnc")) g_cs89x0_media__force = FORCE_BNC;
+ return 1;
+}
+
+__setup("cs89x0_media=", media_fn);
+#endif
+
/* Check for a network adaptor of this type, and return '0' iff one exists.
If dev->base_addr == 0, probe all likely locations.
@@ -383,6 +404,9 @@
lp->dmasize = 16; /* Could make this an option... */
}
#endif
+#ifndef MODULE
+ lp->force = g_cs89x0_media__force;
+#endif
}
lp = (struct net_local *)dev->priv;
@@ -394,6 +418,12 @@
goto out1;
}
+#ifdef CONFIG_SH_HICOSH4
+ /* truely reset the chip */
+ outw(0x0114, ioaddr + ADD_PORT);
+ outw(0x0040, ioaddr + DATA_PORT);
+#endif
+
/* if they give us an odd I/O address, then do ONE write to
the address port, to get it back to address zero, where we
expect to find the EISA signature word. An IO with a base of 0x3
@@ -413,7 +443,7 @@
}
printk("PP_addr=0x%x\n", inw(ioaddr + ADD_PORT));
- if (inw(ioaddr + DATA_PORT) != CHIP_EISA_ID_SIG) {
+ if (inw(ioaddr + DATA_PORT) != CHIP_EISA_ID_SIG) {
printk(KERN_ERR "%s: incorrect signature 0x%x\n",
dev->name, inw(ioaddr + DATA_PORT));
retval = -ENODEV;
@@ -454,6 +484,39 @@
EEPROM read on reset. So, if the chip says it read the EEPROM
the driver will always do *something* instead of complain that
adapter_cnf is 0. */
+
+#ifdef CONFIG_SH_HICOSH4
+ if (1) {
+ /* For the HiCO.SH4 board, things are different: we don't
+ have EEPROM, but there is some data in flash, so we go
+ get it there directly (MAC). */
+ __u16 *confd;
+ short cnt;
+ if (((* (volatile __u32 *) 0xa0013ff0) & 0x00ffffff)
+ == 0x006c3000) {
+ confd = (__u16*) 0xa0013fc0;
+ } else {
+ confd = (__u16*) 0xa001ffc0;
+ }
+ cnt = (*confd++ & 0x00ff) >> 1;
+ while (--cnt > 0) {
+ __u16 j = *confd++;
+
+ switch (j & 0x0fff) {
+ case PP_IA:
+ for (i = 0; i < ETH_ALEN/2; i++) {
+ dev->dev_addr[i*2] = confd[i] & 0xFF;
+ dev->dev_addr[i*2+1] = confd[i] >> 8;
+ }
+ break;
+ }
+ j = (j >> 12) + 1;
+ confd += j;
+ cnt -= j;
+ }
+ } else
+#endif
+
if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) ==
(EEPROM_OK|EEPROM_PRESENT)) {
/* Load the MAC. */
@@ -507,6 +570,11 @@
printk("\n");
/* First check to see if an EEPROM is attached. */
+#ifdef CONFIG_SH_HICOSH4 /* no EEPROM on HiCO, don't hazzle with it here */
+ if (1) {
+ printk(KERN_NOTICE "cs89x0: No EEPROM on HiCO.SH4\n");
+ } else
+#endif
if ((readreg(dev, PP_SelfST) & EEPROM_PRESENT) == 0)
printk(KERN_WARNING "cs89x0: No EEPROM, relying on command line....\n");
else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
@@ -616,10 +684,10 @@
}
/* print the ethernet address. */
- printk(", MAC ");
+ printk(", MAC");
for (i = 0; i < ETH_ALEN; i++)
{
- printk("%s%02x", i ? ":" : "", dev->dev_addr[i]);
+ printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
}
dev->open = net_open;
@@ -1046,6 +1114,7 @@
int i;
int ret;
+#ifndef CONFIG_SH_HICOSH4 /* uses irq#1, so this wont work */
if (dev->irq < 2) {
/* Allow interrupts to be generated by the chip */
/* Cirrus' release had this: */
@@ -1056,7 +1125,7 @@
writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
for (i = 2; i < CS8920_NO_INTS; i++) {
- if ((1 << dev->irq) & lp->irq_map) {
+ if ((1 << i) & lp->irq_map) {
if (request_irq(i, net_interrupt, 0, dev->name, dev) == 0) {
dev->irq = i;
write_irq(dev, lp->chip_type, i);
@@ -1072,7 +1141,10 @@
ret = -EAGAIN;
goto bad_out;
}
- } else {
+ }
+ else
+#endif
+ {
if (((1 << dev->irq) & lp->irq_map) == 0) {
printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
dev->name, dev->irq, lp->irq_map);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)