PERFORCE change 100534 for review

Peter Wemm peter at FreeBSD.org
Tue Jul 4 01:07:54 UTC 2006


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

Change 100534 by peter at peter_daintree on 2006/07/04 01:07:41

	IFC @100533

Affected files ...

.. //depot/projects/bike_sched/sys/amd64/amd64/pmap.c#3 integrate
.. //depot/projects/bike_sched/sys/arm/at91/at91_pio.c#2 integrate
.. //depot/projects/bike_sched/sys/arm/at91/at91_pio_rm9200.h#1 branch
.. //depot/projects/bike_sched/sys/arm/at91/at91_piovar.h#1 branch
.. //depot/projects/bike_sched/sys/arm/at91/uart_dev_at91usart.c#2 integrate
.. //depot/projects/bike_sched/sys/bsm/audit_kevents.h#2 integrate
.. //depot/projects/bike_sched/sys/bsm/audit_record.h#3 integrate
.. //depot/projects/bike_sched/sys/compat/svr4/Makefile#2 integrate
.. //depot/projects/bike_sched/sys/conf/kmod.mk#2 integrate
.. //depot/projects/bike_sched/sys/dev/atkbdc/atkbdc_isa.c#3 integrate
.. //depot/projects/bike_sched/sys/dev/bktr/CHANGELOG.TXT#2 integrate
.. //depot/projects/bike_sched/sys/dev/isp/isp.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/isp/isp_pci.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/isp/ispmbox.h#2 integrate
.. //depot/projects/bike_sched/sys/dev/isp/ispreg.h#2 integrate
.. //depot/projects/bike_sched/sys/dev/isp/ispvar.h#2 integrate
.. //depot/projects/bike_sched/sys/dev/ispfw/asm_2322.h#1 branch
.. //depot/projects/bike_sched/sys/dev/ispfw/ispfw.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/acphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/amphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/bmtphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/brgphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/ciphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/e1000phy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/exphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/inphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/lxtphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/mii_physubr.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/mlphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/nsgphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/nsphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/pnaphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/qsphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/rgephy.c#3 integrate
.. //depot/projects/bike_sched/sys/dev/mii/rlphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/ruephy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/tdkphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/tlphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/ukphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/mii/xmphy.c#2 integrate
.. //depot/projects/bike_sched/sys/dev/usb/if_ural.c#2 integrate
.. //depot/projects/bike_sched/sys/geom/mirror/g_mirror.c#2 integrate
.. //depot/projects/bike_sched/sys/geom/raid3/g_raid3.c#2 integrate
.. //depot/projects/bike_sched/sys/i386/i386/pmap.c#3 integrate
.. //depot/projects/bike_sched/sys/kern/sched_4bsd.c#7 integrate
.. //depot/projects/bike_sched/sys/modules/bktr/bktr_mem/Makefile#2 integrate
.. //depot/projects/bike_sched/sys/modules/streams/Makefile#2 integrate
.. //depot/projects/bike_sched/sys/modules/svr4/Makefile#2 integrate
.. //depot/projects/bike_sched/sys/net/bpf.c#3 integrate
.. //depot/projects/bike_sched/sys/powerpc/powerpc/mmu_oea.c#3 integrate
.. //depot/projects/bike_sched/sys/security/audit/audit.h#2 integrate
.. //depot/projects/bike_sched/sys/security/audit/audit_arg.c#3 integrate

Differences ...

==== //depot/projects/bike_sched/sys/amd64/amd64/pmap.c#3 (text+ko) ====

@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.560 2006/06/27 04:28:22 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
@@ -2796,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;
@@ -2982,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;
 
@@ -3052,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);
@@ -3090,7 +3073,6 @@
 			PMAP_UNLOCK(pmap);
 		} while ((pv = pvn) != NULL && pv != pvf);
 	}
-
 	return (rtval);
 }
 
@@ -3125,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;
 
@@ -3151,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;
 
@@ -3173,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/bike_sched/sys/arm/at91/at91_pio.c#2 (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/bike_sched/sys/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,
+			    at91_getaddr, &atsc->ping_pong[i].pa, 0);
+			if (err != 0)
+				goto errout;
+			bus_dmamap_sync(atsc->dmatag, atsc->ping_pong[i].map,
+			    BUS_DMASYNC_PREREAD);
+		}
+		atsc->ping = &atsc->ping_pong[0];
+		atsc->pong = &atsc->ping_pong[1];
+	}
+
+	/*
+	 * Prime the pump with the RX buffer.  We use two 64 byte bounce
+	 * buffers here to avoid data overflow.
+	 */
+
+	/* Turn on rx and tx */
+	cr = USART_CR_RSTSTA | USART_CR_RSTRX | USART_CR_RSTTX;
+	WR4(&sc->sc_bas, USART_CR, cr);
+	WR4(&sc->sc_bas, USART_CR, USART_CR_RXEN | USART_CR_TXEN);
+
+	/*
+	 * Setup the PDC to receive data.  We use the ping-pong buffers
+	 * so that we can more easily bounce between the two and so that
+	 * we get an interrupt 1/2 way through the software 'fifo' we have
+	 * to avoid overruns.
+	 */
+	if (atsc->flags & HAS_TIMEOUT) {
+		WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa);
+		WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz);
+		WR4(&sc->sc_bas, PDC_RNPR, atsc->pong->pa);
+		WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz);
+		WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN);
+
+		/* Set the receive timeout to be 1.5 character times. */
+		WR4(&sc->sc_bas, USART_RTOR, 12);
+		WR4(&sc->sc_bas, USART_CR, USART_CR_STTTO);
+		WR4(&sc->sc_bas, USART_IER, USART_CSR_TIMEOUT |
+		    USART_CSR_RXBUFF | USART_CSR_ENDRX);
+	} else {
+		WR4(&sc->sc_bas, USART_IER, USART_CSR_RXRDY);
+	}
+	WR4(&sc->sc_bas, USART_IER, USART_CSR_RXBRK);
 errout:;
 	// XXX bad
 	return (err);
 }
 
-#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_transmit(struct uart_softc *sc)
 {
@@ -359,6 +434,7 @@
 	WR4(&sc->sc_bas, PDC_TPR, addr);
 	WR4(&sc->sc_bas, PDC_TCR, sc->sc_txdatasz);
 	WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_TXTEN);
+	WR4(&sc->sc_bas, USART_IER, USART_CSR_ENDTX);
 	uart_unlock(sc->sc_hwmtx);
 #else
 	for (int i = 0; i < sc->sc_txdatasz; i++)
@@ -387,9 +463,7 @@
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	bas = &sc->sc_bas;
 	uart_lock(sc->sc_hwmtx);
-	cr = RD4(bas, USART_CR);
-	cr &= ~(USART_CR_DTREN | USART_CR_DTRDIS | USART_CR_RTSEN |
-	    USART_CR_RTSDIS);
+	cr = 0;
 	if (new & SER_DTR)
 		cr |= USART_CR_DTREN;
 	else
@@ -405,16 +479,14 @@
 static int
 at91_usart_bus_receive(struct uart_softc *sc)
 {
-	
-	uart_lock(sc->sc_hwmtx);
-	uart_rx_put(sc, at91_usart_getc(&sc->sc_bas, NULL));
-	uart_unlock(sc->sc_hwmtx);
+
 	return (0);
 }
 static int
 at91_usart_bus_param(struct uart_softc *sc, int baudrate, int databits,
     int stopbits, int parity)
 {
+
 	return (at91_usart_param(&sc->sc_bas, baudrate, databits, stopbits,
 	    parity));
 }
@@ -422,8 +494,9 @@
 at91_usart_bus_ipend(struct uart_softc *sc)
 {
 	int csr = RD4(&sc->sc_bas, USART_CSR);
-	int ipend = 0;
+	int ipend = 0, i, len;
 	struct at91_usart_softc *atsc;
+	struct at91_usart_rx *p;
 
 	atsc = (struct at91_usart_softc *)sc;	   
 	if (csr & USART_CSR_ENDTX) {
@@ -432,12 +505,85 @@
 		bus_dmamap_unload(atsc->dmatag, atsc->tx_map);
 	}
 	uart_lock(sc->sc_hwmtx);
-	if (csr & USART_CSR_TXRDY && sc->sc_txbusy)
-		ipend |= SER_INT_TXIDLE;
-	if (csr & USART_CSR_ENDTX && sc->sc_txbusy)
-		ipend |= SER_INT_TXIDLE;
-	if (csr & (USART_CSR_RXRDY /* | USART_CSR_ENDRX | USART_CSR_TIMEOUT */))
+	if (csr & USART_CSR_TXRDY) {
+		if (sc->sc_txbusy)
+			ipend |= SER_INT_TXIDLE;
+		WR4(&sc->sc_bas, USART_IDR, USART_CSR_TXRDY);
+	}
+	if (csr & USART_CSR_ENDTX) {
+		if (sc->sc_txbusy)
+			ipend |= SER_INT_TXIDLE;
+		WR4(&sc->sc_bas, USART_IDR, USART_CSR_ENDTX);
+	}
+
+	/*
+	 * Due to the contraints of the DMA engine present in the
+	 * atmel chip, I can't just say I have a rx interrupt pending
+	 * and do all the work elsewhere.  I need to look at the CSR
+	 * bits right now and do things based on them to avoid races.
+	 */
+	if ((atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_RXBUFF)) {
+		// Have a buffer overflow.  Copy all data from both
+		// ping and pong.  Insert overflow character.  Reset
+		// ping and pong and re-enable the PDC to receive
+		// characters again.
+		bus_dmamap_sync(atsc->dmatag, atsc->ping->map,
+		    BUS_DMASYNC_POSTREAD);
+		bus_dmamap_sync(atsc->dmatag, atsc->pong->map,
+		    BUS_DMASYNC_POSTREAD);
+		for (i = 0; i < sc->sc_rxfifosz; i++)
+			uart_rx_put(sc, atsc->ping->buffer[i]);
+		for (i = 0; i < sc->sc_rxfifosz; i++)
+			uart_rx_put(sc, atsc->pong->buffer[i]);
+		uart_rx_put(sc, UART_STAT_OVERRUN);
+		csr &= ~(USART_CSR_ENDRX | USART_CSR_TIMEOUT);
+		WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa);
+		WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz);
+		WR4(&sc->sc_bas, PDC_RNPR, atsc->pong->pa);
+		WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz);
+		WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN);
+		ipend |= SER_INT_RXREADY;
+	}
+	if ((atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_ENDRX)) {
+		// Shuffle data from 'ping' of ping pong buffer, but
+		// leave current 'pong' in place, as it has become the
+		// new 'ping'.  We need to copy data and setup the old
+		// 'ping' as the new 'pong' when we're done.
+		bus_dmamap_sync(atsc->dmatag, atsc->ping->map,
+		    BUS_DMASYNC_POSTREAD);
+		for (i = 0; i < sc->sc_rxfifosz; i++)
+			uart_rx_put(sc, atsc->ping->buffer[i]);
+		p = atsc->ping;
+		atsc->ping = atsc->pong;
+		atsc->pong = p;
+		WR4(&sc->sc_bas, PDC_RNPR, atsc->pong->pa);
+		WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz);
+		ipend |= SER_INT_RXREADY;
+	}
+	if ((atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_TIMEOUT)) {
+		// We have one partial buffer.  We need to stop the
+		// PDC, get the number of characters left and from
+		// that compute number of valid characters.  We then
+		// need to reset ping and pong and reenable the PDC.
+		// Not sure if there's a race here at fast baud rates
+		// we need to worry about.
+		WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTDIS);
+		len = sc->sc_rxfifosz - RD4(&sc->sc_bas, PDC_RCR);
+		for (i = 0; i < len; i++)
+			uart_rx_put(sc, atsc->ping->buffer[i]);
+		WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa);
+		WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz);
+		WR4(&sc->sc_bas, USART_CR, USART_CR_STTTO);
+		WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN);
+		ipend |= SER_INT_RXREADY;
+	}
+	if (!(atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_RXRDY)) {
+		// We have another charater in a device that doesn't support
+		// timeouts, so we do it one character at a time.
+		uart_rx_put(sc, RD4(&sc->sc_bas, USART_RHR) & 0xff);
 		ipend |= SER_INT_RXREADY;
+	}
+
 	if (csr & USART_CSR_RXBRK) {
 		unsigned int cr = USART_CR_RSTSTA;
 
@@ -479,6 +625,15 @@
 static int
 at91_usart_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
 {
+	switch (request) {
+	case UART_IOCTL_BREAK:
+	case UART_IOCTL_IFLOW:
+	case UART_IOCTL_OFLOW:
+		break;
+	case UART_IOCTL_BAUD:
+		WR4(&sc->sc_bas, USART_BRGR, BAUD2DIVISOR(*(int *)data));
+		return (0);
+	}
 	return (EINVAL);
 }
 struct uart_class at91_usart_class = {

==== //depot/projects/bike_sched/sys/bsm/audit_kevents.h#2 (text) ====

@@ -30,8 +30,8 @@
  *
  * @APPLE_BSD_LICENSE_HEADER_END@
  *
- * $P4: //depot/projects/trustedbsd/audit3/sys/bsm/audit_kevents.h#20 $
- * $FreeBSD: src/sys/bsm/audit_kevents.h,v 1.5 2006/02/06 01:12:46 rwatson Exp $
+ * $P4: //depot/projects/trustedbsd/audit3/sys/bsm/audit_kevents.h#23 $
+ * $FreeBSD: src/sys/bsm/audit_kevents.h,v 1.6 2006/07/03 14:45:43 rwatson Exp $
  */
 
 #ifndef _BSM_AUDIT_KEVENTS_H_
@@ -384,7 +384,24 @@
 #define	AUE_ACL_DELETE_FD		403	/* FreeBSD. */
 #define	AUE_ACL_CHECK_FILE		404	/* FreeBSD. */
 #define	AUE_ACL_CHECK_FD		405	/* FreeBSD. */
-#define	AUE_SYSARCH			406	/* FreeBSD. */
+#define	AUE_ACL_GET_LINK		406	/* FreeBSD. */
+#define	AUE_ACL_SET_LINK		407	/* FreeBSD. */
+#define	AUE_ACL_DELETE_LINK		408	/* FreeBSD. */
+#define	AUE_ACL_CHECK_LINK		409	/* FreeBSD. */
+#define	AUE_SYSARCH			410	/* FreeBSD. */
+#define	AUE_EXTATTRCTL			411	/* FreeBSD. */
+#define	AUE_EXTATTR_GET_FILE		412	/* FreeBSD. */
+#define	AUE_EXTATTR_SET_FILE		413	/* FreeBSD. */
+#define	AUE_EXTATTR_LIST_FILE		414	/* FreeBSD. */
+#define	AUE_EXTATTR_DELETE_FILE		415	/* FreeBSD. */
+#define	AUE_EXTATTR_GET_FD		416	/* FreeBSD. */
+#define	AUE_EXTATTR_SET_FD		417	/* FreeBSD. */
+#define	AUE_EXTATTR_LIST_FD		418	/* FreeBSD. */
+#define	AUE_EXTATTR_DELETE_FD		419	/* FreeBSD. */
+#define	AUE_EXTATTR_GET_LINK		420	/* FreeBSD. */
+#define	AUE_EXTATTR_SET_LINK		421	/* FreeBSD. */
+#define	AUE_EXTATTR_LIST_LINK		422	/* FreeBSD. */
+#define	AUE_EXTATTR_DELETE_LINK		423	/* FreeBSD. */
 
 /*
  * Darwin BSM uses a number of AUE_O_* definitions, which are aliased to the

==== //depot/projects/bike_sched/sys/bsm/audit_record.h#3 (text) ====

@@ -31,12 +31,14 @@
  * @APPLE_BSD_LICENSE_HEADER_END@
  *
  * $P4: //depot/projects/trustedbsd/audit3/sys/bsm/audit_record.h#13 $
- * $FreeBSD: src/sys/bsm/audit_record.h,v 1.2 2006/06/05 13:00:52 rwatson Exp $
+ * $FreeBSD: src/sys/bsm/audit_record.h,v 1.3 2006/07/03 14:44:13 rwatson Exp $
  */
 
 #ifndef _BSM_AUDIT_RECORD_H_
 #define _BSM_AUDIT_RECORD_H_
 
+#include <sys/time.h>			/* struct timeval */
+
 /*
  * Token type identifiers.
  */

==== //depot/projects/bike_sched/sys/compat/svr4/Makefile#2 (text+ko) ====

@@ -1,8 +1,6 @@
 # Makefile for syscall tables
 #
-# $FreeBSD: src/sys/compat/svr4/Makefile,v 1.7 2001/09/13 22:02:48 julian Exp $
-
-MAINTAINER=	newton at freebsd.org
+# $FreeBSD: src/sys/compat/svr4/Makefile,v 1.8 2006/07/01 10:51:54 markm Exp $
 
 all:
 	@echo "make sysent only"

==== //depot/projects/bike_sched/sys/conf/kmod.mk#2 (text+ko) ====

@@ -1,5 +1,5 @@
 #	From: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
-# $FreeBSD: src/sys/conf/kmod.mk,v 1.208 2006/05/27 16:32:05 netchild Exp $
+# $FreeBSD: src/sys/conf/kmod.mk,v 1.209 2006/06/30 19:35:35 jkim Exp $
 #
 # The include file <bsd.kmod.mk> handles building and installing loadable
 # kernel modules.
@@ -85,8 +85,10 @@
 .if ${CC} == "icc"
 NOSTDINC=	-X
 .else
+C_DIALECT=	-std=c99
 NOSTDINC=	-nostdinc
 .endif
+CFLAGS+=	${C_DIALECT}
 CFLAGS:=	${CFLAGS:N-I*} ${NOSTDINC} -I- ${INCLMAGIC} ${CFLAGS:M-I*}
 .if defined(KERNBUILDDIR)
 CFLAGS+=	-DHAVE_KERNEL_OPTION_HEADERS -include ${KERNBUILDDIR}/opt_global.h

==== //depot/projects/bike_sched/sys/dev/atkbdc/atkbdc_isa.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/atkbdc/atkbdc_isa.c,v 1.35 2006/06/12 14:46:44 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/atkbdc/atkbdc_isa.c,v 1.36 2006/07/03 23:40:58 jkim Exp $");
 
 #include "opt_kbd.h"
 
@@ -112,15 +112,21 @@
 	 * The AT keyboard controller uses two ports (a command/data port
 	 * 0x60 and a status port 0x64), which may be given to us in 
 	 * one resource (0x60 through 0x64) or as two separate resources
-	 * (0x60 and 0x64). Furthermore, /boot/device.hints may contain
-	 * just one port, 0x60. We shall adjust resource settings 
-	 * so that these two ports are available as two separate resources.
+	 * (0x60 and 0x64). Some brain-damaged ACPI BIOS has reversed
+	 * command/data port and status port. Furthermore, /boot/device.hints
+	 * may contain just one port, 0x60. We shall adjust resource settings
+	 * so that these two ports are available as two separate resources
+	 * in correct order.
 	 */
 	device_quiet(dev);
 	rid = 0;
 	if (bus_get_resource(dev, SYS_RES_IOPORT, rid, &start, &count) != 0)
 		return ENXIO;
-	if (count > 1)	/* adjust the count */
+	if (start == IO_KBD + KBD_STATUS_PORT) {
+		start = IO_KBD;
+		count++;
+	}
+	if (count > 1)	/* adjust the count and/or start port */
 		bus_set_resource(dev, SYS_RES_IOPORT, rid, start, 1);
 	port0 = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
 	if (port0 == NULL)

==== //depot/projects/bike_sched/sys/dev/bktr/CHANGELOG.TXT#2 (text+ko) ====

@@ -1,9 +1,4 @@
-/* $FreeBSD: src/sys/dev/bktr/CHANGELOG.TXT,v 1.20 2004/12/31 09:18:29 julian Exp $ */
-/*
- * MAINTAINER = Roger Hardiman <roger at freebsd.org>
- * Newsflash: Roger is temorararily out of touch and unable 
- * to maintain this..
- */
+/* $FreeBSD: src/sys/dev/bktr/CHANGELOG.TXT,v 1.21 2006/07/01 10:51:54 markm Exp $ */
 
 /*
  * This is part of the Driver for Video Capture Cards (Frame grabbers)

==== //depot/projects/bike_sched/sys/dev/isp/isp.c#2 (text+ko) ====

@@ -34,7 +34,7 @@
  */
 #ifdef	__FreeBSD__
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp.c,v 1.119 2006/04/21 18:46:35 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp.c,v 1.121 2006/07/03 20:56:48 mjacob Exp $");
 #endif
 
 /*
@@ -100,7 +100,7 @@
 static const char swrej[] =
     "Fabric Nameserver rejected %s (Reason=0x%x Expl=0x%x) for Port ID 0x%x";
 static const char finmsg[] =
-    "(%d.%d.%d): FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x";
+    "%d.%d.%d: FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x";
 static const char sc0[] =
     "%s CHAN %d FTHRSH %d IID %d RESETD %d RETRYC %d RETRYD %d ASD 0x%x";
 static const char sc1[] =
@@ -129,7 +129,7 @@
 static int isp_getpdb(ispsoftc_t *, int, isp_pdb_t *);
 static uint64_t isp_get_portname(ispsoftc_t *, int, int);
 static int isp_fclink_test(ispsoftc_t *, int);
-static char *isp2100_fw_statename(int);
+static const char *isp2100_fw_statename(int);
 static int isp_pdb_sync(ispsoftc_t *);
 static int isp_scan_loop(ispsoftc_t *);
 static int isp_fabric_mbox_cmd(ispsoftc_t *, mbreg_t *);
@@ -639,18 +639,20 @@
 		dodnld = 0;
 	}
 
-	if (IS_23XX(isp))
+	if (IS_23XX(isp)) {
 		code_org = ISP_CODE_ORG_2300;
-	else
+	} else {
 		code_org = ISP_CODE_ORG;
+	}
+	if (dodnld) {
+		uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
 
-	if (dodnld) {
-		isp->isp_mbxworkp = (void *) &isp->isp_mdvec->dv_ispfw[1];
-		isp->isp_mbxwrk0 = isp->isp_mdvec->dv_ispfw[3] - 1;
+		isp->isp_mbxworkp = &ptr[1];
+		isp->isp_mbxwrk0 = ptr[3] - 1;
 		isp->isp_mbxwrk1 = code_org + 1;
 		mbs.param[0] = MBOX_WRITE_RAM_WORD;
 		mbs.param[1] = code_org;
-		mbs.param[2] = isp->isp_mdvec->dv_ispfw[0];
+		mbs.param[2] = ptr[0];
 		isp_mboxcmd(isp, &mbs, MBLOGNONE);
 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
 			isp_prt(isp, ISP_LOGERR,
@@ -659,6 +661,7 @@
 			dodnld = 0;
 			goto again;
 		}

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


More information about the p4-projects mailing list