diff options
author | Brooks Davis <brooks@FreeBSD.org> | 2019-05-17 15:22:45 +0000 |
---|---|---|
committer | Brooks Davis <brooks@FreeBSD.org> | 2019-05-17 15:22:45 +0000 |
commit | e1edf1240b33fc56a5f466f15ed4020a0a1ee976 (patch) | |
tree | eeb422b8a0b989bcf0eb854a5029b3d7fba11e3f | |
parent | 9e774e53407b056f30946569fa33fee7189dac3b (diff) | |
download | src-test2-e1edf1240b33fc56a5f466f15ed4020a0a1ee976.tar.gz src-test2-e1edf1240b33fc56a5f466f15ed4020a0a1ee976.zip |
Notes
-rw-r--r-- | ObsoleteFiles.inc | 1 | ||||
-rw-r--r-- | share/man/man4/man4.i386/Makefile | 1 | ||||
-rw-r--r-- | share/man/man4/man4.i386/cs.4 | 160 | ||||
-rw-r--r-- | sys/conf/files | 3 | ||||
-rw-r--r-- | sys/dev/cs/if_cs.c | 1229 | ||||
-rw-r--r-- | sys/dev/cs/if_cs_isa.c | 123 | ||||
-rw-r--r-- | sys/dev/cs/if_cs_pccard.c | 121 | ||||
-rw-r--r-- | sys/dev/cs/if_csreg.h | 590 | ||||
-rw-r--r-- | sys/dev/cs/if_csvar.h | 82 | ||||
-rw-r--r-- | sys/i386/conf/GENERIC | 1 | ||||
-rw-r--r-- | sys/i386/conf/NOTES | 2 | ||||
-rw-r--r-- | sys/modules/Makefile | 2 | ||||
-rw-r--r-- | sys/modules/cs/Makefile | 9 |
13 files changed, 1 insertions, 2323 deletions
diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index d4f3cbef408f..646a7453283b 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -40,6 +40,7 @@ # 20190518: Remove obsolete 10 and 10/100 ethernet drivers. OLD_FILES+=usr/share/man/man4/bm.4 +OLD_FILES+=usr/share/man/man4/cs.4 # 20190513: libcap_sysctl interface change OLD_FILES+=lib/casper/libcap_sysctl.1 # 20190509: tests/sys/opencrypto requires the net/py-dpkt package. diff --git a/share/man/man4/man4.i386/Makefile b/share/man/man4/man4.i386/Makefile index d956581d4278..605e204e7389 100644 --- a/share/man/man4/man4.i386/Makefile +++ b/share/man/man4/man4.i386/Makefile @@ -6,7 +6,6 @@ MAN= apm.4 \ ce.4 \ cp.4 \ CPU_ELAN.4 \ - cs.4 \ ctau.4 \ cx.4 \ ep.4 \ diff --git a/share/man/man4/man4.i386/cs.4 b/share/man/man4/man4.i386/cs.4 deleted file mode 100644 index 49dc438ba937..000000000000 --- a/share/man/man4/man4.i386/cs.4 +++ /dev/null @@ -1,160 +0,0 @@ -.\" -.\" Copyright (c) 1998 Michael Smith -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd October 24 2018 -.Dt CS 4 i386 -.Os -.Sh NAME -.Nm cs -.Nd "Ethernet device driver" -.Sh SYNOPSIS -To compile this driver into the kernel, -place the following line in your -kernel configuration file: -.Bd -ragged -offset indent -.Cd "device cs" -.Ed -.Pp -Alternatively, to load the driver as a -module at boot time, place the following line in -.Xr loader.conf 5 : -.Bd -literal -offset indent -if_cs_load="YES" -.Ed -.Pp -In -.Pa /boot/device.hints : -.Cd hint.cs.0.at="isa" -.Cd hint.cs.0.port="0x300" -.Cd hint.cs.0.irq="10" -.Cd hint.cs.0.maddr="0xd000" -.Sh DEPRECATION NOTICE -The -.Nm -driver is not present in -.Fx 13.0 -and later. -See https://github.com/freebsd/fcp/blob/master/fcp-0101.md for more -information. -.Sh DESCRIPTION -The -.Nm -driver provides support for ISA Ethernet adapters based on the -.Tn Crystal Semiconductor CS8900 -and -.Tn CS8920 -NICs. -These devices are used on the -.Tn IBM EtherJet ISA -adapters and in many embedded applications where the high integration, small -size and low cost of the CS89x0 family compensate for their drawbacks. -.Pp -The -.Nm -driver will obtain configuration parameters either from -.Pa /boot/device.hints -or from the card. -At least the I/O port number must be specified. -Other parameters specified in -.Pa /boot/device.hints -will be used if present; -the card may be soft-configured so these may be any valid -value. -Adapters based on the CS8920 normally offer PnP configuration and the driver -will detect the -.Tn IBM EtherJet -and the -.Tn CSC6040 -adapters automatically. -.Pp -Note that the CS8900 is limited to 4 IRQ values; these are normally implemented -as 5, 10, 11 and 12. -The CS8920 has no such limitation. -.Pp -Memory-mapped and DMA operation are not supported at this time. -.Pp -In addition to the ISA devices, the PC Card devices based on the CS889x0 -family are also supported. -The IBM EtherJet PCMCIA Card is the only known device based on this -chip. -The PC Card support does not need the above specific ISA hints to work. -The PC Card support may not work for 10base2 (thinnet) connections and may -bogusly claim to support 10base5 (there are no known cards that have an -AUI necessary for 10base5 support on their dongles). -.Sh DIAGNOSTICS -.Bl -diag -.It "cs%d: full/half duplex negotiation timeout" -The attempt to negotiate duplex settings with the hub timed out. -This may -indicate a cabling problem or a faulty or incompatible hub. -.It "cs%d: failed to enable <media>" -The CS89x0 failed to select the nominated media, either because it is not -present or not operating correctly. -.It "cs%d: No EEPROM, assuming defaults" -The CS89x0 does not have an EEPROM, or the EEPROM is hopelessly damaged. -Operation -will only be successful if the configuration entry lists suitable values for -the adapter. -.It "cs%d: Invalid irq" -The IRQ specified in the configuration entry is not valid for the adapter. -.It "cs%d: Could not allocate memory for NIC" -There is a critical memory shortage. -The adapter will not function. -.It "cs%d: Adapter has no media" -The adapter is not configured for a specific media type. -The media type will have -to be manually set. -.It "This is a %s, but LDN %d is disabled" -The PnP probe code found a recognised adapter, but the adapter is disabled. -.It "failed to read pnp parms" -A PnP adapter was found, but configuration parameters for it could not be read. -.It "failed to pnp card parameters" -The parameters obtained via PnP were not accepted by the driver. -The adapter -may not function. -.El -.Sh SEE ALSO -.Xr arp 4 , -.Xr netintro 4 , -.Xr ng_ether 4 , -.Xr ifconfig 8 -.Sh AUTHORS -.An -nosplit -The -.Nm -device driver was written by -.An Maxim Bolotin -and -.An Oleg Sharoiko . -This manpage was written by -.An Michael Smith . -.Sh CAVEATS -The CS89x0 family of adapters have a very small RAM buffer (4K). -This may -cause problems with extremely high network loads or bursty network traffic. -In particular, NFS operations should be limited to 1k read/write transactions -in order to avoid overruns. diff --git a/sys/conf/files b/sys/conf/files index 858983475bdb..2717c9a370f7 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1358,9 +1358,6 @@ dev/ciss/ciss.c optional ciss dev/cmx/cmx.c optional cmx dev/cmx/cmx_pccard.c optional cmx pccard dev/cpufreq/ichss.c optional cpufreq pci -dev/cs/if_cs.c optional cs -dev/cs/if_cs_isa.c optional cs isa -dev/cs/if_cs_pccard.c optional cs pccard dev/cxgb/cxgb_main.c optional cxgb pci \ compile-with "${NORMAL_C} -I$S/dev/cxgb" dev/cxgb/cxgb_sge.c optional cxgb pci \ diff --git a/sys/dev/cs/if_cs.c b/sys/dev/cs/if_cs.c deleted file mode 100644 index 79857f5b9077..000000000000 --- a/sys/dev/cs/if_cs.c +++ /dev/null @@ -1,1229 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1997,1998 Maxim Bolotin and Oleg Sharoiko. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * - * Device driver for Crystal Semiconductor CS8920 based ethernet - * adapters. By Maxim Bolotin and Oleg Sharoiko, 27-April-1997 - */ - -/* -#define CS_DEBUG - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/kernel.h> -#include <sys/sysctl.h> -#include <sys/syslog.h> - -#include <sys/module.h> -#include <sys/bus.h> -#include <machine/bus.h> -#include <sys/rman.h> -#include <machine/resource.h> - -#include <net/if.h> -#include <net/if_var.h> -#include <net/if_arp.h> -#include <net/if_dl.h> -#include <net/if_media.h> -#include <net/if_types.h> -#include <net/ethernet.h> -#include <net/bpf.h> - -#include <dev/cs/if_csvar.h> -#include <dev/cs/if_csreg.h> - -#ifdef CS_USE_64K_DMA -#define CS_DMA_BUFFER_SIZE 65536 -#else -#define CS_DMA_BUFFER_SIZE 16384 -#endif - -static void cs_init(void *); -static void cs_init_locked(struct cs_softc *); -static int cs_ioctl(struct ifnet *, u_long, caddr_t); -static void cs_start(struct ifnet *); -static void cs_start_locked(struct ifnet *); -static void cs_stop(struct cs_softc *); -static void cs_reset(struct cs_softc *); -static void cs_watchdog(void *); - -static int cs_mediachange(struct ifnet *); -static void cs_mediastatus(struct ifnet *, struct ifmediareq *); -static int cs_mediaset(struct cs_softc *, int); - -static void cs_write_mbufs(struct cs_softc*, struct mbuf*); -static void cs_xmit_buf(struct cs_softc*); -static int cs_get_packet(struct cs_softc*); -static void cs_setmode(struct cs_softc*); - -static int get_eeprom_data(struct cs_softc *sc, int, int, uint16_t *); -static int get_eeprom_cksum(int, int, uint16_t *); -static int wait_eeprom_ready( struct cs_softc *); -static void control_dc_dc( struct cs_softc *, int ); -static int enable_tp(struct cs_softc *); -static int enable_aui(struct cs_softc *); -static int enable_bnc(struct cs_softc *); -static int cs_duplex_auto(struct cs_softc *); - -devclass_t cs_devclass; -driver_intr_t csintr; - -/* sysctl vars */ -static SYSCTL_NODE(_hw, OID_AUTO, cs, CTLFLAG_RD, 0, "cs device parameters"); - -int cs_ignore_cksum_failure = 0; -SYSCTL_INT(_hw_cs, OID_AUTO, ignore_checksum_failure, CTLFLAG_RWTUN, - &cs_ignore_cksum_failure, 0, - "ignore checksum errors in cs card EEPROM"); - -static int cs_recv_delay = 570; -SYSCTL_INT(_hw_cs, OID_AUTO, recv_delay, CTLFLAG_RWTUN, &cs_recv_delay, 570, ""); - -static int cs8900_eeint2irq[16] = { - 10, 11, 12, 5, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255 -}; - -static int cs8900_irq2eeint[16] = { - 255, 255, 255, 255, 255, 3, 255, 255, - 255, 0, 1, 2, 255, 255, 255, 255 -}; - -static int -get_eeprom_data(struct cs_softc *sc, int off, int len, uint16_t *buffer) -{ - int i; - -#ifdef CS_DEBUG - device_printf(sc->dev, "EEPROM data from %x for %x:\n", off, len); -#endif - for (i=0; i < len; i++) { - if (wait_eeprom_ready(sc) < 0) - return (-1); - /* Send command to EEPROM to read */ - cs_writereg(sc, PP_EECMD, (off + i) | EEPROM_READ_CMD); - if (wait_eeprom_ready(sc) < 0) - return (-1); - buffer[i] = cs_readreg(sc, PP_EEData); - -#ifdef CS_DEBUG - printf("%04x ",buffer[i]); -#endif - } - -#ifdef CS_DEBUG - printf("\n"); -#endif - return (0); -} - -static int -get_eeprom_cksum(int off, int len, uint16_t *buffer) -{ - int i; - uint16_t cksum=0; - - for (i = 0; i < len; i++) - cksum += buffer[i]; - cksum &= 0xffff; - if (cksum == 0 || cs_ignore_cksum_failure) - return (0); - return (-1); -} - -static int -wait_eeprom_ready(struct cs_softc *sc) -{ - int i; - - /* - * From the CS8900A datasheet, section 3.5.2: - * "Before issuing any command to the EEPROM, the host must wait - * for the SIBUSY bit (Register 16, SelfST, bit 8) to clear. After - * each command has been issued, the host must wait again for SIBUSY - * to clear." - * - * Before we issue the command, we should be !busy, so that will - * be fast. The datasheet suggests that clock out from the part - * per word will be on the order of 25us, which is consistent with - * the 1MHz serial clock and 16bits... We should never hit 100, - * let alone 15,000 here. The original code did an unconditional - * 30ms DELAY here. Bad Kharma. cs_readreg takes ~2us. - */ - for (i = 0; i < 15000; i++) /* 30ms max */ - if (!(cs_readreg(sc, PP_SelfST) & SI_BUSY)) - return (0); - return (1); -} - -static void -control_dc_dc(struct cs_softc *sc, int on_not_off) -{ - unsigned int self_control = HCB1_ENBL; - - if (((sc->adapter_cnf & A_CNF_DC_DC_POLARITY)!=0) ^ on_not_off) - self_control |= HCB1; - else - self_control &= ~HCB1; - cs_writereg(sc, PP_SelfCTL, self_control); - DELAY(500000); /* Bad! */ -} - - -static int -cs_duplex_auto(struct cs_softc *sc) -{ - int i, error=0; - - cs_writereg(sc, PP_AutoNegCTL, - RE_NEG_NOW | ALLOW_FDX | AUTO_NEG_ENABLE); - for (i=0; cs_readreg(sc, PP_AutoNegST) & AUTO_NEG_BUSY; i++) { - if (i > 4000) { - device_printf(sc->dev, - "full/half duplex auto negotiation timeout\n"); - error = ETIMEDOUT; - break; - } - DELAY(1000); - } - return (error); -} - -static int -enable_tp(struct cs_softc *sc) -{ - - cs_writereg(sc, PP_LineCTL, sc->line_ctl & ~AUI_ONLY); - control_dc_dc(sc, 0); - return (0); -} - -static int -enable_aui(struct cs_softc *sc) -{ - - cs_writereg(sc, PP_LineCTL, - (sc->line_ctl & ~AUTO_AUI_10BASET) | AUI_ONLY); - control_dc_dc(sc, 0); - return (0); -} - -static int -enable_bnc(struct cs_softc *sc) -{ - - cs_writereg(sc, PP_LineCTL, - (sc->line_ctl & ~AUTO_AUI_10BASET) | AUI_ONLY); - control_dc_dc(sc, 1); - return (0); -} - -int -cs_cs89x0_probe(device_t dev) -{ - int i; - int error; - rman_res_t irq, junk; - struct cs_softc *sc = device_get_softc(dev); - unsigned rev_type = 0; - uint16_t id; - char chip_revision; - uint16_t eeprom_buff[CHKSUM_LEN]; - int chip_type, pp_isaint; - - sc->dev = dev; - error = cs_alloc_port(dev, 0, CS_89x0_IO_PORTS); - if (error) - return (error); - - if ((cs_inw(sc, ADD_PORT) & ADD_MASK) != ADD_SIG) { - /* Chip not detected. Let's try to reset it */ - if (bootverbose) - device_printf(dev, "trying to reset the chip.\n"); - cs_outw(sc, ADD_PORT, PP_SelfCTL); - i = cs_inw(sc, DATA_PORT); - cs_outw(sc, ADD_PORT, PP_SelfCTL); - cs_outw(sc, DATA_PORT, i | POWER_ON_RESET); - if ((cs_inw(sc, ADD_PORT) & ADD_MASK) != ADD_SIG) - return (ENXIO); - } - - for (i = 0; i < 10000; i++) { - id = cs_readreg(sc, PP_ChipID); - if (id == CHIP_EISA_ID_SIG) - break; - } - if (i == 10000) - return (ENXIO); - - rev_type = cs_readreg(sc, PRODUCT_ID_ADD); - chip_type = rev_type & ~REVISON_BITS; - chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A'; - - sc->chip_type = chip_type; - - if (chip_type == CS8900) { - pp_isaint = PP_CS8900_ISAINT; - sc->send_cmd = TX_CS8900_AFTER_ALL; - } else { - pp_isaint = PP_CS8920_ISAINT; - sc->send_cmd = TX_CS8920_AFTER_ALL; - } - - /* - * Clear some fields so that fail of EEPROM will left them clean - */ - sc->auto_neg_cnf = 0; - sc->adapter_cnf = 0; - sc->isa_config = 0; - - /* - * If no interrupt specified, use what the board tells us. - */ - error = bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, &junk); - - /* - * Get data from EEPROM - */ - if((cs_readreg(sc, PP_SelfST) & EEPROM_PRESENT) == 0) { - device_printf(dev, "No EEPROM, assuming defaults.\n"); - } else if (get_eeprom_data(sc,START_EEPROM_DATA,CHKSUM_LEN, eeprom_buff)<0) { - device_printf(dev, "EEPROM read failed, assuming defaults.\n"); - } else if (get_eeprom_cksum(START_EEPROM_DATA,CHKSUM_LEN, eeprom_buff)<0) { - device_printf(dev, "EEPROM cheksum bad, assuming defaults.\n"); - } else { - sc->auto_neg_cnf = eeprom_buff[AUTO_NEG_CNF_OFFSET]; - sc->adapter_cnf = eeprom_buff[ADAPTER_CNF_OFFSET]; - sc->isa_config = eeprom_buff[ISA_CNF_OFFSET]; - for (i=0; i<ETHER_ADDR_LEN/2; i++) { - sc->enaddr[i*2] = eeprom_buff[i]; - sc->enaddr[i*2+1] = eeprom_buff[i] >> 8; - } - /* - * If no interrupt specified, use what the - * board tells us. - */ - if (error) { - irq = sc->isa_config & INT_NO_MASK; - error = 0; - if (chip_type == CS8900) { - irq = cs8900_eeint2irq[irq]; - } else { - if (irq > CS8920_NO_INTS) - irq = 255; - } - if (irq == 255) { - device_printf(dev, "invalid irq in EEPROM.\n"); - error = EINVAL; - } - if (!error) - bus_set_resource(dev, SYS_RES_IRQ, 0, - irq, 1); - } - } - - if (!error && !(sc->flags & CS_NO_IRQ)) { - if (chip_type == CS8900) { - if (irq < 16) - irq = cs8900_irq2eeint[irq]; - else - irq = 255; - } else { - if (irq > CS8920_NO_INTS) - irq = 255; - } - if (irq == 255) - error = EINVAL; - } - - if (error) { - device_printf(dev, "Unknown or invalid irq\n"); - return (error); - } - - if (!(sc->flags & CS_NO_IRQ)) - cs_writereg(sc, pp_isaint, irq); - - if (bootverbose) - device_printf(dev, "CS89%c0%s rev %c media%s%s%s\n", - chip_type == CS8900 ? '0' : '2', - chip_type == CS8920M ? "M" : "", - chip_revision, - (sc->adapter_cnf & A_CNF_10B_T) ? " TP" : "", - (sc->adapter_cnf & A_CNF_AUI) ? " AUI" : "", - (sc->adapter_cnf & A_CNF_10B_2) ? " BNC" : ""); - - if ((sc->adapter_cnf & A_CNF_EXTND_10B_2) && - (sc->adapter_cnf & A_CNF_LOW_RX_SQUELCH)) - sc->line_ctl = LOW_RX_SQUELCH; - else - sc->line_ctl = 0; - - return (0); -} - -/* - * Allocate a port resource with the given resource id. - */ -int -cs_alloc_port(device_t dev, int rid, int size) -{ - struct cs_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - size, RF_ACTIVE); - if (res == NULL) - return (ENOENT); - sc->port_rid = rid; - sc->port_res = res; - return (0); -} - -/* - * Allocate an irq resource with the given resource id. - */ -int -cs_alloc_irq(device_t dev, int rid) -{ - struct cs_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); - if (res == NULL) - return (ENOENT); - sc->irq_rid = rid; - sc->irq_res = res; - return (0); -} - -/* - * Release all resources - */ -void -cs_release_resources(device_t dev) -{ - struct cs_softc *sc = device_get_softc(dev); - - if (sc->port_res) { - bus_release_resource(dev, SYS_RES_IOPORT, - sc->port_rid, sc->port_res); - sc->port_res = 0; - } - if (sc->irq_res) { - bus_release_resource(dev, SYS_RES_IRQ, - sc->irq_rid, sc->irq_res); - sc->irq_res = 0; - } -} - -/* - * Install the interface into kernel networking data structures - */ -int -cs_attach(device_t dev) -{ - int error, media=0; - struct cs_softc *sc = device_get_softc(dev); - struct ifnet *ifp; - - sc->dev = dev; - - ifp = sc->ifp = if_alloc(IFT_ETHER); - if (ifp == NULL) { - device_printf(dev, "can not if_alloc()\n"); - cs_release_resources(dev); - return (ENOMEM); - } - - mtx_init(&sc->lock, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF); - callout_init_mtx(&sc->timer, &sc->lock, 0); - - CS_LOCK(sc); - cs_stop(sc); - CS_UNLOCK(sc); - - ifp->if_softc=sc; - if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_start=cs_start; - ifp->if_ioctl=cs_ioctl; - ifp->if_init=cs_init; - IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); - - ifp->if_flags=(IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); - - /* - * this code still in progress (DMA support) - * - - sc->recv_ring=malloc(CS_DMA_BUFFER_SIZE<<1, M_DEVBUF, M_NOWAIT); - if (sc->recv_ring == NULL) { - log(LOG_ERR, - "%s: Couldn't allocate memory for NIC\n", ifp->if_xname); - return(0); - } - if ((sc->recv_ring-(sc->recv_ring & 0x1FFFF)) - < (128*1024-CS_DMA_BUFFER_SIZE)) - sc->recv_ring+=16*1024; - - */ - - sc->buffer=malloc(ETHER_MAX_LEN-ETHER_CRC_LEN,M_DEVBUF,M_NOWAIT); - if (sc->buffer == NULL) { - device_printf(sc->dev, "Couldn't allocate memory for NIC\n"); - if_free(ifp); - mtx_destroy(&sc->lock); - cs_release_resources(dev); - return(ENOMEM); - } - - /* - * Initialize the media structures. - */ - ifmedia_init(&sc->media, 0, cs_mediachange, cs_mediastatus); - - if (sc->adapter_cnf & A_CNF_10B_T) { - ifmedia_add(&sc->media, IFM_ETHER|IFM_10_T, 0, NULL); - if (sc->chip_type != CS8900) { - ifmedia_add(&sc->media, - IFM_ETHER|IFM_10_T|IFM_FDX, 0, NULL); - ifmedia_add(&sc->media, - IFM_ETHER|IFM_10_T|IFM_HDX, 0, NULL); - } - } - - if (sc->adapter_cnf & A_CNF_10B_2) - ifmedia_add(&sc->media, IFM_ETHER|IFM_10_2, 0, NULL); - - if (sc->adapter_cnf & A_CNF_AUI) - ifmedia_add(&sc->media, IFM_ETHER|IFM_10_5, 0, NULL); - - if (sc->adapter_cnf & A_CNF_MEDIA) - ifmedia_add(&sc->media, IFM_ETHER|IFM_AUTO, 0, NULL); - - /* Set default media from EEPROM */ - switch (sc->adapter_cnf & A_CNF_MEDIA_TYPE) { - case A_CNF_MEDIA_AUTO: media = IFM_ETHER|IFM_AUTO; break; - case A_CNF_MEDIA_10B_T: media = IFM_ETHER|IFM_10_T; break; - case A_CNF_MEDIA_10B_2: media = IFM_ETHER|IFM_10_2; break; - case A_CNF_MEDIA_AUI: media = IFM_ETHER|IFM_10_5; break; - default: - device_printf(sc->dev, "no media, assuming 10baseT\n"); - sc->adapter_cnf |= A_CNF_10B_T; - ifmedia_add(&sc->media, IFM_ETHER|IFM_10_T, 0, NULL); - if (sc->chip_type != CS8900) { - ifmedia_add(&sc->media, - IFM_ETHER|IFM_10_T|IFM_FDX, 0, NULL); - ifmedia_add(&sc->media, - IFM_ETHER|IFM_10_T|IFM_HDX, 0, NULL); - } - media = IFM_ETHER | IFM_10_T; - break; - } - ifmedia_set(&sc->media, media); - cs_mediaset(sc, media); - - ether_ifattach(ifp, sc->enaddr); - - error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, - NULL, csintr, sc, &sc->irq_handle); - if (error) { - ether_ifdetach(ifp); - free(sc->buffer, M_DEVBUF); - if_free(ifp); - mtx_destroy(&sc->lock); - cs_release_resources(dev); - return (error); - } - - gone_by_fcp101_dev(dev); - - return (0); -} - -int -cs_detach(device_t dev) -{ - struct cs_softc *sc; - struct ifnet *ifp; - - sc = device_get_softc(dev); - ifp = sc->ifp; - - CS_LOCK(sc); - cs_stop(sc); - CS_UNLOCK(sc); - callout_drain(&sc->timer); - ether_ifdetach(ifp); - bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); - cs_release_resources(dev); - free(sc->buffer, M_DEVBUF); - if_free(ifp); - mtx_destroy(&sc->lock); - return (0); -} - -/* - * Initialize the board - */ -static void -cs_init(void *xsc) -{ - struct cs_softc *sc=(struct cs_softc *)xsc; - - CS_LOCK(sc); - cs_init_locked(sc); - CS_UNLOCK(sc); -} - -static void -cs_init_locked(struct cs_softc *sc) -{ - struct ifnet *ifp = sc->ifp; - int i, rx_cfg; - - /* - * reset watchdog timer - */ - sc->tx_timeout = 0; - sc->buf_len = 0; - - /* - * Hardware initialization of cs - */ - - /* Enable receiver and transmitter */ - cs_writereg(sc, PP_LineCTL, - cs_readreg(sc, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON); - - /* Configure the receiver mode */ - cs_setmode(sc); - - /* - * This defines what type of frames will cause interrupts - * Bad frames should generate interrupts so that the driver - * could track statistics of discarded packets - */ - rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | - RX_EXTRA_DATA_ENBL; - if (sc->isa_config & STREAM_TRANSFER) - rx_cfg |= RX_STREAM_ENBL; - cs_writereg(sc, PP_RxCFG, rx_cfg); - cs_writereg(sc, PP_TxCFG, TX_LOST_CRS_ENBL | - TX_SQE_ERROR_ENBL | TX_OK_ENBL | TX_LATE_COL_ENBL | - TX_JBR_ENBL | TX_ANY_COL_ENBL | TX_16_COL_ENBL); - cs_writereg(sc, PP_BufCFG, READY_FOR_TX_ENBL | - RX_MISS_COUNT_OVRFLOW_ENBL | TX_COL_COUNT_OVRFLOW_ENBL | - TX_UNDERRUN_ENBL /*| RX_DMA_ENBL*/); - - /* Write MAC address into IA filter */ - for (i=0; i<ETHER_ADDR_LEN/2; i++) - cs_writereg(sc, PP_IA + i * 2, - sc->enaddr[i * 2] | - (sc->enaddr[i * 2 + 1] << 8) ); - - /* - * Now enable everything - */ -/* -#ifdef CS_USE_64K_DMA - cs_writereg(sc, PP_BusCTL, ENABLE_IRQ | RX_DMA_SIZE_64K); -#else - cs_writereg(sc, PP_BusCTL, ENABLE_IRQ); -#endif -*/ - cs_writereg(sc, PP_BusCTL, ENABLE_IRQ); - - /* - * Set running and clear output active flags - */ - sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; - sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - callout_reset(&sc->timer, hz, cs_watchdog, sc); - - /* - * Start sending process - */ - cs_start_locked(ifp); -} - -/* - * Get the packet from the board and send it to the upper layer. - */ -static int -cs_get_packet(struct cs_softc *sc) -{ - struct ifnet *ifp = sc->ifp; - int status, length; - struct mbuf *m; - -#ifdef CS_DEBUG - int i; -#endif - - status = cs_inw(sc, RX_FRAME_PORT); - length = cs_inw(sc, RX_FRAME_PORT); - -#ifdef CS_DEBUG - device_printf(sc->dev, "rcvd: stat %x, len %d\n", - status, length); -#endif - - if (!(status & RX_OK)) { -#ifdef CS_DEBUG - device_printf(sc->dev, "bad pkt stat %x\n", status); -#endif - if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); - return (-1); - } - - MGETHDR(m, M_NOWAIT, MT_DATA); - if (m==NULL) - return (-1); - - if (length > MHLEN) { - if (!(MCLGET(m, M_NOWAIT))) { - m_freem(m); - return (-1); - } - } - - /* Initialize packet's header info */ - m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.len = length; - m->m_len = length; - - /* Get the data */ - bus_read_multi_2(sc->port_res, RX_FRAME_PORT, mtod(m, uint16_t *), - (length + 1) >> 1); - -#ifdef CS_DEBUG - for (i=0;i<length;i++) - printf(" %02x",(unsigned char)*((char *)(m->m_data+i))); - printf( "\n" ); -#endif - - if (status & (RX_IA | RX_BROADCAST) || - (ifp->if_flags & IFF_MULTICAST && status & RX_HASHED)) { - /* Feed the packet to the upper layer */ - (*ifp->if_input)(ifp, m); - if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); - if (length == ETHER_MAX_LEN-ETHER_CRC_LEN) - DELAY(cs_recv_delay); - } else { - m_freem(m); - } - - return (0); -} - -/* - * Handle interrupts - */ -void -csintr(void *arg) -{ - struct cs_softc *sc = (struct cs_softc*) arg; - struct ifnet *ifp = sc->ifp; - int status; - -#ifdef CS_DEBUG - device_printf(sc->dev, "Interrupt.\n"); -#endif - - CS_LOCK(sc); - while ((status=cs_inw(sc, ISQ_PORT))) { - -#ifdef CS_DEBUG - device_printf(sc->dev, "from ISQ: %04x\n", status); -#endif - - switch (status & ISQ_EVENT_MASK) { - case ISQ_RECEIVER_EVENT: - cs_get_packet(sc); - break; - - case ISQ_TRANSMITTER_EVENT: - if (status & TX_OK) - if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1); - else - if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - sc->tx_timeout = 0; - break; - - case ISQ_BUFFER_EVENT: - if (status & READY_FOR_TX) { - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - sc->tx_timeout = 0; - } - - if (status & TX_UNDERRUN) { - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - sc->tx_timeout = 0; - if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); - } - break; - - case ISQ_RX_MISS_EVENT: - if_inc_counter(ifp, IFCOUNTER_IERRORS, status >> 6); - break; - - case ISQ_TX_COL_EVENT: - if_inc_counter(ifp, IFCOUNTER_COLLISIONS, status >> 6); - break; - } - } - - if (!(ifp->if_drv_flags & IFF_DRV_OACTIVE)) { - cs_start_locked(ifp); - } - CS_UNLOCK(sc); -} - -/* - * Save the data in buffer - */ - -static void -cs_write_mbufs( struct cs_softc *sc, struct mbuf *m ) -{ - int len; - struct mbuf *mp; - unsigned char *data, *buf; - - for (mp=m, buf=sc->buffer, sc->buf_len=0; mp != NULL; mp=mp->m_next) { - len = mp->m_len; - - /* - * Ignore empty parts - */ - if (!len) - continue; - - /* - * Find actual data address - */ - data = mtod(mp, caddr_t); - - bcopy((caddr_t) data, (caddr_t) buf, len); - buf += len; - sc->buf_len += len; - } -} - - -static void -cs_xmit_buf( struct cs_softc *sc ) -{ - bus_write_multi_2(sc->port_res, TX_FRAME_PORT, (uint16_t *)sc->buffer, - (sc->buf_len + 1) >> 1); - sc->buf_len = 0; -} - -static void -cs_start(struct ifnet *ifp) -{ - struct cs_softc *sc = ifp->if_softc; - - CS_LOCK(sc); - cs_start_locked(ifp); - CS_UNLOCK(sc); -} - -static void -cs_start_locked(struct ifnet *ifp) -{ - int length; - struct mbuf *m, *mp; - struct cs_softc *sc = ifp->if_softc; - - for (;;) { - if (sc->buf_len) - length = sc->buf_len; - else { - IF_DEQUEUE( &ifp->if_snd, m ); - - if (m==NULL) { - return; - } - - for (length=0, mp=m; mp != NULL; mp=mp->m_next) - length += mp->m_len; - - /* Skip zero-length packets */ - if (length == 0) { - m_freem(m); - continue; - } - - cs_write_mbufs(sc, m); - - BPF_MTAP(ifp, m); - - m_freem(m); - } - - /* - * Issue a SEND command - */ - cs_outw(sc, TX_CMD_PORT, sc->send_cmd); - cs_outw(sc, TX_LEN_PORT, length ); - - /* - * If there's no free space in the buffer then leave - * this packet for the next time: indicate output active - * and return. - */ - if (!(cs_readreg(sc, PP_BusST) & READY_FOR_TX_NOW)) { - sc->tx_timeout = sc->buf_len; - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - return; - } - - cs_xmit_buf(sc); - - /* - * Set the watchdog timer in case we never hear - * from board again. (I don't know about correct - * value for this timeout) - */ - sc->tx_timeout = length; - - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - return; - } -} - -/* - * Stop everything on the interface - */ -static void -cs_stop(struct cs_softc *sc) -{ - - CS_ASSERT_LOCKED(sc); - cs_writereg(sc, PP_RxCFG, 0); - cs_writereg(sc, PP_TxCFG, 0); - cs_writereg(sc, PP_BufCFG, 0); - cs_writereg(sc, PP_BusCTL, 0); - - sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - sc->tx_timeout = 0; - callout_stop(&sc->timer); -} - -/* - * Reset the interface - */ -static void -cs_reset(struct cs_softc *sc) -{ - - CS_ASSERT_LOCKED(sc); - cs_stop(sc); - cs_init_locked(sc); -} - -static uint16_t -cs_hash_index(struct sockaddr_dl *addr) -{ - uint32_t crc; - uint16_t idx; - caddr_t lla; - - lla = LLADDR(addr); - crc = ether_crc32_le(lla, ETHER_ADDR_LEN); - idx = crc >> 26; - - return (idx); -} - -static void -cs_setmode(struct cs_softc *sc) -{ - int rx_ctl; - uint16_t af[4]; - uint16_t port, mask, index; - struct ifnet *ifp = sc->ifp; - struct ifmultiaddr *ifma; - - /* Stop the receiver while changing filters */ - cs_writereg(sc, PP_LineCTL, cs_readreg(sc, PP_LineCTL) & ~SERIAL_RX_ON); - - if (ifp->if_flags & IFF_PROMISC) { - /* Turn on promiscuous mode. */ - rx_ctl = RX_OK_ACCEPT | RX_PROM_ACCEPT; - } else if (ifp->if_flags & IFF_MULTICAST) { - /* Allow receiving frames with multicast addresses */ - rx_ctl = RX_IA_ACCEPT | RX_BROADCAST_ACCEPT | - RX_OK_ACCEPT | RX_MULTCAST_ACCEPT; - - /* Start with an empty filter */ - af[0] = af[1] = af[2] = af[3] = 0x0000; - - if (ifp->if_flags & IFF_ALLMULTI) { - /* Accept all multicast frames */ - af[0] = af[1] = af[2] = af[3] = 0xffff; - } else { - /* - * Set up the filter to only accept multicast - * frames we're interested in. - */ - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - struct sockaddr_dl *dl = - (struct sockaddr_dl *)ifma->ifma_addr; - - index = cs_hash_index(dl); - port = (u_int16_t) (index >> 4); - mask = (u_int16_t) (1 << (index & 0xf)); - af[port] |= mask; - } - if_maddr_runlock(ifp); - } - - cs_writereg(sc, PP_LAF + 0, af[0]); - cs_writereg(sc, PP_LAF + 2, af[1]); - cs_writereg(sc, PP_LAF + 4, af[2]); - cs_writereg(sc, PP_LAF + 6, af[3]); - } else { - /* - * Receive only good frames addressed for us and - * good broadcasts. - */ - rx_ctl = RX_IA_ACCEPT | RX_BROADCAST_ACCEPT | - RX_OK_ACCEPT; - } - - /* Set up the filter */ - cs_writereg(sc, PP_RxCTL, RX_DEF_ACCEPT | rx_ctl); - - /* Turn on receiver */ - cs_writereg(sc, PP_LineCTL, cs_readreg(sc, PP_LineCTL) | SERIAL_RX_ON); -} - -static int -cs_ioctl(struct ifnet *ifp, u_long command, caddr_t data) -{ - struct cs_softc *sc=ifp->if_softc; - struct ifreq *ifr = (struct ifreq *)data; - int error=0; - -#ifdef CS_DEBUG - if_printf(ifp, "%s command=%lx\n", __func__, command); -#endif - - switch (command) { - case SIOCSIFFLAGS: - /* - * Switch interface state between "running" and - * "stopped", reflecting the UP flag. - */ - CS_LOCK(sc); - if (sc->ifp->if_flags & IFF_UP) { - if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING)==0) { - cs_init_locked(sc); - } - } else { - if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING)!=0) { - cs_stop(sc); - } - } - /* - * Promiscuous and/or multicast flags may have changed, - * so reprogram the multicast filter and/or receive mode. - * - * See note about multicasts in cs_setmode - */ - cs_setmode(sc); - CS_UNLOCK(sc); - break; - - case SIOCADDMULTI: - case SIOCDELMULTI: - /* - * Multicast list has changed; set the hardware filter - * accordingly. - * - * See note about multicasts in cs_setmode - */ - CS_LOCK(sc); - cs_setmode(sc); - CS_UNLOCK(sc); - error = 0; - break; - - case SIOCSIFMEDIA: - case SIOCGIFMEDIA: - error = ifmedia_ioctl(ifp, ifr, &sc->media, command); - break; - - default: - error = ether_ioctl(ifp, command, data); - break; - } - - return (error); -} - -/* - * Device timeout/watchdog routine. Entered if the device neglects to - * generate an interrupt after a transmit has been started on it. - */ -static void -cs_watchdog(void *arg) -{ - struct cs_softc *sc = arg; - struct ifnet *ifp = sc->ifp; - - CS_ASSERT_LOCKED(sc); - if (sc->tx_timeout && --sc->tx_timeout == 0) { - if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); - log(LOG_ERR, "%s: device timeout\n", ifp->if_xname); - - /* Reset the interface */ - if (ifp->if_flags & IFF_UP) - cs_reset(sc); - else - cs_stop(sc); - } - callout_reset(&sc->timer, hz, cs_watchdog, sc); -} - -static int -cs_mediachange(struct ifnet *ifp) -{ - struct cs_softc *sc = ifp->if_softc; - struct ifmedia *ifm = &sc->media; - int error; - - if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) - return (EINVAL); - - CS_LOCK(sc); - error = cs_mediaset(sc, ifm->ifm_media); - CS_UNLOCK(sc); - return (error); -} - -static void -cs_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) -{ - int line_status; - struct cs_softc *sc = ifp->if_softc; - - CS_LOCK(sc); - ifmr->ifm_active = IFM_ETHER; - line_status = cs_readreg(sc, PP_LineST); - if (line_status & TENBASET_ON) { - ifmr->ifm_active |= IFM_10_T; - if (sc->chip_type != CS8900) { - if (cs_readreg(sc, PP_AutoNegST) & FDX_ACTIVE) - ifmr->ifm_active |= IFM_FDX; - if (cs_readreg(sc, PP_AutoNegST) & HDX_ACTIVE) - ifmr->ifm_active |= IFM_HDX; - } - ifmr->ifm_status = IFM_AVALID; - if (line_status & LINK_OK) - ifmr->ifm_status |= IFM_ACTIVE; - } else { - if (line_status & AUI_ON) { - cs_writereg(sc, PP_SelfCTL, cs_readreg(sc, PP_SelfCTL) | - HCB1_ENBL); - if (((sc->adapter_cnf & A_CNF_DC_DC_POLARITY)!=0)^ - (cs_readreg(sc, PP_SelfCTL) & HCB1)) - ifmr->ifm_active |= IFM_10_2; - else - ifmr->ifm_active |= IFM_10_5; - } - } - CS_UNLOCK(sc); -} - -static int -cs_mediaset(struct cs_softc *sc, int media) -{ - int error = 0; - - /* Stop the receiver & transmitter */ - cs_writereg(sc, PP_LineCTL, cs_readreg(sc, PP_LineCTL) & - ~(SERIAL_RX_ON | SERIAL_TX_ON)); - -#ifdef CS_DEBUG - device_printf(sc->dev, "%s media=%x\n", __func__, media); -#endif - - switch (IFM_SUBTYPE(media)) { - default: - case IFM_AUTO: - /* - * This chip makes it a little hard to support this, so treat - * it as IFM_10_T, auto duplex. - */ - enable_tp(sc); - cs_duplex_auto(sc); - break; - case IFM_10_T: - enable_tp(sc); - if (media & IFM_FDX) - cs_duplex_full(sc); - else if (media & IFM_HDX) - cs_duplex_half(sc); - else - error = cs_duplex_auto(sc); - break; - case IFM_10_2: - enable_bnc(sc); - break; - case IFM_10_5: - enable_aui(sc); - break; - } - - /* - * Turn the transmitter & receiver back on - */ - cs_writereg(sc, PP_LineCTL, cs_readreg(sc, PP_LineCTL) | - SERIAL_RX_ON | SERIAL_TX_ON); - - return (error); -} diff --git a/sys/dev/cs/if_cs_isa.c b/sys/dev/cs/if_cs_isa.c deleted file mode 100644 index 4b1e5d7ba0f8..000000000000 --- a/sys/dev/cs/if_cs_isa.c +++ /dev/null @@ -1,123 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1997,1998 Maxim Bolotin and Oleg Sharoiko. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/lock.h> -#include <sys/kernel.h> -#include <sys/mutex.h> -#include <sys/socket.h> - -#include <sys/module.h> -#include <sys/bus.h> - -#include <machine/bus.h> -#include <machine/resource.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_media.h> - -#include <isa/isavar.h> - -#include <dev/cs/if_csvar.h> -#include <dev/cs/if_csreg.h> - -static int cs_isa_probe(device_t); -static int cs_isa_attach(device_t); - -static struct isa_pnp_id cs_ids[] = { - { 0x4060630e, NULL }, /* CSC6040 */ - { 0x10104d24, NULL }, /* IBM EtherJet */ - { 0, NULL } -}; - -/* - * Determine if the device is present - */ -static int -cs_isa_probe(device_t dev) -{ - int error; - - /* Check isapnp ids */ - error = ISA_PNP_PROBE(device_get_parent(dev), dev, cs_ids); - - /* If the card had a PnP ID that didn't match any we know about */ - if (error == ENXIO) - goto end; - - /* If we've matched, or there's no PNP ID, probe chip */ - if (error == 0 || error == ENOENT) - error = cs_cs89x0_probe(dev); -end: - /* Make sure IRQ is assigned for probe message and available */ - if (error == 0) - error = cs_alloc_irq(dev, 0); - - cs_release_resources(dev); - return (error); -} - -static int -cs_isa_attach(device_t dev) -{ - struct cs_softc *sc = device_get_softc(dev); - - cs_alloc_port(dev, 0, CS_89x0_IO_PORTS); - cs_alloc_irq(dev, sc->irq_rid); - - return (cs_attach(dev)); -} - -static device_method_t cs_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, cs_isa_probe), - DEVMETHOD(device_attach, cs_isa_attach), - DEVMETHOD(device_detach, cs_detach), - - { 0, 0 } -}; - -static driver_t cs_isa_driver = { - "cs", - cs_isa_methods, - sizeof(struct cs_softc), -}; - -extern devclass_t cs_devclass; - -DRIVER_MODULE(cs, isa, cs_isa_driver, cs_devclass, 0, 0); -MODULE_DEPEND(cs, isa, 1, 1, 1); -MODULE_DEPEND(cs, ether, 1, 1, 1); -ISA_PNP_INFO(cs_ids); diff --git a/sys/dev/cs/if_cs_pccard.c b/sys/dev/cs/if_cs_pccard.c deleted file mode 100644 index 260e81bd79fb..000000000000 --- a/sys/dev/cs/if_cs_pccard.c +++ /dev/null @@ -1,121 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1999 M. Warner Losh <imp@village.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/lock.h> -#include <sys/kernel.h> -#include <sys/mutex.h> -#include <sys/socket.h> - -#include <sys/module.h> -#include <sys/bus.h> - -#include <machine/bus.h> -#include <machine/resource.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_media.h> - -#include <dev/cs/if_csvar.h> -#include <dev/cs/if_csreg.h> -#include <dev/pccard/pccardvar.h> -#include <dev/pccard/pccard_cis.h> - -#include "card_if.h" -#include "pccarddevs.h" - -static const struct pccard_product cs_pccard_products[] = { - PCMCIA_CARD(IBM, ETHERJET), - { NULL } -}; - -static int -cs_pccard_probe(device_t dev) -{ - const struct pccard_product *pp; - uint32_t fcn = PCCARD_FUNCTION_UNSPEC; - - /* Make sure we're a network function */ - pccard_get_function(dev, &fcn); - if (fcn != PCCARD_FUNCTION_NETWORK) - return (ENXIO); - - if ((pp = pccard_product_lookup(dev, cs_pccard_products, - sizeof(cs_pccard_products[0]), NULL)) != NULL) { - if (pp->pp_name != NULL) - device_set_desc(dev, pp->pp_name); - return 0; - } - return EIO; -} - -static int -cs_pccard_attach(device_t dev) -{ - struct cs_softc *sc = device_get_softc(dev); - int error; - - sc->flags |= CS_NO_IRQ; - error = cs_cs89x0_probe(dev); - if (error != 0) - return (error); - error = cs_alloc_irq(dev, sc->irq_rid); - if (error != 0) - goto bad; - - return (cs_attach(dev)); -bad: - cs_release_resources(dev); - return (error); -} - -static device_method_t cs_pccard_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, cs_pccard_probe), - DEVMETHOD(device_attach, cs_pccard_attach), - DEVMETHOD(device_detach, cs_detach), - - { 0, 0 } -}; - -static driver_t cs_pccard_driver = { - "cs", - cs_pccard_methods, - sizeof(struct cs_softc), -}; - -extern devclass_t cs_devclass; - -DRIVER_MODULE(cs, pccard, cs_pccard_driver, cs_devclass, 0, 0); -MODULE_DEPEND(cs, ether, 1, 1, 1); -PCCARD_PNP_INFO(cs_pccard_products); diff --git a/sys/dev/cs/if_csreg.h b/sys/dev/cs/if_csreg.h deleted file mode 100644 index 8eea27322d17..000000000000 --- a/sys/dev/cs/if_csreg.h +++ /dev/null @@ -1,590 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1997,1998 Maxim Bolotin and Oleg Sharoiko. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -/* - * $FreeBSD$ - */ - -#include <sys/rman.h> - -#define CS_89x0_IO_PORTS 0x0020 - -#define PP_ChipID 0x0000 /* offset 0h -> Corp -ID */ - /* offset 2h -> Model/Product Number */ - /* offset 3h -> Chip Revision Number */ - -#define PP_ISAIOB 0x0020 /* IO base address */ -#define PP_CS8900_ISAINT 0x0022 /* ISA interrupt select */ -#define PP_CS8900_ISADMA 0x0024 /* ISA Rec DMA channel */ -#define PP_CS8920_ISAINT 0x0370 /* ISA interrupt select */ -#define PP_CS8920_ISADMA 0x0374 /* ISA Rec DMA channel */ -#define PP_ISASOF 0x0026 /* ISA DMA offset */ -#define PP_DmaFrameCnt 0x0028 /* ISA DMA Frame count */ -#define PP_DmaByteCnt 0x002A /* ISA DMA Byte count */ -#define PP_CS8920_ISAMemB 0x0348 /* Memory base */ - -/* EEPROM data and command registers */ -#define PP_EECMD 0x0040 /* NVR Interface Command register */ -#define PP_EEData 0x0042 /* NVR Interface Data Register */ -#define PP_DebugReg 0x0044 /* Debug Register */ - -#define PP_RxCFG 0x0102 /* Rx Bus config */ -#define PP_RxCTL 0x0104 /* Receive Control Register */ -#define PP_TxCFG 0x0106 /* Transmit Config Register */ -#define PP_TxCMD 0x0108 /* Transmit Command Register */ -#define PP_BufCFG 0x010A /* Bus configuration Register */ -#define PP_LineCTL 0x0112 /* Line Config Register */ -#define PP_SelfCTL 0x0114 /* Self Command Register */ -#define PP_BusCTL 0x0116 /* ISA bus control Register */ -#define PP_TestCTL 0x0118 /* Test Register */ -#define PP_AutoNegCTL 0x011C /* Auto Negotiation Ctrl */ - -#define PP_ISQ 0x0120 /* Interrupt Status */ -#define PP_RxEvent 0x0124 /* Rx Event Register */ -#define PP_TxEvent 0x0128 /* Tx Event Register */ -#define PP_BufEvent 0x012C /* Bus Event Register */ -#define PP_RxMiss 0x0130 /* Receive Miss Count */ -#define PP_TxCol 0x0132 /* Transmit Collision Count */ -#define PP_LineST 0x0134 /* Line State Register */ -#define PP_SelfST 0x0136 /* Self State register */ -#define PP_BusST 0x0138 /* Bus Status */ -#define PP_TDR 0x013C /* Time Domain Reflectometry */ -#define PP_AutoNegST 0x013E /* Auto Neg Status */ -#define PP_TxCommand 0x0144 /* Tx Command */ -#define PP_TxLength 0x0146 /* Tx Length */ -#define PP_LAF 0x0150 /* Hash Table */ -#define PP_IA 0x0158 /* Physical Address Register */ - -#define PP_RxStatus 0x0400 /* Receive start of frame */ -#define PP_RxLength 0x0402 /* Receive Length of frame */ -#define PP_RxFrame 0x0404 /* Receive frame pointer */ -#define PP_TxFrame 0x0A00 /* Transmit frame pointer */ - -/* - * Primary I/O Base Address. If no I/O base is supplied by the user, then this - * can be used as the default I/O base to access the PacketPage Area. - */ -#define DEFAULTIOBASE 0x0300 -#define FIRST_IO 0x020C /* First I/O port to check */ -#define LAST_IO 0x037C /* Last I/O port to check (+10h) */ -#define ADD_MASK 0x3000 /* Mask it use of the ADD_PORT register */ -#define ADD_SIG 0x3000 /* Expected ID signature */ - -#define CHIP_EISA_ID_SIG 0x630E /* Product ID Code for Crystal Chip (CS8900 spec 4.3) */ - -#define PRODUCT_ID_ADD 0x0002 /* Address of product ID */ - -/* Mask to find out the types of registers */ -#define REG_TYPE_MASK 0x001F - -/* Eeprom Commands */ -#define ERSE_WR_ENBL 0x00F0 -#define ERSE_WR_DISABLE 0x0000 - -/* Defines Control/Config register quintuplet numbers */ -#define RX_BUF_CFG 0x0003 -#define RX_CONTROL 0x0005 -#define TX_CFG 0x0007 -#define TX_COMMAND 0x0009 -#define BUF_CFG 0x000B -#define LINE_CONTROL 0x0013 -#define SELF_CONTROL 0x0015 -#define BUS_CONTROL 0x0017 -#define TEST_CONTROL 0x0019 - -/* Defines Status/Count registers quintuplet numbers */ -#define RX_EVENT 0x0004 -#define TX_EVENT 0x0008 -#define BUF_EVENT 0x000C -#define RX_MISS_COUNT 0x0010 -#define TX_COL_COUNT 0x0012 -#define LINE_STATUS 0x0014 -#define SELF_STATUS 0x0016 -#define BUS_STATUS 0x0018 -#define TDR 0x001C - -/* - * PP_RxCFG - Receive Configuration and Interrupt Mask - * bit definition - Read/write - */ -#define SKIP_1 0x0040 -#define RX_STREAM_ENBL 0x0080 -#define RX_OK_ENBL 0x0100 -#define RX_DMA_ONLY 0x0200 -#define AUTO_RX_DMA 0x0400 -#define BUFFER_CRC 0x0800 -#define RX_CRC_ERROR_ENBL 0x1000 -#define RX_RUNT_ENBL 0x2000 -#define RX_EXTRA_DATA_ENBL 0x4000 - -/* PP_RxCTL - Receive Control bit definition - Read/write */ -#define RX_IA_HASH_ACCEPT 0x0040 -#define RX_PROM_ACCEPT 0x0080 -#define RX_OK_ACCEPT 0x0100 -#define RX_MULTCAST_ACCEPT 0x0200 -#define RX_IA_ACCEPT 0x0400 -#define RX_BROADCAST_ACCEPT 0x0800 -#define RX_BAD_CRC_ACCEPT 0x1000 -#define RX_RUNT_ACCEPT 0x2000 -#define RX_EXTRA_DATA_ACCEPT 0x4000 -#define RX_ALL_ACCEPT (RX_PROM_ACCEPT | RX_BAD_CRC_ACCEPT | \ - RX_RUNT_ACCEPT | RX_EXTRA_DATA_ACCEPT) -/* - * Default receive mode - individually addressed, broadcast, and error free - */ -#define RX_DEF_ACCEPT (RX_IA_ACCEPT | RX_BROADCAST_ACCEPT | RX_OK_ACCEPT) - -/* - * PP_TxCFG - Transmit Configuration Interrupt Mask - * bit definition - Read/write - */ -#define TX_LOST_CRS_ENBL 0x0040 -#define TX_SQE_ERROR_ENBL 0x0080 -#define TX_OK_ENBL 0x0100 -#define TX_LATE_COL_ENBL 0x0200 -#define TX_JBR_ENBL 0x0400 -#define TX_ANY_COL_ENBL 0x0800 -#define TX_16_COL_ENBL 0x8000 - -/* - * PP_TxCMD - Transmit Command bit definition - Read-only - */ -#define TX_START_4_BYTES 0x0000 -#define TX_START_64_BYTES 0x0040 -#define TX_START_128_BYTES 0x0080 -#define TX_START_ALL_BYTES 0x00C0 -#define TX_FORCE 0x0100 -#define TX_ONE_COL 0x0200 -#define TX_TWO_PART_DEFF_DISABLE 0x0400 -#define TX_NO_CRC 0x1000 -#define TX_RUNT 0x2000 - -/* - * PP_BufCFG - Buffer Configuration Interrupt Mask - * bit definition - Read/write - */ -#define GENERATE_SW_INTERRUPT 0x0040 -#define RX_DMA_ENBL 0x0080 -#define READY_FOR_TX_ENBL 0x0100 -#define TX_UNDERRUN_ENBL 0x0200 -#define RX_MISS_ENBL 0x0400 -#define RX_128_BYTE_ENBL 0x0800 -#define TX_COL_COUNT_OVRFLOW_ENBL 0x1000 -#define RX_MISS_COUNT_OVRFLOW_ENBL 0x2000 -#define RX_DEST_MATCH_ENBL 0x8000 - -/* - * PP_LineCTL - Line Control bit definition - Read/write - */ -#define SERIAL_RX_ON 0x0040 -#define SERIAL_TX_ON 0x0080 -#define AUI_ONLY 0x0100 -#define AUTO_AUI_10BASET 0x0200 -#define MODIFIED_BACKOFF 0x0800 -#define NO_AUTO_POLARITY 0x1000 -#define TWO_PART_DEFDIS 0x2000 -#define LOW_RX_SQUELCH 0x4000 - -/* - * PP_SelfCTL - Software Self Control bit definition - Read/write - */ -#define POWER_ON_RESET 0x0040 -#define SW_STOP 0x0100 -#define SLEEP_ON 0x0200 -#define AUTO_WAKEUP 0x0400 -#define HCB0_ENBL 0x1000 -#define HCB1_ENBL 0x2000 -#define HCB0 0x4000 -#define HCB1 0x8000 - -/* - * PP_BusCTL - ISA Bus Control bit definition - Read/write - */ -#define RESET_RX_DMA 0x0040 -#define MEMORY_ON 0x0400 -#define DMA_BURST_MODE 0x0800 -#define IO_CHANNEL_READY_ON 0x1000 -#define RX_DMA_SIZE_64Ks 0x2000 -#define ENABLE_IRQ 0x8000 - -/* - * PP_TestCTL - Test Control bit definition - Read/write - */ -#define LINK_OFF 0x0080 -#define ENDEC_LOOPBACK 0x0200 -#define AUI_LOOPBACK 0x0400 -#define BACKOFF_OFF 0x0800 -#define FAST_TEST 0x8000 - -/* - * PP_RxEvent - Receive Event Bit definition - Read-only - */ -#define RX_IA_HASHED 0x0040 -#define RX_DRIBBLE 0x0080 -#define RX_OK 0x0100 -#define RX_HASHED 0x0200 -#define RX_IA 0x0400 -#define RX_BROADCAST 0x0800 -#define RX_CRC_ERROR 0x1000 -#define RX_RUNT 0x2000 -#define RX_EXTRA_DATA 0x4000 - -#define HASH_INDEX_MASK 0x0FC00 - -/* - * PP_TxEvent - Transmit Event Bit definition - Read-only - */ -#define TX_LOST_CRS 0x0040 -#define TX_SQE_ERROR 0x0080 -#define TX_OK 0x0100 -#define TX_LATE_COL 0x0200 -#define TX_JBR 0x0400 -#define TX_16_COL 0x8000 -#define TX_SEND_OK_BITS (TX_OK | TX_LOST_CRS) -#define TX_COL_COUNT_MASK 0x7800 - -/* - * PP_BufEvent - Buffer Event Bit definition - Read-only - */ -#define SW_INTERRUPT 0x0040 -#define RX_DMA 0x0080 -#define READY_FOR_TX 0x0100 -#define TX_UNDERRUN 0x0200 -#define RX_MISS 0x0400 -#define RX_128_BYTE 0x0800 -#define TX_COL_OVRFLW 0x1000 -#define RX_MISS_OVRFLW 0x2000 -#define RX_DEST_MATCH 0x8000 - -/* - * PP_LineST - Ethernet Line Status bit definition - Read-only - */ -#define LINK_OK 0x0080 -#define AUI_ON 0x0100 -#define TENBASET_ON 0x0200 -#define POLARITY_OK 0x1000 -#define CRS_OK 0x4000 - -/* - * PP_SelfST - Chip Software Status bit definition - */ -#define ACTIVE_33V 0x0040 -#define INIT_DONE 0x0080 -#define SI_BUSY 0x0100 -#define EEPROM_PRESENT 0x0200 -#define EEPROM_OK 0x0400 -#define EL_PRESENT 0x0800 -#define EE_SIZE_64 0x1000 - -/* - * PP_BusST - ISA Bus Status bit definition - */ -#define TX_BID_ERROR 0x0080 -#define READY_FOR_TX_NOW 0x0100 - -/* - * PP_AutoNegCTL - Auto Negotiation Control bit definition - */ -#define RE_NEG_NOW 0x0040 -#define ALLOW_FDX 0x0080 -#define AUTO_NEG_ENABLE 0x0100 -#define NLP_ENABLE 0x0200 -#define FORCE_FDX 0x8000 -#define AUTO_NEG_BITS (FORCE_FDX | NLP_ENABLE | AUTO_NEG_ENABLE) -#define AUTO_NEG_MASK (FORCE_FDX | NLP_ENABLE | AUTO_NEG_ENABLE | \ - ALLOW_FDX | RE_NEG_NOW) - -/* - * PP_AutoNegST - Auto Negotiation Status bit definition - */ -#define AUTO_NEG_BUSY 0x0080 -#define FLP_LINK 0x0100 -#define FLP_LINK_GOOD 0x0800 -#define LINK_FAULT 0x1000 -#define HDX_ACTIVE 0x4000 -#define FDX_ACTIVE 0x8000 - -/* - * The following block defines the ISQ event types - */ -#define ISQ_RECEIVER_EVENT 0x04 -#define ISQ_TRANSMITTER_EVENT 0x08 -#define ISQ_BUFFER_EVENT 0x0c -#define ISQ_RX_MISS_EVENT 0x10 -#define ISQ_TX_COL_EVENT 0x12 - -#define ISQ_EVENT_MASK 0x003F /* ISQ mask to find out type of event */ -#define ISQ_HIST 16 /* small history buffer */ -#define AUTOINCREMENT 0x8000 /* Bit mask to set bit-15 for autoincrement */ - -#define TXRXBUFSIZE 0x0600 -#define RXDMABUFSIZE 0x8000 -#define RXDMASIZE 0x4000 -#define TXRX_LENGTH_MASK 0x07FF - -/* rx options bits */ -#define RCV_WITH_RXON 1 /* Set SerRx ON */ -#define RCV_COUNTS 2 /* Use Framecnt1 */ -#define RCV_PONG 4 /* Pong respondent */ -#define RCV_DONG 8 /* Dong operation */ -#define RCV_POLLING 0x10 /* Poll RxEvent */ -#define RCV_ISQ 0x20 /* Use ISQ, int */ -#define RCV_AUTO_DMA 0x100 /* Set AutoRxDMAE */ -#define RCV_DMA 0x200 /* Set RxDMA only */ -#define RCV_DMA_ALL 0x400 /* Copy all DMA'ed */ -#define RCV_FIXED_DATA 0x800 /* Every frame same */ -#define RCV_IO 0x1000 /* Use ISA IO only */ -#define RCV_MEMORY 0x2000 /* Use ISA Memory */ - -#define RAM_SIZE 0x1000 /* The card has 4k bytes or RAM */ -#define PKT_START PP_TxFrame /* Start of packet RAM */ - -#define RX_FRAME_PORT 0x0000 -#define TX_FRAME_PORT RX_FRAME_PORT -#define TX_CMD_PORT 0x0004 -#define TX_CS8900_NOW 0x0000 /* Tx packet after 5 bytes copied */ -#define TX_CS8900_AFTER_381 0x0020 /* Tx packet after 381 bytes copied */ -#define TX_CS8900_AFTER_ALL 0x0060 /* Tx packet after all bytes copied */ -#define TX_CS8920_NOW 0x0000 /* Tx packet after 5 bytes copied */ -#define TX_CS8920_AFTER_381 0x0040 /* Tx packet after 381 bytes copied */ -#define TX_CS8920_AFTER_1021 0x0080 /* Tx packet after1021 bytes copied */ -#define TX_CS8920_AFTER_ALL 0x00C0 /* Tx packet after all bytes copied */ -#define TX_LEN_PORT 0x0006 -#define ISQ_PORT 0x0008 -#define ADD_PORT 0x000A -#define DATA_PORT 0x000C - -#define EEPROM_WRITE_EN 0x00F0 -#define EEPROM_WRITE_DIS 0x0000 -#define EEPROM_WRITE_CMD 0x0100 -#define EEPROM_READ_CMD 0x0200 - -/* Receive Header - * Description of header of each packet in receive area of memory - */ -#define RBUF_EVENT_LOW 0 /* Low byte of RxEvent - status of received frame */ -#define RBUF_EVENT_HIGH 1 /* High byte of RxEvent - status of received frame */ -#define RBUF_LEN_LOW 2 /* Length of received data - low byte */ -#define RBUF_LEN_HI 3 /* Length of received data - high byte */ -#define RBUF_HEAD_LEN 4 /* Length of this header */ - -#define CHIP_READ 0x1 /* Used to mark state of the repins code (chip or dma) */ -#define DMA_READ 0x2 /* Used to mark state of the repins code (chip or dma) */ - -/* for bios scan */ -/* */ -#ifdef CSDEBUG -/* use these values for debugging bios scan */ -#define BIOS_START_SEG 0x00000 -#define BIOS_OFFSET_INC 0x0010 -#else -#define BIOS_START_SEG 0x0c000 -#define BIOS_OFFSET_INC 0x0200 -#endif - -#define BIOS_LAST_OFFSET 0x0fc00 - -/* - * Word offsets into the EEPROM configuration buffer - */ -#define ISA_CNF_OFFSET 0x3 -#define INT_NO_MASK 0x000F -#define DMA_NO_MASK 0x0070 -#define USE_SA 0x0080 -#define IOCHRDY_ENABLE 0x0100 -#define ISA_DMA_SIZE 0x0200 /* 0 16k 1 64k */ -#define ISA_AUTO_RxDMA 0x0400 -#define ISA_RxDMA 0x0800 -#define DMA_BURST 0x1000 -#define STREAM_TRANSFER 0x2000 -#define ANY_ISA_DMA (ISA_AUTO_RxDMA | ISA_RxDMA) -#define BOOT_PROM_FLAG 0x4000 -#define MEMORY_MODE 0x8000 - -#define PACKET_PAGE_BASE (ISA_CNF_OFFSET + 1) -#define BOOT_ROM_BASE (ISA_CNF_OFFSET + 2) -#define BOOT_PROM_MASK (ISA_CNF_OFFSET + 3) - -#define TX_CTL_OFFSET (ISA_CNF_OFFSET + 4) /* 8900 eeprom */ -#define AUTO_NEG_CNF_OFFSET (ISA_CNF_OFFSET + 4) /* 8920 eeprom */ - /* - * the assumption here is that the bits in the eeprom are generally - * in the same position as those in the autonegctl register. - * Of course the IMM bit is not in that register so it must be - * masked out - */ -#define EE_FORCE_FDX 0x8000 -#define EE_NLP_ENABLE 0x0200 -#define EE_AUTO_NEG_ENABLE 0x0100 -#define EE_ALLOW_FDX 0x0080 -#define EE_AUTO_NEG_CNF_MASK (EE_FORCE_FDX | EE_NLP_ENABLE | \ - EE_AUTO_NEG_ENABLE | EE_ALLOW_FDX) -#define IMM_BIT 0x0040 /* ignore missing media */ - -#define ADAPTER_CNF_OFFSET (ISA_CNF_OFFSET + 5) -#define A_CNF_MEDIA 0x0007 -#define A_CNF_10B_T 0x0001 -#define A_CNF_AUI 0x0002 -#define A_CNF_10B_2 0x0004 -#define A_CNF_MEDIA_TYPE 0x0060 -#define A_CNF_MEDIA_AUTO 0x0000 -#define A_CNF_MEDIA_10B_T 0x0020 -#define A_CNF_MEDIA_AUI 0x0040 -#define A_CNF_MEDIA_10B_2 0x0060 -#define A_CNF_DC_DC_POLARITY 0x0080 -#define A_CNF_WAKE_ENABLED 0x0100 -#define A_CNF_WAKE_CFG 0x0200 -#define A_CNF_CAN_WAKE 0x0400 -#define A_CNF_OPT_FLAGS 0x1800 /* 00 server, 01 DOS 10 multi-user */ -#define A_CNF_NO_AUTO_POLARITY 0x2000 -#define A_CNF_LOW_RX_SQUELCH 0x4000 -#define A_CNF_EXTND_10B_2 0x8000 - -#define MFG_DATE_OFFSET (ISA_CNF_OFFSET + 8) - -#define PACKET_PAGE_OFFSET 0x8 - -/* DMA controller registers */ -#define DMA_BASE 0x00 /* DMA controller base */ -#define DMA_BASE_2 0x0C0 /* DMA controller base */ - -#define DMA_STAT 0x0D0 /* DMA controller status register */ -#define DMA_MASK 0x0D4 /* DMA controller mask register */ -#define DMA_MODE 0x0D6 /* DMA controller mode register */ -#define DMA_RESETFF 0x0D8 /* DMA controller first/last flip flop */ - -/* DMA data */ -#define DMA_DISABLE 0x04 /* Disable channel n */ -#define DMA_ENABLE 0x00 /* Enable channel n */ -/* Demand transfers, incr. address, auto init, writes, ch. n */ -#define DMA_RX_MODE 0x14 -/* Demand transfers, incr. address, auto init, reads, ch. n */ -#define DMA_TX_MODE 0x18 - -#define DMA_SIZE (16*1024) /* Size of dma buffer - 16k */ - -#define CS8900 0x0000 -#define CS8920 0x4000 -#define CS8920M 0x6000 -#define REVISON_BITS 0x1F00 -#define EEVER_NUMBER 0x12 -#define CHKSUM_LEN 0x14 -#define CHKSUM_VAL 0x0000 -#define START_EEPROM_DATA 0x001c /* Offset into eeprom for start of data */ -#define IRQ_MAP_EEPROM_DATA 0x0046 /* Offset into eeprom for the IRQ map */ -#define IRQ_MAP_LEN 0x0004 /* No of bytes to read for the IRQ map */ -#define PNP_IRQ_FRMT 0x0022 /* PNP small item IRQ format */ -#define CS8900_IRQ_MAP 0x1c20 /* This IRQ map is fixed */ - -#define CS8920_NO_INTS 0x0F /* Max CS8920 interrupt select # */ - -#define PNP_ADD_PORT 0x0279 -#define PNP_WRITE_PORT 0x0A79 - -#define GET_PNP_ISA_STRUCT 0x40 -#define PNP_ISA_STRUCT_LEN 0x06 -#define PNP_CSN_CNT_OFF 0x01 -#define PNP_RD_PORT_OFF 0x02 -#define PNP_FUNCTION_OK 0x00 -#define PNP_WAKE 0x03 -#define PNP_RSRC_DATA 0x04 -#define PNP_RSRC_READY 0x01 -#define PNP_STATUS 0x05 -#define PNP_ACTIVATE 0x30 -#define PNP_CNF_IO_H 0x60 -#define PNP_CNF_IO_L 0x61 -#define PNP_CNF_INT 0x70 -#define PNP_CNF_DMA 0x74 -#define PNP_CNF_MEM 0x48 - -#define BIT0 1 -#define BIT15 0x8000 - -#define CS_DUPLEX_AUTO 0 -#define CS_DUPLEX_FULL 1 -#define CS_DUPLEX_HALF 2 - -/* - * It would appear that for pccards (well, the IBM EtherJet PCMCIA card) that - * are connected to card bus bridges there's a problem. For reading the - * value back you have to go into 8 bit mode. The Linux driver also uses - * this trick. This may be a bug in the card and how it handles fast 16-bit - * read after a write. - */ -#define HACK_FOR_CARDBUS_BRIDGE_PROBLEM -#ifdef HACK_FOR_CARDBUS_BRIDGE_PROBLEM -static __inline uint16_t -cs_inw(struct cs_softc *sc, int off) -{ - if (off & 1) - device_printf(sc->dev, "BUG: inw to an odd address.\n"); - return ((bus_read_1(sc->port_res, off)) | - (bus_read_1(sc->port_res, off + 1) << 8)); -} -#else -static __inline uint16_t -cs_inw(struct cs_softc *sc, int off) -{ - return (bus_read_2(sc->port_res, off)); -} -#endif - -static __inline void -cs_outw(struct cs_softc *sc, int off, uint16_t val) -{ - bus_write_2(sc->port_res, off, val); -} - -static __inline uint16_t -cs_readreg(struct cs_softc *sc, uint16_t port) -{ - cs_outw(sc, ADD_PORT, port); - return (cs_inw(sc, DATA_PORT)); -} -static __inline void -cs_writereg(struct cs_softc *sc, uint16_t port, uint16_t val) -{ - cs_outw(sc, ADD_PORT, port); - cs_outw(sc, DATA_PORT, val); -} - -static __inline void -reset_chip(struct cs_softc *sc) -{ - cs_writereg(sc, PP_SelfCTL, - cs_readreg(sc, PP_SelfCTL) | POWER_ON_RESET); -} - -#define cs_duplex_full(sc) \ - (cs_writereg(sc, PP_AutoNegCTL, FORCE_FDX)) - -#define cs_duplex_half(sc) \ - (cs_writereg(sc, PP_AutoNegCTL, NLP_ENABLE)) - diff --git a/sys/dev/cs/if_csvar.h b/sys/dev/cs/if_csvar.h deleted file mode 100644 index c49af45bb5ad..000000000000 --- a/sys/dev/cs/if_csvar.h +++ /dev/null @@ -1,82 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1999 M. Warner Losh <imp@village.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _IF_CSVAR_H -#define _IF_CSVAR_H - -/* - * cs_softc: per line info and status - */ -struct cs_softc { - /* Ethernet common code */ - struct ifnet *ifp; - device_t dev; - - /* Configuration words from EEPROM */ - int auto_neg_cnf; /* AutoNegotitation configuration */ - int adapter_cnf; /* Adapter configuration */ - int isa_config; /* ISA configuration */ - int chip_type; /* Type of chip */ - - u_char enaddr[ETHER_ADDR_LEN]; - - struct ifmedia media; /* Media information */ - - int port_rid; /* resource id for port range */ - struct resource* port_res; /* resource for port range */ - int irq_rid; /* resource id for irq */ - struct resource* irq_res; /* resource for irq */ - void* irq_handle; /* handle for irq handler */ - - int flags; -#define CS_NO_IRQ 0x1 - int send_cmd; - int line_ctl; /* */ - int send_underrun; - void *recv_ring; - - unsigned char *buffer; - int buf_len; - struct mtx lock; - struct callout timer; - int tx_timeout; -}; - -#define CS_LOCK(sc) mtx_lock(&(sc)->lock) -#define CS_UNLOCK(sc) mtx_unlock(&(sc)->lock) -#define CS_ASSERT_LOCKED(sc) mtx_assert(&(sc)->lock, MA_OWNED) - -int cs_alloc_port(device_t dev, int rid, int size); -int cs_alloc_irq(device_t dev, int rid); -int cs_attach(device_t dev); -int cs_cs89x0_probe(device_t dev); -int cs_detach(device_t dev); -void cs_release_resources(device_t dev); - -#endif /* _IF_CSVAR_H */ diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index cc9da10f008c..beb044ef61e7 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -272,7 +272,6 @@ device wb # Winbond W89C840F device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'') # ISA Ethernet NICs. pccard NICs included. -device cs # Crystal Semiconductor CS89x0 NIC # 'device ed' requires 'device miibus' device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards device ex # Intel EtherExpress Pro/10 and Pro/10+ diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES index 8d4e3a954c40..db2795b6828b 100644 --- a/sys/i386/conf/NOTES +++ b/sys/i386/conf/NOTES @@ -502,7 +502,6 @@ device cpufreq # V.35/RS-232/RS-530/RS-449/X.21/G.703/E1/E3/T3/STS-1 # serial adaptor (requires sppp (default), or NETGRAPH if # NETGRAPH_CRONYX is configured) -# cs: IBM Etherjet and other Crystal Semi CS89x0-based adapters # ctau: Cronyx Tau sync dual port V.35/RS-232/RS-530/RS-449/X.21/G.703/E1 # serial adaptor (requires sppp (default), or NETGRAPH if # NETGRAPH_CRONYX is configured) @@ -529,7 +528,6 @@ device cpufreq device bxe # Broadcom NetXtreme II BCM5771X/BCM578XX 10GbE device ce device cp -device cs # Crystal Semiconductor CS89x0 NIC hint.cs.0.at="isa" hint.cs.0.port="0x300" device ctau diff --git a/sys/modules/Makefile b/sys/modules/Makefile index b545b66d40fd..0ae9c6266b17 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -98,7 +98,6 @@ SUBDIR= \ ${_cpufreq} \ ${_crypto} \ ${_cryptodev} \ - ${_cs} \ ${_ctau} \ ctl \ ${_cxgb} \ @@ -600,7 +599,6 @@ _cardbus= cardbus _cbb= cbb _cpuctl= cpuctl _cpufreq= cpufreq -_cs= cs _dpms= dpms _ed= ed _em= em diff --git a/sys/modules/cs/Makefile b/sys/modules/cs/Makefile deleted file mode 100644 index d457128a57e7..000000000000 --- a/sys/modules/cs/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $FreeBSD$ - -.PATH: ${SRCTOP}/sys/dev/cs - -KMOD= if_cs -SRCS= if_cs.c if_cs_isa.c if_cs_pccard.c -SRCS+= bus_if.h card_if.h device_if.h isa_if.h pccarddevs.h - -.include <bsd.kmod.mk> |