Module Name:    src
Committed By:   nonaka
Date:           Tue May  5 12:37:25 UTC 2009

Modified Files:
        src/sys/dev/ic: ne2000.c ne2000var.h

Log Message:
Added NE2000 with 8bit bus width support.
reviewd by tsutsui@ at tech-kern ML.


To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/sys/dev/ic/ne2000.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/ic/ne2000var.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/ne2000.c
diff -u src/sys/dev/ic/ne2000.c:1.61 src/sys/dev/ic/ne2000.c:1.62
--- src/sys/dev/ic/ne2000.c:1.61	Sun Apr  5 03:37:07 2009
+++ src/sys/dev/ic/ne2000.c	Tue May  5 12:37:24 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ne2000.c,v 1.61 2009/04/05 03:37:07 uwe Exp $	*/
+/*	$NetBSD: ne2000.c,v 1.62 2009/05/05 12:37:24 nonaka Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ne2000.c,v 1.61 2009/04/05 03:37:07 uwe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ne2000.c,v 1.62 2009/05/05 12:37:24 nonaka Exp $");
 
 #include "opt_ipkdb.h"
 
@@ -111,7 +111,7 @@
 	bus_space_tag_t asict = nsc->sc_asict;
 	bus_space_handle_t asich = nsc->sc_asich;
 	u_int8_t romdata[16];
-	int memsize, i, useword;
+	int memsize, i, useword, dmawidth;
 
 	/*
 	 * Detect it again unless caller specified it; this gives us
@@ -132,21 +132,28 @@
 	case NE2000_TYPE_NE1000:
 		memsize = 8192;
 		useword = 0;
+		dmawidth = NE2000_DMAWIDTH_8BIT;
 		break;
 	case NE2000_TYPE_NE2000:
 	case NE2000_TYPE_AX88190:		/* XXX really? */
 	case NE2000_TYPE_AX88790:
 		memsize = 8192 * 2;
 		useword = 1;
+		dmawidth = NE2000_DMAWIDTH_16BIT;
 		break;
 	case NE2000_TYPE_DL10019:
 	case NE2000_TYPE_DL10022:
 		memsize = 8192 * 3;
 		useword = 1;
+		dmawidth = NE2000_DMAWIDTH_16BIT;
 		break;
 	}
 
 	nsc->sc_useword = useword;
+	if (nsc->sc_dmawidth == NE2000_DMAWIDTH_UNKNOWN)
+		nsc->sc_dmawidth = dmawidth;
+	else
+		dmawidth = nsc->sc_dmawidth;
 
 	dsc->cr_proto = ED_CR_RD2;
 	if (nsc->sc_type == NE2000_TYPE_AX88190 ||
@@ -164,7 +171,8 @@
 	 *
 	 * NE1000 gets byte-wide DMA, NE2000 gets word-wide DMA.
 	 */
-	dsc->dcr_reg = ED_DCR_FT1 | ED_DCR_LS | (useword ? ED_DCR_WTS : 0);
+	dsc->dcr_reg = ED_DCR_FT1 | ED_DCR_LS |
+	    ((dmawidth == NE2000_DMAWIDTH_16BIT) ? ED_DCR_WTS : 0);
 
 	dsc->test_mem = ne2000_test_mem;
 	dsc->ring_copy = ne2000_ring_copy;
@@ -261,7 +269,8 @@
 			    ED_CR_RD2 | ED_CR_PAGE_0 | ED_CR_STA);
 			NIC_BARRIER(nict, nich);
 			/* Select word transfer. */
-			bus_space_write_1(nict, nich, ED_P0_DCR, ED_DCR_WTS);
+			bus_space_write_1(nict, nich, ED_P0_DCR,
+			    ((dmawidth == NE2000_DMAWIDTH_16BIT) ? ED_DCR_WTS : 0));
 			NIC_BARRIER(nict, nich);
 			ne2000_readmem(nict, nich, asict, asich,
 			    AX88190_NODEID_OFFSET, dsc->sc_enaddr,
@@ -308,7 +317,9 @@
 	static u_int8_t test_pattern[32] = "THIS is A memory TEST pattern";
 	u_int8_t test_buffer[32], tmp;
 	int i, rv = NE2000_TYPE_UNKNOWN;
+	int dmawidth = NE2000_DMAWIDTH_16BIT;
 
+ restart:
 	/* Reset the board. */
 #ifdef GWETHER
 	bus_space_write_1(asict, asich, NE2000_ASIC_RESET, 0);
@@ -424,8 +435,8 @@
 
 	if (memcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
 		/* not an NE1000 - try NE2000 */
-		bus_space_write_1(nict, nich, ED_P0_DCR,
-		    ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
+		bus_space_write_1(nict, nich, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS
+		    | ((dmawidth == NE2000_DMAWIDTH_16BIT) ? ED_DCR_WTS : 0));
 		bus_space_write_1(nict, nich, ED_P0_PSTART,
 		    16384 >> ED_PAGE_SHIFT);
 		bus_space_write_1(nict, nich, ED_P0_PSTOP,
@@ -440,13 +451,20 @@
 		ne2000_readmem(nict, nich, asict, asich, 16384, test_buffer,
 		    sizeof(test_buffer), 1);
 
-		if (memcmp(test_pattern, test_buffer, sizeof(test_pattern)))
+		if (memcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
+			if (dmawidth == NE2000_DMAWIDTH_16BIT) {
+				/* try 8bit dma */
+				dmawidth = NE2000_DMAWIDTH_8BIT;
+				goto restart;
+			}
 			goto out;	/* not an NE2000 either */
+		}
 
 		rv = NE2000_TYPE_NE2000;
 	} else {
 		/* We're an NE1000. */
 		rv = NE2000_TYPE_NE1000;
+		dmawidth = NE2000_DMAWIDTH_8BIT;
 	}
 
 	/* Clear any pending interrupts that might have occurred above. */
@@ -804,23 +822,25 @@
 	struct dp8390_softc *dp = &np->sc_dp8390;
 	bus_space_tag_t nict = dp->sc_regt;
 	bus_space_handle_t nich = dp->sc_regh;
-	int i, useword;
+	int i, useword, dmawidth;
 
 #ifdef GWETHER
 	/* Not supported (yet?) */
 	return -1;
 #endif
 
-	if (np->sc_type == 0)
+	if (np->sc_type == NE2000_TYPE_UNKNOWN)
 		np->sc_type = ne2000_detect(nict, nich,
 			np->sc_asict, np->sc_asich);
-	if (np->sc_type == 0)
+	if (np->sc_type == NE2000_TYPE_UNKNOWN)
 		return -1;
 
 	useword = np->sc_useword;
+	dmawidth = np->sc_dmawidth;
 
 	dp->cr_proto = ED_CR_RD2;
-	dp->dcr_reg = ED_DCR_FT1 | ED_DCR_LS | (useword ? ED_DCR_WTS : 0);
+	dp->dcr_reg = ED_DCR_FT1 | ED_DCR_LS |
+	    ((dmawidth == NE2000_DMAWIDTH_16BIT) ? ED_DCR_WTS : 0);
 	dp->rcr_proto = 0;
 
 	dp->test_mem = ne2000_test_mem;
@@ -876,7 +896,8 @@
 				ED_CR_RD2 | ED_CR_PAGE_0 | ED_CR_STA);
 			NIC_BARRIER(nict, nich);
 			/* Select word transfer */
-			bus_space_write_1(nict, nich, ED_P0_DCR, ED_DCR_WTS);
+			bus_space_write_1(nict, nich, ED_P0_DCR,
+			    ((dmawidth == NE2000_DMAWIDTH_16BIT) ? ED_DCR_WTS : 0));
 			ne2000_readmem(nict, nich, np->sc_asict, np->sc_asich,
 				AX88190_NODEID_OFFSET, kip->myenetaddr,
 				ETHER_ADDR_LEN, useword);

Index: src/sys/dev/ic/ne2000var.h
diff -u src/sys/dev/ic/ne2000var.h:1.20 src/sys/dev/ic/ne2000var.h:1.21
--- src/sys/dev/ic/ne2000var.h:1.20	Sun Apr  5 03:37:07 2009
+++ src/sys/dev/ic/ne2000var.h	Tue May  5 12:37:24 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ne2000var.h,v 1.20 2009/04/05 03:37:07 uwe Exp $	*/
+/*	$NetBSD: ne2000var.h,v 1.21 2009/05/05 12:37:24 nonaka Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -49,6 +49,11 @@
 		NE2000_TYPE_AX88790
 	} sc_type;
 	int sc_useword;
+	enum {
+		NE2000_DMAWIDTH_UNKNOWN = 0,
+		NE2000_DMAWIDTH_16BIT,
+		NE2000_DMAWIDTH_8BIT,
+	} sc_dmawidth;
 };
 
 int	ne2000_attach(struct ne2000_softc *, u_int8_t *);

Reply via email to