PERFORCE change 154347 for review

Ed Schouten ed at FreeBSD.org
Mon Dec 8 09:54:18 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=154347

Change 154347 by ed at ed_flippo on 2008/12/08 17:53:47

	IFC.

Affected files ...

.. //depot/projects/mpsafetty/UPDATING#15 integrate
.. //depot/projects/mpsafetty/lib/libarchive/test/main.c#3 integrate
.. //depot/projects/mpsafetty/lib/libpmc/pmc.core.3#4 integrate
.. //depot/projects/mpsafetty/share/man/man4/man4.powerpc/pmu.4#2 integrate
.. //depot/projects/mpsafetty/sys/boot/forth/support.4th#2 integrate
.. //depot/projects/mpsafetty/sys/compat/linprocfs/linprocfs.c#10 integrate
.. //depot/projects/mpsafetty/sys/contrib/pf/net/pf_table.c#2 integrate
.. //depot/projects/mpsafetty/sys/dev/ath/if_ath.c#9 integrate
.. //depot/projects/mpsafetty/sys/dev/ath/if_athvar.h#7 integrate
.. //depot/projects/mpsafetty/sys/dev/dc/if_dc.c#4 integrate
.. //depot/projects/mpsafetty/sys/dev/dc/if_dcreg.h#3 integrate
.. //depot/projects/mpsafetty/sys/dev/e1000/if_em.c#4 integrate
.. //depot/projects/mpsafetty/sys/dev/fxp/if_fxp.c#4 integrate
.. //depot/projects/mpsafetty/sys/dev/pccbb/pccbb.c#5 integrate
.. //depot/projects/mpsafetty/sys/dev/pccbb/pccbb_pci.c#5 integrate
.. //depot/projects/mpsafetty/sys/dev/re/if_re.c#7 integrate
.. //depot/projects/mpsafetty/sys/fs/procfs/procfs_map.c#4 integrate
.. //depot/projects/mpsafetty/sys/geom/geom_subr.c#3 integrate
.. //depot/projects/mpsafetty/sys/kern/kern_proc.c#14 integrate
.. //depot/projects/mpsafetty/sys/kern/subr_witness.c#12 integrate
.. //depot/projects/mpsafetty/sys/kern/vfs_export.c#5 integrate
.. //depot/projects/mpsafetty/sys/net/radix.c#2 integrate
.. //depot/projects/mpsafetty/sys/net/radix.h#2 integrate
.. //depot/projects/mpsafetty/sys/net/route.c#10 integrate
.. //depot/projects/mpsafetty/sys/net/route.h#5 integrate
.. //depot/projects/mpsafetty/sys/net/rtsock.c#7 integrate
.. //depot/projects/mpsafetty/sys/netinet6/in6_rmx.c#7 integrate
.. //depot/projects/mpsafetty/sys/netinet6/nd6_rtr.c#7 integrate
.. //depot/projects/mpsafetty/sys/pci/if_rlreg.h#8 integrate
.. //depot/projects/mpsafetty/sys/powerpc/conf/NOTES#2 integrate
.. //depot/projects/mpsafetty/sys/powerpc/powermac/macgpio.c#2 integrate
.. //depot/projects/mpsafetty/sys/powerpc/powermac/macgpiovar.h#2 integrate
.. //depot/projects/mpsafetty/sys/powerpc/powermac/pmu.c#4 integrate
.. //depot/projects/mpsafetty/sys/powerpc/powermac/pmuvar.h#2 integrate
.. //depot/projects/mpsafetty/sys/ufs/ufs/ufs_quota.c#3 integrate
.. //depot/projects/mpsafetty/tools/tools/ath/Makefile#2 integrate
.. //depot/projects/mpsafetty/tools/tools/ath/Makefile.inc#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athdebug/Makefile#2 integrate
.. //depot/projects/mpsafetty/tools/tools/ath/athkey/Makefile#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athkey/athkey.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athpow/Makefile#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athpow/athpow.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athprom/Makefile#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athprom/athprom.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athprom/eeprom-14#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athprom/eeprom-3#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athprom/eeprom-4#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athprom/eeprom-5#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athregs/Makefile#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athregs/dumpregs.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athregs/dumpregs.h#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athregs/dumpregs_5210.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athregs/dumpregs_5211.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athregs/dumpregs_5212.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athregs/dumpregs_5416.c#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/athstats/Makefile#3 integrate
.. //depot/projects/mpsafetty/tools/tools/ath/common/ah_osdep.h#1 branch
.. //depot/projects/mpsafetty/tools/tools/ath/common/diag.h#1 branch
.. //depot/projects/mpsafetty/usr.sbin/syslogd/syslogd.8#3 integrate

Differences ...

==== //depot/projects/mpsafetty/UPDATING#15 (text+ko) ====

@@ -38,11 +38,11 @@
 	and thereby the code size); consult ath_hal(4) for details.
 
 20081121:
-	__FreeBSD_version 800054 adds memory barriers to 
-	<machine/atomic.h>, new interfaces to ifnet to facilitate 
+	__FreeBSD_version 800054 adds memory barriers to
+	<machine/atomic.h>, new interfaces to ifnet to facilitate
 	multiple hardware transmit queues for cards that support
 	them, and a lock-less ring-buffer implementation to
-	enable drivers to more efficiently manage queueing of 
+	enable drivers to more efficiently manage queueing of
 	packets.
 
 20081117:
@@ -287,11 +287,11 @@
 	be recompiled; this includes the hal and xorg-server ports.
 
 20070928:
-        The caching daemon (cached) was renamed to nscd. nscd.conf
-        configuration file should be used instead of cached.conf and
-        nscd_enable, nscd_pidfile and nscd_flags options should be used
-        instead of cached_enable, cached_pidfile and cached_flags in
-        rc.conf.
+	The caching daemon (cached) was renamed to nscd. nscd.conf
+	configuration file should be used instead of cached.conf and
+	nscd_enable, nscd_pidfile and nscd_flags options should be used
+	instead of cached_enable, cached_pidfile and cached_flags in
+	rc.conf.
 
 20070921:
 	The getfacl(1) utility now prints owning user and group name
@@ -299,7 +299,7 @@
 	This is the same behavior as getfacl(1) on Solaris and Linux.
 
 20070704:
-        The new IPsec code is now compiled in using the IPSEC option.  The
+	The new IPsec code is now compiled in using the IPSEC option.  The
 	IPSEC option now requires "device crypto" be defined in your kernel
 	configuration.  The FAST_IPSEC kernel option is now deprecated.
 
@@ -602,10 +602,10 @@
 	If you have such a file, you need old utility to decrypt it.
 
 20060709:
- 	The interface version of the i4b kernel part has changed. So
- 	after updating the kernel sources and compiling a new kernel,
- 	the i4b user space tools in "/usr/src/usr.sbin/i4b" must also
- 	be rebuilt, and vice versa.
+	The interface version of the i4b kernel part has changed. So
+	after updating the kernel sources and compiling a new kernel,
+	the i4b user space tools in "/usr/src/usr.sbin/i4b" must also
+	be rebuilt, and vice versa.
 
 20060627:
 	The XBOX kernel now defaults to the nfe(4) driver instead of
@@ -1071,7 +1071,7 @@
 	<reboot into current>
 	<do a "native" rebuild/install as described in the previous section>
 	<maybe install compatibility libraries from ports/misc/compat*>
- 	<reboot>
+	<reboot>
 
 
 	To upgrade in-place from 5.x-stable to current
@@ -1178,4 +1178,4 @@
 Contact Warner Losh if you have any questions about your use of
 this document.
 
-$FreeBSD: src/UPDATING,v 1.551 2008/12/01 23:09:58 sam Exp $
+$FreeBSD: src/UPDATING,v 1.552 2008/12/08 17:12:40 schweikh Exp $

==== //depot/projects/mpsafetty/lib/libarchive/test/main.c#3 (text+ko) ====

@@ -45,7 +45,7 @@
 #define	EXTRA_DUMP(x)	archive_error_string((struct archive *)(x))
 #define	EXTRA_VERSION	archive_version()
 #define KNOWNREF	"test_compat_gtar_1.tgz.uu"
-__FBSDID("$FreeBSD: src/lib/libarchive/test/main.c,v 1.14 2008/08/31 07:06:02 kientzle Exp $");
+__FBSDID("$FreeBSD: src/lib/libarchive/test/main.c,v 1.15 2008/12/08 17:22:44 kientzle Exp $");
 
 /*
  * "list.h" is simply created by "grep DEFINE_TEST"; it has
@@ -897,6 +897,7 @@
 	time_t now;
 	char *refdir_alloc = NULL;
 	char *progname, *p;
+	char *tmp;
 	char tmpdir[256];
 	char tmpdir_timestamp[256];
 
@@ -916,6 +917,17 @@
 	testprog = getenv(ENVBASE);
 #endif
 
+	if (getenv("TMPDIR") != NULL)
+		tmp = getenv("TMPDIR");
+	else if (getenv("TMP") != NULL)
+		tmp = getenv("TMP");
+	else if (getenv("TEMP") != NULL)
+		tmp = getenv("TEMP");
+	else if (getenv("TEMPDIR") != NULL)
+		tmp = getenv("TEMPDIR");
+	else
+		tmp = "/tmp";
+
 	/* Allow -d to be controlled through the environment. */
 	if (getenv(ENVBASE "_DEBUG") != NULL)
 		dump_on_failure = 1;
@@ -976,7 +988,8 @@
 		strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp),
 		    "%Y-%m-%dT%H.%M.%S",
 		    localtime(&now));
-		sprintf(tmpdir, "/tmp/%s.%s-%03d", progname, tmpdir_timestamp, i);
+		sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname,
+		    tmpdir_timestamp, i);
 		if (mkdir(tmpdir,0755) == 0)
 			break;
 		if (errno == EEXIST)

==== //depot/projects/mpsafetty/lib/libpmc/pmc.core.3#4 (text+ko) ====

@@ -21,7 +21,7 @@
 .\" out of the use of this software, even if advised of the possibility of
 .\" such damage.
 .\"
-.\" $FreeBSD: src/lib/libpmc/pmc.core.3,v 1.6 2008/11/26 03:48:20 jkoshy Exp $
+.\" $FreeBSD: src/lib/libpmc/pmc.core.3,v 1.7 2008/12/08 12:28:48 jkoshy Exp $
 .\"
 .Dd November 12, 2008
 .Os
@@ -730,6 +730,58 @@
 .It Li interrupts Ta Li HW_Int_Rx
 .It Li unhalted-cycles Ta (unsupported)
 .El
+.Sh PROCESSOR ERRATA
+The following errata affect performance measurement on these
+processors.
+These errata are documented in
+.Rs
+.%T "Intel® CoreTM Duo Processor and Intel® CoreTM Solo Processor on 65 nm Process"
+.%B "Specification Update"
+.%N "Order Number 309222-017"
+.%D July 2008
+.%Q "Intel Corporation"
+.Re
+.Bl -tag -width indent -compact
+.It AE19
+Data prefetch performance monitoring events can only be enabled
+on a single core.
+.It AE25
+Performance monitoring counters that count external bus events
+may report incorrect values after processor power state transitions.
+.It AE28
+Performance monitoring events for retired floating point operations
+(C1H) may not be accurate.
+.It AE29
+DR3 address match on MOVD/MOVQ/MOVNTQ memory store
+instruction may incorrectly increment performance monitoring count
+for saturating simd instructions retired (Event CFH).
+.It AE33
+Hardware prefetch performance monitoring events may be counted
+inaccurately.
+.It AE36
+The
+.Li CPU_CLK_UNHALTED
+performance monitoring event (Event 3CH) counts
+clocks when the processor is in the C1/C2 processor power states.
+.It AE39
+Certain performance monitoring counters related to bus, L2 cache
+and power management are inaccurate.
+.It AE51
+Performance monitoring events for retired instructions (Event C0H) may
+not be accurate.
+.It AE67
+Performance monitoring event
+.Li FP_ASSIST
+may not be accurate.
+.It AE78
+Performance monitoring event for hardware prefetch requests (Event
+4EH) and hardware prefetch request cache misses (Event 4FH) may not be
+accurate.
+.It AE82
+Performance monitoring event
+.Li FP_MMX_TRANS_TO_MMX
+may not count some transitions.
+.El
 .Sh SEE ALSO
 .Xr pmc 3 ,
 .Xr pmc.atom 3 ,

==== //depot/projects/mpsafetty/share/man/man4/man4.powerpc/pmu.4#2 (text+ko) ====

@@ -23,7 +23,7 @@
 .\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $FreeBSD: src/share/man/man4/man4.powerpc/pmu.4,v 1.2 2008/12/07 06:34:50 nwhitehorn Exp $
+.\" $FreeBSD: src/share/man/man4/man4.powerpc/pmu.4,v 1.3 2008/12/08 02:37:08 nwhitehorn Exp $
 .\"
 .Dd December 6, 2008
 .Dt PMU 4
@@ -69,13 +69,32 @@
 driver provides power management services in addition to an
 .Xr adb 4
 interface. The following sysctls can be used to control the
-power management behavior.
+power management behavior and to examine current system power and
+thermal conditions.
 .Bl -tag -width indent
 .It Va dev.pmu.%d.server_mode
 Restart after power failure behavior (1 causes system to reboot after power
-cut, 0 causes system to remain off)
+cut, 0 causes system to remain off).
+.It Va dev.pmu.%d.batteries.%d.present
+Indicates whether the relevant battery is inserted.
+.It Va dev.pmu.%d.batteries.%d.charging
+Indicates whether the battery is currently charging.
+.It Va dev.pmu.%d.batteries.%d.charge
+The current battery charge, in milliamp hours.
+.It Va dev.pmu.%d.batteries.%d.maxcharge
+The battery's self-reported maximum charge, in milliamp hours.
+.It Va dev.pmu.%d.batteries.%d.rate
+The current into the battery, in milliamps. While the battery is discharging,
+this will be negative.
+.It Va dev.pmu.%d.batteries.%d.voltage
+Battery voltage, in millivolts.
+.It Va dev.pmu.%d.batteries.%d.time
+Estimated time until full battery charge (or discharge), in minutes.
+.It Va dev.pmu.%d.batteries.%d.life
+Current fraction of the battery's maximum charge, in percent.
 .Sh SEE ALSO
-.Xr adb 4
+.Xr adb 4 ,
+.Xr acpi 4
 .Sh HISTORY
 The
 .Nm

==== //depot/projects/mpsafetty/sys/boot/forth/support.4th#2 (text+ko) ====

@@ -22,7 +22,7 @@
 \ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 \ SUCH DAMAGE.
 \
-\ $FreeBSD: src/sys/boot/forth/support.4th,v 1.17 2007/12/19 17:06:32 ambrisko Exp $
+\ $FreeBSD: src/sys/boot/forth/support.4th,v 1.18 2008/12/07 19:42:20 luigi Exp $
 
 \ Loader.rc support functions:
 \
@@ -288,6 +288,17 @@
 
 : free-memory free if free_error throw then ;
 
+: strget { var -- addr len } var .addr @ var .len @ ;
+
+\ assign addr len to variable.
+: strset  { addr len var -- } addr var .addr ! len var .len ! ;
+
+\ free memory and reset fields
+: strfree { var -- } var .addr @ ?dup if free-memory 0 0 var strset then ;
+
+\ free old content, make a copy of the string and assign to variable
+: string= { addr len var -- } var strfree addr len strdup var strset ;
+
 \ Assignment data temporary storage
 
 string name_buffer
@@ -712,19 +723,6 @@
   module_loaderror_suffix suffix_type?
 ;
 
-: set_conf_files
-  conf_files .addr @ ?dup if
-    free-memory
-  then
-  value_buffer .addr @ c@ [char] " = if
-    value_buffer .addr @ char+ value_buffer .len @ 2 chars -
-  else
-    value_buffer .addr @ value_buffer .len @
-  then
-  strdup
-  conf_files .len ! conf_files .addr !
-;
-
 : set_nextboot_conf
   nextboot_conf_file .addr @ ?dup if
     free-memory
@@ -888,6 +886,11 @@
   then
 ;
 
+: set_conf_files
+  set_environment_variable
+  s" loader_conf_files" getenv conf_files string=
+;
+
 : set_nextboot_flag
   yes_value? to nextboot?
 ;
@@ -1045,7 +1048,6 @@
 \ Variables used for processing multiple conf files
 
 string current_file_name
-variable current_conf_files
 
 \ Indicates if any conf file was succesfully read
 
@@ -1053,18 +1055,10 @@
 
 \ loader_conf_files processing support functions
 
-: set_current_conf_files
-  conf_files .addr @ current_conf_files !
+: get_conf_files ( -- addr len )  \ put addr/len on stack, reset var
+  conf_files strget 0 0 conf_files strset
 ;
 
-: get_conf_files
-  conf_files .addr @ conf_files .len @ strdup
-;
-
-: recurse_on_conf_files?
-  current_conf_files @ conf_files .addr @ <>
-;
-
 : skip_leading_spaces  { addr len pos -- addr len pos' }
   begin
     pos len = if addr len pos exit then
@@ -1133,7 +1127,6 @@
 \ Interface to loader_conf_files processing
 
 : include_conf_files
-  set_current_conf_files
   get_conf_files 0
   begin
     get_next_file ?dup
@@ -1141,7 +1134,7 @@
     set_current_file_name
     ['] load_conf catch
     process_conf_errors
-    recurse_on_conf_files? if recurse then
+    conf_files .addr @ if recurse then
   repeat
 ;
 

==== //depot/projects/mpsafetty/sys/compat/linprocfs/linprocfs.c#10 (text+ko) ====

@@ -42,7 +42,7 @@
 #include "opt_compat.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.128 2008/12/02 21:37:28 bz Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.130 2008/12/08 13:15:31 kib Exp $");
 
 #include <sys/param.h>
 #include <sys/queue.h>
@@ -273,8 +273,7 @@
 		/* XXX per-cpu vendor / class / model / id? */
 	}
 
-	sbuf_cat(sb,
-	    "flags\t\t:");
+	sbuf_cat(sb, "flags\t\t:");
 
 	if (!strcmp(cpu_vendor, "AuthenticAMD") && (class < 6)) {
 		flags[16] = "fcmov";
@@ -876,10 +875,12 @@
 linprocfs_doprocmaps(PFS_FILL_ARGS)
 {
 	vm_map_t map = &p->p_vmspace->vm_map;
-	vm_map_entry_t entry;
+	vm_map_entry_t entry, tmp_entry;
 	vm_object_t obj, tobj, lobj;
-	vm_offset_t saved_end;
+	vm_offset_t e_start, e_end;
 	vm_ooffset_t off = 0;
+	vm_prot_t e_prot;
+	unsigned int last_timestamp;
 	char *name = "", *freename = NULL;
 	ino_t ino;
 	int ref_count, shadow_count, flags;
@@ -905,7 +906,9 @@
 		freename = NULL;
 		if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
 			continue;
-		saved_end = entry->end;
+		e_prot = entry->protection;
+		e_start = entry->start;
+		e_end = entry->end;
 		obj = entry->object.vm_object;
 		for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) {
 			VM_OBJECT_LOCK(tobj);
@@ -913,6 +916,8 @@
 				VM_OBJECT_UNLOCK(lobj);
 			lobj = tobj;
 		}
+		last_timestamp = map->timestamp;
+		vm_map_unlock_read(map);
 		ino = 0;
 		if (lobj) {
 			off = IDX_TO_OFF(lobj->size);
@@ -950,10 +955,10 @@
 		 */
 		error = sbuf_printf(sb,
 		    "%08lx-%08lx %s%s%s%s %08lx %02x:%02x %lu%s%s\n",
-		    (u_long)entry->start, (u_long)entry->end,
-		    (entry->protection & VM_PROT_READ)?"r":"-",
-		    (entry->protection & VM_PROT_WRITE)?"w":"-",
-		    (entry->protection & VM_PROT_EXECUTE)?"x":"-",
+		    (u_long)e_start, (u_long)e_end,
+		    (e_prot & VM_PROT_READ)?"r":"-",
+		    (e_prot & VM_PROT_WRITE)?"w":"-",
+		    (e_prot & VM_PROT_EXECUTE)?"x":"-",
 		    "p",
 		    (u_long)off,
 		    0,
@@ -968,6 +973,16 @@
 			error = 0;
 			break;
 		}
+		vm_map_lock_read(map);
+		if (last_timestamp + 1 != map->timestamp) {
+			/*
+			 * Look again for the entry because the map was
+			 * modified while it was unlocked.  Specifically,
+			 * the entry may have been clipped, merged, or deleted.
+			 */
+			vm_map_lookup_entry(map, e_end - 1, &tmp_entry);
+			entry = tmp_entry;
+		}
 	}
 	vm_map_unlock_read(map);
 

==== //depot/projects/mpsafetty/sys/contrib/pf/net/pf_table.c#2 (text+ko) ====

@@ -35,7 +35,7 @@
 #include "opt_inet6.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/contrib/pf/net/pf_table.c,v 1.9 2007/10/24 20:57:17 mlaier Exp $");
+__FBSDID("$FreeBSD: src/sys/contrib/pf/net/pf_table.c,v 1.10 2008/12/07 21:15:43 kmacy Exp $");
 #endif
 
 #include <sys/param.h>
@@ -43,6 +43,8 @@
 #include <sys/socket.h>
 #include <sys/mbuf.h>
 #include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/rwlock.h>
 #ifdef __FreeBSD__
 #include <sys/malloc.h>
 #endif

==== //depot/projects/mpsafetty/sys/dev/ath/if_ath.c#9 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.221 2008/12/01 16:53:01 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.223 2008/12/07 19:29:11 sam Exp $");
 
 /*
  * Driver for the Atheros Wireless LAN controller.
@@ -219,9 +219,15 @@
 SYSCTL_DECL(_hw_ath);
 
 /* XXX validate sysctl values */
-static	int ath_calinterval = 30;		/* calibrate every 30 secs */
-SYSCTL_INT(_hw_ath, OID_AUTO, calibrate, CTLFLAG_RW, &ath_calinterval,
-	    0, "chip calibration interval (secs)");
+static	int ath_longcalinterval = 30;		/* long cals every 30 secs */
+SYSCTL_INT(_hw_ath, OID_AUTO, longcal, CTLFLAG_RW, &ath_longcalinterval,
+	    0, "long chip calibration interval (secs)");
+static	int ath_shortcalinterval = 100;		/* short cals every 100 ms */
+SYSCTL_INT(_hw_ath, OID_AUTO, shortcal, CTLFLAG_RW, &ath_shortcalinterval,
+	    0, "short chip calibration interval (msecs)");
+static	int ath_resetcalinterval = 20*60;	/* reset cal state 20 mins */
+SYSCTL_INT(_hw_ath, OID_AUTO, resetcal, CTLFLAG_RW, &ath_resetcalinterval,
+	    0, "reset chip calibration results (secs)");
 
 static	int ath_rxbuf = ATH_RXBUF;		/* # rx buffers to allocate */
 SYSCTL_INT(_hw_ath, OID_AUTO, rxbuf, CTLFLAG_RW, &ath_rxbuf,
@@ -1433,8 +1439,9 @@
 	 * state cached in the driver.
 	 */
 	sc->sc_diversity = ath_hal_getdiversity(ah);
-	sc->sc_calinterval = 1;
-	sc->sc_caltries = 0;
+	sc->sc_lastlongcal = 0;
+	sc->sc_resetcal = 1;
+	sc->sc_lastcalreset = 0;
 
 	/*
 	 * Setup the hardware after reset: the key cache
@@ -1566,8 +1573,6 @@
 		if_printf(ifp, "%s: unable to reset hardware; hal status %u\n",
 			__func__, status);
 	sc->sc_diversity = ath_hal_getdiversity(ah);
-	sc->sc_calinterval = 1;
-	sc->sc_caltries = 0;
 	if (ath_startrecv(sc) != 0)	/* restart recv */
 		if_printf(ifp, "%s: unable to start recv logic\n", __func__);
 	/*
@@ -5493,8 +5498,6 @@
 		}
 		sc->sc_curchan = hchan;
 		sc->sc_diversity = ath_hal_getdiversity(ah);
-		sc->sc_calinterval = 1;
-		sc->sc_caltries = 0;
 
 		/*
 		 * Re-enable rx framework.
@@ -5528,54 +5531,76 @@
 {
 	struct ath_softc *sc = arg;
 	struct ath_hal *ah = sc->sc_ah;
-	HAL_BOOL iqCalDone;
+	struct ifnet *ifp = sc->sc_ifp;
+	HAL_BOOL longCal, isCalDone;
+	int nextcal;
 
-	sc->sc_stats.ast_per_cal++;
-
-	if (ath_hal_getrfgain(ah) == HAL_RFGAIN_NEED_CHANGE) {
+	longCal = (ticks - sc->sc_lastlongcal >= ath_longcalinterval*hz);
+	if (longCal) {
+		sc->sc_stats.ast_per_cal++;
+		if (ath_hal_getrfgain(ah) == HAL_RFGAIN_NEED_CHANGE) {
+			/*
+			 * Rfgain is out of bounds, reset the chip
+			 * to load new gain values.
+			 */
+			DPRINTF(sc, ATH_DEBUG_CALIBRATE,
+				"%s: rfgain change\n", __func__);
+			sc->sc_stats.ast_per_rfgain++;
+			ath_reset(ifp);
+		}
 		/*
-		 * Rfgain is out of bounds, reset the chip
-		 * to load new gain values.
+		 * If this long cal is after an idle period, then
+		 * reset the data collection state so we start fresh.
 		 */
-		DPRINTF(sc, ATH_DEBUG_CALIBRATE,
-			"%s: rfgain change\n", __func__);
-		sc->sc_stats.ast_per_rfgain++;
-		ath_reset(sc->sc_ifp);
+		if (sc->sc_resetcal) {
+			(void) ath_hal_calreset(ah, &sc->sc_curchan);
+			sc->sc_lastcalreset = ticks;
+			sc->sc_resetcal = 0;
+		}
 	}
-	if (!ath_hal_calibrate(ah, &sc->sc_curchan, &iqCalDone)) {
+	if (ath_hal_calibrateN(ah, &sc->sc_curchan, longCal, &isCalDone)) {
+		if (longCal) {
+			/*
+			 * Calibrate noise floor data again in case of change.
+			 */
+			ath_hal_process_noisefloor(ah);
+		}
+	} else {
 		DPRINTF(sc, ATH_DEBUG_ANY,
 			"%s: calibration of channel %u failed\n",
 			__func__, sc->sc_curchan.channel);
 		sc->sc_stats.ast_per_calfail++;
 	}
-	/*
-	 * Calibrate noise floor data again in case of change.
-	 */
-	ath_hal_process_noisefloor(ah);
-	/*
-	 * Poll more frequently when the IQ calibration is in
-	 * progress to speedup loading the final settings.
-	 * We temper this aggressive polling with an exponential
-	 * back off after 4 tries up to ath_calinterval.
-	 */
-	if (iqCalDone || sc->sc_calinterval >= ath_calinterval) {
-		sc->sc_caltries = 0;
-		sc->sc_calinterval = ath_calinterval;
-	} else if (sc->sc_caltries > 4) {
-		sc->sc_caltries = 0;
-		sc->sc_calinterval <<= 1;
-		if (sc->sc_calinterval > ath_calinterval)
-			sc->sc_calinterval = ath_calinterval;
+	if (!isCalDone) {
+		/*
+		 * Use a shorter interval to potentially collect multiple
+		 * data samples required to complete calibration.  Once
+		 * we're told the work is done we drop back to a longer
+		 * interval between requests.  We're more aggressive doing
+		 * work when operating as an AP to improve operation right
+		 * after startup.
+		 */
+		nextcal = (1000*ath_shortcalinterval)/hz;
+		if (sc->sc_opmode != HAL_M_HOSTAP)
+			nextcal *= 10;
+	} else {
+		nextcal = ath_longcalinterval*hz;
+		sc->sc_lastlongcal = ticks;
+		if (sc->sc_lastcalreset == 0)
+			sc->sc_lastcalreset = sc->sc_lastlongcal;
+		else if (ticks - sc->sc_lastcalreset >= ath_resetcalinterval*hz)
+			sc->sc_resetcal = 1;	/* setup reset next trip */
 	}
-	KASSERT(0 < sc->sc_calinterval && sc->sc_calinterval <= ath_calinterval,
-		("bad calibration interval %u", sc->sc_calinterval));
 
-	DPRINTF(sc, ATH_DEBUG_CALIBRATE,
-		"%s: next +%u (%siqCalDone tries %u)\n", __func__,
-		sc->sc_calinterval, iqCalDone ? "" : "!", sc->sc_caltries);
-	sc->sc_caltries++;
-	callout_reset(&sc->sc_cal_ch, sc->sc_calinterval * hz,
-		ath_calibrate, sc);
+	if (nextcal != 0) {
+		DPRINTF(sc, ATH_DEBUG_CALIBRATE, "%s: next +%u (%sisCalDone)\n",
+		    __func__, nextcal, isCalDone ? "" : "!");
+		callout_reset(&sc->sc_cal_ch, nextcal, ath_calibrate, sc);
+	} else {
+		DPRINTF(sc, ATH_DEBUG_CALIBRATE, "%s: calibration disabled\n",
+		    __func__);
+		/* NB: don't rearm timer */
+	}
 }
 
 static void
@@ -5803,10 +5828,12 @@
 		 * Finally, start any timers and the task q thread
 		 * (in case we didn't go through SCAN state).
 		 */
-		if (sc->sc_calinterval != 0) {
+		if (ath_longcalinterval != 0) {
 			/* start periodic recalibration timer */
-			callout_reset(&sc->sc_cal_ch, sc->sc_calinterval * hz,
-				ath_calibrate, sc);
+			callout_reset(&sc->sc_cal_ch, 1, ath_calibrate, sc);
+		} else {
+			DPRINTF(sc, ATH_DEBUG_CALIBRATE,
+			    "%s: calibration disabled\n", __func__);
 		}
 		taskqueue_unblock(sc->sc_tq);
 	} else if (nstate == IEEE80211_S_INIT) {
@@ -6885,7 +6912,7 @@
 	struct ieee80211com *ic = ifp->if_l2com;
 	struct ath_hal *ah = sc->sc_ah;
 	int error, ismcast, ismrr;
-	int hdrlen, pktlen, try0, txantenna;
+	int keyix, hdrlen, pktlen, try0, txantenna;
 	u_int8_t rix, cix, txrate, ctsrate, rate1, rate2, rate3;
 	struct ieee80211_frame *wh;
 	u_int flags, ctsduration;
@@ -6904,6 +6931,54 @@
 	/* XXX honor IEEE80211_BPF_DATAPAD */
 	pktlen = m0->m_pkthdr.len - (hdrlen & 3) + IEEE80211_CRC_LEN;
 
+	if (params->ibp_flags & IEEE80211_BPF_CRYPTO) {
+		const struct ieee80211_cipher *cip;
+		struct ieee80211_key *k;
+
+		/*
+		 * Construct the 802.11 header+trailer for an encrypted
+		 * frame. The only reason this can fail is because of an
+		 * unknown or unsupported cipher/key type.
+		 */
+		k = ieee80211_crypto_encap(ni, m0);
+		if (k == NULL) {
+			/*
+			 * This can happen when the key is yanked after the
+			 * frame was queued.  Just discard the frame; the
+			 * 802.11 layer counts failures and provides
+			 * debugging/diagnostics.
+			 */
+			ath_freetx(m0);
+			return EIO;
+		}
+		/*
+		 * Adjust the packet + header lengths for the crypto
+		 * additions and calculate the h/w key index.  When
+		 * a s/w mic is done the frame will have had any mic
+		 * added to it prior to entry so m0->m_pkthdr.len will
+		 * account for it. Otherwise we need to add it to the
+		 * packet length.
+		 */
+		cip = k->wk_cipher;
+		hdrlen += cip->ic_header;
+		pktlen += cip->ic_header + cip->ic_trailer;
+		/* NB: frags always have any TKIP MIC done in s/w */
+		if ((k->wk_flags & IEEE80211_KEY_SWMIC) == 0)
+			pktlen += cip->ic_miclen;
+		keyix = k->wk_keyix;
+
+		/* packet header may have moved, reset our local pointer */
+		wh = mtod(m0, struct ieee80211_frame *);
+	} else if (ni->ni_ucastkey.wk_cipher == &ieee80211_cipher_none) {
+		/*
+		 * Use station key cache slot, if assigned.
+		 */
+		keyix = ni->ni_ucastkey.wk_keyix;
+		if (keyix == IEEE80211_KEYIX_NONE)
+			keyix = HAL_TXKEYIX_INVALID;
+	} else
+		keyix = HAL_TXKEYIX_INVALID;
+
 	error = ath_tx_dmasetup(sc, bf, m0);
 	if (error != 0)
 		return error;
@@ -6992,7 +7067,7 @@
 		, atype			/* Atheros packet type */
 		, params->ibp_power	/* txpower */
 		, txrate, try0		/* series 0 rate/tries */
-		, HAL_TXKEYIX_INVALID	/* key cache index */
+		, keyix			/* key cache index */
 		, txantenna		/* antenna mode */
 		, flags			/* flags */
 		, ctsrate		/* rts/cts rate */

==== //depot/projects/mpsafetty/sys/dev/ath/if_athvar.h#7 (text+ko) ====

@@ -26,7 +26,7 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  * THE POSSIBILITY OF SUCH DAMAGES.
  *
- * $FreeBSD: src/sys/dev/ath/if_athvar.h,v 1.75 2008/12/01 16:53:01 sam Exp $
+ * $FreeBSD: src/sys/dev/ath/if_athvar.h,v 1.76 2008/12/07 19:26:34 sam Exp $
  */
 
 /*
@@ -248,7 +248,8 @@
 				sc_swbmiss  : 1,/* sta mode using sw bmiss */
 				sc_stagbeacons:1,/* use staggered beacons */
 				sc_wmetkipmic:1,/* can do WME+TKIP MIC */
-				sc_resume_up: 1;/* on resume, start all vaps */
+				sc_resume_up: 1,/* on resume, start all vaps */
+				sc_resetcal : 1;/* reset cal state next trip */
 	uint32_t		sc_eerd;	/* regdomain from EEPROM */
 	uint32_t		sc_eecc;	/* country code from EEPROM */
 						/* rate tables */
@@ -334,8 +335,8 @@
 	int			sc_nbcnvaps;	/* # vaps with beacons */
 
 	struct callout		sc_cal_ch;	/* callout handle for cals */
-	int			sc_calinterval;	/* current polling interval */
-	int			sc_caltries;	/* cals at current interval */
+	int			sc_lastlongcal;	/* last long cal completed */
+	int			sc_lastcalreset;/* last cal reset done */
 	HAL_NODE_STATS		sc_halstats;	/* station-mode rssi stats */
 };
 
@@ -438,6 +439,16 @@
 	((*(_ah)->ah_setChannel)((_ah), (_chan)))
 #define	ath_hal_calibrate(_ah, _chan, _iqcal) \
 	((*(_ah)->ah_perCalibration)((_ah), (_chan), (_iqcal)))
+#if HAL_ABI_VERSION >= 0x08111000
+#define	ath_hal_calibrateN(_ah, _chan, _lcal, _isdone) \
+	((*(_ah)->ah_perCalibrationN)((_ah), (_chan), 0x1, (_lcal), (_isdone)))
+#define	ath_hal_calreset(_ah, _chan) \
+	((*(_ah)->ah_resetCalValid)((_ah), (_chan)))
+#else
+#define	ath_hal_calibrateN(_ah, _chan, _lcal, _isdone) \
+	ath_hal_calibrate(_ah, _chan, _isdone)
+#define	ath_hal_calreset(_ah, _chan)	(0)
+#endif
 #define	ath_hal_setledstate(_ah, _state) \
 	((*(_ah)->ah_setLedState)((_ah), (_state)))
 #define	ath_hal_beaconinit(_ah, _nextb, _bperiod) \

==== //depot/projects/mpsafetty/sys/dev/dc/if_dc.c#4 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/dc/if_dc.c,v 1.197 2008/08/29 20:31:41 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/dc/if_dc.c,v 1.198 2008/12/07 23:02:37 marius Exp $");
 
 /*
  * DEC "tulip" clone ethernet driver. Supports the DEC/Intel 21143
@@ -607,15 +607,22 @@
 static void
 dc_mii_writebit(struct dc_softc *sc, int bit)
 {
+	uint32_t reg;
 
-	if (bit)
-		CSR_WRITE_4(sc, DC_SIO,
-		    DC_SIO_ROMCTL_WRITE | DC_SIO_MII_DATAOUT);
-	else
-		CSR_WRITE_4(sc, DC_SIO, DC_SIO_ROMCTL_WRITE);
+	reg = DC_SIO_ROMCTL_WRITE | (bit != 0 ? DC_SIO_MII_DATAOUT : 0);
+	CSR_WRITE_4(sc, DC_SIO, reg);
+	CSR_BARRIER_4(sc, DC_SIO,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	DELAY(1);
 
-	DC_SETBIT(sc, DC_SIO, DC_SIO_MII_CLK);
-	DC_CLRBIT(sc, DC_SIO, DC_SIO_MII_CLK);
+	CSR_WRITE_4(sc, DC_SIO, reg | DC_SIO_MII_CLK);
+	CSR_BARRIER_4(sc, DC_SIO,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	DELAY(1);
+	CSR_WRITE_4(sc, DC_SIO, reg);
+	CSR_BARRIER_4(sc, DC_SIO,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	DELAY(1);
 }
 
 /*
@@ -624,11 +631,22 @@
 static int
 dc_mii_readbit(struct dc_softc *sc)
 {
+	uint32_t reg;
 
-	CSR_WRITE_4(sc, DC_SIO, DC_SIO_ROMCTL_READ | DC_SIO_MII_DIR);
-	CSR_READ_4(sc, DC_SIO);
-	DC_SETBIT(sc, DC_SIO, DC_SIO_MII_CLK);
-	DC_CLRBIT(sc, DC_SIO, DC_SIO_MII_CLK);
+	reg = DC_SIO_ROMCTL_READ | DC_SIO_MII_DIR;
+	CSR_WRITE_4(sc, DC_SIO, reg);
+	CSR_BARRIER_4(sc, DC_SIO,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	DELAY(1);
+	(void)CSR_READ_4(sc, DC_SIO);
+	CSR_WRITE_4(sc, DC_SIO, reg | DC_SIO_MII_CLK);
+	CSR_BARRIER_4(sc, DC_SIO,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	DELAY(1);
+	CSR_WRITE_4(sc, DC_SIO, reg);
+	CSR_BARRIER_4(sc, DC_SIO,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	DELAY(1);
 	if (CSR_READ_4(sc, DC_SIO) & DC_SIO_MII_DATAIN)
 		return (1);
 
@@ -644,6 +662,9 @@
 	int i;
 
 	CSR_WRITE_4(sc, DC_SIO, DC_SIO_ROMCTL_WRITE);
+	CSR_BARRIER_4(sc, DC_SIO,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	DELAY(1);
 
 	for (i = 0; i < 32; i++)
 		dc_mii_writebit(sc, 1);
@@ -667,15 +688,13 @@
 static int
 dc_mii_readreg(struct dc_softc *sc, struct dc_mii_frame *frame)
 {
-	int i, ack;
+	int i;
 
 	/*
 	 * Set up frame for RX.
 	 */
 	frame->mii_stdelim = DC_MII_STARTDELIM;
 	frame->mii_opcode = DC_MII_READOP;
-	frame->mii_turnaround = 0;
-	frame->mii_data = 0;
 
 	/*
 	 * Sync the PHYs.
@@ -690,38 +709,28 @@
 	dc_mii_send(sc, frame->mii_phyaddr, 5);
 	dc_mii_send(sc, frame->mii_regaddr, 5);
 
-#ifdef notdef
-	/* Idle bit */
-	dc_mii_writebit(sc, 1);
-	dc_mii_writebit(sc, 0);
-#endif
-
-	/* Check for ack. */
-	ack = dc_mii_readbit(sc);
-
 	/*
-	 * Now try reading data bits. If the ack failed, we still
+	 * Now try reading data bits.  If the turnaround failed, we still
 	 * need to clock through 16 cycles to keep the PHY(s) in sync.
 	 */
-	if (ack) {
+	frame->mii_turnaround = dc_mii_readbit(sc);
+	if (frame->mii_turnaround != 0) {
 		for (i = 0; i < 16; i++)
 			dc_mii_readbit(sc);
 		goto fail;
 	}
-
 	for (i = 0x8000; i; i >>= 1) {
-		if (!ack) {
-			if (dc_mii_readbit(sc))
-				frame->mii_data |= i;
-		}
+		if (dc_mii_readbit(sc))
+			frame->mii_data |= i;
 	}
 
 fail:
 
+	/* Clock the idle bits. */
 	dc_mii_writebit(sc, 0);
 	dc_mii_writebit(sc, 0);
 
-	if (ack)
+	if (frame->mii_turnaround != 0)
 		return (1);
 	return (0);
 }
@@ -736,7 +745,6 @@
 	/*
 	 * Set up frame for TX.
 	 */
-
 	frame->mii_stdelim = DC_MII_STARTDELIM;
 	frame->mii_opcode = DC_MII_WRITEOP;
 	frame->mii_turnaround = DC_MII_TURNAROUND;
@@ -753,7 +761,7 @@
 	dc_mii_send(sc, frame->mii_turnaround, 2);
 	dc_mii_send(sc, frame->mii_data, 16);
 
-	/* Idle bit. */
+	/* Clock the idle bits. */
 	dc_mii_writebit(sc, 0);
 	dc_mii_writebit(sc, 0);
 


>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list