Date: Wed, 28 Nov 2012 17:34:17 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r243653 - in projects/counters: . cddl/contrib/opensolaris/cmd/zfs cddl/contrib/opensolaris/cmd/zpool cddl/contrib/opensolaris/cmd/ztest contrib/libc++/include contrib/sendmail/src etc ... Message-ID: <201211281734.qASHYHwY097942@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Wed Nov 28 17:34:17 2012 New Revision: 243653 URL: http://svnweb.freebsd.org/changeset/base/243653 Log: Merge r243428 through r243651 from head. Added: projects/counters/sys/arm/broadcom/bcm2835/bcm2835_gpio.c - copied unchanged from r243651, head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c projects/counters/sys/arm/conf/Makefile - copied unchanged from r243651, head/sys/arm/conf/Makefile projects/counters/sys/arm/conf/NOTES - copied unchanged from r243651, head/sys/arm/conf/NOTES projects/counters/tools/tools/ath/athalq/ar5416_ds_tdma.c - copied unchanged from r243651, head/tools/tools/ath/athalq/ar5416_ds_tdma.c Modified: projects/counters/UPDATING projects/counters/cddl/contrib/opensolaris/cmd/zfs/zfs.8 projects/counters/cddl/contrib/opensolaris/cmd/zpool/zpool.8 projects/counters/cddl/contrib/opensolaris/cmd/ztest/ztest.c projects/counters/contrib/libc++/include/__config projects/counters/contrib/libc++/include/cstdlib projects/counters/contrib/libc++/include/cwchar projects/counters/contrib/sendmail/src/sasl.c projects/counters/etc/newsyslog.conf projects/counters/lib/libc/sys/getpeername.2 projects/counters/lib/libc/sys/getsockname.2 projects/counters/share/man/man4/ktr.4 projects/counters/share/man/man4/usb_quirk.4 projects/counters/share/misc/committers-ports.dot projects/counters/sys/arm/arm/cpufunc.c projects/counters/sys/arm/arm/locore.S projects/counters/sys/arm/arm/machdep.c projects/counters/sys/arm/arm/mpcore_timer.c projects/counters/sys/arm/at91/files.at91 projects/counters/sys/arm/broadcom/bcm2835/bcm2835_systimer.c projects/counters/sys/arm/broadcom/bcm2835/files.bcm2835 projects/counters/sys/arm/conf/RPI-B projects/counters/sys/arm/include/cpufunc.h projects/counters/sys/arm/mv/mvreg.h projects/counters/sys/arm/ti/am335x/am335x_dmtimer.c projects/counters/sys/arm/ti/ti_machdep.c projects/counters/sys/boot/uboot/lib/elf_freebsd.c projects/counters/sys/cam/ata/ata_xpt.c projects/counters/sys/cddl/compat/opensolaris/kern/opensolaris_cmn_err.c projects/counters/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dbuf.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/space_map.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c projects/counters/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c projects/counters/sys/conf/Makefile.arm projects/counters/sys/conf/NOTES projects/counters/sys/conf/options.mips projects/counters/sys/contrib/octeon-sdk/cvmx-dma-engine.c projects/counters/sys/contrib/octeon-sdk/cvmx-pow.h projects/counters/sys/contrib/octeon-sdk/cvmx-spi.c projects/counters/sys/contrib/octeon-sdk/cvmx-utils.h projects/counters/sys/contrib/octeon-sdk/cvmx-warn.c projects/counters/sys/contrib/octeon-sdk/cvmx.h projects/counters/sys/contrib/octeon-sdk/octeon-model.c projects/counters/sys/contrib/octeon-sdk/octeon-model.h projects/counters/sys/dev/ath/ath_hal/ah.h projects/counters/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c projects/counters/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c projects/counters/sys/dev/ath/if_ath.c projects/counters/sys/dev/ath/if_ath_alq.h projects/counters/sys/dev/ath/if_ath_tdma.c projects/counters/sys/dev/ath/if_ath_tx.c projects/counters/sys/dev/bce/if_bce.c projects/counters/sys/dev/bxe/if_bxe.c projects/counters/sys/dev/e1000/if_igb.c projects/counters/sys/dev/gpio/gpiobus.c projects/counters/sys/dev/iwn/if_iwn.c projects/counters/sys/dev/sound/pci/hda/hdaa.c projects/counters/sys/dev/sound/pcm/buffer.c projects/counters/sys/dev/sound/pcm/sound.c projects/counters/sys/dev/usb/quirk/usb_quirk.c projects/counters/sys/dev/usb/quirk/usb_quirk.h projects/counters/sys/fs/ext2fs/ext2_alloc.c projects/counters/sys/fs/smbfs/smbfs_node.c projects/counters/sys/fs/smbfs/smbfs_vnops.c projects/counters/sys/kern/capabilities.conf projects/counters/sys/kern/init_sysent.c projects/counters/sys/kern/kern_mbuf.c projects/counters/sys/kern/kern_proc.c projects/counters/sys/kern/kern_shutdown.c projects/counters/sys/kern/kern_sig.c projects/counters/sys/kern/subr_param.c projects/counters/sys/kern/uipc_socket.c projects/counters/sys/kern/vfs_lookup.c projects/counters/sys/kern/vfs_subr.c projects/counters/sys/kern/vfs_vnops.c projects/counters/sys/mips/cavium/octeon_machdep.c projects/counters/sys/mips/conf/OCTEON1 projects/counters/sys/net/if_ethersubr.c projects/counters/sys/net/if_tap.c projects/counters/sys/net/if_vlan.c projects/counters/sys/net80211/ieee80211_freebsd.h projects/counters/sys/netinet/ip_output.c projects/counters/sys/netinet/sctp_pcb.c projects/counters/sys/netinet/sctp_peeloff.c projects/counters/sys/netinet/sctp_peeloff.h projects/counters/sys/netinet/sctp_usrreq.c projects/counters/sys/netinet/tcp_subr.c projects/counters/sys/netinet/tcp_timer.c projects/counters/sys/netinet/tcp_timer.h projects/counters/sys/sys/eventhandler.h projects/counters/sys/sys/mbuf.h projects/counters/sys/sys/namei.h projects/counters/sys/sys/param.h projects/counters/sys/sys/vnode.h projects/counters/sys/vm/vm_map.c projects/counters/usr.bin/cut/cut.c projects/counters/usr.bin/passwd/Makefile projects/counters/usr.sbin/bsdconfig/networking/include/messages.subr projects/counters/usr.sbin/bsdconfig/networking/share/ipaddr.subr projects/counters/usr.sbin/bsdconfig/share/dialog.subr projects/counters/usr.sbin/bsdconfig/share/mustberoot.subr projects/counters/usr.sbin/bsdconfig/startup/share/rcedit.subr projects/counters/usr.sbin/bsdconfig/timezone/share/zones.subr projects/counters/usr.sbin/ifmcstat/ifmcstat.c projects/counters/usr.sbin/nfsd/nfsd.c projects/counters/usr.sbin/pkg_install/add/main.c projects/counters/usr.sbin/pkg_install/add/pkg_add.1 projects/counters/usr.sbin/pkg_install/create/pkg_create.1 projects/counters/usr.sbin/pkg_install/delete/pkg_delete.1 projects/counters/usr.sbin/pkg_install/info/pkg_info.1 projects/counters/usr.sbin/pkg_install/lib/lib.h projects/counters/usr.sbin/pkg_install/lib/pkgng.c projects/counters/usr.sbin/pkg_install/updating/pkg_updating.1 projects/counters/usr.sbin/pkg_install/version/pkg_version.1 Directory Properties: projects/counters/ (props changed) projects/counters/cddl/contrib/opensolaris/ (props changed) projects/counters/cddl/contrib/opensolaris/cmd/zfs/ (props changed) projects/counters/contrib/libc++/ (props changed) projects/counters/contrib/sendmail/ (props changed) projects/counters/lib/libc/ (props changed) projects/counters/share/man/man4/ (props changed) projects/counters/sys/ (props changed) projects/counters/sys/boot/ (props changed) projects/counters/sys/cddl/contrib/opensolaris/ (props changed) projects/counters/sys/conf/ (props changed) projects/counters/sys/contrib/octeon-sdk/ (props changed) Modified: projects/counters/UPDATING ============================================================================== --- projects/counters/UPDATING Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/UPDATING Wed Nov 28 17:34:17 2012 (r243653) @@ -24,6 +24,14 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 10 disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20121117: + The sin6_scope_id member variable in struct sockaddr_in6 is now + filled by the kernel before passing the structure to the userland via + sysctl or routing socket. This means the KAME-specific embedded scope + id in sin6_addr.s6_addr[2] is always cleared in userland application. + This behavior can be controlled by net.inet6.ip6.deembed_scopeid. + __FreeBSD_version is bumped to 1000025. + 20121105: On i386 and amd64 systems WITH_CLANG_IS_CC is now the default. This means that the world and kernel will be compiled with clang Modified: projects/counters/cddl/contrib/opensolaris/cmd/zfs/zfs.8 ============================================================================== --- projects/counters/cddl/contrib/opensolaris/cmd/zfs/zfs.8 Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/cddl/contrib/opensolaris/cmd/zfs/zfs.8 Wed Nov 28 17:34:17 2012 (r243653) @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 5, 2012 +.Dd November 26, 2012 .Dt ZFS 8 .Os .Sh NAME @@ -760,7 +760,7 @@ If no inheritable .Tn ACE Ns s exist that affect the mode, then the mode is set in accordance to the requested mode from the application. -.It Sy aclmode Ns = Ns Cm discard | groupmask | passthrough +.It Sy aclmode Ns = Ns Cm discard | groupmask | passthrough | restricted Controls how an .Tn ACL is modified during @@ -790,6 +790,32 @@ indicates that no changes are made to th other than creating or updating the necessary .Tn ACL entries to represent the new mode of the file or directory. +An +.Sy aclmode +property of +.Cm restricted +will cause the +.Xr chmod 2 +operation to return an error when used on any file or directory which has +a non-trivial +.Tn ACL +whose entries can not be represented by a mode. +.Xr chmod 2 +is required to change the set user ID, set group ID, or sticky bits on a file +or directory, as they do not have equivalent +.Tn ACL +entries. +In order to use +.Xr chmod 2 +on a file or directory with a non-trivial +.Tn ACL +when +.Sy aclmode +is set to +.Cm restricted , +you must first remove all +.Tn ACL +entries which do not represent the current mode. .It Sy atime Ns = Ns Cm on | off Controls whether the access time for files is updated when they are read. Turning this property off avoids producing write traffic when reading files and @@ -830,7 +856,7 @@ command or unmounted by the command. .Pp This property is not inherited. -.It Sy checksum Ns = Ns Cm on | off | fletcher2 | fletcher4 +.It Sy checksum Ns = Ns Cm on | off | fletcher2 | fletcher4 | sha256 Controls the checksum used to verify data integrity. The default value is .Cm on , which automatically selects an appropriate algorithm (currently, Modified: projects/counters/cddl/contrib/opensolaris/cmd/zpool/zpool.8 ============================================================================== --- projects/counters/cddl/contrib/opensolaris/cmd/zpool/zpool.8 Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/cddl/contrib/opensolaris/cmd/zpool/zpool.8 Wed Nov 28 17:34:17 2012 (r243653) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 28, 2011 +.Dd November 15, 2012 .Dt ZPOOL 8 .Os .Sh NAME Modified: projects/counters/cddl/contrib/opensolaris/cmd/ztest/ztest.c ============================================================================== --- projects/counters/cddl/contrib/opensolaris/cmd/ztest/ztest.c Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/cddl/contrib/opensolaris/cmd/ztest/ztest.c Wed Nov 28 17:34:17 2012 (r243653) @@ -204,6 +204,7 @@ enum ztest_io_type { ZTEST_IO_WRITE_ZEROES, ZTEST_IO_TRUNCATE, ZTEST_IO_SETATTR, + ZTEST_IO_REWRITE, ZTEST_IO_TYPES }; @@ -330,6 +331,7 @@ ztest_func_t ztest_vdev_add_remove; ztest_func_t ztest_vdev_aux_add_remove; ztest_func_t ztest_split_pool; ztest_func_t ztest_reguid; +ztest_func_t ztest_spa_upgrade; uint64_t zopt_always = 0ULL * NANOSEC; /* all the time */ uint64_t zopt_incessant = 1ULL * NANOSEC / 10; /* every 1/10 second */ @@ -363,6 +365,7 @@ ztest_info_t ztest_info[] = { { ztest_reguid, 1, &zopt_sometimes }, { ztest_spa_rename, 1, &zopt_rarely }, { ztest_scrub, 1, &zopt_rarely }, + { ztest_spa_upgrade, 1, &zopt_rarely }, { ztest_dsl_dataset_promote_busy, 1, &zopt_rarely }, { ztest_vdev_attach_detach, 1, &zopt_rarely }, { ztest_vdev_LUN_growth, 1, &zopt_rarely }, @@ -797,7 +800,7 @@ ztest_get_ashift(void) } static nvlist_t * -make_vdev_file(char *path, char *aux, size_t size, uint64_t ashift) +make_vdev_file(char *path, char *aux, char *pool, size_t size, uint64_t ashift) { char pathbuf[MAXPATHLEN]; uint64_t vdev; @@ -813,12 +816,13 @@ make_vdev_file(char *path, char *aux, si vdev = ztest_shared->zs_vdev_aux; (void) snprintf(path, sizeof (pathbuf), ztest_aux_template, ztest_opts.zo_dir, - ztest_opts.zo_pool, aux, vdev); + pool == NULL ? ztest_opts.zo_pool : pool, + aux, vdev); } else { vdev = ztest_shared->zs_vdev_next_leaf++; (void) snprintf(path, sizeof (pathbuf), ztest_dev_template, ztest_opts.zo_dir, - ztest_opts.zo_pool, vdev); + pool == NULL ? ztest_opts.zo_pool : pool, vdev); } } @@ -840,17 +844,18 @@ make_vdev_file(char *path, char *aux, si } static nvlist_t * -make_vdev_raidz(char *path, char *aux, size_t size, uint64_t ashift, int r) +make_vdev_raidz(char *path, char *aux, char *pool, size_t size, + uint64_t ashift, int r) { nvlist_t *raidz, **child; int c; if (r < 2) - return (make_vdev_file(path, aux, size, ashift)); + return (make_vdev_file(path, aux, pool, size, ashift)); child = umem_alloc(r * sizeof (nvlist_t *), UMEM_NOFAIL); for (c = 0; c < r; c++) - child[c] = make_vdev_file(path, aux, size, ashift); + child[c] = make_vdev_file(path, aux, pool, size, ashift); VERIFY(nvlist_alloc(&raidz, NV_UNIQUE_NAME, 0) == 0); VERIFY(nvlist_add_string(raidz, ZPOOL_CONFIG_TYPE, @@ -869,19 +874,19 @@ make_vdev_raidz(char *path, char *aux, s } static nvlist_t * -make_vdev_mirror(char *path, char *aux, size_t size, uint64_t ashift, - int r, int m) +make_vdev_mirror(char *path, char *aux, char *pool, size_t size, + uint64_t ashift, int r, int m) { nvlist_t *mirror, **child; int c; if (m < 1) - return (make_vdev_raidz(path, aux, size, ashift, r)); + return (make_vdev_raidz(path, aux, pool, size, ashift, r)); child = umem_alloc(m * sizeof (nvlist_t *), UMEM_NOFAIL); for (c = 0; c < m; c++) - child[c] = make_vdev_raidz(path, aux, size, ashift, r); + child[c] = make_vdev_raidz(path, aux, pool, size, ashift, r); VERIFY(nvlist_alloc(&mirror, NV_UNIQUE_NAME, 0) == 0); VERIFY(nvlist_add_string(mirror, ZPOOL_CONFIG_TYPE, @@ -898,8 +903,8 @@ make_vdev_mirror(char *path, char *aux, } static nvlist_t * -make_vdev_root(char *path, char *aux, size_t size, uint64_t ashift, - int log, int r, int m, int t) +make_vdev_root(char *path, char *aux, char *pool, size_t size, uint64_t ashift, + int log, int r, int m, int t) { nvlist_t *root, **child; int c; @@ -909,7 +914,8 @@ make_vdev_root(char *path, char *aux, si child = umem_alloc(t * sizeof (nvlist_t *), UMEM_NOFAIL); for (c = 0; c < t; c++) { - child[c] = make_vdev_mirror(path, aux, size, ashift, r, m); + child[c] = make_vdev_mirror(path, aux, pool, size, ashift, + r, m); VERIFY(nvlist_add_uint64(child[c], ZPOOL_CONFIG_IS_LOG, log) == 0); } @@ -927,6 +933,27 @@ make_vdev_root(char *path, char *aux, si return (root); } +/* + * Find a random spa version. Returns back a random spa version in the + * range [initial_version, SPA_VERSION_FEATURES]. + */ +static uint64_t +ztest_random_spa_version(uint64_t initial_version) +{ + uint64_t version = initial_version; + + if (version <= SPA_VERSION_BEFORE_FEATURES) { + version = version + + ztest_random(SPA_VERSION_BEFORE_FEATURES - version + 1); + } + + if (version > SPA_VERSION_BEFORE_FEATURES) + version = SPA_VERSION_FEATURES; + + ASSERT(SPA_VERSION_IS_SUPPORTED(version)); + return (version); +} + static int ztest_random_blocksize(void) { @@ -1841,6 +1868,12 @@ ztest_get_data(void *arg, lr_write_t *lr DMU_READ_NO_PREFETCH); if (error == 0) { + blkptr_t *obp = dmu_buf_get_blkptr(db); + if (obp) { + ASSERT(BP_IS_HOLE(bp)); + *bp = *obp; + } + zgd->zgd_db = db; zgd->zgd_bp = bp; @@ -1986,6 +2019,9 @@ ztest_remove(ztest_ds_t *zd, ztest_od_t continue; } + /* + * No object was found. + */ if (od->od_object == 0) continue; @@ -2101,6 +2137,7 @@ ztest_prealloc(ztest_ds_t *zd, uint64_t static void ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset) { + int err; ztest_block_tag_t wbt; dmu_object_info_t doi; enum ztest_io_type io_type; @@ -2153,6 +2190,25 @@ ztest_io(ztest_ds_t *zd, uint64_t object case ZTEST_IO_SETATTR: (void) ztest_setattr(zd, object); break; + + case ZTEST_IO_REWRITE: + (void) rw_rdlock(&ztest_name_lock); + err = ztest_dsl_prop_set_uint64(zd->zd_name, + ZFS_PROP_CHECKSUM, spa_dedup_checksum(ztest_spa), + B_FALSE); + VERIFY(err == 0 || err == ENOSPC); + err = ztest_dsl_prop_set_uint64(zd->zd_name, + ZFS_PROP_COMPRESSION, + ztest_random_dsl_prop(ZFS_PROP_COMPRESSION), + B_FALSE); + VERIFY(err == 0 || err == ENOSPC); + (void) rw_unlock(&ztest_name_lock); + + VERIFY0(dmu_read(zd->zd_os, object, offset, blocksize, data, + DMU_READ_NO_PREFETCH)); + + (void) ztest_write(zd, object, offset, blocksize, data); + break; } (void) rw_unlock(&zd->zd_zilog_lock); @@ -2240,7 +2296,12 @@ ztest_zil_remount(ztest_ds_t *zd, uint64 { objset_t *os = zd->zd_os; - VERIFY(mutex_lock(&zd->zd_dirobj_lock) == 0); + /* + * We grab the zd_dirobj_lock to ensure that no other thread is + * updating the zil (i.e. adding in-memory log records) and the + * zd_zilog_lock to block any I/O. + */ + VERIFY0(mutex_lock(&zd->zd_dirobj_lock)); (void) rw_wrlock(&zd->zd_zilog_lock); /* zfsvfs_teardown() */ @@ -2269,7 +2330,7 @@ ztest_spa_create_destroy(ztest_ds_t *zd, /* * Attempt to create using a bad file. */ - nvroot = make_vdev_root("/dev/bogus", NULL, 0, 0, 0, 0, 0, 1); + nvroot = make_vdev_root("/dev/bogus", NULL, NULL, 0, 0, 0, 0, 0, 1); VERIFY3U(ENOENT, ==, spa_create("ztest_bad_file", nvroot, NULL, NULL, NULL)); nvlist_free(nvroot); @@ -2277,7 +2338,7 @@ ztest_spa_create_destroy(ztest_ds_t *zd, /* * Attempt to create using a bad mirror. */ - nvroot = make_vdev_root("/dev/bogus", NULL, 0, 0, 0, 0, 2, 1); + nvroot = make_vdev_root("/dev/bogus", NULL, NULL, 0, 0, 0, 0, 2, 1); VERIFY3U(ENOENT, ==, spa_create("ztest_bad_mirror", nvroot, NULL, NULL, NULL)); nvlist_free(nvroot); @@ -2287,7 +2348,7 @@ ztest_spa_create_destroy(ztest_ds_t *zd, * what's in the nvroot; we should fail with EEXIST. */ (void) rw_rdlock(&ztest_name_lock); - nvroot = make_vdev_root("/dev/bogus", NULL, 0, 0, 0, 0, 0, 1); + nvroot = make_vdev_root("/dev/bogus", NULL, NULL, 0, 0, 0, 0, 0, 1); VERIFY3U(EEXIST, ==, spa_create(zo->zo_pool, nvroot, NULL, NULL, NULL)); nvlist_free(nvroot); VERIFY3U(0, ==, spa_open(zo->zo_pool, &spa, FTAG)); @@ -2297,6 +2358,78 @@ ztest_spa_create_destroy(ztest_ds_t *zd, (void) rw_unlock(&ztest_name_lock); } +/* ARGSUSED */ +void +ztest_spa_upgrade(ztest_ds_t *zd, uint64_t id) +{ + spa_t *spa; + uint64_t initial_version = SPA_VERSION_INITIAL; + uint64_t version, newversion; + nvlist_t *nvroot, *props; + char *name; + + VERIFY0(mutex_lock(&ztest_vdev_lock)); + name = kmem_asprintf("%s_upgrade", ztest_opts.zo_pool); + + /* + * Clean up from previous runs. + */ + (void) spa_destroy(name); + + nvroot = make_vdev_root(NULL, NULL, name, ztest_opts.zo_vdev_size, 0, + 0, ztest_opts.zo_raidz, ztest_opts.zo_mirrors, 1); + + /* + * If we're configuring a RAIDZ device then make sure that the + * the initial version is capable of supporting that feature. + */ + switch (ztest_opts.zo_raidz_parity) { + case 0: + case 1: + initial_version = SPA_VERSION_INITIAL; + break; + case 2: + initial_version = SPA_VERSION_RAIDZ2; + break; + case 3: + initial_version = SPA_VERSION_RAIDZ3; + break; + } + + /* + * Create a pool with a spa version that can be upgraded. Pick + * a value between initial_version and SPA_VERSION_BEFORE_FEATURES. + */ + do { + version = ztest_random_spa_version(initial_version); + } while (version > SPA_VERSION_BEFORE_FEATURES); + + props = fnvlist_alloc(); + fnvlist_add_uint64(props, + zpool_prop_to_name(ZPOOL_PROP_VERSION), version); + VERIFY0(spa_create(name, nvroot, props, NULL, NULL)); + fnvlist_free(nvroot); + fnvlist_free(props); + + VERIFY0(spa_open(name, &spa, FTAG)); + VERIFY3U(spa_version(spa), ==, version); + newversion = ztest_random_spa_version(version + 1); + + if (ztest_opts.zo_verbose >= 4) { + (void) printf("upgrading spa version from %llu to %llu\n", + (u_longlong_t)version, (u_longlong_t)newversion); + } + + spa_upgrade(spa, newversion); + VERIFY3U(spa_version(spa), >, version); + VERIFY3U(spa_version(spa), ==, fnvlist_lookup_uint64(spa->spa_config, + zpool_prop_to_name(ZPOOL_PROP_VERSION))); + spa_close(spa, FTAG); + + strfree(name); + VERIFY0(mutex_unlock(&ztest_vdev_lock)); +} + static vdev_t * vdev_lookup_by_path(vdev_t *vd, const char *path) { @@ -2386,7 +2519,7 @@ ztest_vdev_add_remove(ztest_ds_t *zd, ui /* * Make 1/4 of the devices be log devices. */ - nvroot = make_vdev_root(NULL, NULL, + nvroot = make_vdev_root(NULL, NULL, NULL, ztest_opts.zo_vdev_size, 0, ztest_random(4) == 0, ztest_opts.zo_raidz, zs->zs_mirrors, 1); @@ -2463,7 +2596,7 @@ ztest_vdev_aux_add_remove(ztest_ds_t *zd /* * Add a new device. */ - nvlist_t *nvroot = make_vdev_root(NULL, aux, + nvlist_t *nvroot = make_vdev_root(NULL, aux, NULL, (ztest_opts.zo_vdev_size * 5) / 4, 0, 0, 0, 0, 1); error = spa_vdev_add(spa, nvroot); if (error != 0) @@ -2732,7 +2865,7 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, /* * Build the nvlist describing newpath. */ - root = make_vdev_root(newpath, NULL, newvd == NULL ? newsize : 0, + root = make_vdev_root(newpath, NULL, NULL, newvd == NULL ? newsize : 0, ashift, 0, 0, 0, 1); error = spa_vdev_attach(spa, oldguid, root, replacing); @@ -4827,8 +4960,8 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_ */ for (int i = 0; i < copies; i++) { uint64_t offset = i * blocksize; - VERIFY(dmu_buf_hold(os, object, offset, FTAG, &db, - DMU_READ_NO_PREFETCH) == 0); + VERIFY0(dmu_buf_hold(os, object, offset, FTAG, &db, + DMU_READ_NO_PREFETCH)); ASSERT(db->db_offset == offset); ASSERT(db->db_size == blocksize); ASSERT(ztest_pattern_match(db->db_data, db->db_size, pattern) || @@ -4844,8 +4977,8 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_ /* * Find out what block we got. */ - VERIFY(dmu_buf_hold(os, object, 0, FTAG, &db, - DMU_READ_NO_PREFETCH) == 0); + VERIFY0(dmu_buf_hold(os, object, 0, FTAG, &db, + DMU_READ_NO_PREFETCH)); blk = *((dmu_buf_impl_t *)db)->db_blkptr; dmu_buf_rele(db, FTAG); @@ -4900,7 +5033,7 @@ ztest_reguid(ztest_ds_t *zd, uint64_t id if (error != 0) return; - if (ztest_opts.zo_verbose >= 3) { + if (ztest_opts.zo_verbose >= 4) { (void) printf("Changed guid old %llu -> %llu\n", (u_longlong_t)orig, (u_longlong_t)spa_guid(spa)); } @@ -5523,6 +5656,8 @@ ztest_freeze(void) kernel_init(FREAD | FWRITE); VERIFY3U(0, ==, spa_open(ztest_opts.zo_pool, &spa, FTAG)); VERIFY3U(0, ==, ztest_dataset_open(0)); + spa->spa_debug = B_TRUE; + ztest_spa = spa; /* * Force the first log block to be transactionally allocated. @@ -5647,7 +5782,7 @@ ztest_init(ztest_shared_t *zs) ztest_shared->zs_vdev_next_leaf = 0; zs->zs_splits = 0; zs->zs_mirrors = ztest_opts.zo_mirrors; - nvroot = make_vdev_root(NULL, NULL, ztest_opts.zo_vdev_size, 0, + nvroot = make_vdev_root(NULL, NULL, NULL, ztest_opts.zo_vdev_size, 0, 0, ztest_opts.zo_raidz, zs->zs_mirrors, 1); props = make_random_props(); for (int i = 0; i < SPA_FEATURES; i++) { Modified: projects/counters/contrib/libc++/include/__config ============================================================================== --- projects/counters/contrib/libc++/include/__config Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/contrib/libc++/include/__config Wed Nov 28 17:34:17 2012 (r243653) @@ -51,6 +51,9 @@ # define _LIBCPP_LITTLE_ENDIAN 0 # define _LIBCPP_BIG_ENDIAN 1 # endif // _BYTE_ORDER == _LITTLE_ENDIAN +# ifndef __LONG_LONG_SUPPORTED +# define _LIBCPP_HAS_NO_LONG_LONG +# endif // __LONG_LONG_SUPPORTED #endif // __FreeBSD__ #ifdef _WIN32 Modified: projects/counters/contrib/libc++/include/cstdlib ============================================================================== --- projects/counters/contrib/libc++/include/cstdlib Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/contrib/libc++/include/cstdlib Wed Nov 28 17:34:17 2012 (r243653) @@ -97,18 +97,26 @@ _LIBCPP_BEGIN_NAMESPACE_STD using ::size_t; using ::div_t; using ::ldiv_t; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::lldiv_t; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::atof; using ::atoi; using ::atol; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::atoll; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::strtod; using ::strtof; using ::strtold; using ::strtol; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::strtoll; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::strtoul; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::strtoull; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::rand; using ::srand; using ::calloc; @@ -125,10 +133,14 @@ using ::bsearch; using ::qsort; using ::abs; using ::labs; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::llabs; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::div; using ::ldiv; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::lldiv; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::mblen; using ::mbtowc; using ::wctomb; @@ -145,10 +157,14 @@ using ::aligned_alloc; // MSVC already has the correct prototype in <stdlib.h.h> #ifdef __cplusplus #if !defined(_MSC_VER) && !defined(__sun__) inline _LIBCPP_INLINE_VISIBILITY long abs( long __x) _NOEXCEPT {return labs(__x);} +#ifndef _LIBCPP_HAS_NO_LONG_LONG inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT {return llabs(__x);} +#endif // _LIBCPP_HAS_NO_LONG_LONG inline _LIBCPP_INLINE_VISIBILITY ldiv_t div( long __x, long __y) _NOEXCEPT {return ldiv(__x, __y);} +#ifndef _LIBCPP_HAS_NO_LONG_LONG inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x, long long __y) _NOEXCEPT {return lldiv(__x, __y);} +#endif // _LIBCPP_HAS_NO_LONG_LONG #endif // _MSC_VER _LIBCPP_END_NAMESPACE_STD Modified: projects/counters/contrib/libc++/include/cwchar ============================================================================== --- projects/counters/contrib/libc++/include/cwchar Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/contrib/libc++/include/cwchar Wed Nov 28 17:34:17 2012 (r243653) @@ -151,9 +151,13 @@ using ::wcstof; using ::wcstold; #endif // _MSC_VER using ::wcstol; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::wcstoll; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::wcstoul; +#ifndef _LIBCPP_HAS_NO_LONG_LONG using ::wcstoull; +#endif // _LIBCPP_HAS_NO_LONG_LONG using ::wcscpy; using ::wcsncpy; using ::wcscat; Modified: projects/counters/contrib/sendmail/src/sasl.c ============================================================================== --- projects/counters/contrib/sendmail/src/sasl.c Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/contrib/sendmail/src/sasl.c Wed Nov 28 17:34:17 2012 (r243653) @@ -24,9 +24,15 @@ SM_RCSID("@(#)$Id: sasl.c,v 8.22 2006/08 ** using unsigned long: for portability, it should be size_t. */ -void *sm_sasl_malloc __P((unsigned long)); -static void *sm_sasl_calloc __P((unsigned long, unsigned long)); -static void *sm_sasl_realloc __P((void *, unsigned long)); +#if defined(SASL_VERSION_FULL) && SASL_VERSION_FULL >= 0x02011a +#define SM_SASL_SIZE_T size_t +#else /* defined(SASL_VERSION_FULL) && SASL_VERSION_FULL >= 0x02011a */ +#define SM_SASL_SIZE_T unsigned long +#endif /* defined(SASL_VERSION_FULL) && SASL_VERSION_FULL >= 0x02011a */ + +void *sm_sasl_malloc __P((SM_SASL_SIZE_T)); +static void *sm_sasl_calloc __P((SM_SASL_SIZE_T, SM_SASL_SIZE_T)); +static void *sm_sasl_realloc __P((void *, SM_SASL_SIZE_T)); void sm_sasl_free __P((void *)); /* @@ -50,7 +56,7 @@ void sm_sasl_free __P((void *)); void * sm_sasl_malloc(size) - unsigned long size; + SM_SASL_SIZE_T size; { return sm_malloc((size_t) size); } @@ -71,8 +77,8 @@ sm_sasl_malloc(size) static void * sm_sasl_calloc(nelem, elemsize) - unsigned long nelem; - unsigned long elemsize; + SM_SASL_SIZE_T nelem; + SM_SASL_SIZE_T elemsize; { size_t size; void *p; @@ -99,7 +105,7 @@ sm_sasl_calloc(nelem, elemsize) static void * sm_sasl_realloc(o, size) void *o; - unsigned long size; + SM_SASL_SIZE_T size; { return sm_realloc(o, (size_t) size); } Modified: projects/counters/etc/newsyslog.conf ============================================================================== --- projects/counters/etc/newsyslog.conf Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/etc/newsyslog.conf Wed Nov 28 17:34:17 2012 (r243653) @@ -35,5 +35,5 @@ /var/log/security 600 10 100 * JC /var/log/sendmail.st 640 10 * 168 B /var/log/utx.log 644 3 * @01T05 B -/var/log/weekly.log 640 5 1 $W6D0 JN +/var/log/weekly.log 640 5 * $W6D0 JN /var/log/xferlog 600 7 100 * JC Modified: projects/counters/lib/libc/sys/getpeername.2 ============================================================================== --- projects/counters/lib/libc/sys/getpeername.2 Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/lib/libc/sys/getpeername.2 Wed Nov 28 17:34:17 2012 (r243653) @@ -67,6 +67,10 @@ The argument is not a valid descriptor. .It Bq Er ECONNRESET The connection has been reset by the peer. +.It Bq Er EINVAL +The value of the +.Fa namelen +argument is not valid. .It Bq Er ENOTSOCK The argument .Fa s Modified: projects/counters/lib/libc/sys/getsockname.2 ============================================================================== --- projects/counters/lib/libc/sys/getsockname.2 Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/lib/libc/sys/getsockname.2 Wed Nov 28 17:34:17 2012 (r243653) @@ -66,6 +66,10 @@ The argument is not a valid descriptor. .It Bq Er ECONNRESET The connection has been reset by the peer. +.It Bq Er EINVAL +The value of the +.Fa namelen +argument is not valid. .It Bq Er ENOTSOCK The argument .Fa s Modified: projects/counters/share/man/man4/ktr.4 ============================================================================== --- projects/counters/share/man/man4/ktr.4 Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/share/man/man4/ktr.4 Wed Nov 28 17:34:17 2012 (r243653) @@ -53,7 +53,7 @@ The .Dv KTR_ENTRIES option sets the size of the buffer of events. The size of the buffer in the currently running kernel can be found via the -read-only sysctl +sysctl .Va debug.ktr.entries . By default the buffer contains 1024 entries. .Ss Event Masking Modified: projects/counters/share/man/man4/usb_quirk.4 ============================================================================== --- projects/counters/share/man/man4/usb_quirk.4 Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/share/man/man4/usb_quirk.4 Wed Nov 28 17:34:17 2012 (r243653) @@ -76,8 +76,6 @@ mouse sends an unknown leading byte mouse has Z-axis reversed .It UQ_NO_STRINGS string descriptors are broken -.It UQ_OPEN_CLEARSTALL -device needs clear endpoint stall .It UQ_POWER_CLAIM hub lies about power status .It UQ_SPUR_BUT_UP Modified: projects/counters/share/misc/committers-ports.dot ============================================================================== --- projects/counters/share/misc/committers-ports.dot Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/share/misc/committers-ports.dot Wed Nov 28 17:34:17 2012 (r243653) @@ -58,6 +58,7 @@ avilla [label="Alberto Villa\navilla@Fre avl [label="Alexander Logvinov\navl@FreeBSD.org\n2009/05/27"] az [label="Andrej Zverev\naz@FreeBSD.org\n2005/10/03"] bapt [label="Baptiste Daroussin\nbapt@FreeBSD.org\n2010/07/27"] +bar [label="Barbara Guida\nbar@FreeBSD.org\n2012/11/25"] bdrewery [label="Bryan Drewery\nbdrewery@FreeBSD.org\n2012/07/31"] beat [label="Beat Gaetzi\nbeat@FreeBSD.org\n2009/01/28"] beech [label="Beech Rintoul\nbeech@FreeBSD.org\n2007/05/30"] @@ -297,6 +298,7 @@ fjoe -> flo fjoe -> krion fjoe -> osa +flo -> bar flo -> jase flz -> garga @@ -437,6 +439,7 @@ philip -> koitsu rafan -> chinsan +rene -> bar rene -> crees rene -> jgh rene -> olivierd Modified: projects/counters/sys/arm/arm/cpufunc.c ============================================================================== --- projects/counters/sys/arm/arm/cpufunc.c Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/sys/arm/arm/cpufunc.c Wed Nov 28 17:34:17 2012 (r243653) @@ -74,7 +74,13 @@ __FBSDID("$FreeBSD$"); #include <arm/xscale/i80321/i80321var.h> #endif -#if defined(CPU_XSCALE_81342) +/* + * Some definitions in i81342reg.h clash with i80321reg.h. + * This only happens for the LINT kernel. As it happens, + * we don't need anything from i81342reg.h that we already + * got from somewhere else during a LINT compile. + */ +#if defined(CPU_XSCALE_81342) && !defined(COMPILING_LINT) #include <arm/xscale/i8134x/i81342reg.h> #endif Modified: projects/counters/sys/arm/arm/locore.S ============================================================================== --- projects/counters/sys/arm/arm/locore.S Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/sys/arm/arm/locore.S Wed Nov 28 17:34:17 2012 (r243653) @@ -181,7 +181,7 @@ Lunmapped: #if defined(CPU_ARM11) || defined(CPU_CORTEXA) || defined(CPU_MV_PJ4B) orr r0, r0, #CPU_CONTROL_V6_EXTPAGE #endif - orr r0, r0, #(CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE) + orr r0, r0, #(CPU_CONTROL_MMU_ENABLE) mcr p15, 0, r0, c1, c0, 0 nop nop Modified: projects/counters/sys/arm/arm/machdep.c ============================================================================== --- projects/counters/sys/arm/arm/machdep.c Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/sys/arm/arm/machdep.c Wed Nov 28 17:34:17 2012 (r243653) @@ -1038,18 +1038,6 @@ print_kenv(void) } static void -print_kernel_section_addr(void) -{ - - debugf("kernel image addresses:\n"); - debugf(" kernbase = 0x%08x\n", (uint32_t)kernbase); - debugf(" _etext (sdata) = 0x%08x\n", (uint32_t)_etext); - debugf(" _edata = 0x%08x\n", (uint32_t)_edata); - debugf(" __bss_start = 0x%08x\n", (uint32_t)__bss_start); - debugf(" _end = 0x%08x\n", (uint32_t)_end); -} - -static void physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz) { int i, j, cnt; @@ -1344,7 +1332,6 @@ initarm(struct arm_boot_params *abp) debugf(" arg1 kmdp = 0x%08x\n", (uint32_t)kmdp); debugf(" boothowto = 0x%08x\n", boothowto); debugf(" dtbp = 0x%08x\n", (uint32_t)dtbp); - print_kernel_section_addr(); print_kenv(); env = getenv("kernelname"); Modified: projects/counters/sys/arm/arm/mpcore_timer.c ============================================================================== --- projects/counters/sys/arm/arm/mpcore_timer.c Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/sys/arm/arm/mpcore_timer.c Wed Nov 28 17:34:17 2012 (r243653) @@ -128,7 +128,7 @@ static struct arm_tmr_softc *arm_tmr_sc static timecounter_get_t arm_tmr_get_timecount; static struct timecounter arm_tmr_timecount = { - .tc_name = "ARM MPCore Timecouter", + .tc_name = "ARM MPCore Timecounter", .tc_get_timecount = arm_tmr_get_timecount, .tc_poll_pps = NULL, .tc_counter_mask = ~0u, Modified: projects/counters/sys/arm/at91/files.at91 ============================================================================== --- projects/counters/sys/arm/at91/files.at91 Wed Nov 28 15:48:32 2012 (r243652) +++ projects/counters/sys/arm/at91/files.at91 Wed Nov 28 17:34:17 2012 (r243653) @@ -55,4 +55,3 @@ arm/at91/board_tsc4370.c optional at91_b dev/usb/controller/at91dci.c optional at91_dci dev/usb/controller/at91dci_atmelarm.c optional at91_dci dev/usb/controller/ohci_atmelarm.c optional ohci -dev/usb/controller/ehci_atmelarm.c optional ehci Copied: projects/counters/sys/arm/broadcom/bcm2835/bcm2835_gpio.c (from r243651, head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/counters/sys/arm/broadcom/bcm2835/bcm2835_gpio.c Wed Nov 28 17:34:17 2012 (r243653, copy of r243651, head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c) @@ -0,0 +1,656 @@ +/*- + * Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org> + * Copyright (c) 2012 Luiz Otavio O Souza. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/bus.h> + +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/rman.h> +#include <sys/lock.h> +#include <sys/mutex.h> +#include <sys/gpio.h> + +#include <machine/bus.h> +#include <machine/cpu.h> +#include <machine/cpufunc.h> +#include <machine/resource.h> +#include <machine/fdt.h> +#include <machine/frame.h> +#include <machine/intr.h> + +#include <dev/fdt/fdt_common.h> +#include <dev/ofw/ofw_bus.h> +#include <dev/ofw/ofw_bus_subr.h> + +#include "gpio_if.h" + +#undef DEBUG + +#ifdef DEBUG +#define dprintf(fmt, args...) do { printf("%s(): ", __func__); \ + printf(fmt,##args); } while (0) +#else +#define dprintf(fmt, args...) +#endif + +#define BCM_GPIO_PINS 54 +#define BCM_GPIO_DEFAULT_CAPS (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | \ + GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN) + +struct bcm_gpio_softc { + device_t sc_dev; + struct mtx sc_mtx; + struct resource * sc_mem_res; + struct resource * sc_irq_res; + bus_space_tag_t sc_bst; + bus_space_handle_t sc_bsh; + void * sc_intrhand; + int sc_gpio_npins; + int sc_ro_npins; + int sc_ro_pins[BCM_GPIO_PINS]; + struct gpio_pin sc_gpio_pins[BCM_GPIO_PINS]; +}; + +enum bcm_gpio_fsel { + BCM_GPIO_INPUT, + BCM_GPIO_OUTPUT, + BCM_GPIO_ALT5, + BCM_GPIO_ALT4, + BCM_GPIO_ALT0, + BCM_GPIO_ALT1, + BCM_GPIO_ALT2, + BCM_GPIO_ALT3, +}; + +enum bcm_gpio_pud { + BCM_GPIO_NONE, + BCM_GPIO_PULLDOWN, + BCM_GPIO_PULLUP, +}; + +#define BCM_GPIO_LOCK(_sc) mtx_lock(&_sc->sc_mtx) +#define BCM_GPIO_UNLOCK(_sc) mtx_unlock(&_sc->sc_mtx) + +#define BCM_GPIO_GPFSEL(_bank) 0x00 + _bank * 4 +#define BCM_GPIO_GPSET(_bank) 0x1c + _bank * 4 +#define BCM_GPIO_GPCLR(_bank) 0x28 + _bank * 4 +#define BCM_GPIO_GPLEV(_bank) 0x34 + _bank * 4 +#define BCM_GPIO_GPPUD(_bank) 0x94 +#define BCM_GPIO_GPPUDCLK(_bank) 0x98 + _bank * 4 + +#define BCM_GPIO_WRITE(_sc, _off, _val) \ + bus_space_write_4(_sc->sc_bst, _sc->sc_bsh, _off, _val) +#define BCM_GPIO_READ(_sc, _off) \ + bus_space_read_4(_sc->sc_bst, _sc->sc_bsh, _off) + +static int +bcm_gpio_pin_is_ro(struct bcm_gpio_softc *sc, int pin) +{ + int i; + + for (i = 0; i < sc->sc_ro_npins; i++) + if (pin == sc->sc_ro_pins[i]) + return (1); + return (0); +} + +static uint32_t +bcm_gpio_get_function(struct bcm_gpio_softc *sc, uint32_t pin) +{ + uint32_t bank, data, offset; + + /* Five banks, 10 pins per bank, 3 bits per pin. */ + bank = pin / 10; + offset = (pin - bank * 10) * 3; + + BCM_GPIO_LOCK(sc); + data = (BCM_GPIO_READ(sc, BCM_GPIO_GPFSEL(bank)) >> offset) & 7; + BCM_GPIO_UNLOCK(sc); + +#ifdef DEBUG + device_printf(sc->sc_dev, "pin %d function: ", pin); + switch (data) { + case BCM_GPIO_INPUT: + printf("input\n"); + break; + case BCM_GPIO_OUTPUT: + printf("output\n"); + break; + case BCM_GPIO_ALT0: + printf("alt0\n"); + break; + case BCM_GPIO_ALT1: + printf("alt1\n"); + break; + case BCM_GPIO_ALT2: + printf("alt2\n"); + break; + case BCM_GPIO_ALT3: + printf("alt3\n"); + break; + case BCM_GPIO_ALT4: + printf("alt4\n"); + break; + case BCM_GPIO_ALT5: + printf("alt5\n"); + break; + } +#endif + + switch (data) { + case BCM_GPIO_INPUT: + return (GPIO_PIN_INPUT); + case BCM_GPIO_OUTPUT: + return (GPIO_PIN_OUTPUT); + } + + return (0); +} + +static void +bcm_gpio_set_function(struct bcm_gpio_softc *sc, uint32_t pin, uint32_t f) +{ + uint32_t bank, data, offset; + + /* Five banks, 10 pins per bank, 3 bits per pin. */ + bank = pin / 10; + offset = (pin - bank * 10) * 3; + + BCM_GPIO_LOCK(sc); + data = BCM_GPIO_READ(sc, BCM_GPIO_GPFSEL(bank)); + data &= ~(7 << offset); + data |= (f << offset); + BCM_GPIO_WRITE(sc, BCM_GPIO_GPFSEL(bank), data); + BCM_GPIO_UNLOCK(sc); +} + +static void +bcm_gpio_set_pud(struct bcm_gpio_softc *sc, uint32_t pin, uint32_t state) +{ + uint32_t bank, offset; + + bank = pin / 32; + offset = pin - 32 * bank; + + BCM_GPIO_LOCK(sc); + BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUD(0), state); + DELAY(10); + BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUDCLK(bank), (1 << offset)); + DELAY(10); + BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUD(0), 0); + BCM_GPIO_WRITE(sc, BCM_GPIO_GPPUDCLK(bank), 0); + BCM_GPIO_UNLOCK(sc); +} + *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211281734.qASHYHwY097942>