Commit 5c952629 authored by Andrew Morton's avatar Andrew Morton Committed by Christoph Hellwig

[PATCH] lance.c: fix for card with signature 0x52 0x49

From: Vesselin Kostadiov <vesselin@alphawave.com.au>

Problem: The lance.c driver did not work with my Racal Interlan EtherBlaster
card.

More info: I found that my card has a signature 0x52 0x49 that was not
recognized by the driver.

Explanation: Following your suggestion I created a static table with possible
signatures, not too different from the table in ni65.c.  The updated code
compares the first byte of the cards signature with the first byte of the
signatures from the table.  It this succeeds then it reads the second byte and
compares the whole signature with the values from the table.  This way the
minimal I/O reads approach is maintained.

Side effect: The previous version would missdetect cards with signatures 0x52
0x57 and 0x57 0x44.  This has been fixed as well.
parent d6176eae
...@@ -37,6 +37,9 @@ ...@@ -37,6 +37,9 @@
Get rid of check_region, check kmalloc return in lance_probe1 Get rid of check_region, check kmalloc return in lance_probe1
Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 11/01/2001 Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 11/01/2001
Reworked detection, added support for Racal InterLan EtherBlaster cards
Vesselin Kostadinov <vesok at yahoo dot com > - 22/4/2004
*/ */
static const char version[] = "lance.c:v1.15ac 1999/11/13 dplatt@3do.com, becker@cesdis.gsfc.nasa.gov\n"; static const char version[] = "lance.c:v1.15ac 1999/11/13 dplatt@3do.com, becker@cesdis.gsfc.nasa.gov\n";
...@@ -62,6 +65,26 @@ static unsigned int lance_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x360, ...@@ -62,6 +65,26 @@ static unsigned int lance_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x360,
static int lance_probe1(struct net_device *dev, int ioaddr, int irq, int options); static int lance_probe1(struct net_device *dev, int ioaddr, int irq, int options);
static int __init do_lance_probe(struct net_device *dev); static int __init do_lance_probe(struct net_device *dev);
static struct card {
char id_offset14;
char id_offset15;
} cards[] = {
{ //"normal"
.id_offset14 = 0x57,
.id_offset15 = 0x57,
},
{ //NI6510EB
.id_offset14 = 0x52,
.id_offset15 = 0x44,
},
{ //Racal InterLan EtherBlaster
.id_offset14 = 0x52,
.id_offset15 = 0x49,
},
};
#define NUM_CARDS 3
#ifdef LANCE_DEBUG #ifdef LANCE_DEBUG
static int lance_debug = LANCE_DEBUG; static int lance_debug = LANCE_DEBUG;
#else #else
...@@ -380,13 +403,20 @@ static int __init do_lance_probe(struct net_device *dev) ...@@ -380,13 +403,20 @@ static int __init do_lance_probe(struct net_device *dev)
"lance-probe"); "lance-probe");
if (r) { if (r) {
/* Detect "normal" 0x57 0x57 and the NI6510EB 0x52 0x44 /* Detect the card with minimal I/O reads */
signatures w/ minimal I/O reads */ char offset14 = inb(ioaddr + 14);
char offset15, offset14 = inb(ioaddr + 14); int card;
for (card = 0; card < NUM_CARDS; ++card)
if ((offset14 == 0x52 || offset14 == 0x57) && if (cards[card].id_offset14 == offset14)
((offset15 = inb(ioaddr + 15)) == 0x57 || break;
offset15 == 0x44)) { if (card < NUM_CARDS) {/*yes, the first byte matches*/
char offset15 = inb(ioaddr + 15);
for (card = 0; card < NUM_CARDS; ++card)
if ((cards[card].id_offset14 == offset14) &&
(cards[card].id_offset15 == offset15))
break;
}
if (card < NUM_CARDS) { /*Signature OK*/
result = lance_probe1(dev, ioaddr, 0, 0); result = lance_probe1(dev, ioaddr, 0, 0);
if (!result) { if (!result) {
struct lance_private *lp = dev->priv; struct lance_private *lp = dev->priv;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment