Date: Wed, 30 Jul 2003 11:33:58 -0700 (PDT) From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 35225 for review Message-ID: <200307301833.h6UIXwNZ062371@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=35225 Change 35225 by sam@sam_ebb on 2003/07/30 11:33:50 IFC Affected files ... .. //depot/projects/netperf/sys/alpha/alpha/machdep.c#3 integrate .. //depot/projects/netperf/sys/amd64/amd64/vm_machdep.c#3 integrate .. //depot/projects/netperf/sys/cam/scsi/scsi_da.c#3 integrate .. //depot/projects/netperf/sys/compat/linux/linux_misc.c#3 integrate .. //depot/projects/netperf/sys/conf/NOTES#2 integrate .. //depot/projects/netperf/sys/conf/options#2 integrate .. //depot/projects/netperf/sys/dev/acpica/acpi_ec.c#3 integrate .. //depot/projects/netperf/sys/dev/fatm/if_fatm.c#2 integrate .. //depot/projects/netperf/sys/dev/fatm/if_fatmvar.h#2 integrate .. //depot/projects/netperf/sys/dev/hatm/if_hatm.c#2 integrate .. //depot/projects/netperf/sys/dev/hatm/if_hatm_ioctl.c#2 integrate .. //depot/projects/netperf/sys/dev/hatm/if_hatm_tx.c#2 integrate .. //depot/projects/netperf/sys/dev/hatm/if_hatmvar.h#2 integrate .. //depot/projects/netperf/sys/dev/hea/eni_if.c#2 integrate .. //depot/projects/netperf/sys/dev/hfa/fore_if.c#2 integrate .. //depot/projects/netperf/sys/dev/patm/if_patm.c#2 integrate .. //depot/projects/netperf/sys/dev/patm/if_patm_ioctl.c#2 integrate .. //depot/projects/netperf/sys/dev/patm/if_patm_tx.c#2 integrate .. //depot/projects/netperf/sys/dev/usb/usb_mem.c#2 integrate .. //depot/projects/netperf/sys/dev/utopia/utopia.c#2 integrate .. //depot/projects/netperf/sys/geom/geom_ccd.c#2 integrate .. //depot/projects/netperf/sys/geom/geom_mbr.c#2 integrate .. //depot/projects/netperf/sys/i386/acpica/acpi_wakeup.c#2 integrate .. //depot/projects/netperf/sys/i386/i386/locore.s#2 integrate .. //depot/projects/netperf/sys/i386/include/pcpu.h#2 integrate .. //depot/projects/netperf/sys/kern/kern_descrip.c#3 integrate .. //depot/projects/netperf/sys/kern/vfs_syscalls.c#3 integrate .. //depot/projects/netperf/sys/kern/vfs_vnops.c#3 integrate .. //depot/projects/netperf/sys/kern/vnode_if.src#3 integrate .. //depot/projects/netperf/sys/modules/cam/Makefile#2 integrate .. //depot/projects/netperf/sys/net/if_atm.h#2 integrate .. //depot/projects/netperf/sys/net/if_atmsubr.c#2 integrate .. //depot/projects/netperf/sys/netatm/atm_if.c#3 integrate .. //depot/projects/netperf/sys/netatm/atm_ioctl.h#3 integrate .. //depot/projects/netperf/sys/netatm/atm_usrreq.c#2 integrate .. //depot/projects/netperf/sys/netatm/atm_vc.h#2 integrate .. //depot/projects/netperf/sys/netatm/ipatm/ipatm_usrreq.c#3 integrate .. //depot/projects/netperf/sys/netatm/sigpvc/sigpvc_if.c#2 integrate .. //depot/projects/netperf/sys/netatm/spans/spans_arp.c#2 integrate .. //depot/projects/netperf/sys/netatm/spans/spans_if.c#2 integrate .. //depot/projects/netperf/sys/netatm/uni/uniarp.c#3 integrate .. //depot/projects/netperf/sys/netatm/uni/uniarp_cache.c#3 integrate .. //depot/projects/netperf/sys/netatm/uni/uniip_var.h#3 integrate .. //depot/projects/netperf/sys/netatm/uni/unisig_if.c#2 integrate .. //depot/projects/netperf/sys/netgraph/atm/ng_atm.c#2 integrate .. //depot/projects/netperf/sys/netgraph/atm/ng_atm.h#2 integrate .. //depot/projects/netperf/sys/netinet6/ip6_fw.c#3 integrate .. //depot/projects/netperf/sys/nfsclient/nfs_vnops.c#2 integrate .. //depot/projects/netperf/sys/sparc64/sparc64/pmap.c#2 integrate .. //depot/projects/netperf/sys/ufs/ffs/ffs_vnops.c#2 integrate .. //depot/projects/netperf/sys/ufs/ufs/extattr.h#2 integrate .. //depot/projects/netperf/sys/ufs/ufs/ufs_extattr.c#3 integrate .. //depot/projects/netperf/sys/ufs/ufs/ufs_vnops.c#2 integrate .. //depot/projects/netperf/sys/vm/uma_core.c#3 integrate .. //depot/projects/netperf/sys/vm/uma_int.h#2 integrate Differences ... ==== //depot/projects/netperf/sys/alpha/alpha/machdep.c#3 (text+ko) ==== @@ -88,7 +88,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.208 2003/07/27 23:45:47 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.209 2003/07/30 06:38:35 marcel Exp $"); #include "opt_compat.h" #include "opt_ddb.h" @@ -2021,6 +2021,7 @@ if (clear_ret != 0) { mcp->mc_regs[FRAME_V0] = 0; mcp->mc_regs[FRAME_A4] = 0; + mcp->mc_regs[FRAME_A3] = 0; } /* ==== //depot/projects/netperf/sys/amd64/amd64/vm_machdep.c#3 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.214 2003/07/25 21:15:45 obrien Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.215 2003/07/29 12:44:16 davidxu Exp $"); #include "opt_isa.h" #include "opt_kstack_pages.h" @@ -260,7 +260,7 @@ pcb2->pcb_rsp = (register_t)td->td_frame - sizeof(void *); /* trampoline arg */ pcb2->pcb_rbx = (register_t)td; /* trampoline arg */ pcb2->pcb_rip = (register_t)fork_trampoline; - pcb2->pcb_rflags = td->td_frame->tf_rflags & ~PSL_I; /* ints disabled */ + pcb2->pcb_rflags = PSL_KERNEL; /* ints disabled */ /* * If we didn't copy the pcb, we'd need to do the following registers: * pcb2->pcb_savefpu: cloned above. ==== //depot/projects/netperf/sys/cam/scsi/scsi_da.c#3 (text+ko) ==== @@ -27,9 +27,10 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.147 2003/07/28 06:15:58 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.149 2003/07/29 18:08:16 njl Exp $"); #ifdef _KERNEL +#include "opt_da.h" #include "opt_hw_wdog.h" #endif /* _KERNEL */ @@ -145,6 +146,7 @@ static struct da_quirk_entry da_quirk_table[] = { +#ifdef DA_OLD_QUIRKS /* * Logitec USB/Firewire LHD-P30FU */ @@ -158,6 +160,7 @@ {T_DIRECT, SIP_MEDIA_FIXED, "LSILogic", "SYM13FW*", "*"}, /*quirks*/ DA_Q_NO_6_BYTE }, +#endif /* DA_OLD_QUIRKS */ { /* * Fujitsu M2513A MO drives. @@ -241,6 +244,7 @@ /*quirks*/ DA_Q_NO_6_BYTE }, +#ifdef DA_OLD_QUIRKS /* Below a list of quirks for USB devices supported by umass. */ { /* @@ -250,12 +254,12 @@ * not support sync cache (0x35). */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Y-E DATA", "USB-FDU", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* Another USB floppy */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "MATSHITA", "FDD CF-VFDU*","*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -264,7 +268,7 @@ * Make all sony MS* products use this quirk. */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "MS*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -272,22 +276,23 @@ * of PalmOS PDA's */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "CLIE*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* * Intelligent Stick USB disk-on-key * PR: kern/53005 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB Card", "IntelligentStick*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB Card", + "IntelligentStick*", "*"}, + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* * Sony DSC cameras (DSC-S30, DSC-S50, DSC-S70) */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "Sony DSC", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -313,7 +318,7 @@ */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "eUSB Compact*", "Compact Flash*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -322,14 +327,14 @@ * spaces. The trailing wildcard character '*' is required. */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "SMSC*", "USB FDC*","*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* * Olympus digital cameras (C-3040ZOOM, C-2040ZOOM, C-1) */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "OLYMPUS", "C-*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -343,14 +348,14 @@ * Olympus digital cameras (E-100RS, E-10). */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "OLYMPUS", "E-*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* * KingByte Pen Drives */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "NO BRAND", "PEN DRIVE", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -358,7 +363,7 @@ */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "FUJIFILMUSB-DRIVEUNIT", "USB-DRIVEUNIT", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -393,7 +398,7 @@ * Minolta Dimage E203 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "MINOLTA", "DiMAGE E203", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -416,7 +421,7 @@ * PR: kern/43627 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Apacer", "HandyDrive", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -424,7 +429,7 @@ * PR: kern/43580 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "ZORAN", "COACH", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -448,7 +453,7 @@ * PR: kern/46386 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "Storage Media", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -507,7 +512,7 @@ * PR: kern/50226 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "MITSUMI", "USB FDD", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE + /*quirks*/ DA_Q_NO_SYNC_CACHE }, { /* @@ -517,6 +522,7 @@ {T_DIRECT, SIP_MEDIA_REMOVABLE, "OTi", "Flash Disk", "*"}, /*quirks*/ DA_Q_NO_6_BYTE } +#endif /* DA_OLD_QUIRKS */ }; static disk_strategy_t dastrategy; ==== //depot/projects/netperf/sys/compat/linux/linux_misc.c#3 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.146 2003/07/26 07:32:20 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.147 2003/07/29 10:03:15 des Exp $"); #include "opt_mac.h" @@ -75,6 +75,10 @@ #include <compat/linux/linux_mib.h> #include <compat/linux/linux_util.h> +#ifdef __i386__ +#include <machine/cputypes.h> +#endif + #ifdef __alpha__ #define BSD_TO_LINUX_SIGNAL(sig) (sig) #else @@ -689,6 +693,7 @@ struct l_new_utsname utsname; char osname[LINUX_MAX_UTSNAME]; char osrelease[LINUX_MAX_UTSNAME]; + char *p; #ifdef DEBUG if (ldebug(newuname)) @@ -703,7 +708,32 @@ getcredhostname(td->td_ucred, utsname.nodename, LINUX_MAX_UTSNAME); strlcpy(utsname.release, osrelease, LINUX_MAX_UTSNAME); strlcpy(utsname.version, version, LINUX_MAX_UTSNAME); + for (p = utsname.version; *p != '\0'; ++p) + if (*p == '\n') { + *p = '\0'; + break; + } +#ifdef __i386__ + { + const char *class; + switch (cpu_class) { + case CPUCLASS_686: + class = "i686"; + break; + case CPUCLASS_586: + class = "i586"; + break; + case CPUCLASS_486: + class = "i486"; + break; + default: + class = "i386"; + } + strlcpy(utsname.machine, class, LINUX_MAX_UTSNAME); + } +#else strlcpy(utsname.machine, machine, LINUX_MAX_UTSNAME); +#endif strlcpy(utsname.domainname, domainname, LINUX_MAX_UTSNAME); return (copyout(&utsname, args->buf, sizeof(utsname))); ==== //depot/projects/netperf/sys/conf/NOTES#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/NOTES,v 1.1164 2003/07/21 13:56:21 harti Exp $ +# $FreeBSD: src/sys/conf/NOTES,v 1.1165 2003/07/29 04:32:32 njl Exp $ # # NOTES -- Lines that can be cut/pasted into kernel and hints configs. # @@ -962,6 +962,12 @@ options SCSI_NO_OP_STRINGS options SCSI_DELAY=8000 # Be pessimistic about Joe SCSI device +# Options for the CAM SCSI disk driver: +# DA_OLD_QUIRKS: Restore old USB and firewire quirks that have been +# deprecated. Please also email scsi@freebsd.org if you +# have a device that needs this option. +options DA_OLD_QUIRKS + # Options for the CAM CDROM driver: # CHANGER_MIN_BUSY_SECONDS: Guaranteed minimum time quantum for a changer LUN # CHANGER_MAX_BUSY_SECONDS: Maximum time quantum per changer LUN, only ==== //depot/projects/netperf/sys/conf/options#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/options,v 1.404 2003/07/22 11:42:45 ticso Exp $ +# $FreeBSD: src/sys/conf/options,v 1.406 2003/07/29 18:08:16 njl Exp $ # # On the handling of kernel options # @@ -258,6 +258,8 @@ CHANGER_MIN_BUSY_SECONDS opt_cd.h CHANGER_MAX_BUSY_SECONDS opt_cd.h +DA_OLD_QUIRKS opt_da.h + # Options used only in cam/scsi/scsi_sa.c. SA_IO_TIMEOUT opt_sa.h SA_SPACE_TIMEOUT opt_sa.h ==== //depot/projects/netperf/sys/dev/acpica/acpi_ec.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.37 2003/07/25 16:49:46 njl Exp $ + * $FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.38 2003/07/30 16:22:52 njl Exp $ */ /****************************************************************************** * @@ -288,6 +288,9 @@ ((event) == EC_EVENT_INPUT_BUFFER_EMPTY && \ ((status) & EC_FLAG_INPUT_BUFFER) == 0)) +static int ec_poll_timeout = EC_POLL_TIMEOUT; +TUNABLE_INT("hw.acpi.ec.poll_timeout", &ec_poll_timeout); + static __inline ACPI_STATUS EcLock(struct acpi_ec_softc *sc) { @@ -792,12 +795,12 @@ sc->ec_polldelay = 100; /* - * If we still don't have a response, wait up to EC_POLL_TIMEOUT ms + * If we still don't have a response, wait up to ec_poll_timeout ms * for completion, sleeping for chunks of 10 ms. */ if (Status != AE_OK) { retval = -1; - for (i = 0; i < EC_POLL_TIMEOUT / 10; i++) { + for (i = 0; i < ec_poll_timeout / 10; i++) { if (retval != 0) EcStatus = EC_GET_CSR(sc); else ==== //depot/projects/netperf/sys/dev/fatm/if_fatm.c#2 (text+ko) ==== @@ -29,7 +29,7 @@ * Fore PCA200E driver for NATM */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/fatm/if_fatm.c,v 1.3 2003/07/02 13:53:41 harti Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/fatm/if_fatm.c,v 1.5 2003/07/30 14:20:00 harti Exp $"); #include "opt_inet.h" #include "opt_natm.h" @@ -48,6 +48,7 @@ #include <sys/endian.h> #include <sys/sysctl.h> #include <sys/condvar.h> +#include <vm/uma.h> #include <sys/sockio.h> #include <sys/mbuf.h> @@ -470,6 +471,8 @@ if (sc->ifatm.ifnet.if_flags & IFF_RUNNING) { sc->ifatm.ifnet.if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); + ATMEV_SEND_IFSTATE_CHANGED(&sc->ifatm, + sc->utopia.carrier == UTP_CARR_OK); /* * Collect transmit mbufs, partial receive mbufs and @@ -518,9 +521,13 @@ sc->small_cnt = sc->large_cnt = 0; /* Reset vcc info */ - if (sc->vccs != NULL) - for (i = 0; i <= FORE_MAX_VCC; i++) - sc->vccs[i].flags = 0; + if (sc->vccs != NULL) { + for (i = 0; i < FORE_MAX_VCC + 1; i++) + if (sc->vccs[i] != NULL) { + uma_zfree(sc->vcc_zone, sc->vccs[i]); + sc->vccs[i] = NULL; + } + } sc->open_vccs = 0; } @@ -1325,6 +1332,9 @@ /* start SUNI */ utopia_start(&sc->utopia); + ATMEV_SEND_IFSTATE_CHANGED(&sc->ifatm, + sc->utopia.carrier == UTP_CARR_OK); + DBG(sc, INIT, ("done")); } @@ -1441,7 +1451,7 @@ fatm_intr_drain_rx(struct fatm_softc *sc) { struct rxqueue *q; - int stat, mlen, drop; + int stat, mlen; u_int i; uint32_t h; struct mbuf *last, *m0; @@ -1450,6 +1460,7 @@ u_int vci, vpi, pt; struct atm_pseudohdr aph; struct ifnet *ifp; + struct card_vcc *vc; for (;;) { q = GET_QUEUE(sc->rxqueue, struct rxqueue, sc->rxqueue.tail); @@ -1464,7 +1475,6 @@ H_SYNCQ_POSTREAD(&sc->rxq_mem, rpd, RPD_SIZE); rpd->nseg = le32toh(rpd->nseg); - drop = 0; mlen = 0; m0 = last = 0; for (i = 0; i < rpd->nseg; i++) { @@ -1504,26 +1514,30 @@ * Locate the VCC this packet belongs to */ if (!VC_OK(sc, vpi, vci)) - drop = 1; - else if ((sc->vccs[vci].flags & FATM_VCC_OPEN) == 0) { + vc = NULL; + else if ((vc = sc->vccs[vci]) == NULL || + !(sc->vccs[vci]->vflags & FATM_VCC_OPEN)) { sc->istats.rx_closed++; - drop = 1; + vc = NULL; } DBG(sc, RCV, ("RCV: vc=%u.%u pt=%u mlen=%d %s", vpi, vci, - pt, mlen, drop ? "dropped" : "")); + pt, mlen, vc == NULL ? "dropped" : "")); - if (drop) { + if (vc == NULL) { m_freem(m0); } else { - ATM_PH_FLAGS(&aph) = sc->vccs[vci].flags & 0xff; + ATM_PH_FLAGS(&aph) = vc->param.flags; ATM_PH_VPI(&aph) = vpi; ATM_PH_SETVCI(&aph, vci); ifp = &sc->ifatm.ifnet; ifp->if_ipackets++; - atm_input(ifp, &aph, m0, sc->vccs[vci].rxhand); + vc->ipackets++; + vc->ibytes += m0->m_pkthdr.len; + + atm_input(ifp, &aph, m0, vc->rxhand); } H_SETSTAT(q->q.statp, FATM_STAT_FREE); @@ -1890,7 +1904,7 @@ * Note, that we update the internal statistics without the lock here. */ static int -fatm_tx(struct fatm_softc *sc, struct mbuf *m, u_int vpi, u_int vci, u_int mlen) +fatm_tx(struct fatm_softc *sc, struct mbuf *m, struct card_vcc *vc, u_int mlen) { struct txqueue *q; u_int nblks; @@ -1943,7 +1957,7 @@ /* * OK. Now go and do it. */ - aal = (sc->vccs[vci].aal == ATMIO_AAL_5) ? 5 : 0; + aal = (vc->param.aal == ATMIO_AAL_5) ? 5 : 0; H_SETSTAT(q->q.statp, FATM_STAT_PENDING); H_SYNCSTAT_PREWRITE(sc, q->q.statp); @@ -1956,15 +1970,16 @@ */ H_SETDESC(tpd->spec, TDX_MKSPEC((sc->txcnt >= (4 * FATM_TX_QLEN) / 5), aal, nsegs, mlen)); - H_SETDESC(tpd->atm_header, TDX_MKHDR(vpi, vci, 0, 0)); + H_SETDESC(tpd->atm_header, TDX_MKHDR(vc->param.vpi, + vc->param.vci, 0, 0)); - if (sc->vccs[vci].traffic == ATMIO_TRAFFIC_UBR) + if (vc->param.traffic == ATMIO_TRAFFIC_UBR) H_SETDESC(tpd->stream, 0); else { u_int i; for (i = 0; i < RATE_TABLE_SIZE; i++) - if (rate_table[i].cell_rate < sc->vccs[vci].pcr) + if (rate_table[i].cell_rate < vc->param.tparam.pcr) break; if (i > 0) i--; @@ -1982,6 +1997,8 @@ sc->txcnt++; sc->ifatm.ifnet.if_opackets++; + vc->obytes += m->m_pkthdr.len; + vc->opackets++; NEXT_QUEUE_ENTRY(sc->txqueue.head, FATM_TX_QLEN); @@ -1995,6 +2012,7 @@ struct fatm_softc *sc; struct mbuf *m; u_int mlen, vpi, vci; + struct card_vcc *vc; sc = (struct fatm_softc *)ifp->if_softc; @@ -2043,13 +2061,13 @@ m_freem(m); break; } - if (!VC_OK(sc, vpi, vci) || - !(sc->vccs[vci].flags & FATM_VCC_OPEN)) { + if (!VC_OK(sc, vpi, vci) || (vc = sc->vccs[vci]) == NULL || + !(vc->vflags & FATM_VCC_OPEN)) { FATM_UNLOCK(sc); m_freem(m); continue; } - if (fatm_tx(sc, m, vpi, vci, mlen)) { + if (fatm_tx(sc, m, vc, mlen)) { FATM_UNLOCK(sc); break; } @@ -2058,52 +2076,6 @@ } /* - * Return a table of all currently open VCCs. - */ -static struct atmio_vcctable * -get_vccs(struct fatm_softc *sc, int flags) -{ - struct atmio_vcctable *vccs; - struct atmio_vcc *v; - u_int i, alloc; - - alloc = 10; - vccs = NULL; - for (;;) { - vccs = reallocf(vccs, - sizeof(*vccs) + alloc * sizeof(vccs->vccs[0]), - M_DEVBUF, flags); - if (vccs == NULL) - return (NULL); - - vccs->count = 0; - FATM_LOCK(sc); - v = vccs->vccs; - for (i = 0; i < (1U << sc->ifatm.mib.vci_bits); i++) { - if (sc->vccs[i].flags & FATM_VCC_OPEN) { - if (vccs->count++ == alloc) { - alloc *= 2; - break; - } - v->vpi = 0; - v->vci = i; - v->flags = sc->vccs[i].flags; - v->aal = sc->vccs[i].aal; - v->traffic = sc->vccs[i].traffic; - bzero(&v->tparam, sizeof(v->tparam)); - v->tparam.pcr = sc->vccs[i].pcr; - v++; - } - } - if (i == (1U << sc->ifatm.mib.vci_bits)) - break; - FATM_UNLOCK(sc); - } - FATM_UNLOCK(sc); - return (vccs); -} - -/* * VCC managment * * This may seem complicated. The reason for this is, that we need an @@ -2148,79 +2120,57 @@ } /* - * Start to open a VCC. This just initiates the operation. + * The VC has been opened/closed and somebody has been waiting for this. + * Wake him up. */ -static int -fatm_start_open_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, u_int aal, - u_int traffic, u_int pcr, u_int flags, void *rxhand, - void (*func)(struct fatm_softc *, struct cmdqueue *), struct cmdqueue **qp) +static void +fatm_cmd_complete(struct fatm_softc *sc, struct cmdqueue *q) { - int error; - uint32_t cmd; - struct cmdqueue *q; - error = 0; + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.get_stat_errors++; + q->error = EIO; + } + wakeup(q); +} - if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) - return (EIO); - if (!VC_OK(sc, vpi, vci) || - (aal != ATMIO_AAL_0 && aal != ATMIO_AAL_5) || - (traffic != ATMIO_TRAFFIC_UBR && traffic != ATMIO_TRAFFIC_CBR)) - return (EINVAL); - if (sc->vccs[vci].flags & FATM_VCC_BUSY) - return (EBUSY); +/* + * Open complete + */ +static void +fatm_open_finish(struct fatm_softc *sc, struct card_vcc *vc) +{ + vc->vflags &= ~FATM_VCC_TRY_OPEN; + vc->vflags |= FATM_VCC_OPEN; - /* Command and buffer strategy */ - cmd = FATM_OP_ACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL | (0 << 16); - if (aal == ATMIO_AAL_0) - cmd |= (0 << 8); - else - cmd |= (5 << 8); - - if ((q = fatm_start_vcc(sc, vpi, vci, cmd, 1, func)) == NULL) - return (EIO); - if (qp != NULL) - *qp = q; - - sc->vccs[vci].aal = aal; - sc->vccs[vci].flags = flags | FATM_VCC_TRY_OPEN; - sc->vccs[vci].rxhand = rxhand; - sc->vccs[vci].pcr = pcr; - sc->vccs[vci].traffic = traffic; - - return (0); + /* inform management if this is not an NG + * VCC or it's an NG PVC. */ + if (!(vc->param.flags & ATMIO_FLAG_NG) || + (vc->param.flags & ATMIO_FLAG_PVC)) + ATMEV_SEND_VCC_CHANGED(&sc->ifatm, 0, vc->param.vci, 1); } /* - * Initiate closing a VCC + * The VC that we have tried to open asynchronuosly has been opened. */ -static int -fatm_start_close_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, - void (*func)(struct fatm_softc *, struct cmdqueue *), struct cmdqueue **qp) +static void +fatm_open_complete(struct fatm_softc *sc, struct cmdqueue *q) { - int error; - struct cmdqueue *q; + u_int vci; + struct card_vcc *vc; - error = 0; - - if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) - return (EIO); - if (!VC_OK(sc, vpi, vci)) - return (EINVAL); - if (!(sc->vccs[vci].flags & (FATM_VCC_OPEN | FATM_VCC_TRY_OPEN))) - return (ENOENT); - - if ((q = fatm_start_vcc(sc, vpi, vci, - FATM_OP_DEACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL, 1, func)) == NULL) - return (EIO); - - if (qp != NULL) - *qp = q; - - sc->vccs[vci].flags &= ~(FATM_VCC_OPEN | FATM_VCC_TRY_OPEN); - sc->vccs[vci].flags |= FATM_VCC_TRY_CLOSE; - - return (0); + vci = GETVCI(READ4(sc, q->q.card + FATMOC_ACTIN_VPVC)); + vc = sc->vccs[vci]; + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.get_stat_errors++; + sc->vccs[vci] = NULL; + uma_zfree(sc->vcc_zone, vc); + if_printf(&sc->ifatm.ifnet, "opening VCI %u failed\n", vci); + return; + } + fatm_open_finish(sc, vc); } /* @@ -2242,130 +2192,121 @@ } /* - * The VC has been opened/closed and somebody has been waiting for this. - * Wake him up. + * Start to open a VCC. This just initiates the operation. */ -static void -fatm_cmd_complete(struct fatm_softc *sc, struct cmdqueue *q) -{ - - H_SYNCSTAT_POSTREAD(sc, q->q.statp); - if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { - sc->istats.get_stat_errors++; - q->error = EIO; - } - wakeup(q); -} - -/* - * Open a vcc and wait for completion - */ static int -fatm_open_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, u_int flags, - u_int aal, u_int traffic, u_int pcr, void *rxhand) +fatm_open_vcc(struct fatm_softc *sc, struct atmio_openvcc *op, int wait) { + uint32_t cmd; int error; struct cmdqueue *q; + struct card_vcc *vc; + + /* + * Check parameters + */ + if ((op->param.flags & ATMIO_FLAG_NOTX) && + (op->param.flags & ATMIO_FLAG_NORX)) + return (EINVAL); + + if (!VC_OK(sc, op->param.vpi, op->param.vci)) + return (EINVAL); + if (op->param.aal != ATMIO_AAL_0 && op->param.aal != ATMIO_AAL_5) + return (EINVAL); + + vc = uma_zalloc(sc->vcc_zone, M_NOWAIT | M_ZERO); + if (vc == NULL) + return (ENOMEM); error = 0; FATM_LOCK(sc); - error = fatm_start_open_vcc(sc, vpi, vci, aal, traffic, pcr, - flags, rxhand, fatm_cmd_complete, &q); - if (error != 0) { - FATM_UNLOCK(sc); - return (error); + if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) { + error = EIO; + goto done; + } + if (sc->vccs[op->param.vci] != NULL) { + error = EBUSY; + goto done; } - error = fatm_waitvcc(sc, q); + vc->param = op->param; + vc->rxhand = op->rxhand; - if (error == 0) { - sc->vccs[vci].flags &= ~FATM_VCC_TRY_OPEN; - sc->vccs[vci].flags |= FATM_VCC_OPEN; - sc->open_vccs++; + switch (op->param.traffic) { -#ifdef notyet - /* inform management if this is not an NG - * VCC or it's an NG PVC. */ - if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) || - (sc->vccs[vci].flags & ATMIO_FLAG_PVC)) - atm_message(&sc->ifatm.ifnet, - ATM_MSG_VCC_CHANGED, - (1 << 24) | (0 << 16) | vci); -#endif - } else - bzero(&sc->vccs[vci], sizeof(sc->vccs[vci])); + case ATMIO_TRAFFIC_UBR: + break; - FATM_UNLOCK(sc); - return (error); -} + case ATMIO_TRAFFIC_CBR: + if (op->param.tparam.pcr == 0 || + op->param.tparam.pcr > sc->ifatm.mib.pcr) { + error = EINVAL; + goto done; + } + break; -/* - * Close a VCC synchronuosly - */ -static int -fatm_close_vcc(struct fatm_softc *sc, u_int vpi, u_int vci) -{ - int error; - struct cmdqueue *q; + default: + error = EINVAL; + goto done; + return (EINVAL); + } + vc->ibytes = vc->obytes = 0; + vc->ipackets = vc->opackets = 0; - error = 0; + /* Command and buffer strategy */ + cmd = FATM_OP_ACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL | (0 << 16); + if (op->param.aal == ATMIO_AAL_0) + cmd |= (0 << 8); + else + cmd |= (5 << 8); - FATM_LOCK(sc); - error = fatm_start_close_vcc(sc, vpi, vci, fatm_cmd_complete, &q); - if (error != 0) { - FATM_UNLOCK(sc); - return (error); + q = fatm_start_vcc(sc, op->param.vpi, op->param.vci, cmd, 1, + wait ? fatm_cmd_complete : fatm_open_complete); + if (q == NULL) { + error = EIO; + goto done; } - error = fatm_waitvcc(sc, q); - if (error == 0) { -#ifdef notyet - /* inform management of this is not an NG - * VCC or it's an NG PVC. */ - if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) || - (sc->vccs[vci].flags & ATMIO_FLAG_PVC)) - atm_message(&sc->ifatm.ifnet, - ATM_MSG_VCC_CHANGED, - (0 << 24) | (0 << 16) | vci); -#endif + vc->vflags = FATM_VCC_TRY_OPEN; + sc->vccs[op->param.vci] = vc; + sc->open_vccs++; - bzero(&sc->vccs[vci], sizeof(sc->vccs[vci])); - sc->open_vccs--; + if (wait) { + error = fatm_waitvcc(sc, q); + if (error != 0) { + sc->vccs[op->param.vci] = NULL; + sc->open_vccs--; + goto done; + } + fatm_open_finish(sc, vc); } + /* don't free below */ + vc = NULL; + + done: FATM_UNLOCK(sc); + if (vc != NULL) + uma_zfree(sc->vcc_zone, vc); return (error); } /* - * The VC has been opened. + * Finish close */ static void -fatm_open_complete(struct fatm_softc *sc, struct cmdqueue *q) +fatm_close_finish(struct fatm_softc *sc, struct card_vcc *vc) { - u_int vci; + /* inform management of this is not an NG + * VCC or it's an NG PVC. */ + if (!(vc->param.flags & ATMIO_FLAG_NG) || + (vc->param.flags & ATMIO_FLAG_PVC)) + ATMEV_SEND_VCC_CHANGED(&sc->ifatm, 0, vc->param.vci, 0); - vci = GETVCI(READ4(sc, q->q.card + FATMOC_ACTIN_VPVC)); - H_SYNCSTAT_POSTREAD(sc, q->q.statp); - if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { - sc->istats.get_stat_errors++; - bzero(&sc->vccs[vci], sizeof(sc->vccs[vci])); - if_printf(&sc->ifatm.ifnet, "opening VCI %u failed\n", vci); - return; >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200307301833.h6UIXwNZ062371>