PERFORCE change 100484 for review

Paolo Pisati piso at FreeBSD.org
Mon Jul 3 10:34:22 UTC 2006


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

Change 100484 by piso at piso_newluxor on 2006/07/03 10:32:54

	IFC

Affected files ...

.. //depot/projects/soc2006/intr_filter/amd64/amd64/pmap.c#4 integrate
.. //depot/projects/soc2006/intr_filter/amd64/conf/GENERIC#3 integrate
.. //depot/projects/soc2006/intr_filter/amd64/conf/NOTES#3 integrate
.. //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_proto.h#4 integrate
.. //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_syscall.h#4 integrate
.. //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_sysent.c#4 integrate
.. //depot/projects/soc2006/intr_filter/amd64/linux32/syscalls.master#4 integrate
.. //depot/projects/soc2006/intr_filter/arm/arm/elf_trampoline.c#4 integrate
.. //depot/projects/soc2006/intr_filter/arm/arm/locore.S#2 integrate
.. //depot/projects/soc2006/intr_filter/arm/at91/at91_pio.c#4 integrate
.. //depot/projects/soc2006/intr_filter/arm/at91/at91_pio_rm9200.h#1 branch
.. //depot/projects/soc2006/intr_filter/arm/at91/at91_piovar.h#1 branch
.. //depot/projects/soc2006/intr_filter/arm/at91/files.at91#2 integrate
.. //depot/projects/soc2006/intr_filter/arm/at91/uart_dev_at91usart.c#2 integrate
.. //depot/projects/soc2006/intr_filter/cam/cam_xpt.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_proto.h#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_syscall.h#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_syscalls.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_sysent.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/freebsd32/syscalls.master#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/linprocfs/linprocfs.c#3 integrate
.. //depot/projects/soc2006/intr_filter/compat/linux/linux_ipc.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/linux/linux_misc.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/linux/linux_util.h#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/ndis/kern_ndis.c#3 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/Makefile#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_ipc.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_misc.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_proto.h#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_syscall.h#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_syscallnames.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_sysent.c#2 integrate
.. //depot/projects/soc2006/intr_filter/compat/svr4/syscalls.master#2 integrate
.. //depot/projects/soc2006/intr_filter/conf/NOTES#4 integrate
.. //depot/projects/soc2006/intr_filter/conf/files#3 integrate
.. //depot/projects/soc2006/intr_filter/conf/files.amd64#2 integrate
.. //depot/projects/soc2006/intr_filter/conf/files.i386#2 integrate
.. //depot/projects/soc2006/intr_filter/conf/files.ia64#2 integrate
.. //depot/projects/soc2006/intr_filter/conf/kern.mk#2 integrate
.. //depot/projects/soc2006/intr_filter/conf/kern.pre.mk#2 integrate
.. //depot/projects/soc2006/intr_filter/conf/kmod.mk#2 integrate
.. //depot/projects/soc2006/intr_filter/conf/options#3 integrate
.. //depot/projects/soc2006/intr_filter/dev/acpica/acpi_dock.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/ata/ata-all.h#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/ata/ata-chipset.c#4 integrate
.. //depot/projects/soc2006/intr_filter/dev/ata/atapi-cd.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/ath/if_ath.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/ath/if_athioctl.h#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/ath/if_athvar.h#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/bge/if_bge.c#4 integrate
.. //depot/projects/soc2006/intr_filter/dev/bge/if_bgereg.h#3 integrate
.. //depot/projects/soc2006/intr_filter/dev/bktr/CHANGELOG.TXT#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/isp/isp.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/isp/isp_pci.c#3 integrate
.. //depot/projects/soc2006/intr_filter/dev/isp/ispmbox.h#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/isp/ispreg.h#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/isp/ispvar.h#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/ispfw/asm_2322.h#1 branch
.. //depot/projects/soc2006/intr_filter/dev/ispfw/ispfw.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mfi/mfi.c#5 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/acphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/amphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/bmtphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/brgphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/ciphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/e1000phy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/exphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/inphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/lxtphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/mlphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/nsgphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/nsphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/pnaphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/qsphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/rgephy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/rlphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/ruephy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/tdkphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/tlphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/ukphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mii/xmphy.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mpt/mpt.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mpt/mpt.h#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/mpt/mpt_cam.c#3 integrate
.. //depot/projects/soc2006/intr_filter/dev/mpt/mpt_pci.c#4 integrate
.. //depot/projects/soc2006/intr_filter/dev/nfe/if_nfe.c#1 branch
.. //depot/projects/soc2006/intr_filter/dev/nfe/if_nfereg.h#1 branch
.. //depot/projects/soc2006/intr_filter/dev/nfe/if_nfevar.h#1 branch
.. //depot/projects/soc2006/intr_filter/dev/puc/puc.c#4 integrate
.. //depot/projects/soc2006/intr_filter/dev/puc/puc_cfg.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/puc/puc_pccard.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/puc/puc_pci.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/puc/pucdata.c#3 integrate
.. //depot/projects/soc2006/intr_filter/dev/re/if_re.c#3 integrate
.. //depot/projects/soc2006/intr_filter/dev/sio/sio.c#4 integrate
.. //depot/projects/soc2006/intr_filter/dev/usb/if_ural.c#2 integrate
.. //depot/projects/soc2006/intr_filter/dev/usb/uplcom.c#3 integrate
.. //depot/projects/soc2006/intr_filter/dev/usb/usbdevs#3 integrate
.. //depot/projects/soc2006/intr_filter/fs/pseudofs/pseudofs_vnops.c#2 integrate
.. //depot/projects/soc2006/intr_filter/fs/udf/udf_vfsops.c#2 integrate
.. //depot/projects/soc2006/intr_filter/geom/geom_gpt.c#2 integrate
.. //depot/projects/soc2006/intr_filter/i386/conf/GENERIC#4 integrate
.. //depot/projects/soc2006/intr_filter/i386/conf/NOTES#3 integrate
.. //depot/projects/soc2006/intr_filter/i386/conf/XBOX#3 integrate
.. //depot/projects/soc2006/intr_filter/i386/i386/pmap.c#4 integrate
.. //depot/projects/soc2006/intr_filter/i386/linux/linux_proto.h#4 integrate
.. //depot/projects/soc2006/intr_filter/i386/linux/linux_syscall.h#4 integrate
.. //depot/projects/soc2006/intr_filter/i386/linux/linux_sysent.c#4 integrate
.. //depot/projects/soc2006/intr_filter/i386/linux/syscalls.master#4 integrate
.. //depot/projects/soc2006/intr_filter/ia64/conf/GENERIC#3 integrate
.. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm.h#2 integrate
.. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_decode.c#2 integrate
.. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_extract.c#2 integrate
.. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_format.c#2 integrate
.. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_int.h#2 integrate
.. //depot/projects/soc2006/intr_filter/ia64/ia64/emulate.c#1 branch
.. //depot/projects/soc2006/intr_filter/ia64/ia64/machdep.c#2 integrate
.. //depot/projects/soc2006/intr_filter/ia64/ia64/pmap.c#3 integrate
.. //depot/projects/soc2006/intr_filter/ia64/ia64/trap.c#2 integrate
.. //depot/projects/soc2006/intr_filter/ia64/include/md_var.h#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/kern_descrip.c#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/kern_fork.c#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/kern_ktrace.c#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/kern_linker.c#4 integrate
.. //depot/projects/soc2006/intr_filter/kern/kern_module.c#3 integrate
.. //depot/projects/soc2006/intr_filter/kern/kern_thread.c#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/link_elf.c#3 integrate
.. //depot/projects/soc2006/intr_filter/kern/link_elf_obj.c#3 integrate
.. //depot/projects/soc2006/intr_filter/kern/sched_4bsd.c#3 integrate
.. //depot/projects/soc2006/intr_filter/kern/sched_core.c#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/subr_bus.c#3 integrate
.. //depot/projects/soc2006/intr_filter/kern/subr_firmware.c#4 integrate
.. //depot/projects/soc2006/intr_filter/kern/syscalls.master#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/sysv_sem.c#3 integrate
.. //depot/projects/soc2006/intr_filter/kern/uipc_usrreq.c#4 integrate
.. //depot/projects/soc2006/intr_filter/kern/vfs_init.c#3 integrate
.. //depot/projects/soc2006/intr_filter/kern/vfs_mount.c#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/vfs_subr.c#2 integrate
.. //depot/projects/soc2006/intr_filter/kern/vfs_vnops.c#2 integrate
.. //depot/projects/soc2006/intr_filter/modules/Makefile#4 integrate
.. //depot/projects/soc2006/intr_filter/modules/bktr/bktr_mem/Makefile#2 integrate
.. //depot/projects/soc2006/intr_filter/modules/netgraph/Makefile#2 integrate
.. //depot/projects/soc2006/intr_filter/modules/netgraph/tag/Makefile#1 branch
.. //depot/projects/soc2006/intr_filter/modules/nfe/Makefile#1 branch
.. //depot/projects/soc2006/intr_filter/modules/streams/Makefile#2 integrate
.. //depot/projects/soc2006/intr_filter/modules/svr4/Makefile#2 integrate
.. //depot/projects/soc2006/intr_filter/net/if.c#4 integrate
.. //depot/projects/soc2006/intr_filter/net/if_atmsubr.c#2 integrate
.. //depot/projects/soc2006/intr_filter/net/if_enc.c#1 branch
.. //depot/projects/soc2006/intr_filter/net/if_gif.c#2 integrate
.. //depot/projects/soc2006/intr_filter/net/if_stf.c#2 integrate
.. //depot/projects/soc2006/intr_filter/net/if_tun.c#2 integrate
.. //depot/projects/soc2006/intr_filter/net/if_types.h#2 integrate
.. //depot/projects/soc2006/intr_filter/net/if_vlan.c#3 integrate
.. //depot/projects/soc2006/intr_filter/net80211/ieee80211_freebsd.c#3 integrate
.. //depot/projects/soc2006/intr_filter/netgraph/ng_tag.c#1 branch
.. //depot/projects/soc2006/intr_filter/netgraph/ng_tag.h#1 branch
.. //depot/projects/soc2006/intr_filter/netinet/if_ether.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet/in_pcb.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet/ip_divert.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet/ip_fw2.c#3 integrate
.. //depot/projects/soc2006/intr_filter/netinet/ip_output.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet/tcp_input.c#3 integrate
.. //depot/projects/soc2006/intr_filter/netinet/tcp_syncache.c#3 integrate
.. //depot/projects/soc2006/intr_filter/netinet/tcp_usrreq.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet/tcp_var.h#3 integrate
.. //depot/projects/soc2006/intr_filter/netinet6/in6.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet6/in6_cksum.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet6/in6_pcb.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet6/in6_var.h#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet6/ipsec.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netinet6/raw_ip6.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netipsec/ipsec.h#2 integrate
.. //depot/projects/soc2006/intr_filter/netipsec/ipsec_input.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netipsec/ipsec_osdep.h#2 integrate
.. //depot/projects/soc2006/intr_filter/netipsec/ipsec_output.c#2 integrate
.. //depot/projects/soc2006/intr_filter/netipsec/xform_ipip.c#2 integrate
.. //depot/projects/soc2006/intr_filter/nfsclient/bootp_subr.c#2 integrate
.. //depot/projects/soc2006/intr_filter/nfsclient/nfs_diskless.c#2 integrate
.. //depot/projects/soc2006/intr_filter/nfsserver/nfs_srvcache.c#2 integrate
.. //depot/projects/soc2006/intr_filter/nfsserver/nfsrvcache.h#2 integrate
.. //depot/projects/soc2006/intr_filter/pc98/conf/GENERIC#3 integrate
.. //depot/projects/soc2006/intr_filter/pci/agp_i810.c#2 integrate
.. //depot/projects/soc2006/intr_filter/pci/if_rlreg.h#2 integrate
.. //depot/projects/soc2006/intr_filter/powerpc/conf/GENERIC#3 integrate
.. //depot/projects/soc2006/intr_filter/powerpc/powerpc/mmu_oea.c#4 integrate
.. //depot/projects/soc2006/intr_filter/sparc64/conf/GENERIC#3 integrate
.. //depot/projects/soc2006/intr_filter/sys/gpt.h#2 integrate
.. //depot/projects/soc2006/intr_filter/sys/rwlock.h#2 integrate
.. //depot/projects/soc2006/intr_filter/sys/sx.h#2 integrate
.. //depot/projects/soc2006/intr_filter/sys/syscallsubr.h#3 integrate
.. //depot/projects/soc2006/intr_filter/vm/vm_mmap.c#2 integrate
.. //depot/projects/soc2006/intr_filter/vm/vm_page.c#2 integrate
.. //depot/projects/soc2006/intr_filter/vm/vm_pageq.c#2 integrate

Differences ...

==== //depot/projects/soc2006/intr_filter/amd64/amd64/pmap.c#4 (text+ko) ====

@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.558 2006/06/20 20:52:10 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.563 2006/07/02 18:22:46 alc Exp $");
 
 /*
  *	Manages physical address maps.
@@ -490,8 +490,7 @@
  *	(physical) address starting relative to 0]
  */
 void
-pmap_bootstrap(firstaddr)
-	vm_paddr_t *firstaddr;
+pmap_bootstrap(vm_paddr_t *firstaddr)
 {
 	vm_offset_t va;
 	pt_entry_t *pte, *unused;
@@ -1132,8 +1131,7 @@
 }
 
 void
-pmap_pinit0(pmap)
-	struct pmap *pmap;
+pmap_pinit0(pmap_t pmap)
 {
 
 	PMAP_LOCK_INIT(pmap);
@@ -1148,8 +1146,7 @@
  * such as one in a vmspace structure.
  */
 void
-pmap_pinit(pmap)
-	register struct pmap *pmap;
+pmap_pinit(pmap_t pmap)
 {
 	vm_page_t pml4pg;
 	static vm_pindex_t color;
@@ -1611,9 +1608,9 @@
 				vm_page_flag_clear(m, PG_WRITEABLE);
 			m->md.pv_list_count--;
 			pmap_unuse_pt(pmap, va, ptepde);
+			free_pv_entry(pmap, pv);
 			if (pmap != locked_pmap)
 				PMAP_UNLOCK(pmap);
-			free_pv_entry(locked_pmap, pv);
 		}
 	}
 }
@@ -1979,7 +1976,7 @@
 void
 pmap_remove_all(vm_page_t m)
 {
-	register pv_entry_t pv;
+	pv_entry_t pv;
 	pmap_t pmap;
 	pt_entry_t *pte, tpte;
 	pd_entry_t ptepde;
@@ -2145,7 +2142,7 @@
 {
 	vm_paddr_t pa;
 	pd_entry_t *pde;
-	register pt_entry_t *pte;
+	pt_entry_t *pte;
 	vm_paddr_t opa;
 	pt_entry_t origpte, newpte;
 	vm_page_t mpte, om;
@@ -2582,12 +2579,9 @@
  *			The mapping must already exist in the pmap.
  */
 void
-pmap_change_wiring(pmap, va, wired)
-	register pmap_t pmap;
-	vm_offset_t va;
-	boolean_t wired;
+pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
 {
-	register pt_entry_t *pte;
+	pt_entry_t *pte;
 
 	/*
 	 * Wiring is not a hardware characteristic so there is no need to
@@ -2674,7 +2668,7 @@
 			    PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpde));
 			pde = &pde[pmap_pde_index(addr)];
 			if (*pde == 0) {
-				*pde = srcptepaddr;
+				*pde = srcptepaddr & ~PG_W;
 				dst_pmap->pm_stats.resident_count +=
 				    NBPDR / PAGE_SIZE;
 			} else
@@ -2697,11 +2691,6 @@
 			 * we only virtual copy managed pages
 			 */
 			if ((ptetemp & PG_MANAGED) != 0) {
-				/*
-				 * We have to check after allocpte for the
-				 * pte still being around...  allocpte can
-				 * block.
-				 */
 				dstmpte = pmap_allocpte(dst_pmap, addr,
 				    M_NOWAIT);
 				if (dstmpte == NULL)
@@ -2713,14 +2702,16 @@
 				    pmap_try_insert_pv_entry(dst_pmap, addr,
 				    PHYS_TO_VM_PAGE(ptetemp & PG_FRAME))) {
 					/*
-					 * Clear the modified and
+					 * Clear the wired, modified, and
 					 * accessed (referenced) bits
 					 * during the copy.
 					 */
-					*dst_pte = ptetemp & ~(PG_M | PG_A);
+					*dst_pte = ptetemp & ~(PG_W | PG_M |
+					    PG_A);
 					dst_pmap->pm_stats.resident_count++;
 	 			} else
-					pmap_unwire_pte_hold(dst_pmap, addr, dstmpte);
+					pmap_unwire_pte_hold(dst_pmap, addr,
+					    dstmpte);
 				if (dstmpte->wire_count >= srcmpte->wire_count)
 					break;
 			}
@@ -2799,9 +2790,7 @@
  * subset of pmaps for proper page aging.
  */
 boolean_t
-pmap_page_exists_quick(pmap, m)
-	pmap_t pmap;
-	vm_page_t m;
+pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
 {
 	pv_entry_t pv;
 	int loops = 0;
@@ -2985,7 +2974,7 @@
 static __inline void
 pmap_clear_ptes(vm_page_t m, long bit)
 {
-	register pv_entry_t pv;
+	pv_entry_t pv;
 	pmap_t pmap;
 	pt_entry_t pbits, *pte;
 
@@ -3055,35 +3044,26 @@
 int
 pmap_ts_referenced(vm_page_t m)
 {
-	register pv_entry_t pv, pvf, pvn;
+	pv_entry_t pv, pvf, pvn;
 	pmap_t pmap;
 	pt_entry_t *pte;
-	pt_entry_t v;
 	int rtval = 0;
 
 	if (m->flags & PG_FICTITIOUS)
 		return (rtval);
-
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
-
 		pvf = pv;
-
 		do {
 			pvn = TAILQ_NEXT(pv, pv_list);
-
 			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
-
 			TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
-
 			pmap = PV_PMAP(pv);
 			PMAP_LOCK(pmap);
 			pte = pmap_pte(pmap, pv->pv_va);
-
-			if (pte && ((v = pte_load(pte)) & PG_A) != 0) {
+			if (pte != NULL && (*pte & PG_A) != 0) {
 				atomic_clear_long(pte, PG_A);
 				pmap_invalidate_page(pmap, pv->pv_va);
-
 				rtval++;
 				if (rtval > 4) {
 					PMAP_UNLOCK(pmap);
@@ -3093,7 +3073,6 @@
 			PMAP_UNLOCK(pmap);
 		} while ((pv = pvn) != NULL && pv != pvf);
 	}
-
 	return (rtval);
 }
 
@@ -3128,9 +3107,7 @@
  * NOT real memory.
  */
 void *
-pmap_mapdev(pa, size)
-	vm_paddr_t pa;
-	vm_size_t size;
+pmap_mapdev(vm_paddr_t pa, vm_size_t size)
 {
 	vm_offset_t va, tmpva, offset;
 
@@ -3154,9 +3131,7 @@
 }
 
 void
-pmap_unmapdev(va, size)
-	vm_offset_t va;
-	vm_size_t size;
+pmap_unmapdev(vm_offset_t va, vm_size_t size)
 {
 	vm_offset_t base, offset, tmpva;
 
@@ -3176,9 +3151,7 @@
  * perform the pmap work for mincore
  */
 int
-pmap_mincore(pmap, addr)
-	pmap_t pmap;
-	vm_offset_t addr;
+pmap_mincore(pmap_t pmap, vm_offset_t addr)
 {
 	pt_entry_t *ptep, pte;
 	vm_page_t m;

==== //depot/projects/soc2006/intr_filter/amd64/conf/GENERIC#3 (text+ko) ====

@@ -16,7 +16,7 @@
 # If you are in doubt as to the purpose or necessity of a line, check first
 # in NOTES.
 #
-# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.460 2006/06/15 19:58:52 netchild Exp $
+# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.462 2006/06/26 22:03:20 babkin Exp $
 
 cpu		HAMMER
 ident		GENERIC

==== //depot/projects/soc2006/intr_filter/amd64/conf/NOTES#3 (text+ko) ====

@@ -4,7 +4,7 @@
 # This file contains machine dependent kernel configuration notes.  For
 # machine independent notes, look in /sys/conf/NOTES.
 #
-# $FreeBSD: src/sys/amd64/conf/NOTES,v 1.56 2006/06/12 20:38:17 jhb Exp $
+# $FreeBSD: src/sys/amd64/conf/NOTES,v 1.57 2006/06/26 23:41:06 obrien Exp $
 #
 
 #
@@ -223,6 +223,7 @@
 #       (requires miibus)
 # ipw:	Intel PRO/Wireless 2100 IEEE 802.11 adapter
 # iwi:	Intel PRO/Wireless 2200BG/2225BG/2915ABG IEEE 802.11 adapters
+# nfe:	nVidia nForce MCP on-board Ethernet Networking (BSD open source)
 # nve:	nVidia nForce MCP on-board Ethernet Networking
 # ral:	Ralink Technology IEEE 802.11 wireless adapter
 # ural:	Ralink Technology RT2500USB IEEE 802.11 wireless adapter
@@ -233,6 +234,7 @@
 options 	ED_SIC
 device		iwi
 device		ipw
+device		nfe		# nVidia nForce MCP on-board Ethernet Networking
 device		nve		# nVidia nForce MCP on-board Ethernet Networking
 device		ral
 device		ural

==== //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_proto.h#4 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.13 2006/06/20 20:41:28 netchild Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp 
+ * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.16 2006/06/27 18:32:16 jhb Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp 
  */
 
 #ifndef _LINUX_SYSPROTO_H_

==== //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_syscall.h#4 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.13 2006/06/20 20:41:28 netchild Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp 
+ * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.16 2006/06/27 18:32:16 jhb Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp 
  */
 
 #define	LINUX_SYS_exit	1

==== //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_sysent.c#4 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.13 2006/06/20 20:41:28 netchild Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp 
+ * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.16 2006/06/27 18:32:16 jhb Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp 
  */
 
 #include <bsm/audit_kevents.h>
@@ -41,8 +41,8 @@
 	{ SYF_MPSAFE | AS(linux_stat_args), (sy_call_t *)linux_stat, AUE_STAT },	/* 18 = linux_stat */
 	{ SYF_MPSAFE | AS(linux_lseek_args), (sy_call_t *)linux_lseek, AUE_LSEEK },	/* 19 = linux_lseek */
 	{ SYF_MPSAFE | 0, (sy_call_t *)linux_getpid, AUE_GETPID },	/* 20 = linux_getpid */
-	{ AS(linux_mount_args), (sy_call_t *)linux_mount, AUE_MOUNT },	/* 21 = linux_mount */
-	{ AS(linux_oldumount_args), (sy_call_t *)linux_oldumount, AUE_UMOUNT },	/* 22 = linux_oldumount */
+	{ SYF_MPSAFE | AS(linux_mount_args), (sy_call_t *)linux_mount, AUE_MOUNT },	/* 21 = linux_mount */
+	{ SYF_MPSAFE | AS(linux_oldumount_args), (sy_call_t *)linux_oldumount, AUE_UMOUNT },	/* 22 = linux_oldumount */
 	{ SYF_MPSAFE | AS(linux_setuid16_args), (sy_call_t *)linux_setuid16, AUE_SETUID },	/* 23 = linux_setuid16 */
 	{ SYF_MPSAFE | 0, (sy_call_t *)linux_getuid16, AUE_GETUID },	/* 24 = linux_getuid16 */
 	{ SYF_MPSAFE | 0, (sy_call_t *)linux_stime, AUE_SETTIMEOFDAY },	/* 25 = linux_stime */
@@ -65,14 +65,14 @@
 	{ SYF_MPSAFE | AS(linux_pipe_args), (sy_call_t *)linux_pipe, AUE_PIPE },	/* 42 = linux_pipe */
 	{ SYF_MPSAFE | AS(linux_times_args), (sy_call_t *)linux_times, AUE_NULL },	/* 43 = linux_times */
 	{ 0, (sy_call_t *)nosys, AUE_NULL },			/* 44 = prof */
-	{ AS(linux_brk_args), (sy_call_t *)linux_brk, AUE_NULL },	/* 45 = linux_brk */
+	{ SYF_MPSAFE | AS(linux_brk_args), (sy_call_t *)linux_brk, AUE_NULL },	/* 45 = linux_brk */
 	{ SYF_MPSAFE | AS(linux_setgid16_args), (sy_call_t *)linux_setgid16, AUE_SETGID },	/* 46 = linux_setgid16 */
 	{ SYF_MPSAFE | 0, (sy_call_t *)linux_getgid16, AUE_GETGID },	/* 47 = linux_getgid16 */
 	{ SYF_MPSAFE | AS(linux_signal_args), (sy_call_t *)linux_signal, AUE_NULL },	/* 48 = linux_signal */
 	{ SYF_MPSAFE | 0, (sy_call_t *)linux_geteuid16, AUE_GETEUID },	/* 49 = linux_geteuid16 */
 	{ SYF_MPSAFE | 0, (sy_call_t *)linux_getegid16, AUE_GETEGID },	/* 50 = linux_getegid16 */
 	{ SYF_MPSAFE | AS(acct_args), (sy_call_t *)acct, AUE_ACCT },	/* 51 = acct */
-	{ AS(linux_umount_args), (sy_call_t *)linux_umount, AUE_UMOUNT },	/* 52 = linux_umount */
+	{ SYF_MPSAFE | AS(linux_umount_args), (sy_call_t *)linux_umount, AUE_UMOUNT },	/* 52 = linux_umount */
 	{ 0, (sy_call_t *)nosys, AUE_NULL },			/* 53 = lock */
 	{ AS(linux_ioctl_args), (sy_call_t *)linux_ioctl, AUE_IOCTL },	/* 54 = linux_ioctl */
 	{ SYF_MPSAFE | AS(linux_fcntl_args), (sy_call_t *)linux_fcntl, AUE_FCNTL },	/* 55 = linux_fcntl */
@@ -137,7 +137,7 @@
 	{ SYF_MPSAFE | AS(linux_wait4_args), (sy_call_t *)linux_wait4, AUE_WAIT4 },	/* 114 = linux_wait4 */
 	{ SYF_MPSAFE | 0, (sy_call_t *)linux_swapoff, AUE_SWAPOFF },	/* 115 = linux_swapoff */
 	{ SYF_MPSAFE | AS(linux_sysinfo_args), (sy_call_t *)linux_sysinfo, AUE_NULL },	/* 116 = linux_sysinfo */
-	{ AS(linux_ipc_args), (sy_call_t *)linux_ipc, AUE_NULL },	/* 117 = linux_ipc */
+	{ SYF_MPSAFE | AS(linux_ipc_args), (sy_call_t *)linux_ipc, AUE_NULL },	/* 117 = linux_ipc */
 	{ SYF_MPSAFE | AS(fsync_args), (sy_call_t *)fsync, AUE_FSYNC },	/* 118 = fsync */
 	{ SYF_MPSAFE | AS(linux_sigreturn_args), (sy_call_t *)linux_sigreturn, AUE_SIGRETURN },	/* 119 = linux_sigreturn */
 	{ SYF_MPSAFE | AS(linux_clone_args), (sy_call_t *)linux_clone, AUE_RFORK },	/* 120 = linux_clone */

==== //depot/projects/soc2006/intr_filter/amd64/linux32/syscalls.master#4 (text+ko) ====

@@ -1,4 +1,4 @@
- $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp $
+ $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 ; System call name/number master file (or rather, slave, from LINUX).
@@ -75,10 +75,10 @@
 19	AUE_LSEEK	MSTD	{ int linux_lseek(l_uint fdes, l_off_t off, \
 				    l_int whence); }
 20	AUE_GETPID	MSTD	{ int linux_getpid(void); }
-21	AUE_MOUNT	STD	{ int linux_mount(char *specialfile, \
+21	AUE_MOUNT	MSTD	{ int linux_mount(char *specialfile, \
 				    char *dir, char *filesystemtype, \
 				    l_ulong rwflag, void *data); }
-22	AUE_UMOUNT	STD	{ int linux_oldumount(char *path); }
+22	AUE_UMOUNT	MSTD	{ int linux_oldumount(char *path); }
 23	AUE_SETUID	MSTD	{ int linux_setuid16(l_uid16_t uid); }
 24	AUE_GETUID	MSTD	{ int linux_getuid16(void); }
 25	AUE_SETTIMEOFDAY	MSTD	{ int linux_stime(void); }
@@ -103,7 +103,7 @@
 42	AUE_PIPE	MSTD	{ int linux_pipe(l_ulong *pipefds); }
 43	AUE_NULL	MSTD	{ int linux_times(struct l_times_argv *buf); }
 44	AUE_NULL	UNIMPL	prof
-45	AUE_NULL	STD	{ int linux_brk(l_ulong dsend); }
+45	AUE_NULL	MSTD	{ int linux_brk(l_ulong dsend); }
 46	AUE_SETGID	MSTD	{ int linux_setgid16(l_gid16_t gid); }
 47	AUE_GETGID	MSTD	{ int linux_getgid16(void); }
 48	AUE_NULL	MSTD	{ int linux_signal(l_int sig, \
@@ -111,7 +111,7 @@
 49	AUE_GETEUID	MSTD	{ int linux_geteuid16(void); }
 50	AUE_GETEGID	MSTD	{ int linux_getegid16(void); }
 51	AUE_ACCT	MNOPROTO { int acct(char *path); }
-52	AUE_UMOUNT	STD	{ int linux_umount(char *path, l_int flags); }
+52	AUE_UMOUNT	MSTD	{ int linux_umount(char *path, l_int flags); }
 53	AUE_NULL	UNIMPL	lock
 54	AUE_IOCTL	STD	{ int linux_ioctl(l_uint fd, l_uint cmd, \
 				    uintptr_t arg); }
@@ -212,7 +212,7 @@
 				    struct l_rusage *rusage); }
 115	AUE_SWAPOFF	MSTD	{ int linux_swapoff(void); }
 116	AUE_NULL	MSTD	{ int linux_sysinfo(struct l_sysinfo *info); }
-117	AUE_NULL	STD	{ int linux_ipc(l_uint what, l_int arg1, \
+117	AUE_NULL	MSTD	{ int linux_ipc(l_uint what, l_int arg1, \
 				    l_int arg2, l_int arg3, void *ptr, \
 				    l_long arg5); }
 118	AUE_FSYNC	MNOPROTO	{ int fsync(int fd); }

==== //depot/projects/soc2006/intr_filter/arm/arm/elf_trampoline.c#4 (text+ko) ====

@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/elf_trampoline.c,v 1.8 2006/06/18 22:46:30 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/elf_trampoline.c,v 1.11 2006/06/23 22:45:35 cognet Exp $");
 #include <machine/asm.h>
 #include <sys/types.h>
 #include <sys/elf32.h>
@@ -131,6 +131,8 @@
 	}
 }
 
+static void arm9_setup(void);
+
 void
 _start(void)
 {
@@ -174,7 +176,6 @@
 	__start();
 }
 
-#ifdef KZIP
 static void
 get_cachetype_cp15()
 {
@@ -255,6 +256,7 @@
 }
 
 
+#ifdef KZIP
 static  unsigned char *orig_input, *i_input, *i_output;
 
 
@@ -348,8 +350,8 @@
     int d)
 {
 	Elf32_Ehdr *eh;
-	Elf32_Phdr phdr[512] /* XXX */, *php;
-	Elf32_Shdr shdr[512] /* XXX */;
+	Elf32_Phdr phdr[64] /* XXX */, *php;
+	Elf32_Shdr shdr[64] /* XXX */;
 	int i,j;
 	void *entry_point;
 	int symtabindex = -1;

==== //depot/projects/soc2006/intr_filter/arm/arm/locore.S#2 (text+ko) ====

@@ -37,9 +37,9 @@
 #include <machine/asm.h>
 #include <machine/armreg.h>
 #include <machine/pte.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/locore.S,v 1.13 2005/12/21 15:02:31 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/locore.S,v 1.14 2006/06/21 23:47:25 imp Exp $");
 
-/* What size should this really be ? It is only used by init_arm() */
+/* What size should this really be ? It is only used by initarm() */
 #define INIT_ARM_STACK_SIZE	2048
 
 /*

==== //depot/projects/soc2006/intr_filter/arm/at91/at91_pio.c#4 (text) ====

@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/at91_pio.c,v 1.1 2006/03/24 07:39:29 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/at91_pio.c,v 1.2 2006/07/02 03:50:44 imp Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -38,7 +38,9 @@
 #include <sys/rman.h>
 #include <machine/bus.h>
 
+#include <arm/at91/at91rm92reg.h>
 #include <arm/at91/at91_pioreg.h>
+#include <arm/at91/at91_piovar.h>
 
 struct at91_pio_softc
 {
@@ -103,7 +105,26 @@
 static int
 at91_pio_probe(device_t dev)
 {
-	device_set_desc(dev, "PIO");
+	const char *name;
+
+	switch (device_get_unit(dev)) {
+	case 0:
+		name = "PIOA";
+		break;
+	case 1:
+		name = "PIOB";
+		break;
+	case 2:
+		name = "PIOC";
+		break;
+	case 3:
+		name = "PIOD";
+		break;
+	default:
+		name = "PIO";
+		break;
+	}
+	device_set_desc(dev, name);
 	return (0);
 }
 
@@ -118,6 +139,9 @@
 	if (err)
 		goto out;
 
+	device_printf(dev, "ABSR: %#x OSR: %#x PSR:%#x ODSR: %#x\n",
+	    RD4(sc, PIO_ABSR), RD4(sc, PIO_OSR), RD4(sc, PIO_PSR),
+	    RD4(sc, PIO_ODSR));
 	AT91_PIO_LOCK_INIT(sc);
 
 	/*
@@ -250,6 +274,69 @@
 	return (ENXIO);
 }
 
+/*
+ * The following functions are called early in the boot process, so
+ * don't use bus_space, as that isn't yet available when we need to use
+ * them.
+ */
+void
+at91_pio_use_periph_a(uint32_t pio, uint32_t periph_a_mask)
+{
+	uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+	PIO[PIO_ASR / 4] = periph_a_mask;
+	PIO[PIO_PDR / 4] = periph_a_mask;
+}
+
+void
+at91_pio_use_periph_b(uint32_t pio, uint32_t periph_b_mask)
+{
+	uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+	PIO[PIO_BSR / 4] = periph_b_mask;
+	PIO[PIO_PDR / 4] = periph_b_mask;
+}
+
+void
+at91_pio_use_gpio(uint32_t pio, uint32_t gpio_mask)
+{
+	uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+	PIO[PIO_PER / 4] = gpio_mask;
+}
+
+void
+at91_pio_gpio_input(uint32_t pio, uint32_t input_enable_mask)
+{
+	uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+	PIO[PIO_ODR / 4] = input_enable_mask;
+}
+
+void
+at91_pio_gpio_output(uint32_t pio, uint32_t output_enable_mask)
+{
+	uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+	PIO[PIO_OER / 4] = output_enable_mask;
+}
+
+void
+at91_pio_gpio_set(uint32_t pio, uint32_t data_mask)
+{
+	uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+	PIO[PIO_SODR / 4] = data_mask;
+}
+
+void
+at91_pio_gpio_clear(uint32_t pio, uint32_t data_mask)
+{
+	uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+	PIO[PIO_CODR / 4] = data_mask;
+}
+
 static device_method_t at91_pio_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe,		at91_pio_probe),

==== //depot/projects/soc2006/intr_filter/arm/at91/files.at91#2 (text) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/arm/at91/files.at91,v 1.3 2006/03/24 07:36:23 imp Exp $
+# $FreeBSD: src/sys/arm/at91/files.at91,v 1.5 2006/06/23 23:07:11 cognet Exp $
 arm/arm/cpufunc_asm_arm9.S	standard
 arm/arm/irq_dispatch.S		standard
 arm/at91/at91.c			standard

==== //depot/projects/soc2006/intr_filter/arm/at91/uart_dev_at91usart.c#2 (text) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/uart_dev_at91usart.c,v 1.6 2006/05/13 23:41:16 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/uart_dev_at91usart.c,v 1.7 2006/07/02 03:45:33 imp Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -45,19 +45,29 @@
 
 #include "uart_if.h"
 
+#define DEFAULT_RCLK		AT91C_MASTER_CLOCK
+#define	USART_BUFFER_SIZE	128
+
 /*
  * High-level UART interface.
  */
+struct at91_usart_rx {
+	bus_addr_t	pa;
+	uint8_t		buffer[USART_BUFFER_SIZE];
+	bus_dmamap_t	map;
+};
+
 struct at91_usart_softc {
 	struct uart_softc base;
 	bus_dma_tag_t dmatag;		/* bus dma tag for mbufs */
 	bus_dmamap_t tx_map;
-	bus_dmamap_t rx_map;
+	uint32_t flags;
+#define HAS_TIMEOUT	1	
+	struct at91_usart_rx ping_pong[2];
+	struct at91_usart_rx *ping;
+	struct at91_usart_rx *pong;
 };
 
-#define DEFAULT_RCLK		AT91C_MASTER_CLOCK
-#define	USART_BUFFER_SIZE	128
-
 #define	RD4(bas, reg)		\
 	bus_space_read_4((bas)->bst, (bas)->bsh, uart_regofs(bas, reg))
 #define	WR4(bas, reg, value)	\
@@ -72,6 +82,9 @@
 		}					\
 	} while (0);
 
+#define BAUD2DIVISOR(b) \
+	((((DEFAULT_RCLK * 10) / ((b) * 16)) + 5) / 10)
+
 /*
  * Low-level UART interface.
  */
@@ -147,16 +160,19 @@
 	}
 
 	/*
-	 * Or in the stop bits.  Note: The hardware supports
-	 * 1.5 stop bits in async mode, but there's no way to
-	 * specify that AFAICT.
+	 * Or in the stop bits.  Note: The hardware supports 1.5 stop
+	 * bits in async mode, but there's no way to specify that
+	 * AFAICT.  Instead, rely on the convention documented at
+	 * http://www.lammertbies.nl/comm/info/RS-232_specs.html which
+	 * states that 1.5 stop bits are used for 5 bit bytes and
+	 * 2 stop bits only for longer bytes.
 	 */
-	if (stopbits > 1)
+	if (stopbits == 1)
+		mr |= USART_MR_NBSTOP_1;
+	else if (databits > 5)
 		mr |= USART_MR_NBSTOP_2;
 	else
-		mr |= USART_MR_NBSTOP_2;
-	/* else if (stopbits == 1.5)
-		mr |= USART_MR_NBSTOP_1_5; */
+		mr |= USART_MR_NBSTOP_1_5;
 
 	/*
 	 * We want normal plumbing mode too, none of this fancy
@@ -167,6 +183,13 @@
 	mr &= ~USART_MR_MSBF;	/* lsb first */
 	mr &= ~USART_MR_CKLO_SCK;	/* Don't drive SCK */
 
+	WR4(bas, USART_MR, mr);
+
+	/*
+	 * Set the baud rate
+	 */
+	WR4(bas, USART_BRGR, BAUD2DIVISOR(baudrate));
+
 	/* XXX Need to take possible synchronous mode into account */
 	return (0);
 }
@@ -188,25 +211,19 @@
 }
 
 /*
- * Initialize this device (I think as the console)
+ * Initialize this device for use as a console.
  */
 static void
 at91_usart_init(struct uart_bas *bas, int baudrate, int databits, int stopbits,
     int parity)
 {
-	int cr;
 
 	at91_usart_param(bas, baudrate, databits, stopbits, parity);
 
-	/* Turn on rx and tx */
-	cr = USART_CR_RSTSTA | USART_CR_RSTRX | USART_CR_RSTTX;
-	WR4(bas, USART_CR, cr);
+	/* Reset the rx and tx buffers and turn on rx and tx */
+	WR4(bas, USART_CR, USART_CR_RSTSTA | USART_CR_RSTRX | USART_CR_RSTTX);
 	WR4(bas, USART_CR, USART_CR_RXEN | USART_CR_TXEN);
-	WR4(bas, USART_IER, USART_CSR_TIMEOUT |
-	    USART_CSR_TXRDY | USART_CSR_RXRDY |
-	    USART_CSR_RXBRK | USART_CSR_ENDRX | USART_CSR_ENDTX);
-	/* Set the receive timeout to be 1.5 character times. */
-	WR4(bas, USART_RTOR, 12);
+	WR4(bas, USART_IDR, 0xffffffff);
 }
 
 /*
@@ -227,8 +244,8 @@
 at91_usart_putc(struct uart_bas *bas, int c)
 {
 
-	while (!(RD4(bas, USART_CSR) & 
-	    USART_CSR_TXRDY));
+    while (!(RD4(bas, USART_CSR) & USART_CSR_TXRDY))
+		continue;
 	WR4(bas, USART_THR, c);
 }
 
@@ -252,8 +269,8 @@
 {
 	int c;
 
-	while (!(RD4(bas, USART_CSR) & USART_CSR_RXRDY)) 
-		;
+	while (!(RD4(bas, USART_CSR) & USART_CSR_RXRDY))
+		continue;
 	c = RD4(bas, USART_RHR);
 	c &= 0xff;
 	return (c);
@@ -291,14 +308,35 @@
 	return (0);
 }
 
+#ifndef SKYEYE_WORKAROUNDS
+static void
+at91_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
+{
+	if (error != 0)
+		return;
+	*(bus_addr_t *)arg = segs[0].ds_addr;
+}
+#endif
+
 static int
 at91_usart_bus_attach(struct uart_softc *sc)
 {
-	int err;
+	int err, i;
+	uint32_t cr;
 	struct at91_usart_softc *atsc;
 
 	atsc = (struct at91_usart_softc *)sc;
 
+	/*
+	 * See if we have a TIMEOUT bit.  We disable all interrupts to
+	 * minimize interference.
+	 */
+	WR4(&sc->sc_bas, USART_IDR, 0xffffffff);
+	WR4(&sc->sc_bas, USART_IER, USART_CSR_TIMEOUT);
+	if (RD4(&sc->sc_bas, USART_IMR) & USART_CSR_TIMEOUT)
+		atsc->flags |= HAS_TIMEOUT;
+	WR4(&sc->sc_bas, USART_IDR, 0xffffffff);
+
 	sc->sc_txfifosz = USART_BUFFER_SIZE;
 	sc->sc_rxfifosz = USART_BUFFER_SIZE;
 	sc->sc_hwiflow = 0;
@@ -314,25 +352,62 @@
 	err = bus_dmamap_create(atsc->dmatag, 0, &atsc->tx_map);
 	if (err != 0)
 	    goto errout;
-	err = bus_dmamap_create(atsc->dmatag, 0, &atsc->rx_map);
-	if (err != 0)
-	    goto errout;
+	if (atsc->flags & HAS_TIMEOUT) {
+		for (i = 0; i < 2; i++) {
+			err = bus_dmamap_create(atsc->dmatag, 0,
+			    &atsc->ping_pong[i].map);
+			if (err != 0)
+				goto errout;
+			err = bus_dmamap_load(atsc->dmatag,
+			    atsc->ping_pong[i].map,
+			    atsc->ping_pong[i].buffer, sc->sc_rxfifosz,

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


More information about the p4-projects mailing list