summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1998-09-17 13:09:16 +0000
committerjkh <jkh@FreeBSD.org>1998-09-17 13:09:16 +0000
commitc37a0247ce62005f2dddf9bca7bc7b87c1b8bf64 (patch)
treeb98172d51d5bd7e79b7bcff515df19bbfbd0ca76
parentdb40924c4397b672cc6d0cb4bea6e336cfc03938 (diff)
downloadFreeBSD-src-c37a0247ce62005f2dddf9bca7bc7b87c1b8bf64.zip
FreeBSD-src-c37a0247ce62005f2dddf9bca7bc7b87c1b8bf64.tar.gz
MF22: Robert Swindells' patch for correct probing of more AMD cards.
Merged by: Max Khon <fjoe@iclub.nsu.ru>
-rw-r--r--sys/dev/lnc/if_lnc.c97
-rw-r--r--sys/dev/lnc/if_lncvar.h17
-rw-r--r--sys/i386/isa/if_lnc.c97
-rw-r--r--sys/i386/isa/if_lnc.h17
4 files changed, 154 insertions, 74 deletions
diff --git a/sys/dev/lnc/if_lnc.c b/sys/dev/lnc/if_lnc.c
index b8e3fbc..e31c600 100644
--- a/sys/dev/lnc/if_lnc.c
+++ b/sys/dev/lnc/if_lnc.c
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: if_lnc.c,v 1.44 1998/07/20 17:32:56 msmith Exp $
+ * $Id: if_lnc.c,v 1.45 1998/08/24 02:28:15 bde Exp $
*/
/*
@@ -117,6 +117,7 @@ struct lnc_softc {
int initialised;
int rap;
int rdp;
+ int bdp;
#ifdef DEBUG
int lnc_debug;
#endif
@@ -139,8 +140,12 @@ static char const * const ic_ident[] = {
"C-LANCE",
"PCnet-ISA",
"PCnet-ISA+",
+ "PCnet-ISA II",
"PCnet-32 VL-Bus",
- "PCnet-PCI", /* "can't happen" */
+ "PCnet-PCI",
+ "PCnet-PCI II",
+ "PCnet-FAST",
+ "PCnet-FAST+",
};
#ifdef LNC_MULTICAST
@@ -203,6 +208,20 @@ read_csr(struct lnc_softc *sc, u_short port)
return (inw(sc->rdp));
}
+static __inline void
+write_bcr(struct lnc_softc *sc, u_short port, u_short val)
+{
+ outw(sc->rap, port);
+ outw(sc->bdp, val);
+}
+
+static __inline u_short
+read_bcr(struct lnc_softc *sc, u_short port)
+{
+ outw(sc->rap, port);
+ return (inw(sc->bdp));
+}
+
#ifdef LNC_MULTICAST
static __inline u_long
ether_crc(u_char *ether_addr)
@@ -932,7 +951,8 @@ cnet98s_probe(struct lnc_softc *sc, unsigned iobase)
outw(iobase + CNET98S_RESET, tmp);
DELAY(500);
- if ((sc->nic.ic = pcnet_probe(sc)) == UNKNOWN) {
+ sc->nic.ic = pcnet_probe(sc);
+ if ((sc->nic.ic == UNKNOWN) || (sc->nic.ic > PCnet_32)) {
return (0);
}
@@ -987,7 +1007,8 @@ ne2100_probe(struct lnc_softc *sc, unsigned iobase)
sc->rap = iobase + PCNET_RAP;
sc->rdp = iobase + PCNET_RDP;
- if ((sc->nic.ic = pcnet_probe(sc))) {
+ sc->nic.ic = pcnet_probe(sc);
+ if ((sc->nic.ic > 0) && (sc->nic.ic < PCnet_PCI)) {
sc->nic.ident = NE2100;
sc->nic.mem_mode = DMA_FIXED;
@@ -1127,7 +1148,6 @@ pcnet_probe(struct lnc_softc *sc)
*/
if ((type = lance_probe(sc))) {
-
chip_id = read_csr(sc, CSR89);
chip_id <<= 16;
chip_id |= read_csr(sc, CSR88);
@@ -1138,21 +1158,18 @@ pcnet_probe(struct lnc_softc *sc)
return (PCnet_ISA);
case Am79C961:
return (PCnet_ISAplus);
+ case Am79C961A:
+ return (PCnet_ISA_II);
case Am79C965:
return (PCnet_32);
case Am79C970:
- /*
- * do NOT try to ISA attach the PCI version
- */
- return (0);
- case HITACHI_Am79C970:
-
- /*
- * PCI cards that should be attached in
- * ISA mode should return this value. -- tvf
- */
-
- return (PCnet_PCI);
+ return (PCnet_PCI);
+ case Am79C970A:
+ return (PCnet_PCI_II);
+ case Am79C971:
+ return (PCnet_FAST);
+ case Am79C972:
+ return (PCnet_FASTplus);
default:
break;
}
@@ -1204,7 +1221,9 @@ lnc_attach_sc(struct lnc_softc *sc, int unit)
*/
if ((sc->nic.mem_mode != SHMEM) && (kvtop(sc->recv_ring) > 0x1000000)) {
log(LOG_ERR, "lnc%d: Memory allocated above 16Mb limit\n", unit);
- if (sc->nic.ic != PCnet_PCI)
+ if ((sc->nic.ic != PCnet_PCI) &&
+ (sc->nic.ic != PCnet_PCI_II) &&
+ (sc->nic.ic != PCnet_FAST))
return (0);
}
@@ -1265,8 +1284,7 @@ lnc_attach(struct isa_device * isa_dev)
* and ether_ifattach() have been called in lnc_attach() ???
*/
if ((sc->nic.mem_mode != SHMEM) &&
- (sc->nic.ic != PCnet_32) &&
- (sc->nic.ic != PCnet_PCI))
+ (sc->nic.ic < PCnet_32))
isa_dmacascade(isa_dev->id_drq);
#endif
@@ -1277,22 +1295,35 @@ lnc_attach(struct isa_device * isa_dev)
void *
lnc_attach_ne2100_pci(int unit, unsigned iobase)
{
+ int i;
struct lnc_softc *sc = malloc(sizeof *sc, M_DEVBUF, M_NOWAIT);
if (sc) {
bzero (sc, sizeof *sc);
- /*
- * ne2100_probe sets sc->nic.ic to PCnet_PCI for PCI
- * cards that work in ISA emulation mode. The first
- * clause this code avoids attaching such a card at
- * this time to allow it to be picked up as an ISA
- * card later. -- tvf
- */
-
- if (((ne2100_probe(sc, iobase) == 0) ||
- sc->nic.ic == PCnet_PCI)
- || (lnc_attach_sc(sc, unit) == 0)) {
+ sc->rap = iobase + PCNET_RAP;
+ sc->rdp = iobase + PCNET_RDP;
+ sc->bdp = iobase + PCNET_BDP;
+
+ sc->nic.ic = pcnet_probe(sc);
+ if (sc->nic.ic >= PCnet_PCI) {
+ sc->nic.ident = NE2100;
+ sc->nic.mem_mode = DMA_FIXED;
+
+ /* XXX - For now just use the defines */
+ sc->nrdre = NRDRE;
+ sc->ntdre = NTDRE;
+
+ /* Extract MAC address from PROM */
+ for (i = 0; i < ETHER_ADDR_LEN; i++)
+ sc->arpcom.ac_enaddr[i] = inb(iobase + i);
+
+ if (lnc_attach_sc(sc, unit) == 0) {
+ free(sc, M_DEVBUF);
+ sc = NULL;
+ }
+ }
+ else {
free(sc, M_DEVBUF);
sc = NULL;
}
@@ -1514,7 +1545,8 @@ lncintr_sc(struct lnc_softc *sc)
* be missed.
*/
- outw(sc->rdp, IDON | CERR | BABL | MISS | MERR | RINT | TINT | INEA);
+/* outw(sc->rdp, IDON | CERR | BABL | MISS | MERR | RINT | TINT | INEA); */
+ outw(sc->rdp, csr0);
/* We don't do anything with the IDON flag */
@@ -1909,6 +1941,7 @@ lnc_dump_state(struct lnc_softc *sc)
printf("\n CSR0 = %b CSR1 = %x CSR2 = %x CSR3 = %x\n\n",
read_csr(sc, CSR0), CSR0_FLAGS, read_csr(sc, CSR1),
read_csr(sc, CSR2), read_csr(sc, CSR3));
+
/* Set RAP back to CSR0 */
outw(sc->rap, CSR0);
}
diff --git a/sys/dev/lnc/if_lncvar.h b/sys/dev/lnc/if_lncvar.h
index 8d628c7..8d9ffab 100644
--- a/sys/dev/lnc/if_lncvar.h
+++ b/sys/dev/lnc/if_lncvar.h
@@ -41,7 +41,7 @@
#define PCNET_RDP 0x10 /* Register Data Port */
#define PCNET_RAP 0x12 /* Register Address Port */
#define PCNET_RESET 0x14
-#define PCNET_IDP 0x16
+#define PCNET_BDP 0x16
#define PCNET_VSW 0x18
/* DEPCA port addresses */
@@ -72,18 +72,25 @@
#define LANCE 1 /* Am7990 */
#define C_LANCE 2 /* Am79C90 */
#define PCnet_ISA 3 /* Am79C960 */
-#define PCnet_ISAplus 4 /* Am79C961 */
-#define PCnet_32 5 /* Am79C965 */
-#define PCnet_PCI 6 /* Am79C970 */
+#define PCnet_ISAplus 4 /* Am79C961 */
+#define PCnet_ISA_II 5 /* Am79C961A */
+#define PCnet_32 6 /* Am79C965 */
+#define PCnet_PCI 7 /* Am79C970 */
+#define PCnet_PCI_II 8 /* Am79C970A */
+#define PCnet_FAST 9 /* Am79C971 */
+#define PCnet_FASTplus 10 /* Am79C972 */
/* CSR88-89: Chip ID masks */
#define AMD_MASK 0x003
#define PART_MASK 0xffff
#define Am79C960 0x0003
#define Am79C961 0x2260
+#define Am79C961A 0x2261
#define Am79C965 0x2430
#define Am79C970 0x0242
-#define HITACHI_Am79C970 0x2621
+#define Am79C970A 0x2621
+#define Am79C971 0x2623
+#define Am79C972 0x2624
/* Board types */
#define UNKNOWN 0
diff --git a/sys/i386/isa/if_lnc.c b/sys/i386/isa/if_lnc.c
index b8e3fbc..e31c600 100644
--- a/sys/i386/isa/if_lnc.c
+++ b/sys/i386/isa/if_lnc.c
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: if_lnc.c,v 1.44 1998/07/20 17:32:56 msmith Exp $
+ * $Id: if_lnc.c,v 1.45 1998/08/24 02:28:15 bde Exp $
*/
/*
@@ -117,6 +117,7 @@ struct lnc_softc {
int initialised;
int rap;
int rdp;
+ int bdp;
#ifdef DEBUG
int lnc_debug;
#endif
@@ -139,8 +140,12 @@ static char const * const ic_ident[] = {
"C-LANCE",
"PCnet-ISA",
"PCnet-ISA+",
+ "PCnet-ISA II",
"PCnet-32 VL-Bus",
- "PCnet-PCI", /* "can't happen" */
+ "PCnet-PCI",
+ "PCnet-PCI II",
+ "PCnet-FAST",
+ "PCnet-FAST+",
};
#ifdef LNC_MULTICAST
@@ -203,6 +208,20 @@ read_csr(struct lnc_softc *sc, u_short port)
return (inw(sc->rdp));
}
+static __inline void
+write_bcr(struct lnc_softc *sc, u_short port, u_short val)
+{
+ outw(sc->rap, port);
+ outw(sc->bdp, val);
+}
+
+static __inline u_short
+read_bcr(struct lnc_softc *sc, u_short port)
+{
+ outw(sc->rap, port);
+ return (inw(sc->bdp));
+}
+
#ifdef LNC_MULTICAST
static __inline u_long
ether_crc(u_char *ether_addr)
@@ -932,7 +951,8 @@ cnet98s_probe(struct lnc_softc *sc, unsigned iobase)
outw(iobase + CNET98S_RESET, tmp);
DELAY(500);
- if ((sc->nic.ic = pcnet_probe(sc)) == UNKNOWN) {
+ sc->nic.ic = pcnet_probe(sc);
+ if ((sc->nic.ic == UNKNOWN) || (sc->nic.ic > PCnet_32)) {
return (0);
}
@@ -987,7 +1007,8 @@ ne2100_probe(struct lnc_softc *sc, unsigned iobase)
sc->rap = iobase + PCNET_RAP;
sc->rdp = iobase + PCNET_RDP;
- if ((sc->nic.ic = pcnet_probe(sc))) {
+ sc->nic.ic = pcnet_probe(sc);
+ if ((sc->nic.ic > 0) && (sc->nic.ic < PCnet_PCI)) {
sc->nic.ident = NE2100;
sc->nic.mem_mode = DMA_FIXED;
@@ -1127,7 +1148,6 @@ pcnet_probe(struct lnc_softc *sc)
*/
if ((type = lance_probe(sc))) {
-
chip_id = read_csr(sc, CSR89);
chip_id <<= 16;
chip_id |= read_csr(sc, CSR88);
@@ -1138,21 +1158,18 @@ pcnet_probe(struct lnc_softc *sc)
return (PCnet_ISA);
case Am79C961:
return (PCnet_ISAplus);
+ case Am79C961A:
+ return (PCnet_ISA_II);
case Am79C965:
return (PCnet_32);
case Am79C970:
- /*
- * do NOT try to ISA attach the PCI version
- */
- return (0);
- case HITACHI_Am79C970:
-
- /*
- * PCI cards that should be attached in
- * ISA mode should return this value. -- tvf
- */
-
- return (PCnet_PCI);
+ return (PCnet_PCI);
+ case Am79C970A:
+ return (PCnet_PCI_II);
+ case Am79C971:
+ return (PCnet_FAST);
+ case Am79C972:
+ return (PCnet_FASTplus);
default:
break;
}
@@ -1204,7 +1221,9 @@ lnc_attach_sc(struct lnc_softc *sc, int unit)
*/
if ((sc->nic.mem_mode != SHMEM) && (kvtop(sc->recv_ring) > 0x1000000)) {
log(LOG_ERR, "lnc%d: Memory allocated above 16Mb limit\n", unit);
- if (sc->nic.ic != PCnet_PCI)
+ if ((sc->nic.ic != PCnet_PCI) &&
+ (sc->nic.ic != PCnet_PCI_II) &&
+ (sc->nic.ic != PCnet_FAST))
return (0);
}
@@ -1265,8 +1284,7 @@ lnc_attach(struct isa_device * isa_dev)
* and ether_ifattach() have been called in lnc_attach() ???
*/
if ((sc->nic.mem_mode != SHMEM) &&
- (sc->nic.ic != PCnet_32) &&
- (sc->nic.ic != PCnet_PCI))
+ (sc->nic.ic < PCnet_32))
isa_dmacascade(isa_dev->id_drq);
#endif
@@ -1277,22 +1295,35 @@ lnc_attach(struct isa_device * isa_dev)
void *
lnc_attach_ne2100_pci(int unit, unsigned iobase)
{
+ int i;
struct lnc_softc *sc = malloc(sizeof *sc, M_DEVBUF, M_NOWAIT);
if (sc) {
bzero (sc, sizeof *sc);
- /*
- * ne2100_probe sets sc->nic.ic to PCnet_PCI for PCI
- * cards that work in ISA emulation mode. The first
- * clause this code avoids attaching such a card at
- * this time to allow it to be picked up as an ISA
- * card later. -- tvf
- */
-
- if (((ne2100_probe(sc, iobase) == 0) ||
- sc->nic.ic == PCnet_PCI)
- || (lnc_attach_sc(sc, unit) == 0)) {
+ sc->rap = iobase + PCNET_RAP;
+ sc->rdp = iobase + PCNET_RDP;
+ sc->bdp = iobase + PCNET_BDP;
+
+ sc->nic.ic = pcnet_probe(sc);
+ if (sc->nic.ic >= PCnet_PCI) {
+ sc->nic.ident = NE2100;
+ sc->nic.mem_mode = DMA_FIXED;
+
+ /* XXX - For now just use the defines */
+ sc->nrdre = NRDRE;
+ sc->ntdre = NTDRE;
+
+ /* Extract MAC address from PROM */
+ for (i = 0; i < ETHER_ADDR_LEN; i++)
+ sc->arpcom.ac_enaddr[i] = inb(iobase + i);
+
+ if (lnc_attach_sc(sc, unit) == 0) {
+ free(sc, M_DEVBUF);
+ sc = NULL;
+ }
+ }
+ else {
free(sc, M_DEVBUF);
sc = NULL;
}
@@ -1514,7 +1545,8 @@ lncintr_sc(struct lnc_softc *sc)
* be missed.
*/
- outw(sc->rdp, IDON | CERR | BABL | MISS | MERR | RINT | TINT | INEA);
+/* outw(sc->rdp, IDON | CERR | BABL | MISS | MERR | RINT | TINT | INEA); */
+ outw(sc->rdp, csr0);
/* We don't do anything with the IDON flag */
@@ -1909,6 +1941,7 @@ lnc_dump_state(struct lnc_softc *sc)
printf("\n CSR0 = %b CSR1 = %x CSR2 = %x CSR3 = %x\n\n",
read_csr(sc, CSR0), CSR0_FLAGS, read_csr(sc, CSR1),
read_csr(sc, CSR2), read_csr(sc, CSR3));
+
/* Set RAP back to CSR0 */
outw(sc->rap, CSR0);
}
diff --git a/sys/i386/isa/if_lnc.h b/sys/i386/isa/if_lnc.h
index 8d628c7..8d9ffab 100644
--- a/sys/i386/isa/if_lnc.h
+++ b/sys/i386/isa/if_lnc.h
@@ -41,7 +41,7 @@
#define PCNET_RDP 0x10 /* Register Data Port */
#define PCNET_RAP 0x12 /* Register Address Port */
#define PCNET_RESET 0x14
-#define PCNET_IDP 0x16
+#define PCNET_BDP 0x16
#define PCNET_VSW 0x18
/* DEPCA port addresses */
@@ -72,18 +72,25 @@
#define LANCE 1 /* Am7990 */
#define C_LANCE 2 /* Am79C90 */
#define PCnet_ISA 3 /* Am79C960 */
-#define PCnet_ISAplus 4 /* Am79C961 */
-#define PCnet_32 5 /* Am79C965 */
-#define PCnet_PCI 6 /* Am79C970 */
+#define PCnet_ISAplus 4 /* Am79C961 */
+#define PCnet_ISA_II 5 /* Am79C961A */
+#define PCnet_32 6 /* Am79C965 */
+#define PCnet_PCI 7 /* Am79C970 */
+#define PCnet_PCI_II 8 /* Am79C970A */
+#define PCnet_FAST 9 /* Am79C971 */
+#define PCnet_FASTplus 10 /* Am79C972 */
/* CSR88-89: Chip ID masks */
#define AMD_MASK 0x003
#define PART_MASK 0xffff
#define Am79C960 0x0003
#define Am79C961 0x2260
+#define Am79C961A 0x2261
#define Am79C965 0x2430
#define Am79C970 0x0242
-#define HITACHI_Am79C970 0x2621
+#define Am79C970A 0x2621
+#define Am79C971 0x2623
+#define Am79C972 0x2624
/* Board types */
#define UNKNOWN 0
OpenPOWER on IntegriCloud