From: Yoshinori Sato <ysato@users.sourceforge.jp>
To: Linus Torvalds <torvalds@transmeta.com>
Cc: linux kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH] H8/300 update (3/3) smc9194 driver
Date: Thu, 17 Jun 2004 21:29:00 +0900 [thread overview]
Message-ID: <m2hdtawepf.wl%ysato@users.sourceforge.jp> (raw)
- 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
reply other threads:[~2004-06-17 12:30 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2hdtawepf.wl%ysato@users.sourceforge.jp \
--to=ysato@users.sourceforge.jp \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@transmeta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.