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 *);