PERFORCE change 35225 for review
Sam Leffler
sam at FreeBSD.org
Wed Jul 30 11:34:02 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=35225
Change 35225 by sam at 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 at 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) <<<
More information about the p4-projects
mailing list