From owner-p4-projects@FreeBSD.ORG Mon Apr 10 17:08:57 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C223816A405; Mon, 10 Apr 2006 17:08:57 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2FD9B16A401 for ; Mon, 10 Apr 2006 17:08:57 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5161843D48 for ; Mon, 10 Apr 2006 17:08:56 +0000 (GMT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id k3AH8uSY074941 for ; Mon, 10 Apr 2006 17:08:56 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id k3AH8t0x074938 for perforce@freebsd.org; Mon, 10 Apr 2006 17:08:55 GMT (envelope-from marcel@freebsd.org) Date: Mon, 10 Apr 2006 17:08:55 GMT Message-Id: <200604101708.k3AH8t0x074938@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Cc: Subject: PERFORCE change 94921 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Apr 2006 17:08:58 -0000 http://perforce.freebsd.org/chv.cgi?CH=94921 Change 94921 by marcel@marcel_nfs on 2006/04/10 17:07:55 IFC @94915 Affected files ... .. //depot/projects/uart/amd64/amd64/io_apic.c#8 integrate .. //depot/projects/uart/amd64/amd64/pmap.c#30 integrate .. //depot/projects/uart/arm/arm/cpufunc.c#6 integrate .. //depot/projects/uart/arm/arm/swtch.S#8 integrate .. //depot/projects/uart/arm/arm/trap.c#12 integrate .. //depot/projects/uart/arm/arm/undefined.c#11 integrate .. //depot/projects/uart/arm/at91/at91.c#3 integrate .. //depot/projects/uart/arm/at91/at91_twi.c#2 integrate .. //depot/projects/uart/arm/at91/at91_usartreg.h#2 integrate .. //depot/projects/uart/arm/at91/if_ate.c#3 integrate .. //depot/projects/uart/arm/at91/uart_dev_at91usart.c#4 integrate .. //depot/projects/uart/arm/include/pmap.h#9 integrate .. //depot/projects/uart/arm/sa11x0/uart_dev_sa1110.c#3 integrate .. //depot/projects/uart/arm/xscale/i80321/i80321_timer.c#7 integrate .. //depot/projects/uart/conf/options.arm#6 integrate .. //depot/projects/uart/dev/aac/aac.c#17 integrate .. //depot/projects/uart/dev/acpi_support/acpi_asus.c#8 integrate .. //depot/projects/uart/dev/amr/amr.c#14 integrate .. //depot/projects/uart/dev/amr/amr_pci.c#14 integrate .. //depot/projects/uart/dev/amr/amrvar.h#10 integrate .. //depot/projects/uart/dev/bfe/if_bfe.c#10 integrate .. //depot/projects/uart/dev/drm/drm-preprocess.sh#2 integrate .. //depot/projects/uart/dev/drm/drm.h#7 integrate .. //depot/projects/uart/dev/drm/drm_agpsupport.c#5 integrate .. //depot/projects/uart/dev/drm/drm_pciids.h#5 integrate .. //depot/projects/uart/dev/drm/i915_dma.c#3 integrate .. //depot/projects/uart/dev/drm/i915_drm.h#3 integrate .. //depot/projects/uart/dev/drm/i915_drv.h#3 integrate .. //depot/projects/uart/dev/drm/i915_irq.c#3 integrate .. //depot/projects/uart/dev/drm/i915_mem.c#3 integrate .. //depot/projects/uart/dev/drm/mga_drv.h#7 integrate .. //depot/projects/uart/dev/drm/r300_cmdbuf.c#3 integrate .. //depot/projects/uart/dev/drm/r300_reg.h#3 integrate .. //depot/projects/uart/dev/drm/radeon_cp.c#9 integrate .. //depot/projects/uart/dev/drm/radeon_drm.h#9 integrate .. //depot/projects/uart/dev/drm/radeon_drv.h#9 integrate .. //depot/projects/uart/dev/drm/radeon_state.c#10 integrate .. //depot/projects/uart/dev/drm/savage_bci.c#3 integrate .. //depot/projects/uart/dev/drm/savage_state.c#3 integrate .. //depot/projects/uart/dev/drm/sis_ds.c#5 integrate .. //depot/projects/uart/dev/drm/sis_ds.h#6 integrate .. //depot/projects/uart/dev/drm/sis_mm.c#6 integrate .. //depot/projects/uart/dev/em/LICENSE#3 integrate .. //depot/projects/uart/dev/em/README#6 integrate .. //depot/projects/uart/dev/em/if_em.c#21 integrate .. //depot/projects/uart/dev/em/if_em_hw.c#7 integrate .. //depot/projects/uart/dev/em/if_em_hw.h#6 integrate .. //depot/projects/uart/dev/iicbus/if_ic.c#5 integrate .. //depot/projects/uart/dev/iicbus/iic.c#5 integrate .. //depot/projects/uart/dev/iicbus/iicbb.c#3 integrate .. //depot/projects/uart/dev/iicbus/iicsmb.c#3 integrate .. //depot/projects/uart/dev/mfi/mfi.c#3 integrate .. //depot/projects/uart/dev/usb/usbdevs#20 integrate .. //depot/projects/uart/dev/usb/uscanner.c#12 integrate .. //depot/projects/uart/geom/eli/g_eli.c#5 integrate .. //depot/projects/uart/geom/geom.h#10 integrate .. //depot/projects/uart/geom/geom_bsd.c#7 integrate .. //depot/projects/uart/geom/geom_ccd.c#6 integrate .. //depot/projects/uart/geom/geom_ctl.c#9 integrate .. //depot/projects/uart/geom/geom_disk.c#11 integrate .. //depot/projects/uart/geom/geom_gpt.c#6 integrate .. //depot/projects/uart/geom/geom_slice.c#6 integrate .. //depot/projects/uart/geom/geom_subr.c#8 integrate .. //depot/projects/uart/geom/mirror/g_mirror.c#14 integrate .. //depot/projects/uart/geom/mirror/g_mirror.h#8 integrate .. //depot/projects/uart/geom/mirror/g_mirror_ctl.c#8 integrate .. //depot/projects/uart/geom/raid3/g_raid3.c#15 integrate .. //depot/projects/uart/geom/raid3/g_raid3.h#8 integrate .. //depot/projects/uart/geom/raid3/g_raid3_ctl.c#8 integrate .. //depot/projects/uart/i386/i386/io_apic.c#9 integrate .. //depot/projects/uart/i386/i386/machdep.c#21 integrate .. //depot/projects/uart/i386/isa/npx.c#10 integrate .. //depot/projects/uart/kern/kern_event.c#11 integrate .. //depot/projects/uart/kern/kern_exit.c#15 integrate .. //depot/projects/uart/kern/kern_shutdown.c#9 integrate .. //depot/projects/uart/kern/subr_witness.c#15 integrate .. //depot/projects/uart/kern/uipc_proto.c#4 integrate .. //depot/projects/uart/net/if_media.h#9 integrate .. //depot/projects/uart/net/raw_usrreq.c#7 integrate .. //depot/projects/uart/netgraph/ng_socket.c#10 integrate .. //depot/projects/uart/netinet/tcp_input.c#22 integrate .. //depot/projects/uart/netinet/tcp_sack.c#8 integrate .. //depot/projects/uart/netinet6/ip6_mroute.c#8 integrate .. //depot/projects/uart/netinet6/udp6_usrreq.c#10 integrate .. //depot/projects/uart/netipsec/ipsec.c#11 integrate .. //depot/projects/uart/netipsec/ipsec.h#7 integrate .. //depot/projects/uart/netipsec/xform_ah.c#7 integrate .. //depot/projects/uart/netipsec/xform_esp.c#8 integrate .. //depot/projects/uart/netnatm/natm.c#10 integrate .. //depot/projects/uart/nfsclient/nfs_bio.c#12 integrate .. //depot/projects/uart/nfsclient/nfs_vnops.c#15 integrate .. //depot/projects/uart/nfsclient/nfsnode.h#7 integrate .. //depot/projects/uart/nfsserver/nfs_srvsock.c#9 integrate .. //depot/projects/uart/posix4/ksched.c#4 integrate .. //depot/projects/uart/posix4/p1003_1b.c#4 integrate .. //depot/projects/uart/powerpc/conf/GENERIC#9 integrate .. //depot/projects/uart/security/mac/mac_vfs.c#6 integrate .. //depot/projects/uart/sparc64/sparc64/trap.c#12 integrate .. //depot/projects/uart/sys/filedesc.h#9 integrate .. //depot/projects/uart/sys/mac.h#11 integrate .. //depot/projects/uart/sys/mac_policy.h#9 integrate .. //depot/projects/uart/vm/swap_pager.c#22 integrate .. //depot/projects/uart/vm/swap_pager.h#8 integrate Differences ... ==== //depot/projects/uart/amd64/amd64/io_apic.c#8 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.23 2006/03/20 19:39:07 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.24 2006/04/05 20:43:19 jhb Exp $"); #include "opt_atpic.h" #include "opt_isa.h" @@ -89,6 +89,7 @@ u_int io_edgetrigger:1; u_int io_masked:1; int io_bus:4; + uint32_t io_lowreg; }; struct ioapic { @@ -207,9 +208,7 @@ mtx_lock_spin(&icu_lock); if (intpin->io_masked) { - flags = ioapic_read(io->io_addr, - IOAPIC_REDTBL_LO(intpin->io_intpin)); - flags &= ~(IOART_INTMASK); + flags = intpin->io_lowreg & ~IOART_INTMASK; ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), flags); intpin->io_masked = 0; @@ -226,9 +225,7 @@ mtx_lock_spin(&icu_lock); if (!intpin->io_masked && !intpin->io_edgetrigger) { - flags = ioapic_read(io->io_addr, - IOAPIC_REDTBL_LO(intpin->io_intpin)); - flags |= IOART_INTMSET; + flags = intpin->io_lowreg | IOART_INTMSET; ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), flags); intpin->io_masked = 1; @@ -313,6 +310,7 @@ /* Write the values to the APIC. */ mtx_lock_spin(&icu_lock); + intpin->io_lowreg = low; ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), low); value = ioapic_read(io->io_addr, IOAPIC_REDTBL_HI(intpin->io_intpin)); value &= ~IOART_DEST; ==== //depot/projects/uart/amd64/amd64/pmap.c#30 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.542 2006/04/03 21:36:00 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.543 2006/04/04 20:17:35 peter Exp $"); /* * Manages physical address maps. @@ -1474,13 +1474,14 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0, "Number of times tried to get a chunk page but failed."); -static int pv_entry_frees, pv_entry_allocs, pv_entry_spare; +static long pv_entry_frees, pv_entry_allocs; +static int pv_entry_spare; SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0, "Current number of pv entries"); -SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0, +SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0, "Current number of pv entry frees"); -SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0, +SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0, "Current number of pv entry allocs"); SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0, "Current number of spare pv entries"); ==== //depot/projects/uart/arm/arm/cpufunc.c#6 (text+ko) ==== @@ -45,7 +45,7 @@ * Created : 30/01/97 */ #include -__FBSDID("$FreeBSD: src/sys/arm/arm/cpufunc.c,v 1.9 2005/05/25 13:46:32 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/cpufunc.c,v 1.10 2006/04/09 23:07:31 cognet Exp $"); #include @@ -1530,7 +1530,8 @@ cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE | CPU_CONTROL_32BD_ENABLE | CPU_CONTROL_SYST_ENABLE | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE - | CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_LABT_ENABLE; + | CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_LABT_ENABLE | + CPU_CONTROL_ROUNDROBIN; cpuctrlmask = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE | CPU_CONTROL_32BD_ENABLE | CPU_CONTROL_SYST_ENABLE | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE ==== //depot/projects/uart/arm/arm/swtch.S#8 (text+ko) ==== @@ -83,7 +83,7 @@ #include #include #include -__FBSDID("$FreeBSD: src/sys/arm/arm/swtch.S,v 1.18 2005/10/04 20:47:27 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/swtch.S,v 1.19 2006/04/09 20:16:47 cognet Exp $"); /* @@ -467,7 +467,7 @@ bl _C_LABEL(fork_exit) /* Kill irq"s */ mrs r0, cpsr - orr r0, r0, #(I32_bit) + orr r0, r0, #(I32_bit|F32_bit) msr cpsr_c, r0 DO_AST PULLFRAME ==== //depot/projects/uart/arm/arm/trap.c#12 (text+ko) ==== @@ -82,7 +82,7 @@ #include "opt_ktrace.h" #include -__FBSDID("$FreeBSD: src/sys/arm/arm/trap.c,v 1.23 2006/03/01 20:43:51 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/trap.c,v 1.24 2006/04/09 20:16:47 cognet Exp $"); #include @@ -271,9 +271,13 @@ /* Grab the current pcb */ pcb = td->td_pcb; /* Re-enable interrupts if they were enabled previously */ - if (td->td_md.md_spinlock_count == 0 && - __predict_true(tf->tf_spsr & I32_bit) == 0) - enable_interrupts(I32_bit); + if (td->td_md.md_spinlock_count == 0) { + if (__predict_true(tf->tf_spsr & I32_bit) == 0) + enable_interrupts(I32_bit); + if (__predict_true(tf->tf_spsr & F32_bit) == 0) + enable_interrupts(F32_bit); + } + /* Invoke the appropriate handler, if necessary */ if (__predict_false(data_aborts[fsr & FAULT_TYPE_MASK].func != NULL)) { @@ -487,6 +491,7 @@ mode = TRAP_USERMODE(tf) ? "user" : "kernel"; + disable_interrupts(I32_bit|F32_bit); if (td != NULL) { printf("Fatal %s mode data abort: '%s'\n", mode, data_aborts[fsr & FAULT_TYPE_MASK].desc); @@ -730,9 +735,13 @@ thread_user_enter(td); } fault_pc = tf->tf_pc; - if (td->td_md.md_spinlock_count == 0 && - __predict_true((tf->tf_spsr & I32_bit) == 0)) - enable_interrupts(I32_bit); + if (td->td_md.md_spinlock_count == 0) { + if (__predict_true(tf->tf_spsr & I32_bit) == 0) + enable_interrupts(I32_bit); + if (__predict_true(tf->tf_spsr & F32_bit) == 0) + enable_interrupts(F32_bit); + } + /* See if the cpu state needs to be fixed up */ @@ -1012,9 +1021,13 @@ * Since all syscalls *should* come from user mode it will always * be safe to enable them, but check anyway. */ - if (td->td_md.md_spinlock_count == 0 && !(frame->tf_spsr & I32_bit)) - enable_interrupts(I32_bit); - + if (td->td_md.md_spinlock_count == 0) { + if (__predict_true(frame->tf_spsr & I32_bit) == 0) + enable_interrupts(I32_bit); + if (__predict_true(frame->tf_spsr & F32_bit) == 0) + enable_interrupts(F32_bit); + } + syscall(td, frame, insn); } ==== //depot/projects/uart/arm/arm/undefined.c#11 (text+ko) ==== @@ -48,7 +48,7 @@ #include "opt_ddb.h" #include -__FBSDID("$FreeBSD: src/sys/arm/arm/undefined.c,v 1.12 2006/03/01 18:33:45 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/undefined.c,v 1.13 2006/04/09 20:16:47 cognet Exp $"); #include #include @@ -189,7 +189,7 @@ /* Enable interrupts if they were enabled before the exception. */ if (!(frame->tf_spsr & I32_bit)) - enable_interrupts(I32_bit); + enable_interrupts(I32_bit|F32_bit); frame->tf_pc -= INSN_SIZE; PCPU_LAZY_INC(cnt.v_trap); ==== //depot/projects/uart/arm/at91/at91.c#3 (text) ==== @@ -23,7 +23,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/at91/at91.c,v 1.3 2006/03/18 01:35:49 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/at91.c,v 1.4 2006/04/06 04:32:29 imp Exp $"); #include #include @@ -201,11 +201,14 @@ struct at91_ivar *ivar; kid = device_add_child_ordered(dev, prio, name, unit); - if (kid == NULL) - return; + if (kid == NULL) { + printf("Can't add child %s%d ordered\n", name, unit); + return; + } ivar = malloc(sizeof(*ivar), M_DEVBUF, M_WAITOK | M_ZERO); if (ivar == NULL) { device_delete_child(dev, kid); + printf("Can't add alloc ivar\n"); return; } device_set_ivars(kid, ivar); ==== //depot/projects/uart/arm/at91/at91_twi.c#2 (text) ==== @@ -23,7 +23,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/at91/at91_twi.c,v 1.1 2006/02/04 23:32:13 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/at91_twi.c,v 1.2 2006/04/06 04:31:19 imp Exp $"); #include #include @@ -40,7 +40,10 @@ #include #include -#include + +#include +#include +#include "iicbus_if.h" struct at91_twi_softc { @@ -50,13 +53,12 @@ struct resource *mem_res; /* Memory resource */ struct mtx sc_mtx; /* basically a perimeter lock */ int flags; -#define XFER_PENDING 1 /* true when transfer taking place */ -#define OPENED 2 /* Device opened */ #define RXRDY 4 -#define TXCOMP 8 #define TXRDY 0x10 - struct cdev *cdev; uint32_t cwgr; + int sc_started; + int twi_addr; + device_t iicbus; }; static inline uint32_t @@ -79,7 +81,6 @@ #define AT91_TWI_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); #define AT91_TWI_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); #define AT91_TWI_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); -#define CDEV2SOFTC(dev) ((dev)->si_drv1) #define TWI_DEF_CLK 100000 static devclass_t at91_twi_devclass; @@ -95,19 +96,6 @@ static int at91_twi_activate(device_t dev); static void at91_twi_deactivate(device_t dev); -/* cdev routines */ -static d_open_t at91_twi_open; -static d_close_t at91_twi_close; -static d_ioctl_t at91_twi_ioctl; - -static struct cdevsw at91_twi_cdevsw = -{ - .d_version = D_VERSION, - .d_open = at91_twi_open, - .d_close = at91_twi_close, - .d_ioctl = at91_twi_ioctl -}; - static int at91_twi_probe(device_t dev) { @@ -137,20 +125,23 @@ AT91_TWI_LOCK_DESTROY(sc); goto out; } - sc->cdev = make_dev(&at91_twi_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, - "twi%d", device_get_unit(dev)); - if (sc->cdev == NULL) { - err = ENOMEM; - goto out; - } - sc->cdev->si_drv1 = sc; - sc->cwgr = TWI_CWGR_CKDIV(1) | + sc->cwgr = TWI_CWGR_CKDIV(8 * AT91C_MASTER_CLOCK / 90000) | TWI_CWGR_CHDIV(TWI_CWGR_DIV(TWI_DEF_CLK)) | TWI_CWGR_CLDIV(TWI_CWGR_DIV(TWI_DEF_CLK)); WR4(sc, TWI_CR, TWI_CR_SWRST); WR4(sc, TWI_CR, TWI_CR_MSEN | TWI_CR_SVDIS); WR4(sc, TWI_CWGR, sc->cwgr); + + WR4(sc, TWI_IER, TWI_SR_RXRDY | TWI_SR_OVRE | TWI_SR_UNRE | + TWI_SR_NACK); + + if ((sc->iicbus = device_add_child(dev, "iicbus", -1)) == NULL) + device_printf(dev, "could not allocate iicbus instance\n"); + + /* probe and attach the iicbus */ + bus_generic_attach(dev); + out:; if (err) at91_twi_deactivate(dev); @@ -160,7 +151,15 @@ static int at91_twi_detach(device_t dev) { - return (EBUSY); /* XXX */ + struct at91_twi_softc *sc; + int rv; + + sc = device_get_softc(dev); + at91_twi_deactivate(dev); + if (sc->iicbus && (rv = device_delete_child(dev, sc->iicbus)) != 0) + return (rv); + + return (0); } static int @@ -215,13 +214,12 @@ /* Reading the status also clears the interrupt */ status = RD4(sc, TWI_SR); + printf("status %x\n", status); if (status == 0) return; AT91_TWI_LOCK(sc); if (status & TWI_SR_RXRDY) sc->flags |= RXRDY; - if (status & TWI_SR_TXCOMP) - sc->flags |= TXCOMP; if (status & TWI_SR_TXRDY) sc->flags |= TXRDY; AT91_TWI_UNLOCK(sc); @@ -229,191 +227,196 @@ return; } -static int -at91_twi_open(struct cdev *dev, int oflags, int devtype, struct thread *td) +static int +at91_twi_wait_stop_done(struct at91_twi_softc *sc) +{ + int err = 0; + + while (!(RD4(sc, TWI_SR) & TWI_SR_TXCOMP)) + continue; + return (err); +} + +/* + * Stop the transfer by entering a STOP state on the iic bus. For read + * operations, we've already entered the STOP state, since we need to do + * that to read the last character. For write operations, we need to + * wait for the TXCOMP bit to turn on before returning. + */ +static int +at91_twi_stop(device_t dev) { struct at91_twi_softc *sc; + int err = 0; - sc = CDEV2SOFTC(dev); - AT91_TWI_LOCK(sc); - if (!(sc->flags & OPENED)) { - sc->flags |= OPENED; - WR4(sc, TWI_IER, TWI_SR_TXCOMP | TWI_SR_RXRDY | TWI_SR_TXRDY | - TWI_SR_OVRE | TWI_SR_UNRE | TWI_SR_NACK); + sc = device_get_softc(dev); + if (sc->sc_started) { + WR4(sc, TWI_CR, TWI_CR_STOP); + err = at91_twi_wait_stop_done(sc); } - AT91_TWI_UNLOCK(sc); - return (0); + return (err); } +/* + * enter a START condition without requiring the device to be in a STOP + * state. + */ static int -at91_twi_close(struct cdev *dev, int fflag, int devtype, struct thread *td) +at91_twi_repeated_start(device_t dev, u_char slave, int timeout) { struct at91_twi_softc *sc; - sc = CDEV2SOFTC(dev); - AT91_TWI_LOCK(sc); - sc->flags &= ~OPENED; - WR4(sc, TWI_IDR, TWI_SR_TXCOMP | TWI_SR_RXRDY | TWI_SR_TXRDY | - TWI_SR_OVRE | TWI_SR_UNRE | TWI_SR_NACK); - AT91_TWI_UNLOCK(sc); + sc = device_get_softc(dev); + WR4(sc, TWI_MMR, TWI_MMR_DADR(slave)); + WR4(sc, TWI_CR, TWI_CR_START); + sc->sc_started = 1; return (0); } - +/* + * enter a START condition from an idle state. + */ static int -at91_twi_read_master(struct at91_twi_softc *sc, struct at91_twi_io *xfr) +at91_twi_start(device_t dev, u_char slave, int timeout) { - uint8_t *walker; - uint8_t buffer[256]; - size_t len; - int err = 0; + struct at91_twi_softc *sc; - if (xfr->xfer_len > sizeof(buffer)) - return (EINVAL); - walker = buffer; - len = xfr->xfer_len; - RD4(sc, TWI_RHR); - // Master mode, with the right address and interal addr size - WR4(sc, TWI_MMR, TWI_MMR_IADRSZ(xfr->iadrsz) | TWI_MMR_MREAD | - TWI_MMR_DADR(xfr->dadr)); - WR4(sc, TWI_IADR, xfr->iadr); + sc = device_get_softc(dev); + WR4(sc, TWI_MMR, TWI_MMR_DADR(slave)); WR4(sc, TWI_CR, TWI_CR_START); - while (len-- > 1) { - while (!(sc->flags & RXRDY)) { - err = msleep(sc, &sc->sc_mtx, PZERO | PCATCH, "twird", - 0); - if (err) - return (err); - } - sc->flags &= ~RXRDY; - *walker++ = RD4(sc, TWI_RHR) & 0xff; - } - WR4(sc, TWI_CR, TWI_CR_STOP); - while (!(sc->flags & TXCOMP)) { - err = msleep(sc, &sc->sc_mtx, PZERO | PCATCH, "twird2", 0); - if (err) - return (err); - } - sc->flags &= ~TXCOMP; - *walker = RD4(sc, TWI_RHR) & 0xff; - if (xfr->xfer_buf) { - AT91_TWI_UNLOCK(sc); - err = copyout(buffer, xfr->xfer_buf, xfr->xfer_len); - AT91_TWI_LOCK(sc); - } - return (err); + sc->sc_started = 1; + return (0); } static int -at91_twi_write_master(struct at91_twi_softc *sc, struct at91_twi_io *xfr) +at91_twi_write(device_t dev, char *buf, int len, int *sent, int timeout /* us */) { + struct at91_twi_softc *sc; uint8_t *walker; - uint8_t buffer[256]; - size_t len; - int err; + int err = 0; - if (xfr->xfer_len > sizeof(buffer)) - return (EINVAL); - walker = buffer; - len = xfr->xfer_len; - AT91_TWI_UNLOCK(sc); - err = copyin(xfr->xfer_buf, buffer, xfr->xfer_len); + walker = buf; + sc = device_get_softc(dev); + WR4(sc, TWI_MMR, TWI_MMR_MWRITE | RD4(sc, TWI_MMR)); AT91_TWI_LOCK(sc); - if (err) - return (err); - /* Setup the xfr for later readback */ - xfr->xfer_buf = 0; - xfr->xfer_len = 1; + WR4(sc, TWI_IER, TWI_SR_TXRDY); while (len--) { - WR4(sc, TWI_MMR, TWI_MMR_IADRSZ(xfr->iadrsz) | TWI_MMR_MWRITE | - TWI_MMR_DADR(xfr->dadr)); - WR4(sc, TWI_IADR, xfr->iadr++); WR4(sc, TWI_THR, *walker++); - WR4(sc, TWI_CR, TWI_CR_START); - /* - * If we get signal while waiting for TXRDY, make sure we - * try to stop this device - */ while (!(sc->flags & TXRDY)) { err = msleep(sc, &sc->sc_mtx, PZERO | PCATCH, "twiwr", 0); if (err) - break; + goto errout; } - WR4(sc, TWI_CR, TWI_CR_STOP); - if (err) - return (err); - while (!(sc->flags & TXCOMP)) { - err = msleep(sc, &sc->sc_mtx, PZERO | PCATCH, "twiwr2", + } +errout:; + WR4(sc, TWI_IDR, TWI_SR_TXRDY); + AT91_TWI_UNLOCK(sc); + return (err); +} + +static int +at91_twi_read(device_t dev, char *buf, int len, int *read, int last, + int delay /* us */) +{ + struct at91_twi_softc *sc; + char *walker; + int err = 0; + + walker = buf; + sc = device_get_softc(dev); + AT91_TWI_LOCK(sc); + WR4(sc, TWI_MMR, ~TWI_MMR_MWRITE & RD4(sc, TWI_MMR)); + WR4(sc, TWI_IER, TWI_SR_RXRDY); + while (len-- > 0) { + err = 0; + while (!(sc->flags & RXRDY)) { + err = msleep(sc, &sc->sc_mtx, PZERO | PCATCH, "twird", 0); if (err) - return (err); + goto errout; } - /* Readback */ - at91_twi_read_master(sc, xfr); + sc->flags &= ~RXRDY; + *walker++ = RD4(sc, TWI_RHR) & 0xff; + if (len == 1 && last) + break; } + if (!last) + goto errout; + WR4(sc, TWI_CR, TWI_CR_STOP); + err = at91_twi_wait_stop_done(sc); + *walker = RD4(sc, TWI_RHR) & 0xff; + if (read) + *read = walker - buf; + sc->sc_started = 0; +errout:; + WR4(sc, TWI_IDR, TWI_SR_RXRDY); + AT91_TWI_UNLOCK(sc); return (err); } static int -at91_twi_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, - struct thread *td) +at91_twi_rst_card(device_t dev, u_char speed, u_char addr, u_char *oldaddr) { - int err = 0; struct at91_twi_softc *sc; + int ckdiv, rate; - sc = CDEV2SOFTC(dev); - AT91_TWI_LOCK(sc); - while (sc->flags & XFER_PENDING) { - err = msleep(sc, &sc->sc_mtx, PZERO | PCATCH, - "twiwait", 0); - if (err) { - AT91_TWI_UNLOCK(sc); - return (err); - } - } - sc->flags |= XFER_PENDING; + sc = device_get_softc(dev); + if (oldaddr) + *oldaddr = sc->twi_addr; + if (addr != 0) + sc->twi_addr = 0; + else + sc->twi_addr = addr; + + rate = 1; + + /* + * 8 * is because "rate == 1" -> 4 clocks down, 4 clocks up. The + * speeds are for 1.5kb/s, 45kb/s and 90kb/s. + */ + switch (speed) { + case IIC_SLOW: + ckdiv = 8 * AT91C_MASTER_CLOCK / 1500; + break; + + case IIC_FAST: + ckdiv = 8 * AT91C_MASTER_CLOCK / 45000; + break; - switch (cmd) - { - case TWIIOCXFER: - { - struct at91_twi_io *xfr = (struct at91_twi_io *)data; - switch (xfr->type) - { - case TWI_IO_READ_MASTER: - err = at91_twi_read_master(sc, xfr); - break; - case TWI_IO_WRITE_MASTER: - err = at91_twi_write_master(sc, xfr); - break; - default: - err = EINVAL; - break; - } + case IIC_UNKNOWN: + case IIC_FASTEST: + default: + ckdiv = 8 * AT91C_MASTER_CLOCK / 90000; break; } - case TWIIOCSETCLOCK: - { - struct at91_twi_clock *twick = (struct at91_twi_clock *)data; + sc->cwgr = TWI_CWGR_CKDIV(ckdiv) | TWI_CWGR_CHDIV(TWI_CWGR_DIV(rate)) | + TWI_CWGR_CLDIV(TWI_CWGR_DIV(rate)); + WR4(sc, TWI_CR, TWI_CR_SWRST); + WR4(sc, TWI_CR, TWI_CR_MSEN | TWI_CR_SVDIS); + WR4(sc, TWI_CWGR, sc->cwgr); + + return EIO; +} + +static int +at91_twi_callback(device_t dev, int index, caddr_t *data) +{ + int error = 0; + + switch (index) { + case IIC_REQUEST_BUS: + break; - sc->cwgr = TWI_CWGR_CKDIV(twick->ckdiv) | - TWI_CWGR_CHDIV(TWI_CWGR_DIV(twick->high_rate)) | - TWI_CWGR_CLDIV(TWI_CWGR_DIV(twick->low_rate)); - WR4(sc, TWI_CR, TWI_CR_SWRST); - WR4(sc, TWI_CR, TWI_CR_MSEN | TWI_CR_SVDIS); - WR4(sc, TWI_CWGR, sc->cwgr); + case IIC_RELEASE_BUS: break; - } + default: - err = ENOTTY; - break; + error = EINVAL; } - sc->flags &= ~XFER_PENDING; - AT91_TWI_UNLOCK(sc); - wakeup(sc); - return err; + + return (error); } static device_method_t at91_twi_methods[] = { @@ -422,6 +425,14 @@ DEVMETHOD(device_attach, at91_twi_attach), DEVMETHOD(device_detach, at91_twi_detach), + /* iicbus interface */ + DEVMETHOD(iicbus_callback, at91_twi_callback), + DEVMETHOD(iicbus_repeated_start, at91_twi_repeated_start), + DEVMETHOD(iicbus_start, at91_twi_start), + DEVMETHOD(iicbus_stop, at91_twi_stop), + DEVMETHOD(iicbus_write, at91_twi_write), + DEVMETHOD(iicbus_read, at91_twi_read), + DEVMETHOD(iicbus_reset, at91_twi_rst_card), { 0, 0 } }; ==== //depot/projects/uart/arm/at91/at91_usartreg.h#2 (text) ==== @@ -22,30 +22,30 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* $FreeBSD: src/sys/arm/at91/at91_usartreg.h,v 1.1 2006/02/04 23:32:13 imp Exp $ */ +/* $FreeBSD: src/sys/arm/at91/at91_usartreg.h,v 1.2 2006/04/06 04:29:24 imp Exp $ */ #ifndef AT91USARTREG_H_ #define AT91USARTREG_H_ #define USART_CR 0x00 /* Control register */ -#define USART_CR_RSTRX (1 << 2) /* Reset Receiver */ -#define USART_CR_RSTTX (1 << 3) /* Reset Transmitter */ -#define USART_CR_RXEN (1 << 4) /* Receiver Enable */ -#define USART_CR_RXDIS (1 << 5) /* Receiver Disable */ -#define USART_CR_TXEN (1 << 6) /* Transmitter Enable */ -#define USART_CR_TXDIS (1 << 7) /* Transmitter Disable */ -#define USART_CR_RSTSTA (1 << 8) /* Reset Status Bits */ -#define USART_CR_STTBRK (1 << 9) /* Start Break */ -#define USART_CR_STPBRK (1 << 10) /* Stop Break */ -#define USART_CR_STTTO (1 << 11) /* Start Time-out */ -#define USART_CR_SENDA (1 << 12) /* Send Address */ -#define USART_CR_RSTIT (1 << 13) /* Reset Iterations */ -#define USART_CR_RSTNACK (1 << 14) /* Reset Non Acknowledge */ -#define USART_CR_RETTO (1 << 15) /* Rearm Time-out */ -#define USART_CR_DTREN (1 << 16) /* Data Terminal ready Enable */ -#define USART_CR_DTRDIS (1 << 17) /* Data Terminal ready Disable */ -#define USART_CR_RTSEN (1 << 18) /* Request to Send enable */ -#define USART_CR_RTSDIS (1 << 19) /* Request to Send Disable */ +#define USART_CR_RSTRX (1UL << 2) /* Reset Receiver */ +#define USART_CR_RSTTX (1UL << 3) /* Reset Transmitter */ +#define USART_CR_RXEN (1UL << 4) /* Receiver Enable */ +#define USART_CR_RXDIS (1UL << 5) /* Receiver Disable */ +#define USART_CR_TXEN (1UL << 6) /* Transmitter Enable */ +#define USART_CR_TXDIS (1UL << 7) /* Transmitter Disable */ +#define USART_CR_RSTSTA (1UL << 8) /* Reset Status Bits */ +#define USART_CR_STTBRK (1UL << 9) /* Start Break */ +#define USART_CR_STPBRK (1UL << 10) /* Stop Break */ +#define USART_CR_STTTO (1UL << 11) /* Start Time-out */ +#define USART_CR_SENDA (1UL << 12) /* Send Address */ +#define USART_CR_RSTIT (1UL << 13) /* Reset Iterations */ +#define USART_CR_RSTNACK (1UL << 14) /* Reset Non Acknowledge */ +#define USART_CR_RETTO (1UL << 15) /* Rearm Time-out */ +#define USART_CR_DTREN (1UL << 16) /* Data Terminal ready Enable */ +#define USART_CR_DTRDIS (1UL << 17) /* Data Terminal ready Disable */ +#define USART_CR_RTSEN (1UL << 18) /* Request to Send enable */ +#define USART_CR_RTSDIS (1UL << 19) /* Request to Send Disable */ #define USART_MR 0x04 /* Mode register */ #define USART_MR_MODE_NORMAL 0 /* Normal/Async/3-wire rs-232 */ @@ -91,28 +91,28 @@ #define USART_IMR 0x10 /* Interrupt mask register */ #define USART_CSR 0x14 /* Channel status register */ -#define USART_CSR_RXRDY (1U << 0) /* Receiver ready */ -#define USART_CSR_TXRDY (1U << 1) /* Transmitter ready */ -#define USART_CSR_RXBRK (1U << 2) /* Break received */ -#define USART_CSR_ENDRX (1U << 3) /* End of Transfer RX from PDC */ -#define USART_CSR_ENDTX (1U << 4) /* End of Transfer TX from PDC */ -#define USART_CSR_OVRE (1U << 5) /* Overrun error */ -#define USART_CSR_FRAME (1U << 6) /* Framing error */ -#define USART_CSR_PARE (1U << 7) /* Parity Error */ -#define USART_CSR_TIMEOUT (1U << 8) /* Timeout since start-timeout */ -#define USART_CSR_TXEMPTY (1U << 9) /* Transmitter empty */ -#define USART_CSR_ITERATION (1U << 10) /* max repetitions since RSIT */ -#define USART_CSR_TXBUFE (1U << 11) /* Buffer empty from PDC */ -#define USART_CSR_RXBUFF (1U << 12) /* Buffer full from PDC */ -#define USART_CSR_NACK (1U << 13) /* NACK since last RSTNACK */ -#define USART_CSR_RIIC (1U << 16) /* RI delta since last csr read */ -#define USART_CSR_DSRIC (1U << 17) /* DSR delta */ -#define USART_CSR_DCDIC (1U << 18) /* DCD delta */ -#define USART_CSR_CTSIC (1U << 19) /* CTS delta */ -#define USART_CSR_RI (1U << 20) /* RI status */ -#define USART_CSR_DSR (1U << 21) /* DSR status */ -#define USART_CSR_DCD (1U << 22) /* DCD status */ -#define USART_CSR_CTS (1U << 23) /* CTS status */ +#define USART_CSR_RXRDY (1UL << 0) /* Receiver ready */ +#define USART_CSR_TXRDY (1UL << 1) /* Transmitter ready */ +#define USART_CSR_RXBRK (1UL << 2) /* Break received */ +#define USART_CSR_ENDRX (1UL << 3) /* End of Transfer RX from PDC */ +#define USART_CSR_ENDTX (1UL << 4) /* End of Transfer TX from PDC */ +#define USART_CSR_OVRE (1UL << 5) /* Overrun error */ +#define USART_CSR_FRAME (1UL << 6) /* Framing error */ +#define USART_CSR_PARE (1UL << 7) /* Parity Error */ +#define USART_CSR_TIMEOUT (1UL << 8) /* Timeout since start-timeout */ +#define USART_CSR_TXEMPTY (1UL << 9) /* Transmitter empty */ +#define USART_CSR_ITERATION (1UL << 10) /* max repetitions since RSIT */ +#define USART_CSR_TXBUFE (1UL << 11) /* Buffer empty from PDC */ +#define USART_CSR_RXBUFF (1UL << 12) /* Buffer full from PDC */ +#define USART_CSR_NACK (1UL << 13) /* NACK since last RSTNACK */ +#define USART_CSR_RIIC (1UL << 16) /* RI delta since last csr read */ +#define USART_CSR_DSRIC (1UL << 17) /* DSR delta */ +#define USART_CSR_DCDIC (1UL << 18) /* DCD delta */ +#define USART_CSR_CTSIC (1UL << 19) /* CTS delta */ +#define USART_CSR_RI (1UL << 20) /* RI status */ +#define USART_CSR_DSR (1UL << 21) /* DSR status */ +#define USART_CSR_DCD (1UL << 22) /* DCD status */ +#define USART_CSR_CTS (1UL << 23) /* CTS status */ #define USART_RHR 0x18 /* Receiver holding register */ #define USART_THR 0x1c /* Transmitter holding register */ @@ -125,24 +125,4 @@ /* 0x48 reserved */ #define USART_IFR 0x48 /* IrDA filter register */ - -#define UART_RXRDY (0x1 << 0) /* RXRDY Interrupt */ -#define UART_TXRDY (0x1 << 1) /* TXRDY Interrupt */ -#define UART_RXBRK (0x1 << 2) /* Break Received/End of Break */ -#define UART_ENDRX (0x1 << 3) /* End of Receive Transfer Interrupt */ -#define UART_ENDTX (0x1 << 4) /* End of Transmit Interrupt */ -#define UART_OVRE (0x1 << 5) /* Overrun Interrupt */ -#define UART_FRAME (0x1 << 6) /* Framing Error Interrupt */ -#define UART_PARE (0x1 << 7) /* Parity Error Interrupt */ -#define UART_TIMEOUT ( 0x1 << 8) /* (USART) Receiver Time-out */ -#define UART_TXEMPTY ( 0x1 << 9) /* (USART) TXEMPTY Interrupt */ -#define UART_ITERATION ( 0x1 << 10) /* (USART) Max number of Repetitions Reached */ -#define UART_TXBUFE ( 0x1 << 11) /* (USART) TXBUFE Interrupt */ -#define UART_RXBUFF ( 0x1 << 12) /* (USART) RXBUFF Interrupt */ -#define UART_NACK ( 0x1 << 13) /* (USART) Non Acknowledge */ -#define UART_RIIC ( 0x1 << 16) /* (USART) Ring INdicator Input Change Flag */ -#define AT91RM92_US_DSRIC ( 0x1 << 17) /* (USART) Data Set Ready Input Change Flag */ -#define AT91RM92_US_DCDIC ( 0x1 << 18) /* (USART) Data Carrier Flag */ -#define AT91RM92_US_CTSIC ( 0x1 << 19) /* (USART) Clear To Send Input Change Flag */ - #endif /* AT91RM92REG_H_ */ ==== //depot/projects/uart/arm/at91/if_ate.c#3 (text) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/at91/if_ate.c,v 1.5 2006/03/18 01:43:25 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/if_ate.c,v 1.6 2006/04/06 04:30:23 imp Exp $"); #include #include @@ -86,13 +86,14 @@ struct callout tick_ch; /* Tick callout */ bus_dma_tag_t mtag; /* bus dma tag for mbufs */ bus_dmamap_t tx_map[ATE_MAX_TX_BUFFERS]; + struct mbuf *sent_mbuf[ATE_MAX_TX_BUFFERS]; /* Sent mbufs */ bus_dma_tag_t rxtag; bus_dmamap_t rx_map[ATE_MAX_RX_BUFFERS]; + void *rx_buf[ATE_MAX_RX_BUFFERS]; /* RX buffer space */ + int rx_buf_ptr; bus_dma_tag_t rx_desc_tag; bus_dmamap_t rx_desc_map; int txcur; /* current tx map pointer */ - struct mbuf *sent_mbuf[ATE_MAX_TX_BUFFERS]; /* Sent mbufs */ - struct mbuf *rx_mbuf[ATE_MAX_RX_BUFFERS]; /* RX mbufs */ bus_addr_t rx_desc_phys; eth_rx_desc_t *rx_descs; struct ifmib_iso_8802_3 mibdata; /* stuff for network mgmt */ @@ -241,6 +242,30 @@ sc->rx_desc_phys = segs[0].ds_addr; } +static void +ate_load_rx_buf(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ >>> TRUNCATED FOR MAIL (1000 lines) <<<