* [PATCH] H8/300 update (3/3) smc9194 driver
@ 2004-06-17 12:29 Yoshinori Sato
0 siblings, 0 replies; only message in thread
From: Yoshinori Sato @ 2004-06-17 12:29 UTC (permalink / raw)
To: Linus Torvalds; +Cc: linux kernel Mailing List
- H8/300 target support
- fixed irq support
- high address (>0xffff) i/o fix
--
Yoshinori Sato
<ysato@users.sourceforge.jp>
diff -ru -X .exclude-diff linux-2.6.7/drivers/net/smc9194.c linux-2.6.7-h8300/drivers/net/smc9194.c
--- linux-2.6.7/drivers/net/smc9194.c 2004-06-16 14:19:44.000000000 +0900
+++ linux-2.6.7-h8300/drivers/net/smc9194.c 2004-06-17 18:17:36.000000000 +0900
@@ -94,16 +94,51 @@
#define USE_32_BIT 1
#endif
+#if defined(__H8300H__) || defined(__H8300S__)
+#define NO_AUTOPROBE
+#undef insl
+#undef outsl
+#define insl(a,b,l) io_insl_noswap(a,b,l)
+#define outsl(a,b,l) io_outsl_noswap(a,b,l)
+#endif
+
/*
.the SMC9194 can be at any of the following port addresses. To change,
.for a slightly different card, you can add it to the array. Keep in
.mind that the array must end in zero.
*/
-static unsigned int smc_portlist[] __initdata = {
- 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0,
- 0x300, 0x320, 0x340, 0x360, 0x380, 0x3A0, 0x3C0, 0x3E0, 0
+
+struct devlist {
+ unsigned int port;
+ unsigned int irq;
};
+#if defined(CONFIG_H8S_EDOSK2674)
+static struct devlist smc_devlist[] __initdata = {
+ {.port = 0xf80000, .irq = 16},
+ {.port = 0, .irq = 0 },
+};
+#else
+static struct devlist smc_devlist[] __initdata = {
+ {.port = 0x200, .irq = 0},
+ {.port = 0x220, .irq = 0},
+ {.port = 0x240, .irq = 0},
+ {.port = 0x260, .irq = 0},
+ {.port = 0x280, .irq = 0},
+ {.port = 0x2A0, .irq = 0},
+ {.port = 0x2C0, .irq = 0},
+ {.port = 0x2E0, .irq = 0},
+ {.port = 0x300, .irq = 0},
+ {.port = 0x320, .irq = 0},
+ {.port = 0x340, .irq = 0},
+ {.port = 0x360, .irq = 0},
+ {.port = 0x380, .irq = 0},
+ {.port = 0x3A0, .irq = 0},
+ {.port = 0x3C0, .irq = 0},
+ {.port = 0x3E0, .irq = 0},
+ {.port = 0, .irq = 0},
+};
+#endif
/*
. Wait time for memory to be free. This probably shouldn't be
. tuned that much, as waiting for this means nothing else happens
@@ -466,7 +501,7 @@
static int smc_wait_to_send_packet( struct sk_buff * skb, struct net_device * dev )
{
struct smc_local *lp = netdev_priv(dev);
- unsigned short ioaddr = dev->base_addr;
+ unsigned int ioaddr = dev->base_addr;
word length;
unsigned short numPages;
word time_out;
@@ -580,7 +615,7 @@
byte packet_no;
struct sk_buff * skb = lp->saved_skb;
word length;
- unsigned short ioaddr;
+ unsigned int ioaddr;
byte * buf;
ioaddr = dev->base_addr;
@@ -635,7 +670,11 @@
#ifdef USE_32_BIT
if ( length & 0x2 ) {
outsl(ioaddr + DATA_1, buf, length >> 2 );
+#if !defined(__H8300H__) && !defined(__H8300S__)
outw( *((word *)(buf + (length & 0xFFFFFFFC))),ioaddr +DATA_1);
+#else
+ ctrl_outw( *((word *)(buf + (length & 0xFFFFFFFC))),ioaddr +DATA_1);
+#endif
}
else
outsl(ioaddr + DATA_1, buf, length >> 2 );
@@ -691,9 +730,12 @@
struct net_device * __init smc_init(int unit)
{
struct net_device *dev = alloc_etherdev(sizeof(struct smc_local));
- unsigned *port;
+ static struct devlist *smcdev = smc_devlist;
int err = 0;
+#ifndef NO_AUTOPROBE
+ smcdev = smc_devlist;
+#endif
if (!dev)
return ERR_PTR(-ENODEV);
@@ -711,11 +753,11 @@
} else if (io != 0) { /* Don't probe at all. */
err = -ENXIO;
} else {
- for (port = smc_portlist; *port; port++) {
- if (smc_probe(dev, *port) == 0)
+ for (;smcdev->port; smcdev++) {
+ if (smc_probe(dev, smcdev->port) == 0)
break;
}
- if (!*port)
+ if (!smcdev->port)
err = -ENODEV;
}
if (err)
@@ -741,6 +783,7 @@
*/
int __init smc_findirq( int ioaddr )
{
+#ifndef NO_AUTOPROBE
int timeout = 20;
unsigned long cookie;
@@ -795,6 +838,14 @@
/* and return what I found */
return probe_irq_off(cookie);
+#else /* NO_AUTOPROBE */
+ struct devlist *smcdev;
+ for (smcdev = smc_devlist; smcdev->port; smcdev++) {
+ if (smcdev->port == ioaddr)
+ return smcdev->irq;
+ }
+ return 0;
+#endif
}
/*----------------------------------------------------------------------
@@ -863,6 +914,7 @@
retval = -ENODEV;
goto err_out;
}
+#if !defined(CONFIG_H8S_EDOSK2674)
/* well, we've already written once, so hopefully another time won't
hurt. This time, I need to switch the bank register to bank 1,
so I can access the base address register */
@@ -877,6 +929,10 @@
retval = -ENODEV;
goto err_out;
}
+#else
+ (void)base_address_register; /* Warning suppression */
+#endif
+
/* check if the revision register is something that I recognize.
These might need to be added to later, as future revisions
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2004-06-17 12:30 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-17 12:29 [PATCH] H8/300 update (3/3) smc9194 driver Yoshinori Sato
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.