Removed NetBSD support, which bit-rotted long ago.
Changed new SMP locking macros given the new situation.
This commit is contained in:
parent
c4ff4a8467
commit
9492779067
@ -2,7 +2,7 @@
|
||||
* Copyright (c) 1995, David Greenman
|
||||
* All rights reserved.
|
||||
*
|
||||
* Modifications to support NetBSD and media selection:
|
||||
* Modifications to support media selection:
|
||||
* Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -51,34 +51,6 @@
|
||||
#endif
|
||||
|
||||
#include <net/bpf.h>
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/device.h>
|
||||
|
||||
#include <net/if_dl.h>
|
||||
#include <net/if_ether.h>
|
||||
|
||||
#include <netinet/if_inarp.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/bus.h>
|
||||
#include <machine/intr.h>
|
||||
|
||||
#include <dev/pci/if_fxpreg.h>
|
||||
#include <dev/pci/if_fxpvar.h>
|
||||
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcidevs.h>
|
||||
|
||||
|
||||
#else /* __FreeBSD__ */
|
||||
|
||||
#include <sys/sockio.h>
|
||||
#include <sys/bus.h>
|
||||
#include <machine/bus.h>
|
||||
@ -99,8 +71,6 @@
|
||||
#include <pci/if_fxpreg.h>
|
||||
#include <pci/if_fxpvar.h>
|
||||
|
||||
#endif /* __NetBSD__ */
|
||||
|
||||
#ifdef __alpha__ /* XXX */
|
||||
/* XXX XXX NEED REAL DMA MAPPING SUPPORT XXX XXX */
|
||||
#undef vtophys
|
||||
@ -222,10 +192,10 @@ static void fxp_mediastatus __P((struct ifnet *, struct ifmediareq *));
|
||||
static void fxp_set_media __P((struct fxp_softc *, int));
|
||||
static __inline void fxp_scb_wait __P((struct fxp_softc *));
|
||||
static __inline void fxp_dma_wait __P((volatile u_int16_t *, struct fxp_softc *sc));
|
||||
static FXP_INTR_TYPE fxp_intr __P((void *));
|
||||
static void fxp_intr __P((void *));
|
||||
static void fxp_start __P((struct ifnet *));
|
||||
static int fxp_ioctl __P((struct ifnet *,
|
||||
FXP_IOCTLCMD_TYPE, caddr_t));
|
||||
u_long, caddr_t));
|
||||
static void fxp_init __P((void *));
|
||||
static void fxp_stop __P((struct fxp_softc *));
|
||||
static void fxp_watchdog __P((struct ifnet *));
|
||||
@ -294,7 +264,7 @@ fxp_scb_wait(sc)
|
||||
while (CSR_READ_1(sc, FXP_CSR_SCB_COMMAND) && --i)
|
||||
DELAY(2);
|
||||
if (i == 0)
|
||||
printf(FXP_FORMAT ": SCB timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: SCB timeout\n", FXP_UNIT(sc));
|
||||
}
|
||||
|
||||
static __inline void
|
||||
@ -307,207 +277,9 @@ fxp_dma_wait(status, sc)
|
||||
while (!(*status & FXP_CB_STATUS_C) && --i)
|
||||
DELAY(2);
|
||||
if (i == 0)
|
||||
printf(FXP_FORMAT ": DMA timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: DMA timeout\n", FXP_UNIT(sc));
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* Operating system-specific autoconfiguration glue
|
||||
*************************************************************/
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
|
||||
#ifdef __BROKEN_INDIRECT_CONFIG
|
||||
static int fxp_match __P((struct device *, void *, void *));
|
||||
#else
|
||||
static int fxp_match __P((struct device *, struct cfdata *, void *));
|
||||
#endif
|
||||
static void fxp_attach __P((struct device *, struct device *, void *));
|
||||
|
||||
static void fxp_shutdown __P((void *));
|
||||
|
||||
/* Compensate for lack of a generic ether_ioctl() */
|
||||
static int fxp_ether_ioctl __P((struct ifnet *,
|
||||
FXP_IOCTLCMD_TYPE, caddr_t));
|
||||
#define ether_ioctl fxp_ether_ioctl
|
||||
|
||||
struct cfattach fxp_ca = {
|
||||
sizeof(struct fxp_softc), fxp_match, fxp_attach
|
||||
};
|
||||
|
||||
struct cfdriver fxp_cd = {
|
||||
NULL, "fxp", DV_IFNET
|
||||
};
|
||||
|
||||
/*
|
||||
* Check if a device is an 82557.
|
||||
*/
|
||||
static int
|
||||
fxp_match(parent, match, aux)
|
||||
struct device *parent;
|
||||
#ifdef __BROKEN_INDIRECT_CONFIG
|
||||
void *match;
|
||||
#else
|
||||
struct cfdata *match;
|
||||
#endif
|
||||
void *aux;
|
||||
{
|
||||
struct pci_attach_args *pa = aux;
|
||||
|
||||
if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
|
||||
return (0);
|
||||
|
||||
switch (PCI_PRODUCT(pa->pa_id)) {
|
||||
case PCI_PRODUCT_INTEL_82557:
|
||||
return (1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
fxp_attach(parent, self, aux)
|
||||
struct device *parent, *self;
|
||||
void *aux;
|
||||
{
|
||||
struct fxp_softc *sc = (struct fxp_softc *)self;
|
||||
struct pci_attach_args *pa = aux;
|
||||
pci_chipset_tag_t pc = pa->pa_pc;
|
||||
pci_intr_handle_t ih;
|
||||
const char *intrstr = NULL;
|
||||
u_int8_t enaddr[6];
|
||||
struct ifnet *ifp;
|
||||
|
||||
/*
|
||||
* Map control/status registers.
|
||||
*/
|
||||
if (pci_mapreg_map(pa, FXP_PCI_MMBA, PCI_MAPREG_TYPE_MEM, 0,
|
||||
&sc->sc_st, &sc->sc_sh, NULL, NULL)) {
|
||||
printf(": can't map registers\n");
|
||||
return;
|
||||
}
|
||||
printf(": Intel EtherExpress Pro 10/100B Ethernet\n");
|
||||
|
||||
/*
|
||||
* Allocate our interrupt.
|
||||
*/
|
||||
if (pci_intr_map(pc, pa->pa_intrtag, pa->pa_intrpin,
|
||||
pa->pa_intrline, &ih)) {
|
||||
printf("%s: couldn't map interrupt\n", sc->sc_dev.dv_xname);
|
||||
return;
|
||||
}
|
||||
intrstr = pci_intr_string(pc, ih);
|
||||
sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, fxp_intr, sc);
|
||||
if (sc->sc_ih == NULL) {
|
||||
printf("%s: couldn't establish interrupt",
|
||||
sc->sc_dev.dv_xname);
|
||||
if (intrstr != NULL)
|
||||
printf(" at %s", intrstr);
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
printf("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
|
||||
|
||||
/* Do generic parts of attach. */
|
||||
if (fxp_attach_common(sc, enaddr)) {
|
||||
/* Failed! */
|
||||
return;
|
||||
}
|
||||
|
||||
printf("%s: Ethernet address %s%s\n", sc->sc_dev.dv_xname,
|
||||
ether_sprintf(enaddr), sc->phy_10Mbps_only ? ", 10Mbps" : "");
|
||||
|
||||
ifp = &sc->sc_ethercom.ec_if;
|
||||
bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
|
||||
ifp->if_softc = sc;
|
||||
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
|
||||
ifp->if_ioctl = fxp_ioctl;
|
||||
ifp->if_start = fxp_start;
|
||||
ifp->if_watchdog = fxp_watchdog;
|
||||
|
||||
/*
|
||||
* Attach the interface.
|
||||
*/
|
||||
if_attach(ifp);
|
||||
/*
|
||||
* Let the system queue as many packets as we have available
|
||||
* TX descriptors.
|
||||
*/
|
||||
ifp->if_snd.ifq_maxlen = FXP_NTXCB - 1;
|
||||
ether_ifattach(ifp, enaddr);
|
||||
bpfattach(&sc->sc_ethercom.ec_if.if_bpf, ifp, DLT_EN10MB,
|
||||
sizeof(struct ether_header));
|
||||
|
||||
/*
|
||||
* Add shutdown hook so that DMA is disabled prior to reboot. Not
|
||||
* doing do could allow DMA to corrupt kernel memory during the
|
||||
* reboot before the driver initializes.
|
||||
*/
|
||||
shutdownhook_establish(fxp_shutdown, sc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Device shutdown routine. Called at system shutdown after sync. The
|
||||
* main purpose of this routine is to shut off receiver DMA so that
|
||||
* kernel memory doesn't get clobbered during warmboot.
|
||||
*/
|
||||
static void
|
||||
fxp_shutdown(sc)
|
||||
void *sc;
|
||||
{
|
||||
fxp_stop((struct fxp_softc *) sc);
|
||||
}
|
||||
|
||||
static int
|
||||
fxp_ether_ioctl(ifp, cmd, data)
|
||||
struct ifnet *ifp;
|
||||
FXP_IOCTLCMD_TYPE cmd;
|
||||
caddr_t data;
|
||||
{
|
||||
struct ifaddr *ifa = (struct ifaddr *) data;
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
ifp->if_flags |= IFF_UP;
|
||||
|
||||
switch (ifa->ifa_addr->sa_family) {
|
||||
#ifdef INET
|
||||
case AF_INET:
|
||||
fxp_init(sc);
|
||||
arp_ifinit(ifp, ifa);
|
||||
break;
|
||||
#endif
|
||||
#ifdef NS
|
||||
case AF_NS:
|
||||
{
|
||||
register struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
|
||||
|
||||
if (ns_nullhost(*ina))
|
||||
ina->x_host = *(union ns_host *)
|
||||
LLADDR(ifp->if_sadl);
|
||||
else
|
||||
bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
|
||||
ifp->if_addrlen);
|
||||
/* Set new address. */
|
||||
fxp_init(sc);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
fxp_init(sc);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
#else /* __FreeBSD__ */
|
||||
|
||||
/*
|
||||
* Return identification string if this is device is ours.
|
||||
*/
|
||||
@ -540,16 +312,13 @@ fxp_attach(device_t dev)
|
||||
int error = 0;
|
||||
struct fxp_softc *sc = device_get_softc(dev);
|
||||
struct ifnet *ifp;
|
||||
FXP_SPLVAR(s)
|
||||
u_long val;
|
||||
int rid;
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
mtx_init(&sc->sc_mtx, "fxp", MTX_DEF);
|
||||
#endif
|
||||
callout_handle_init(&sc->stat_ch);
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
/*
|
||||
* Enable bus mastering.
|
||||
@ -627,11 +396,11 @@ fxp_attach(device_t dev)
|
||||
*/
|
||||
ifp->if_snd.ifq_maxlen = FXP_NTXCB - 1;
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
mtx_destroy(&sc->sc_mtx);
|
||||
return error;
|
||||
}
|
||||
@ -643,9 +412,8 @@ static int
|
||||
fxp_detach(device_t dev)
|
||||
{
|
||||
struct fxp_softc *sc = device_get_softc(dev);
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
/*
|
||||
* Close down routes etc.
|
||||
@ -682,7 +450,7 @@ fxp_detach(device_t dev)
|
||||
free(sc->fxp_stats, M_DEVBUF);
|
||||
free(sc->mcsp, M_DEVBUF);
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -714,9 +482,8 @@ fxp_suspend(device_t dev)
|
||||
{
|
||||
struct fxp_softc *sc = device_get_softc(dev);
|
||||
int i;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
fxp_stop(sc);
|
||||
|
||||
@ -729,7 +496,7 @@ fxp_suspend(device_t dev)
|
||||
|
||||
sc->suspended = 1;
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -746,9 +513,8 @@ fxp_resume(device_t dev)
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
u_int16_t pci_command;
|
||||
int i;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
/* better way to do this? */
|
||||
for (i=0; i<5; i++)
|
||||
@ -772,7 +538,7 @@ fxp_resume(device_t dev)
|
||||
|
||||
sc->suspended = 0;
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -799,12 +565,6 @@ static devclass_t fxp_devclass;
|
||||
|
||||
DRIVER_MODULE(if_fxp, pci, fxp_driver, fxp_devclass, 0, 0);
|
||||
|
||||
#endif /* __NetBSD__ */
|
||||
|
||||
/*************************************************************
|
||||
* End of operating system-specific autoconfiguration glue
|
||||
*************************************************************/
|
||||
|
||||
/*
|
||||
* Do generic parts of attach.
|
||||
*/
|
||||
@ -892,7 +652,7 @@ fxp_attach_common(sc, enaddr)
|
||||
return (0);
|
||||
|
||||
fail:
|
||||
printf(FXP_FORMAT ": Failed to malloc memory\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: Failed to malloc memory\n", FXP_UNIT(sc));
|
||||
if (sc->cbl_base)
|
||||
free(sc->cbl_base, M_DEVBUF);
|
||||
if (sc->fxp_stats)
|
||||
@ -1056,18 +816,15 @@ fxp_start(ifp)
|
||||
{
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
struct fxp_cb_tx *txp;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_LOCK(sc, s);
|
||||
#endif
|
||||
FXP_LOCK(sc);
|
||||
/*
|
||||
* See if we need to suspend xmit until the multicast filter
|
||||
* has been reprogrammed (which can only be done at the head
|
||||
* of the command chain).
|
||||
*/
|
||||
if (sc->need_mcsetup) {
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1186,7 +943,7 @@ fxp_start(ifp)
|
||||
* Pass packet to bpf if there is a listener.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(FXP_BPFTAP_ARG(ifp), mb_head);
|
||||
bpf_mtap(ifp, mb_head);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1197,37 +954,28 @@ fxp_start(ifp)
|
||||
fxp_scb_wait(sc);
|
||||
CSR_WRITE_1(sc, FXP_CSR_SCB_COMMAND, FXP_SCB_COMMAND_CU_RESUME);
|
||||
}
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_UNLOCK(sc, s);
|
||||
#endif
|
||||
FXP_UNLOCK(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process interface interrupts.
|
||||
*/
|
||||
static FXP_INTR_TYPE
|
||||
static void
|
||||
fxp_intr(arg)
|
||||
void *arg;
|
||||
{
|
||||
struct fxp_softc *sc = arg;
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
u_int8_t statack;
|
||||
FXP_SPLVAR(s)
|
||||
#if defined(__NetBSD__)
|
||||
int claimed = 0;
|
||||
#endif
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
if (sc->suspended) {
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0) {
|
||||
#if defined(__NetBSD__)
|
||||
claimed = 1;
|
||||
#endif
|
||||
/*
|
||||
* First ACK all the interrupts in this pass.
|
||||
*/
|
||||
@ -1328,11 +1076,7 @@ fxp_intr(arg)
|
||||
}
|
||||
}
|
||||
}
|
||||
#if defined(__NetBSD__)
|
||||
return (claimed);
|
||||
#else
|
||||
FXP_UNLOCK(sc, s);
|
||||
#endif
|
||||
FXP_UNLOCK(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1354,7 +1098,6 @@ fxp_stats_update(arg)
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
struct fxp_stats *sp = sc->fxp_stats;
|
||||
struct fxp_cb_tx *txp;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
ifp->if_opackets += sp->tx_good;
|
||||
ifp->if_collisions += sp->tx_total_collisions;
|
||||
@ -1381,7 +1124,7 @@ fxp_stats_update(arg)
|
||||
if (tx_threshold < 192)
|
||||
tx_threshold += 64;
|
||||
}
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
/*
|
||||
* Release any xmit buffers that have completed DMA. This isn't
|
||||
* strictly necessary to do here, but it's advantagous for mbufs
|
||||
@ -1439,7 +1182,7 @@ fxp_stats_update(arg)
|
||||
sp->rx_rnr_errors = 0;
|
||||
sp->rx_overrun_errors = 0;
|
||||
}
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
/*
|
||||
* Schedule another timeout one second from now.
|
||||
*/
|
||||
@ -1457,11 +1200,8 @@ fxp_stop(sc)
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
struct fxp_cb_tx *txp;
|
||||
int i;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_LOCK(sc, s);
|
||||
#endif
|
||||
FXP_LOCK(sc);
|
||||
|
||||
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
|
||||
ifp->if_timer = 0;
|
||||
@ -1509,9 +1249,7 @@ fxp_stop(sc)
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_UNLOCK(sc, s);
|
||||
#endif
|
||||
FXP_UNLOCK(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1526,7 +1264,7 @@ fxp_watchdog(ifp)
|
||||
{
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
|
||||
printf(FXP_FORMAT ": device timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: device timeout\n", FXP_UNIT(sc));
|
||||
ifp->if_oerrors++;
|
||||
|
||||
fxp_init(sc);
|
||||
@ -1542,9 +1280,8 @@ fxp_init(xsc)
|
||||
struct fxp_cb_ias *cb_ias;
|
||||
struct fxp_cb_tx *txp;
|
||||
int i, prm;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
/*
|
||||
* Cancel any pending I/O
|
||||
*/
|
||||
@ -1636,13 +1373,9 @@ fxp_init(xsc)
|
||||
cb_ias->cb_status = 0;
|
||||
cb_ias->cb_command = FXP_CB_COMMAND_IAS | FXP_CB_COMMAND_EL;
|
||||
cb_ias->link_addr = -1;
|
||||
#if defined(__NetBSD__)
|
||||
bcopy(LLADDR(ifp->if_sadl), (void *)cb_ias->macaddr, 6);
|
||||
#else
|
||||
bcopy(sc->arpcom.ac_enaddr,
|
||||
(void *)(uintptr_t)(volatile void *)cb_ias->macaddr,
|
||||
sizeof(sc->arpcom.ac_enaddr));
|
||||
#endif /* __NetBSD__ */
|
||||
|
||||
/*
|
||||
* Start the IAS (Individual Address Setup) command/DMA.
|
||||
@ -1691,7 +1424,7 @@ fxp_init(xsc)
|
||||
|
||||
ifp->if_flags |= IFF_RUNNING;
|
||||
ifp->if_flags &= ~IFF_OACTIVE;
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
/*
|
||||
* Start stats updater.
|
||||
@ -1745,9 +1478,8 @@ fxp_set_media(sc, media)
|
||||
case FXP_PHY_80C24:
|
||||
break;
|
||||
default:
|
||||
printf(FXP_FORMAT
|
||||
": warning: unsupported PHY, type = %d, addr = %d\n",
|
||||
FXP_ARGS(sc), sc->phy_primary_device,
|
||||
printf("fxp%d: warning: unsupported PHY, type = %d, addr = %d\n",
|
||||
FXP_UNIT(sc), sc->phy_primary_device,
|
||||
sc->phy_primary_addr);
|
||||
}
|
||||
}
|
||||
@ -1948,8 +1680,7 @@ fxp_mdi_read(sc, phy, reg)
|
||||
DELAY(10);
|
||||
|
||||
if (count <= 0)
|
||||
printf(FXP_FORMAT ": fxp_mdi_read: timed out\n",
|
||||
FXP_ARGS(sc));
|
||||
printf("fxp%d: fxp_mdi_read: timed out\n", FXP_UNIT(sc));
|
||||
|
||||
return (value & 0xffff);
|
||||
}
|
||||
@ -1972,30 +1703,26 @@ fxp_mdi_write(sc, phy, reg, value)
|
||||
DELAY(10);
|
||||
|
||||
if (count <= 0)
|
||||
printf(FXP_FORMAT ": fxp_mdi_write: timed out\n",
|
||||
FXP_ARGS(sc));
|
||||
printf("fxp%d: fxp_mdi_write: timed out\n", FXP_UNIT(sc));
|
||||
}
|
||||
|
||||
static int
|
||||
fxp_ioctl(ifp, command, data)
|
||||
struct ifnet *ifp;
|
||||
FXP_IOCTLCMD_TYPE command;
|
||||
u_long command;
|
||||
caddr_t data;
|
||||
{
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
struct ifreq *ifr = (struct ifreq *)data;
|
||||
FXP_SPLVAR(s)
|
||||
int error = 0;
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
switch (command) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
#if !defined(__NetBSD__)
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
#endif
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
@ -2019,27 +1746,6 @@ fxp_ioctl(ifp, command, data)
|
||||
case SIOCADDMULTI:
|
||||
case SIOCDELMULTI:
|
||||
sc->all_mcasts = (ifp->if_flags & IFF_ALLMULTI) ? 1 : 0;
|
||||
#if defined(__NetBSD__)
|
||||
error = (command == SIOCADDMULTI) ?
|
||||
ether_addmulti(ifr, &sc->sc_ethercom) :
|
||||
ether_delmulti(ifr, &sc->sc_ethercom);
|
||||
|
||||
if (error == ENETRESET) {
|
||||
/*
|
||||
* Multicast list has changed; set the hardware
|
||||
* filter accordingly.
|
||||
*/
|
||||
if (!sc->all_mcasts)
|
||||
fxp_mc_setup(sc);
|
||||
/*
|
||||
* fxp_mc_setup() can turn on all_mcasts if we run
|
||||
* out of space, so check it again rather than else {}.
|
||||
*/
|
||||
if (sc->all_mcasts)
|
||||
fxp_init(sc);
|
||||
error = 0;
|
||||
}
|
||||
#else /* __FreeBSD__ */
|
||||
/*
|
||||
* Multicast list has changed; set the hardware filter
|
||||
* accordingly.
|
||||
@ -2053,7 +1759,6 @@ fxp_ioctl(ifp, command, data)
|
||||
if (sc->all_mcasts)
|
||||
fxp_init(sc);
|
||||
error = 0;
|
||||
#endif /* __NetBSD__ */
|
||||
break;
|
||||
|
||||
case SIOCSIFMEDIA:
|
||||
@ -2064,7 +1769,7 @@ fxp_ioctl(ifp, command, data)
|
||||
default:
|
||||
error = EINVAL;
|
||||
}
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -2178,7 +1883,7 @@ fxp_mc_setup(sc)
|
||||
FXP_SCB_CUS_ACTIVE && --count)
|
||||
DELAY(10);
|
||||
if (count == 0) {
|
||||
printf(FXP_FORMAT ": command queue timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: command queue timeout\n", FXP_UNIT(sc));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2,9 +2,6 @@
|
||||
* Copyright (c) 1995, David Greenman
|
||||
* All rights reserved.
|
||||
*
|
||||
* Modifications to support NetBSD:
|
||||
* Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
@ -39,17 +36,11 @@
|
||||
* for functional grouping.
|
||||
*/
|
||||
struct fxp_softc {
|
||||
#if defined(__NetBSD__)
|
||||
struct device sc_dev; /* generic device structures */
|
||||
void *sc_ih; /* interrupt handler cookie */
|
||||
struct ethercom sc_ethercom; /* ethernet common part */
|
||||
#else
|
||||
struct arpcom arpcom; /* per-interface network data */
|
||||
struct resource *mem; /* resource descriptor for registers */
|
||||
struct resource *irq; /* resource descriptor for interrupt */
|
||||
void *ih; /* interrupt handler cookie */
|
||||
struct mtx sc_mtx;
|
||||
#endif /* __NetBSD__ */
|
||||
bus_space_tag_t sc_st; /* bus space tag */
|
||||
bus_space_handle_t sc_sh; /* bus space handle */
|
||||
struct mbuf *rfa_headm; /* first mbuf in receive frame area */
|
||||
@ -91,25 +82,7 @@ struct fxp_softc {
|
||||
#define CSR_WRITE_4(sc, reg, val) \
|
||||
bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
|
||||
|
||||
/* Deal with slight differences in software interfaces. */
|
||||
#if defined(__NetBSD__)
|
||||
#define sc_if sc_ethercom.ec_if
|
||||
#define FXP_FORMAT "%s"
|
||||
#define FXP_ARGS(sc) (sc)->sc_dev.dv_xname
|
||||
#define FXP_INTR_TYPE int
|
||||
#define FXP_IOCTLCMD_TYPE u_long
|
||||
#define FXP_BPFTAP_ARG(ifp) (ifp)->if_bpf
|
||||
#define FXP_SPLVAR(x) int x;
|
||||
#define FXP_LOCK(sc, x) x = splimp()
|
||||
#define FXP_UNLOCK(sc, x) splx(x)
|
||||
#else /* __FreeBSD__ */
|
||||
#define sc_if arpcom.ac_if
|
||||
#define FXP_FORMAT "fxp%d"
|
||||
#define FXP_ARGS(sc) (sc)->arpcom.ac_if.if_unit
|
||||
#define FXP_INTR_TYPE void
|
||||
#define FXP_IOCTLCMD_TYPE u_long
|
||||
#define FXP_BPFTAP_ARG(ifp) ifp
|
||||
#define FXP_SPLVAR(s)
|
||||
#define FXP_LOCK(_sc, x) mtx_enter(&(_sc)->sc_mtx, MTX_DEF)
|
||||
#define FXP_UNLOCK(_sc, x) mtx_exit(&(_sc)->sc_mtx, MTX_DEF)
|
||||
#endif /* __NetBSD__ */
|
||||
#define FXP_UNIT(_sc) (_sc)->arpcom.ac_if.if_unit
|
||||
#define FXP_LOCK(_sc) mtx_enter(&(_sc)->sc_mtx, MTX_DEF)
|
||||
#define FXP_UNLOCK(_sc) mtx_exit(&(_sc)->sc_mtx, MTX_DEF)
|
||||
|
371
sys/pci/if_fxp.c
371
sys/pci/if_fxp.c
@ -2,7 +2,7 @@
|
||||
* Copyright (c) 1995, David Greenman
|
||||
* All rights reserved.
|
||||
*
|
||||
* Modifications to support NetBSD and media selection:
|
||||
* Modifications to support media selection:
|
||||
* Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -51,34 +51,6 @@
|
||||
#endif
|
||||
|
||||
#include <net/bpf.h>
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/device.h>
|
||||
|
||||
#include <net/if_dl.h>
|
||||
#include <net/if_ether.h>
|
||||
|
||||
#include <netinet/if_inarp.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/bus.h>
|
||||
#include <machine/intr.h>
|
||||
|
||||
#include <dev/pci/if_fxpreg.h>
|
||||
#include <dev/pci/if_fxpvar.h>
|
||||
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcidevs.h>
|
||||
|
||||
|
||||
#else /* __FreeBSD__ */
|
||||
|
||||
#include <sys/sockio.h>
|
||||
#include <sys/bus.h>
|
||||
#include <machine/bus.h>
|
||||
@ -99,8 +71,6 @@
|
||||
#include <pci/if_fxpreg.h>
|
||||
#include <pci/if_fxpvar.h>
|
||||
|
||||
#endif /* __NetBSD__ */
|
||||
|
||||
#ifdef __alpha__ /* XXX */
|
||||
/* XXX XXX NEED REAL DMA MAPPING SUPPORT XXX XXX */
|
||||
#undef vtophys
|
||||
@ -222,10 +192,10 @@ static void fxp_mediastatus __P((struct ifnet *, struct ifmediareq *));
|
||||
static void fxp_set_media __P((struct fxp_softc *, int));
|
||||
static __inline void fxp_scb_wait __P((struct fxp_softc *));
|
||||
static __inline void fxp_dma_wait __P((volatile u_int16_t *, struct fxp_softc *sc));
|
||||
static FXP_INTR_TYPE fxp_intr __P((void *));
|
||||
static void fxp_intr __P((void *));
|
||||
static void fxp_start __P((struct ifnet *));
|
||||
static int fxp_ioctl __P((struct ifnet *,
|
||||
FXP_IOCTLCMD_TYPE, caddr_t));
|
||||
u_long, caddr_t));
|
||||
static void fxp_init __P((void *));
|
||||
static void fxp_stop __P((struct fxp_softc *));
|
||||
static void fxp_watchdog __P((struct ifnet *));
|
||||
@ -294,7 +264,7 @@ fxp_scb_wait(sc)
|
||||
while (CSR_READ_1(sc, FXP_CSR_SCB_COMMAND) && --i)
|
||||
DELAY(2);
|
||||
if (i == 0)
|
||||
printf(FXP_FORMAT ": SCB timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: SCB timeout\n", FXP_UNIT(sc));
|
||||
}
|
||||
|
||||
static __inline void
|
||||
@ -307,207 +277,9 @@ fxp_dma_wait(status, sc)
|
||||
while (!(*status & FXP_CB_STATUS_C) && --i)
|
||||
DELAY(2);
|
||||
if (i == 0)
|
||||
printf(FXP_FORMAT ": DMA timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: DMA timeout\n", FXP_UNIT(sc));
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* Operating system-specific autoconfiguration glue
|
||||
*************************************************************/
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
|
||||
#ifdef __BROKEN_INDIRECT_CONFIG
|
||||
static int fxp_match __P((struct device *, void *, void *));
|
||||
#else
|
||||
static int fxp_match __P((struct device *, struct cfdata *, void *));
|
||||
#endif
|
||||
static void fxp_attach __P((struct device *, struct device *, void *));
|
||||
|
||||
static void fxp_shutdown __P((void *));
|
||||
|
||||
/* Compensate for lack of a generic ether_ioctl() */
|
||||
static int fxp_ether_ioctl __P((struct ifnet *,
|
||||
FXP_IOCTLCMD_TYPE, caddr_t));
|
||||
#define ether_ioctl fxp_ether_ioctl
|
||||
|
||||
struct cfattach fxp_ca = {
|
||||
sizeof(struct fxp_softc), fxp_match, fxp_attach
|
||||
};
|
||||
|
||||
struct cfdriver fxp_cd = {
|
||||
NULL, "fxp", DV_IFNET
|
||||
};
|
||||
|
||||
/*
|
||||
* Check if a device is an 82557.
|
||||
*/
|
||||
static int
|
||||
fxp_match(parent, match, aux)
|
||||
struct device *parent;
|
||||
#ifdef __BROKEN_INDIRECT_CONFIG
|
||||
void *match;
|
||||
#else
|
||||
struct cfdata *match;
|
||||
#endif
|
||||
void *aux;
|
||||
{
|
||||
struct pci_attach_args *pa = aux;
|
||||
|
||||
if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
|
||||
return (0);
|
||||
|
||||
switch (PCI_PRODUCT(pa->pa_id)) {
|
||||
case PCI_PRODUCT_INTEL_82557:
|
||||
return (1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
fxp_attach(parent, self, aux)
|
||||
struct device *parent, *self;
|
||||
void *aux;
|
||||
{
|
||||
struct fxp_softc *sc = (struct fxp_softc *)self;
|
||||
struct pci_attach_args *pa = aux;
|
||||
pci_chipset_tag_t pc = pa->pa_pc;
|
||||
pci_intr_handle_t ih;
|
||||
const char *intrstr = NULL;
|
||||
u_int8_t enaddr[6];
|
||||
struct ifnet *ifp;
|
||||
|
||||
/*
|
||||
* Map control/status registers.
|
||||
*/
|
||||
if (pci_mapreg_map(pa, FXP_PCI_MMBA, PCI_MAPREG_TYPE_MEM, 0,
|
||||
&sc->sc_st, &sc->sc_sh, NULL, NULL)) {
|
||||
printf(": can't map registers\n");
|
||||
return;
|
||||
}
|
||||
printf(": Intel EtherExpress Pro 10/100B Ethernet\n");
|
||||
|
||||
/*
|
||||
* Allocate our interrupt.
|
||||
*/
|
||||
if (pci_intr_map(pc, pa->pa_intrtag, pa->pa_intrpin,
|
||||
pa->pa_intrline, &ih)) {
|
||||
printf("%s: couldn't map interrupt\n", sc->sc_dev.dv_xname);
|
||||
return;
|
||||
}
|
||||
intrstr = pci_intr_string(pc, ih);
|
||||
sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, fxp_intr, sc);
|
||||
if (sc->sc_ih == NULL) {
|
||||
printf("%s: couldn't establish interrupt",
|
||||
sc->sc_dev.dv_xname);
|
||||
if (intrstr != NULL)
|
||||
printf(" at %s", intrstr);
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
printf("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
|
||||
|
||||
/* Do generic parts of attach. */
|
||||
if (fxp_attach_common(sc, enaddr)) {
|
||||
/* Failed! */
|
||||
return;
|
||||
}
|
||||
|
||||
printf("%s: Ethernet address %s%s\n", sc->sc_dev.dv_xname,
|
||||
ether_sprintf(enaddr), sc->phy_10Mbps_only ? ", 10Mbps" : "");
|
||||
|
||||
ifp = &sc->sc_ethercom.ec_if;
|
||||
bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
|
||||
ifp->if_softc = sc;
|
||||
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
|
||||
ifp->if_ioctl = fxp_ioctl;
|
||||
ifp->if_start = fxp_start;
|
||||
ifp->if_watchdog = fxp_watchdog;
|
||||
|
||||
/*
|
||||
* Attach the interface.
|
||||
*/
|
||||
if_attach(ifp);
|
||||
/*
|
||||
* Let the system queue as many packets as we have available
|
||||
* TX descriptors.
|
||||
*/
|
||||
ifp->if_snd.ifq_maxlen = FXP_NTXCB - 1;
|
||||
ether_ifattach(ifp, enaddr);
|
||||
bpfattach(&sc->sc_ethercom.ec_if.if_bpf, ifp, DLT_EN10MB,
|
||||
sizeof(struct ether_header));
|
||||
|
||||
/*
|
||||
* Add shutdown hook so that DMA is disabled prior to reboot. Not
|
||||
* doing do could allow DMA to corrupt kernel memory during the
|
||||
* reboot before the driver initializes.
|
||||
*/
|
||||
shutdownhook_establish(fxp_shutdown, sc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Device shutdown routine. Called at system shutdown after sync. The
|
||||
* main purpose of this routine is to shut off receiver DMA so that
|
||||
* kernel memory doesn't get clobbered during warmboot.
|
||||
*/
|
||||
static void
|
||||
fxp_shutdown(sc)
|
||||
void *sc;
|
||||
{
|
||||
fxp_stop((struct fxp_softc *) sc);
|
||||
}
|
||||
|
||||
static int
|
||||
fxp_ether_ioctl(ifp, cmd, data)
|
||||
struct ifnet *ifp;
|
||||
FXP_IOCTLCMD_TYPE cmd;
|
||||
caddr_t data;
|
||||
{
|
||||
struct ifaddr *ifa = (struct ifaddr *) data;
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
ifp->if_flags |= IFF_UP;
|
||||
|
||||
switch (ifa->ifa_addr->sa_family) {
|
||||
#ifdef INET
|
||||
case AF_INET:
|
||||
fxp_init(sc);
|
||||
arp_ifinit(ifp, ifa);
|
||||
break;
|
||||
#endif
|
||||
#ifdef NS
|
||||
case AF_NS:
|
||||
{
|
||||
register struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
|
||||
|
||||
if (ns_nullhost(*ina))
|
||||
ina->x_host = *(union ns_host *)
|
||||
LLADDR(ifp->if_sadl);
|
||||
else
|
||||
bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl),
|
||||
ifp->if_addrlen);
|
||||
/* Set new address. */
|
||||
fxp_init(sc);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
fxp_init(sc);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
#else /* __FreeBSD__ */
|
||||
|
||||
/*
|
||||
* Return identification string if this is device is ours.
|
||||
*/
|
||||
@ -540,16 +312,13 @@ fxp_attach(device_t dev)
|
||||
int error = 0;
|
||||
struct fxp_softc *sc = device_get_softc(dev);
|
||||
struct ifnet *ifp;
|
||||
FXP_SPLVAR(s)
|
||||
u_long val;
|
||||
int rid;
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
mtx_init(&sc->sc_mtx, "fxp", MTX_DEF);
|
||||
#endif
|
||||
callout_handle_init(&sc->stat_ch);
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
/*
|
||||
* Enable bus mastering.
|
||||
@ -627,11 +396,11 @@ fxp_attach(device_t dev)
|
||||
*/
|
||||
ifp->if_snd.ifq_maxlen = FXP_NTXCB - 1;
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
mtx_destroy(&sc->sc_mtx);
|
||||
return error;
|
||||
}
|
||||
@ -643,9 +412,8 @@ static int
|
||||
fxp_detach(device_t dev)
|
||||
{
|
||||
struct fxp_softc *sc = device_get_softc(dev);
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
/*
|
||||
* Close down routes etc.
|
||||
@ -682,7 +450,7 @@ fxp_detach(device_t dev)
|
||||
free(sc->fxp_stats, M_DEVBUF);
|
||||
free(sc->mcsp, M_DEVBUF);
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -714,9 +482,8 @@ fxp_suspend(device_t dev)
|
||||
{
|
||||
struct fxp_softc *sc = device_get_softc(dev);
|
||||
int i;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
fxp_stop(sc);
|
||||
|
||||
@ -729,7 +496,7 @@ fxp_suspend(device_t dev)
|
||||
|
||||
sc->suspended = 1;
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -746,9 +513,8 @@ fxp_resume(device_t dev)
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
u_int16_t pci_command;
|
||||
int i;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
/* better way to do this? */
|
||||
for (i=0; i<5; i++)
|
||||
@ -772,7 +538,7 @@ fxp_resume(device_t dev)
|
||||
|
||||
sc->suspended = 0;
|
||||
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -799,12 +565,6 @@ static devclass_t fxp_devclass;
|
||||
|
||||
DRIVER_MODULE(if_fxp, pci, fxp_driver, fxp_devclass, 0, 0);
|
||||
|
||||
#endif /* __NetBSD__ */
|
||||
|
||||
/*************************************************************
|
||||
* End of operating system-specific autoconfiguration glue
|
||||
*************************************************************/
|
||||
|
||||
/*
|
||||
* Do generic parts of attach.
|
||||
*/
|
||||
@ -892,7 +652,7 @@ fxp_attach_common(sc, enaddr)
|
||||
return (0);
|
||||
|
||||
fail:
|
||||
printf(FXP_FORMAT ": Failed to malloc memory\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: Failed to malloc memory\n", FXP_UNIT(sc));
|
||||
if (sc->cbl_base)
|
||||
free(sc->cbl_base, M_DEVBUF);
|
||||
if (sc->fxp_stats)
|
||||
@ -1056,18 +816,15 @@ fxp_start(ifp)
|
||||
{
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
struct fxp_cb_tx *txp;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_LOCK(sc, s);
|
||||
#endif
|
||||
FXP_LOCK(sc);
|
||||
/*
|
||||
* See if we need to suspend xmit until the multicast filter
|
||||
* has been reprogrammed (which can only be done at the head
|
||||
* of the command chain).
|
||||
*/
|
||||
if (sc->need_mcsetup) {
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1186,7 +943,7 @@ fxp_start(ifp)
|
||||
* Pass packet to bpf if there is a listener.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(FXP_BPFTAP_ARG(ifp), mb_head);
|
||||
bpf_mtap(ifp, mb_head);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1197,37 +954,28 @@ fxp_start(ifp)
|
||||
fxp_scb_wait(sc);
|
||||
CSR_WRITE_1(sc, FXP_CSR_SCB_COMMAND, FXP_SCB_COMMAND_CU_RESUME);
|
||||
}
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_UNLOCK(sc, s);
|
||||
#endif
|
||||
FXP_UNLOCK(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process interface interrupts.
|
||||
*/
|
||||
static FXP_INTR_TYPE
|
||||
static void
|
||||
fxp_intr(arg)
|
||||
void *arg;
|
||||
{
|
||||
struct fxp_softc *sc = arg;
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
u_int8_t statack;
|
||||
FXP_SPLVAR(s)
|
||||
#if defined(__NetBSD__)
|
||||
int claimed = 0;
|
||||
#endif
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
if (sc->suspended) {
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0) {
|
||||
#if defined(__NetBSD__)
|
||||
claimed = 1;
|
||||
#endif
|
||||
/*
|
||||
* First ACK all the interrupts in this pass.
|
||||
*/
|
||||
@ -1328,11 +1076,7 @@ fxp_intr(arg)
|
||||
}
|
||||
}
|
||||
}
|
||||
#if defined(__NetBSD__)
|
||||
return (claimed);
|
||||
#else
|
||||
FXP_UNLOCK(sc, s);
|
||||
#endif
|
||||
FXP_UNLOCK(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1354,7 +1098,6 @@ fxp_stats_update(arg)
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
struct fxp_stats *sp = sc->fxp_stats;
|
||||
struct fxp_cb_tx *txp;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
ifp->if_opackets += sp->tx_good;
|
||||
ifp->if_collisions += sp->tx_total_collisions;
|
||||
@ -1381,7 +1124,7 @@ fxp_stats_update(arg)
|
||||
if (tx_threshold < 192)
|
||||
tx_threshold += 64;
|
||||
}
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
/*
|
||||
* Release any xmit buffers that have completed DMA. This isn't
|
||||
* strictly necessary to do here, but it's advantagous for mbufs
|
||||
@ -1439,7 +1182,7 @@ fxp_stats_update(arg)
|
||||
sp->rx_rnr_errors = 0;
|
||||
sp->rx_overrun_errors = 0;
|
||||
}
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
/*
|
||||
* Schedule another timeout one second from now.
|
||||
*/
|
||||
@ -1457,11 +1200,8 @@ fxp_stop(sc)
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
struct fxp_cb_tx *txp;
|
||||
int i;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_LOCK(sc, s);
|
||||
#endif
|
||||
FXP_LOCK(sc);
|
||||
|
||||
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
|
||||
ifp->if_timer = 0;
|
||||
@ -1509,9 +1249,7 @@ fxp_stop(sc)
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(__NetBSD__)
|
||||
FXP_UNLOCK(sc, s);
|
||||
#endif
|
||||
FXP_UNLOCK(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1526,7 +1264,7 @@ fxp_watchdog(ifp)
|
||||
{
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
|
||||
printf(FXP_FORMAT ": device timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: device timeout\n", FXP_UNIT(sc));
|
||||
ifp->if_oerrors++;
|
||||
|
||||
fxp_init(sc);
|
||||
@ -1542,9 +1280,8 @@ fxp_init(xsc)
|
||||
struct fxp_cb_ias *cb_ias;
|
||||
struct fxp_cb_tx *txp;
|
||||
int i, prm;
|
||||
FXP_SPLVAR(s)
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
/*
|
||||
* Cancel any pending I/O
|
||||
*/
|
||||
@ -1636,13 +1373,9 @@ fxp_init(xsc)
|
||||
cb_ias->cb_status = 0;
|
||||
cb_ias->cb_command = FXP_CB_COMMAND_IAS | FXP_CB_COMMAND_EL;
|
||||
cb_ias->link_addr = -1;
|
||||
#if defined(__NetBSD__)
|
||||
bcopy(LLADDR(ifp->if_sadl), (void *)cb_ias->macaddr, 6);
|
||||
#else
|
||||
bcopy(sc->arpcom.ac_enaddr,
|
||||
(void *)(uintptr_t)(volatile void *)cb_ias->macaddr,
|
||||
sizeof(sc->arpcom.ac_enaddr));
|
||||
#endif /* __NetBSD__ */
|
||||
|
||||
/*
|
||||
* Start the IAS (Individual Address Setup) command/DMA.
|
||||
@ -1691,7 +1424,7 @@ fxp_init(xsc)
|
||||
|
||||
ifp->if_flags |= IFF_RUNNING;
|
||||
ifp->if_flags &= ~IFF_OACTIVE;
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
|
||||
/*
|
||||
* Start stats updater.
|
||||
@ -1745,9 +1478,8 @@ fxp_set_media(sc, media)
|
||||
case FXP_PHY_80C24:
|
||||
break;
|
||||
default:
|
||||
printf(FXP_FORMAT
|
||||
": warning: unsupported PHY, type = %d, addr = %d\n",
|
||||
FXP_ARGS(sc), sc->phy_primary_device,
|
||||
printf("fxp%d: warning: unsupported PHY, type = %d, addr = %d\n",
|
||||
FXP_UNIT(sc), sc->phy_primary_device,
|
||||
sc->phy_primary_addr);
|
||||
}
|
||||
}
|
||||
@ -1948,8 +1680,7 @@ fxp_mdi_read(sc, phy, reg)
|
||||
DELAY(10);
|
||||
|
||||
if (count <= 0)
|
||||
printf(FXP_FORMAT ": fxp_mdi_read: timed out\n",
|
||||
FXP_ARGS(sc));
|
||||
printf("fxp%d: fxp_mdi_read: timed out\n", FXP_UNIT(sc));
|
||||
|
||||
return (value & 0xffff);
|
||||
}
|
||||
@ -1972,30 +1703,26 @@ fxp_mdi_write(sc, phy, reg, value)
|
||||
DELAY(10);
|
||||
|
||||
if (count <= 0)
|
||||
printf(FXP_FORMAT ": fxp_mdi_write: timed out\n",
|
||||
FXP_ARGS(sc));
|
||||
printf("fxp%d: fxp_mdi_write: timed out\n", FXP_UNIT(sc));
|
||||
}
|
||||
|
||||
static int
|
||||
fxp_ioctl(ifp, command, data)
|
||||
struct ifnet *ifp;
|
||||
FXP_IOCTLCMD_TYPE command;
|
||||
u_long command;
|
||||
caddr_t data;
|
||||
{
|
||||
struct fxp_softc *sc = ifp->if_softc;
|
||||
struct ifreq *ifr = (struct ifreq *)data;
|
||||
FXP_SPLVAR(s)
|
||||
int error = 0;
|
||||
|
||||
FXP_LOCK(sc, s);
|
||||
FXP_LOCK(sc);
|
||||
|
||||
switch (command) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
#if !defined(__NetBSD__)
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
#endif
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
@ -2019,27 +1746,6 @@ fxp_ioctl(ifp, command, data)
|
||||
case SIOCADDMULTI:
|
||||
case SIOCDELMULTI:
|
||||
sc->all_mcasts = (ifp->if_flags & IFF_ALLMULTI) ? 1 : 0;
|
||||
#if defined(__NetBSD__)
|
||||
error = (command == SIOCADDMULTI) ?
|
||||
ether_addmulti(ifr, &sc->sc_ethercom) :
|
||||
ether_delmulti(ifr, &sc->sc_ethercom);
|
||||
|
||||
if (error == ENETRESET) {
|
||||
/*
|
||||
* Multicast list has changed; set the hardware
|
||||
* filter accordingly.
|
||||
*/
|
||||
if (!sc->all_mcasts)
|
||||
fxp_mc_setup(sc);
|
||||
/*
|
||||
* fxp_mc_setup() can turn on all_mcasts if we run
|
||||
* out of space, so check it again rather than else {}.
|
||||
*/
|
||||
if (sc->all_mcasts)
|
||||
fxp_init(sc);
|
||||
error = 0;
|
||||
}
|
||||
#else /* __FreeBSD__ */
|
||||
/*
|
||||
* Multicast list has changed; set the hardware filter
|
||||
* accordingly.
|
||||
@ -2053,7 +1759,6 @@ fxp_ioctl(ifp, command, data)
|
||||
if (sc->all_mcasts)
|
||||
fxp_init(sc);
|
||||
error = 0;
|
||||
#endif /* __NetBSD__ */
|
||||
break;
|
||||
|
||||
case SIOCSIFMEDIA:
|
||||
@ -2064,7 +1769,7 @@ fxp_ioctl(ifp, command, data)
|
||||
default:
|
||||
error = EINVAL;
|
||||
}
|
||||
FXP_UNLOCK(sc, s);
|
||||
FXP_UNLOCK(sc);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -2178,7 +1883,7 @@ fxp_mc_setup(sc)
|
||||
FXP_SCB_CUS_ACTIVE && --count)
|
||||
DELAY(10);
|
||||
if (count == 0) {
|
||||
printf(FXP_FORMAT ": command queue timeout\n", FXP_ARGS(sc));
|
||||
printf("fxp%d: command queue timeout\n", FXP_UNIT(sc));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2,9 +2,6 @@
|
||||
* Copyright (c) 1995, David Greenman
|
||||
* All rights reserved.
|
||||
*
|
||||
* Modifications to support NetBSD:
|
||||
* Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
@ -39,17 +36,11 @@
|
||||
* for functional grouping.
|
||||
*/
|
||||
struct fxp_softc {
|
||||
#if defined(__NetBSD__)
|
||||
struct device sc_dev; /* generic device structures */
|
||||
void *sc_ih; /* interrupt handler cookie */
|
||||
struct ethercom sc_ethercom; /* ethernet common part */
|
||||
#else
|
||||
struct arpcom arpcom; /* per-interface network data */
|
||||
struct resource *mem; /* resource descriptor for registers */
|
||||
struct resource *irq; /* resource descriptor for interrupt */
|
||||
void *ih; /* interrupt handler cookie */
|
||||
struct mtx sc_mtx;
|
||||
#endif /* __NetBSD__ */
|
||||
bus_space_tag_t sc_st; /* bus space tag */
|
||||
bus_space_handle_t sc_sh; /* bus space handle */
|
||||
struct mbuf *rfa_headm; /* first mbuf in receive frame area */
|
||||
@ -91,25 +82,7 @@ struct fxp_softc {
|
||||
#define CSR_WRITE_4(sc, reg, val) \
|
||||
bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
|
||||
|
||||
/* Deal with slight differences in software interfaces. */
|
||||
#if defined(__NetBSD__)
|
||||
#define sc_if sc_ethercom.ec_if
|
||||
#define FXP_FORMAT "%s"
|
||||
#define FXP_ARGS(sc) (sc)->sc_dev.dv_xname
|
||||
#define FXP_INTR_TYPE int
|
||||
#define FXP_IOCTLCMD_TYPE u_long
|
||||
#define FXP_BPFTAP_ARG(ifp) (ifp)->if_bpf
|
||||
#define FXP_SPLVAR(x) int x;
|
||||
#define FXP_LOCK(sc, x) x = splimp()
|
||||
#define FXP_UNLOCK(sc, x) splx(x)
|
||||
#else /* __FreeBSD__ */
|
||||
#define sc_if arpcom.ac_if
|
||||
#define FXP_FORMAT "fxp%d"
|
||||
#define FXP_ARGS(sc) (sc)->arpcom.ac_if.if_unit
|
||||
#define FXP_INTR_TYPE void
|
||||
#define FXP_IOCTLCMD_TYPE u_long
|
||||
#define FXP_BPFTAP_ARG(ifp) ifp
|
||||
#define FXP_SPLVAR(s)
|
||||
#define FXP_LOCK(_sc, x) mtx_enter(&(_sc)->sc_mtx, MTX_DEF)
|
||||
#define FXP_UNLOCK(_sc, x) mtx_exit(&(_sc)->sc_mtx, MTX_DEF)
|
||||
#endif /* __NetBSD__ */
|
||||
#define FXP_UNIT(_sc) (_sc)->arpcom.ac_if.if_unit
|
||||
#define FXP_LOCK(_sc) mtx_enter(&(_sc)->sc_mtx, MTX_DEF)
|
||||
#define FXP_UNLOCK(_sc) mtx_exit(&(_sc)->sc_mtx, MTX_DEF)
|
||||
|
Loading…
Reference in New Issue
Block a user