From owner-svn-src-stable-8@FreeBSD.ORG Sun Jun 12 01:48:31 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 82991106564A; Sun, 12 Jun 2011 01:48:31 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 72AEB8FC0A; Sun, 12 Jun 2011 01:48:31 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5C1mVFL002919; Sun, 12 Jun 2011 01:48:31 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5C1mVk5002917; Sun, 12 Jun 2011 01:48:31 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201106120148.p5C1mVk5002917@svn.freebsd.org> From: Rick Macklem Date: Sun, 12 Jun 2011 01:48:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223002 - stable/8/sys/nfsclient X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 12 Jun 2011 01:48:31 -0000 Author: rmacklem Date: Sun Jun 12 01:48:31 2011 New Revision: 223002 URL: http://svn.freebsd.org/changeset/base/223002 Log: MFC: r222464 Add a check for MNTK_UNMOUNTF at the beginning of nfs_sync() in the old NFS client so that a forced dismount doesn't get stuck in the VFS_SYNC() call that happens before VFS_UNMOUNT() in dounmount(). Analagous to r222329 for the new NFS client. An additional change is needed before forced dismounts will work. Modified: stable/8/sys/nfsclient/nfs_vfsops.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/nfsclient/nfs_vfsops.c ============================================================================== --- stable/8/sys/nfsclient/nfs_vfsops.c Sun Jun 12 00:14:57 2011 (r223001) +++ stable/8/sys/nfsclient/nfs_vfsops.c Sun Jun 12 01:48:31 2011 (r223002) @@ -1406,10 +1406,20 @@ nfs_sync(struct mount *mp, int waitfor) td = curthread; + MNT_ILOCK(mp); + /* + * If a forced dismount is in progress, return from here so that + * the umount(2) syscall doesn't get stuck in VFS_SYNC() before + * calling VFS_UNMOUNT(). + */ + if ((mp->mnt_kern_flag & MNTK_UNMOUNTF) != 0) { + MNT_IUNLOCK(mp); + return (EBADF); + } + /* * Force stale buffer cache information to be flushed. */ - MNT_ILOCK(mp); loop: MNT_VNODE_FOREACH(vp, mp, mvp) { VI_LOCK(vp); From owner-svn-src-stable-8@FreeBSD.ORG Sun Jun 12 02:05:59 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CFFFC106564A; Sun, 12 Jun 2011 02:05:59 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 86FAF8FC0A; Sun, 12 Jun 2011 02:05:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5C25x9L003480; Sun, 12 Jun 2011 02:05:59 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5C25xoO003478; Sun, 12 Jun 2011 02:05:59 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201106120205.p5C25xoO003478@svn.freebsd.org> From: Rick Macklem Date: Sun, 12 Jun 2011 02:05:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223003 - stable/8/sbin/umount X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 12 Jun 2011 02:05:59 -0000 Author: rmacklem Date: Sun Jun 12 02:05:59 2011 New Revision: 223003 URL: http://svn.freebsd.org/changeset/base/223003 Log: MFC: r222466 Modify the umount(8) command so that it doesn't do a sync(2) syscall before unmount(2) for the "-f" case. This avoids a forced dismount from getting stuck for an NFS mountpoint in sync() when the server is not responsive. With this commit, forced dismounts should normally work for the NFS clients, but can take up to about 1minute to complete. Modified: stable/8/sbin/umount/umount.c Directory Properties: stable/8/sbin/umount/ (props changed) Modified: stable/8/sbin/umount/umount.c ============================================================================== --- stable/8/sbin/umount/umount.c Sun Jun 12 01:48:31 2011 (r223002) +++ stable/8/sbin/umount/umount.c Sun Jun 12 02:05:59 2011 (r223003) @@ -90,9 +90,6 @@ main(int argc, char *argv[]) struct statfs *mntbuf, *sfs; struct addrinfo hints; - /* Start disks transferring immediately. */ - sync(); - all = errs = 0; while ((ch = getopt(argc, argv, "AaF:fh:t:v")) != -1) switch (ch) { @@ -127,6 +124,10 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; + /* Start disks transferring immediately. */ + if ((fflag & MNT_FORCE) == 0) + sync(); + if ((argc == 0 && !all) || (argc != 0 && all)) usage(); From owner-svn-src-stable-8@FreeBSD.ORG Mon Jun 13 06:32:57 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 88A261065670; Mon, 13 Jun 2011 06:32:57 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 786E88FC2A; Mon, 13 Jun 2011 06:32:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5D6Wvtj059436; Mon, 13 Jun 2011 06:32:57 GMT (envelope-from davidxu@svn.freebsd.org) Received: (from davidxu@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5D6Wvh8059434; Mon, 13 Jun 2011 06:32:57 GMT (envelope-from davidxu@svn.freebsd.org) Message-Id: <201106130632.p5D6Wvh8059434@svn.freebsd.org> From: David Xu Date: Mon, 13 Jun 2011 06:32:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223037 - stable/8/sys/kern X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jun 2011 06:32:57 -0000 Author: davidxu Date: Mon Jun 13 06:32:56 2011 New Revision: 223037 URL: http://svn.freebsd.org/changeset/base/223037 Log: MFC r222802: Use p4prio_to_tsprio to calculate TS priority instead of using p4prio_to_rtpprio which is for RT priority. Modified: stable/8/sys/kern/ksched.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/kern/ksched.c ============================================================================== --- stable/8/sys/kern/ksched.c Mon Jun 13 05:34:08 2011 (r223036) +++ stable/8/sys/kern/ksched.c Mon Jun 13 06:32:56 2011 (r223037) @@ -202,7 +202,7 @@ ksched_setscheduler(struct ksched *ksche if (param->sched_priority >= 0 && param->sched_priority <= (PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE)) { rtp.type = RTP_PRIO_NORMAL; - rtp.prio = p4prio_to_rtpprio(param->sched_priority); + rtp.prio = p4prio_to_tsprio(param->sched_priority); rtp_to_pri(&rtp, td); } else e = EINVAL; From owner-svn-src-stable-8@FreeBSD.ORG Mon Jun 13 15:53:56 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 96502106564A; Mon, 13 Jun 2011 15:53:56 +0000 (UTC) (envelope-from jh@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 865D18FC08; Mon, 13 Jun 2011 15:53:56 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5DFrupC088854; Mon, 13 Jun 2011 15:53:56 GMT (envelope-from jh@svn.freebsd.org) Received: (from jh@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5DFru0q088851; Mon, 13 Jun 2011 15:53:56 GMT (envelope-from jh@svn.freebsd.org) Message-Id: <201106131553.p5DFru0q088851@svn.freebsd.org> From: Jaakko Heinonen Date: Mon, 13 Jun 2011 15:53:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223050 - stable/8/sys/kern X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jun 2011 15:53:56 -0000 Author: jh Date: Mon Jun 13 15:53:56 2011 New Revision: 223050 URL: http://svn.freebsd.org/changeset/base/223050 Log: MFC r219925: Recognize "ro", "rdonly", "norw", "rw" and "noro" as equal options in vfs_equalopts(). This allows vfs_sanitizeopts() to filter redundant occurrences of these options. It was possible that for example both "ro" and "rw" options became active concurrently. PR: kern/133614 MFC r220040: Fix some style issues in r219925. Modified: stable/8/sys/kern/vfs_mount.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/kern/vfs_mount.c ============================================================================== --- stable/8/sys/kern/vfs_mount.c Mon Jun 13 15:38:31 2011 (r223049) +++ stable/8/sys/kern/vfs_mount.c Mon Jun 13 15:53:56 2011 (r223050) @@ -192,6 +192,25 @@ vfs_deleteopt(struct vfsoptlist *opts, c } } +static int +vfs_isopt_ro(const char *opt) +{ + + if (strcmp(opt, "ro") == 0 || strcmp(opt, "rdonly") == 0 || + strcmp(opt, "norw") == 0) + return (1); + return (0); +} + +static int +vfs_isopt_rw(const char *opt) +{ + + if (strcmp(opt, "rw") == 0 || strcmp(opt, "noro") == 0) + return (1); + return (0); +} + /* * Check if options are equal (with or without the "no" prefix). */ @@ -220,6 +239,10 @@ vfs_equalopts(const char *opt1, const ch if (strncmp(opt2, "no", 2) == 0 && strcmp(opt1, opt2 + 2) == 0) return (1); } + /* "ro" / "rdonly" / "norw" / "rw" / "noro" */ + if ((vfs_isopt_ro(opt1) || vfs_isopt_rw(opt1)) && + (vfs_isopt_ro(opt2) || vfs_isopt_rw(opt2))) + return (1); return (0); } From owner-svn-src-stable-8@FreeBSD.ORG Mon Jun 13 19:33:13 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7EBC3106564A; Mon, 13 Jun 2011 19:33:13 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6C33C8FC08; Mon, 13 Jun 2011 19:33:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5DJXDX2095646; Mon, 13 Jun 2011 19:33:13 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5DJXDgW095638; Mon, 13 Jun 2011 19:33:13 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201106131933.p5DJXDgW095638@svn.freebsd.org> From: Konstantin Belousov Date: Mon, 13 Jun 2011 19:33:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223054 - in stable/8/sys: fs/nfsclient fs/nwfs fs/smbfs nfsclient vm X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jun 2011 19:33:13 -0000 Author: kib Date: Mon Jun 13 19:33:13 2011 New Revision: 223054 URL: http://svn.freebsd.org/changeset/base/223054 Log: MFC r222586: Fix an infinite loop in vm_object_page_clean() when the filesystem returns permanent errors for some page writes. To accomodate the stable/8 locking requirements, vm page queue lock is taken around the loop in vnode_pager_undirty_pages() which modifies m->dirty field. Reviewed by: alc Modified: stable/8/sys/fs/nfsclient/nfs_clbio.c stable/8/sys/fs/nwfs/nwfs_io.c stable/8/sys/fs/smbfs/smbfs_io.c stable/8/sys/nfsclient/nfs_bio.c stable/8/sys/vm/vm_object.c stable/8/sys/vm/vnode_pager.c stable/8/sys/vm/vnode_pager.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/fs/nfsclient/nfs_clbio.c ============================================================================== --- stable/8/sys/fs/nfsclient/nfs_clbio.c Mon Jun 13 18:27:09 2011 (r223053) +++ stable/8/sys/fs/nfsclient/nfs_clbio.c Mon Jun 13 19:33:13 2011 (r223054) @@ -298,7 +298,7 @@ ncl_putpages(struct vop_putpages_args *a } for (i = 0; i < npages; i++) - rtvals[i] = VM_PAGER_AGAIN; + rtvals[i] = VM_PAGER_ERROR; /* * When putting pages, do not extend file past EOF. @@ -341,16 +341,9 @@ ncl_putpages(struct vop_putpages_args *a pmap_qremove(kva, npages); relpbuf(bp, &ncl_pbuf_freecnt); - if (!error) { - int nwritten = round_page(count - uio.uio_resid) / PAGE_SIZE; - for (i = 0; i < nwritten; i++) { - rtvals[i] = VM_PAGER_OK; - vm_page_undirty(pages[i]); - } - if (must_commit) { - ncl_clearcommit(vp->v_mount); - } - } + vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid); + if (must_commit) + ncl_clearcommit(vp->v_mount); return rtvals[0]; } Modified: stable/8/sys/fs/nwfs/nwfs_io.c ============================================================================== --- stable/8/sys/fs/nwfs/nwfs_io.c Mon Jun 13 18:27:09 2011 (r223053) +++ stable/8/sys/fs/nwfs/nwfs_io.c Mon Jun 13 19:33:13 2011 (r223054) @@ -553,7 +553,7 @@ nwfs_putpages(ap) npages = btoc(count); for (i = 0; i < npages; i++) { - rtvals[i] = VM_PAGER_AGAIN; + rtvals[i] = VM_PAGER_ERROR; } bp = getpbuf(&nwfs_pbuf_freecnt); @@ -578,15 +578,8 @@ nwfs_putpages(ap) pmap_qremove(kva, npages); relpbuf(bp, &nwfs_pbuf_freecnt); - if (!error) { - int nwritten = round_page(count - uio.uio_resid) / PAGE_SIZE; - vm_page_lock_queues(); - for (i = 0; i < nwritten; i++) { - rtvals[i] = VM_PAGER_OK; - vm_page_undirty(pages[i]); - } - vm_page_unlock_queues(); - } + if (!error) + vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid); return rtvals[0]; #endif /* NWFS_RWCACHE */ } Modified: stable/8/sys/fs/smbfs/smbfs_io.c ============================================================================== --- stable/8/sys/fs/smbfs/smbfs_io.c Mon Jun 13 18:27:09 2011 (r223053) +++ stable/8/sys/fs/smbfs/smbfs_io.c Mon Jun 13 19:33:13 2011 (r223054) @@ -618,7 +618,7 @@ smbfs_putpages(ap) npages = btoc(count); for (i = 0; i < npages; i++) { - rtvals[i] = VM_PAGER_AGAIN; + rtvals[i] = VM_PAGER_ERROR; } bp = getpbuf(&smbfs_pbuf_freecnt); @@ -648,15 +648,8 @@ smbfs_putpages(ap) relpbuf(bp, &smbfs_pbuf_freecnt); - if (!error) { - int nwritten = round_page(count - uio.uio_resid) / PAGE_SIZE; - vm_page_lock_queues(); - for (i = 0; i < nwritten; i++) { - rtvals[i] = VM_PAGER_OK; - vm_page_undirty(pages[i]); - } - vm_page_unlock_queues(); - } + if (!error) + vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid); return rtvals[0]; #endif /* SMBFS_RWGENERIC */ } Modified: stable/8/sys/nfsclient/nfs_bio.c ============================================================================== --- stable/8/sys/nfsclient/nfs_bio.c Mon Jun 13 18:27:09 2011 (r223053) +++ stable/8/sys/nfsclient/nfs_bio.c Mon Jun 13 19:33:13 2011 (r223054) @@ -295,7 +295,7 @@ nfs_putpages(struct vop_putpages_args *a } for (i = 0; i < npages; i++) - rtvals[i] = VM_PAGER_AGAIN; + rtvals[i] = VM_PAGER_ERROR; /* * When putting pages, do not extend file past EOF. @@ -339,11 +339,7 @@ nfs_putpages(struct vop_putpages_args *a relpbuf(bp, &nfs_pbuf_freecnt); if (!error) { - int nwritten = round_page(count - uio.uio_resid) / PAGE_SIZE; - for (i = 0; i < nwritten; i++) { - rtvals[i] = VM_PAGER_OK; - vm_page_undirty(pages[i]); - } + vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid); if (must_commit) { nfs_clearcommit(vp->v_mount); } Modified: stable/8/sys/vm/vm_object.c ============================================================================== --- stable/8/sys/vm/vm_object.c Mon Jun 13 18:27:09 2011 (r223053) +++ stable/8/sys/vm/vm_object.c Mon Jun 13 19:33:13 2011 (r223054) @@ -843,6 +843,21 @@ rescan: flags, &clearobjflags); if (object->generation != curgeneration) goto rescan; + + /* + * If the VOP_PUTPAGES() did a truncated write, so + * that even the first page of the run is not fully + * written, vm_pageout_flush() returns 0 as the run + * length. Since the condition that caused truncated + * write may be permanent, e.g. exhausted free space, + * accepting n == 0 would cause an infinite loop. + * + * Forwarding the iterator leaves the unwritten page + * behind, but there is not much we can do there if + * filesystem refuses to write it. + */ + if (n == 0) + n = 1; np = vm_page_find_least(object, pi + n); } vm_page_unlock_queues(); Modified: stable/8/sys/vm/vnode_pager.c ============================================================================== --- stable/8/sys/vm/vnode_pager.c Mon Jun 13 18:27:09 2011 (r223053) +++ stable/8/sys/vm/vnode_pager.c Mon Jun 13 19:33:13 2011 (r223054) @@ -1080,7 +1080,7 @@ vnode_pager_generic_putpages(vp, m, byte count = bytecount / PAGE_SIZE; for (i = 0; i < count; i++) - rtvals[i] = VM_PAGER_AGAIN; + rtvals[i] = VM_PAGER_ERROR; if ((int64_t)m[0]->pindex < 0) { printf("vnode_pager_putpages: attempt to write meta-data!!! -- 0x%lx(%lx)\n", @@ -1171,3 +1171,22 @@ vnode_pager_generic_putpages(vp, m, byte } return rtvals[0]; } + +void +vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written) +{ + int i, pos; + + vm_page_lock_queues(); + for (i = 0, pos = 0; pos < written; i++, pos += PAGE_SIZE) { + if (pos < trunc_page(written)) { + rtvals[i] = VM_PAGER_OK; + vm_page_undirty(ma[i]); + } else { + /* Partially written page. */ + rtvals[i] = VM_PAGER_AGAIN; + vm_page_clear_dirty(ma[i], 0, written & PAGE_MASK); + } + } + vm_page_unlock_queues(); +} Modified: stable/8/sys/vm/vnode_pager.h ============================================================================== --- stable/8/sys/vm/vnode_pager.h Mon Jun 13 18:27:09 2011 (r223053) +++ stable/8/sys/vm/vnode_pager.h Mon Jun 13 19:33:13 2011 (r223054) @@ -49,5 +49,8 @@ int vnode_pager_generic_getpages(struct int vnode_pager_generic_putpages(struct vnode *vp, vm_page_t *m, int count, boolean_t sync, int *rtvals); + +void vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written); + #endif /* _KERNEL */ #endif /* _VNODE_PAGER_ */ From owner-svn-src-stable-8@FreeBSD.ORG Mon Jun 13 19:40:09 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 79E30106564A; Mon, 13 Jun 2011 19:40:09 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 691F68FC13; Mon, 13 Jun 2011 19:40:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5DJe9RS095886; Mon, 13 Jun 2011 19:40:09 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5DJe93A095884; Mon, 13 Jun 2011 19:40:09 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201106131940.p5DJe93A095884@svn.freebsd.org> From: Konstantin Belousov Date: Mon, 13 Jun 2011 19:40:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223055 - stable/8/sys/ufs/ffs X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jun 2011 19:40:09 -0000 Author: kib Date: Mon Jun 13 19:40:09 2011 New Revision: 223055 URL: http://svn.freebsd.org/changeset/base/223055 Log: Cherry-pick a single bit from r222958. Do not pass '3' as the sleepflag to bufobj_wwait() in the ffs_syncvnode(). It only mangles the priority argument of msleep(). Discussed with: jeff Modified: stable/8/sys/ufs/ffs/ffs_vnops.c Modified: stable/8/sys/ufs/ffs/ffs_vnops.c ============================================================================== --- stable/8/sys/ufs/ffs/ffs_vnops.c Mon Jun 13 19:33:13 2011 (r223054) +++ stable/8/sys/ufs/ffs/ffs_vnops.c Mon Jun 13 19:40:09 2011 (r223055) @@ -322,7 +322,7 @@ loop: } if (wait) { - bufobj_wwait(bo, 3, 0); + bufobj_wwait(bo, 0, 0); BO_UNLOCK(bo); /* From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 04:20:17 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B30641065705; Tue, 14 Jun 2011 04:20:17 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 97F108FC08; Tue, 14 Jun 2011 04:20:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5E4KHrB013072; Tue, 14 Jun 2011 04:20:17 GMT (envelope-from np@svn.freebsd.org) Received: (from np@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5E4KHQQ013066; Tue, 14 Jun 2011 04:20:17 GMT (envelope-from np@svn.freebsd.org) Message-Id: <201106140420.p5E4KHQQ013066@svn.freebsd.org> From: Navdeep Parhar Date: Tue, 14 Jun 2011 04:20:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223066 - stable/8/sys/dev/cxgbe X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 04:20:17 -0000 Author: np Date: Tue Jun 14 04:20:17 2011 New Revision: 223066 URL: http://svn.freebsd.org/changeset/base/223066 Log: MFC r222973: - driver ioctl to get SGE context for any given queue - sysctls to display the context id, cidx, and pidx of all kinds of queues. Modified: stable/8/sys/dev/cxgbe/adapter.h stable/8/sys/dev/cxgbe/t4_ioctl.h stable/8/sys/dev/cxgbe/t4_main.c stable/8/sys/dev/cxgbe/t4_sge.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/cxgbe/adapter.h ============================================================================== --- stable/8/sys/dev/cxgbe/adapter.h Tue Jun 14 04:02:30 2011 (r223065) +++ stable/8/sys/dev/cxgbe/adapter.h Tue Jun 14 04:20:17 2011 (r223066) @@ -307,7 +307,7 @@ struct sge_eq { uint16_t pidx; /* producer idx (desc idx) */ uint16_t pending; /* # of descriptors used since last doorbell */ uint16_t iqid; /* iq that gets egr_update for the eq */ - uint32_t cntxt_id; /* SGE context id for the eq */ + unsigned int cntxt_id; /* SGE context id for the eq */ }; struct sge_fl { Modified: stable/8/sys/dev/cxgbe/t4_ioctl.h ============================================================================== --- stable/8/sys/dev/cxgbe/t4_ioctl.h Tue Jun 14 04:02:30 2011 (r223065) +++ stable/8/sys/dev/cxgbe/t4_ioctl.h Tue Jun 14 04:20:17 2011 (r223066) @@ -46,6 +46,7 @@ enum { T4_GET_FILTER, /* get information about a filter */ T4_SET_FILTER, /* program a filter */ T4_DEL_FILTER, /* delete a filter */ + T4_GET_SGE_CONTEXT, /* get SGE context for a queue */ }; struct t4_reg { @@ -184,6 +185,20 @@ struct t4_filter { struct t4_filter_specification fs; }; +#define T4_SGE_CONTEXT_SIZE 24 +enum { + SGE_CONTEXT_EGRESS, + SGE_CONTEXT_INGRESS, + SGE_CONTEXT_FLM, + SGE_CONTEXT_CNM +}; + +struct t4_sge_context { + uint32_t mem_id; + uint32_t cid; + uint32_t data[T4_SGE_CONTEXT_SIZE / 4]; +}; + #define CHELSIO_T4_GETREG _IOWR('f', T4_GETREG, struct t4_reg) #define CHELSIO_T4_SETREG _IOW('f', T4_SETREG, struct t4_reg) #define CHELSIO_T4_REGDUMP _IOWR('f', T4_REGDUMP, struct t4_regdump) @@ -192,4 +207,6 @@ struct t4_filter { #define CHELSIO_T4_GET_FILTER _IOWR('f', T4_GET_FILTER, struct t4_filter) #define CHELSIO_T4_SET_FILTER _IOW('f', T4_SET_FILTER, struct t4_filter) #define CHELSIO_T4_DEL_FILTER _IOW('f', T4_DEL_FILTER, struct t4_filter) +#define CHELSIO_T4_GET_SGE_CONTEXT _IOWR('f', T4_GET_SGE_CONTEXT, \ + struct t4_sge_context) #endif Modified: stable/8/sys/dev/cxgbe/t4_main.c ============================================================================== --- stable/8/sys/dev/cxgbe/t4_main.c Tue Jun 14 04:02:30 2011 (r223065) +++ stable/8/sys/dev/cxgbe/t4_main.c Tue Jun 14 04:20:17 2011 (r223066) @@ -315,6 +315,7 @@ static void clear_filter(struct filter_e static int set_filter_wr(struct adapter *, int); static int del_filter_wr(struct adapter *, int); void filter_rpl(struct adapter *, const struct cpl_set_tcb_rpl *); +static int get_sge_context(struct adapter *, struct t4_sge_context *); static int t4_mod_event(module_t, int, void *); struct t4_pciids { @@ -3423,6 +3424,35 @@ filter_rpl(struct adapter *sc, const str } } +static int +get_sge_context(struct adapter *sc, struct t4_sge_context *cntxt) +{ + int rc = EINVAL; + + if (cntxt->cid > M_CTXTQID) + return (rc); + + if (cntxt->mem_id != CTXT_EGRESS && cntxt->mem_id != CTXT_INGRESS && + cntxt->mem_id != CTXT_FLM && cntxt->mem_id != CTXT_CNM) + return (rc); + + if (sc->flags & FW_OK) { + ADAPTER_LOCK(sc); /* Avoid parallel t4_wr_mbox */ + rc = -t4_sge_ctxt_rd(sc, sc->mbox, cntxt->cid, cntxt->mem_id, + &cntxt->data[0]); + ADAPTER_UNLOCK(sc); + } + + if (rc != 0) { + /* Read via firmware failed or wasn't even attempted */ + + rc = -t4_sge_ctxt_rd_bd(sc, cntxt->cid, cntxt->mem_id, + &cntxt->data[0]); + } + + return (rc); +} + int t4_os_find_pci_capability(struct adapter *sc, int cap) { @@ -3586,6 +3616,9 @@ t4_ioctl(struct cdev *dev, unsigned long rc = del_filter(sc, (struct t4_filter *)data); ADAPTER_UNLOCK(sc); break; + case CHELSIO_T4_GET_SGE_CONTEXT: + rc = get_sge_context(sc, (struct t4_sge_context *)data); + break; default: rc = EINVAL; } Modified: stable/8/sys/dev/cxgbe/t4_sge.c ============================================================================== --- stable/8/sys/dev/cxgbe/t4_sge.c Tue Jun 14 04:02:30 2011 (r223065) +++ stable/8/sys/dev/cxgbe/t4_sge.c Tue Jun 14 04:20:17 2011 (r223066) @@ -1368,6 +1368,12 @@ alloc_fwq(struct adapter *sc, int intr_i children = SYSCTL_CHILDREN(sc->oid_fwq); + SYSCTL_ADD_PROC(&sc->ctx, children, OID_AUTO, "abs_id", + CTLTYPE_INT | CTLFLAG_RD, &fwq->abs_id, 0, sysctl_uint16, "I", + "absolute id of the queue"); + SYSCTL_ADD_PROC(&sc->ctx, children, OID_AUTO, "cntxt_id", + CTLTYPE_INT | CTLFLAG_RD, &fwq->cntxt_id, 0, sysctl_uint16, "I", + "SGE context id of the queue"); SYSCTL_ADD_PROC(&sc->ctx, children, OID_AUTO, "cidx", CTLTYPE_INT | CTLFLAG_RD, &fwq->cidx, 0, sysctl_uint16, "I", "consumer index"); @@ -1418,6 +1424,12 @@ alloc_rxq(struct port_info *pi, struct s SYSCTL_ADD_PROC(&pi->ctx, children, OID_AUTO, "abs_id", CTLTYPE_INT | CTLFLAG_RD, &rxq->iq.abs_id, 0, sysctl_uint16, "I", "absolute id of the queue"); + SYSCTL_ADD_PROC(&pi->ctx, children, OID_AUTO, "cntxt_id", + CTLTYPE_INT | CTLFLAG_RD, &rxq->iq.cntxt_id, 0, sysctl_uint16, "I", + "SGE context id of the queue"); + SYSCTL_ADD_PROC(&pi->ctx, children, OID_AUTO, "cidx", + CTLTYPE_INT | CTLFLAG_RD, &rxq->iq.cidx, 0, sysctl_uint16, "I", + "consumer index"); #ifdef INET SYSCTL_ADD_INT(&pi->ctx, children, OID_AUTO, "lro_queued", CTLFLAG_RD, &rxq->lro.lro_queued, 0, NULL); @@ -1430,6 +1442,19 @@ alloc_rxq(struct port_info *pi, struct s CTLFLAG_RD, &rxq->vlan_extraction, "# of times hardware extracted 802.1Q tag"); + children = SYSCTL_CHILDREN(oid); + oid = SYSCTL_ADD_NODE(&pi->ctx, children, OID_AUTO, "fl", CTLFLAG_RD, + NULL, "freelist"); + children = SYSCTL_CHILDREN(oid); + + SYSCTL_ADD_PROC(&pi->ctx, children, OID_AUTO, "cntxt_id", + CTLTYPE_INT | CTLFLAG_RD, &rxq->fl.cntxt_id, 0, sysctl_uint16, "I", + "SGE context id of the queue"); + SYSCTL_ADD_UINT(&pi->ctx, children, OID_AUTO, "cidx", CTLFLAG_RD, + &rxq->fl.cidx, 0, "consumer index"); + SYSCTL_ADD_UINT(&pi->ctx, children, OID_AUTO, "pidx", CTLFLAG_RD, + &rxq->fl.pidx, 0, "producer index"); + return (rc); } @@ -1652,6 +1677,15 @@ alloc_txq(struct port_info *pi, struct s NULL, "tx queue"); children = SYSCTL_CHILDREN(oid); + SYSCTL_ADD_UINT(&pi->ctx, children, OID_AUTO, "cntxt_id", CTLFLAG_RD, + &eq->cntxt_id, 0, "SGE context id of the queue"); + SYSCTL_ADD_PROC(&pi->ctx, children, OID_AUTO, "cidx", + CTLTYPE_INT | CTLFLAG_RD, &eq->cidx, 0, sysctl_uint16, "I", + "consumer index"); + SYSCTL_ADD_PROC(&pi->ctx, children, OID_AUTO, "pidx", + CTLTYPE_INT | CTLFLAG_RD, &eq->pidx, 0, sysctl_uint16, "I", + "producer index"); + SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "txcsum", CTLFLAG_RD, &txq->txcsum, "# of times hardware assisted with checksum"); SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "vlan_insertion", From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 04:37:10 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5B6021065676; Tue, 14 Jun 2011 04:37:10 +0000 (UTC) (envelope-from ae@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 40F998FC17; Tue, 14 Jun 2011 04:37:10 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5E4bACM013729; Tue, 14 Jun 2011 04:37:10 GMT (envelope-from ae@svn.freebsd.org) Received: (from ae@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5E4bALJ013724; Tue, 14 Jun 2011 04:37:10 GMT (envelope-from ae@svn.freebsd.org) Message-Id: <201106140437.p5E4bALJ013724@svn.freebsd.org> From: "Andrey V. Elsukov" Date: Tue, 14 Jun 2011 04:37:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223070 - in stable/8: sbin/ipfw sys/netinet/ipfw X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 04:37:10 -0000 Author: ae Date: Tue Jun 14 04:37:09 2011 New Revision: 223070 URL: http://svn.freebsd.org/changeset/base/223070 Log: MFC r222473: Add tablearg support for ipfw setfib. PR: kern/156410 MFC r222474: Wrap long line. Modified: stable/8/sbin/ipfw/ipfw.8 stable/8/sbin/ipfw/ipfw2.c stable/8/sys/netinet/ipfw/ip_fw2.c stable/8/sys/netinet/ipfw/ip_fw_sockopt.c Directory Properties: stable/8/sbin/ipfw/ (props changed) stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sbin/ipfw/ipfw.8 ============================================================================== --- stable/8/sbin/ipfw/ipfw.8 Tue Jun 14 04:34:20 2011 (r223069) +++ stable/8/sbin/ipfw/ipfw.8 Tue Jun 14 04:37:09 2011 (r223070) @@ -1,7 +1,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 27, 2010 +.Dd May 30, 2011 .Dt IPFW 8 .Os .Sh NAME @@ -867,13 +867,16 @@ for more information on and .Cm ngtee actions. -.It Cm setfib Ar fibnum +.It Cm setfib Ar fibnum | tablearg The packet is tagged so as to use the FIB (routing table) .Ar fibnum in any subsequent forwarding decisions. Initially this is limited to the values 0 through 15, see .Xr setfib 1 . Processing continues at the next rule. +It is possible to use the +.Cm tablearg +keyword with a setfib. If tablearg value is not within compiled FIB range packet fib is set to 0. .It Cm reass Queue and reassemble ip fragments. If the packet is not fragmented, counters are updated and processing continues with the next rule. @@ -1697,7 +1700,7 @@ is used. The .Cm tablearg argument can be used with the following actions: -.Cm nat, pipe , queue, divert, tee, netgraph, ngtee, fwd, skipto +.Cm nat, pipe , queue, divert, tee, netgraph, ngtee, fwd, skipto, setfib, action parameters: .Cm tag, untag, rule options: Modified: stable/8/sbin/ipfw/ipfw2.c ============================================================================== --- stable/8/sbin/ipfw/ipfw2.c Tue Jun 14 04:34:20 2011 (r223069) +++ stable/8/sbin/ipfw/ipfw2.c Tue Jun 14 04:37:09 2011 (r223070) @@ -2826,14 +2826,19 @@ chkarg: size_t intsize = sizeof(int); action->opcode = O_SETFIB; - NEED1("missing fib number"); - action->arg1 = strtoul(*av, NULL, 10); - if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1) - errx(EX_DATAERR, "fibs not suported.\n"); - if (action->arg1 >= numfibs) /* Temporary */ - errx(EX_DATAERR, "fib too large.\n"); - av++; - break; + NEED1("missing fib number"); + if (_substrcmp(*av, "tablearg") == 0) { + action->arg1 = IP_FW_TABLEARG; + } else { + action->arg1 = strtoul(*av, NULL, 10); + if (sysctlbyname("net.fibs", &numfibs, &intsize, + NULL, 0) == -1) + errx(EX_DATAERR, "fibs not suported.\n"); + if (action->arg1 >= numfibs) /* Temporary */ + errx(EX_DATAERR, "fib too large.\n"); + } + av++; + break; } case TOK_REASS: Modified: stable/8/sys/netinet/ipfw/ip_fw2.c ============================================================================== --- stable/8/sys/netinet/ipfw/ip_fw2.c Tue Jun 14 04:34:20 2011 (r223069) +++ stable/8/sys/netinet/ipfw/ip_fw2.c Tue Jun 14 04:37:09 2011 (r223070) @@ -2101,14 +2101,21 @@ do { \ done = 1; /* exit outer loop */ break; - case O_SETFIB: + case O_SETFIB: { + uint32_t fib; + f->pcnt++; /* update stats */ f->bcnt += pktlen; f->timestamp = time_uptime; - M_SETFIB(m, cmd->arg1); - args->f_id.fib = cmd->arg1; + fib = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg: + cmd->arg1; + if (fib >= rt_numfibs) + fib = 0; + M_SETFIB(m, fib); + args->f_id.fib = fib; l = 0; /* exit inner loop */ break; + } case O_NAT: if (!IPFW_NAT_LOADED) { Modified: stable/8/sys/netinet/ipfw/ip_fw_sockopt.c ============================================================================== --- stable/8/sys/netinet/ipfw/ip_fw_sockopt.c Tue Jun 14 04:34:20 2011 (r223069) +++ stable/8/sys/netinet/ipfw/ip_fw_sockopt.c Tue Jun 14 04:37:09 2011 (r223070) @@ -605,7 +605,8 @@ check_ipfw_struct(struct ip_fw *rule, in case O_SETFIB: if (cmdlen != F_INSN_SIZE(ipfw_insn)) goto bad_size; - if (cmd->arg1 >= rt_numfibs) { + if ((cmd->arg1 != IP_FW_TABLEARG) && + (cmd->arg1 >= rt_numfibs)) { printf("ipfw: invalid fib number %d\n", cmd->arg1); return EINVAL; From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 10:49:18 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 85F5B106564A; Tue, 14 Jun 2011 10:49:18 +0000 (UTC) (envelope-from gjb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5CC378FC0C; Tue, 14 Jun 2011 10:49:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5EAnINr031221; Tue, 14 Jun 2011 10:49:18 GMT (envelope-from gjb@svn.freebsd.org) Received: (from gjb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5EAnINI031219; Tue, 14 Jun 2011 10:49:18 GMT (envelope-from gjb@svn.freebsd.org) Message-Id: <201106141049.p5EAnINI031219@svn.freebsd.org> From: Glen Barber Date: Tue, 14 Jun 2011 10:49:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223074 - in stable/8/sbin/geom/class: eli sched X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 10:49:18 -0000 Author: gjb (doc committer) Date: Tue Jun 14 10:49:18 2011 New Revision: 223074 URL: http://svn.freebsd.org/changeset/base/223074 Log: MFC 216147 [1], 219424 [2]: 216147 by delphij [1]: - Recommend a overwrite of whole geli provider before use. - Correct a typo. 219424 by pjd [2]: - Change example wording. PR: 155385 [2] Modified: stable/8/sbin/geom/class/eli/geli.8 Directory Properties: stable/8/sbin/geom/ (props changed) stable/8/sbin/geom/class/multipath/ (props changed) stable/8/sbin/geom/class/part/ (props changed) stable/8/sbin/geom/class/sched/gsched.8 (props changed) stable/8/sbin/geom/class/stripe/ (props changed) Modified: stable/8/sbin/geom/class/eli/geli.8 ============================================================================== --- stable/8/sbin/geom/class/eli/geli.8 Tue Jun 14 07:20:16 2011 (r223073) +++ stable/8/sbin/geom/class/eli/geli.8 Tue Jun 14 10:49:18 2011 (r223074) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 20, 2010 +.Dd March 9, 2011 .Dt GELI 8 .Os .Sh NAME @@ -694,15 +694,17 @@ Enter passphrase: .Ed .Pp Create an encrypted provider, but use two keys: -one for your girlfriend and one for -you (so there will be no tragedy if she forgets her passphrase): +one for your employee and one for you as company's security officer +(so there is no tragedy if the employee +.Qq accidentally +forgets his passphrase): .Bd -literal -offset indent # geli init /dev/da2 -Enter new passphrase: (enter your passphrase) +Enter new passphrase: (enter security officer passphrase) Reenter new passphrase: # geli setkey -n 1 /dev/da2 -Enter passphrase: (enter your passphrase) -Enter new passphrase: (let your girlfriend enter her passphrase ...) +Enter passphrase: (enter security officer passphrase) +Enter new passphrase: (let your employee enter his passphrase ...) Reenter new passphrase: (... twice) .Ed .Pp @@ -842,7 +844,7 @@ Enter passphrase: .Nm supports two encryption modes: .Nm XTS , -which was standarized as +which was standardized as .Nm IEE P1619 and .Nm CBC @@ -873,6 +875,10 @@ changes with the data he owns without no In other words .Nm will not protect your data against replay attacks. +.Pp +It is recommended to write the whole provider before the first use, +in order to make sure that all sectors and their corresponding +checksums are properly initialized into a consistent state. .Sh SEE ALSO .Xr crypto 4 , .Xr gbde 4 , From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 10:50:09 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 250EF106564A; Tue, 14 Jun 2011 10:50:09 +0000 (UTC) (envelope-from mm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0FF188FC1C; Tue, 14 Jun 2011 10:50:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5EAo1gh031287; Tue, 14 Jun 2011 10:50:01 GMT (envelope-from mm@svn.freebsd.org) Received: (from mm@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5EAo19s031284; Tue, 14 Jun 2011 10:50:01 GMT (envelope-from mm@svn.freebsd.org) Message-Id: <201106141050.p5EAo19s031284@svn.freebsd.org> From: Martin Matuska Date: Tue, 14 Jun 2011 10:50:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223075 - in stable/8/sys/cddl: compat/opensolaris/kern contrib/opensolaris/uts/common/fs/zfs X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 10:50:09 -0000 Author: mm Date: Tue Jun 14 10:50:01 2011 New Revision: 223075 URL: http://svn.freebsd.org/changeset/base/223075 Log: MFC 222343, 222518, 222835 MFC r222343 (pjd): Silence warnings about unsupoorted value types. MFC r222518 (pjd): Imagine situation where a security problem is found in setuid binary. User upgrades his system to fix the problem, but if he has any ZFS snapshots for the file system which contains problematic binary, any user can mount the snapshot and execute vulnerable binary. Prevent this from happening by always mounting snapshots with setuid turned off. MFC r222835: Silence notice on pool creation, import and access. Modified: stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_sysevent.c stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_history.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_sysevent.c ============================================================================== --- stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_sysevent.c Tue Jun 14 10:49:18 2011 (r223074) +++ stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_sysevent.c Tue Jun 14 10:50:01 2011 (r223075) @@ -113,8 +113,10 @@ sysevent_add_attr(sysevent_attr_list_t * } break; default: +#if 0 printf("%s: type %d is not implemented\n", __func__, se_value->value_type); +#endif break; } @@ -286,8 +288,10 @@ log_sysevent(sysevent_t *evp, int flag, break; } default: +#if 0 printf("%s: type %d is not implemented\n", __func__, nvpair_type(elem)); +#endif break; } } Modified: stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c ============================================================================== --- stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c Tue Jun 14 10:49:18 2011 (r223074) +++ stable/8/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c Tue Jun 14 10:50:01 2011 (r223075) @@ -172,6 +172,11 @@ mount_snapshot(kthread_t *td, vnode_t ** */ mp->mnt_flag |= MNT_RDONLY; /* + * We don't want snapshots to allow access to vulnerable setuid + * programs, so we turn off setuid when mounting snapshots. + */ + mp->mnt_flag |= MNT_NOSUID; + /* * We don't want snapshots to be visible in regular * mount(8) and df(1) output. */ Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_history.c ============================================================================== --- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_history.c Tue Jun 14 10:49:18 2011 (r223074) +++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_history.c Tue Jun 14 10:50:01 2011 (r223075) @@ -500,9 +500,11 @@ spa_history_log_version(spa_t *spa, hist utsname.nodename, utsname.release, utsname.version, utsname.machine); } +#if 0 cmn_err(CE_CONT, "!%s version %llu pool %s using %llu", event == LOG_POOL_IMPORT ? "imported" : event == LOG_POOL_CREATE ? "created" : "accessed", (u_longlong_t)current_vers, spa_name(spa), SPA_VERSION); #endif +#endif } From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 18:54:31 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F03691065670; Tue, 14 Jun 2011 18:54:31 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E031C8FC13; Tue, 14 Jun 2011 18:54:31 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5EIsVEE047361; Tue, 14 Jun 2011 18:54:31 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5EIsVBo047359; Tue, 14 Jun 2011 18:54:31 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201106141854.p5EIsVBo047359@svn.freebsd.org> From: John Baldwin Date: Tue, 14 Jun 2011 18:54:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223092 - stable/8/sys/kern X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 18:54:32 -0000 Author: jhb Date: Tue Jun 14 18:54:31 2011 New Revision: 223092 URL: http://svn.freebsd.org/changeset/base/223092 Log: MFC 222750: Clear the device_t pointer in 'struct resource' when releasing a device as otherwise the sysctl to export rman info can dereference a stale pointer. Modified: stable/8/sys/kern/subr_rman.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/kern/subr_rman.c ============================================================================== --- stable/8/sys/kern/subr_rman.c Tue Jun 14 18:19:48 2011 (r223091) +++ stable/8/sys/kern/subr_rman.c Tue Jun 14 18:54:31 2011 (r223092) @@ -677,6 +677,7 @@ int_rman_release_resource(struct rman *r * without freeing anything. */ r->r_flags &= ~RF_ALLOCATED; + r->r_dev = NULL; return 0; } From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 18:56:45 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E6C401065675; Tue, 14 Jun 2011 18:56:45 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D6CA18FC1A; Tue, 14 Jun 2011 18:56:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5EIujYf047535; Tue, 14 Jun 2011 18:56:45 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5EIujqf047533; Tue, 14 Jun 2011 18:56:45 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201106141856.p5EIujqf047533@svn.freebsd.org> From: John Baldwin Date: Tue, 14 Jun 2011 18:56:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223094 - stable/8/sys/kern X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 18:56:46 -0000 Author: jhb Date: Tue Jun 14 18:56:45 2011 New Revision: 223094 URL: http://svn.freebsd.org/changeset/base/223094 Log: MFC 222829: Log the socket address passed as the destination to sendto() and sendmsg() via ktrace. Modified: stable/8/sys/kern/uipc_syscalls.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/kern/uipc_syscalls.c ============================================================================== --- stable/8/sys/kern/uipc_syscalls.c Tue Jun 14 18:54:42 2011 (r223093) +++ stable/8/sys/kern/uipc_syscalls.c Tue Jun 14 18:56:45 2011 (r223094) @@ -747,6 +747,10 @@ kern_sendit(td, s, mp, flags, control, s return (error); so = (struct socket *)fp->f_data; +#ifdef KTRACE + if (mp->msg_name != NULL && KTRPOINT(td, KTR_STRUCT)) + ktrsockaddr(mp->msg_name); +#endif #ifdef MAC if (mp->msg_name != NULL) { error = mac_socket_check_connect(td->td_ucred, so, From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 18:58:57 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DE833106564A; Tue, 14 Jun 2011 18:58:57 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CDE2E8FC21; Tue, 14 Jun 2011 18:58:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5EIwvDu047641; Tue, 14 Jun 2011 18:58:57 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5EIwvvw047635; Tue, 14 Jun 2011 18:58:57 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201106141858.p5EIwvvw047635@svn.freebsd.org> From: John Baldwin Date: Tue, 14 Jun 2011 18:58:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223095 - in stable/8: contrib/top usr.bin/top X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 18:58:58 -0000 Author: jhb Date: Tue Jun 14 18:58:57 2011 New Revision: 223095 URL: http://svn.freebsd.org/changeset/base/223095 Log: MFC 222530: Add a new option to toggle the display of the system idle process (per-CPU idle threads). The process is displayed by default (subject to whether or not system processes are displayed) to preserve existing behavior. The system idle process can be hidden via the '-z' command line argument or the 'z' key while top is running. When it is hidden, top more closely matches the behavior of FreeBSD <= 4.x where idle time was not accounted to any process. Modified: stable/8/contrib/top/commands.c stable/8/contrib/top/machine.h stable/8/contrib/top/top.X stable/8/contrib/top/top.c stable/8/usr.bin/top/machine.c Directory Properties: stable/8/contrib/top/ (props changed) stable/8/contrib/top/install-sh (props changed) stable/8/usr.bin/top/ (props changed) Modified: stable/8/contrib/top/commands.c ============================================================================== --- stable/8/contrib/top/commands.c Tue Jun 14 18:56:45 2011 (r223094) +++ stable/8/contrib/top/commands.c Tue Jun 14 18:58:57 2011 (r223095) @@ -94,6 +94,7 @@ S - toggle the displaying of syste a - toggle the displaying of process titles\n\ t - toggle the display of this process\n\ u - display processes for only one user (+ selects all users)\n\ +z - toggle the displaying of the system idle process\n\ \n\ \n", stdout); } Modified: stable/8/contrib/top/machine.h ============================================================================== --- stable/8/contrib/top/machine.h Tue Jun 14 18:56:45 2011 (r223094) +++ stable/8/contrib/top/machine.h Tue Jun 14 18:58:57 2011 (r223095) @@ -65,6 +65,7 @@ struct process_select int uid; /* only this uid (unless uid == -1) */ int wcpu; /* show weighted cpu */ int jail; /* show jail ID */ + int kidle; /* show per-CPU idle threads */ char *command; /* only this command (unless == NULL) */ }; Modified: stable/8/contrib/top/top.X ============================================================================== --- stable/8/contrib/top/top.X Tue Jun 14 18:56:45 2011 (r223094) +++ stable/8/contrib/top/top.X Tue Jun 14 18:58:57 2011 (r223095) @@ -10,7 +10,7 @@ top \- display and update information ab .SH SYNOPSIS .B top [ -.B \-abCHIijnPqStuv +.B \-abCHIijnPqStuvz ] [ .BI \-d count ] [ @@ -146,6 +146,9 @@ Write version number information to stde No other processing takes place when this option is used. To see current revision information while top is running, use the help command \*(lq?\*(rq. .TP +.B \-z +Do not display the system idle process. +.TP .BI \-d count Show only .I count @@ -310,6 +313,9 @@ ID. Toggle the display of the .I top process. +.TP +.B z +Toggle the display of the system idle process. .SH "THE DISPLAY" The actual display varies depending on the specific variant of Unix that the machine is running. This description may not exactly match Modified: stable/8/contrib/top/top.c ============================================================================== --- stable/8/contrib/top/top.c Tue Jun 14 18:56:45 2011 (r223094) +++ stable/8/contrib/top/top.c Tue Jun 14 18:58:57 2011 (r223095) @@ -196,9 +196,9 @@ char *argv[]; fd_set readfds; #ifdef ORDER - static char command_chars[] = "\f qh?en#sdkriIutHmSCajo"; + static char command_chars[] = "\f qh?en#sdkriIutHmSCajzo"; #else - static char command_chars[] = "\f qh?en#sdkriIutHmSCaj"; + static char command_chars[] = "\f qh?en#sdkriIutHmSCajz"; #endif /* these defines enumerate the "strchr"s of the commands in command_chars */ #define CMD_redraw 0 @@ -224,8 +224,9 @@ char *argv[]; #define CMD_wcputog 19 #define CMD_showargs 20 #define CMD_jidtog 21 +#define CMD_kidletog 22 #ifdef ORDER -#define CMD_order 22 +#define CMD_order 23 #endif /* set the buffer for stdout */ @@ -258,6 +259,7 @@ char *argv[]; ps.thread = No; ps.wcpu = 1; ps.jail = No; + ps.kidle = Yes; ps.command = NULL; /* get preset options from the environment */ @@ -283,7 +285,7 @@ char *argv[]; optind = 1; } - while ((i = getopt(ac, av, "CSIHPabijnquvs:d:U:m:o:t")) != EOF) + while ((i = getopt(ac, av, "CSIHPabijnquvzs:d:U:m:o:t")) != EOF) { switch(i) { @@ -412,10 +414,14 @@ char *argv[]; pcpu_stats = Yes; break; + case 'z': + ps.kidle = !ps.kidle; + break; + default: fprintf(stderr, "Top version %s\n" -"Usage: %s [-abCHIijnPqStuv] [-d count] [-m io | cpu] [-o field] [-s time]\n" +"Usage: %s [-abCHIijnPqStuvz] [-d count] [-m io | cpu] [-o field] [-s time]\n" " [-U username] [number]\n", version_string(), myname); exit(1); @@ -1075,7 +1081,13 @@ restart: reset_display(); putchar('\r'); break; - + case CMD_kidletog: + ps.kidle = !ps.kidle; + new_message(MT_standout | MT_delayed, + " %sisplaying system idle process.", + ps.kidle ? "D" : "Not d"); + putchar('\r'); + break; default: new_message(MT_standout, " BAD CASE IN SWITCH!"); putchar('\r'); Modified: stable/8/usr.bin/top/machine.c ============================================================================== --- stable/8/usr.bin/top/machine.c Tue Jun 14 18:56:45 2011 (r223094) +++ stable/8/usr.bin/top/machine.c Tue Jun 14 18:58:57 2011 (r223095) @@ -624,6 +624,7 @@ get_process_info(struct system_info *si, int show_system; int show_uid; int show_command; + int show_kidle; /* * Save the previous process info. @@ -664,6 +665,7 @@ get_process_info(struct system_info *si, show_system = sel->system; show_uid = sel->uid != -1; show_command = sel->command != NULL; + show_kidle = sel->kidle; /* count up process states and get pointers to interesting procs */ total_procs = 0; @@ -705,6 +707,11 @@ get_process_info(struct system_info *si, /* skip idle or non-running processes */ continue; + if (displaymode == DISP_CPU && !show_kidle && + pp->ki_tdflags & TDF_IDLETD) + /* skip kernel idle process */ + continue; + if (displaymode == DISP_IO && !show_idle && p_io == 0) /* skip processes that aren't doing I/O */ continue; From owner-svn-src-stable-8@FreeBSD.ORG Tue Jun 14 20:04:23 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 970E7106566B; Tue, 14 Jun 2011 20:04:23 +0000 (UTC) (envelope-from jilles@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 83F5B8FC08; Tue, 14 Jun 2011 20:04:23 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5EK4NDk049677; Tue, 14 Jun 2011 20:04:23 GMT (envelope-from jilles@svn.freebsd.org) Received: (from jilles@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5EK4N6G049664; Tue, 14 Jun 2011 20:04:23 GMT (envelope-from jilles@svn.freebsd.org) Message-Id: <201106142004.p5EK4N6G049664@svn.freebsd.org> From: Jilles Tjoelker Date: Tue, 14 Jun 2011 20:04:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223096 - in stable/8/tools/regression/bin/sh: builtins execution expansion parameters parser X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2011 20:04:23 -0000 Author: jilles Date: Tue Jun 14 20:04:23 2011 New Revision: 223096 URL: http://svn.freebsd.org/changeset/base/223096 Log: MFC r221887,r222158,r222379,r222451,r222512,r222661,r222715,r222882: sh: New testcases that already work in stable/8. Added: stable/8/tools/regression/bin/sh/builtins/cd5.0 - copied unchanged from r222379, head/tools/regression/bin/sh/builtins/cd5.0 stable/8/tools/regression/bin/sh/builtins/set1.0 - copied unchanged from r222451, head/tools/regression/bin/sh/builtins/set1.0 stable/8/tools/regression/bin/sh/execution/set-n1.0 - copied unchanged from r222661, head/tools/regression/bin/sh/execution/set-n1.0 stable/8/tools/regression/bin/sh/execution/set-n2.0 - copied unchanged from r222661, head/tools/regression/bin/sh/execution/set-n2.0 stable/8/tools/regression/bin/sh/execution/set-n3.0 - copied unchanged from r222661, head/tools/regression/bin/sh/execution/set-n3.0 stable/8/tools/regression/bin/sh/execution/set-x1.0 - copied unchanged from r222882, head/tools/regression/bin/sh/execution/set-x1.0 stable/8/tools/regression/bin/sh/execution/set-x2.0 - copied unchanged from r222882, head/tools/regression/bin/sh/execution/set-x2.0 stable/8/tools/regression/bin/sh/expansion/heredoc1.0 - copied unchanged from r222715, head/tools/regression/bin/sh/expansion/heredoc1.0 stable/8/tools/regression/bin/sh/parameters/positional1.0 - copied unchanged from r222158, head/tools/regression/bin/sh/parameters/positional1.0 stable/8/tools/regression/bin/sh/parser/func2.0 - copied unchanged from r222512, head/tools/regression/bin/sh/parser/func2.0 stable/8/tools/regression/bin/sh/parser/func3.0 - copied unchanged from r222512, head/tools/regression/bin/sh/parser/func3.0 stable/8/tools/regression/bin/sh/parser/heredoc10.0 - copied unchanged from r221887, head/tools/regression/bin/sh/parser/heredoc10.0 stable/8/tools/regression/bin/sh/parser/heredoc9.0 - copied unchanged from r221887, head/tools/regression/bin/sh/parser/heredoc9.0 Modified: Directory Properties: stable/8/tools/regression/bin/sh/ (props changed) Copied: stable/8/tools/regression/bin/sh/builtins/cd5.0 (from r222379, head/tools/regression/bin/sh/builtins/cd5.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/builtins/cd5.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222379, head/tools/regression/bin/sh/builtins/cd5.0) @@ -0,0 +1,23 @@ +# $FreeBSD$ + +set -e +T=$(mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXX") +trap 'rm -rf "$T"' 0 + +cd -P "$T" +D=$(pwd) + +mkdir a a/1 b b/1 b/2 + +CDPATH=$D/a: +# Basic test. +cd 1 >/dev/null +[ "$(pwd)" = "$D/a/1" ] +# Test that the current directory is not checked before CDPATH. +cd "$D/b" +cd 1 >/dev/null +[ "$(pwd)" = "$D/a/1" ] +# Test not using a CDPATH entry. +cd "$D/b" +cd 2 +[ "$(pwd)" = "$D/b/2" ] Copied: stable/8/tools/regression/bin/sh/builtins/set1.0 (from r222451, head/tools/regression/bin/sh/builtins/set1.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/builtins/set1.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222451, head/tools/regression/bin/sh/builtins/set1.0) @@ -0,0 +1,32 @@ +# $FreeBSD$ + +set +C +set +f +set -e + +settings=$(set +o) +set -C +set -f +set +e +case $- in +*C*) ;; +*) echo missing C ;; +esac +case $- in +*f*) ;; +*) echo missing C ;; +esac +case $- in +*e*) echo bad e ;; +esac +eval "$settings" +case $- in +*C*) echo bad C ;; +esac +case $- in +*f*) echo bad f ;; +esac +case $- in +*e*) ;; +*) echo missing e ;; +esac Copied: stable/8/tools/regression/bin/sh/execution/set-n1.0 (from r222661, head/tools/regression/bin/sh/execution/set-n1.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/execution/set-n1.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222661, head/tools/regression/bin/sh/execution/set-n1.0) @@ -0,0 +1,7 @@ +# $FreeBSD$ + +v=$( ($SH -n <<'EOF' +for +EOF +) 2>&1 >/dev/null) +[ $? -ne 0 ] && [ -n "$v" ] Copied: stable/8/tools/regression/bin/sh/execution/set-n2.0 (from r222661, head/tools/regression/bin/sh/execution/set-n2.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/execution/set-n2.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222661, head/tools/regression/bin/sh/execution/set-n2.0) @@ -0,0 +1,5 @@ +# $FreeBSD$ + +$SH -n <<'EOF' +echo bad +EOF Copied: stable/8/tools/regression/bin/sh/execution/set-n3.0 (from r222661, head/tools/regression/bin/sh/execution/set-n3.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/execution/set-n3.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222661, head/tools/regression/bin/sh/execution/set-n3.0) @@ -0,0 +1,4 @@ +# $FreeBSD$ + +v=$( ($SH -nc 'for') 2>&1 >/dev/null) +[ $? -ne 0 ] && [ -n "$v" ] Copied: stable/8/tools/regression/bin/sh/execution/set-x1.0 (from r222882, head/tools/regression/bin/sh/execution/set-x1.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/execution/set-x1.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222882, head/tools/regression/bin/sh/execution/set-x1.0) @@ -0,0 +1,8 @@ +# $FreeBSD$ + +key='must_contain_this' +{ r=`set -x; { : "$key"; } 2>&1 >/dev/null`; } 2>/dev/null +case $r in +*"$key"*) true ;; +*) false ;; +esac Copied: stable/8/tools/regression/bin/sh/execution/set-x2.0 (from r222882, head/tools/regression/bin/sh/execution/set-x2.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/execution/set-x2.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222882, head/tools/regression/bin/sh/execution/set-x2.0) @@ -0,0 +1,9 @@ +# $FreeBSD$ + +key='must contain this' +PS4="$key+ " +{ r=`set -x; { :; } 2>&1 >/dev/null`; } 2>/dev/null +case $r in +*"$key"*) true ;; +*) false ;; +esac Copied: stable/8/tools/regression/bin/sh/expansion/heredoc1.0 (from r222715, head/tools/regression/bin/sh/expansion/heredoc1.0) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/tools/regression/bin/sh/expansion/heredoc1.0 Tue Jun 14 20:04:23 2011 (r223096, copy of r222715, head/tools/regression/bin/sh/expansion/heredoc1.0) @@ -0,0 +1,25 @@ +# $FreeBSD$ + +f() { return $1; } + +[ `f 42; { cat; } < Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7BCD2106564A; Wed, 15 Jun 2011 20:34:41 +0000 (UTC) (envelope-from trociny@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 317B48FC08; Wed, 15 Jun 2011 20:34:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5FKYfVS097297; Wed, 15 Jun 2011 20:34:41 GMT (envelope-from trociny@svn.freebsd.org) Received: (from trociny@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5FKYfFR097295; Wed, 15 Jun 2011 20:34:41 GMT (envelope-from trociny@svn.freebsd.org) Message-Id: <201106152034.p5FKYfFR097295@svn.freebsd.org> From: Mikolaj Golub Date: Wed, 15 Jun 2011 20:34:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223119 - stable/8/sys/kern X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 Jun 2011 20:34:41 -0000 Author: trociny Date: Wed Jun 15 20:34:40 2011 New Revision: 223119 URL: http://svn.freebsd.org/changeset/base/223119 Log: MFC r222454: In soreceive_generic(), if MSG_WAITALL is set but the request is larger than the receive buffer, we have to receive in sections. When notifying the protocol that some data has been drained the lock is released for a moment. Returning we block waiting for the rest of data. There is a race, when data could arrive while the lock was released and then the connection stalls in sbwait. Fix this by checking for data before blocking and skip blocking if there are some. PR: kern/154504 Reported by: Andrey Simonenko Tested by: Andrey Simonenko Reviewed by: rwatson Approved by: pjd (mentor) Modified: stable/8/sys/kern/uipc_socket.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/kern/uipc_socket.c ============================================================================== --- stable/8/sys/kern/uipc_socket.c Wed Jun 15 19:53:08 2011 (r223118) +++ stable/8/sys/kern/uipc_socket.c Wed Jun 15 20:34:40 2011 (r223119) @@ -1836,10 +1836,16 @@ dontblock: } SBLASTRECORDCHK(&so->so_rcv); SBLASTMBUFCHK(&so->so_rcv); - error = sbwait(&so->so_rcv); - if (error) { - SOCKBUF_UNLOCK(&so->so_rcv); - goto release; + /* + * We could receive some data while was notifying + * the protocol. Skip blocking in this case. + */ + if (so->so_rcv.sb_mb == NULL) { + error = sbwait(&so->so_rcv); + if (error) { + SOCKBUF_UNLOCK(&so->so_rcv); + goto release; + } } m = so->so_rcv.sb_mb; if (m != NULL) From owner-svn-src-stable-8@FreeBSD.ORG Thu Jun 16 01:52:43 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0AAD9106566B; Thu, 16 Jun 2011 01:52:43 +0000 (UTC) (envelope-from delphij@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D50198FC0C; Thu, 16 Jun 2011 01:52:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5G1qgCR007261; Thu, 16 Jun 2011 01:52:42 GMT (envelope-from delphij@svn.freebsd.org) Received: (from delphij@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5G1qggO007259; Thu, 16 Jun 2011 01:52:42 GMT (envelope-from delphij@svn.freebsd.org) Message-Id: <201106160152.p5G1qggO007259@svn.freebsd.org> From: Xin LI Date: Thu, 16 Jun 2011 01:52:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223134 - stable/8/sys/dev/atkbdc X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jun 2011 01:52:43 -0000 Author: delphij Date: Thu Jun 16 01:52:42 2011 New Revision: 223134 URL: http://svn.freebsd.org/changeset/base/223134 Log: MFC r222795 (jkim) + 222967: Validate INT 15h and 16h vectors more strictly. Traditionally these entry points are fixed addresses and (U)EFI CSM specification also mandated that. Unfortunately, (U)EFI CSM specification does not specifically mention this is to call service routine via interrupt vector table or to jump directly to the entry point. As a result, some CSM seems to install two routines and acts differently, depending on how it was executed, unfortunately. When INT 15h is used, it calls a function pointer (which is probably a UEFI service function). When it jumps directly to the entry point, it executes a simple and traditional INT 15h service routine. Therefore, actually there are two possible fixes, i. e., this fix or jumping directly to the fixed entry point. However, we chose this fix because a) keyboard typematic support via BIOS is becoming extremely rarer and b) we cannot support random service routine installed by a firmware or a boot loader. This should fix Lenovo X220 laptop, specifically. Modified: stable/8/sys/dev/atkbdc/atkbd.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/atkbdc/atkbd.c ============================================================================== --- stable/8/sys/dev/atkbdc/atkbd.c Wed Jun 15 23:56:40 2011 (r223133) +++ stable/8/sys/dev/atkbdc/atkbd.c Thu Jun 16 01:52:42 2011 (r223134) @@ -1097,7 +1097,17 @@ get_typematic(keyboard_t *kbd) x86regs_t regs; uint8_t *p; - if (x86bios_get_intr(0x15) == 0 || x86bios_get_intr(0x16) == 0) + /* + * Traditional entry points of int 0x15 and 0x16 are fixed + * and later BIOSes follow them. (U)EFI CSM specification + * also mandate these fixed entry points. + * + * Validate the entry points here before we proceed further. + * It's known that some recent laptops does not have the + * same entry point and hang on boot if we call it. + */ + if (x86bios_get_intr(0x15) != 0xf000f859 || + x86bios_get_intr(0x16) != 0xf000e82e) return (ENODEV); /* Is BIOS system configuration table supported? */ From owner-svn-src-stable-8@FreeBSD.ORG Thu Jun 16 19:32:00 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 677821065673; Thu, 16 Jun 2011 19:32:00 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 573F38FC0C; Thu, 16 Jun 2011 19:32:00 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5GJW0p5042842; Thu, 16 Jun 2011 19:32:00 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5GJW0Wq042840; Thu, 16 Jun 2011 19:32:00 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201106161932.p5GJW0Wq042840@svn.freebsd.org> From: Rick Macklem Date: Thu, 16 Jun 2011 19:32:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223157 - stable/8/sys/fs/nfsclient X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jun 2011 19:32:00 -0000 Author: rmacklem Date: Thu Jun 16 19:32:00 2011 New Revision: 223157 URL: http://svn.freebsd.org/changeset/base/223157 Log: MFC: r222540 Fix the new NFS client so that it doesn't do an NFSv3 Pathconf RPC for cases where the reply doesn't include the answer. This fixes a problem reported by avg@ where the NFSv3 Pathconf RPC would fail when "ls -l" did an lpathconf(2) for _PC_ACL_NFS4. Modified: stable/8/sys/fs/nfsclient/nfs_clvnops.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/fs/nfsclient/nfs_clvnops.c ============================================================================== --- stable/8/sys/fs/nfsclient/nfs_clvnops.c Thu Jun 16 18:00:27 2011 (r223156) +++ stable/8/sys/fs/nfsclient/nfs_clvnops.c Thu Jun 16 19:32:00 2011 (r223157) @@ -3283,7 +3283,13 @@ nfs_pathconf(struct vop_pathconf_args *a struct thread *td = curthread; int attrflag, error; - if (NFS_ISV34(vp)) { + if (NFS_ISV4(vp) || (NFS_ISV3(vp) && (ap->a_name == _PC_LINK_MAX || + ap->a_name == _PC_NAME_MAX || ap->a_name == _PC_CHOWN_RESTRICTED || + ap->a_name == _PC_NO_TRUNC))) { + /* + * Since only the above 4 a_names are returned by the NFSv3 + * Pathconf RPC, there is no point in doing it for others. + */ error = nfsrpc_pathconf(vp, &pc, td->td_ucred, td, &nfsva, &attrflag, NULL); if (attrflag != 0) @@ -3292,7 +3298,10 @@ nfs_pathconf(struct vop_pathconf_args *a if (error != 0) return (error); } else { - /* For NFSv2, just fake them. */ + /* + * For NFSv2 (or NFSv3 when not one of the above 4 a_names), + * just fake them. + */ pc.pc_linkmax = LINK_MAX; pc.pc_namemax = NFS_MAXNAMLEN; pc.pc_notrunc = 1; From owner-svn-src-stable-8@FreeBSD.ORG Thu Jun 16 19:47:56 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EDA16106570C; Thu, 16 Jun 2011 19:47:56 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DD46C8FC14; Thu, 16 Jun 2011 19:47:56 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5GJlu0S043401; Thu, 16 Jun 2011 19:47:56 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5GJlukN043399; Thu, 16 Jun 2011 19:47:56 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201106161947.p5GJlukN043399@svn.freebsd.org> From: Rick Macklem Date: Thu, 16 Jun 2011 19:47:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223159 - stable/8/sbin/umount X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jun 2011 19:47:57 -0000 Author: rmacklem Date: Thu Jun 16 19:47:56 2011 New Revision: 223159 URL: http://svn.freebsd.org/changeset/base/223159 Log: MFC: r222541 Add a sentence to the umount.8 man page to clarify the behaviour for forced dismount when used on an NFS mount point. This is a content change. Modified: stable/8/sbin/umount/umount.8 Directory Properties: stable/8/sbin/umount/ (props changed) Modified: stable/8/sbin/umount/umount.8 ============================================================================== --- stable/8/sbin/umount/umount.8 Thu Jun 16 19:42:03 2011 (r223158) +++ stable/8/sbin/umount/umount.8 Thu Jun 16 19:47:56 2011 (r223159) @@ -28,7 +28,7 @@ .\" @(#)umount.8 8.2 (Berkeley) 5/8/95 .\" $FreeBSD$ .\" -.Dd July 18, 2003 +.Dd May 31, 2011 .Dt UMOUNT 8 .Os .Sh NAME @@ -78,6 +78,9 @@ The file system is forcibly unmounted. Active special devices continue to work, but all other files return errors if further accesses are attempted. The root file system cannot be forcibly unmounted. +For NFS, a forced dismount can take up to 1 minute or more to +complete against an unresponsive server and may throw away +data not yet written to the server for this case. .It Fl h Ar host Only file systems mounted from the specified host will be unmounted. From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 05:55:41 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B7217106566C; Fri, 17 Jun 2011 05:55:41 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9CC038FC0A; Fri, 17 Jun 2011 05:55:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5H5tfLu062950; Fri, 17 Jun 2011 05:55:41 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5H5tfRU062946; Fri, 17 Jun 2011 05:55:41 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201106170555.p5H5tfRU062946@svn.freebsd.org> From: Alexander Motin Date: Fri, 17 Jun 2011 05:55:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223172 - stable/8/sys/geom X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 05:55:41 -0000 Author: mav Date: Fri Jun 17 05:55:41 2011 New Revision: 223172 URL: http://svn.freebsd.org/changeset/base/223172 Log: MFC r219950: Change BIO_GETATTR("GEOM::kerneldump") API to make set_dumper() called by consumer (geom_dev) instead of provider (geom_disk). This allows any geom insert it's code into the dump call chain, implementing more sophisticated functionality then just disk partitioning. Modified: stable/8/sys/geom/geom.h stable/8/sys/geom/geom_dev.c stable/8/sys/geom/geom_disk.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/geom/geom.h ============================================================================== --- stable/8/sys/geom/geom.h Fri Jun 17 05:30:12 2011 (r223171) +++ stable/8/sys/geom/geom.h Fri Jun 17 05:55:41 2011 (r223172) @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -304,6 +305,7 @@ extern struct sx topology_lock; struct g_kerneldump { off_t offset; off_t length; + struct dumperinfo di; }; MALLOC_DECLARE(M_GEOM); Modified: stable/8/sys/geom/geom_dev.c ============================================================================== --- stable/8/sys/geom/geom_dev.c Fri Jun 17 05:30:12 2011 (r223171) +++ stable/8/sys/geom/geom_dev.c Fri Jun 17 05:55:41 2011 (r223172) @@ -281,8 +281,11 @@ g_dev_ioctl(struct cdev *dev, u_long cmd kd.length = OFF_MAX; i = sizeof kd; error = g_io_getattr("GEOM::kerneldump", cp, &i, &kd); - if (!error) - dev->si_flags |= SI_DUMPDEV; + if (!error) { + error = set_dumper(&kd.di); + if (!error) + dev->si_flags |= SI_DUMPDEV; + } break; case DIOCGFLUSH: error = g_io_flush(cp); Modified: stable/8/sys/geom/geom_disk.c ============================================================================== --- stable/8/sys/geom/geom_disk.c Fri Jun 17 05:30:12 2011 (r223171) +++ stable/8/sys/geom/geom_disk.c Fri Jun 17 05:55:41 2011 (r223172) @@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -169,10 +168,8 @@ g_disk_access(struct g_provider *pp, int static void g_disk_kerneldump(struct bio *bp, struct disk *dp) -{ - int error; +{ struct g_kerneldump *gkd; - struct dumperinfo di; struct g_geom *gp; gkd = (struct g_kerneldump*)bp->bio_data; @@ -183,16 +180,15 @@ g_disk_kerneldump(struct bio *bp, struct g_io_deliver(bp, ENODEV); return; } - di.dumper = dp->d_dump; - di.priv = dp; - di.blocksize = dp->d_sectorsize; - di.maxiosize = dp->d_maxsize; - di.mediaoffset = gkd->offset; + gkd->di.dumper = dp->d_dump; + gkd->di.priv = dp; + gkd->di.blocksize = dp->d_sectorsize; + gkd->di.maxiosize = dp->d_maxsize; + gkd->di.mediaoffset = gkd->offset; if ((gkd->offset + gkd->length) > dp->d_mediasize) gkd->length = dp->d_mediasize - gkd->offset; - di.mediasize = gkd->length; - error = set_dumper(&di); - g_io_deliver(bp, error); + gkd->di.mediasize = gkd->length; + g_io_deliver(bp, 0); } static void From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 06:17:45 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EAAED1065672; Fri, 17 Jun 2011 06:17:45 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DA6BC8FC18; Fri, 17 Jun 2011 06:17:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5H6HjDE063746; Fri, 17 Jun 2011 06:17:45 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5H6HjBV063744; Fri, 17 Jun 2011 06:17:45 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201106170617.p5H6HjBV063744@svn.freebsd.org> From: Alexander Motin Date: Fri, 17 Jun 2011 06:17:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223174 - stable/8/sys/dev/led X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 06:17:46 -0000 Author: mav Date: Fri Jun 17 06:17:45 2011 New Revision: 223174 URL: http://svn.freebsd.org/changeset/base/223174 Log: MFC r212371 (by mdf): Fix an incorrect use of sbuf_overflowed() after a call to sbuf_finish(). Modified: stable/8/sys/dev/led/led.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/led/led.c ============================================================================== --- stable/8/sys/dev/led/led.c Fri Jun 17 06:12:28 2011 (r223173) +++ stable/8/sys/dev/led/led.c Fri Jun 17 06:17:45 2011 (r223174) @@ -220,15 +220,11 @@ led_write(struct cdev *dev, struct uio * free(s2, M_DEVBUF); return (EINVAL); } - sbuf_finish(sb); + error = sbuf_finish(sb); free(s2, M_DEVBUF); - if (sbuf_overflowed(sb)) { + if (error != 0 || sbuf_len(sb) == 0) { sbuf_delete(sb); - return (ENOMEM); - } - if (sbuf_len(sb) == 0) { - sbuf_delete(sb); - return (0); + return (error); } return (led_state(dev, sb, 0)); From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 06:19:24 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3DEE0106566B; Fri, 17 Jun 2011 06:19:24 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2CABD8FC16; Fri, 17 Jun 2011 06:19:24 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5H6JO4F063838; Fri, 17 Jun 2011 06:19:24 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5H6JOgd063835; Fri, 17 Jun 2011 06:19:24 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201106170619.p5H6JOgd063835@svn.freebsd.org> From: Alexander Motin Date: Fri, 17 Jun 2011 06:19:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223175 - stable/8/sys/dev/led X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 06:19:24 -0000 Author: mav Date: Fri Jun 17 06:19:23 2011 New Revision: 223175 URL: http://svn.freebsd.org/changeset/base/223175 Log: MFC r219951: Add simple in-kernel API for controlling leds. Modified: stable/8/sys/dev/led/led.c stable/8/sys/dev/led/led.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/led/led.c ============================================================================== --- stable/8/sys/dev/led/led.c Fri Jun 17 06:17:45 2011 (r223174) +++ stable/8/sys/dev/led/led.c Fri Jun 17 06:19:23 2011 (r223175) @@ -26,6 +26,7 @@ __FBSDID("$FreeBSD$"); struct ledsc { LIST_ENTRY(ledsc) list; + char *name; void *private; int unit; led_t *func; @@ -83,71 +84,43 @@ led_timeout(void *p) } static int -led_state(struct cdev *dev, struct sbuf *sb, int state) +led_state(struct ledsc *sc, struct sbuf **sb, int state) { struct sbuf *sb2 = NULL; - struct ledsc *sc; - mtx_lock(&led_mtx); - sc = dev->si_drv1; - if (sc != NULL) { - sb2 = sc->spec; - sc->spec = sb; - if (sb != NULL) { - sc->str = sbuf_data(sb); - sc->ptr = sc->str; - } else { - sc->str = NULL; - sc->ptr = NULL; - sc->func(sc->private, state); - } - sc->count = 0; + sb2 = sc->spec; + sc->spec = *sb; + if (*sb != NULL) { + sc->str = sbuf_data(*sb); + sc->ptr = sc->str; + } else { + sc->str = NULL; + sc->ptr = NULL; + sc->func(sc->private, state); } - mtx_unlock(&led_mtx); - if (sb2 != NULL) - sbuf_delete(sb2); - if (sc == NULL) - return (ENXIO); + sc->count = 0; + *sb = sb2; return(0); } static int -led_write(struct cdev *dev, struct uio *uio, int ioflag) +led_parse(const char *s, struct sbuf **sb, int *state) { - int error; - char *s, *s2; - struct sbuf *sb = NULL; - int i; - - if (dev->si_drv1 == NULL) - return (ENXIO); - - if (uio->uio_resid > 512) - return (EINVAL); - s2 = s = malloc(uio->uio_resid + 1, M_DEVBUF, M_WAITOK); - s[uio->uio_resid] = '\0'; - error = uiomove(s, uio->uio_resid, uio); - if (error) { - free(s2, M_DEVBUF); - return (error); - } + int i, error; /* * Handle "on" and "off" immediately so people can flash really * fast from userland if they want to */ if (*s == '0' || *s == '1') { - error = led_state(dev, NULL, *s & 1); - free(s2, M_DEVBUF); - return(error); + *state = *s & 1; + return (0); } - sb = sbuf_new_auto(); - if (sb == NULL) { - free(s2, M_DEVBUF); + *state = 0; + *sb = sbuf_new_auto(); + if (*sb == NULL) return (ENOMEM); - } - switch(s[0]) { /* * Flash, default is 100msec/100msec. @@ -158,7 +131,7 @@ led_write(struct cdev *dev, struct uio * i = s[1] - '1'; else i = 0; - sbuf_printf(sb, "%c%c", 'A' + i, 'a' + i); + sbuf_printf(*sb, "%c%c", 'A' + i, 'a' + i); break; /* * Digits, flashes out numbers. @@ -172,10 +145,10 @@ led_write(struct cdev *dev, struct uio * if (i == 0) i = 10; for (; i > 1; i--) - sbuf_cat(sb, "Aa"); - sbuf_cat(sb, "Aj"); + sbuf_cat(*sb, "Aa"); + sbuf_cat(*sb, "Aj"); } - sbuf_cat(sb, "jj"); + sbuf_cat(*sb, "jj"); break; /* * String, roll your own. @@ -190,7 +163,7 @@ led_write(struct cdev *dev, struct uio * (*s >= 'A' && *s <= 'J') || *s == 'U' || *s <= 'u' || *s == '.') - sbuf_bcat(sb, s, 1); + sbuf_bcat(*sb, s, 1); } break; /* @@ -205,29 +178,82 @@ led_write(struct cdev *dev, struct uio * case 'm': for(s++; *s; s++) { if (*s == '.') - sbuf_cat(sb, "aA"); + sbuf_cat(*sb, "aA"); else if (*s == '-') - sbuf_cat(sb, "aC"); + sbuf_cat(*sb, "aC"); else if (*s == ' ') - sbuf_cat(sb, "b"); + sbuf_cat(*sb, "b"); else if (*s == '\n') - sbuf_cat(sb, "d"); + sbuf_cat(*sb, "d"); } - sbuf_cat(sb, "j"); + sbuf_cat(*sb, "j"); break; default: - sbuf_delete(sb); - free(s2, M_DEVBUF); + sbuf_delete(*sb); return (EINVAL); } - error = sbuf_finish(sb); - free(s2, M_DEVBUF); - if (error != 0 || sbuf_len(sb) == 0) { - sbuf_delete(sb); + error = sbuf_finish(*sb); + if (error != 0 || sbuf_len(*sb) == 0) { + *sb = NULL; + return (error); + } + return (0); +} + +static int +led_write(struct cdev *dev, struct uio *uio, int ioflag) +{ + struct ledsc *sc; + char *s; + struct sbuf *sb = NULL; + int error, state = 0; + + if (uio->uio_resid > 512) + return (EINVAL); + s = malloc(uio->uio_resid + 1, M_DEVBUF, M_WAITOK); + s[uio->uio_resid] = '\0'; + error = uiomove(s, uio->uio_resid, uio); + if (error) { + free(s, M_DEVBUF); return (error); } + error = led_parse(s, &sb, &state); + free(s, M_DEVBUF); + if (error) + return (error); + mtx_lock(&led_mtx); + sc = dev->si_drv1; + if (sc != NULL) + error = led_state(sc, &sb, state); + mtx_unlock(&led_mtx); + if (sb != NULL) + sbuf_delete(sb); + return (error); +} - return (led_state(dev, sb, 0)); +int +led_set(char const *name, char const *cmd) +{ + struct ledsc *sc; + struct sbuf *sb = NULL; + int error, state = 0; + + error = led_parse(cmd, &sb, &state); + if (error) + return (error); + mtx_lock(&led_mtx); + LIST_FOREACH(sc, &led_list, list) { + if (strcmp(sc->name, name) == 0) + break; + } + if (sc != NULL) + error = led_state(sc, &sb, state); + else + error = ENOENT; + mtx_unlock(&led_mtx); + if (sb != NULL) + sbuf_delete(sb); + return (0); } static struct cdevsw led_cdevsw = { @@ -250,6 +276,7 @@ led_create_state(led_t *func, void *priv sc = malloc(sizeof *sc, M_LED, M_WAITOK | M_ZERO); sx_xlock(&led_sx); + sc->name = strdup(name, M_LED); sc->unit = alloc_unr(led_unit); sc->private = priv; sc->func = func; @@ -287,6 +314,7 @@ led_destroy(struct cdev *dev) destroy_dev(dev); if (sc->spec != NULL) sbuf_delete(sc->spec); + free(sc->name, M_LED); free(sc, M_LED); sx_xunlock(&led_sx); } Modified: stable/8/sys/dev/led/led.h ============================================================================== --- stable/8/sys/dev/led/led.h Fri Jun 17 06:17:45 2011 (r223174) +++ stable/8/sys/dev/led/led.h Fri Jun 17 06:19:23 2011 (r223175) @@ -18,4 +18,6 @@ struct cdev *led_create_state(led_t *, v struct cdev *led_create(led_t *, void *, char const *); void led_destroy(struct cdev *); +int led_set(char const *, char const *); + #endif From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 06:23:58 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id ADABB106566C; Fri, 17 Jun 2011 06:23:58 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9CB498FC13; Fri, 17 Jun 2011 06:23:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5H6Nwi6064041; Fri, 17 Jun 2011 06:23:58 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5H6NwrB064038; Fri, 17 Jun 2011 06:23:58 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201106170623.p5H6NwrB064038@svn.freebsd.org> From: Alexander Motin Date: Fri, 17 Jun 2011 06:23:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223176 - stable/8/sys/geom X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 06:23:58 -0000 Author: mav Date: Fri Jun 17 06:23:58 2011 New Revision: 223176 URL: http://svn.freebsd.org/changeset/base/223176 Log: MFC r219970: Introduce new type of BIO_GETATTR -- GEOM::setstate, used to inform lower GEOM about state of it's providers from the point of upper layers. Make geom_disk use led(4) subsystem to illuminate states in such fashion: FAILED - "1" (on), REBUILD - "f5" (slow blink), RESYNC - "f1" (fast blink), ACTIVE - "0" (off). LED name should be set for each disk via kern.geom.disk.%s.led sysctl. Modified: stable/8/sys/geom/geom.h stable/8/sys/geom/geom_disk.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/geom/geom.h ============================================================================== --- stable/8/sys/geom/geom.h Fri Jun 17 06:19:23 2011 (r223175) +++ stable/8/sys/geom/geom.h Fri Jun 17 06:23:58 2011 (r223176) @@ -208,6 +208,12 @@ struct g_classifier_hook { void *arg; }; +/* BIO_GETATTR("GEOM::setstate") argument values. */ +#define G_STATE_FAILED 0 +#define G_STATE_REBUILD 1 +#define G_STATE_RESYNC 2 +#define G_STATE_ACTIVE 3 + /* geom_dev.c */ struct cdev; void g_dev_print(void); Modified: stable/8/sys/geom/geom_disk.c ============================================================================== --- stable/8/sys/geom/geom_disk.c Fri Jun 17 06:19:23 2011 (r223175) +++ stable/8/sys/geom/geom_disk.c Fri Jun 17 06:23:58 2011 (r223176) @@ -56,6 +56,16 @@ __FBSDID("$FreeBSD$"); #include #include +#include + +struct g_disk_softc { + struct disk *dp; + struct sysctl_ctx_list sysctl_ctx; + struct sysctl_oid *sysctl_tree; + char led[64]; + uint32_t state; +}; + static struct mtx g_disk_done_mtx; static g_access_t g_disk_access; @@ -76,6 +86,9 @@ static struct g_class g_disk_class = { .dumpconf = g_disk_dumpconf, }; +SYSCTL_DECL(_kern_geom); +SYSCTL_NODE(_kern_geom, OID_AUTO, disk, CTLFLAG_RW, 0, "GEOM_DISK stuff"); + static void g_disk_init(struct g_class *mp __unused) { @@ -110,13 +123,14 @@ static int g_disk_access(struct g_provider *pp, int r, int w, int e) { struct disk *dp; + struct g_disk_softc *sc; int error; g_trace(G_T_ACCESS, "g_disk_access(%s, %d, %d, %d)", pp->name, r, w, e); g_topology_assert(); - dp = pp->geom->softc; - if (dp == NULL || dp->d_destroyed) { + sc = pp->geom->softc; + if (sc == NULL || (dp = sc->dp) == NULL || dp->d_destroyed) { /* * Allow decreasing access count even if disk is not * avaliable anymore. @@ -161,6 +175,9 @@ g_disk_access(struct g_provider *pp, int pp->name, error); g_disk_unlock_giant(dp); } + sc->state = G_STATE_ACTIVE; + if (sc->led[0] != 0) + led_set(sc->led, "0"); dp->d_flags &= ~DISKFLAG_OPEN; } return (error); @@ -192,10 +209,37 @@ g_disk_kerneldump(struct bio *bp, struct } static void +g_disk_setstate(struct bio *bp, struct g_disk_softc *sc) +{ + const char *cmd; + + memcpy(&sc->state, bp->bio_data, sizeof(sc->state)); + if (sc->led[0] != 0) { + switch (sc->state) { + case G_STATE_FAILED: + cmd = "1"; + break; + case G_STATE_REBUILD: + cmd = "f5"; + break; + case G_STATE_RESYNC: + cmd = "f1"; + break; + default: + cmd = "0"; + break; + } + led_set(sc->led, cmd); + } + g_io_deliver(bp, 0); +} + +static void g_disk_done(struct bio *bp) { struct bio *bp2; struct disk *dp; + struct g_disk_softc *sc; /* See "notes" for why we need a mutex here */ /* XXX: will witness accept a mix of Giant/unGiant drivers here ? */ @@ -207,7 +251,8 @@ g_disk_done(struct bio *bp) bp2->bio_error = bp->bio_error; bp2->bio_completed += bp->bio_completed; if ((bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_DELETE)) && - (dp = bp2->bio_to->geom->softc)) { + (sc = bp2->bio_to->geom->softc) && + (dp = sc->dp)) { devstat_end_transaction_bio(dp->d_devstat, bp); } g_destroy_bio(bp); @@ -224,10 +269,12 @@ g_disk_ioctl(struct g_provider *pp, u_lo { struct g_geom *gp; struct disk *dp; + struct g_disk_softc *sc; int error; gp = pp->geom; - dp = gp->softc; + sc = gp->softc; + dp = sc->dp; if (dp->d_ioctl == NULL) return (ENOIOCTL); @@ -242,11 +289,12 @@ g_disk_start(struct bio *bp) { struct bio *bp2, *bp3; struct disk *dp; + struct g_disk_softc *sc; int error; off_t off; - dp = bp->bio_to->geom->softc; - if (dp == NULL || dp->d_destroyed) { + sc = bp->bio_to->geom->softc; + if (sc == NULL || (dp = sc->dp) == NULL || dp->d_destroyed) { g_io_deliver(bp, ENXIO); return; } @@ -313,6 +361,8 @@ g_disk_start(struct bio *bp) break; else if (!strcmp(bp->bio_attribute, "GEOM::kerneldump")) g_disk_kerneldump(bp, dp); + else if (!strcmp(bp->bio_attribute, "GEOM::setstate")) + g_disk_setstate(bp, sc); else error = ENOIOCTL; break; @@ -347,9 +397,10 @@ static void g_disk_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp) { struct disk *dp; + struct g_disk_softc *sc; - dp = gp->softc; - if (dp == NULL) + sc = gp->softc; + if (sc == NULL || (dp = sc->dp) == NULL) return; if (indent == NULL) { sbuf_printf(sb, " hd %u", dp->d_fwheads); @@ -370,13 +421,17 @@ g_disk_create(void *arg, int flag) struct g_geom *gp; struct g_provider *pp; struct disk *dp; + struct g_disk_softc *sc; + char tmpstr[80]; if (flag == EV_CANCEL) return; g_topology_assert(); dp = arg; + sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO); + sc->dp = dp; gp = g_new_geomf(&g_disk_class, "%s%d", dp->d_name, dp->d_unit); - gp->softc = dp; + gp->softc = sc; pp = g_new_providerf(gp, "%s", gp->name); pp->mediasize = dp->d_mediasize; pp->sectorsize = dp->d_sectorsize; @@ -386,6 +441,21 @@ g_disk_create(void *arg, int flag) pp->stripesize = dp->d_stripesize; if (bootverbose) printf("GEOM: new disk %s\n", gp->name); + sysctl_ctx_init(&sc->sysctl_ctx); + snprintf(tmpstr, sizeof(tmpstr), "GEOM disk %s", gp->name); + sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctx, + SYSCTL_STATIC_CHILDREN(_kern_geom_disk), OID_AUTO, gp->name, + CTLFLAG_RD, 0, tmpstr); + if (sc->sysctl_tree != NULL) { + snprintf(tmpstr, sizeof(tmpstr), + "kern.geom.disk.%s.led", gp->name); + TUNABLE_STR_FETCH(tmpstr, sc->led, sizeof(sc->led)); + SYSCTL_ADD_STRING(&sc->sysctl_ctx, + SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "led", + CTLFLAG_RW | CTLFLAG_TUN, sc->led, sizeof(sc->led), + "LED name"); + } + pp->private = sc; dp->d_geom = gp; g_error_provider(pp, 0); } @@ -395,11 +465,22 @@ g_disk_destroy(void *ptr, int flag) { struct disk *dp; struct g_geom *gp; + struct g_disk_softc *sc; g_topology_assert(); dp = ptr; gp = dp->d_geom; if (gp != NULL) { + sc = gp->softc; + if (sc->sysctl_tree != NULL) { + sysctl_ctx_free(&sc->sysctl_ctx); + sc->sysctl_tree = NULL; + } + if (sc->led[0] != 0) { + led_set(sc->led, "0"); + sc->led[0] = 0; + } + g_free(sc); gp->softc = NULL; g_wither_geom(gp, ENXIO); } From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 06:59:49 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B6B3D1065673; Fri, 17 Jun 2011 06:59:49 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8BAD28FC25; Fri, 17 Jun 2011 06:59:49 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5H6xnsw065468; Fri, 17 Jun 2011 06:59:49 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5H6xnqU065450; Fri, 17 Jun 2011 06:59:49 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201106170659.p5H6xnqU065450@svn.freebsd.org> From: Alexander Motin Date: Fri, 17 Jun 2011 06:59:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223177 - in stable/8: etc/mtree include sbin/geom/class sbin/geom/class/raid sbin/geom/class/sched sys/conf sys/geom/raid sys/modules/geom sys/modules/geom/geom_raid X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 06:59:49 -0000 Author: mav Date: Fri Jun 17 06:59:49 2011 New Revision: 223177 URL: http://svn.freebsd.org/changeset/base/223177 Log: MFC r219974, r220209, r220210, r220790: Add new RAID GEOM class, that is going to replace ataraid(4) in supporting various BIOS-based software RAIDs. Unlike ataraid(4) this implementation does not depend on legacy ata(4) subsystem and can be used with any disk drivers, including new CAM-based ones (ahci(4), siis(4), mvs(4), ata(4) with `options ATA_CAM`). To make code more readable and extensible, this implementation follows modular design, including core part and two sets of modules, implementing support for different metadata formats and RAID levels. Support for such popular metadata formats is now implemented: Intel, JMicron, NVIDIA, Promise (also used by AMD/ATI) and SiliconImage. Such RAID levels are now supported: RAID0, RAID1, RAID1E, RAID10, SINGLE, CONCAT. For all of these RAID levels and metadata formats this class supports full cycle of volume operations: reading, writing, creation, deletion, disk removal and insertion, rebuilding, dirty shutdown detection and resynchronization, bad sector recovery, faulty disks tracking, hot-spare disks. For Intel and Promise formats there is support multiple volumes per disk set. Look graid(8) manual page for additional details. Co-authored by: imp Sponsored by: Cisco Systems, Inc. and iXsystems, Inc. Added: stable/8/sbin/geom/class/raid/ - copied from r219974, head/sbin/geom/class/raid/ stable/8/sys/geom/raid/ - copied from r219974, head/sys/geom/raid/ stable/8/sys/modules/geom/geom_raid/ - copied from r219974, head/sys/modules/geom/geom_raid/ Modified: stable/8/etc/mtree/BSD.include.dist stable/8/include/Makefile stable/8/sbin/geom/class/Makefile stable/8/sbin/geom/class/raid/Makefile stable/8/sbin/geom/class/raid/geom_raid.c stable/8/sys/conf/NOTES stable/8/sys/conf/files stable/8/sys/conf/options stable/8/sys/geom/raid/g_raid.c stable/8/sys/geom/raid/md_intel.c stable/8/sys/geom/raid/md_jmicron.c stable/8/sys/geom/raid/md_nvidia.c stable/8/sys/geom/raid/md_promise.c stable/8/sys/geom/raid/md_sii.c stable/8/sys/geom/raid/tr_raid1.c stable/8/sys/geom/raid/tr_raid1e.c stable/8/sys/modules/geom/Makefile Directory Properties: stable/8/etc/ (props changed) stable/8/etc/periodic/ (props changed) stable/8/include/ (props changed) stable/8/sbin/geom/ (props changed) stable/8/sbin/geom/class/multipath/ (props changed) stable/8/sbin/geom/class/part/ (props changed) stable/8/sbin/geom/class/sched/gsched.8 (props changed) stable/8/sbin/geom/class/stripe/ (props changed) stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/etc/mtree/BSD.include.dist ============================================================================== --- stable/8/etc/mtree/BSD.include.dist Fri Jun 17 06:23:58 2011 (r223176) +++ stable/8/etc/mtree/BSD.include.dist Fri Jun 17 06:59:49 2011 (r223177) @@ -184,6 +184,8 @@ .. nop .. + raid + .. raid3 .. shsec Modified: stable/8/include/Makefile ============================================================================== --- stable/8/include/Makefile Fri Jun 17 06:23:58 2011 (r223176) +++ stable/8/include/Makefile Fri Jun 17 06:59:49 2011 (r223177) @@ -47,7 +47,7 @@ LSUBDIRS= cam/ata cam/scsi \ ${_fs_nwfs} fs/portalfs fs/procfs fs/smbfs fs/udf fs/unionfs \ geom/cache geom/concat geom/eli geom/gate geom/journal geom/label \ geom/mirror geom/multipath geom/nop \ - geom/raid3 geom/shsec geom/stripe geom/virstor \ + geom/raid geom/raid3 geom/shsec geom/stripe geom/virstor \ netgraph/atm netgraph/netflow \ security/audit \ security/mac_biba security/mac_bsdextended security/mac_lomac \ Modified: stable/8/sbin/geom/class/Makefile ============================================================================== --- stable/8/sbin/geom/class/Makefile Fri Jun 17 06:23:58 2011 (r223176) +++ stable/8/sbin/geom/class/Makefile Fri Jun 17 06:59:49 2011 (r223177) @@ -13,6 +13,7 @@ SUBDIR+=mirror SUBDIR+=multipath SUBDIR+=nop SUBDIR+=part +SUBDIR+=raid SUBDIR+=raid3 SUBDIR+=sched SUBDIR+=shsec Modified: stable/8/sbin/geom/class/raid/Makefile ============================================================================== --- head/sbin/geom/class/raid/Makefile Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sbin/geom/class/raid/Makefile Fri Jun 17 06:59:49 2011 (r223177) @@ -2,7 +2,7 @@ .PATH: ${.CURDIR}/../../misc -GEOM_CLASS= raid +CLASS= raid DPADD= ${LIBMD} LDADD= -lmd Modified: stable/8/sbin/geom/class/raid/geom_raid.c ============================================================================== --- head/sbin/geom/class/raid/geom_raid.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sbin/geom/class/raid/geom_raid.c Fri Jun 17 06:59:49 2011 (r223177) @@ -52,7 +52,7 @@ struct g_command class_commands[] = { { 's', "strip", G_VAL_OPTIONAL, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-fv] [-S size] [-s stripsize] format label level prov ..." + NULL, "[-fv] [-S size] [-s stripsize] format label level prov ..." }, { "add", G_FLAG_VERBOSE, NULL, { @@ -61,22 +61,22 @@ struct g_command class_commands[] = { { 's', "strip", G_VAL_OPTIONAL, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-fv] [-S size] [-s stripsize] name label level" + NULL, "[-fv] [-S size] [-s stripsize] name label level" }, { "delete", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name [label|num]" + NULL, "[-fv] name [label|num]" }, - { "insert", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "insert", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov ..." }, - { "remove", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "remove", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov ..." }, - { "fail", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "fail", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov ..." }, { "stop", G_FLAG_VERBOSE, NULL, @@ -84,7 +84,7 @@ struct g_command class_commands[] = { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name" + NULL, "[-fv] name" }, G_CMD_SENTINEL }; Modified: stable/8/sys/conf/NOTES ============================================================================== --- stable/8/sys/conf/NOTES Fri Jun 17 06:23:58 2011 (r223176) +++ stable/8/sys/conf/NOTES Fri Jun 17 06:59:49 2011 (r223177) @@ -154,6 +154,7 @@ options GEOM_PART_MBR # MBR partitioni options GEOM_PART_PC98 # PC-9800 disk partitioning options GEOM_PART_VTOC8 # SMI VTOC8 disk label options GEOM_PC98 # NEC PC9800 partitioning +options GEOM_RAID # Soft RAID functionality. options GEOM_RAID3 # RAID3 functionality. options GEOM_SHSEC # Shared secret. options GEOM_STRIPE # Disk striping. Modified: stable/8/sys/conf/files ============================================================================== --- stable/8/sys/conf/files Fri Jun 17 06:23:58 2011 (r223176) +++ stable/8/sys/conf/files Fri Jun 17 06:59:49 2011 (r223177) @@ -2032,6 +2032,19 @@ geom/part/g_part_gpt.c optional geom_pa geom/part/g_part_mbr.c optional geom_part_mbr geom/part/g_part_pc98.c optional geom_part_pc98 geom/part/g_part_vtoc8.c optional geom_part_vtoc8 +geom/raid/g_raid.c optional geom_raid +geom/raid/g_raid_ctl.c optional geom_raid +geom/raid/g_raid_md_if.m optional geom_raid +geom/raid/g_raid_tr_if.m optional geom_raid +geom/raid/md_intel.c optional geom_raid +geom/raid/md_jmicron.c optional geom_raid +geom/raid/md_nvidia.c optional geom_raid +geom/raid/md_promise.c optional geom_raid +geom/raid/md_sii.c optional geom_raid +geom/raid/tr_concat.c optional geom_raid +geom/raid/tr_raid0.c optional geom_raid +geom/raid/tr_raid1.c optional geom_raid +geom/raid/tr_raid1e.c optional geom_raid geom/raid3/g_raid3.c optional geom_raid3 geom/raid3/g_raid3_ctl.c optional geom_raid3 geom/shsec/g_shsec.c optional geom_shsec Modified: stable/8/sys/conf/options ============================================================================== --- stable/8/sys/conf/options Fri Jun 17 06:23:58 2011 (r223176) +++ stable/8/sys/conf/options Fri Jun 17 06:59:49 2011 (r223177) @@ -100,6 +100,7 @@ GEOM_PART_MBR opt_geom.h GEOM_PART_PC98 opt_geom.h GEOM_PART_VTOC8 opt_geom.h GEOM_PC98 opt_geom.h +GEOM_RAID opt_geom.h GEOM_RAID3 opt_geom.h GEOM_SHSEC opt_geom.h GEOM_STRIPE opt_geom.h Modified: stable/8/sys/geom/raid/g_raid.c ============================================================================== --- head/sys/geom/raid/g_raid.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/g_raid.c Fri Jun 17 06:59:49 2011 (r223177) @@ -55,7 +55,7 @@ u_int g_raid_aggressive_spare = 0; TUNABLE_INT("kern.geom.raid.aggressive_spare", &g_raid_aggressive_spare); SYSCTL_UINT(_kern_geom_raid, OID_AUTO, aggressive_spare, CTLFLAG_RW, &g_raid_aggressive_spare, 0, "Use disks without metadata as spare"); -u_int g_raid_debug = 2; +u_int g_raid_debug = 0; TUNABLE_INT("kern.geom.raid.debug", &g_raid_debug); SYSCTL_UINT(_kern_geom_raid, OID_AUTO, debug, CTLFLAG_RW, &g_raid_debug, 0, "Debug level"); @@ -1608,7 +1608,7 @@ g_raid_access(struct g_provider *pp, int { struct g_raid_volume *vol; struct g_raid_softc *sc; - int dcr, dcw, dce, opens, error = 0; + int dcw, opens, error = 0; g_topology_assert(); sc = pp->geom->softc; @@ -1618,10 +1618,7 @@ g_raid_access(struct g_provider *pp, int G_RAID_DEBUG1(2, sc, "Access request for %s: r%dw%de%d.", pp->name, acr, acw, ace); - - dcr = pp->acr + acr; dcw = pp->acw + acw; - dce = pp->ace + ace; g_topology_unlock(); sx_xlock(&sc->sc_lock); Modified: stable/8/sys/geom/raid/md_intel.c ============================================================================== --- head/sys/geom/raid/md_intel.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/md_intel.c Fri Jun 17 06:59:49 2011 (r223177) @@ -541,9 +541,9 @@ intel_meta_write_spare(struct g_consumer /* Fill anchor and single disk. */ meta = malloc(INTEL_MAX_MD_SIZE(1), M_MD_INTEL, M_WAITOK | M_ZERO); - memcpy(&meta->intel_id[0], INTEL_MAGIC, sizeof(INTEL_MAGIC)); + memcpy(&meta->intel_id[0], INTEL_MAGIC, sizeof(INTEL_MAGIC) - 1); memcpy(&meta->version[0], INTEL_VERSION_1000, - sizeof(INTEL_VERSION_1000)); + sizeof(INTEL_VERSION_1000) - 1); meta->config_size = INTEL_MAX_MD_SIZE(1); meta->config_id = arc4random(); meta->generation = 1; @@ -1153,7 +1153,6 @@ g_raid_md_taste_intel(struct g_raid_md_o /* Read metadata from device. */ meta = NULL; - spare = 0; vendor = 0xffff; disk_pos = 0; if (g_access(cp, 1, 0, 0) != 0) @@ -1431,7 +1430,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj gctl_error(req, "Can't open disk '%s'.", diskname); g_topology_unlock(); - error = -4; + error = -7; break; } pp = cp->provider; @@ -1481,6 +1480,11 @@ g_raid_md_ctl_intel(struct g_raid_md_obj if (error != 0) return (error); + if (sectorsize <= 0) { + gctl_error(req, "Can't get sector size."); + return (-8); + } + /* Reserve some space for metadata. */ size -= ((4096 + sectorsize - 1) / sectorsize) * sectorsize; @@ -1881,10 +1885,8 @@ g_raid_md_ctl_intel(struct g_raid_md_obj /* If disk was assigned, just update statuses. */ if (pd->pd_disk_pos >= 0) { g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); - if (disk->d_consumer) { - g_raid_kill_consumer(sc, disk->d_consumer); - disk->d_consumer = NULL; - } + g_raid_kill_consumer(sc, disk->d_consumer); + disk->d_consumer = NULL; TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE); @@ -1955,7 +1957,6 @@ g_raid_md_ctl_intel(struct g_raid_md_obj disk = g_raid_create_disk(sc); disk->d_consumer = cp; - disk->d_consumer->private = disk; disk->d_md_data = (void *)pd; cp->private = disk; @@ -2049,7 +2050,7 @@ g_raid_md_write_intel(struct g_raid_md_o /* Fill anchor and disks. */ meta = malloc(INTEL_MAX_MD_SIZE(numdisks), M_MD_INTEL, M_WAITOK | M_ZERO); - memcpy(&meta->intel_id[0], INTEL_MAGIC, sizeof(INTEL_MAGIC)); + memcpy(&meta->intel_id[0], INTEL_MAGIC, sizeof(INTEL_MAGIC) - 1); meta->config_size = INTEL_MAX_MD_SIZE(numdisks); meta->config_id = mdi->mdio_config_id; meta->generation = mdi->mdio_generation; @@ -2214,7 +2215,7 @@ g_raid_md_write_intel(struct g_raid_md_o meta->total_volumes = vi; if (strcmp(version, INTEL_VERSION_1300) != 0) meta->attributes &= INTEL_ATTR_CHECKSUM; - memcpy(&meta->version[0], version, sizeof(INTEL_VERSION_1000)); + memcpy(&meta->version[0], version, sizeof(INTEL_VERSION_1000) - 1); /* We are done. Print meta data and store them to disks. */ g_raid_md_intel_print(meta); Modified: stable/8/sys/geom/raid/md_jmicron.c ============================================================================== --- head/sys/geom/raid/md_jmicron.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/md_jmicron.c Fri Jun 17 06:59:49 2011 (r223177) @@ -431,7 +431,10 @@ g_raid_md_jmicron_start_disk(struct g_ra olddisk = NULL; /* Find disk position in metadata by it's serial. */ - disk_pos = jmicron_meta_find_disk(meta, pd->pd_disk_id); + if (pd->pd_meta != NULL) + disk_pos = jmicron_meta_find_disk(meta, pd->pd_disk_id); + else + disk_pos = -1; if (disk_pos < 0) { G_RAID_DEBUG1(1, sc, "Unknown, probably new or stale disk"); /* If we are in the start process, that's all for now. */ @@ -522,7 +525,7 @@ nofit: * Different disks may have different sizes/offsets, * especially in concat mode. Update. */ - if (pd->pd_meta != NULL && !resurrection) { + if (!resurrection) { sd->sd_offset = (off_t)pd->pd_meta->offset * 16 * 512; //ZZZ sd->sd_size = @@ -576,14 +579,12 @@ g_raid_md_jmicron_refill(struct g_raid_s { struct g_raid_md_object *md; struct g_raid_md_jmicron_object *mdi; - struct jmicron_raid_conf *meta; struct g_raid_disk *disk; struct task *task; int update, na; md = sc->sc_md; mdi = (struct g_raid_md_jmicron_object *)md; - meta = mdi->mdio_meta; update = 0; do { /* Make sure we miss anything. */ @@ -617,10 +618,8 @@ g_raid_md_jmicron_refill(struct g_raid_s } while (disk != NULL); /* Write new metadata if we changed something. */ - if (update) { + if (update) g_raid_md_write_jmicron(md, NULL, NULL, NULL); - meta = mdi->mdio_meta; - } /* Update status of our need for spare. */ mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < @@ -832,9 +831,7 @@ g_raid_md_taste_jmicron(struct g_raid_md /* Read metadata from device. */ meta = NULL; - spare = 0; vendor = 0xffff; - disk_pos = 0; if (g_access(cp, 1, 0, 0) != 0) return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); @@ -1130,6 +1127,11 @@ g_raid_md_ctl_jmicron(struct g_raid_md_o if (error != 0) return (error); + if (sectorsize <= 0) { + gctl_error(req, "Can't get sector size."); + return (-8); + } + /* Reserve space for metadata. */ size -= sectorsize; @@ -1300,10 +1302,8 @@ g_raid_md_ctl_jmicron(struct g_raid_md_o /* If disk was assigned, just update statuses. */ if (pd->pd_disk_pos >= 0) { g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); - if (disk->d_consumer) { - g_raid_kill_consumer(sc, disk->d_consumer); - disk->d_consumer = NULL; - } + g_raid_kill_consumer(sc, disk->d_consumer); + disk->d_consumer = NULL; TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE); @@ -1363,7 +1363,6 @@ g_raid_md_ctl_jmicron(struct g_raid_md_o disk = g_raid_create_disk(sc); disk->d_consumer = cp; - disk->d_consumer->private = disk; disk->d_md_data = (void *)pd; cp->private = disk; g_topology_unlock(); @@ -1469,7 +1468,6 @@ g_raid_md_write_jmicron(struct g_raid_md if (mdi->mdio_meta != NULL) free(mdi->mdio_meta, M_MD_JMICRON); mdi->mdio_meta = meta; - i = 0; TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; if (disk->d_state != G_RAID_DISK_S_ACTIVE && @@ -1506,12 +1504,10 @@ g_raid_md_fail_disk_jmicron(struct g_rai struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) { struct g_raid_softc *sc; - struct g_raid_md_jmicron_object *mdi; struct g_raid_md_jmicron_perdisk *pd; struct g_raid_subdisk *sd; sc = md->mdo_softc; - mdi = (struct g_raid_md_jmicron_object *)md; pd = (struct g_raid_md_jmicron_perdisk *)tdisk->d_md_data; /* We can't fail disk that is not a part of array now. */ Modified: stable/8/sys/geom/raid/md_nvidia.c ============================================================================== --- head/sys/geom/raid/md_nvidia.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/md_nvidia.c Fri Jun 17 06:59:49 2011 (r223177) @@ -584,14 +584,12 @@ g_raid_md_nvidia_refill(struct g_raid_so { struct g_raid_md_object *md; struct g_raid_md_nvidia_object *mdi; - struct nvidia_raid_conf *meta; struct g_raid_disk *disk; struct task *task; int update, na; md = sc->sc_md; mdi = (struct g_raid_md_nvidia_object *)md; - meta = mdi->mdio_meta; update = 0; do { /* Make sure we miss anything. */ @@ -625,10 +623,8 @@ g_raid_md_nvidia_refill(struct g_raid_so } while (disk != NULL); /* Write new metadata if we changed something. */ - if (update) { + if (update) g_raid_md_write_nvidia(md, NULL, NULL, NULL); - meta = mdi->mdio_meta; - } /* Update status of our need for spare. */ mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < @@ -828,7 +824,7 @@ g_raid_md_taste_nvidia(struct g_raid_md_ struct nvidia_raid_conf *meta; struct g_raid_md_nvidia_perdisk *pd; struct g_geom *geom; - int error, disk_pos, result, spare, len; + int error, result, spare, len; char name[32]; uint16_t vendor; @@ -838,9 +834,7 @@ g_raid_md_taste_nvidia(struct g_raid_md_ /* Read metadata from device. */ meta = NULL; - spare = 0; vendor = 0xffff; - disk_pos = 0; if (g_access(cp, 1, 0, 0) != 0) return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); @@ -866,16 +860,9 @@ g_raid_md_taste_nvidia(struct g_raid_md_ return (G_RAID_MD_TASTE_FAIL); } - /* Check this disk position in obtained metadata. */ - disk_pos = meta->disk_number; - if (disk_pos == -1) { - G_RAID_DEBUG(1, "NVIDIA disk position not found"); - goto fail1; - } - /* Metadata valid. Print it. */ g_raid_md_nvidia_print(meta); - G_RAID_DEBUG(1, "NVIDIA disk position %d", disk_pos); + G_RAID_DEBUG(1, "NVIDIA disk position %d", meta->disk_number); spare = 0;//(meta->type == NVIDIA_T_SPARE) ? 1 : 0; search: @@ -1141,6 +1128,11 @@ g_raid_md_ctl_nvidia(struct g_raid_md_ob if (error != 0) return (error); + if (sectorsize <= 0) { + gctl_error(req, "Can't get sector size."); + return (-8); + } + /* Reserve space for metadata. */ size -= 2 * sectorsize; @@ -1311,10 +1303,8 @@ g_raid_md_ctl_nvidia(struct g_raid_md_ob /* If disk was assigned, just update statuses. */ if (pd->pd_disk_pos >= 0) { g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); - if (disk->d_consumer) { - g_raid_kill_consumer(sc, disk->d_consumer); - disk->d_consumer = NULL; - } + g_raid_kill_consumer(sc, disk->d_consumer); + disk->d_consumer = NULL; TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE); @@ -1373,7 +1363,6 @@ g_raid_md_ctl_nvidia(struct g_raid_md_ob disk = g_raid_create_disk(sc); disk->d_consumer = cp; - disk->d_consumer->private = disk; disk->d_md_data = (void *)pd; cp->private = disk; g_topology_unlock(); @@ -1435,7 +1424,7 @@ g_raid_md_write_nvidia(struct g_raid_md_ meta = malloc(sizeof(*meta), M_MD_NVIDIA, M_WAITOK | M_ZERO); if (mdi->mdio_meta) memcpy(meta, mdi->mdio_meta, sizeof(*meta)); - memcpy(meta->nvidia_id, NVIDIA_MAGIC, sizeof(NVIDIA_MAGIC)); + memcpy(meta->nvidia_id, NVIDIA_MAGIC, sizeof(NVIDIA_MAGIC) - 1); meta->config_size = 30; meta->version = 0x0064; meta->total_sectors = vol->v_mediasize / vol->v_sectorsize; @@ -1530,12 +1519,10 @@ g_raid_md_fail_disk_nvidia(struct g_raid struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) { struct g_raid_softc *sc; - struct g_raid_md_nvidia_object *mdi; struct g_raid_md_nvidia_perdisk *pd; struct g_raid_subdisk *sd; sc = md->mdo_softc; - mdi = (struct g_raid_md_nvidia_object *)md; pd = (struct g_raid_md_nvidia_perdisk *)tdisk->d_md_data; /* We can't fail disk that is not a part of array now. */ Modified: stable/8/sys/geom/raid/md_promise.c ============================================================================== --- head/sys/geom/raid/md_promise.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/md_promise.c Fri Jun 17 06:59:49 2011 (r223177) @@ -398,7 +398,8 @@ next: &off, &size)) { /* Optionally add record for unused space. */ meta = (struct promise_raid_conf *)buf; - memcpy(&meta->promise_id[0], PROMISE_MAGIC, sizeof(PROMISE_MAGIC)); + memcpy(&meta->promise_id[0], PROMISE_MAGIC, + sizeof(PROMISE_MAGIC) - 1); meta->dummy_0 = 0x00020000; meta->integrity = PROMISE_I_VALID; meta->disk.flags = PROMISE_F_ONLINE | PROMISE_F_VALID; @@ -462,7 +463,7 @@ promise_meta_write_spare(struct g_consum int error; meta = malloc(sizeof(*meta), M_MD_PROMISE, M_WAITOK | M_ZERO); - memcpy(&meta->promise_id[0], PROMISE_MAGIC, sizeof(PROMISE_MAGIC)); + memcpy(&meta->promise_id[0], PROMISE_MAGIC, sizeof(PROMISE_MAGIC) - 1); meta->dummy_0 = 0x00020000; meta->integrity = PROMISE_I_VALID; meta->disk.flags = PROMISE_F_SPARE | PROMISE_F_ONLINE | PROMISE_F_VALID; @@ -818,10 +819,10 @@ restart: } else update = 0; if (update) { + updated = 1; g_raid_md_write_promise(md, vol, NULL, disk); break; } - updated += update; } } if (updated) @@ -1153,12 +1154,10 @@ g_raid_md_event_promise(struct g_raid_md struct g_raid_disk *disk, u_int event) { struct g_raid_softc *sc; - struct g_raid_md_promise_perdisk *pd; sc = md->mdo_softc; if (disk == NULL) return (-1); - pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; switch (event) { case G_RAID_DISK_E_DISCONNECTED: /* Delete disk. */ @@ -1183,10 +1182,8 @@ static int g_raid_md_volume_event_promise(struct g_raid_md_object *md, struct g_raid_volume *vol, u_int event) { - struct g_raid_softc *sc; struct g_raid_md_promise_pervolume *pv; - sc = md->mdo_softc; pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; switch (event) { case G_RAID_VOLUME_E_STARTMD: @@ -1344,6 +1341,11 @@ g_raid_md_ctl_promise(struct g_raid_md_o return (error); } + if (sectorsize <= 0) { + gctl_error(req, "Can't get sector size."); + return (-8); + } + /* Handle size argument. */ len = sizeof(*sizearg); sizearg = gctl_get_param(req, "size", &len); @@ -1566,8 +1568,6 @@ g_raid_md_ctl_promise(struct g_raid_md_o continue; } - pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - /* Erase metadata on deleting disk and destroy it. */ promise_meta_erase(disk->d_consumer); g_raid_destroy_disk(disk); @@ -1609,14 +1609,12 @@ g_raid_md_ctl_promise(struct g_raid_md_o error = -4; break; } - pp = cp->provider; g_topology_unlock(); pd = malloc(sizeof(*pd), M_MD_PROMISE, M_WAITOK | M_ZERO); disk = g_raid_create_disk(sc); disk->d_consumer = cp; - disk->d_consumer->private = disk; disk->d_md_data = (void *)pd; cp->private = disk; @@ -1684,7 +1682,8 @@ g_raid_md_write_promise(struct g_raid_md meta = malloc(sizeof(*meta), M_MD_PROMISE, M_WAITOK | M_ZERO); if (pv->pv_meta != NULL) memcpy(meta, pv->pv_meta, sizeof(*meta)); - memcpy(meta->promise_id, PROMISE_MAGIC, sizeof(PROMISE_MAGIC)); + memcpy(meta->promise_id, PROMISE_MAGIC, + sizeof(PROMISE_MAGIC) - 1); meta->dummy_0 = 0x00020000; meta->integrity = PROMISE_I_VALID; Modified: stable/8/sys/geom/raid/md_sii.c ============================================================================== --- head/sys/geom/raid/md_sii.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/md_sii.c Fri Jun 17 06:59:49 2011 (r223177) @@ -641,14 +641,12 @@ g_raid_md_sii_refill(struct g_raid_softc { struct g_raid_md_object *md; struct g_raid_md_sii_object *mdi; - struct sii_raid_conf *meta; struct g_raid_disk *disk; struct task *task; int update, na; md = sc->sc_md; mdi = (struct g_raid_md_sii_object *)md; - meta = mdi->mdio_meta; update = 0; do { /* Make sure we miss anything. */ @@ -682,10 +680,8 @@ g_raid_md_sii_refill(struct g_raid_softc } while (disk != NULL); /* Write new metadata if we changed something. */ - if (update) { + if (update) g_raid_md_write_sii(md, NULL, NULL, NULL); - meta = mdi->mdio_meta; - } /* Update status of our need for spare. */ mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < @@ -921,9 +917,7 @@ g_raid_md_taste_sii(struct g_raid_md_obj /* Read metadata from device. */ meta = NULL; - spare = 0; vendor = 0xffff; - disk_pos = 0; if (g_access(cp, 1, 0, 0) != 0) return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); @@ -1219,6 +1213,11 @@ g_raid_md_ctl_sii(struct g_raid_md_objec if (error != 0) return (error); + if (sectorsize <= 0) { + gctl_error(req, "Can't get sector size."); + return (-8); + } + /* Reserve space for metadata. */ size -= 0x800 * sectorsize; @@ -1389,10 +1388,8 @@ g_raid_md_ctl_sii(struct g_raid_md_objec /* If disk was assigned, just update statuses. */ if (pd->pd_disk_pos >= 0) { g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); - if (disk->d_consumer) { - g_raid_kill_consumer(sc, disk->d_consumer); - disk->d_consumer = NULL; - } + g_raid_kill_consumer(sc, disk->d_consumer); + disk->d_consumer = NULL; TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE); @@ -1451,7 +1448,6 @@ g_raid_md_ctl_sii(struct g_raid_md_objec disk = g_raid_create_disk(sc); disk->d_consumer = cp; - disk->d_consumer->private = disk; disk->d_md_data = (void *)pd; cp->private = disk; g_topology_unlock(); @@ -1561,7 +1557,6 @@ g_raid_md_write_sii(struct g_raid_md_obj if (mdi->mdio_meta != NULL) free(mdi->mdio_meta, M_MD_SII); mdi->mdio_meta = meta; - i = 0; TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; if (disk->d_state != G_RAID_DISK_S_ACTIVE) @@ -1607,12 +1602,10 @@ g_raid_md_fail_disk_sii(struct g_raid_md struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) { struct g_raid_softc *sc; - struct g_raid_md_sii_object *mdi; struct g_raid_md_sii_perdisk *pd; struct g_raid_subdisk *sd; sc = md->mdo_softc; - mdi = (struct g_raid_md_sii_object *)md; pd = (struct g_raid_md_sii_perdisk *)tdisk->d_md_data; /* We can't fail disk that is not a part of array now. */ Modified: stable/8/sys/geom/raid/tr_raid1.c ============================================================================== --- head/sys/geom/raid/tr_raid1.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/tr_raid1.c Fri Jun 17 06:59:49 2011 (r223177) @@ -549,7 +549,6 @@ g_raid_tr_iostart_raid1_read(struct g_ra static void g_raid_tr_iostart_raid1_write(struct g_raid_tr_object *tr, struct bio *bp) { - struct g_raid_softc *sc; struct g_raid_volume *vol; struct g_raid_subdisk *sd; struct bio_queue_head queue; @@ -557,7 +556,6 @@ g_raid_tr_iostart_raid1_write(struct g_r int i; vol = tr->tro_volume; - sc = vol->v_softc; /* * Allocate all bios before sending any request, so we can return @@ -720,8 +718,6 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_ bp->bio_error); bp->bio_cmd = BIO_WRITE; bp->bio_cflags = G_RAID_BIO_FLAG_SYNC; - bp->bio_offset = bp->bio_offset; - bp->bio_length = bp->bio_length; G_RAID_LOGREQ(4, bp, "Queueing rebuild write."); g_raid_subdisk_iostart(trs->trso_failed_sd, bp); } else { Modified: stable/8/sys/geom/raid/tr_raid1e.c ============================================================================== --- head/sys/geom/raid/tr_raid1e.c Thu Mar 24 21:31:32 2011 (r219974) +++ stable/8/sys/geom/raid/tr_raid1e.c Fri Jun 17 06:59:49 2011 (r223177) @@ -196,13 +196,11 @@ g_raid_tr_taste_raid1e(struct g_raid_tr_ static int g_raid_tr_update_state_raid1e_even(struct g_raid_volume *vol) { - struct g_raid_tr_raid1e_object *trs; struct g_raid_softc *sc; struct g_raid_subdisk *sd, *bestsd, *worstsd; int i, j, state, sstate; sc = vol->v_softc; - trs = (struct g_raid_tr_raid1e_object *)vol->v_tr; state = G_RAID_VOLUME_S_OPTIMAL; for (i = 0; i < vol->v_disks_count / N; i++) { bestsd = &vol->v_subdisks[i * N]; @@ -251,13 +249,11 @@ g_raid_tr_update_state_raid1e_even(struc static int g_raid_tr_update_state_raid1e_odd(struct g_raid_volume *vol) { - struct g_raid_tr_raid1e_object *trs; struct g_raid_softc *sc; struct g_raid_subdisk *sd, *bestsd, *worstsd; int i, j, state, sstate; sc = vol->v_softc; - trs = (struct g_raid_tr_raid1e_object *)vol->v_tr; if (g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE) == vol->v_disks_count) return (G_RAID_VOLUME_S_OPTIMAL); Modified: stable/8/sys/modules/geom/Makefile ============================================================================== --- stable/8/sys/modules/geom/Makefile Fri Jun 17 06:23:58 2011 (r223176) +++ stable/8/sys/modules/geom/Makefile Fri Jun 17 06:59:49 2011 (r223177) @@ -17,6 +17,7 @@ SUBDIR= geom_bde \ geom_nop \ geom_part \ geom_pc98 \ + geom_raid \ geom_raid3 \ geom_sched \ geom_shsec \ From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 07:05:48 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 283ED106566B; Fri, 17 Jun 2011 07:05:48 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0D4838FC0C; Fri, 17 Jun 2011 07:05:48 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5H75lKM065751; Fri, 17 Jun 2011 07:05:47 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5H75l9O065748; Fri, 17 Jun 2011 07:05:47 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201106170705.p5H75l9O065748@svn.freebsd.org> From: Alexander Motin Date: Fri, 17 Jun 2011 07:05:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223179 - in stable/8/sbin/geom: class/sched core X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 07:05:48 -0000 Author: mav Date: Fri Jun 17 07:05:47 2011 New Revision: 223179 URL: http://svn.freebsd.org/changeset/base/223179 Log: MFC r219969: Make `geom XXX list` and `geom XXX status` outputs more consistent: Add -a options to print all geoms, not only ones with providers. Add -g option for `status` to report geom's names, not provider's. Make `status` by default report provider's status (if present), not geom's. Make `status` report consumer's statuses, not only "synchronized" field. Modified: stable/8/sbin/geom/core/geom.8 stable/8/sbin/geom/core/geom.c Directory Properties: stable/8/sbin/geom/ (props changed) stable/8/sbin/geom/class/multipath/ (props changed) stable/8/sbin/geom/class/part/ (props changed) stable/8/sbin/geom/class/sched/gsched.8 (props changed) stable/8/sbin/geom/class/stripe/ (props changed) Modified: stable/8/sbin/geom/core/geom.8 ============================================================================== --- stable/8/sbin/geom/core/geom.8 Fri Jun 17 07:03:42 2011 (r223178) +++ stable/8/sbin/geom/core/geom.8 Fri Jun 17 07:05:47 2011 (r223179) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 5, 2008 +.Dd January 5, 2011 .Dt GEOM 8 .Os .Sh NAME @@ -37,11 +37,12 @@ .Nm .Ar class .Cm list +.Op Fl a .Op Ar name ... .Nm .Ar class .Cm status -.Op Fl s +.Op Fl ags .Op Ar name ... .Nm .Ar class @@ -69,6 +70,11 @@ List all available commands for the give Print detailed information (within the given class) about all geoms (if no additional arguments were specified) or the given geoms. This command is only available if the given class exists in the kernel. +Additional options include: +.Bl -tag -width ".Fl a" +.It Fl a +Print information for geoms without providers. +.El .It Cm status Print general information (within the given class) about all geoms (if no additional arguments were specified) or the given geoms. @@ -76,6 +82,10 @@ This command is only available if the gi .Pp Additional options include: .Bl -tag -width ".Fl s" +.It Fl a +When used with -g, print status for geoms without providers. +.It Fl g +Report statuses for geoms instead of providers. .It Fl s Produce script-friendly output. .El @@ -126,6 +136,8 @@ NOP .It PART .It +RAID +.It RAID3 .It SHSEC Modified: stable/8/sbin/geom/core/geom.c ============================================================================== --- stable/8/sbin/geom/core/geom.c Fri Jun 17 07:03:42 2011 (r223178) +++ stable/8/sbin/geom/core/geom.c Fri Jun 17 07:05:47 2011 (r223179) @@ -76,15 +76,21 @@ static void std_unload(struct gctl_req * struct g_command std_commands[] = { { "help", 0, std_help, G_NULL_OPTS, NULL, NULL }, - { "list", 0, std_list, G_NULL_OPTS, NULL, - "[name ...]" + { "list", 0, std_list, + { + { 'a', "all", NULL, G_TYPE_BOOL }, + G_OPT_SENTINEL + }, + NULL, "[-a] [name ...]" }, { "status", 0, std_status, { + { 'a', "all", NULL, G_TYPE_BOOL }, + { 'g', "geoms", NULL, G_TYPE_BOOL }, { 's', "script", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - NULL, "[-s] [name ...]" + NULL, "[-ags] [name ...]" }, { "load", G_FLAG_VERBOSE | G_FLAG_LOADKLD, std_load, G_NULL_OPTS, NULL, NULL }, @@ -800,7 +806,7 @@ std_list(struct gctl_req *req, unsigned struct gclass *classp; struct ggeom *gp; const char *name; - int error, i, nargs; + int all, error, i, nargs; error = geom_gettree(&mesh); if (error != 0) @@ -811,18 +817,18 @@ std_list(struct gctl_req *req, unsigned errx(EXIT_FAILURE, "Class %s not found.", gclass_name); } nargs = gctl_get_int(req, "nargs"); + all = gctl_get_int(req, "all"); if (nargs > 0) { for (i = 0; i < nargs; i++) { name = gctl_get_ascii(req, "arg%d", i); gp = find_geom(classp, name); - if (gp != NULL) - list_one_geom(gp); - else + if (gp == NULL) errx(EXIT_FAILURE, "No such geom: %s.", name); + list_one_geom(gp); } } else { LIST_FOREACH(gp, &classp->lg_geom, lg_geom) { - if (LIST_EMPTY(&gp->lg_provider)) + if (LIST_EMPTY(&gp->lg_provider) && !all) continue; list_one_geom(gp); } @@ -841,7 +847,6 @@ std_status_available(void) static void status_update_len(struct ggeom *gp, int *name_len, int *status_len) { - struct gprovider *pp; struct gconfig *conf; int len; @@ -849,11 +854,7 @@ status_update_len(struct ggeom *gp, int assert(name_len != NULL); assert(status_len != NULL); - pp = LIST_FIRST(&gp->lg_provider); - if (pp != NULL) - len = strlen(pp->lg_name); - else - len = strlen(gp->lg_name); + len = strlen(gp->lg_name); if (*name_len < len) *name_len = len; LIST_FOREACH(conf, &gp->lg_config, lg_config) { @@ -865,25 +866,67 @@ status_update_len(struct ggeom *gp, int } } +static void +status_update_len_prs(struct ggeom *gp, int *name_len, int *status_len) +{ + struct gprovider *pp; + struct gconfig *conf; + int len, glen; + + assert(gp != NULL); + assert(name_len != NULL); + assert(status_len != NULL); + + glen = 0; + LIST_FOREACH(conf, &gp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + glen = strlen(conf->lg_val); + break; + } + } + LIST_FOREACH(pp, &gp->lg_provider, lg_provider) { + len = strlen(pp->lg_name); + if (*name_len < len) + *name_len = len; + len = glen; + LIST_FOREACH(conf, &pp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + len = strlen(conf->lg_val); + break; + } + } + if (*status_len < len) + *status_len = len; + } +} + static char * status_one_consumer(struct gconsumer *cp) { static char buf[256]; struct gprovider *pp; struct gconfig *conf; + const char *state, *syncr; pp = cp->lg_provider; if (pp == NULL) return (NULL); + state = NULL; + syncr = NULL; LIST_FOREACH(conf, &cp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) + state = conf->lg_val; if (strcasecmp(conf->lg_name, "synchronized") == 0) - break; + syncr = conf->lg_val; } - if (conf == NULL) + if (state == NULL && syncr == NULL) snprintf(buf, sizeof(buf), "%s", pp->lg_name); - else { + else if (state != NULL && syncr != NULL) { + snprintf(buf, sizeof(buf), "%s (%s, %s)", pp->lg_name, + state, syncr); + } else { snprintf(buf, sizeof(buf), "%s (%s)", pp->lg_name, - conf->lg_val); + state ? state : syncr); } return (buf); } @@ -891,25 +934,19 @@ status_one_consumer(struct gconsumer *cp static void status_one_geom(struct ggeom *gp, int script, int name_len, int status_len) { - struct gprovider *pp; struct gconsumer *cp; struct gconfig *conf; const char *name, *status, *component; int gotone; - pp = LIST_FIRST(&gp->lg_provider); - if (pp != NULL) - name = pp->lg_name; - else - name = gp->lg_name; + name = gp->lg_name; + status = "N/A"; LIST_FOREACH(conf, &gp->lg_config, lg_config) { - if (strcasecmp(conf->lg_name, "state") == 0) + if (strcasecmp(conf->lg_name, "state") == 0) { + status = conf->lg_val; break; + } } - if (conf == NULL) - status = "N/A"; - else - status = conf->lg_val; gotone = 0; LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) { component = status_one_consumer(cp); @@ -928,6 +965,48 @@ status_one_geom(struct ggeom *gp, int sc } static void +status_one_geom_prs(struct ggeom *gp, int script, int name_len, int status_len) +{ + struct gprovider *pp; + struct gconsumer *cp; + struct gconfig *conf; + const char *name, *status, *component; + int gotone; + + LIST_FOREACH(pp, &gp->lg_provider, lg_provider) { + name = pp->lg_name; + status = "N/A"; + LIST_FOREACH(conf, &gp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + status = conf->lg_val; + break; + } + } + LIST_FOREACH(conf, &pp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + status = conf->lg_val; + break; + } + } + gotone = 0; + LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) { + component = status_one_consumer(cp); + if (component == NULL) + continue; + gotone = 1; + printf("%*s %*s %s\n", name_len, name, + status_len, status, component); + if (!script) + name = status = ""; + } + if (!gotone) { + printf("%*s %*s %s\n", name_len, name, + status_len, status, "N/A"); + } + } +} + +static void std_status(struct gctl_req *req, unsigned flags __unused) { struct gmesh mesh; @@ -935,7 +1014,7 @@ std_status(struct gctl_req *req, unsigne struct ggeom *gp; const char *name; int name_len, status_len; - int error, i, n, nargs, script; + int all, error, geoms, i, n, nargs, script; error = geom_gettree(&mesh); if (error != 0) @@ -944,28 +1023,45 @@ std_status(struct gctl_req *req, unsigne if (classp == NULL) errx(EXIT_FAILURE, "Class %s not found.", gclass_name); nargs = gctl_get_int(req, "nargs"); + all = gctl_get_int(req, "all"); + geoms = gctl_get_int(req, "geoms"); script = gctl_get_int(req, "script"); - name_len = strlen("Name"); - status_len = strlen("Status"); + if (script) { + name_len = 0; + status_len = 0; + } else { + name_len = strlen("Name"); + status_len = strlen("Status"); + } if (nargs > 0) { for (i = 0, n = 0; i < nargs; i++) { name = gctl_get_ascii(req, "arg%d", i); gp = find_geom(classp, name); if (gp == NULL) errx(EXIT_FAILURE, "No such geom: %s.", name); - else { - status_update_len(gp, &name_len, &status_len); - n++; + if (geoms) { + status_update_len(gp, + &name_len, &status_len); + } else { + status_update_len_prs(gp, + &name_len, &status_len); } + n++; } if (n == 0) goto end; } else { n = 0; LIST_FOREACH(gp, &classp->lg_geom, lg_geom) { - if (LIST_EMPTY(&gp->lg_provider)) + if (LIST_EMPTY(&gp->lg_provider) && !all) continue; - status_update_len(gp, &name_len, &status_len); + if (geoms) { + status_update_len(gp, + &name_len, &status_len); + } else { + status_update_len_prs(gp, + &name_len, &status_len); + } n++; } if (n == 0) @@ -979,16 +1075,27 @@ std_status(struct gctl_req *req, unsigne for (i = 0; i < nargs; i++) { name = gctl_get_ascii(req, "arg%d", i); gp = find_geom(classp, name); - if (gp != NULL) { + if (gp == NULL) + continue; + if (geoms) { status_one_geom(gp, script, name_len, status_len); + } else { + status_one_geom_prs(gp, script, name_len, + status_len); } } } else { LIST_FOREACH(gp, &classp->lg_geom, lg_geom) { - if (LIST_EMPTY(&gp->lg_provider)) + if (LIST_EMPTY(&gp->lg_provider) && !all) continue; - status_one_geom(gp, script, name_len, status_len); + if (geoms) { + status_one_geom(gp, script, name_len, + status_len); + } else { + status_one_geom_prs(gp, script, name_len, + status_len); + } } } end: From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 16:03:01 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 419AD1065673; Fri, 17 Jun 2011 16:03:01 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 276338FC14; Fri, 17 Jun 2011 16:03:01 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5HG31IP097301; Fri, 17 Jun 2011 16:03:01 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5HG31df097299; Fri, 17 Jun 2011 16:03:01 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201106171603.p5HG31df097299@svn.freebsd.org> From: Rick Macklem Date: Fri, 17 Jun 2011 16:03:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223187 - stable/8/usr.sbin/rpc.lockd X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 16:03:01 -0000 Author: rmacklem Date: Fri Jun 17 16:03:00 2011 New Revision: 223187 URL: http://svn.freebsd.org/changeset/base/223187 Log: MFC: r222624 Fix the nfs related daemons so that they don't intermittently fail with "bind: address already in use". This problem was reported to the freebsd-stable@ mailing list on Feb. 19 under the subject heading "statd/lockd startup failure" by george+freebsd at m5p dot com. The problem is that the first combination of {udp,tcp X ipv4,ipv6} would select a port# dynamically, but one of the other three combinations would have that port# already in use. The patch is somewhat involved because it was requested by dougb@ that the four combinations use the same port# wherever possible. The patch splits the create_service() function into two functions. The first goes as far as bind(2) in a loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port# for all four cases. If these attempts fail, the last attempt allows the 4 cases to use different port #s. After this function has succeeded, the second function, called complete_service(), does the rest of what create_service() did. The three daemons mountd, rpc.lockd and rpc.statd all have a create_service() function that is patched in a similar way. However, create_service() has non-trivial differences for the three daemons that made it impractical to share the same functions between them. Modified: stable/8/usr.sbin/rpc.lockd/lockd.c Directory Properties: stable/8/usr.sbin/rpc.lockd/ (props changed) Modified: stable/8/usr.sbin/rpc.lockd/lockd.c ============================================================================== --- stable/8/usr.sbin/rpc.lockd/lockd.c Fri Jun 17 13:03:49 2011 (r223186) +++ stable/8/usr.sbin/rpc.lockd/lockd.c Fri Jun 17 16:03:00 2011 (r223187) @@ -74,6 +74,8 @@ __RCSID("$NetBSD: lockd.c,v 1.7 2000/08/ #include "lockd.h" #include +#define GETPORT_MAXTRY 20 /* Max tries to get a port # */ + int debug_level = 0; /* 0 = no debugging syslog() calls */ int _rpcsvcdirty = 0; @@ -84,12 +86,18 @@ int kernel_lockd_client; pid_t client_pid; struct mon mon_host; char **hosts, *svcport_str = NULL; +static int mallocd_svcport = 0; +static int *sock_fd; +static int sock_fdcnt; +static int sock_fdpos; int nhosts = 0; int xcreated = 0; char **addrs; /* actually (netid, uaddr) pairs */ int naddrs; /* count of how many (netid, uaddr) pairs */ -void create_service(struct netconfig *nconf); +static int create_service(struct netconfig *nconf); +static void complete_service(struct netconfig *nconf, char *port_str); +static void clearout_service(void); void lookup_addresses(struct netconfig *nconf); void init_nsm(void); void nlm_prog_0(struct svc_req *, SVCXPRT *); @@ -118,6 +126,8 @@ main(int argc, char **argv) int have_v6 = 1; int maxrec = RPC_MAXDATASIZE; in_port_t svcport = 0; + int attempt_cnt, port_len, port_pos, ret; + char **port_list; while ((ch = getopt(argc, argv, "d:g:h:p:")) != (-1)) { switch (ch) { @@ -308,6 +318,11 @@ main(int argc, char **argv) } endnetconfig(nc_handle); } else { + attempt_cnt = 1; + sock_fdcnt = 0; + sock_fd = NULL; + port_list = NULL; + port_len = 0; nc_handle = setnetconfig(); while ((nconf = getnetconfig(nc_handle))) { /* We want to listen only on udp6, tcp6, udp, tcp transports */ @@ -316,11 +331,96 @@ main(int argc, char **argv) if (have_v6 == 0 && strcmp(nconf->nc_protofmly, "inet6") == 0) { /* DO NOTHING */ } else { - create_service(nconf); + ret = create_service(nconf); + if (ret == 1) + /* Ignore this call */ + continue; + if (ret < 0) { + /* + * Failed to bind port, so close + * off all sockets created and + * try again if the port# was + * dynamically assigned via + * bind(2). + */ + clearout_service(); + if (mallocd_svcport != 0 && + attempt_cnt < + GETPORT_MAXTRY) { + free(svcport_str); + svcport_str = NULL; + mallocd_svcport = 0; + } else { + errno = EADDRINUSE; + syslog(LOG_ERR, + "bindresvport_sa: %m"); + exit(1); + } + + /* + * Start over at the first + * service. + */ + free(sock_fd); + sock_fdcnt = 0; + sock_fd = NULL; + nc_handle = setnetconfig(); + attempt_cnt++; + } else if (mallocd_svcport != 0 && + attempt_cnt == GETPORT_MAXTRY) { + /* + * For the last attempt, allow + * different port #s for each + * nconf by saving the + * svcport_str and setting it + * back to NULL. + */ + port_list = realloc(port_list, + (port_len + 1) * + sizeof(char *)); + if (port_list == NULL) + out_of_mem(); + port_list[port_len++] = + svcport_str; + svcport_str = NULL; + mallocd_svcport = 0; + } } } } + + /* + * Successfully bound the ports, so call complete_service() to + * do the rest of the setup on the service(s). + */ + sock_fdpos = 0; + port_pos = 0; + nc_handle = setnetconfig(); + while ((nconf = getnetconfig(nc_handle))) { + /* We want to listen only on udp6, tcp6, udp, tcp transports */ + if (nconf->nc_flag & NC_VISIBLE) { + /* Skip if there's no IPv6 support */ + if (have_v6 == 0 && strcmp(nconf->nc_protofmly, "inet6") == 0) { + /* DO NOTHING */ + } else if (port_list != NULL) { + if (port_pos >= port_len) { + syslog(LOG_ERR, + "too many port#s"); + exit(1); + } + complete_service(nconf, + port_list[port_pos++]); + } else + complete_service(nconf, svcport_str); + } + } endnetconfig(nc_handle); + free(sock_fd); + if (port_list != NULL) { + for (port_pos = 0; port_pos < port_len; port_pos++) + free(port_list[port_pos]); + free(port_list); + } } /* @@ -385,29 +485,30 @@ main(int argc, char **argv) /* * This routine creates and binds sockets on the appropriate - * addresses. It gets called one time for each transport and - * registrates the service with rpcbind on that trasport. + * addresses. It gets called one time for each transport. + * It returns 0 upon success, 1 for ingore the call and -1 to indicate + * bind failed with EADDRINUSE. + * Any file descriptors that have been created are stored in sock_fd and + * the total count of them is maintained in sock_fdcnt. */ -void +static int create_service(struct netconfig *nconf) { struct addrinfo hints, *res = NULL; struct sockaddr_in *sin; struct sockaddr_in6 *sin6; struct __rpc_sockinfo si; - struct netbuf servaddr; - SVCXPRT *transp = NULL; int aicode; int fd; int nhostsbak; int r; - int registered = 0; u_int32_t host_addr[4]; /* IPv4 or IPv6 */ + int mallocd_res; if ((nconf->nc_semantics != NC_TPI_CLTS) && (nconf->nc_semantics != NC_TPI_COTS) && (nconf->nc_semantics != NC_TPI_COTS_ORD)) - return; /* not my type */ + return (1); /* not my type */ /* * XXX - using RPC library internal functions. @@ -415,7 +516,7 @@ create_service(struct netconfig *nconf) if (!__rpc_nconf2sockinfo(nconf, &si)) { syslog(LOG_ERR, "cannot get information for %s", nconf->nc_netid); - return; + return (1); } /* Get rpc.statd's address on this transport */ @@ -431,6 +532,11 @@ create_service(struct netconfig *nconf) nhostsbak = nhosts; while (nhostsbak > 0) { --nhostsbak; + sock_fd = realloc(sock_fd, (sock_fdcnt + 1) * sizeof(int)); + if (sock_fd == NULL) + out_of_mem(); + sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */ + mallocd_res = 0; /* * XXX - using RPC library internal functions. @@ -445,7 +551,7 @@ create_service(struct netconfig *nconf) case AF_INET: if (inet_pton(AF_INET, hosts[nhostsbak], host_addr) == 1) { - hints.ai_flags &= AI_NUMERICHOST; + hints.ai_flags |= AI_NUMERICHOST; } else { /* * Skip if we have an AF_INET6 address. @@ -460,7 +566,7 @@ create_service(struct netconfig *nconf) case AF_INET6: if (inet_pton(AF_INET6, hosts[nhostsbak], host_addr) == 1) { - hints.ai_flags &= AI_NUMERICHOST; + hints.ai_flags |= AI_NUMERICHOST; } else { /* * Skip if we have an AF_INET address. @@ -484,6 +590,7 @@ create_service(struct netconfig *nconf) res = malloc(sizeof(struct addrinfo)); if (res == NULL) out_of_mem(); + mallocd_res = 1; res->ai_flags = hints.ai_flags; res->ai_family = hints.ai_family; res->ai_protocol = hints.ai_protocol; @@ -497,7 +604,7 @@ create_service(struct netconfig *nconf) sin->sin_addr.s_addr = htonl(INADDR_ANY); res->ai_addr = (struct sockaddr*) sin; res->ai_addrlen = (socklen_t) - sizeof(res->ai_addr); + sizeof(struct sockaddr_in); break; case AF_INET6: sin6 = malloc(sizeof(struct sockaddr_in6)); @@ -507,10 +614,14 @@ create_service(struct netconfig *nconf) sin6->sin6_port = htons(0); sin6->sin6_addr = in6addr_any; res->ai_addr = (struct sockaddr*) sin6; - res->ai_addrlen = (socklen_t) sizeof(res->ai_addr); + res->ai_addrlen = (socklen_t) + sizeof(struct sockaddr_in6); break; default: - break; + syslog(LOG_ERR, + "bad addr fam %d", + res->ai_family); + exit(1); } } else { if ((aicode = getaddrinfo(NULL, svcport_str, @@ -519,6 +630,7 @@ create_service(struct netconfig *nconf) "cannot get local address for %s: %s", nconf->nc_netid, gai_strerror(aicode)); + close(fd); continue; } } @@ -528,16 +640,92 @@ create_service(struct netconfig *nconf) syslog(LOG_ERR, "cannot get local address for %s: %s", nconf->nc_netid, gai_strerror(aicode)); + close(fd); continue; } } + + /* Store the fd. */ + sock_fd[sock_fdcnt - 1] = fd; + + /* Now, attempt the bind. */ r = bindresvport_sa(fd, res->ai_addr); if (r != 0) { + if (errno == EADDRINUSE && mallocd_svcport != 0) { + if (mallocd_res != 0) { + free(res->ai_addr); + free(res); + } else + freeaddrinfo(res); + return (-1); + } syslog(LOG_ERR, "bindresvport_sa: %m"); exit(1); } + if (svcport_str == NULL) { + svcport_str = malloc(NI_MAXSERV * sizeof(char)); + if (svcport_str == NULL) + out_of_mem(); + mallocd_svcport = 1; + + if (getnameinfo(res->ai_addr, + res->ai_addr->sa_len, NULL, NI_MAXHOST, + svcport_str, NI_MAXSERV * sizeof(char), + NI_NUMERICHOST | NI_NUMERICSERV)) + errx(1, "Cannot get port number"); + } + if (mallocd_res != 0) { + free(res->ai_addr); + free(res); + } else + freeaddrinfo(res); + res = NULL; + } + return (0); +} + +/* + * Called after all the create_service() calls have succeeded, to complete + * the setup and registration. + */ +static void +complete_service(struct netconfig *nconf, char *port_str) +{ + struct addrinfo hints, *res = NULL; + struct __rpc_sockinfo si; + struct netbuf servaddr; + SVCXPRT *transp = NULL; + int aicode, fd, nhostsbak; + int registered = 0; + + if ((nconf->nc_semantics != NC_TPI_CLTS) && + (nconf->nc_semantics != NC_TPI_COTS) && + (nconf->nc_semantics != NC_TPI_COTS_ORD)) + return; /* not my type */ + + /* + * XXX - using RPC library internal functions. + */ + if (!__rpc_nconf2sockinfo(nconf, &si)) { + syslog(LOG_ERR, "cannot get information for %s", + nconf->nc_netid); + return; + } + + nhostsbak = nhosts; + while (nhostsbak > 0) { + --nhostsbak; + if (sock_fdpos >= sock_fdcnt) { + /* Should never happen. */ + syslog(LOG_ERR, "Ran out of socket fd's"); + return; + } + fd = sock_fd[sock_fdpos++]; + if (fd < 0) + continue; + if (nconf->nc_semantics != NC_TPI_CLTS) listen(fd, SOMAXCONN); @@ -581,19 +769,7 @@ create_service(struct netconfig *nconf) hints.ai_socktype = si.si_socktype; hints.ai_protocol = si.si_proto; - if (svcport_str == NULL) { - svcport_str = malloc(NI_MAXSERV * sizeof(char)); - if (svcport_str == NULL) - out_of_mem(); - - if (getnameinfo(res->ai_addr, - res->ai_addr->sa_len, NULL, NI_MAXHOST, - svcport_str, NI_MAXSERV * sizeof(char), - NI_NUMERICHOST | NI_NUMERICSERV)) - errx(1, "Cannot get port number"); - } - - if((aicode = getaddrinfo(NULL, svcport_str, &hints, + if ((aicode = getaddrinfo(NULL, port_str, &hints, &res)) != 0) { syslog(LOG_ERR, "cannot get local address: %s", gai_strerror(aicode)); @@ -616,6 +792,23 @@ create_service(struct netconfig *nconf) } /* + * Clear out sockets after a failure to bind one of them, so that the + * cycle of socket creation/binding can start anew. + */ +static void +clearout_service(void) +{ + int i; + + for (i = 0; i < sock_fdcnt; i++) { + if (sock_fd[i] >= 0) { + shutdown(sock_fd[i], SHUT_RDWR); + close(sock_fd[i]); + } + } +} + +/* * Look up addresses for the kernel to create transports for. */ void From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 16:23:50 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 70125106564A; Fri, 17 Jun 2011 16:23:50 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5E5FA8FC14; Fri, 17 Jun 2011 16:23:50 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5HGNoaX098060; Fri, 17 Jun 2011 16:23:50 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5HGNoaQ098058; Fri, 17 Jun 2011 16:23:50 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201106171623.p5HGNoaQ098058@svn.freebsd.org> From: Rick Macklem Date: Fri, 17 Jun 2011 16:23:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223191 - stable/8/usr.sbin/rpc.statd X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 16:23:50 -0000 Author: rmacklem Date: Fri Jun 17 16:23:50 2011 New Revision: 223191 URL: http://svn.freebsd.org/changeset/base/223191 Log: MFC: r222627 Fix the nfs related daemons so that they don't intermittently fail with "bind: address already in use". This problem was reported to the freebsd-stable@ mailing list on Feb. 19 under the subject heading "statd/lockd startup failure" by george+freebsd at m5p dot com. The problem is that the first combination of {udp,tcp X ipv4,ipv6} would select a port# dynamically, but one of the other three combinations would have that port# already in use. The patch is somewhat involved because it was requested by dougb@ that the four combinations use the same port# wherever possible. The patch splits the create_service() function into two functions. The first goes as far as bind(2) in a loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port# for all four cases. If these attempts fail, the last attempt allows the 4 cases to use different port #s. After this function has succeeded, the second function, called complete_service(), does the rest of what create_service() did. The three daemons mountd, rpc.lockd and rpc.statd all have a create_service() function that is patched in a similar way. However, create_service() has non-trivial differences for the three daemons that made it impractical to share the same functions between them. Modified: stable/8/usr.sbin/rpc.statd/statd.c Directory Properties: stable/8/usr.sbin/rpc.statd/ (props changed) Modified: stable/8/usr.sbin/rpc.statd/statd.c ============================================================================== --- stable/8/usr.sbin/rpc.statd/statd.c Fri Jun 17 16:21:03 2011 (r223190) +++ stable/8/usr.sbin/rpc.statd/statd.c Fri Jun 17 16:23:50 2011 (r223191) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -55,13 +56,21 @@ __FBSDID("$FreeBSD$"); #include #include "statd.h" +#define GETPORT_MAXTRY 20 /* Max tries to get a port # */ + int debug = 0; /* Controls syslog() calls for debug messages */ char **hosts, *svcport_str = NULL; int nhosts = 0; int xcreated = 0; - -void create_service(struct netconfig *nconf); +static int mallocd_svcport = 0; +static int *sock_fd; +static int sock_fdcnt; +static int sock_fdpos; + +static int create_service(struct netconfig *nconf); +static void complete_service(struct netconfig *nconf, char *port_str); +static void clearout_service(void); static void handle_sigchld(int sig); void out_of_mem(void); @@ -78,6 +87,8 @@ main(int argc, char **argv) char *endptr, **hosts_bak; int have_v6 = 1; int maxrec = RPC_MAXDATASIZE; + int attempt_cnt, port_len, port_pos, ret; + char **port_list; while ((ch = getopt(argc, argv, "dh:p:")) != -1) switch (ch) { @@ -176,6 +187,11 @@ main(int argc, char **argv) hosts[nhosts - 1] = "127.0.0.1"; } + attempt_cnt = 1; + sock_fdcnt = 0; + sock_fd = NULL; + port_list = NULL; + port_len = 0; nc_handle = setnetconfig(); while ((nconf = getnetconfig(nc_handle))) { /* We want to listen only on udp6, tcp6, udp, tcp transports */ @@ -184,11 +200,87 @@ main(int argc, char **argv) if (have_v6 == 0 && strcmp(nconf->nc_protofmly, "inet6") == 0) { /* DO NOTHING */ } else { - create_service(nconf); + ret = create_service(nconf); + if (ret == 1) + /* Ignore this call */ + continue; + if (ret < 0) { + /* + * Failed to bind port, so close off + * all sockets created and try again + * if the port# was dynamically + * assigned via bind(2). + */ + clearout_service(); + if (mallocd_svcport != 0 && + attempt_cnt < GETPORT_MAXTRY) { + free(svcport_str); + svcport_str = NULL; + mallocd_svcport = 0; + } else { + errno = EADDRINUSE; + syslog(LOG_ERR, + "bindresvport_sa: %m"); + exit(1); + } + + /* Start over at the first service. */ + free(sock_fd); + sock_fdcnt = 0; + sock_fd = NULL; + nc_handle = setnetconfig(); + attempt_cnt++; + } else if (mallocd_svcport != 0 && + attempt_cnt == GETPORT_MAXTRY) { + /* + * For the last attempt, allow + * different port #s for each nconf + * by saving the svcport_str and + * setting it back to NULL. + */ + port_list = realloc(port_list, + (port_len + 1) * sizeof(char *)); + if (port_list == NULL) + out_of_mem(); + port_list[port_len++] = svcport_str; + svcport_str = NULL; + mallocd_svcport = 0; + } } } } + + /* + * Successfully bound the ports, so call complete_service() to + * do the rest of the setup on the service(s). + */ + sock_fdpos = 0; + port_pos = 0; + nc_handle = setnetconfig(); + while ((nconf = getnetconfig(nc_handle))) { + /* We want to listen only on udp6, tcp6, udp, tcp transports */ + if (nconf->nc_flag & NC_VISIBLE) { + /* Skip if there's no IPv6 support */ + if (have_v6 == 0 && strcmp(nconf->nc_protofmly, "inet6") == 0) { + /* DO NOTHING */ + } else if (port_list != NULL) { + if (port_pos >= port_len) { + syslog(LOG_ERR, "too many port#s"); + exit(1); + } + complete_service(nconf, port_list[port_pos++]); + } else + complete_service(nconf, svcport_str); + } + } endnetconfig(nc_handle); + free(sock_fd); + if (port_list != NULL) { + for (port_pos = 0; port_pos < port_len; port_pos++) + free(port_list[port_pos]); + free(port_list); + } + init_file("/var/db/statd.status"); /* Note that it is NOT sensible to run this program from inetd - the */ @@ -215,29 +307,30 @@ main(int argc, char **argv) /* * This routine creates and binds sockets on the appropriate - * addresses. It gets called one time for each transport and - * registrates the service with rpcbind on that trasport. + * addresses. It gets called one time for each transport. + * It returns 0 upon success, 1 for ingore the call and -1 to indicate + * bind failed with EADDRINUSE. + * Any file descriptors that have been created are stored in sock_fd and + * the total count of them is maintained in sock_fdcnt. */ -void +static int create_service(struct netconfig *nconf) { struct addrinfo hints, *res = NULL; struct sockaddr_in *sin; struct sockaddr_in6 *sin6; struct __rpc_sockinfo si; - struct netbuf servaddr; - SVCXPRT *transp = NULL; int aicode; int fd; int nhostsbak; int r; - int registered = 0; u_int32_t host_addr[4]; /* IPv4 or IPv6 */ + int mallocd_res; if ((nconf->nc_semantics != NC_TPI_CLTS) && (nconf->nc_semantics != NC_TPI_COTS) && (nconf->nc_semantics != NC_TPI_COTS_ORD)) - return; /* not my type */ + return (1); /* not my type */ /* * XXX - using RPC library internal functions. @@ -245,7 +338,7 @@ create_service(struct netconfig *nconf) if (!__rpc_nconf2sockinfo(nconf, &si)) { syslog(LOG_ERR, "cannot get information for %s", nconf->nc_netid); - return; + return (1); } /* Get rpc.statd's address on this transport */ @@ -261,6 +354,11 @@ create_service(struct netconfig *nconf) nhostsbak = nhosts; while (nhostsbak > 0) { --nhostsbak; + sock_fd = realloc(sock_fd, (sock_fdcnt + 1) * sizeof(int)); + if (sock_fd == NULL) + out_of_mem(); + sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */ + mallocd_res = 0; /* * XXX - using RPC library internal functions. @@ -274,7 +372,7 @@ create_service(struct netconfig *nconf) case AF_INET: if (inet_pton(AF_INET, hosts[nhostsbak], host_addr) == 1) { - hints.ai_flags &= AI_NUMERICHOST; + hints.ai_flags |= AI_NUMERICHOST; } else { /* * Skip if we have an AF_INET6 address. @@ -289,7 +387,7 @@ create_service(struct netconfig *nconf) case AF_INET6: if (inet_pton(AF_INET6, hosts[nhostsbak], host_addr) == 1) { - hints.ai_flags &= AI_NUMERICHOST; + hints.ai_flags |= AI_NUMERICHOST; } else { /* * Skip if we have an AF_INET address. @@ -313,6 +411,7 @@ create_service(struct netconfig *nconf) res = malloc(sizeof(struct addrinfo)); if (res == NULL) out_of_mem(); + mallocd_res = 1; res->ai_flags = hints.ai_flags; res->ai_family = hints.ai_family; res->ai_protocol = hints.ai_protocol; @@ -326,7 +425,7 @@ create_service(struct netconfig *nconf) sin->sin_addr.s_addr = htonl(INADDR_ANY); res->ai_addr = (struct sockaddr*) sin; res->ai_addrlen = (socklen_t) - sizeof(res->ai_addr); + sizeof(struct sockaddr_in); break; case AF_INET6: sin6 = malloc(sizeof(struct sockaddr_in6)); @@ -336,10 +435,13 @@ create_service(struct netconfig *nconf) sin6->sin6_port = htons(0); sin6->sin6_addr = in6addr_any; res->ai_addr = (struct sockaddr*) sin6; - res->ai_addrlen = (socklen_t) sizeof(res->ai_addr); + res->ai_addrlen = (socklen_t) + sizeof(struct sockaddr_in6); break; default: - break; + syslog(LOG_ERR, "bad addr fam %d", + res->ai_family); + exit(1); } } else { if ((aicode = getaddrinfo(NULL, svcport_str, @@ -348,6 +450,7 @@ create_service(struct netconfig *nconf) "cannot get local address for %s: %s", nconf->nc_netid, gai_strerror(aicode)); + close(fd); continue; } } @@ -357,16 +460,91 @@ create_service(struct netconfig *nconf) syslog(LOG_ERR, "cannot get local address for %s: %s", nconf->nc_netid, gai_strerror(aicode)); + close(fd); continue; } } + /* Store the fd. */ + sock_fd[sock_fdcnt - 1] = fd; + + /* Now, attempt the bind. */ r = bindresvport_sa(fd, res->ai_addr); if (r != 0) { + if (errno == EADDRINUSE && mallocd_svcport != 0) { + if (mallocd_res != 0) { + free(res->ai_addr); + free(res); + } else + freeaddrinfo(res); + return (-1); + } syslog(LOG_ERR, "bindresvport_sa: %m"); exit(1); } + if (svcport_str == NULL) { + svcport_str = malloc(NI_MAXSERV * sizeof(char)); + if (svcport_str == NULL) + out_of_mem(); + mallocd_svcport = 1; + + if (getnameinfo(res->ai_addr, + res->ai_addr->sa_len, NULL, NI_MAXHOST, + svcport_str, NI_MAXSERV * sizeof(char), + NI_NUMERICHOST | NI_NUMERICSERV)) + errx(1, "Cannot get port number"); + } + if (mallocd_res != 0) { + free(res->ai_addr); + free(res); + } else + freeaddrinfo(res); + res = NULL; + } + return (0); +} + +/* + * Called after all the create_service() calls have succeeded, to complete + * the setup and registration. + */ +static void +complete_service(struct netconfig *nconf, char *port_str) +{ + struct addrinfo hints, *res = NULL; + struct __rpc_sockinfo si; + struct netbuf servaddr; + SVCXPRT *transp = NULL; + int aicode, fd, nhostsbak; + int registered = 0; + + if ((nconf->nc_semantics != NC_TPI_CLTS) && + (nconf->nc_semantics != NC_TPI_COTS) && + (nconf->nc_semantics != NC_TPI_COTS_ORD)) + return; /* not my type */ + + /* + * XXX - using RPC library internal functions. + */ + if (!__rpc_nconf2sockinfo(nconf, &si)) { + syslog(LOG_ERR, "cannot get information for %s", + nconf->nc_netid); + return; + } + + nhostsbak = nhosts; + while (nhostsbak > 0) { + --nhostsbak; + if (sock_fdpos >= sock_fdcnt) { + /* Should never happen. */ + syslog(LOG_ERR, "Ran out of socket fd's"); + return; + } + fd = sock_fd[sock_fdpos++]; + if (fd < 0) + continue; + if (nconf->nc_semantics != NC_TPI_CLTS) listen(fd, SOMAXCONN); @@ -397,19 +575,8 @@ create_service(struct netconfig *nconf) hints.ai_socktype = si.si_socktype; hints.ai_protocol = si.si_proto; - if (svcport_str == NULL) { - svcport_str = malloc(NI_MAXSERV * sizeof(char)); - if (svcport_str == NULL) - out_of_mem(); - - if (getnameinfo(res->ai_addr, - res->ai_addr->sa_len, NULL, NI_MAXHOST, - svcport_str, NI_MAXSERV * sizeof(char), - NI_NUMERICHOST | NI_NUMERICSERV)) - errx(1, "Cannot get port number"); - } - if((aicode = getaddrinfo(NULL, svcport_str, &hints, + if ((aicode = getaddrinfo(NULL, port_str, &hints, &res)) != 0) { syslog(LOG_ERR, "cannot get local address: %s", gai_strerror(aicode)); @@ -428,6 +595,23 @@ create_service(struct netconfig *nconf) } /* end while */ } +/* + * Clear out sockets after a failure to bind one of them, so that the + * cycle of socket creation/binding can start anew. + */ +static void +clearout_service(void) +{ + int i; + + for (i = 0; i < sock_fdcnt; i++) { + if (sock_fd[i] >= 0) { + shutdown(sock_fd[i], SHUT_RDWR); + close(sock_fd[i]); + } + } +} + static void usage() { From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 17 18:16:23 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CC5DD1065674; Fri, 17 Jun 2011 18:16:23 +0000 (UTC) (envelope-from dchagin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BBA5E8FC21; Fri, 17 Jun 2011 18:16:23 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5HIGN6L001630; Fri, 17 Jun 2011 18:16:23 GMT (envelope-from dchagin@svn.freebsd.org) Received: (from dchagin@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5HIGNaH001628; Fri, 17 Jun 2011 18:16:23 GMT (envelope-from dchagin@svn.freebsd.org) Message-Id: <201106171816.p5HIGNaH001628@svn.freebsd.org> From: Dmitry Chagin Date: Fri, 17 Jun 2011 18:16:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223194 - stable/8/usr.bin/kdump X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 18:16:23 -0000 Author: dchagin Date: Fri Jun 17 18:16:23 2011 New Revision: 223194 URL: http://svn.freebsd.org/changeset/base/223194 Log: MFC r222768: Fix regex for ptraceopname(). PR: bin/157663 Submitted by: jason wright Modified: stable/8/usr.bin/kdump/mksubr Directory Properties: stable/8/usr.bin/kdump/ (props changed) Modified: stable/8/usr.bin/kdump/mksubr ============================================================================== --- stable/8/usr.bin/kdump/mksubr Fri Jun 17 17:55:37 2011 (r223193) +++ stable/8/usr.bin/kdump/mksubr Fri Jun 17 18:16:23 2011 (r223194) @@ -343,7 +343,7 @@ auto_if_type "sockfamilyname" "AF_[[:aln auto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h" auto_switch_type "sockoptname" "SO_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h" auto_switch_type "socktypename" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h" -auto_switch_type "ptraceopname" "PT_[[:alnum:]]+[[:space:]]+[0-9]+" "sys/ptrace.h" +auto_switch_type "ptraceopname" "PT_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/ptrace.h" cat <<_EOF_ /* From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 05:12:55 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 25E6A1065673; Sat, 18 Jun 2011 05:12:55 +0000 (UTC) (envelope-from jh@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 155E58FC0C; Sat, 18 Jun 2011 05:12:55 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5I5CsjY023276; Sat, 18 Jun 2011 05:12:54 GMT (envelope-from jh@svn.freebsd.org) Received: (from jh@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5I5CskW023274; Sat, 18 Jun 2011 05:12:54 GMT (envelope-from jh@svn.freebsd.org) Message-Id: <201106180512.p5I5CskW023274@svn.freebsd.org> From: Jaakko Heinonen Date: Sat, 18 Jun 2011 05:12:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223220 - stable/8/lib/libgeom X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 05:12:55 -0000 Author: jh Date: Sat Jun 18 05:12:54 2011 New Revision: 223220 URL: http://svn.freebsd.org/changeset/base/223220 Log: MFC r216177: Remove stale link. PR: 151252 Modified: stable/8/lib/libgeom/libgeom.3 Directory Properties: stable/8/lib/libgeom/ (props changed) Modified: stable/8/lib/libgeom/libgeom.3 ============================================================================== --- stable/8/lib/libgeom/libgeom.3 Sat Jun 18 03:16:51 2011 (r223219) +++ stable/8/lib/libgeom/libgeom.3 Sat Jun 18 05:12:54 2011 (r223220) @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 16, 2010 +.Dd December 4, 2010 .Dt LIBGEOM 3 .Os .Sh NAME @@ -382,8 +382,6 @@ if (errstr != NULL) err(1, "could not destroy ccd: %s", errstr); gctl_free(H); .Ed -.Sh SEE ALSO -.Pa http://ezine.daemonnews.org/200308/blueprints.html .Sh HISTORY The .Nm geom From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:17:14 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4DADB1065672; Sat, 18 Jun 2011 11:17:14 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 22FDC8FC15; Sat, 18 Jun 2011 11:17:14 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBHEVE037680; Sat, 18 Jun 2011 11:17:14 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBHDew037676; Sat, 18 Jun 2011 11:17:13 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181117.p5IBHDew037676@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:17:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223229 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:17:14 -0000 Author: bschmidt Date: Sat Jun 18 11:17:13 2011 New Revision: 223229 URL: http://svn.freebsd.org/changeset/base/223229 Log: MFC r220633: Remove IWN_FLAG_HAS_5GHZ and IWN_PCI_BAR0, both unused. Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:07:09 2011 (r223228) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:17:13 2011 (r223229) @@ -1792,7 +1792,6 @@ iwn_read_eeprom_band(struct iwn_softc *s c->ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_A); c->ic_flags = IEEE80211_CHAN_A | nflags; - sc->sc_flags |= IWN_FLAG_HAS_5GHZ; } #if 0 /* HT */ /* XXX no constraints on using HT20 */ Modified: stable/8/sys/dev/iwn/if_iwnreg.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:07:09 2011 (r223228) +++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:17:13 2011 (r223229) @@ -50,9 +50,6 @@ #define IWN_HIADDR(paddr) (0) #endif -/* Base Address Register. */ -#define IWN_PCI_BAR0 PCI_MAPREG_START - /* * Control and status registers. */ Modified: stable/8/sys/dev/iwn/if_iwnvar.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 11:07:09 2011 (r223228) +++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 11:17:13 2011 (r223229) @@ -215,7 +215,6 @@ struct iwn_softc { struct resource *irq; u_int sc_flags; -#define IWN_FLAG_HAS_5GHZ (1 << 0) #define IWN_FLAG_HAS_OTPROM (1 << 1) #define IWN_FLAG_CALIB_DONE (1 << 2) #define IWN_FLAG_USE_ICT (1 << 3) From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:19:12 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E59CD106564A; Sat, 18 Jun 2011 11:19:12 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D42608FC0A; Sat, 18 Jun 2011 11:19:12 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBJCjh037780; Sat, 18 Jun 2011 11:19:12 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBJCBr037778; Sat, 18 Jun 2011 11:19:12 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181119.p5IBJCBr037778@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:19:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223230 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:19:13 -0000 Author: bschmidt Date: Sat Jun 18 11:19:12 2011 New Revision: 223230 URL: http://svn.freebsd.org/changeset/base/223230 Log: MFC r220634: Reuse net80211 code: - IWN_TXOP_TO_US is equal to IEEE80211_TXOP_TO_US - use IEEE80211_DUR_TU - ieee80211_add_rates/ieee80211_add_xrates are public, use em - copied ieee80211_add_ssid it is not public Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:17:13 2011 (r223229) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:19:12 2011 (r223230) @@ -198,6 +198,7 @@ static void iwn_tune_sensitivity(struct static int iwn_send_sensitivity(struct iwn_softc *); static int iwn_set_pslevel(struct iwn_softc *, int, int, int); static int iwn_config(struct iwn_softc *); +static uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int); static int iwn_scan(struct iwn_softc *); static int iwn_auth(struct iwn_softc *, struct ieee80211vap *vap); static int iwn_run(struct iwn_softc *, struct ieee80211vap *vap); @@ -3636,7 +3637,6 @@ static int iwn_wme_update(struct ieee80211com *ic) { #define IWN_EXP2(x) ((1 << (x)) - 1) /* CWmin = 2^ECWmin - 1 */ -#define IWN_TXOP_TO_US(v) (v<<5) struct iwn_softc *sc = ic->ic_ifp->if_softc; struct iwn_edca_params cmd; int i; @@ -3650,7 +3650,7 @@ iwn_wme_update(struct ieee80211com *ic) cmd.ac[i].cwmin = htole16(IWN_EXP2(wmep->wmep_logcwmin)); cmd.ac[i].cwmax = htole16(IWN_EXP2(wmep->wmep_logcwmax)); cmd.ac[i].txoplimit = - htole16(IWN_TXOP_TO_US(wmep->wmep_txopLimit)); + htole16(IEEE80211_TXOP_TO_US(wmep->wmep_txopLimit)); } IEEE80211_UNLOCK(ic); IWN_LOCK(sc); @@ -3658,7 +3658,6 @@ iwn_wme_update(struct ieee80211com *ic) IWN_UNLOCK(sc); IEEE80211_LOCK(ic); return 0; -#undef IWN_TXOP_TO_US #undef IWN_EXP2 } @@ -3720,7 +3719,7 @@ iwn_set_timing(struct iwn_softc *sc, str cmd.lintval = htole16(10); /* Compute remaining time until next beacon. */ - val = (uint64_t)ni->ni_intval * 1024; /* msecs -> usecs */ + val = (uint64_t)ni->ni_intval * IEEE80211_DUR_TU; mod = le64toh(cmd.tstamp) % val; cmd.binitval = htole32((uint32_t)(val - mod)); @@ -4270,7 +4269,7 @@ iwn_tune_sensitivity(struct iwn_softc *s /* Compute number of false alarms since last call for OFDM. */ fa = le32toh(stats->ofdm.bad_plcp) - calib->bad_plcp_ofdm; fa += le32toh(stats->ofdm.fa) - calib->fa_ofdm; - fa *= 200 * 1024; /* 200TU */ + fa *= 200 * IEEE80211_DUR_TU; /* 200TU */ /* Save counters values for next call. */ calib->bad_plcp_ofdm = le32toh(stats->ofdm.bad_plcp); @@ -4327,7 +4326,7 @@ iwn_tune_sensitivity(struct iwn_softc *s /* Compute number of false alarms since last call for CCK. */ fa = le32toh(stats->cck.bad_plcp) - calib->bad_plcp_cck; fa += le32toh(stats->cck.fa) - calib->fa_cck; - fa *= 200 * 1024; /* 200TU */ + fa *= 200 * IEEE80211_DUR_TU; /* 200TU */ /* Save counters values for next call. */ calib->bad_plcp_cck = le32toh(stats->cck.bad_plcp); @@ -4586,6 +4585,18 @@ iwn_config(struct iwn_softc *sc) return 0; } +/* + * Add an ssid element to a frame. + */ +static uint8_t * +ieee80211_add_ssid(uint8_t *frm, const uint8_t *ssid, u_int len) +{ + *frm++ = IEEE80211_ELEMID_SSID; + *frm++ = len; + memcpy(frm, ssid, len); + return frm + len; +} + static int iwn_scan(struct iwn_softc *sc) { @@ -4599,7 +4610,7 @@ iwn_scan(struct iwn_softc *sc) struct ieee80211_frame *wh; struct ieee80211_rateset *rs; struct ieee80211_channel *c; - int buflen, error, nrates; + int buflen, error; uint16_t rxchain; uint8_t *buf, *frm, txant; @@ -4675,30 +4686,14 @@ iwn_scan(struct iwn_softc *sc) *(uint16_t *)&wh->i_seq[0] = 0; /* filled by HW */ frm = (uint8_t *)(wh + 1); - - /* Add SSID IE. */ - *frm++ = IEEE80211_ELEMID_SSID; - *frm++ = ss->ss_ssid[0].len; - memcpy(frm, ss->ss_ssid[0].ssid, ss->ss_ssid[0].len); - frm += ss->ss_ssid[0].len; - - /* Add supported rates IE. */ - *frm++ = IEEE80211_ELEMID_RATES; - nrates = rs->rs_nrates; - if (nrates > IEEE80211_RATE_SIZE) - nrates = IEEE80211_RATE_SIZE; - *frm++ = nrates; - memcpy(frm, rs->rs_rates, nrates); - frm += nrates; - - /* Add supported xrates IE. */ - if (rs->rs_nrates > IEEE80211_RATE_SIZE) { - nrates = rs->rs_nrates - IEEE80211_RATE_SIZE; - *frm++ = IEEE80211_ELEMID_XRATES; - *frm++ = (uint8_t)nrates; - memcpy(frm, rs->rs_rates + IEEE80211_RATE_SIZE, nrates); - frm += nrates; - } + frm = ieee80211_add_ssid(frm, NULL, 0); + frm = ieee80211_add_rates(frm, rs); + if (rs->rs_nrates > IEEE80211_RATE_SIZE) + frm = ieee80211_add_xrates(frm, rs); +#if 0 /* HT */ + if (ic->ic_flags & IEEE80211_F_HTON) + frm = ieee80211_add_htcaps(frm, ic); +#endif /* Set length of probe request. */ tx->len = htole16(frm - (uint8_t *)wh); From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:21:56 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D9C1D1065677; Sat, 18 Jun 2011 11:21:56 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C8ADB8FC0A; Sat, 18 Jun 2011 11:21:56 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBLuhV037915; Sat, 18 Jun 2011 11:21:56 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBLuBW037913; Sat, 18 Jun 2011 11:21:56 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181121.p5IBLuBW037913@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:21:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223231 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:21:57 -0000 Author: bschmidt Date: Sat Jun 18 11:21:56 2011 New Revision: 223231 URL: http://svn.freebsd.org/changeset/base/223231 Log: MFC r220635: iwn_cleanup() is just a wrapper around iwn_detach(), call it directly instead. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:19:12 2011 (r223230) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:21:56 2011 (r223231) @@ -81,7 +81,6 @@ static struct ieee80211vap *iwn_vap_crea int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t mac[IEEE80211_ADDR_LEN]); static void iwn_vap_delete(struct ieee80211vap *); -static int iwn_cleanup(device_t); static int iwn_detach(device_t); static int iwn_nic_lock(struct iwn_softc *); static int iwn_eeprom_lock(struct iwn_softc *); @@ -684,7 +683,7 @@ iwn_attach(device_t dev) ieee80211_announce(ic); return 0; fail: - iwn_cleanup(dev); + iwn_detach(dev); return error; } @@ -845,7 +844,7 @@ iwn_vap_delete(struct ieee80211vap *vap) } static int -iwn_cleanup(device_t dev) +iwn_detach(device_t dev) { struct iwn_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; @@ -895,13 +894,6 @@ iwn_cleanup(device_t dev) } static int -iwn_detach(device_t dev) -{ - iwn_cleanup(dev); - return 0; -} - -static int iwn_nic_lock(struct iwn_softc *sc) { int ntries; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:23:42 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 840FD106564A; Sat, 18 Jun 2011 11:23:42 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 595D68FC0A; Sat, 18 Jun 2011 11:23:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBNgHm038019; Sat, 18 Jun 2011 11:23:42 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBNghb038017; Sat, 18 Jun 2011 11:23:42 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181123.p5IBNghb038017@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:23:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223232 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:23:42 -0000 Author: bschmidt Date: Sat Jun 18 11:23:42 2011 New Revision: 223232 URL: http://svn.freebsd.org/changeset/base/223232 Log: MFC r220636: Instead of trying to figure out which rxon.flags to clear, restart from scratch. Remove htole16() calls, rxon.chan is an uint8_t, ieee80211_chan2ieee() does return an ic_ieee as an int, but I heavily doubt a htole16() will buy us anything here. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:21:56 2011 (r223231) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:23:42 2011 (r223232) @@ -4757,7 +4757,7 @@ iwn_auth(struct iwn_softc *sc, struct ie /* Update adapter configuration. */ IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid); - sc->rxon.chan = htole16(ieee80211_chan2ieee(ic, ni->ni_chan)); + sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan); sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); @@ -4843,15 +4843,11 @@ iwn_run(struct iwn_softc *sc, struct iee /* Update adapter configuration. */ IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid); - sc->rxon.chan = htole16(ieee80211_chan2ieee(ic, ni->ni_chan)); sc->rxon.associd = htole16(IEEE80211_AID(ni->ni_associd)); - /* Short preamble and slot time are negotiated when associating. */ - sc->rxon.flags &= ~htole32(IWN_RXON_SHPREAMBLE | IWN_RXON_SHSLOT); - sc->rxon.flags |= htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); + sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan); + sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); - else - sc->rxon.flags &= ~htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); if (ic->ic_flags & IEEE80211_F_SHSLOT) sc->rxon.flags |= htole32(IWN_RXON_SHSLOT); if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:25:34 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 61C0E106564A; Sat, 18 Jun 2011 11:25:34 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 374BF8FC0A; Sat, 18 Jun 2011 11:25:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBPYTx038123; Sat, 18 Jun 2011 11:25:34 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBPY9e038120; Sat, 18 Jun 2011 11:25:34 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181125.p5IBPY9e038120@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:25:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223233 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:25:34 -0000 Author: bschmidt Date: Sat Jun 18 11:25:33 2011 New Revision: 223233 URL: http://svn.freebsd.org/changeset/base/223233 Log: MFC r220659: Don't timeout when stopping DMA channels. Obtained from: OpenBSD Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:23:42 2011 (r223232) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:25:33 2011 (r223233) @@ -4003,7 +4003,7 @@ iwn4965_get_temperature(struct iwn_softc return 0; /* Sign-extend 23-bit R4 value to 32-bit. */ - r4 = (r4 << 8) >> 8; + r4 = ((r4 & 0xffffff) ^ 0x800000) - 0x800000; /* Compute temperature in Kelvin. */ temp = (259 * (r4 - r2)) / (r3 - r1); temp = (temp * 97) / 100 + 8; @@ -6283,7 +6283,6 @@ static void iwn_hw_stop(struct iwn_softc *sc) { const struct iwn_hal *hal = sc->sc_hal; - uint32_t tmp; int chnl, qid, ntries; IWN_WRITE(sc, IWN_RESET, IWN_RESET_NEVO); @@ -6305,8 +6304,7 @@ iwn_hw_stop(struct iwn_softc *sc) for (chnl = 0; chnl < hal->ndmachnls; chnl++) { IWN_WRITE(sc, IWN_FH_TX_CONFIG(chnl), 0); for (ntries = 0; ntries < 200; ntries++) { - tmp = IWN_READ(sc, IWN_FH_TX_STATUS); - if ((tmp & IWN_FH_TX_STATUS_IDLE(chnl)) == + if (IWN_READ(sc, IWN_FH_TX_STATUS) & IWN_FH_TX_STATUS_IDLE(chnl)) break; DELAY(10); Modified: stable/8/sys/dev/iwn/if_iwnreg.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:23:42 2011 (r223232) +++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:25:33 2011 (r223233) @@ -283,8 +283,7 @@ #define IWN_FH_TX_CHICKEN_SCHED_RETRY (1 << 1) /* Possible flags for register IWN_FH_TX_STATUS. */ -#define IWN_FH_TX_STATUS_IDLE(chnl) \ - (1 << ((chnl) + 24) | 1 << ((chnl) + 16)) +#define IWN_FH_TX_STATUS_IDLE(chnl) (1 << ((chnl) + 16)) /* Possible flags for register IWN_FH_RX_CONFIG. */ #define IWN_FH_RX_CONFIG_ENA (1 << 31) From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:27:28 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AAAAA106564A; Sat, 18 Jun 2011 11:27:28 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 999578FC14; Sat, 18 Jun 2011 11:27:28 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBRSbf038230; Sat, 18 Jun 2011 11:27:28 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBRSte038228; Sat, 18 Jun 2011 11:27:28 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181127.p5IBRSte038228@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:27:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223234 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:27:28 -0000 Author: bschmidt Date: Sat Jun 18 11:27:28 2011 New Revision: 223234 URL: http://svn.freebsd.org/changeset/base/223234 Log: MFC r220660: Only handle beacon misses while in RUN state and not scanning. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:25:33 2011 (r223233) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:27:28 2011 (r223234) @@ -2463,23 +2463,22 @@ iwn_notif_intr(struct iwn_softc *sc) BUS_DMASYNC_POSTREAD); misses = le32toh(miss->consecutive); - /* XXX not sure why we're notified w/ zero */ - if (misses == 0) - break; DPRINTF(sc, IWN_DEBUG_STATE, "%s: beacons missed %d/%d\n", __func__, misses, le32toh(miss->total)); - /* * If more than 5 consecutive beacons are missed, * reinitialize the sensitivity state machine. */ - if (vap->iv_state == IEEE80211_S_RUN && misses > 5) - (void) iwn_init_sensitivity(sc); - if (misses >= vap->iv_bmissthreshold) { - IWN_UNLOCK(sc); - ieee80211_beacon_miss(ic); - IWN_LOCK(sc); + if (vap->iv_state == IEEE80211_S_RUN && + (ic->ic_flags & IEEE80211_F_SCAN) != 0) { + if (misses > 5) + (void)iwn_init_sensitivity(sc); + if (misses >= vap->iv_bmissthreshold) { + IWN_UNLOCK(sc); + ieee80211_beacon_miss(ic); + IWN_LOCK(sc); + } } break; } From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:29:45 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 24712106564A; Sat, 18 Jun 2011 11:29:45 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0A2CB8FC12; Sat, 18 Jun 2011 11:29:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBTi6L038380; Sat, 18 Jun 2011 11:29:44 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBTiQm038378; Sat, 18 Jun 2011 11:29:44 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181129.p5IBTiQm038378@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:29:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223236 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:29:45 -0000 Author: bschmidt Date: Sat Jun 18 11:29:44 2011 New Revision: 223236 URL: http://svn.freebsd.org/changeset/base/223236 Log: MFC r220661: Fixes for firmware handling: - there is a local variable for sc->fw_dma, use that instead - OpenBSD uses 5*hz to wait for firmware to be loaded - in case the firmware module contains invalid data, actually release it Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:27:44 2011 (r223235) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:29:44 2011 (r223236) @@ -5629,10 +5629,10 @@ iwn4965_load_firmware(struct iwn_softc * /* Copy initialization sections into pre-allocated DMA-safe memory. */ memcpy(dma->vaddr, fw->init.data, fw->init.datasz); - bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); memcpy(dma->vaddr + IWN4965_FW_DATA_MAXSZ, fw->init.text, fw->init.textsz); - bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); /* Tell adapter where to find initialization sections. */ error = iwn_nic_lock(sc); @@ -5670,10 +5670,10 @@ iwn4965_load_firmware(struct iwn_softc * /* Copy runtime sections into pre-allocated DMA-safe memory. */ memcpy(dma->vaddr, fw->main.data, fw->main.datasz); - bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); memcpy(dma->vaddr + IWN4965_FW_DATA_MAXSZ, fw->main.text, fw->main.textsz); - bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); /* Tell adapter where to find runtime sections. */ error = iwn_nic_lock(sc); @@ -5700,7 +5700,7 @@ iwn5000_load_firmware_section(struct iwn /* Copy firmware section into pre-allocated DMA-safe memory. */ memcpy(dma->vaddr, section, size); - bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); error = iwn_nic_lock(sc); if (error != 0) @@ -5726,7 +5726,7 @@ iwn5000_load_firmware_section(struct iwn iwn_nic_unlock(sc); /* Wait at most five seconds for FH DMA transfer to complete. */ - return msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", hz); + return msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", 5 * hz); } static int @@ -5771,7 +5771,7 @@ iwn_read_firmware_leg(struct iwn_softc * size_t hdrlen = 24; uint32_t rev; - ptr = (const uint32_t *)sc->fw_fp->data; + ptr = (const uint32_t *)fw->data; rev = le32toh(*ptr++); /* Check firmware API version. */ @@ -5819,7 +5819,7 @@ iwn_read_firmware_leg(struct iwn_softc * /* * Extract text and data sections from a TLV firmware image. */ -int +static int iwn_read_firmware_tlv(struct iwn_softc *sc, struct iwn_fw_info *fw, uint16_t alt) { @@ -5931,6 +5931,8 @@ iwn_read_firmware(struct iwn_softc *sc) device_printf(sc->sc_dev, "%s: firmware file too short: %zu bytes\n", __func__, fw->size); + firmware_put(sc->fw_fp, FIRMWARE_UNLOAD); + sc->fw_fp = NULL; return EINVAL; } @@ -5942,6 +5944,8 @@ iwn_read_firmware(struct iwn_softc *sc) if (error != 0) { device_printf(sc->sc_dev, "%s: could not read firmware sections\n", __func__); + firmware_put(sc->fw_fp, FIRMWARE_UNLOAD); + sc->fw_fp = NULL; return error; } @@ -5954,6 +5958,8 @@ iwn_read_firmware(struct iwn_softc *sc) (fw->boot.textsz & 3) != 0) { device_printf(sc->sc_dev, "%s: firmware sections too large\n", __func__); + firmware_put(sc->fw_fp, FIRMWARE_UNLOAD); + sc->fw_fp = NULL; return EINVAL; } From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:31:19 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9671A1065670; Sat, 18 Jun 2011 11:31:19 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6BF9B8FC14; Sat, 18 Jun 2011 11:31:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBVJvQ038488; Sat, 18 Jun 2011 11:31:19 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBVJdI038486; Sat, 18 Jun 2011 11:31:19 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181131.p5IBVJdI038486@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:31:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223237 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:31:19 -0000 Author: bschmidt Date: Sat Jun 18 11:31:19 2011 New Revision: 223237 URL: http://svn.freebsd.org/changeset/base/223237 Log: MFC r220662: Split out bluetooth coexistence setup. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:29:44 2011 (r223236) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:31:19 2011 (r223237) @@ -196,6 +196,7 @@ static void iwn_tune_sensitivity(struct const struct iwn_rx_stats *); static int iwn_send_sensitivity(struct iwn_softc *); static int iwn_set_pslevel(struct iwn_softc *, int, int, int); +static int iwn_send_btcoex(struct iwn_softc *); static int iwn_config(struct iwn_softc *); static uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int); static int iwn_scan(struct iwn_softc *); @@ -4464,12 +4465,25 @@ iwn_set_pslevel(struct iwn_softc *sc, in } static int +iwn_send_btcoex(struct iwn_softc *sc) +{ + struct iwn_bluetooth cmd; + + memset(&cmd, 0, sizeof cmd); + cmd.flags = IWN_BT_COEX_CHAN_ANN | IWN_BT_COEX_BT_PRIO; + cmd.lead_time = IWN_BT_LEAD_TIME_DEF; + cmd.max_kill = IWN_BT_MAX_KILL_DEF; + DPRINTF(sc, IWN_DEBUG_RESET, "%s: configuring bluetooth coexistence\n", + __func__); + return iwn_cmd(sc, IWN_CMD_BT_COEX, &cmd, sizeof(cmd), 0); +} + +static int iwn_config(struct iwn_softc *sc) { const struct iwn_hal *hal = sc->sc_hal; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - struct iwn_bluetooth bluetooth; uint32_t txmask; int error; uint16_t rxchain; @@ -4490,13 +4504,7 @@ iwn_config(struct iwn_softc *sc) } /* Configure bluetooth coexistence. */ - memset(&bluetooth, 0, sizeof bluetooth); - bluetooth.flags = IWN_BT_COEX_CHAN_ANN | IWN_BT_COEX_BT_PRIO; - bluetooth.lead_time = IWN_BT_LEAD_TIME_DEF; - bluetooth.max_kill = IWN_BT_MAX_KILL_DEF; - DPRINTF(sc, IWN_DEBUG_RESET, "%s: config bluetooth coexistence\n", - __func__); - error = iwn_cmd(sc, IWN_CMD_BT_COEX, &bluetooth, sizeof bluetooth, 0); + error = iwn_send_btcoex(sc); if (error != 0) { device_printf(sc->sc_dev, "%s: could not configure bluetooth coexistence, error %d\n", From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:33:56 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0CA70106566B; Sat, 18 Jun 2011 11:33:56 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EEC018FC0C; Sat, 18 Jun 2011 11:33:55 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBXtsU038626; Sat, 18 Jun 2011 11:33:55 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBXttw038623; Sat, 18 Jun 2011 11:33:55 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181133.p5IBXttw038623@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:33:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223238 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:33:56 -0000 Author: bschmidt Date: Sat Jun 18 11:33:55 2011 New Revision: 223238 URL: http://svn.freebsd.org/changeset/base/223238 Log: MFC r220667+220668: Split up watchdog and calibration callout. This allows us to use different timing on both and to remove some monitor mode specific hacks (which has no calibration). Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:31:19 2011 (r223237) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:33:55 2011 (r223238) @@ -123,10 +123,9 @@ static struct ieee80211_node *iwn_node_a const uint8_t mac[IEEE80211_ADDR_LEN]); static int iwn_media_change(struct ifnet *); static int iwn_newstate(struct ieee80211vap *, enum ieee80211_state, int); +static void iwn_calib_timeout(void *); static void iwn_rx_phy(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); -static void iwn_timer_timeout(void *); -static void iwn_calib_reset(struct iwn_softc *); static void iwn_rx_done(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); #if 0 /* HT */ @@ -161,7 +160,7 @@ static int iwn_raw_xmit(struct ieee80211 const struct ieee80211_bpf_params *); static void iwn_start(struct ifnet *); static void iwn_start_locked(struct ifnet *); -static void iwn_watchdog(struct iwn_softc *sc); +static void iwn_watchdog(void *); static int iwn_ioctl(struct ifnet *, u_long, caddr_t); static int iwn_cmd(struct iwn_softc *, int, const void *, int, int); static int iwn4965_add_node(struct iwn_softc *, struct iwn_node_info *, @@ -475,7 +474,6 @@ iwn_attach(device_t dev) } IWN_LOCK_INIT(sc); - callout_init_mtx(&sc->sc_timer_to, &sc->sc_mtx, 0); TASK_INIT(&sc->sc_reinit_task, 0, iwn_hw_reset, sc ); TASK_INIT(&sc->sc_radioon_task, 0, iwn_radio_on, sc ); TASK_INIT(&sc->sc_radiooff_task, 0, iwn_radio_off, sc ); @@ -668,6 +666,10 @@ iwn_attach(device_t dev) #endif iwn_radiotap_attach(sc); + + callout_init_mtx(&sc->calib_to, &sc->sc_mtx, 0); + callout_init_mtx(&sc->watchdog_to, &sc->sc_mtx, 0); + iwn_sysctlattach(sc); /* @@ -860,7 +862,8 @@ iwn_detach(device_t dev) ieee80211_draintask(ic, &sc->sc_radiooff_task); iwn_stop(sc); - callout_drain(&sc->sc_timer_to); + callout_drain(&sc->watchdog_to); + callout_drain(&sc->calib_to); ieee80211_ifdetach(ic); } @@ -1942,7 +1945,7 @@ iwn_newstate(struct ieee80211vap *vap, e IEEE80211_UNLOCK(ic); IWN_LOCK(sc); - callout_stop(&sc->sc_timer_to); + callout_stop(&sc->calib_to); switch (nstate) { case IEEE80211_S_ASSOC: @@ -1959,7 +1962,8 @@ iwn_newstate(struct ieee80211vap *vap, e */ sc->rxon.associd = 0; sc->rxon.filter &= ~htole32(IWN_FILTER_BSS); - iwn_calib_reset(sc); + sc->calib.state = IWN_CALIB_STATE_INIT; + error = iwn_auth(sc, vap); break; @@ -1967,9 +1971,8 @@ iwn_newstate(struct ieee80211vap *vap, e /* * RUN -> RUN transition; Just restart the timers. */ - if (vap->iv_state == IEEE80211_S_RUN && - vap->iv_opmode != IEEE80211_M_MONITOR) { - iwn_calib_reset(sc); + if (vap->iv_state == IEEE80211_S_RUN) { + sc->calib_cnt = 0; break; } @@ -1981,6 +1984,10 @@ iwn_newstate(struct ieee80211vap *vap, e error = iwn_run(sc, vap); break; + case IEEE80211_S_INIT: + sc->calib.state = IWN_CALIB_STATE_INIT; + break; + default: break; } @@ -1989,6 +1996,27 @@ iwn_newstate(struct ieee80211vap *vap, e return ivp->iv_newstate(vap, nstate, arg); } +static void +iwn_calib_timeout(void *arg) +{ + struct iwn_softc *sc = arg; + + IWN_LOCK_ASSERT(sc); + + /* Force automatic TX power calibration every 60 secs. */ + if (++sc->calib_cnt >= 120) { + uint32_t flags = 0; + + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s\n", + "sending request for statistics"); + (void)iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags, + sizeof flags, 1); + sc->calib_cnt = 0; + } + callout_reset(&sc->calib_to, msecs_to_ticks(500), iwn_calib_timeout, + sc); +} + /* * Process an RX_PHY firmware notification. This is usually immediately * followed by an MPDU_RX_DONE notification. @@ -2007,32 +2035,6 @@ iwn_rx_phy(struct iwn_softc *sc, struct sc->last_rx_valid = 1; } -static void -iwn_timer_timeout(void *arg) -{ - struct iwn_softc *sc = arg; - uint32_t flags = 0; - - IWN_LOCK_ASSERT(sc); - - if (sc->calib_cnt && --sc->calib_cnt == 0) { - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s\n", - "send statistics request"); - (void) iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags, - sizeof flags, 1); - sc->calib_cnt = 60; /* do calibration every 60s */ - } - iwn_watchdog(sc); /* NB: piggyback tx watchdog */ - callout_reset(&sc->sc_timer_to, hz, iwn_timer_timeout, sc); -} - -static void -iwn_calib_reset(struct iwn_softc *sc) -{ - callout_reset(&sc->sc_timer_to, hz, iwn_timer_timeout, sc); - sc->calib_cnt = 60; /* do calibration every 60s */ -} - /* * Process an RX_DONE (4965AGN only) or MPDU_RX_DONE firmware notification. * Each MPDU_RX_DONE notification must be preceded by an RX_PHY one. @@ -2222,7 +2224,7 @@ iwn_rx_statistics(struct iwn_softc *sc, bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: cmd %d\n", __func__, desc->type); - iwn_calib_reset(sc); /* Reset TX power calibration timeout. */ + sc->calib_cnt = 0; /* Reset TX power calibration timeout. */ /* Test if temperature has changed. */ if (stats->general.temp != sc->rawtemp) { @@ -3306,6 +3308,8 @@ iwn_raw_xmit(struct ieee80211_node *ni, ieee80211_free_node(ni); ifp->if_oerrors++; } + sc->sc_tx_timer = 5; + IWN_UNLOCK(sc); return error; } @@ -3352,15 +3356,24 @@ iwn_start_locked(struct ifnet *ifp) } static void -iwn_watchdog(struct iwn_softc *sc) +iwn_watchdog(void *arg) { - if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) { - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; + struct iwn_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + IWN_LOCK_ASSERT(sc); + + KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING, ("not running")); - if_printf(ifp, "device timeout\n"); - ieee80211_runtask(ic, &sc->sc_reinit_task); + if (sc->sc_tx_timer > 0) { + if (--sc->sc_tx_timer == 0) { + if_printf(ifp, "device timeout\n"); + ieee80211_runtask(ic, &sc->sc_reinit_task); + return; + } } + callout_reset(&sc->watchdog_to, hz, iwn_watchdog, sc); } static int @@ -4760,8 +4773,6 @@ iwn_auth(struct iwn_softc *sc, struct ie struct ieee80211_node *ni = vap->iv_bss; int error; - sc->calib.state = IWN_CALIB_STATE_INIT; - /* Update adapter configuration. */ IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid); sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan); @@ -4954,7 +4965,9 @@ iwn_run(struct iwn_softc *sc, struct iee /* Start periodic calibration timer. */ sc->calib.state = IWN_CALIB_STATE_ASSOC; - iwn_calib_reset(sc); + sc->calib_cnt = 0; + callout_reset(&sc->calib_to, msecs_to_ticks(500), iwn_calib_timeout, + sc); /* Link LED always on while associated. */ iwn_set_led(sc, IWN_LED_LINK, 0, 1); @@ -6406,6 +6419,7 @@ iwn_init_locked(struct iwn_softc *sc) ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; + callout_reset(&sc->watchdog_to, hz, iwn_watchdog, sc); return; fail: @@ -6435,7 +6449,8 @@ iwn_stop_locked(struct iwn_softc *sc) IWN_LOCK_ASSERT(sc); sc->sc_tx_timer = 0; - callout_stop(&sc->sc_timer_to); + callout_stop(&sc->watchdog_to); + callout_stop(&sc->calib_to); ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); /* Power OFF hardware. */ Modified: stable/8/sys/dev/iwn/if_iwnvar.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 11:31:19 2011 (r223237) +++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 11:33:55 2011 (r223238) @@ -260,8 +260,10 @@ struct iwn_softc { struct task sc_radioon_task; struct task sc_radiooff_task; + struct callout calib_to; int calib_cnt; struct iwn_calib_state calib; + struct callout watchdog_to; u_int calib_init; u_int calib_runtime; #define IWN_CALIB_XTAL (1 << IWN_CALIB_IDX_XTAL) @@ -312,7 +314,6 @@ struct iwn_softc { uint8_t rxchainmask; uint8_t chainmask; - struct callout sc_timer_to; int sc_tx_timer; struct iwn_rx_radiotap_header sc_rxtap; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:36:58 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4E734106566C; Sat, 18 Jun 2011 11:36:58 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3C5758FC08; Sat, 18 Jun 2011 11:36:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBawY3038761; Sat, 18 Jun 2011 11:36:58 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBawsg038758; Sat, 18 Jun 2011 11:36:58 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181136.p5IBawsg038758@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:36:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223239 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:36:58 -0000 Author: bschmidt Date: Sat Jun 18 11:36:57 2011 New Revision: 223239 URL: http://svn.freebsd.org/changeset/base/223239 Log: MFC r220674: Revert some of local calibration changes in favour of the OpenBSD implementation. This includes the fix required for the 6050 series devices. Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:33:55 2011 (r223238) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:36:57 2011 (r223239) @@ -132,6 +132,8 @@ static void iwn_rx_done(struct iwn_softc static void iwn_rx_compressed_ba(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); #endif +static void iwn5000_rx_calib_results(struct iwn_softc *, + struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn_rx_statistics(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn4965_tx_done(struct iwn_softc *, struct iwn_rx_desc *, @@ -217,15 +219,10 @@ static void iwn5000_ampdu_tx_start(struc struct ieee80211_node *, uint8_t, uint16_t); static void iwn5000_ampdu_tx_stop(struct iwn_softc *, uint8_t, uint16_t); #endif -static int iwn5000_send_calib_results(struct iwn_softc *); -static int iwn5000_save_calib_result(struct iwn_softc *, - struct iwn_phy_calib *, int, int); -static void iwn5000_free_calib_results(struct iwn_softc *); -static int iwn5000_chrystal_calib(struct iwn_softc *); -static int iwn5000_send_calib_query(struct iwn_softc *, uint32_t); -static int iwn5000_rx_calib_result(struct iwn_softc *, - struct iwn_rx_desc *, struct iwn_rx_data *); +static int iwn5000_query_calibration(struct iwn_softc *); +static int iwn5000_send_calibration(struct iwn_softc *); static int iwn5000_send_wimax_coex(struct iwn_softc *); +static int iwn5000_crystal_calib(struct iwn_softc *); static int iwn4965_post_alive(struct iwn_softc *); static int iwn5000_post_alive(struct iwn_softc *); static int iwn4965_load_bootcode(struct iwn_softc *, const uint8_t *, @@ -709,9 +706,6 @@ iwn_hal_attach(struct iwn_softc *sc) sc->fwname = "iwn5000fw"; sc->txchainmask = IWN_ANT_B; sc->rxchainmask = IWN_ANT_AB; - sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | - IWN_CALIB_TX_IQ | IWN_CALIB_TX_IQ_PERIODIC | - IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_5150: sc->sc_hal = &iwn5000_hal; @@ -719,8 +713,6 @@ iwn_hal_attach(struct iwn_softc *sc) sc->fwname = "iwn5150fw"; sc->txchainmask = IWN_ANT_A; sc->rxchainmask = IWN_ANT_AB; - sc->calib_init = IWN_CALIB_DC | IWN_CALIB_LO | - IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_5300: case IWN_HW_REV_TYPE_5350: @@ -729,9 +721,6 @@ iwn_hal_attach(struct iwn_softc *sc) sc->fwname = "iwn5000fw"; sc->txchainmask = IWN_ANT_ABC; sc->rxchainmask = IWN_ANT_ABC; - sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | - IWN_CALIB_TX_IQ | IWN_CALIB_TX_IQ_PERIODIC | - IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_1000: sc->sc_hal = &iwn5000_hal; @@ -739,9 +728,6 @@ iwn_hal_attach(struct iwn_softc *sc) sc->fwname = "iwn1000fw"; sc->txchainmask = IWN_ANT_A; sc->rxchainmask = IWN_ANT_AB; - sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | - IWN_CALIB_TX_IQ | IWN_CALIB_TX_IQ_PERIODIC | - IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_6000: sc->sc_hal = &iwn5000_hal; @@ -757,11 +743,8 @@ iwn_hal_attach(struct iwn_softc *sc) default: sc->txchainmask = IWN_ANT_ABC; sc->rxchainmask = IWN_ANT_ABC; - sc->calib_runtime = IWN_CALIB_DC; break; } - sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | - IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_6050: sc->sc_hal = &iwn5000_hal; @@ -769,9 +752,6 @@ iwn_hal_attach(struct iwn_softc *sc) sc->fwname = "iwn6050fw"; sc->txchainmask = IWN_ANT_AB; sc->rxchainmask = IWN_ANT_AB; - sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | - IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; - sc->calib_runtime = IWN_CALIB_DC; break; case IWN_HW_REV_TYPE_6005: sc->sc_hal = &iwn5000_hal; @@ -779,9 +759,6 @@ iwn_hal_attach(struct iwn_softc *sc) sc->fwname = "iwn6005fw"; sc->txchainmask = IWN_ANT_AB; sc->rxchainmask = IWN_ANT_AB; - sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | - IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; - sc->calib_runtime = IWN_CALIB_DC; break; default: device_printf(sc->sc_dev, "adapter type %d not supported\n", @@ -867,8 +844,6 @@ iwn_detach(device_t dev) ieee80211_ifdetach(ic); } - iwn5000_free_calib_results(sc); - /* Free DMA resources. */ iwn_free_rx_ring(sc, &sc->rxq); if (sc->sc_hal != NULL) @@ -1679,7 +1654,7 @@ static void iwn5000_read_eeprom(struct iwn_softc *sc) { struct iwn5000_eeprom_calib_hdr hdr; - int32_t temp, volt; + int32_t volt; uint32_t addr, base; int i; uint16_t val; @@ -1711,12 +1686,18 @@ iwn5000_read_eeprom(struct iwn_softc *sc if (sc->hw_type == IWN_HW_REV_TYPE_5150) { /* Compute temperature offset. */ iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2); - temp = le16toh(val); + sc->eeprom_temp = le16toh(val); iwn_read_prom_data(sc, base + IWN5000_EEPROM_VOLT, &val, 2); volt = le16toh(val); - sc->temp_off = temp - (volt / -5); + sc->temp_off = sc->eeprom_temp - (volt / -5); DPRINTF(sc, IWN_DEBUG_CALIBRATE, "temp=%d volt=%d offset=%dK\n", - temp, volt, sc->temp_off); + sc->eeprom_temp, volt, sc->temp_off); + } else { + /* Read crystal calibration. */ + iwn_read_prom_data(sc, base + IWN5000_EEPROM_CRYSTAL, + &sc->eeprom_crystal, sizeof (uint32_t)); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "crystal calibration 0x%08x\n", + le32toh(sc->eeprom_crystal)); } } @@ -2202,6 +2183,63 @@ iwn_rx_compressed_ba(struct iwn_softc *s #endif /* + * Process a CALIBRATION_RESULT notification sent by the initialization + * firmware on response to a CMD_CALIB_CONFIG command (5000 only). + */ +static void +iwn5000_rx_calib_results(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + struct iwn_phy_calib *calib = (struct iwn_phy_calib *)(desc + 1); + int len, idx = -1; + + /* Runtime firmware should not send such a notification. */ + if (sc->sc_flags & IWN_FLAG_CALIB_DONE) + return; + + len = (le32toh(desc->len) & 0x3fff) - 4; + bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); + + switch (calib->code) { + case IWN5000_PHY_CALIB_DC: + if (sc->hw_type == IWN_HW_REV_TYPE_5150) + idx = 0; + break; + case IWN5000_PHY_CALIB_LO: + idx = 1; + break; + case IWN5000_PHY_CALIB_TX_IQ: + idx = 2; + break; + case IWN5000_PHY_CALIB_TX_IQ_PERIODIC: + if (sc->hw_type < IWN_HW_REV_TYPE_6000 && + sc->hw_type != IWN_HW_REV_TYPE_5150) + idx = 3; + break; + case IWN5000_PHY_CALIB_BASE_BAND: + idx = 4; + break; + } + if (idx == -1) /* Ignore other results. */ + return; + + /* Save calibration result. */ + if (sc->calibcmd[idx].buf != NULL) + free(sc->calibcmd[idx].buf, M_DEVBUF); + sc->calibcmd[idx].buf = malloc(len, M_DEVBUF, M_NOWAIT); + if (sc->calibcmd[idx].buf == NULL) { + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "not enough memory for calibration result %d\n", + calib->code); + return; + } + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "saving calibration result code=%d len=%d\n", calib->code, len); + sc->calibcmd[idx].len = len; + memcpy(sc->calibcmd[idx].buf, calib, len); +} + +/* * Process an RX_STATISTICS or BEACON_STATISTICS firmware notification. * The latter is sent by the firmware after each received beacon. */ @@ -2555,7 +2593,7 @@ iwn_notif_intr(struct iwn_softc *sc) break; } case IWN5000_CALIBRATION_RESULT: - iwn5000_rx_calib_result(sc, desc, data); + iwn5000_rx_calib_results(sc, desc, data); break; case IWN5000_CALIBRATION_DONE: @@ -4849,7 +4887,7 @@ iwn_run(struct iwn_softc *sc, struct iee if (ic->ic_opmode == IEEE80211_M_MONITOR) { /* Link LED blinks while monitoring. */ - iwn_set_led(sc, IWN_LED_LINK, 20, 20); + iwn_set_led(sc, IWN_LED_LINK, 5, 5); return 0; } error = iwn_set_timing(sc, ni); @@ -5192,200 +5230,57 @@ iwn5000_ampdu_tx_stop(struct iwn_softc * #endif /* - * Send calibration results to the runtime firmware. These results were - * obtained on first boot from the initialization firmware, or by reading - * the EEPROM for crystal calibration. - */ -static int -iwn5000_send_calib_results(struct iwn_softc *sc) -{ - struct iwn_calib_info *calib_result; - int idx, error; - - for (idx = 0; idx < IWN_CALIB_NUM; idx++) { - calib_result = &sc->calib_results[idx]; - - /* No support for this type of calibration. */ - if ((sc->calib_init & (1 << idx)) == 0) - continue; - - /* No calibration result available. */ - if (calib_result->buf == NULL) - continue; - - DPRINTF(sc, IWN_DEBUG_CALIBRATE, - "%s: send calibration result idx=%d, len=%d\n", - __func__, idx, calib_result->len); - - error = iwn_cmd(sc, IWN_CMD_PHY_CALIB, calib_result->buf, - calib_result->len, 0); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not send calibration result " - "idx=%d, error=%d\n", - __func__, idx, error); - return error; - } - } - return 0; -} - -/* - * Save calibration result at the given index. The index determines - * in which order the results are sent to the runtime firmware. - */ -static int -iwn5000_save_calib_result(struct iwn_softc *sc, struct iwn_phy_calib *calib, - int len, int idx) -{ - struct iwn_calib_info *calib_result = &sc->calib_results[idx]; - - DPRINTF(sc, IWN_DEBUG_CALIBRATE, - "%s: saving calibration result code=%d, idx=%d, len=%d\n", - __func__, calib->code, idx, len); - - if (calib_result->buf != NULL) - free(calib_result->buf, M_DEVBUF); - - calib_result->buf = malloc(len, M_DEVBUF, M_NOWAIT); - if (calib_result->buf == NULL) { - device_printf(sc->sc_dev, - "%s: not enough memory for calibration result " - "code=%d, len=%d\n", __func__, calib->code, len); - return ENOMEM; - } - - calib_result->len = len; - memcpy(calib_result->buf, calib, len); - return 0; -} - -static void -iwn5000_free_calib_results(struct iwn_softc *sc) -{ - struct iwn_calib_info *calib_result; - int idx; - - for (idx = 0; idx < IWN_CALIB_NUM; idx++) { - calib_result = &sc->calib_results[idx]; - - if (calib_result->buf != NULL) - free(calib_result->buf, M_DEVBUF); - - calib_result->buf = NULL; - calib_result->len = 0; - } -} - -/* - * Obtain the crystal calibration result from the EEPROM. - */ -static int -iwn5000_chrystal_calib(struct iwn_softc *sc) -{ - struct iwn5000_phy_calib_crystal cmd; - uint32_t base, crystal; - uint16_t val; - - /* Read crystal calibration. */ - iwn_read_prom_data(sc, IWN5000_EEPROM_CAL, &val, 2); - base = le16toh(val); - iwn_read_prom_data(sc, base + IWN5000_EEPROM_CRYSTAL, &crystal, - sizeof(uint32_t)); - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: crystal calibration=0x%08x\n", - __func__, le32toh(crystal)); - - memset(&cmd, 0, sizeof cmd); - cmd.code = IWN5000_PHY_CALIB_CRYSTAL; - cmd.ngroups = 1; - cmd.isvalid = 1; - cmd.cap_pin[0] = le32toh(crystal) & 0xff; - cmd.cap_pin[1] = (le32toh(crystal) >> 16) & 0xff; - - return iwn5000_save_calib_result(sc, (struct iwn_phy_calib *)&cmd, - sizeof cmd, IWN_CALIB_IDX_XTAL); -} - -/* - * Query calibration results from the initialization firmware. We do this - * only once at first boot. + * Query calibration tables from the initialization firmware. We do this + * only once at first boot. Called from a process context. */ static int -iwn5000_send_calib_query(struct iwn_softc *sc, uint32_t cfg) +iwn5000_query_calibration(struct iwn_softc *sc) { -#define CALIB_INIT_CFG 0xffffffff; struct iwn5000_calib_config cmd; int error; memset(&cmd, 0, sizeof cmd); - cmd.ucode.once.enable = CALIB_INIT_CFG; - if (cfg == 0) { - cmd.ucode.once.start = CALIB_INIT_CFG; - cmd.ucode.once.send = CALIB_INIT_CFG; - cmd.ucode.flags = CALIB_INIT_CFG; - } else - cmd.ucode.once.start = cfg; - - DPRINTF(sc, IWN_DEBUG_CALIBRATE, - "%s: query calibration results, cfg %x\n", __func__, cfg); - + cmd.ucode.once.enable = 0xffffffff; + cmd.ucode.once.start = 0xffffffff; + cmd.ucode.once.send = 0xffffffff; + cmd.ucode.flags = 0xffffffff; + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: sending calibration query\n", + __func__); error = iwn_cmd(sc, IWN5000_CMD_CALIB_CONFIG, &cmd, sizeof cmd, 0); if (error != 0) return error; /* Wait at most two seconds for calibration to complete. */ if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) - error = msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", 2 * hz); - + error = msleep(sc, &sc->sc_mtx, PCATCH, "iwncal", 2 * hz); return error; -#undef CALIB_INIT_CFG } /* - * Process a CALIBRATION_RESULT notification sent by the initialization - * firmware on response to a CMD_CALIB_CONFIG command. + * Send calibration results to the runtime firmware. These results were + * obtained on first boot from the initialization firmware. */ static int -iwn5000_rx_calib_result(struct iwn_softc *sc, struct iwn_rx_desc *desc, - struct iwn_rx_data *data) +iwn5000_send_calibration(struct iwn_softc *sc) { -#define FRAME_SIZE_MASK 0x3fff - struct iwn_phy_calib *calib = (struct iwn_phy_calib *)(desc + 1); - int len, idx; - - bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); - len = (le32toh(desc->len) & FRAME_SIZE_MASK); - - /* Remove length field itself. */ - len -= 4; + int idx, error; - /* - * Determine the order in which the results will be send to the - * runtime firmware. - */ - switch (calib->code) { - case IWN5000_PHY_CALIB_DC: - idx = IWN_CALIB_IDX_DC; - break; - case IWN5000_PHY_CALIB_LO: - idx = IWN_CALIB_IDX_LO; - break; - case IWN5000_PHY_CALIB_TX_IQ: - idx = IWN_CALIB_IDX_TX_IQ; - break; - case IWN5000_PHY_CALIB_TX_IQ_PERIODIC: - idx = IWN_CALIB_IDX_TX_IQ_PERIODIC; - break; - case IWN5000_PHY_CALIB_BASE_BAND: - idx = IWN_CALIB_IDX_BASE_BAND; - break; - default: + for (idx = 0; idx < 5; idx++) { + if (sc->calibcmd[idx].buf == NULL) + continue; /* No results available. */ DPRINTF(sc, IWN_DEBUG_CALIBRATE, - "%s: unknown calibration code=%d\n", __func__, calib->code); - return EINVAL; + "send calibration result idx=%d len=%d\n", idx, + sc->calibcmd[idx].len); + error = iwn_cmd(sc, IWN_CMD_PHY_CALIB, sc->calibcmd[idx].buf, + sc->calibcmd[idx].len, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not send calibration result, error %d\n", + __func__, error); + return error; + } } - return iwn5000_save_calib_result(sc, calib, len, idx); -#undef FRAME_SIZE_MASK + return 0; } static int @@ -5415,6 +5310,22 @@ iwn5000_send_wimax_coex(struct iwn_softc return iwn_cmd(sc, IWN5000_CMD_WIMAX_COEX, &wimax, sizeof wimax, 0); } +static int +iwn5000_crystal_calib(struct iwn_softc *sc) +{ + struct iwn5000_phy_calib_crystal cmd; + + memset(&cmd, 0, sizeof cmd); + cmd.code = IWN5000_PHY_CALIB_CRYSTAL; + cmd.ngroups = 1; + cmd.isvalid = 1; + cmd.cap_pin[0] = le32toh(sc->eeprom_crystal) & 0xff; + cmd.cap_pin[1] = (le32toh(sc->eeprom_crystal) >> 16) & 0xff; + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "sending crystal calibration %d, %d\n", + cmd.cap_pin[0], cmd.cap_pin[1]); + return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0); +} + /* * This function is called after the runtime firmware notifies us of its * readiness (called in a process context.) @@ -5531,36 +5442,21 @@ iwn5000_post_alive(struct iwn_softc *sc) __func__, error); return error; } - - if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) { - /* - * Start calibration by setting and sending the chrystal - * calibration first, this must be done before we are able - * to query the other calibration results. - */ - error = iwn5000_chrystal_calib(sc); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not set chrystal calibration, " - "error=%d\n", __func__, error); - return error; - } - error = iwn5000_send_calib_results(sc); + if (sc->hw_type != IWN_HW_REV_TYPE_5150) { + /* Perform crystal calibration. */ + error = iwn5000_crystal_calib(sc); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not send chrystal calibration, " - "error=%d\n", __func__, error); + "%s: crystal calibration failed, error %d\n", + __func__, error); return error; } - - /* - * Query other calibration results from the initialization - * firmware. - */ - error = iwn5000_send_calib_query(sc, 0); - if (error != 0) { + } + if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) { + /* Query calibration from the initialization firmware. */ + if ((error = iwn5000_query_calibration(sc)) != 0) { device_printf(sc->sc_dev, - "%s: could not query calibration, error=%d\n", + "%s: could not query calibration, error %d\n", __func__, error); return error; } @@ -5572,24 +5468,8 @@ iwn5000_post_alive(struct iwn_softc *sc) iwn_hw_stop(sc); error = iwn_hw_init(sc); } else { - /* - * Send calibration results obtained from the initialization - * firmware to the runtime firmware. - */ - error = iwn5000_send_calib_results(sc); - - /* - * Tell the runtime firmware to do certain calibration types. - */ - if (sc->calib_runtime != 0) { - error = iwn5000_send_calib_query(sc, sc->calib_runtime); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not send query calibration, " - "error=%d, cfg=%x\n", __func__, error, - sc->calib_runtime); - } - } + /* Send calibration results to runtime firmware. */ + error = iwn5000_send_calibration(sc); } return error; } Modified: stable/8/sys/dev/iwn/if_iwnvar.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 11:33:55 2011 (r223238) +++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 11:36:57 2011 (r223239) @@ -264,24 +264,9 @@ struct iwn_softc { int calib_cnt; struct iwn_calib_state calib; struct callout watchdog_to; - u_int calib_init; - u_int calib_runtime; -#define IWN_CALIB_XTAL (1 << IWN_CALIB_IDX_XTAL) -#define IWN_CALIB_DC (1 << IWN_CALIB_IDX_DC) -#define IWN_CALIB_LO (1 << IWN_CALIB_IDX_LO) -#define IWN_CALIB_TX_IQ (1 << IWN_CALIB_IDX_TX_IQ) -#define IWN_CALIB_TX_IQ_PERIODIC (1 << IWN_CALIB_IDX_TX_IQ_PERIODIC) -#define IWN_CALIB_BASE_BAND (1 << IWN_CALIB_IDX_BASE_BAND) -#define IWN_CALIB_NUM 6 - struct iwn_calib_info calib_results[IWN_CALIB_NUM]; -#define IWN_CALIB_IDX_XTAL 0 -#define IWN_CALIB_IDX_DC 1 -#define IWN_CALIB_IDX_LO 2 -#define IWN_CALIB_IDX_TX_IQ 3 -#define IWN_CALIB_IDX_TX_IQ_PERIODIC 4 -#define IWN_CALIB_IDX_BASE_BAND 5 struct iwn_fw_info fw; + struct iwn_calib_info calibcmd[5]; uint32_t errptr; struct iwn_rx_stat last_rx_stat; @@ -300,6 +285,8 @@ struct iwn_softc { uint16_t rfcfg; uint8_t calib_ver; char eeprom_domain[4]; + uint32_t eeprom_crystal; + int16_t eeprom_temp; int16_t eeprom_voltage; int8_t maxpwr2GHz; int8_t maxpwr5GHz; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:39:09 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 97CC11065670; Sat, 18 Jun 2011 11:39:09 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7CEB18FC12; Sat, 18 Jun 2011 11:39:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBd900038868; Sat, 18 Jun 2011 11:39:09 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBd9gi038865; Sat, 18 Jun 2011 11:39:09 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181139.p5IBd9gi038865@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:39:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223240 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:39:09 -0000 Author: bschmidt Date: Sat Jun 18 11:39:09 2011 New Revision: 223240 URL: http://svn.freebsd.org/changeset/base/223240 Log: MFC r220676-220677: The 6005 series devices need additional temperature offset calibration as well as the IWN_GP_DRIVER_CALIB_VER6 bit set. Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:36:57 2011 (r223239) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:39:09 2011 (r223240) @@ -223,6 +223,7 @@ static int iwn5000_query_calibration(str static int iwn5000_send_calibration(struct iwn_softc *); static int iwn5000_send_wimax_coex(struct iwn_softc *); static int iwn5000_crystal_calib(struct iwn_softc *); +static int iwn5000_temp_offset_calib(struct iwn_softc *); static int iwn4965_post_alive(struct iwn_softc *); static int iwn5000_post_alive(struct iwn_softc *); static int iwn4965_load_bootcode(struct iwn_softc *, const uint8_t *, @@ -4539,6 +4540,16 @@ iwn_config(struct iwn_softc *sc) int error; uint16_t rxchain; + if (sc->hw_type == IWN_HW_REV_TYPE_6005) { + /* Set radio temperature sensor offset. */ + error = iwn5000_temp_offset_calib(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not set temperature offset\n", __func__); + return error; + } + } + /* Configure valid TX chains for 5000 Series. */ if (sc->hw_type != IWN_HW_REV_TYPE_4965) { txmask = htole32(sc->txchainmask); @@ -5326,6 +5337,24 @@ iwn5000_crystal_calib(struct iwn_softc * return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0); } +static int +iwn5000_temp_offset_calib(struct iwn_softc *sc) +{ + struct iwn5000_phy_calib_temp_offset cmd; + + memset(&cmd, 0, sizeof cmd); + cmd.code = IWN5000_PHY_CALIB_TEMP_OFFSET; + cmd.ngroups = 1; + cmd.isvalid = 1; + if (sc->eeprom_temp != 0) + cmd.offset = htole16(sc->eeprom_temp); + else + cmd.offset = htole16(IWN_DEFAULT_TEMP_OFFSET); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "setting radio sensor offset to %d\n", + le16toh(cmd.offset)); + return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0); +} + /* * This function is called after the runtime firmware notifies us of its * readiness (called in a process context.) @@ -6028,7 +6057,8 @@ iwn5000_nic_config(struct iwn_softc *sc) /* Use internal power amplifier only. */ IWN_WRITE(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_RADIO_2X2_IPA); } - if (sc->hw_type == IWN_HW_REV_TYPE_6050 && sc->calib_ver >= 6) { + if ((sc->hw_type == IWN_HW_REV_TYPE_6050 || + sc->hw_type == IWN_HW_REV_TYPE_6005) && sc->calib_ver >= 6) { /* Indicate that ROM calibration version is >=6. */ IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_CALIB_VER6); } Modified: stable/8/sys/dev/iwn/if_iwnreg.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:36:57 2011 (r223239) +++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:39:09 2011 (r223240) @@ -885,6 +885,8 @@ struct iwn_phy_calib { #define IWN5000_PHY_CALIB_CRYSTAL 15 #define IWN5000_PHY_CALIB_BASE_BAND 16 #define IWN5000_PHY_CALIB_TX_IQ_PERIODIC 17 +#define IWN5000_PHY_CALIB_TEMP_OFFSET 18 + #define IWN5000_PHY_CALIB_RESET_NOISE_GAIN 18 #define IWN5000_PHY_CALIB_NOISE_GAIN 19 @@ -903,6 +905,17 @@ struct iwn5000_phy_calib_crystal { uint8_t reserved[2]; } __packed; +struct iwn5000_phy_calib_temp_offset { + uint8_t code; + uint8_t group; + uint8_t ngroups; + uint8_t isvalid; + int16_t offset; +#define IWN_DEFAULT_TEMP_OFFSET 2700 + + uint16_t reserved; +} __packed; + struct iwn_phy_calib_gain { uint8_t code; uint8_t group; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:41:06 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CDCC6106566C; Sat, 18 Jun 2011 11:41:06 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BCA2D8FC0A; Sat, 18 Jun 2011 11:41:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBf6ot038975; Sat, 18 Jun 2011 11:41:06 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBf66g038973; Sat, 18 Jun 2011 11:41:06 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181141.p5IBf66g038973@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:41:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223241 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:41:06 -0000 Author: bschmidt Date: Sat Jun 18 11:41:06 2011 New Revision: 223241 URL: http://svn.freebsd.org/changeset/base/223241 Log: MFC r220687: Obtain the channel number directly from the laster RXON command, also chan is an uint8_t. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:39:09 2011 (r223240) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:41:06 2011 (r223241) @@ -1732,7 +1732,8 @@ iwn_read_eeprom_band(struct iwn_softc *s struct iwn_eeprom_chan *channels = sc->eeprom_channels[n]; const struct iwn_chan_band *band = &iwn_bands[n]; struct ieee80211_channel *c; - int i, chan, nflags; + uint8_t chan; + int i, nflags; for (i = 0; i < band->nchan; i++) { if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) { @@ -3806,8 +3807,6 @@ iwn4965_set_txpower(struct iwn_softc *sc ((y1) + fdivround(((int)(x) - (x1)) * ((y2) - (y1)), (x2) - (x1), n)) static const int tdiv[IWN_NATTEN_GROUPS] = { 9, 8, 8, 8, 6 }; - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; struct iwn_ucode_info *uc = &sc->ucode_info; struct iwn4965_cmd_txpower cmd; struct iwn4965_eeprom_chan_samples *chans; @@ -3816,8 +3815,8 @@ iwn4965_set_txpower(struct iwn_softc *sc const uint8_t *rf_gain, *dsp_gain; uint8_t chan; - /* Retrieve channel number. */ - chan = ieee80211_chan2ieee(ic, ch); + /* Retrieve current channel from last RXON. */ + chan = sc->rxon.chan; DPRINTF(sc, IWN_DEBUG_RESET, "setting TX power for channel %d\n", chan); From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:43:06 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CE18A106564A; Sat, 18 Jun 2011 11:43:06 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A39B88FC08; Sat, 18 Jun 2011 11:43:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBh6Jg039083; Sat, 18 Jun 2011 11:43:06 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBh6VY039081; Sat, 18 Jun 2011 11:43:06 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181143.p5IBh6VY039081@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:43:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223242 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:43:06 -0000 Author: bschmidt Date: Sat Jun 18 11:43:06 2011 New Revision: 223242 URL: http://svn.freebsd.org/changeset/base/223242 Log: MFC r220688: Pass errors that might happen during state transitions up to net80211. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:41:06 2011 (r223241) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:43:06 2011 (r223242) @@ -1920,7 +1920,7 @@ iwn_newstate(struct ieee80211vap *vap, e struct iwn_vap *ivp = IWN_VAP(vap); struct ieee80211com *ic = vap->iv_ic; struct iwn_softc *sc = ic->ic_ifp->if_softc; - int error; + int error = 0; DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__, ieee80211_state_name[vap->iv_state], @@ -1947,7 +1947,10 @@ iwn_newstate(struct ieee80211vap *vap, e sc->rxon.filter &= ~htole32(IWN_FILTER_BSS); sc->calib.state = IWN_CALIB_STATE_INIT; - error = iwn_auth(sc, vap); + if ((error = iwn_auth(sc, vap)) != 0) { + device_printf(sc->sc_dev, + "%s: could not move to auth state\n", __func__); + } break; case IEEE80211_S_RUN: @@ -1964,7 +1967,10 @@ iwn_newstate(struct ieee80211vap *vap, e * which is done with a firmware cmd. We also defer * starting the timers until that work is done. */ - error = iwn_run(sc, vap); + if ((error = iwn_run(sc, vap)) != 0) { + device_printf(sc->sc_dev, + "%s: could not move to run state\n", __func__); + } break; case IEEE80211_S_INIT: @@ -1976,6 +1982,8 @@ iwn_newstate(struct ieee80211vap *vap, e } IWN_UNLOCK(sc); IEEE80211_LOCK(ic); + if (error != 0) + return error; return ivp->iv_newstate(vap, nstate, arg); } From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:44:54 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9E7CD106566C; Sat, 18 Jun 2011 11:44:54 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 73B1B8FC12; Sat, 18 Jun 2011 11:44:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBisaS039191; Sat, 18 Jun 2011 11:44:54 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBisNf039189; Sat, 18 Jun 2011 11:44:54 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181144.p5IBisNf039189@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:44:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223243 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:44:54 -0000 Author: bschmidt Date: Sat Jun 18 11:44:54 2011 New Revision: 223243 URL: http://svn.freebsd.org/changeset/base/223243 Log: MFC r220689: RSSI related syncs with the OpenBSD code: - read RSSI only for the active chains - cast RSSI/NF to int8_t before passing it up to radiotap - remove the htole64() for the timestamp Obtained from: OpenBSD Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:43:06 2011 (r223242) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:44:54 2011 (r223243) @@ -2128,18 +2128,18 @@ iwn_rx_done(struct iwn_softc *sc, struct m->m_data = head; m->m_pkthdr.len = m->m_len = len; - rssi = hal->get_rssi(sc, stat); - /* Grab a reference to the source node. */ wh = mtod(m, struct ieee80211_frame *); ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); nf = (ni != NULL && ni->ni_vap->iv_state == IEEE80211_S_RUN && (ic->ic_flags & IEEE80211_F_SCAN) == 0) ? sc->noise : -95; + rssi = hal->get_rssi(sc, stat); + if (ieee80211_radiotap_active(ic)) { struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap; - tap->wr_tsft = htole64(stat->tstamp); + tap->wr_tsft = stat->tstamp; tap->wr_flags = 0; if (stat->flags & htole16(IWN_STAT_FLAG_SHPREAMBLE)) tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; @@ -2161,8 +2161,8 @@ iwn_rx_done(struct iwn_softc *sc, struct /* Unknown rate: should not happen. */ default: tap->wr_rate = 0; } - tap->wr_dbm_antsignal = rssi; - tap->wr_dbm_antnoise = nf; + tap->wr_dbm_antsignal = (int8_t)rssi; + tap->wr_dbm_antnoise = (int8_t)nf; } IWN_UNLOCK(sc); @@ -3985,18 +3985,12 @@ iwn4965_get_rssi(struct iwn_softc *sc, s agc = (le16toh(phy->agc) >> 7) & 0x7f; rssi = 0; -#if 0 - if (mask & IWN_ANT_A) /* Ant A */ - rssi = max(rssi, phy->rssi[0]); - if (mask & IWN_ATH_B) /* Ant B */ - rssi = max(rssi, phy->rssi[2]); - if (mask & IWN_ANT_C) /* Ant C */ - rssi = max(rssi, phy->rssi[4]); -#else - rssi = max(rssi, phy->rssi[0]); - rssi = max(rssi, phy->rssi[2]); - rssi = max(rssi, phy->rssi[4]); -#endif + if (mask & IWN_ANT_A) + rssi = MAX(rssi, phy->rssi[0]); + if (mask & IWN_ANT_B) + rssi = MAX(rssi, phy->rssi[2]); + if (mask & IWN_ANT_C) + rssi = MAX(rssi, phy->rssi[4]); DPRINTF(sc, IWN_DEBUG_RECV, "%s: agc %d mask 0x%x rssi %d %d %d " "result %d\n", __func__, agc, mask, From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:51:18 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 25463106566B; Sat, 18 Jun 2011 11:51:18 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 129188FC0A; Sat, 18 Jun 2011 11:51:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBpIgp039429; Sat, 18 Jun 2011 11:51:18 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBpIjl039426; Sat, 18 Jun 2011 11:51:18 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181151.p5IBpIjl039426@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:51:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223244 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:51:18 -0000 Author: bschmidt Date: Sat Jun 18 11:51:17 2011 New Revision: 223244 URL: http://svn.freebsd.org/changeset/base/223244 Log: MFC r220691-220694,220700-220702,220704,220710-220711: - Remove the flags argument of iwn_dma_contig_alloc(), it is always set as BUS_DMA_NOWAIT. While here also set BUS_DMA_COHERENT. - OpenBSD uses IWN_RBUF_SIZE not MJUMPAGESIZE for the RX path, also replace caddr_t with void * to be in sync. - In case a new mbuf can't be loaded, reuse the old one. - scratch_paddr has the same address pre-assigned, use that instead. - Rewrite DMA segment handling to be more inline with the OpenBSD code. Also change the m_len == 0 hack to have less code churn. - Make sure to destroy all DMA tags and maps. - Unify TX/RX ring allocation, finish the descriptior DMA stuff before starting with data. - Add missing bus_dmamap_sync calls as well as remove two duplicate ones. - Prevent double-free, also use the same error codes as OpenBSD. - Replace RX/TX ring allocation error messages with something more sane and remove those where the caller already prints one. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:44:54 2011 (r223243) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:51:17 2011 (r223244) @@ -88,7 +88,7 @@ static int iwn_init_otprom(struct iwn_so static int iwn_read_prom_data(struct iwn_softc *, uint32_t, void *, int); static void iwn_dma_map_addr(void *, bus_dma_segment_t *, int, int); static int iwn_dma_contig_alloc(struct iwn_softc *, struct iwn_dma_info *, - void **, bus_size_t, bus_size_t, int); + void **, bus_size_t, bus_size_t); static void iwn_dma_contig_free(struct iwn_dma_info *); static int iwn_alloc_sched(struct iwn_softc *); static void iwn_free_sched(struct iwn_softc *); @@ -1117,7 +1117,7 @@ iwn_dma_map_addr(void *arg, bus_dma_segm static int iwn_dma_contig_alloc(struct iwn_softc *sc, struct iwn_dma_info *dma, - void **kvap, bus_size_t size, bus_size_t alignment, int flags) + void **kvap, bus_size_t size, bus_size_t alignment) { int error; @@ -1126,27 +1126,21 @@ iwn_dma_contig_alloc(struct iwn_softc *s error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), alignment, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size, - 1, size, flags, NULL, NULL, &dma->tag); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: bus_dma_tag_create failed, error %d\n", - __func__, error); + 1, size, BUS_DMA_NOWAIT, NULL, NULL, &dma->tag); + if (error != 0) goto fail; - } + error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr, - flags | BUS_DMA_ZERO, &dma->map); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: bus_dmamem_alloc failed, error %d\n", __func__, error); + BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, &dma->map); + if (error != 0) goto fail; - } - error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, - size, iwn_dma_map_addr, &dma->paddr, flags); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: bus_dmamap_load failed, error %d\n", __func__, error); + + error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size, + iwn_dma_map_addr, &dma->paddr, BUS_DMA_NOWAIT); + if (error != 0) goto fail; - } + + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); if (kvap != NULL) *kvap = dma->vaddr; @@ -1159,16 +1153,20 @@ fail: static void iwn_dma_contig_free(struct iwn_dma_info *dma) { - if (dma->tag != NULL) { - if (dma->map != NULL) { - if (dma->paddr == 0) { - bus_dmamap_sync(dma->tag, dma->map, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(dma->tag, dma->map); - } + if (dma->map != NULL) { + if (dma->vaddr != NULL) { + bus_dmamap_sync(dma->tag, dma->map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(dma->tag, dma->map); bus_dmamem_free(dma->tag, &dma->vaddr, dma->map); + dma->vaddr = NULL; } + bus_dmamap_destroy(dma->tag, dma->map); + dma->map = NULL; + } + if (dma->tag != NULL) { bus_dma_tag_destroy(dma->tag); + dma->tag = NULL; } } @@ -1176,8 +1174,8 @@ static int iwn_alloc_sched(struct iwn_softc *sc) { /* TX scheduler rings must be aligned on a 1KB boundary. */ - return iwn_dma_contig_alloc(sc, &sc->sched_dma, - (void **)&sc->sched, sc->sc_hal->schedsz, 1024, BUS_DMA_NOWAIT); + return iwn_dma_contig_alloc(sc, &sc->sched_dma, (void **)&sc->sched, + sc->sc_hal->schedsz, 1024); } static void @@ -1190,8 +1188,7 @@ static int iwn_alloc_kw(struct iwn_softc *sc) { /* "Keep Warm" page must be aligned on a 4KB boundary. */ - return iwn_dma_contig_alloc(sc, &sc->kw_dma, NULL, 4096, 4096, - BUS_DMA_NOWAIT); + return iwn_dma_contig_alloc(sc, &sc->kw_dma, NULL, 4096, 4096); } static void @@ -1204,8 +1201,8 @@ static int iwn_alloc_ict(struct iwn_softc *sc) { /* ICT table must be aligned on a 4KB boundary. */ - return iwn_dma_contig_alloc(sc, &sc->ict_dma, - (void **)&sc->ict, IWN_ICT_SIZE, 4096, BUS_DMA_NOWAIT); + return iwn_dma_contig_alloc(sc, &sc->ict_dma, (void **)&sc->ict, + IWN_ICT_SIZE, 4096); } static void @@ -1218,8 +1215,8 @@ static int iwn_alloc_fwmem(struct iwn_softc *sc) { /* Must be aligned on a 16-byte boundary. */ - return iwn_dma_contig_alloc(sc, &sc->fw_dma, NULL, - sc->sc_hal->fwsz, 16, BUS_DMA_NOWAIT); + return iwn_dma_contig_alloc(sc, &sc->fw_dma, NULL, sc->sc_hal->fwsz, + 16); } static void @@ -1238,33 +1235,33 @@ iwn_alloc_rx_ring(struct iwn_softc *sc, /* Allocate RX descriptors (256-byte aligned). */ size = IWN_RX_RING_COUNT * sizeof (uint32_t); - error = iwn_dma_contig_alloc(sc, &ring->desc_dma, - (void **)&ring->desc, size, 256, BUS_DMA_NOWAIT); + error = iwn_dma_contig_alloc(sc, &ring->desc_dma, (void **)&ring->desc, + size, 256); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not allocate Rx ring DMA memory, error %d\n", + "%s: could not allocate RX ring DMA memory, error %d\n", __func__, error); goto fail; } - error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, - BUS_SPACE_MAXADDR_32BIT, - BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1, - MJUMPAGESIZE, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); + /* Allocate RX status area (16-byte aligned). */ + error = iwn_dma_contig_alloc(sc, &ring->stat_dma, (void **)&ring->stat, + sizeof (struct iwn_rx_status), 16); if (error != 0) { device_printf(sc->sc_dev, - "%s: bus_dma_tag_create_failed, error %d\n", + "%s: could not allocate RX status DMA memory, error %d\n", __func__, error); goto fail; } - /* Allocate RX status area (16-byte aligned). */ - error = iwn_dma_contig_alloc(sc, &ring->stat_dma, - (void **)&ring->stat, sizeof (struct iwn_rx_status), - 16, BUS_DMA_NOWAIT); + /* Create RX buffer DMA tag. */ + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, + IWN_RBUF_SIZE, 1, IWN_RBUF_SIZE, BUS_DMA_NOWAIT, NULL, NULL, + &ring->data_dmat); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not allocate Rx status DMA memory, error %d\n", + "%s: could not create RX buf DMA tag, error %d\n", __func__, error); goto fail; } @@ -1279,33 +1276,29 @@ iwn_alloc_rx_ring(struct iwn_softc *sc, error = bus_dmamap_create(ring->data_dmat, 0, &data->map); if (error != 0) { device_printf(sc->sc_dev, - "%s: bus_dmamap_create failed, error %d\n", + "%s: could not create RX buf DMA map, error %d\n", __func__, error); goto fail; } - data->m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE); + data->m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, + IWN_RBUF_SIZE); if (data->m == NULL) { device_printf(sc->sc_dev, - "%s: could not allocate rx mbuf\n", __func__); - error = ENOMEM; + "%s: could not allocate RX mbuf\n", __func__); + error = ENOBUFS; goto fail; } - /* Map page. */ error = bus_dmamap_load(ring->data_dmat, data->map, - mtod(data->m, caddr_t), MJUMPAGESIZE, - iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT); + mtod(data->m, void *), IWN_RBUF_SIZE, iwn_dma_map_addr, + &paddr, BUS_DMA_NOWAIT); if (error != 0 && error != EFBIG) { device_printf(sc->sc_dev, - "%s: bus_dmamap_load failed, error %d\n", - __func__, error); - m_freem(data->m); - error = ENOMEM; /* XXX unique code */ + "%s: can't not map mbuf, error %d\n", __func__, + error); goto fail; } - bus_dmamap_sync(ring->data_dmat, data->map, - BUS_DMASYNC_PREWRITE); /* Set physical address of RX buffer (256-byte aligned). */ ring->desc[i] = htole32(paddr >> 8); @@ -1358,10 +1351,15 @@ iwn_free_rx_ring(struct iwn_softc *sc, s BUS_DMASYNC_POSTREAD); bus_dmamap_unload(ring->data_dmat, data->map); m_freem(data->m); + data->m = NULL; } if (data->map != NULL) bus_dmamap_destroy(ring->data_dmat, data->map); } + if (ring->data_dmat != NULL) { + bus_dma_tag_destroy(ring->data_dmat); + ring->data_dmat = NULL; + } } static int @@ -1377,8 +1375,8 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, /* Allocate TX descriptors (256-byte aligned.) */ size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_desc); - error = iwn_dma_contig_alloc(sc, &ring->desc_dma, - (void **)&ring->desc, size, 256, BUS_DMA_NOWAIT); + error = iwn_dma_contig_alloc(sc, &ring->desc_dma, (void **)&ring->desc, + size, 256); if (error != 0) { device_printf(sc->sc_dev, "%s: could not allocate TX ring DMA memory, error %d\n", @@ -1394,8 +1392,8 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, return 0; size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_cmd); - error = iwn_dma_contig_alloc(sc, &ring->cmd_dma, - (void **)&ring->cmd, size, 4, BUS_DMA_NOWAIT); + error = iwn_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd, + size, 4); if (error != 0) { device_printf(sc->sc_dev, "%s: could not allocate TX cmd DMA memory, error %d\n", @@ -1409,7 +1407,7 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); if (error != 0) { device_printf(sc->sc_dev, - "%s: bus_dma_tag_create_failed, error %d\n", + "%s: could not create TX buf DMA tag, error %d\n", __func__, error); goto fail; } @@ -1425,12 +1423,10 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, error = bus_dmamap_create(ring->data_dmat, 0, &data->map); if (error != 0) { device_printf(sc->sc_dev, - "%s: bus_dmamap_create failed, error %d\n", + "%s: could not create TX buf DMA map, error %d\n", __func__, error); goto fail; } - bus_dmamap_sync(ring->data_dmat, data->map, - BUS_DMASYNC_PREWRITE); } return 0; fail: @@ -1447,6 +1443,8 @@ iwn_reset_tx_ring(struct iwn_softc *sc, struct iwn_tx_data *data = &ring->data[i]; if (data->m != NULL) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(ring->data_dmat, data->map); m_freem(data->m); data->m = NULL; @@ -1481,6 +1479,10 @@ iwn_free_tx_ring(struct iwn_softc *sc, s if (data->map != NULL) bus_dmamap_destroy(ring->data_dmat, data->map); } + if (ring->data_dmat != NULL) { + bus_dma_tag_destroy(ring->data_dmat); + ring->data_dmat = NULL; + } } static void @@ -2095,8 +2097,7 @@ iwn_rx_done(struct iwn_softc *sc, struct return; } - /* XXX don't need mbuf, just dma buffer */ - m1 = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE); + m1 = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, IWN_RBUF_SIZE); if (m1 == NULL) { DPRINTF(sc, IWN_DEBUG_ANY, "%s: no mbuf to restock ring\n", __func__); @@ -2105,13 +2106,24 @@ iwn_rx_done(struct iwn_softc *sc, struct } bus_dmamap_unload(ring->data_dmat, data->map); - error = bus_dmamap_load(ring->data_dmat, data->map, - mtod(m1, caddr_t), MJUMPAGESIZE, - iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT); + error = bus_dmamap_load(ring->data_dmat, data->map, mtod(m1, void *), + IWN_RBUF_SIZE, iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT); if (error != 0 && error != EFBIG) { device_printf(sc->sc_dev, "%s: bus_dmamap_load failed, error %d\n", __func__, error); m_freem(m1); + + /* Try to reload the old mbuf. */ + error = bus_dmamap_load(ring->data_dmat, data->map, + mtod(data->m, void *), IWN_RBUF_SIZE, iwn_dma_map_addr, + &paddr, BUS_DMA_NOWAIT); + if (error != 0 && error != EFBIG) { + panic("%s: could not load old RX mbuf", __func__); + } + /* Physical address may have changed. */ + ring->desc[ring->cur] = htole32(paddr >> 8); + bus_dmamap_sync(ring->data_dmat, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); ifp->if_ierrors++; return; } @@ -2187,6 +2199,8 @@ iwn_rx_compressed_ba(struct iwn_softc *s struct iwn_compressed_ba *ba = (struct iwn_compressed_ba *)(desc + 1); struct iwn_tx_ring *txq; + bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); + txq = &sc->txq[letoh16(ba->qid)]; /* XXX TBD */ } @@ -2437,6 +2451,8 @@ iwn_cmd_done(struct iwn_softc *sc, struc /* If the command was mapped in an mbuf, free it. */ if (data->m != NULL) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(ring->data_dmat, data->map); m_freem(data->m); data->m = NULL; @@ -2898,8 +2914,8 @@ iwn_tx_data(struct iwn_softc *sc, struct struct iwn_cmd_data *tx; struct ieee80211_frame *wh; struct ieee80211_key *k = NULL; - struct mbuf *mnew; - bus_dma_segment_t segs[IWN_MAX_SCATTER]; + struct mbuf *m1; + bus_dma_segment_t *seg, segs[IWN_MAX_SCATTER]; uint32_t flags; u_int hdrlen; int totlen, error, pad, nsegs = 0, i, rate; @@ -3055,26 +3071,30 @@ iwn_tx_data(struct iwn_softc *sc, struct tx->security = 0; tx->flags = htole32(flags); - if (m->m_len > 0) { - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, - m, segs, &nsegs, BUS_DMA_NOWAIT); - if (error == EFBIG) { - /* too many fragments, linearize */ - mnew = m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER); - if (mnew == NULL) { - device_printf(sc->sc_dev, - "%s: could not defrag mbuf\n", __func__); - m_freem(m); - return ENOBUFS; - } - m = mnew; - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, - data->map, m, segs, &nsegs, BUS_DMA_NOWAIT); + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m, segs, + &nsegs, BUS_DMA_NOWAIT); + if (error != 0) { + if (error != EFBIG) { + device_printf(sc->sc_dev, + "%s: can't map mbuf (error %d)\n", __func__, error); + m_freem(m); + return error; } + /* Too many DMA segments, linearize mbuf. */ + m1 = m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER); + if (m1 == NULL) { + device_printf(sc->sc_dev, + "%s: could not defrag mbuf\n", __func__); + m_freem(m); + return ENOBUFS; + } + m = m1; + + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m, + segs, &nsegs, BUS_DMA_NOWAIT); if (error != 0) { device_printf(sc->sc_dev, - "%s: bus_dmamap_load_mbuf_sg failed, error %d\n", - __func__, error); + "%s: can't map mbuf (error %d)\n", __func__, error); m_freem(m); return error; } @@ -3087,16 +3107,20 @@ iwn_tx_data(struct iwn_softc *sc, struct __func__, ring->qid, ring->cur, m->m_pkthdr.len, nsegs); /* Fill TX descriptor. */ - desc->nsegs = 1 + nsegs; + desc->nsegs = 1; + if (m->m_len != 0) + desc->nsegs += nsegs; /* First DMA segment is used by the TX command. */ desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr)); desc->segs[0].len = htole16(IWN_HIADDR(data->cmd_paddr) | (4 + sizeof (*tx) + hdrlen + pad) << 4); /* Other DMA segments are for data payload. */ + seg = &segs[0]; for (i = 1; i <= nsegs; i++) { - desc->segs[i].addr = htole32(IWN_LOADDR(segs[i - 1].ds_addr)); - desc->segs[i].len = htole16(IWN_HIADDR(segs[i - 1].ds_addr) | - segs[i - 1].ds_len << 4); + desc->segs[i].addr = htole32(IWN_LOADDR(seg->ds_addr)); + desc->segs[i].len = htole16(IWN_HIADDR(seg->ds_addr) | + seg->ds_len << 4); + seg++; } bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); @@ -3136,9 +3160,8 @@ iwn_tx_data_raw(struct iwn_softc *sc, st struct ieee80211_frame *wh; struct iwn_tx_desc *desc; struct iwn_tx_data *data; - struct mbuf *mnew; - bus_addr_t paddr; - bus_dma_segment_t segs[IWN_MAX_SCATTER]; + struct mbuf *m1; + bus_dma_segment_t *seg, segs[IWN_MAX_SCATTER]; uint32_t flags; u_int hdrlen; int totlen, error, pad, nsegs = 0, i, rate; @@ -3238,9 +3261,8 @@ iwn_tx_data_raw(struct iwn_softc *sc, st txant = IWN_LSB(sc->txchainmask); tx->rflags |= IWN_RFLAG_ANT(txant); /* Set physical address of "scratch area". */ - paddr = ring->cmd_dma.paddr + ring->cur * sizeof (struct iwn_tx_cmd); - tx->loaddr = htole32(IWN_LOADDR(paddr)); - tx->hiaddr = IWN_HIADDR(paddr); + tx->loaddr = htole32(IWN_LOADDR(data->scratch_paddr)); + tx->hiaddr = IWN_HIADDR(data->scratch_paddr); /* Copy 802.11 header in TX command. */ memcpy((uint8_t *)(tx + 1), wh, hdrlen); @@ -3250,26 +3272,30 @@ iwn_tx_data_raw(struct iwn_softc *sc, st tx->security = 0; tx->flags = htole32(flags); - if (m->m_len > 0) { - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, - m, segs, &nsegs, BUS_DMA_NOWAIT); - if (error == EFBIG) { - /* Too many fragments, linearize. */ - mnew = m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER); - if (mnew == NULL) { - device_printf(sc->sc_dev, - "%s: could not defrag mbuf\n", __func__); - m_freem(m); - return ENOBUFS; - } - m = mnew; - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, - data->map, m, segs, &nsegs, BUS_DMA_NOWAIT); + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m, segs, + &nsegs, BUS_DMA_NOWAIT); + if (error != 0) { + if (error != EFBIG) { + device_printf(sc->sc_dev, + "%s: can't map mbuf (error %d)\n", __func__, error); + m_freem(m); + return error; } + /* Too many DMA segments, linearize mbuf. */ + m1 = m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER); + if (m1 == NULL) { + device_printf(sc->sc_dev, + "%s: could not defrag mbuf\n", __func__); + m_freem(m); + return ENOBUFS; + } + m = m1; + + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m, + segs, &nsegs, BUS_DMA_NOWAIT); if (error != 0) { device_printf(sc->sc_dev, - "%s: bus_dmamap_load_mbuf_sg failed, error %d\n", - __func__, error); + "%s: can't map mbuf (error %d)\n", __func__, error); m_freem(m); return error; } @@ -3282,16 +3308,20 @@ iwn_tx_data_raw(struct iwn_softc *sc, st __func__, ring->qid, ring->cur, m->m_pkthdr.len, nsegs); /* Fill TX descriptor. */ - desc->nsegs = 1 + nsegs; + desc->nsegs = 1; + if (m->m_len != 0) + desc->nsegs += nsegs; /* First DMA segment is used by the TX command. */ desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr)); desc->segs[0].len = htole16(IWN_HIADDR(data->cmd_paddr) | (4 + sizeof (*tx) + hdrlen + pad) << 4); /* Other DMA segments are for data payload. */ + seg = &segs[0]; for (i = 1; i <= nsegs; i++) { - desc->segs[i].addr = htole32(IWN_LOADDR(segs[i - 1].ds_addr)); - desc->segs[i].len = htole16(IWN_HIADDR(segs[i - 1].ds_addr) | - segs[i - 1].ds_len << 4); + desc->segs[i].addr = htole32(IWN_LOADDR(seg->ds_addr)); + desc->segs[i].len = htole16(IWN_HIADDR(seg->ds_addr) | + seg->ds_len << 4); + seg++; } bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:52:58 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E25EB1065670; Sat, 18 Jun 2011 11:52:58 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D03928FC14; Sat, 18 Jun 2011 11:52:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBqw9c039529; Sat, 18 Jun 2011 11:52:58 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBqwCr039526; Sat, 18 Jun 2011 11:52:58 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181152.p5IBqwCr039526@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:52:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223245 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:52:59 -0000 Author: bschmidt Date: Sat Jun 18 11:52:58 2011 New Revision: 223245 URL: http://svn.freebsd.org/changeset/base/223245 Log: MFC r220715: Instead of hardcoding TX rates and using that to fill the retry table use the neogotiated ni_rates instead. Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:51:17 2011 (r223244) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:52:58 2011 (r223245) @@ -121,6 +121,7 @@ static void iwn_read_eeprom_channels(str static void iwn_read_eeprom_enhinfo(struct iwn_softc *); static struct ieee80211_node *iwn_node_alloc(struct ieee80211vap *, const uint8_t mac[IEEE80211_ADDR_LEN]); +static void iwn_newassoc(struct ieee80211_node *, int); static int iwn_media_change(struct ifnet *); static int iwn_newstate(struct ieee80211vap *, enum ieee80211_state, int); static void iwn_calib_timeout(void *); @@ -169,7 +170,8 @@ static int iwn4965_add_node(struct iwn_s int); static int iwn5000_add_node(struct iwn_softc *, struct iwn_node_info *, int); -static int iwn_set_link_quality(struct iwn_softc *, uint8_t, int); +static int iwn_set_link_quality(struct iwn_softc *, + struct ieee80211_node *); static int iwn_add_broadcast_node(struct iwn_softc *, int); static int iwn_wme_update(struct ieee80211com *); static void iwn_update_mcast(struct ifnet *); @@ -648,6 +650,7 @@ iwn_attach(device_t dev) ic->ic_vap_delete = iwn_vap_delete; ic->ic_raw_xmit = iwn_raw_xmit; ic->ic_node_alloc = iwn_node_alloc; + ic->ic_newassoc = iwn_newassoc; ic->ic_wme.wme_update = iwn_wme_update; ic->ic_update_mcast = iwn_update_mcast; ic->ic_scan_start = iwn_scan_start; @@ -1908,6 +1911,18 @@ iwn_node_alloc(struct ieee80211vap *vap, return malloc(sizeof (struct iwn_node), M_80211_NODE,M_NOWAIT | M_ZERO); } +static void +iwn_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct iwn_node *wn = (void *)ni; + int ridx, i; + + for (i = 0; i < ni->ni_rates.rs_nrates; i++) { + ridx = iwn_plcp_signal(ni->ni_rates.rs_rates[i]); + wn->ridx[i] = ridx; + } +} + static int iwn_media_change(struct ifnet *ifp) { @@ -2891,7 +2906,7 @@ iwn_plcp_signal(int rate) { int i; for (i = 0; i < IWN_RIDX_MAX + 1; i++) { - if (rate == iwn_rates[i].rate) + if ((rate & IEEE80211_RATE_VAL) == iwn_rates[i].rate) return i; } @@ -3055,7 +3070,7 @@ iwn_tx_data(struct iwn_softc *sc, struct txant = IWN_LSB(sc->txchainmask); tx->rflags |= IWN_RFLAG_ANT(txant); } else { - tx->linkq = IWN_RIDX_OFDM54 - ridx; + tx->linkq = ni->ni_rates.rs_nrates - ridx - 1; flags |= IWN_TX_LINKQ; /* enable MRR */ } @@ -3599,98 +3614,39 @@ iwn5000_add_node(struct iwn_softc *sc, s return iwn_cmd(sc, IWN_CMD_ADD_NODE, node, sizeof (*node), async); } -#if 0 /* HT */ -static const uint8_t iwn_ridx_to_plcp[] = { - 10, 20, 55, 110, /* CCK */ - 0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, 0x3 /* OFDM R1-R4 */ -}; -static const uint8_t iwn_siso_mcs_to_plcp[] = { - 0, 0, 0, 0, /* CCK */ - 0, 0, 1, 2, 3, 4, 5, 6, 7 /* HT */ -}; -static const uint8_t iwn_mimo_mcs_to_plcp[] = { - 0, 0, 0, 0, /* CCK */ - 8, 8, 9, 10, 11, 12, 13, 14, 15 /* HT */ -}; -#endif -static const uint8_t iwn_prev_ridx[] = { - /* NB: allow fallback from CCK11 to OFDM9 and from OFDM6 to CCK5 */ - 0, 0, 1, 5, /* CCK */ - 2, 4, 3, 6, 7, 8, 9, 10, 10 /* OFDM */ -}; - -/* - * Configure hardware link parameters for the specified - * node operating on the specified channel. - */ static int -iwn_set_link_quality(struct iwn_softc *sc, uint8_t id, int async) +iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni) { - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; + struct iwn_node *wn = (void *)ni; + struct ieee80211_rateset *rs = &ni->ni_rates; struct iwn_cmd_link_quality linkq; const struct iwn_rate *rinfo; - int i; - uint8_t txant, ridx; + uint8_t txant; + int i, txrate; /* Use the first valid TX antenna. */ txant = IWN_LSB(sc->txchainmask); memset(&linkq, 0, sizeof linkq); - linkq.id = id; + linkq.id = wn->id; linkq.antmsk_1stream = txant; linkq.antmsk_2stream = IWN_ANT_AB; linkq.ampdu_max = 31; linkq.ampdu_threshold = 3; linkq.ampdu_limit = htole16(4000); /* 4ms */ -#if 0 /* HT */ - if (IEEE80211_IS_CHAN_HT(c)) - linkq.mimo = 1; -#endif - - if (id == IWN_ID_BSS) - ridx = IWN_RIDX_OFDM54; - else if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) - ridx = IWN_RIDX_OFDM6; - else - ridx = IWN_RIDX_CCK1; - + /* Start at highest available bit-rate. */ + txrate = rs->rs_nrates - 1; for (i = 0; i < IWN_MAX_TX_RETRIES; i++) { - rinfo = &iwn_rates[ridx]; -#if 0 /* HT */ - if (IEEE80211_IS_CHAN_HT40(c)) { - linkq.retry[i].plcp = iwn_mimo_mcs_to_plcp[ridx] - | IWN_RIDX_MCS; - linkq.retry[i].rflags = IWN_RFLAG_HT - | IWN_RFLAG_HT40; - /* XXX shortGI */ - } else if (IEEE80211_IS_CHAN_HT(c)) { - linkq.retry[i].plcp = iwn_siso_mcs_to_plcp[ridx] - | IWN_RIDX_MCS; - linkq.retry[i].rflags = IWN_RFLAG_HT; - /* XXX shortGI */ - } else -#endif - { - linkq.retry[i].plcp = rinfo->plcp; - linkq.retry[i].rflags = rinfo->flags; - } + rinfo = &iwn_rates[wn->ridx[txrate]]; + linkq.retry[i].plcp = rinfo->plcp; + linkq.retry[i].rflags = rinfo->flags; linkq.retry[i].rflags |= IWN_RFLAG_ANT(txant); - ridx = iwn_prev_ridx[ridx]; + /* Next retry at immediate lower bit-rate. */ + if (txrate > 0) + txrate--; } -#ifdef IWN_DEBUG - if (sc->sc_debug & IWN_DEBUG_STATE) { - printf("%s: set link quality for node %d, mimo %d ssmask %d\n", - __func__, id, linkq.mimo, linkq.antmsk_1stream); - printf("%s:", __func__); - for (i = 0; i < IWN_MAX_TX_RETRIES; i++) - printf(" %d:%x", linkq.retry[i].plcp, - linkq.retry[i].rflags); - printf("\n"); - } -#endif - return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async); + return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, 1); } /* @@ -3701,8 +3657,12 @@ iwn_add_broadcast_node(struct iwn_softc { const struct iwn_hal *hal = sc->sc_hal; struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; struct iwn_node_info node; - int error; + struct iwn_cmd_link_quality linkq; + const struct iwn_rate *rinfo; + uint8_t txant; + int i, error; memset(&node, 0, sizeof node); IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr); @@ -3712,8 +3672,31 @@ iwn_add_broadcast_node(struct iwn_softc if (error != 0) return error; - error = iwn_set_link_quality(sc, hal->broadcast_id, async); - return error; + /* Use the first valid TX antenna. */ + txant = IWN_LSB(sc->txchainmask); + + memset(&linkq, 0, sizeof linkq); + linkq.id = sc->sc_hal->broadcast_id; + linkq.antmsk_1stream = txant; + linkq.antmsk_2stream = IWN_ANT_AB; + linkq.ampdu_max = 64; + linkq.ampdu_threshold = 3; + linkq.ampdu_limit = htole16(4000); /* 4ms */ + + /* Use lowest mandatory bit-rate. */ + if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) + rinfo = &iwn_rates[IWN_RIDX_OFDM6]; + else + rinfo = &iwn_rates[IWN_RIDX_CCK1]; + linkq.retry[0].plcp = rinfo->plcp; + linkq.retry[0].rflags = rinfo->flags; + linkq.retry[0].rflags |= IWN_RFLAG_ANT(txant); + /* Use same bit-rate for all TX retries. */ + for (i = 1; i < IWN_MAX_TX_RETRIES; i++) { + linkq.retry[i].plcp = linkq.retry[0].plcp; + linkq.retry[i].rflags = linkq.retry[0].rflags; + } + return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async); } static int @@ -5010,6 +4993,10 @@ iwn_run(struct iwn_softc *sc, struct iee return error; } + /* Fake a join to initialize the TX rate. */ + ((struct iwn_node *)ni)->id = IWN_ID_BSS; + iwn_newassoc(ni, 1); + /* Add BSS node. */ memset(&node, 0, sizeof node); IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr); @@ -5027,7 +5014,7 @@ iwn_run(struct iwn_softc *sc, struct iee } DPRINTF(sc, IWN_DEBUG_STATE, "setting link quality for node %d\n", node.id); - error = iwn_set_link_quality(sc, node.id, 1); + error = iwn_set_link_quality(sc, ni); if (error != 0) { device_printf(sc->sc_dev, "%s: could not setup MRR for node %d, error %d\n", Modified: stable/8/sys/dev/iwn/if_iwnreg.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:51:17 2011 (r223244) +++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 11:52:58 2011 (r223245) @@ -1433,10 +1433,8 @@ static const struct iwn_chan_band { #define IWN6050_OTP_NBLOCKS 7 /* HW rate indices. */ -#define IWN_RIDX_CCK1 0 -#define IWN_RIDX_CCK11 3 -#define IWN_RIDX_OFDM6 4 -#define IWN_RIDX_OFDM54 11 +#define IWN_RIDX_CCK1 0 +#define IWN_RIDX_OFDM6 4 static const struct iwn_rate { uint8_t rate; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:54:44 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 831CD106566B; Sat, 18 Jun 2011 11:54:44 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 71FB08FC08; Sat, 18 Jun 2011 11:54:44 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBsidh039626; Sat, 18 Jun 2011 11:54:44 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBsioO039624; Sat, 18 Jun 2011 11:54:44 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181154.p5IBsioO039624@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:54:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223246 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:54:44 -0000 Author: bschmidt Date: Sat Jun 18 11:54:44 2011 New Revision: 223246 URL: http://svn.freebsd.org/changeset/base/223246 Log: MFC r220719: Remove if_ierrors which do not necessarily indicate a RX error, also do account send packets. While here use the IWN_TX_FAIL constant. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:52:58 2011 (r223245) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:54:44 2011 (r223246) @@ -2069,7 +2069,6 @@ iwn_rx_done(struct iwn_softc *sc, struct if (!sc->last_rx_valid) { DPRINTF(sc, IWN_DEBUG_ANY, "%s: missing RX_PHY\n", __func__); - ifp->if_ierrors++; return; } sc->last_rx_valid = 0; @@ -2083,7 +2082,6 @@ iwn_rx_done(struct iwn_softc *sc, struct device_printf(sc->sc_dev, "%s: invalid rx statistic header, len %d\n", __func__, stat->cfg_phy_len); - ifp->if_ierrors++; return; } if (desc->type == IWN_MPDU_RX_DONE) { @@ -2427,11 +2425,12 @@ iwn_tx_done(struct iwn_softc *sc, struct /* * Update rate control statistics for the node. */ - if (status & 0x80) { + if (status & IWN_TX_FAIL) { ifp->if_oerrors++; ieee80211_ratectl_tx_complete(vap, ni, IEEE80211_RATECTL_TX_FAILURE, &ackfailcnt, NULL); } else { + ifp->if_opackets++; ieee80211_ratectl_tx_complete(vap, ni, IEEE80211_RATECTL_TX_SUCCESS, &ackfailcnt, NULL); } From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 11:56:41 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5CC1C1065670; Sat, 18 Jun 2011 11:56:41 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4B24E8FC0A; Sat, 18 Jun 2011 11:56:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IBufaM039746; Sat, 18 Jun 2011 11:56:41 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IBufJS039744; Sat, 18 Jun 2011 11:56:41 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181156.p5IBufJS039744@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 11:56:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223247 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 11:56:41 -0000 Author: bschmidt Date: Sat Jun 18 11:56:40 2011 New Revision: 223247 URL: http://svn.freebsd.org/changeset/base/223247 Log: MFC r220720: Fix WME/QoS handling: - move the TX queue selection into iwn_tx_data/iwn_tx_data_raw - extract traffic identifier and use it - do not expect ACKs for frames marked as such Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:54:44 2011 (r223246) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:56:40 2011 (r223247) @@ -158,7 +158,10 @@ static void iwn5000_reset_sched(struct i #endif static uint8_t iwn_plcp_signal(int); static int iwn_tx_data(struct iwn_softc *, struct mbuf *, - struct ieee80211_node *, struct iwn_tx_ring *); + struct ieee80211_node *); +static int iwn_tx_data_raw(struct iwn_softc *, struct mbuf *, + struct ieee80211_node *, + const struct ieee80211_bpf_params *params); static int iwn_raw_xmit(struct ieee80211_node *, struct mbuf *, const struct ieee80211_bpf_params *); static void iwn_start(struct ifnet *); @@ -2913,8 +2916,7 @@ iwn_plcp_signal(int rate) { } static int -iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni, - struct iwn_tx_ring *ring) +iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) { const struct iwn_hal *hal = sc->sc_hal; const struct ieee80211_txparam *tp; @@ -2922,6 +2924,7 @@ iwn_tx_data(struct iwn_softc *sc, struct struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ni->ni_ic; struct iwn_node *wn = (void *)ni; + struct iwn_tx_ring *ring; struct iwn_tx_desc *desc; struct iwn_tx_data *data; struct iwn_tx_cmd *cmd; @@ -2931,9 +2934,10 @@ iwn_tx_data(struct iwn_softc *sc, struct struct mbuf *m1; bus_dma_segment_t *seg, segs[IWN_MAX_SCATTER]; uint32_t flags; + uint16_t qos; u_int hdrlen; - int totlen, error, pad, nsegs = 0, i, rate; - uint8_t ridx, type, txant; + uint8_t tid, ridx, type, txant; + int ac, i, totlen, error, pad, nsegs = 0, rate; IWN_LOCK_ASSERT(sc); @@ -2941,6 +2945,17 @@ iwn_tx_data(struct iwn_softc *sc, struct hdrlen = ieee80211_anyhdrsize(wh); type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + /* Select EDCA Access Category and TX ring for this frame. */ + if (IEEE80211_QOS_HAS_SEQ(wh)) { + qos = ((const struct ieee80211_qosframe *)wh)->i_qos[0]; + tid = qos & IEEE80211_QOS_TID; + } else { + qos = 0; + tid = 0; + } + ac = M_WME_GETAC(m); + + ring = &sc->txq[ac]; desc = &ring->desc[ring->cur]; data = &ring->data[ring->cur]; @@ -2995,8 +3010,12 @@ iwn_tx_data(struct iwn_softc *sc, struct tx->scratch = 0; /* clear "scratch" area */ flags = 0; - if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) - flags |= IWN_TX_NEED_ACK; + if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { + /* Unicast frame, check if an ACK is expected. */ + if (!qos || (qos & IEEE80211_QOS_ACKPOLICY) != + IEEE80211_QOS_ACKPOLICY_NOACK) + flags |= IWN_TX_NEED_ACK; + } if ((wh->i_fc[0] & (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == (IEEE80211_FC0_TYPE_CTL | IEEE80211_FC0_SUBTYPE_BAR)) @@ -3056,7 +3075,7 @@ iwn_tx_data(struct iwn_softc *sc, struct pad = 0; tx->len = htole16(totlen); - tx->tid = 0; + tx->tid = tid; tx->rts_ntries = 60; tx->data_ntries = 15; tx->lifetime = htole32(IWN_LIFETIME_INFINITE); @@ -3161,8 +3180,7 @@ iwn_tx_data(struct iwn_softc *sc, struct static int iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, - struct ieee80211_node *ni, struct iwn_tx_ring *ring, - const struct ieee80211_bpf_params *params) + struct ieee80211_node *ni, const struct ieee80211_bpf_params *params) { const struct iwn_hal *hal = sc->sc_hal; const struct iwn_rate *rinfo; @@ -3172,13 +3190,14 @@ iwn_tx_data_raw(struct iwn_softc *sc, st struct iwn_tx_cmd *cmd; struct iwn_cmd_data *tx; struct ieee80211_frame *wh; + struct iwn_tx_ring *ring; struct iwn_tx_desc *desc; struct iwn_tx_data *data; struct mbuf *m1; bus_dma_segment_t *seg, segs[IWN_MAX_SCATTER]; uint32_t flags; u_int hdrlen; - int totlen, error, pad, nsegs = 0, i, rate; + int ac, totlen, error, pad, nsegs = 0, i, rate; uint8_t ridx, type, txant; IWN_LOCK_ASSERT(sc); @@ -3187,6 +3206,9 @@ iwn_tx_data_raw(struct iwn_softc *sc, st hdrlen = ieee80211_anyhdrsize(wh); type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + ac = params->ibp_pri & 3; + + ring = &sc->txq[ac]; desc = &ring->desc[ring->cur]; data = &ring->data[ring->cur]; @@ -3362,12 +3384,11 @@ iwn_tx_data_raw(struct iwn_softc *sc, st static int iwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, - const struct ieee80211_bpf_params *params) + const struct ieee80211_bpf_params *params) { struct ieee80211com *ic = ni->ni_ic; struct ifnet *ifp = ic->ic_ifp; struct iwn_softc *sc = ifp->if_softc; - struct iwn_tx_ring *txq; int error = 0; if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { @@ -3377,23 +3398,18 @@ iwn_raw_xmit(struct ieee80211_node *ni, } IWN_LOCK(sc); - if (params == NULL) - txq = &sc->txq[M_WME_GETAC(m)]; - else - txq = &sc->txq[params->ibp_pri & 3]; - if (params == NULL) { /* * Legacy path; interpret frame contents to decide * precisely how to send the frame. */ - error = iwn_tx_data(sc, m, ni, txq); + error = iwn_tx_data(sc, m, ni); } else { /* * Caller supplied explicit parameters to use in * sending the frame. */ - error = iwn_tx_data_raw(sc, m, ni, txq, params); + error = iwn_tx_data_raw(sc, m, ni, params); } if (error != 0) { /* NB: m is reclaimed on tx failure */ @@ -3421,12 +3437,14 @@ iwn_start_locked(struct ifnet *ifp) { struct iwn_softc *sc = ifp->if_softc; struct ieee80211_node *ni; - struct iwn_tx_ring *txq; struct mbuf *m; - int pri; IWN_LOCK_ASSERT(sc); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || + (ifp->if_drv_flags & IFF_DRV_OACTIVE)) + return; + for (;;) { if (sc->qfullmsk != 0) { ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -3436,12 +3454,10 @@ iwn_start_locked(struct ifnet *ifp) if (m == NULL) break; ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; - pri = M_WME_GETAC(m); - txq = &sc->txq[pri]; - if (iwn_tx_data(sc, m, ni, txq) != 0) { - ifp->if_oerrors++; + if (iwn_tx_data(sc, m, ni) != 0) { ieee80211_free_node(ni); - break; + ifp->if_oerrors++; + continue; } sc->sc_tx_timer = 5; } From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:00:49 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EE0BD10657C2; Sat, 18 Jun 2011 12:00:49 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DBB068FC13; Sat, 18 Jun 2011 12:00:49 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IC0n2d039922; Sat, 18 Jun 2011 12:00:49 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IC0ngB039919; Sat, 18 Jun 2011 12:00:49 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181200.p5IC0ngB039919@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:00:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223248 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:00:50 -0000 Author: bschmidt Date: Sat Jun 18 12:00:49 2011 New Revision: 223248 URL: http://svn.freebsd.org/changeset/base/223248 Log: MFC r220721,220723-220726: - Rename some stuff in favour of the OpenBSD names: - prefer EDCA over WME - qid for a TXQ ID - reg for register values - Shuffle code around a bit. Mostly to group functional connected things, others to get the same order as the OpenBSD code. - Sync debug and error messages with OpenBSD. The device capability announcements are now hidden behind bootverbose. - Sync comments with OpenBSD. - Whitespace sync, some more style(9) conform then others. Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 11:56:40 2011 (r223247) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:00:49 2011 (r223248) @@ -72,16 +72,61 @@ __FBSDID("$FreeBSD$"); #include #include +struct iwn_ident { + uint16_t vendor; + uint16_t device; + const char *name; +}; + +static const struct iwn_ident iwn_ident_table [] = { + { 0x8086, 0x4229, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x422D, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x4230, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x4233, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x4232, "Intel(R) PRO/Wireless 5100" }, + { 0x8086, 0x4237, "Intel(R) PRO/Wireless 5100" }, + { 0x8086, 0x423C, "Intel(R) PRO/Wireless 5150" }, + { 0x8086, 0x423D, "Intel(R) PRO/Wireless 5150" }, + { 0x8086, 0x4235, "Intel(R) PRO/Wireless 5300" }, + { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5300" }, + { 0x8086, 0x423A, "Intel(R) PRO/Wireless 5350" }, + { 0x8086, 0x423B, "Intel(R) PRO/Wireless 5350" }, + { 0x8086, 0x0083, "Intel(R) PRO/Wireless 1000" }, + { 0x8086, 0x0084, "Intel(R) PRO/Wireless 1000" }, + { 0x8086, 0x008D, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x008E, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x4238, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x4239, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x422B, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x422C, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x0087, "Intel(R) PRO/Wireless 6250" }, + { 0x8086, 0x0089, "Intel(R) PRO/Wireless 6250" }, + { 0x8086, 0x0082, "Intel(R) PRO/Wireless 6205a" }, + { 0x8086, 0x0085, "Intel(R) PRO/Wireless 6205a" }, +#ifdef notyet + { 0x8086, 0x008a, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x008b, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x008f, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x0090, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x0091, "Intel(R) PRO/Wireless 6205b" }, +#endif + { 0, 0, NULL } +}; + static int iwn_probe(device_t); static int iwn_attach(device_t); static const struct iwn_hal *iwn_hal_attach(struct iwn_softc *); static void iwn_radiotap_attach(struct iwn_softc *); +static void iwn_sysctlattach(struct iwn_softc *); static struct ieee80211vap *iwn_vap_create(struct ieee80211com *, const char name[IFNAMSIZ], int unit, int opmode, int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t mac[IEEE80211_ADDR_LEN]); static void iwn_vap_delete(struct ieee80211vap *); static int iwn_detach(device_t); +static int iwn_shutdown(device_t); +static int iwn_suspend(device_t); +static int iwn_resume(device_t); static int iwn_nic_lock(struct iwn_softc *); static int iwn_eeprom_lock(struct iwn_softc *); static int iwn_init_otprom(struct iwn_softc *); @@ -116,8 +161,12 @@ static void iwn_read_eeprom_band(struct #if 0 /* HT */ static void iwn_read_eeprom_ht40(struct iwn_softc *, int); #endif -static void iwn_read_eeprom_channels(struct iwn_softc *, int, - uint32_t); +static void iwn_read_eeprom_channels(struct iwn_softc *, int, uint32_t); +static struct iwn_eeprom_chan *iwn_find_eeprom_channel(struct iwn_softc *, + struct ieee80211_channel *); +static int iwn_setregdomain(struct ieee80211com *, + struct ieee80211_regdomain *, int, + struct ieee80211_channel[]); static void iwn_read_eeprom_enhinfo(struct iwn_softc *); static struct ieee80211_node *iwn_node_alloc(struct ieee80211vap *, const uint8_t mac[IEEE80211_ADDR_LEN]); @@ -176,7 +225,7 @@ static int iwn5000_add_node(struct iwn_s static int iwn_set_link_quality(struct iwn_softc *, struct ieee80211_node *); static int iwn_add_broadcast_node(struct iwn_softc *, int); -static int iwn_wme_update(struct ieee80211com *); +static int iwn_updateedca(struct ieee80211com *); static void iwn_update_mcast(struct ifnet *); static void iwn_set_led(struct iwn_softc *, uint8_t, uint8_t, uint8_t); static int iwn_set_critical_temp(struct iwn_softc *); @@ -219,10 +268,12 @@ static void iwn_ampdu_tx_stop(struct iee struct ieee80211_node *, uint8_t); static void iwn4965_ampdu_tx_start(struct iwn_softc *, struct ieee80211_node *, uint8_t, uint16_t); -static void iwn4965_ampdu_tx_stop(struct iwn_softc *, uint8_t, uint16_t); +static void iwn4965_ampdu_tx_stop(struct iwn_softc *, + uint8_t, uint16_t); static void iwn5000_ampdu_tx_start(struct iwn_softc *, struct ieee80211_node *, uint8_t, uint16_t); -static void iwn5000_ampdu_tx_stop(struct iwn_softc *, uint8_t, uint16_t); +static void iwn5000_ampdu_tx_stop(struct iwn_softc *, + uint8_t, uint16_t); #endif static int iwn5000_query_calibration(struct iwn_softc *); static int iwn5000_send_calibration(struct iwn_softc *); @@ -251,27 +302,18 @@ static int iwn5000_nic_config(struct iwn static int iwn_hw_prepare(struct iwn_softc *); static int iwn_hw_init(struct iwn_softc *); static void iwn_hw_stop(struct iwn_softc *); +static void iwn_radio_on(void *, int); +static void iwn_radio_off(void *, int); static void iwn_init_locked(struct iwn_softc *); static void iwn_init(void *); static void iwn_stop_locked(struct iwn_softc *); static void iwn_stop(struct iwn_softc *); -static void iwn_scan_start(struct ieee80211com *); -static void iwn_scan_end(struct ieee80211com *); -static void iwn_set_channel(struct ieee80211com *); -static void iwn_scan_curchan(struct ieee80211_scan_state *, unsigned long); -static void iwn_scan_mindwell(struct ieee80211_scan_state *); -static struct iwn_eeprom_chan *iwn_find_eeprom_channel(struct iwn_softc *, - struct ieee80211_channel *); -static int iwn_setregdomain(struct ieee80211com *, - struct ieee80211_regdomain *, int, - struct ieee80211_channel []); +static void iwn_scan_start(struct ieee80211com *); +static void iwn_scan_end(struct ieee80211com *); +static void iwn_set_channel(struct ieee80211com *); +static void iwn_scan_curchan(struct ieee80211_scan_state *, unsigned long); +static void iwn_scan_mindwell(struct ieee80211_scan_state *); static void iwn_hw_reset(void *, int); -static void iwn_radio_on(void *, int); -static void iwn_radio_off(void *, int); -static void iwn_sysctlattach(struct iwn_softc *); -static int iwn_shutdown(device_t); -static int iwn_suspend(device_t); -static int iwn_resume(device_t); #define IWN_DEBUG #ifdef IWN_DEBUG @@ -298,51 +340,75 @@ enum { printf(fmt, __VA_ARGS__); \ } while (0) -static const char *iwn_intr_str(uint8_t); +static const char * +iwn_intr_str(uint8_t cmd) +{ + switch (cmd) { + /* Notifications */ + case IWN_UC_READY: return "UC_READY"; + case IWN_ADD_NODE_DONE: return "ADD_NODE_DONE"; + case IWN_TX_DONE: return "TX_DONE"; + case IWN_START_SCAN: return "START_SCAN"; + case IWN_STOP_SCAN: return "STOP_SCAN"; + case IWN_RX_STATISTICS: return "RX_STATS"; + case IWN_BEACON_STATISTICS: return "BEACON_STATS"; + case IWN_STATE_CHANGED: return "STATE_CHANGED"; + case IWN_BEACON_MISSED: return "BEACON_MISSED"; + case IWN_RX_PHY: return "RX_PHY"; + case IWN_MPDU_RX_DONE: return "MPDU_RX_DONE"; + case IWN_RX_DONE: return "RX_DONE"; + + /* Command Notifications */ + case IWN_CMD_RXON: return "IWN_CMD_RXON"; + case IWN_CMD_RXON_ASSOC: return "IWN_CMD_RXON_ASSOC"; + case IWN_CMD_EDCA_PARAMS: return "IWN_CMD_EDCA_PARAMS"; + case IWN_CMD_TIMING: return "IWN_CMD_TIMING"; + case IWN_CMD_LINK_QUALITY: return "IWN_CMD_LINK_QUALITY"; + case IWN_CMD_SET_LED: return "IWN_CMD_SET_LED"; + case IWN5000_CMD_WIMAX_COEX: return "IWN5000_CMD_WIMAX_COEX"; + case IWN5000_CMD_CALIB_CONFIG: return "IWN5000_CMD_CALIB_CONFIG"; + case IWN5000_CMD_CALIB_RESULT: return "IWN5000_CMD_CALIB_RESULT"; + case IWN5000_CMD_CALIB_COMPLETE: return "IWN5000_CMD_CALIB_COMPLETE"; + case IWN_CMD_SET_POWER_MODE: return "IWN_CMD_SET_POWER_MODE"; + case IWN_CMD_SCAN: return "IWN_CMD_SCAN"; + case IWN_CMD_SCAN_RESULTS: return "IWN_CMD_SCAN_RESULTS"; + case IWN_CMD_TXPOWER: return "IWN_CMD_TXPOWER"; + case IWN_CMD_TXPOWER_DBM: return "IWN_CMD_TXPOWER_DBM"; + case IWN5000_CMD_TX_ANT_CONFIG: return "IWN5000_CMD_TX_ANT_CONFIG"; + case IWN_CMD_BT_COEX: return "IWN_CMD_BT_COEX"; + case IWN_CMD_SET_CRITICAL_TEMP: return "IWN_CMD_SET_CRITICAL_TEMP"; + case IWN_CMD_SET_SENSITIVITY: return "IWN_CMD_SET_SENSITIVITY"; + case IWN_CMD_PHY_CALIB: return "IWN_CMD_PHY_CALIB"; + } + return "UNKNOWN INTR NOTIF/CMD"; +} #else #define DPRINTF(sc, m, fmt, ...) do { (void) sc; } while (0) #endif -struct iwn_ident { - uint16_t vendor; - uint16_t device; - const char *name; +static device_method_t iwn_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, iwn_probe), + DEVMETHOD(device_attach, iwn_attach), + DEVMETHOD(device_detach, iwn_detach), + DEVMETHOD(device_shutdown, iwn_shutdown), + DEVMETHOD(device_suspend, iwn_suspend), + DEVMETHOD(device_resume, iwn_resume), + { 0, 0 } }; -static const struct iwn_ident iwn_ident_table [] = { - { 0x8086, 0x4229, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x422D, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4230, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4233, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4232, "Intel(R) PRO/Wireless 5100" }, - { 0x8086, 0x4237, "Intel(R) PRO/Wireless 5100" }, - { 0x8086, 0x423C, "Intel(R) PRO/Wireless 5150" }, - { 0x8086, 0x423D, "Intel(R) PRO/Wireless 5150" }, - { 0x8086, 0x4235, "Intel(R) PRO/Wireless 5300" }, - { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5300" }, - { 0x8086, 0x423A, "Intel(R) PRO/Wireless 5350" }, - { 0x8086, 0x423B, "Intel(R) PRO/Wireless 5350" }, - { 0x8086, 0x0083, "Intel(R) PRO/Wireless 1000" }, - { 0x8086, 0x0084, "Intel(R) PRO/Wireless 1000" }, - { 0x8086, 0x008D, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x008E, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x4238, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x4239, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x422B, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x422C, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x0087, "Intel(R) PRO/Wireless 6250" }, - { 0x8086, 0x0089, "Intel(R) PRO/Wireless 6250" }, - { 0x8086, 0x0082, "Intel(R) PRO/Wireless 6205a" }, - { 0x8086, 0x0085, "Intel(R) PRO/Wireless 6205a" }, -#ifdef notyet - { 0x8086, 0x008a, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x008b, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x008f, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x0090, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x0091, "Intel(R) PRO/Wireless 6205b" }, -#endif - { 0, 0, NULL } +static driver_t iwn_driver = { + "iwn", + iwn_methods, + sizeof(struct iwn_softc) }; +static devclass_t iwn_devclass; + +DRIVER_MODULE(iwn, pci, iwn_driver, iwn_devclass, 0, 0); + +MODULE_DEPEND(iwn, firmware, 1, 1, 1); +MODULE_DEPEND(iwn, pci, 1, 1, 1); +MODULE_DEPEND(iwn, wlan, 1, 1, 1); static const struct iwn_hal iwn4965_hal = { iwn4965_load_firmware, @@ -422,7 +488,7 @@ iwn_attach(device_t dev) struct ieee80211com *ic; struct ifnet *ifp; const struct iwn_hal *hal; - uint32_t tmp; + uint32_t reg; int i, error, result; uint8_t macaddr[IEEE80211_ADDR_LEN]; @@ -442,12 +508,12 @@ iwn_attach(device_t dev) pci_write_config(dev, 0x41, 0, 1); /* Hardware bug workaround. */ - tmp = pci_read_config(dev, PCIR_COMMAND, 1); - if (tmp & PCIM_CMD_INTxDIS) { + reg = pci_read_config(dev, PCIR_COMMAND, 1); + if (reg & PCIM_CMD_INTxDIS) { DPRINTF(sc, IWN_DEBUG_RESET, "%s: PCIe INTx Disable set\n", __func__); - tmp &= ~PCIM_CMD_INTxDIS; - pci_write_config(dev, PCIR_COMMAND, tmp, 1); + reg &= ~PCIM_CMD_INTxDIS; + pci_write_config(dev, PCIR_COMMAND, reg, 1); } /* Enable bus-mastering. */ @@ -456,30 +522,28 @@ iwn_attach(device_t dev) sc->mem_rid = PCIR_BAR(0); sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, RF_ACTIVE); - if (sc->mem == NULL ) { - device_printf(dev, "could not allocate memory resources\n"); + if (sc->mem == NULL) { + device_printf(dev, "can't map mem space\n"); error = ENOMEM; return error; } - sc->sc_st = rman_get_bustag(sc->mem); sc->sc_sh = rman_get_bushandle(sc->mem); + sc->irq_rid = 0; if ((result = pci_msi_count(dev)) == 1 && pci_alloc_msi(dev, &result) == 0) sc->irq_rid = 1; + /* Install interrupt handler. */ sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, RF_ACTIVE | RF_SHAREABLE); if (sc->irq == NULL) { - device_printf(dev, "could not allocate interrupt resource\n"); + device_printf(dev, "can't map interrupt\n"); error = ENOMEM; goto fail; } IWN_LOCK_INIT(sc); - TASK_INIT(&sc->sc_reinit_task, 0, iwn_hw_reset, sc ); - TASK_INIT(&sc->sc_radioon_task, 0, iwn_radio_on, sc ); - TASK_INIT(&sc->sc_radiooff_task, 0, iwn_radio_off, sc ); /* Attach Hardware Abstraction Layer. */ hal = iwn_hal_attach(sc); @@ -488,15 +552,13 @@ iwn_attach(device_t dev) goto fail; } - error = iwn_hw_prepare(sc); - if (error != 0) { + if ((error = iwn_hw_prepare(sc)) != 0) { device_printf(dev, "hardware not ready, error %d\n", error); goto fail; } /* Allocate DMA memory for firmware transfers. */ - error = iwn_alloc_fwmem(sc); - if (error != 0) { + if ((error = iwn_alloc_fwmem(sc)) != 0) { device_printf(dev, "could not allocate memory for firmware, error %d\n", error); @@ -504,47 +566,41 @@ iwn_attach(device_t dev) } /* Allocate "Keep Warm" page. */ - error = iwn_alloc_kw(sc); - if (error != 0) { + if ((error = iwn_alloc_kw(sc)) != 0) { device_printf(dev, - "could not allocate \"Keep Warm\" page, error %d\n", error); + "could not allocate keep warm page, error %d\n", error); goto fail; } /* Allocate ICT table for 5000 Series. */ if (sc->hw_type != IWN_HW_REV_TYPE_4965 && (error = iwn_alloc_ict(sc)) != 0) { - device_printf(dev, - "%s: could not allocate ICT table, error %d\n", - __func__, error); + device_printf(dev, "could not allocate ICT table, error %d\n", + error); goto fail; } /* Allocate TX scheduler "rings". */ - error = iwn_alloc_sched(sc); - if (error != 0) { + if ((error = iwn_alloc_sched(sc)) != 0) { device_printf(dev, - "could not allocate TX scheduler rings, error %d\n", - error); + "could not allocate TX scheduler rings, error %d\n", error); goto fail; } - /* Allocate TX rings (16 on 4965AGN, 20 on 5000). */ + /* Allocate TX rings (16 on 4965AGN, 20 on >=5000). */ for (i = 0; i < hal->ntxqs; i++) { - error = iwn_alloc_tx_ring(sc, &sc->txq[i], i); - if (error != 0) { + if ((error = iwn_alloc_tx_ring(sc, &sc->txq[i], i)) != 0) { device_printf(dev, - "could not allocate Tx ring %d, error %d\n", - i, error); + "could not allocate TX ring %d, error %d\n", i, + error); goto fail; } } /* Allocate RX ring. */ - error = iwn_alloc_rx_ring(sc, &sc->rxq); - if (error != 0 ){ - device_printf(dev, - "could not allocate Rx ring, error %d\n", error); + if ((error = iwn_alloc_rx_ring(sc, &sc->rxq)) != 0) { + device_printf(dev, "could not allocate RX ring, error %d\n", + error); goto fail; } @@ -560,14 +616,19 @@ iwn_attach(device_t dev) ((sc->rxchainmask >> 2) & 1) + ((sc->rxchainmask >> 1) & 1) + ((sc->rxchainmask >> 0) & 1); + if (bootverbose) { + device_printf(dev, "MIMO %dT%dR, %.4s, address %6D\n", + sc->ntxchains, sc->nrxchains, sc->eeprom_domain, + macaddr, ":"); + } ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); if (ifp == NULL) { device_printf(dev, "can not allocate ifnet structure\n"); goto fail; } - ic = ifp->if_l2com; + ic = ifp->if_l2com; ic->ic_ifp = ifp; ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ @@ -618,17 +679,12 @@ iwn_attach(device_t dev) #endif /* Read MAC address, channels, etc from EEPROM. */ - error = iwn_read_eeprom(sc, macaddr); - if (error != 0) { + if ((error = iwn_read_eeprom(sc, macaddr)) != 0) { device_printf(dev, "could not read EEPROM, error %d\n", error); goto fail; } - device_printf(sc->sc_dev, "MIMO %dT%dR, %.4s, address %6D\n", - sc->ntxchains, sc->nrxchains, sc->eeprom_domain, - macaddr, ":"); - #if 0 /* HT */ /* Set supported HT rates. */ ic->ic_sup_mcs[0] = 0xff; @@ -653,8 +709,14 @@ iwn_attach(device_t dev) ic->ic_vap_delete = iwn_vap_delete; ic->ic_raw_xmit = iwn_raw_xmit; ic->ic_node_alloc = iwn_node_alloc; +#if 0 /* HT */ + ic->ic_ampdu_rx_start = iwn_ampdu_rx_start; + ic->ic_ampdu_rx_stop = iwn_ampdu_rx_stop; + ic->ic_ampdu_tx_start = iwn_ampdu_tx_start; + ic->ic_ampdu_tx_stop = iwn_ampdu_tx_stop; +#endif ic->ic_newassoc = iwn_newassoc; - ic->ic_wme.wme_update = iwn_wme_update; + ic->ic_wme.wme_update = iwn_updateedca; ic->ic_update_mcast = iwn_update_mcast; ic->ic_scan_start = iwn_scan_start; ic->ic_scan_end = iwn_scan_end; @@ -662,17 +724,14 @@ iwn_attach(device_t dev) ic->ic_scan_curchan = iwn_scan_curchan; ic->ic_scan_mindwell = iwn_scan_mindwell; ic->ic_setregdomain = iwn_setregdomain; -#if 0 /* HT */ - ic->ic_ampdu_rx_start = iwn_ampdu_rx_start; - ic->ic_ampdu_rx_stop = iwn_ampdu_rx_stop; - ic->ic_ampdu_tx_start = iwn_ampdu_tx_start; - ic->ic_ampdu_tx_stop = iwn_ampdu_tx_stop; -#endif iwn_radiotap_attach(sc); callout_init_mtx(&sc->calib_to, &sc->sc_mtx, 0); callout_init_mtx(&sc->watchdog_to, &sc->sc_mtx, 0); + TASK_INIT(&sc->sc_reinit_task, 0, iwn_hw_reset, sc); + TASK_INIT(&sc->sc_radioon_task, 0, iwn_radio_on, sc); + TASK_INIT(&sc->sc_radiooff_task, 0, iwn_radio_off, sc); iwn_sysctlattach(sc); @@ -682,12 +741,13 @@ iwn_attach(device_t dev) error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, NULL, iwn_intr, sc, &sc->sc_ih); if (error != 0) { - device_printf(dev, "could not set up interrupt, error %d\n", + device_printf(dev, "can't establish interrupt, error %d\n", error); goto fail; } - ieee80211_announce(ic); + if (bootverbose) + ieee80211_announce(ic); return 0; fail: iwn_detach(dev); @@ -791,11 +851,24 @@ iwn_radiotap_attach(struct iwn_softc *sc IWN_RX_RADIOTAP_PRESENT); } +static void +iwn_sysctlattach(struct iwn_softc *sc) +{ + struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev); + struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev); + +#ifdef IWN_DEBUG + sc->sc_debug = 0; + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, + "debug", CTLFLAG_RW, &sc->sc_debug, 0, "control debugging printfs"); +#endif +} + static struct ieee80211vap * iwn_vap_create(struct ieee80211com *ic, - const char name[IFNAMSIZ], int unit, int opmode, int flags, - const uint8_t bssid[IEEE80211_ADDR_LEN], - const uint8_t mac[IEEE80211_ADDR_LEN]) + const char name[IFNAMSIZ], int unit, int opmode, int flags, + const uint8_t bssid[IEEE80211_ADDR_LEN], + const uint8_t mac[IEEE80211_ADDR_LEN]) { struct iwn_vap *ivp; struct ieee80211vap *vap; @@ -836,7 +909,7 @@ iwn_detach(device_t dev) struct iwn_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic; - int i; + int qid; if (ifp != NULL) { ic = ifp->if_l2com; @@ -851,24 +924,25 @@ iwn_detach(device_t dev) ieee80211_ifdetach(ic); } + /* Uninstall interrupt handler. */ + if (sc->irq != NULL) { + bus_teardown_intr(dev, sc->irq, sc->sc_ih); + bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); + if (sc->irq_rid == 1) + pci_release_msi(dev); + } + /* Free DMA resources. */ iwn_free_rx_ring(sc, &sc->rxq); if (sc->sc_hal != NULL) - for (i = 0; i < sc->sc_hal->ntxqs; i++) - iwn_free_tx_ring(sc, &sc->txq[i]); + for (qid = 0; qid < sc->sc_hal->ntxqs; qid++) + iwn_free_tx_ring(sc, &sc->txq[qid]); iwn_free_sched(sc); iwn_free_kw(sc); if (sc->ict != NULL) iwn_free_ict(sc); iwn_free_fwmem(sc); - if (sc->irq != NULL) { - bus_teardown_intr(dev, sc->irq, sc->sc_ih); - bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); - if (sc->irq_rid == 1) - pci_release_msi(dev); - } - if (sc->mem != NULL) bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem); @@ -880,34 +954,78 @@ iwn_detach(device_t dev) } static int -iwn_nic_lock(struct iwn_softc *sc) +iwn_shutdown(device_t dev) { - int ntries; - - /* Request exclusive access to NIC. */ - IWN_SETBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ); + struct iwn_softc *sc = device_get_softc(dev); - /* Spin until we actually get the lock. */ - for (ntries = 0; ntries < 1000; ntries++) { - if ((IWN_READ(sc, IWN_GP_CNTRL) & - (IWN_GP_CNTRL_MAC_ACCESS_ENA | IWN_GP_CNTRL_SLEEP)) == - IWN_GP_CNTRL_MAC_ACCESS_ENA) - return 0; - DELAY(10); - } - return ETIMEDOUT; + iwn_stop(sc); + return 0; } -static __inline void -iwn_nic_unlock(struct iwn_softc *sc) +static int +iwn_suspend(device_t dev) { - IWN_CLRBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ); + struct iwn_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + iwn_stop(sc); + if (vap != NULL) + ieee80211_stop(vap); + return 0; } -static __inline uint32_t -iwn_prph_read(struct iwn_softc *sc, uint32_t addr) +static int +iwn_resume(device_t dev) { - IWN_WRITE(sc, IWN_PRPH_RADDR, IWN_PRPH_DWORD | addr); + struct iwn_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + /* Clear device-specific "PCI retry timeout" register (41h). */ + pci_write_config(dev, 0x41, 0, 1); + + if (ifp->if_flags & IFF_UP) { + iwn_init(sc); + if (vap != NULL) + ieee80211_init(vap); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + iwn_start(ifp); + } + return 0; +} + +static int +iwn_nic_lock(struct iwn_softc *sc) +{ + int ntries; + + /* Request exclusive access to NIC. */ + IWN_SETBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ); + + /* Spin until we actually get the lock. */ + for (ntries = 0; ntries < 1000; ntries++) { + if ((IWN_READ(sc, IWN_GP_CNTRL) & + (IWN_GP_CNTRL_MAC_ACCESS_ENA | IWN_GP_CNTRL_SLEEP)) == + IWN_GP_CNTRL_MAC_ACCESS_ENA) + return 0; + DELAY(10); + } + return ETIMEDOUT; +} + +static __inline void +iwn_nic_unlock(struct iwn_softc *sc) +{ + IWN_CLRBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ); +} + +static __inline uint32_t +iwn_prph_read(struct iwn_softc *sc, uint32_t addr) +{ + IWN_WRITE(sc, IWN_PRPH_RADDR, IWN_PRPH_DWORD | addr); IWN_BARRIER_READ_WRITE(sc); return IWN_READ(sc, IWN_PRPH_RDATA); } @@ -1023,12 +1141,10 @@ iwn_init_otprom(struct iwn_softc *sc) int count, error; /* Wait for clock stabilization before accessing prph. */ - error = iwn_clock_wait(sc); - if (error != 0) + if ((error = iwn_clock_wait(sc)) != 0) return error; - error = iwn_nic_lock(sc); - if (error != 0) + if ((error = iwn_nic_lock(sc)) != 0) return error; iwn_prph_setbits(sc, IWN_APMG_PS, IWN_APMG_PS_RESET_REQ); DELAY(5); @@ -1073,9 +1189,9 @@ iwn_init_otprom(struct iwn_softc *sc) static int iwn_read_prom_data(struct iwn_softc *sc, uint32_t addr, void *data, int count) { + uint8_t *out = data; uint32_t val, tmp; int ntries; - uint8_t *out = data; addr += sc->prom_base; for (; count > 0; count -= 2, addr++) { @@ -1127,8 +1243,8 @@ iwn_dma_contig_alloc(struct iwn_softc *s { int error; - dma->size = size; dma->tag = NULL; + dma->size = size; error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), alignment, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size, @@ -1150,9 +1266,10 @@ iwn_dma_contig_alloc(struct iwn_softc *s if (kvap != NULL) *kvap = dma->vaddr; + return 0; -fail: - iwn_dma_contig_free(dma); + +fail: iwn_dma_contig_free(dma); return error; } @@ -1309,11 +1426,13 @@ iwn_alloc_rx_ring(struct iwn_softc *sc, /* Set physical address of RX buffer (256-byte aligned). */ ring->desc[i] = htole32(paddr >> 8); } + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, BUS_DMASYNC_PREWRITE); + return 0; -fail: - iwn_free_rx_ring(sc, ring); + +fail: iwn_free_rx_ring(sc, ring); return error; } @@ -1331,11 +1450,6 @@ iwn_reset_rx_ring(struct iwn_softc *sc, DELAY(10); } iwn_nic_unlock(sc); -#ifdef IWN_DEBUG - if (ntries == 1000) - DPRINTF(sc, IWN_DEBUG_ANY, "%s\n", - "timeout resetting Rx ring"); -#endif } ring->cur = 0; sc->last_rx_valid = 0; @@ -1371,16 +1485,16 @@ iwn_free_rx_ring(struct iwn_softc *sc, s static int iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid) { - bus_size_t size; bus_addr_t paddr; + bus_size_t size; int i, error; ring->qid = qid; ring->queued = 0; ring->cur = 0; - /* Allocate TX descriptors (256-byte aligned.) */ - size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_desc); + /* Allocate TX descriptors (256-byte aligned). */ + size = IWN_TX_RING_COUNT * sizeof (struct iwn_tx_desc); error = iwn_dma_contig_alloc(sc, &ring->desc_dma, (void **)&ring->desc, size, 256); if (error != 0) { @@ -1389,15 +1503,15 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, __func__, error); goto fail; } - /* * We only use rings 0 through 4 (4 EDCA + cmd) so there is no need * to allocate commands space for other rings. + * XXX Do we really need to allocate descriptors for other rings? */ if (qid > 4) return 0; - size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_cmd); + size = IWN_TX_RING_COUNT * sizeof (struct iwn_tx_cmd); error = iwn_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd, size, 4); if (error != 0) { @@ -1408,9 +1522,9 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, } error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, - BUS_SPACE_MAXADDR_32BIT, - BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, IWN_MAX_SCATTER - 1, - MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, + IWN_MAX_SCATTER - 1, MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL, + &ring->data_dmat); if (error != 0) { device_printf(sc->sc_dev, "%s: could not create TX buf DMA tag, error %d\n", @@ -1435,8 +1549,8 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, } } return 0; -fail: - iwn_free_tx_ring(sc, ring); + +fail: iwn_free_tx_ring(sc, ring); return error; } @@ -1501,7 +1615,7 @@ iwn5000_ict_reset(struct iwn_softc *sc) memset(sc->ict, 0, IWN_ICT_SIZE); sc->ict_cur = 0; - /* Set physical address of ICT table (4KB aligned.) */ + /* Set physical address of ICT table (4KB aligned). */ DPRINTF(sc, IWN_DEBUG_RESET, "%s: enabling ICT\n", __func__); IWN_WRITE(sc, IWN_DRAM_INT_TBL, IWN_DRAM_INT_TBL_ENABLE | IWN_DRAM_INT_TBL_WRAP_CHECK | sc->ict_dma.paddr >> 12); @@ -1520,8 +1634,8 @@ static int iwn_read_eeprom(struct iwn_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN]) { const struct iwn_hal *hal = sc->sc_hal; - int error; uint16_t val; + int error; /* Check whether adapter has an EEPROM or an OTPROM. */ if (sc->hw_type >= IWN_HW_REV_TYPE_1000 && @@ -1531,11 +1645,10 @@ iwn_read_eeprom(struct iwn_softc *sc, ui (sc->sc_flags & IWN_FLAG_HAS_OTPROM) ? "OTPROM" : "EEPROM"); /* Adapter has to be powered on for EEPROM access to work. */ - error = iwn_apm_init(sc); - if (error != 0) { + if ((error = iwn_apm_init(sc)) != 0) { device_printf(sc->sc_dev, - "%s: could not power ON adapter, error %d\n", - __func__, error); + "%s: could not power ON adapter, error %d\n", __func__, + error); return error; } @@ -1543,17 +1656,13 @@ iwn_read_eeprom(struct iwn_softc *sc, ui device_printf(sc->sc_dev, "%s: bad ROM signature\n", __func__); return EIO; } - error = iwn_eeprom_lock(sc); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not lock ROM, error %d\n", + if ((error = iwn_eeprom_lock(sc)) != 0) { + device_printf(sc->sc_dev, "%s: could not lock ROM, error %d\n", __func__, error); return error; } - if (sc->sc_flags & IWN_FLAG_HAS_OTPROM) { - error = iwn_init_otprom(sc); - if (error != 0) { + if ((error = iwn_init_otprom(sc)) != 0) { device_printf(sc->sc_dev, "%s: could not initialize OTPROM, error %d\n", __func__, error); @@ -1581,13 +1690,13 @@ static void iwn4965_read_eeprom(struct iwn_softc *sc) { uint32_t addr; - int i; uint16_t val; + int i; - /* Read regulatory domain (4 ASCII characters.) */ + /* Read regulatory domain (4 ASCII characters). */ iwn_read_prom_data(sc, IWN4965_EEPROM_DOMAIN, sc->eeprom_domain, 4); - /* Read the list of authorized channels (20MHz ones only.) */ + /* Read the list of authorized channels (20MHz ones only). */ for (i = 0; i < 5; i++) { addr = iwn4965_regulatory_bands[i]; iwn_read_eeprom_channels(sc, i, addr); @@ -1664,17 +1773,17 @@ iwn5000_read_eeprom(struct iwn_softc *sc { struct iwn5000_eeprom_calib_hdr hdr; int32_t volt; - uint32_t addr, base; - int i; + uint32_t base, addr; uint16_t val; + int i; - /* Read regulatory domain (4 ASCII characters.) */ + /* Read regulatory domain (4 ASCII characters). */ iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2); base = le16toh(val); iwn_read_prom_data(sc, base + IWN5000_EEPROM_DOMAIN, sc->eeprom_domain, 4); - /* Read the list of authorized channels (20MHz ones only.) */ + /* Read the list of authorized channels (20MHz ones only). */ for (i = 0; i < 5; i++) { addr = base + iwn5000_regulatory_bands[i]; iwn_read_eeprom_channels(sc, i, addr); @@ -1688,8 +1797,8 @@ iwn5000_read_eeprom(struct iwn_softc *sc base = le16toh(val); iwn_read_prom_data(sc, base, &hdr, sizeof hdr); DPRINTF(sc, IWN_DEBUG_CALIBRATE, - "%s: calib version=%u pa type=%u voltage=%u\n", - __func__, hdr.version, hdr.pa_type, le16toh(hdr.volt)); + "%s: calib version=%u pa type=%u voltage=%u\n", __func__, + hdr.version, hdr.pa_type, le16toh(hdr.volt)); sc->calib_ver = hdr.version; if (sc->hw_type == IWN_HW_REV_TYPE_5150) { @@ -1754,33 +1863,30 @@ iwn_read_eeprom_band(struct iwn_softc *s chan = band->chan[i]; nflags = iwn_eeprom_channel_flags(&channels[i]); - DPRINTF(sc, IWN_DEBUG_RESET, - "add chan %d flags 0x%x maxpwr %d\n", - chan, channels[i].flags, channels[i].maxpwr); - c = &ic->ic_channels[ic->ic_nchans++]; c->ic_ieee = chan; c->ic_maxregpower = channels[i].maxpwr; c->ic_maxpower = 2*c->ic_maxregpower; - /* Save maximum allowed TX power for this channel. */ - sc->maxpwr[chan] = channels[i].maxpwr; - if (n == 0) { /* 2GHz band */ - c->ic_freq = ieee80211_ieee2mhz(chan, - IEEE80211_CHAN_G); - + c->ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_G); /* G =>'s B is supported */ c->ic_flags = IEEE80211_CHAN_B | nflags; - c = &ic->ic_channels[ic->ic_nchans++]; c[0] = c[-1]; c->ic_flags = IEEE80211_CHAN_G | nflags; } else { /* 5GHz band */ - c->ic_freq = ieee80211_ieee2mhz(chan, - IEEE80211_CHAN_A); + c->ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_A); c->ic_flags = IEEE80211_CHAN_A | nflags; } + + /* Save maximum allowed TX power for this channel. */ + sc->maxpwr[chan] = channels[i].maxpwr; + + DPRINTF(sc, IWN_DEBUG_RESET, + "add chan %d flags 0x%x maxpwr %d\n", chan, + channels[i].flags, channels[i].maxpwr); + #if 0 /* HT */ /* XXX no constraints on using HT20 */ /* add HT20, HT40 added separately */ @@ -1869,6 +1975,48 @@ iwn_read_eeprom_channels(struct iwn_soft ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans); } +static struct iwn_eeprom_chan * +iwn_find_eeprom_channel(struct iwn_softc *sc, struct ieee80211_channel *c) +{ + int i, j; + + for (j = 0; j < 7; j++) { + for (i = 0; i < iwn_bands[j].nchan; i++) { + if (iwn_bands[j].chan[i] == c->ic_ieee) + return &sc->eeprom_channels[j][i]; + } + } + + return NULL; +} + +/* + * Enforce flags read from EEPROM. + */ +static int +iwn_setregdomain(struct ieee80211com *ic, struct ieee80211_regdomain *rd, + int nchan, struct ieee80211_channel chans[]) +{ + struct iwn_softc *sc = ic->ic_ifp->if_softc; + int i; + + for (i = 0; i < nchan; i++) { + struct ieee80211_channel *c = &chans[i]; + struct iwn_eeprom_chan *channel; + + channel = iwn_find_eeprom_channel(sc, c); + if (channel == NULL) { + if_printf(ic->ic_ifp, + "%s: invalid channel %u freq %u/0x%x\n", + __func__, c->ic_ieee, c->ic_freq, c->ic_flags); + return EINVAL; + } + c->ic_flags |= iwn_eeprom_channel_flags(channel); + } + + return 0; +} + #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) static void @@ -1929,7 +2077,9 @@ iwn_newassoc(struct ieee80211_node *ni, static int iwn_media_change(struct ifnet *ifp) { - int error = ieee80211_media_change(ifp); + int error; *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:03:30 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 84CDA1065676; Sat, 18 Jun 2011 12:03:30 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 728098FC14; Sat, 18 Jun 2011 12:03:30 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IC3U5N040050; Sat, 18 Jun 2011 12:03:30 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IC3UqF040047; Sat, 18 Jun 2011 12:03:30 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181203.p5IC3UqF040047@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:03:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223249 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:03:30 -0000 Author: bschmidt Date: Sat Jun 18 12:03:30 2011 New Revision: 223249 URL: http://svn.freebsd.org/changeset/base/223249 Log: MFC r220727-220728: - Read RX/TX chainmasks directly of the EEPROM. Some chips are known to have the wrong/broken information stored, keep the hardcoded values for those. - Bring over the HAL/OPS changes, instead of two const structs it is now slightly more dynamic. Obtained from: OpenBSD Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:00:49 2011 (r223248) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:03:30 2011 (r223249) @@ -115,7 +115,8 @@ static const struct iwn_ident iwn_ident_ static int iwn_probe(device_t); static int iwn_attach(device_t); -static const struct iwn_hal *iwn_hal_attach(struct iwn_softc *); +static int iwn4965_attach(struct iwn_softc *, uint16_t); +static int iwn5000_attach(struct iwn_softc *, uint16_t); static void iwn_radiotap_attach(struct iwn_softc *); static void iwn_sysctlattach(struct iwn_softc *); static struct ieee80211vap *iwn_vap_create(struct ieee80211com *, @@ -410,62 +411,6 @@ MODULE_DEPEND(iwn, firmware, 1, 1, 1); MODULE_DEPEND(iwn, pci, 1, 1, 1); MODULE_DEPEND(iwn, wlan, 1, 1, 1); -static const struct iwn_hal iwn4965_hal = { - iwn4965_load_firmware, - iwn4965_read_eeprom, - iwn4965_post_alive, - iwn4965_nic_config, - iwn4965_update_sched, - iwn4965_get_temperature, - iwn4965_get_rssi, - iwn4965_set_txpower, - iwn4965_init_gains, - iwn4965_set_gains, - iwn4965_add_node, - iwn4965_tx_done, -#if 0 /* HT */ - iwn4965_ampdu_tx_start, - iwn4965_ampdu_tx_stop, -#endif - IWN4965_NTXQUEUES, - IWN4965_NDMACHNLS, - IWN4965_ID_BROADCAST, - IWN4965_RXONSZ, - IWN4965_SCHEDSZ, - IWN4965_FW_TEXT_MAXSZ, - IWN4965_FW_DATA_MAXSZ, - IWN4965_FWSZ, - IWN4965_SCHED_TXFACT -}; - -static const struct iwn_hal iwn5000_hal = { - iwn5000_load_firmware, - iwn5000_read_eeprom, - iwn5000_post_alive, - iwn5000_nic_config, - iwn5000_update_sched, - iwn5000_get_temperature, - iwn5000_get_rssi, - iwn5000_set_txpower, - iwn5000_init_gains, - iwn5000_set_gains, - iwn5000_add_node, - iwn5000_tx_done, -#if 0 /* HT */ - iwn5000_ampdu_tx_start, - iwn5000_ampdu_tx_stop, -#endif - IWN5000_NTXQUEUES, - IWN5000_NDMACHNLS, - IWN5000_ID_BROADCAST, - IWN5000_RXONSZ, - IWN5000_SCHEDSZ, - IWN5000_FW_TEXT_MAXSZ, - IWN5000_FW_DATA_MAXSZ, - IWN5000_FWSZ, - IWN5000_SCHED_TXFACT -}; - static int iwn_probe(device_t dev) { @@ -487,7 +432,6 @@ iwn_attach(device_t dev) struct iwn_softc *sc = (struct iwn_softc *)device_get_softc(dev); struct ieee80211com *ic; struct ifnet *ifp; - const struct iwn_hal *hal; uint32_t reg; int i, error, result; uint8_t macaddr[IEEE80211_ADDR_LEN]; @@ -545,10 +489,15 @@ iwn_attach(device_t dev) IWN_LOCK_INIT(sc); - /* Attach Hardware Abstraction Layer. */ - hal = iwn_hal_attach(sc); - if (hal == NULL) { - error = ENXIO; /* XXX: Wrong error code? */ + /* Read hardware revision and attach. */ + sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> 4) & 0xf; + if (sc->hw_type == IWN_HW_REV_TYPE_4965) + error = iwn4965_attach(sc, pci_get_device(dev)); + else + error = iwn5000_attach(sc, pci_get_device(dev)); + if (error != 0) { + device_printf(dev, "could not attach device, error %d\n", + error); goto fail; } @@ -588,7 +537,7 @@ iwn_attach(device_t dev) } /* Allocate TX rings (16 on 4965AGN, 20 on >=5000). */ - for (i = 0; i < hal->ntxqs; i++) { + for (i = 0; i < sc->ntxqs; i++) { if ((error = iwn_alloc_tx_ring(sc, &sc->txq[i], i)) != 0) { device_printf(dev, "could not allocate TX ring %d, error %d\n", i, @@ -754,85 +703,121 @@ fail: return error; } -static const struct iwn_hal * -iwn_hal_attach(struct iwn_softc *sc) +static int +iwn4965_attach(struct iwn_softc *sc, uint16_t pid) { - sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> 4) & 0xf; + struct iwn_ops *ops = &sc->ops; + + ops->load_firmware = iwn4965_load_firmware; + ops->read_eeprom = iwn4965_read_eeprom; + ops->post_alive = iwn4965_post_alive; + ops->nic_config = iwn4965_nic_config; + ops->update_sched = iwn4965_update_sched; + ops->get_temperature = iwn4965_get_temperature; + ops->get_rssi = iwn4965_get_rssi; + ops->set_txpower = iwn4965_set_txpower; + ops->init_gains = iwn4965_init_gains; + ops->set_gains = iwn4965_set_gains; + ops->add_node = iwn4965_add_node; + ops->tx_done = iwn4965_tx_done; +#if 0 /* HT */ + ops->ampdu_tx_start = iwn4965_ampdu_tx_start; + ops->ampdu_tx_stop = iwn4965_ampdu_tx_stop; +#endif + sc->ntxqs = IWN4965_NTXQUEUES; + sc->ndmachnls = IWN4965_NDMACHNLS; + sc->broadcast_id = IWN4965_ID_BROADCAST; + sc->rxonsz = IWN4965_RXONSZ; + sc->schedsz = IWN4965_SCHEDSZ; + sc->fw_text_maxsz = IWN4965_FW_TEXT_MAXSZ; + sc->fw_data_maxsz = IWN4965_FW_DATA_MAXSZ; + sc->fwsz = IWN4965_FWSZ; + sc->sched_txfact_addr = IWN4965_SCHED_TXFACT; + sc->limits = &iwn4965_sensitivity_limits; + sc->fwname = "iwn4965fw"; + /* Override chains masks, ROM is known to be broken. */ + sc->txchainmask = IWN_ANT_AB; + sc->rxchainmask = IWN_ANT_ABC; + + return 0; +} + +static int +iwn5000_attach(struct iwn_softc *sc, uint16_t pid) +{ + struct iwn_ops *ops = &sc->ops; + + ops->load_firmware = iwn5000_load_firmware; + ops->read_eeprom = iwn5000_read_eeprom; + ops->post_alive = iwn5000_post_alive; + ops->nic_config = iwn5000_nic_config; + ops->update_sched = iwn5000_update_sched; + ops->get_temperature = iwn5000_get_temperature; + ops->get_rssi = iwn5000_get_rssi; + ops->set_txpower = iwn5000_set_txpower; + ops->init_gains = iwn5000_init_gains; + ops->set_gains = iwn5000_set_gains; + ops->add_node = iwn5000_add_node; + ops->tx_done = iwn5000_tx_done; +#if 0 /* HT */ + ops->ampdu_tx_start = iwn5000_ampdu_tx_start; + ops->ampdu_tx_stop = iwn5000_ampdu_tx_stop; +#endif + sc->ntxqs = IWN5000_NTXQUEUES; + sc->ndmachnls = IWN5000_NDMACHNLS; + sc->broadcast_id = IWN5000_ID_BROADCAST; + sc->rxonsz = IWN5000_RXONSZ; + sc->schedsz = IWN5000_SCHEDSZ; + sc->fw_text_maxsz = IWN5000_FW_TEXT_MAXSZ; + sc->fw_data_maxsz = IWN5000_FW_DATA_MAXSZ; + sc->fwsz = IWN5000_FWSZ; + sc->sched_txfact_addr = IWN5000_SCHED_TXFACT; switch (sc->hw_type) { - case IWN_HW_REV_TYPE_4965: - sc->sc_hal = &iwn4965_hal; - sc->limits = &iwn4965_sensitivity_limits; - sc->fwname = "iwn4965fw"; - sc->txchainmask = IWN_ANT_AB; - sc->rxchainmask = IWN_ANT_ABC; - break; case IWN_HW_REV_TYPE_5100: - sc->sc_hal = &iwn5000_hal; sc->limits = &iwn5000_sensitivity_limits; sc->fwname = "iwn5000fw"; + /* Override chains masks, ROM is known to be broken. */ sc->txchainmask = IWN_ANT_B; sc->rxchainmask = IWN_ANT_AB; break; case IWN_HW_REV_TYPE_5150: - sc->sc_hal = &iwn5000_hal; sc->limits = &iwn5150_sensitivity_limits; sc->fwname = "iwn5150fw"; - sc->txchainmask = IWN_ANT_A; - sc->rxchainmask = IWN_ANT_AB; break; case IWN_HW_REV_TYPE_5300: case IWN_HW_REV_TYPE_5350: - sc->sc_hal = &iwn5000_hal; sc->limits = &iwn5000_sensitivity_limits; sc->fwname = "iwn5000fw"; - sc->txchainmask = IWN_ANT_ABC; - sc->rxchainmask = IWN_ANT_ABC; break; case IWN_HW_REV_TYPE_1000: - sc->sc_hal = &iwn5000_hal; sc->limits = &iwn1000_sensitivity_limits; sc->fwname = "iwn1000fw"; - sc->txchainmask = IWN_ANT_A; - sc->rxchainmask = IWN_ANT_AB; break; case IWN_HW_REV_TYPE_6000: - sc->sc_hal = &iwn5000_hal; sc->limits = &iwn6000_sensitivity_limits; sc->fwname = "iwn6000fw"; - switch (pci_get_device(sc->sc_dev)) { - case 0x422C: - case 0x4239: + if (pid == 0x422c || pid == 0x4239) { sc->sc_flags |= IWN_FLAG_INTERNAL_PA; + /* Override chains masks, ROM is known to be broken. */ sc->txchainmask = IWN_ANT_BC; sc->rxchainmask = IWN_ANT_BC; - break; - default: - sc->txchainmask = IWN_ANT_ABC; - sc->rxchainmask = IWN_ANT_ABC; - break; } break; case IWN_HW_REV_TYPE_6050: - sc->sc_hal = &iwn5000_hal; sc->limits = &iwn6000_sensitivity_limits; sc->fwname = "iwn6050fw"; - sc->txchainmask = IWN_ANT_AB; - sc->rxchainmask = IWN_ANT_AB; break; case IWN_HW_REV_TYPE_6005: - sc->sc_hal = &iwn5000_hal; sc->limits = &iwn6000_sensitivity_limits; sc->fwname = "iwn6005fw"; - sc->txchainmask = IWN_ANT_AB; - sc->rxchainmask = IWN_ANT_AB; break; default: device_printf(sc->sc_dev, "adapter type %d not supported\n", sc->hw_type); - return NULL; + return ENOTSUP; } - return sc->sc_hal; + return 0; } /* @@ -934,9 +919,8 @@ iwn_detach(device_t dev) /* Free DMA resources. */ iwn_free_rx_ring(sc, &sc->rxq); - if (sc->sc_hal != NULL) - for (qid = 0; qid < sc->sc_hal->ntxqs; qid++) - iwn_free_tx_ring(sc, &sc->txq[qid]); + for (qid = 0; qid < sc->ntxqs; qid++) + iwn_free_tx_ring(sc, &sc->txq[qid]); iwn_free_sched(sc); iwn_free_kw(sc); if (sc->ict != NULL) @@ -1298,7 +1282,7 @@ iwn_alloc_sched(struct iwn_softc *sc) { /* TX scheduler rings must be aligned on a 1KB boundary. */ return iwn_dma_contig_alloc(sc, &sc->sched_dma, (void **)&sc->sched, - sc->sc_hal->schedsz, 1024); + sc->schedsz, 1024); } static void @@ -1338,8 +1322,7 @@ static int iwn_alloc_fwmem(struct iwn_softc *sc) { /* Must be aligned on a 16-byte boundary. */ - return iwn_dma_contig_alloc(sc, &sc->fw_dma, NULL, sc->sc_hal->fwsz, - 16); + return iwn_dma_contig_alloc(sc, &sc->fw_dma, NULL, sc->fwsz, 16); } static void @@ -1633,7 +1616,7 @@ iwn5000_ict_reset(struct iwn_softc *sc) static int iwn_read_eeprom(struct iwn_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN]) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; uint16_t val; int error; @@ -1673,12 +1656,17 @@ iwn_read_eeprom(struct iwn_softc *sc, ui iwn_read_prom_data(sc, IWN_EEPROM_RFCFG, &val, 2); sc->rfcfg = le16toh(val); DPRINTF(sc, IWN_DEBUG_RESET, "radio config=0x%04x\n", sc->rfcfg); + /* Read Tx/Rx chains from ROM unless it's known to be broken. */ + if (sc->txchainmask == 0) + sc->txchainmask = IWN_RFCFG_TXANTMSK(sc->rfcfg); + if (sc->rxchainmask == 0) + sc->rxchainmask = IWN_RFCFG_RXANTMSK(sc->rfcfg); /* Read MAC address. */ iwn_read_prom_data(sc, IWN_EEPROM_MAC, macaddr, 6); /* Read adapter-specific information from EEPROM. */ - hal->read_eeprom(sc); + ops->read_eeprom(sc); iwn_apm_stop(sc); /* Power OFF adapter. */ @@ -2203,7 +2191,7 @@ static void iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct iwn_rx_ring *ring = &sc->rxq; @@ -2311,7 +2299,7 @@ iwn_rx_done(struct iwn_softc *sc, struct nf = (ni != NULL && ni->ni_vap->iv_state == IEEE80211_S_RUN && (ic->ic_flags & IEEE80211_F_SCAN) == 0) ? sc->noise : -95; - rssi = hal->get_rssi(sc, stat); + rssi = ops->get_rssi(sc, stat); if (ieee80211_radiotap_active(ic)) { struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap; @@ -2436,7 +2424,7 @@ static void iwn_rx_statistics(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); @@ -2459,7 +2447,7 @@ iwn_rx_statistics(struct iwn_softc *sc, if (stats->general.temp != sc->rawtemp) { /* Convert "raw" temperature to degC. */ sc->rawtemp = stats->general.temp; - temp = hal->get_temperature(sc); + temp = ops->get_temperature(sc); DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: temperature %d\n", __func__, temp); @@ -2634,6 +2622,7 @@ iwn_cmd_done(struct iwn_softc *sc, struc static void iwn_notif_intr(struct iwn_softc *sc) { + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); @@ -2680,7 +2669,7 @@ iwn_notif_intr(struct iwn_softc *sc) case IWN_TX_DONE: /* An 802.11 frame has been transmitted. */ - sc->sc_hal->tx_done(sc, desc, data); + ops->tx_done(sc, desc, data); break; case IWN_RX_STATISTICS: @@ -2818,7 +2807,7 @@ iwn_wakeup_intr(struct iwn_softc *sc) /* Wakeup RX and TX rings. */ IWN_WRITE(sc, IWN_FH_RX_WPTR, sc->rxq.cur & ~7); - for (qid = 0; qid < sc->sc_hal->ntxqs; qid++) { + for (qid = 0; qid < sc->ntxqs; qid++) { struct iwn_tx_ring *ring = &sc->txq[qid]; IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | ring->cur); } @@ -2849,7 +2838,6 @@ iwn_rftoggle_intr(struct iwn_softc *sc) static void iwn_fatal_intr(struct iwn_softc *sc) { - const struct iwn_hal *hal = sc->sc_hal; struct iwn_fw_dump dump; int i; @@ -2861,7 +2849,7 @@ iwn_fatal_intr(struct iwn_softc *sc) /* Check that the error log address is valid. */ if (sc->errptr < IWN_FW_DATA_BASE || sc->errptr + sizeof (dump) > - IWN_FW_DATA_BASE + hal->fw_data_maxsz) { + IWN_FW_DATA_BASE + sc->fw_data_maxsz) { printf("%s: bad firmware error log address 0x%08x\n", __func__, sc->errptr); return; @@ -2896,7 +2884,7 @@ iwn_fatal_intr(struct iwn_softc *sc) /* Dump driver status (TX and RX rings) while we're here. */ printf("driver status:\n"); - for (i = 0; i < hal->ntxqs; i++) { + for (i = 0; i < sc->ntxqs; i++) { struct iwn_tx_ring *ring = &sc->txq[i]; printf(" tx ring %2d: qid=%-2d cur=%-3d queued=%-3d\n", i, ring->qid, ring->cur, ring->queued); @@ -3069,7 +3057,6 @@ iwn_plcp_signal(int rate) { static int iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) { - const struct iwn_hal *hal = sc->sc_hal; const struct ieee80211_txparam *tp; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ni->ni_ic; @@ -3200,7 +3187,7 @@ iwn_tx_data(struct iwn_softc *sc, struct if (IEEE80211_IS_MULTICAST(wh->i_addr1) || type != IEEE80211_FC0_TYPE_DATA) - tx->id = hal->broadcast_id; + tx->id = sc->broadcast_id; else tx->id = wn->id; @@ -3232,7 +3219,7 @@ iwn_tx_data(struct iwn_softc *sc, struct tx->lifetime = htole32(IWN_LIFETIME_INFINITE); tx->plcp = rinfo->plcp; tx->rflags = rinfo->flags; - if (tx->id == hal->broadcast_id) { + if (tx->id == sc->broadcast_id) { /* Group or management frame. */ tx->linkq = 0; /* XXX Alternate between antenna A and B? */ @@ -3314,7 +3301,7 @@ iwn_tx_data(struct iwn_softc *sc, struct #ifdef notyet /* Update TX scheduler. */ - hal->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); + ops->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); #endif /* Kick TX ring. */ @@ -3332,7 +3319,6 @@ static int iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni, const struct ieee80211_bpf_params *params) { - const struct iwn_hal *hal = sc->sc_hal; const struct iwn_rate *rinfo; struct ifnet *ifp = sc->sc_ifp; struct ieee80211vap *vap = ni->ni_vap; @@ -3437,7 +3423,7 @@ iwn_tx_data_raw(struct iwn_softc *sc, st tx->len = htole16(totlen); tx->tid = 0; - tx->id = hal->broadcast_id; + tx->id = sc->broadcast_id; tx->rts_ntries = params->ibp_try1; tx->data_ntries = params->ibp_try0; tx->lifetime = htole32(IWN_LIFETIME_INFINITE); @@ -3519,7 +3505,7 @@ iwn_tx_data_raw(struct iwn_softc *sc, st #ifdef notyet /* Update TX scheduler. */ - hal->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); + ops->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); #endif /* Kick TX ring. */ @@ -3744,7 +3730,7 @@ iwn_cmd(struct iwn_softc *sc, int code, #ifdef notyet /* Update TX scheduler. */ - sc->sc_hal->update_sched(sc, ring->qid, ring->cur, 0, 0); + ops->update_sched(sc, ring->qid, ring->cur, 0, 0); #endif /* Kick command ring. */ @@ -3821,7 +3807,7 @@ iwn_set_link_quality(struct iwn_softc *s static int iwn_add_broadcast_node(struct iwn_softc *sc, int async) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct iwn_node_info node; @@ -3832,16 +3818,16 @@ iwn_add_broadcast_node(struct iwn_softc memset(&node, 0, sizeof node); IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr); - node.id = hal->broadcast_id; + node.id = sc->broadcast_id; DPRINTF(sc, IWN_DEBUG_RESET, "%s: adding broadcast node\n", __func__); - if ((error = hal->add_node(sc, &node, async)) != 0) + if ((error = ops->add_node(sc, &node, async)) != 0) return error; /* Use the first valid TX antenna. */ txant = IWN_LSB(sc->txchainmask); memset(&linkq, 0, sizeof linkq); - linkq.id = sc->sc_hal->broadcast_id; + linkq.id = sc->broadcast_id; linkq.antmsk_1stream = txant; linkq.antmsk_2stream = IWN_ANT_AB; linkq.ampdu_max = 64; @@ -4266,7 +4252,7 @@ iwn5000_get_temperature(struct iwn_softc static int iwn_init_sensitivity(struct iwn_softc *sc) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct iwn_calib_state *calib = &sc->calib; uint32_t flags; int error; @@ -4289,7 +4275,7 @@ iwn_init_sensitivity(struct iwn_softc *s return error; /* Write initial gains. */ - if ((error = hal->init_gains(sc)) != 0) + if ((error = ops->init_gains(sc)) != 0) return error; /* Request statistics at each beacon interval. */ @@ -4308,7 +4294,7 @@ static void iwn_collect_noise(struct iwn_softc *sc, const struct iwn_rx_general_stats *stats) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct iwn_calib_state *calib = &sc->calib; uint32_t val; int i; @@ -4339,13 +4325,13 @@ iwn_collect_noise(struct iwn_softc *sc, if ((sc->chainmask & sc->txchainmask) == 0) sc->chainmask |= IWN_LSB(sc->txchainmask); - (void)hal->set_gains(sc); + (void)ops->set_gains(sc); calib->state = IWN_CALIB_STATE_RUN; #ifdef notyet /* XXX Disable RX chains with no antennas connected. */ sc->rxon.rxchain = htole16(IWN_RXCHAIN_SEL(sc->chainmask)); - (void)iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1); + (void)iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1); #endif #if 0 @@ -4708,7 +4694,7 @@ iwn_send_btcoex(struct iwn_softc *sc) static int iwn_config(struct iwn_softc *sc) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; uint32_t txmask; @@ -4782,7 +4768,7 @@ iwn_config(struct iwn_softc *sc) IWN_RXCHAIN_IDLE_COUNT(2); sc->rxon.rxchain = htole16(rxchain); DPRINTF(sc, IWN_DEBUG_RESET, "%s: setting configuration\n", __func__); - error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 0); + error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 0); if (error != 0) { device_printf(sc->sc_dev, "%s: RXON command failed\n", __func__); @@ -4796,7 +4782,7 @@ iwn_config(struct iwn_softc *sc) } /* Configuration has changed, set TX power accordingly. */ - if ((error = hal->set_txpower(sc, ic->ic_curchan, 0)) != 0) { + if ((error = ops->set_txpower(sc, ic->ic_curchan, 0)) != 0) { device_printf(sc->sc_dev, "%s: could not set TX power\n", __func__); return error; @@ -4878,7 +4864,7 @@ iwn_scan(struct iwn_softc *sc) tx = (struct iwn_cmd_data *)(hdr + 1); tx->flags = htole32(IWN_TX_AUTO_SEQ); - tx->id = sc->sc_hal->broadcast_id; + tx->id = sc->broadcast_id; tx->lifetime = htole32(IWN_LIFETIME_INFINITE); if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) { @@ -4986,7 +4972,7 @@ iwn_scan(struct iwn_softc *sc) static int iwn_auth(struct iwn_softc *sc, struct ieee80211vap *vap) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_node *ni = vap->iv_bss; @@ -5016,7 +5002,7 @@ iwn_auth(struct iwn_softc *sc, struct ie DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n", sc->rxon.chan, sc->rxon.flags, sc->rxon.cck_mask, sc->rxon.ofdm_mask); - error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1); + error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: RXON command failed, error %d\n", __func__, error); @@ -5024,7 +5010,7 @@ iwn_auth(struct iwn_softc *sc, struct ie } /* Configuration has changed, set TX power accordingly. */ - if ((error = hal->set_txpower(sc, ni->ni_chan, 1)) != 0) { + if ((error = ops->set_txpower(sc, ni->ni_chan, 1)) != 0) { device_printf(sc->sc_dev, "%s: could not set TX power, error %d\n", __func__, error); return error; @@ -5046,7 +5032,7 @@ static int iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) { #define MS(v,x) (((v) & x) >> x##_S) - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_node *ni = vap->iv_bss; @@ -5109,7 +5095,7 @@ iwn_run(struct iwn_softc *sc, struct iee sc->rxon.filter |= htole32(IWN_FILTER_BSS); DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n", sc->rxon.chan, sc->rxon.flags); - error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1); + error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not update configuration, error %d\n", __func__, @@ -5118,7 +5104,7 @@ iwn_run(struct iwn_softc *sc, struct iee } /* Configuration has changed, set TX power accordingly. */ - if ((error = hal->set_txpower(sc, ni->ni_chan, 1)) != 0) { + if ((error = ops->set_txpower(sc, ni->ni_chan, 1)) != 0) { device_printf(sc->sc_dev, "%s: could not set TX power, error %d\n", __func__, error); return error; @@ -5137,7 +5123,7 @@ iwn_run(struct iwn_softc *sc, struct iee IWN_AMDPU_DENSITY(5)); /* 2us */ #endif DPRINTF(sc, IWN_DEBUG_STATE, "%s: adding BSS node\n", __func__); - error = hal->add_node(sc, &node, 1); + error = ops->add_node(sc, &node, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not add BSS node, error %d\n", __func__, error); @@ -5181,6 +5167,7 @@ iwn_ampdu_rx_start(struct ieee80211com * { struct ieee80211_rx_ba *ba = &ni->ni_rx_ba[tid]; struct iwn_softc *sc = ic->ic_softc; + struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; @@ -5192,7 +5179,7 @@ iwn_ampdu_rx_start(struct ieee80211com * node.addba_ssn = htole16(ba->ba_winstart); DPRINTF(sc, IWN_DEBUG_RECV, "ADDBA RA=%d TID=%d SSN=%d\n", wn->id, tid, ba->ba_winstart); - return sc->sc_hal->add_node(sc, &node, 1); + return ops->add_node(sc, &node, 1); } /* @@ -5204,6 +5191,7 @@ iwn_ampdu_rx_stop(struct ieee80211com *i uint8_t tid) { struct iwn_softc *sc = ic->ic_softc; + struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; @@ -5213,7 +5201,7 @@ iwn_ampdu_rx_stop(struct ieee80211com *i node.flags = IWN_FLAG_SET_DELBA; node.delba_tid = tid; DPRINTF(sc, IWN_DEBUG_RECV, "DELBA RA=%d TID=%d\n", wn->id, tid); - (void)sc->sc_hal->add_node(sc, &node, 1); + (void)ops->add_node(sc, &node, 1); } /* @@ -5226,7 +5214,7 @@ iwn_ampdu_tx_start(struct ieee80211com * { struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; struct iwn_softc *sc = ic->ic_softc; - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; int error; @@ -5238,13 +5226,13 @@ iwn_ampdu_tx_start(struct ieee80211com * node.control = IWN_NODE_UPDATE; node.flags = IWN_FLAG_SET_DISABLE_TID; node.disable_tid = htole16(wn->disable_tid); - error = hal->add_node(sc, &node, 1); + error = ops->add_node(sc, &node, 1); if (error != 0) return error; if ((error = iwn_nic_lock(sc)) != 0) return error; - hal->ampdu_tx_start(sc, ni, tid, ba->ba_winstart); + ops->ampdu_tx_start(sc, ni, tid, ba->ba_winstart); iwn_nic_unlock(sc); return 0; } @@ -5255,10 +5243,11 @@ iwn_ampdu_tx_stop(struct ieee80211com *i { struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; struct iwn_softc *sc = ic->ic_softc; + struct iwn_ops *ops = &sc->ops; if (iwn_nic_lock(sc) != 0) return; - sc->sc_hal->ampdu_tx_stop(sc, tid, ba->ba_winstart); + ops->ampdu_tx_stop(sc, tid, ba->ba_winstart); iwn_nic_unlock(sc); } @@ -5968,7 +5957,6 @@ iwn_read_firmware_tlv(struct iwn_softc * static int iwn_read_firmware(struct iwn_softc *sc) { - const struct iwn_hal *hal = sc->sc_hal; struct iwn_fw_info *fw = &sc->fw; int error; @@ -6011,10 +5999,10 @@ iwn_read_firmware(struct iwn_softc *sc) } /* Make sure text and data sections fit in hardware memory. */ - if (fw->main.textsz > hal->fw_text_maxsz || - fw->main.datasz > hal->fw_data_maxsz || - fw->init.textsz > hal->fw_text_maxsz || - fw->init.datasz > hal->fw_data_maxsz || + if (fw->main.textsz > sc->fw_text_maxsz || + fw->main.datasz > sc->fw_data_maxsz || + fw->init.textsz > sc->fw_text_maxsz || + fw->init.datasz > sc->fw_data_maxsz || fw->boot.textsz > IWN_FW_BOOT_TEXT_MAXSZ || (fw->boot.textsz & 3) != 0) { device_printf(sc->sc_dev, "%s: firmware sections too large\n", @@ -6232,7 +6220,7 @@ iwn_hw_prepare(struct iwn_softc *sc) static int iwn_hw_init(struct iwn_softc *sc) { - const struct iwn_hal *hal = sc->sc_hal; + struct iwn_ops *ops = &sc->ops; int error, chnl, qid; /* Clear pending interrupts. */ @@ -6252,7 +6240,7 @@ iwn_hw_init(struct iwn_softc *sc) iwn_nic_unlock(sc); /* Perform adapter-specific initialization. */ - if ((error = hal->nic_config(sc)) != 0) + if ((error = ops->nic_config(sc)) != 0) return error; /* Initialize RX ring. */ @@ -6279,13 +6267,13 @@ iwn_hw_init(struct iwn_softc *sc) return error; /* Initialize TX scheduler. */ - iwn_prph_write(sc, hal->sched_txfact_addr, 0); + iwn_prph_write(sc, sc->sched_txfact_addr, 0); /* Set physical address of "keep warm" page (16-byte aligned). */ IWN_WRITE(sc, IWN_FH_KW_ADDR, sc->kw_dma.paddr >> 4); /* Initialize TX rings. */ - for (qid = 0; qid < hal->ntxqs; qid++) { + for (qid = 0; qid < sc->ntxqs; qid++) { struct iwn_tx_ring *txq = &sc->txq[qid]; /* Set physical address of TX ring (256-byte aligned). */ @@ -6295,7 +6283,7 @@ iwn_hw_init(struct iwn_softc *sc) iwn_nic_unlock(sc); /* Enable DMA channels. */ - for (chnl = 0; chnl < hal->ndmachnls; chnl++) { + for (chnl = 0; chnl < sc->ndmachnls; chnl++) { IWN_WRITE(sc, IWN_FH_TX_CONFIG(chnl), IWN_FH_TX_CONFIG_DMA_ENA | IWN_FH_TX_CONFIG_DMA_CREDIT_ENA); @@ -6316,7 +6304,7 @@ iwn_hw_init(struct iwn_softc *sc) IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL); IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL); - if ((error = hal->load_firmware(sc)) != 0) { + if ((error = ops->load_firmware(sc)) != 0) { device_printf(sc->sc_dev, "%s: could not load firmware, error %d\n", __func__, error); @@ -6330,13 +6318,12 @@ iwn_hw_init(struct iwn_softc *sc) return error; } /* Do post-firmware initialization. */ - return hal->post_alive(sc); + return ops->post_alive(sc); } static void iwn_hw_stop(struct iwn_softc *sc) { - const struct iwn_hal *hal = sc->sc_hal; int chnl, qid, ntries; IWN_WRITE(sc, IWN_RESET, IWN_RESET_NEVO); @@ -6351,11 +6338,11 @@ iwn_hw_stop(struct iwn_softc *sc) iwn_nic_unlock(sc); /* Stop TX scheduler. */ - iwn_prph_write(sc, hal->sched_txfact_addr, 0); + iwn_prph_write(sc, sc->sched_txfact_addr, 0); /* Stop all DMA channels. */ if (iwn_nic_lock(sc) == 0) { - for (chnl = 0; chnl < hal->ndmachnls; chnl++) { + for (chnl = 0; chnl < sc->ndmachnls; chnl++) { IWN_WRITE(sc, IWN_FH_TX_CONFIG(chnl), 0); for (ntries = 0; ntries < 200; ntries++) { if (IWN_READ(sc, IWN_FH_TX_STATUS) & @@ -6371,7 +6358,7 @@ iwn_hw_stop(struct iwn_softc *sc) iwn_reset_rx_ring(sc, &sc->rxq); /* Reset all TX rings. */ - for (qid = 0; qid < hal->ntxqs; qid++) + for (qid = 0; qid < sc->ntxqs; qid++) iwn_reset_tx_ring(sc, &sc->txq[qid]); if (iwn_nic_lock(sc) == 0) { Modified: stable/8/sys/dev/iwn/if_iwnvar.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:00:49 2011 (r223248) +++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:03:30 2011 (r223249) @@ -157,7 +157,7 @@ struct iwn_fw_info { struct iwn_fw_part boot; }; -struct iwn_hal { +struct iwn_ops { int (*load_firmware)(struct iwn_softc *); void (*read_eeprom)(struct iwn_softc *); int (*post_alive)(struct iwn_softc *); @@ -180,15 +180,6 @@ struct iwn_hal { void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t, uint16_t); #endif - int ntxqs; - int ndmachnls; - uint8_t broadcast_id; - int rxonsz; - int schedsz; - uint32_t fw_text_maxsz; - uint32_t fw_data_maxsz; - uint32_t fwsz; - bus_size_t sched_txfact_addr; }; struct iwn_vap { @@ -215,10 +206,20 @@ struct iwn_softc { #define IWN_FLAG_INTERNAL_PA (1 << 4) uint8_t hw_type; - const struct iwn_hal *sc_hal; + + struct iwn_ops ops; const char *fwname; const struct iwn_sensitivity_limits *limits; + int ntxqs; + int ndmachnls; + uint8_t broadcast_id; + int rxonsz; + int schedsz; + uint32_t fw_text_maxsz; + uint32_t fw_data_maxsz; + uint32_t fwsz; + bus_size_t sched_txfact_addr; /* TX scheduler rings. */ struct iwn_dma_info sched_dma; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:07:07 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 046AF106566B; Sat, 18 Jun 2011 12:07:07 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E6B108FC14; Sat, 18 Jun 2011 12:07:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IC767m040204; Sat, 18 Jun 2011 12:07:06 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IC762X040200; Sat, 18 Jun 2011 12:07:06 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181207.p5IC762X040200@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:07:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223250 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:07:07 -0000 Author: bschmidt Date: Sat Jun 18 12:07:06 2011 New Revision: 223250 URL: http://svn.freebsd.org/changeset/base/223250 Log: MFC r220729: Add some new features: - 6000 series devices need enhanced sensitivity calibration. - 6000 series devices need a different setting for the shadow reg. - set the IWN_FLAG_HAS_11N bit if the EEPROM says the device has 11n support. Obtained from: OpenBSD Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:03:30 2011 (r223249) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:07:06 2011 (r223250) @@ -1653,6 +1653,12 @@ iwn_read_eeprom(struct iwn_softc *sc, ui } } + iwn_read_prom_data(sc, IWN_EEPROM_SKU_CAP, &val, 2); + DPRINTF(sc, IWN_DEBUG_RESET, "SKU capabilities=0x%04x\n", le16toh(val)); + /* Check if HT support is bonded out. */ + if (val & htole16(IWN_EEPROM_SKU_CAP_11N)) + sc->sc_flags |= IWN_FLAG_HAS_11N; + iwn_read_prom_data(sc, IWN_EEPROM_RFCFG, &val, 2); sc->rfcfg = le16toh(val); DPRINTF(sc, IWN_DEBUG_RESET, "radio config=0x%04x\n", sc->rfcfg); @@ -4595,9 +4601,11 @@ static int iwn_send_sensitivity(struct iwn_softc *sc) { struct iwn_calib_state *calib = &sc->calib; - struct iwn_sensitivity_cmd cmd; + struct iwn_enhanced_sensitivity_cmd cmd; + int len; memset(&cmd, 0, sizeof cmd); + len = sizeof (struct iwn_sensitivity_cmd); cmd.which = IWN_SENSITIVITY_WORKTBL; /* OFDM modulation. */ cmd.corr_ofdm_x1 = htole16(calib->ofdm_x1); @@ -4619,7 +4627,21 @@ iwn_send_sensitivity(struct iwn_softc *s calib->ofdm_x1, calib->ofdm_mrc_x1, calib->ofdm_x4, calib->ofdm_mrc_x4, calib->cck_x4, calib->cck_mrc_x4, calib->energy_cck); - return iwn_cmd(sc, IWN_CMD_SET_SENSITIVITY, &cmd, sizeof cmd, 1); + + if (!(sc->sc_flags & IWN_FLAG_ENH_SENS)) + goto send; + /* Enhanced sensitivity settings. */ + len = sizeof (struct iwn_enhanced_sensitivity_cmd); + cmd.ofdm_det_slope_mrc = htole16(668); + cmd.ofdm_det_icept_mrc = htole16(4); + cmd.ofdm_det_slope = htole16(486); + cmd.ofdm_det_icept = htole16(37); + cmd.cck_det_slope_mrc = htole16(853); + cmd.cck_det_icept_mrc = htole16(4); + cmd.cck_det_slope = htole16(476); + cmd.cck_det_icept = htole16(99); +send: + return iwn_cmd(sc, IWN_CMD_SET_SENSITIVITY, &cmd, len, 1); } /* @@ -6175,6 +6197,8 @@ iwn5000_nic_config(struct iwn_softc *sc) /* Indicate that ROM calibration version is >=6. */ IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_CALIB_VER6); } + if (sc->hw_type == IWN_HW_REV_TYPE_6005) + IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_6050_1X2); return 0; } @@ -6304,6 +6328,10 @@ iwn_hw_init(struct iwn_softc *sc) IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL); IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL); + /* Enable shadow registers. */ + if (sc->hw_type >= IWN_HW_REV_TYPE_6000) + IWN_SETBITS(sc, IWN_SHADOW_REG_CTRL, 0x800fffff); + if ((error = ops->load_firmware(sc)) != 0) { device_printf(sc->sc_dev, "%s: could not load firmware, error %d\n", __func__, Modified: stable/8/sys/dev/iwn/if_iwnreg.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:03:30 2011 (r223249) +++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:07:06 2011 (r223250) @@ -70,6 +70,7 @@ #define IWN_UCODE_GP1_CLR 0x05c #define IWN_LED 0x094 #define IWN_DRAM_INT_TBL 0x0a0 +#define IWN_SHADOW_REG_CTRL 0x0a8 #define IWN_GIO_CHICKEN 0x100 #define IWN_ANA_PLL 0x20c #define IWN_HW_REV_WA 0x22c @@ -215,6 +216,7 @@ #define IWN_GP_DRIVER_RADIO_2X2_HYB (1 << 0) #define IWN_GP_DRIVER_RADIO_2X2_IPA (2 << 0) #define IWN_GP_DRIVER_CALIB_VER6 (1 << 2) +#define IWN_GP_DRIVER_6050_1X2 (1 << 3) /* Possible flags for register IWN_UCODE_GP1_CLR. */ #define IWN_UCODE_GP1_RFKILL (1 << 1) @@ -856,7 +858,7 @@ struct iwn_critical_temp { #define IWN_CTOMUK(c) (((c) * 1000000) + 273150000) } __packed; -/* Structure for command IWN_CMD_SET_SENSITIVITY. */ +/* Structures for command IWN_CMD_SET_SENSITIVITY. */ struct iwn_sensitivity_cmd { uint16_t which; #define IWN_SENSITIVITY_DEFAULTTBL 0 @@ -875,6 +877,34 @@ struct iwn_sensitivity_cmd { uint16_t energy_ofdm_th; } __packed; +struct iwn_enhanced_sensitivity_cmd { + uint16_t which; + uint16_t energy_cck; + uint16_t energy_ofdm; + uint16_t corr_ofdm_x1; + uint16_t corr_ofdm_mrc_x1; + uint16_t corr_cck_mrc_x4; + uint16_t corr_ofdm_x4; + uint16_t corr_ofdm_mrc_x4; + uint16_t corr_barker; + uint16_t corr_barker_mrc; + uint16_t corr_cck_x4; + uint16_t energy_ofdm_th; + /* "Enhanced" part. */ + uint16_t ina_det_ofdm; + uint16_t ina_det_cck; + uint16_t corr_11_9_en; + uint16_t ofdm_det_slope_mrc; + uint16_t ofdm_det_icept_mrc; + uint16_t ofdm_det_slope; + uint16_t ofdm_det_icept; + uint16_t cck_det_slope_mrc; + uint16_t cck_det_icept_mrc; + uint16_t cck_det_slope; + uint16_t cck_det_icept; + uint16_t reserved; +} __packed; + /* Structures for command IWN_CMD_PHY_CALIB. */ struct iwn_phy_calib { uint8_t code; @@ -1309,6 +1339,7 @@ struct iwn_fw_tlv { * Offsets into EEPROM. */ #define IWN_EEPROM_MAC 0x015 +#define IWN_EEPROM_SKU_CAP 0x045 #define IWN_EEPROM_RFCFG 0x048 #define IWN4965_EEPROM_DOMAIN 0x060 #define IWN4965_EEPROM_BAND1 0x063 @@ -1337,6 +1368,11 @@ struct iwn_fw_tlv { #define IWN5000_EEPROM_TEMP 0x12a #define IWN5000_EEPROM_VOLT 0x12b +/* Possible flags for IWN_EEPROM_SKU_CAP. */ +#define IWN_EEPROM_SKU_CAP_11N (1 << 6) +#define IWN_EEPROM_SKU_CAP_AMT (1 << 7) +#define IWN_EEPROM_SKU_CAP_IPAN (1 << 8) + /* Possible flags for IWN_EEPROM_RFCFG. */ #define IWN_RFCFG_TYPE(x) (((x) >> 0) & 0x3) #define IWN_RFCFG_STEP(x) (((x) >> 2) & 0x3) Modified: stable/8/sys/dev/iwn/if_iwnvar.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:03:30 2011 (r223249) +++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:07:06 2011 (r223250) @@ -204,6 +204,8 @@ struct iwn_softc { #define IWN_FLAG_CALIB_DONE (1 << 2) #define IWN_FLAG_USE_ICT (1 << 3) #define IWN_FLAG_INTERNAL_PA (1 << 4) +#define IWN_FLAG_HAS_11N (1 << 6) +#define IWN_FLAG_ENH_SENS (1 << 7) uint8_t hw_type; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:10:07 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 508381065670; Sat, 18 Jun 2011 12:10:07 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 394628FC12; Sat, 18 Jun 2011 12:10:07 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5ICA7sD040337; Sat, 18 Jun 2011 12:10:07 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5ICA7xZ040333; Sat, 18 Jun 2011 12:10:07 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181210.p5ICA7xZ040333@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:10:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223251 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:10:07 -0000 Author: bschmidt Date: Sat Jun 18 12:10:06 2011 New Revision: 223251 URL: http://svn.freebsd.org/changeset/base/223251 Log: MFC r220866-220867: - Pull some features out of the firmware: - If a ENH_SENS TLV section exit the firmware is capable of doing enhanced sensitivity calibration. - Newer devices/firmwares have more calibration commands therefore hardcoding the noise gain/reset commands no longer works. It is supposed to use the next index after the newest calibration type support. Read the command index of the TLV section if available. - Enable DC calibration for all 6000 series devices, except those with an internal PA. - Override the chainmask also for the 6050. Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:07:06 2011 (r223250) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:10:06 2011 (r223251) @@ -772,6 +772,8 @@ iwn5000_attach(struct iwn_softc *sc, uin sc->fw_data_maxsz = IWN5000_FW_DATA_MAXSZ; sc->fwsz = IWN5000_FWSZ; sc->sched_txfact_addr = IWN5000_SCHED_TXFACT; + sc->reset_noise_gain = IWN5000_PHY_CALIB_RESET_NOISE_GAIN; + sc->noise_gain = IWN5000_PHY_CALIB_NOISE_GAIN; switch (sc->hw_type) { case IWN_HW_REV_TYPE_5100: @@ -807,6 +809,9 @@ iwn5000_attach(struct iwn_softc *sc, uin case IWN_HW_REV_TYPE_6050: sc->limits = &iwn6000_sensitivity_limits; sc->fwname = "iwn6050fw"; + /* Override chains masks, ROM is known to be broken. */ + sc->txchainmask = IWN_ANT_AB; + sc->rxchainmask = IWN_ANT_AB; break; case IWN_HW_REV_TYPE_6005: sc->limits = &iwn6000_sensitivity_limits; @@ -2385,7 +2390,9 @@ iwn5000_rx_calib_results(struct iwn_soft switch (calib->code) { case IWN5000_PHY_CALIB_DC: - if (sc->hw_type == IWN_HW_REV_TYPE_5150) + if ((sc->sc_flags & IWN_FLAG_INTERNAL_PA) == 0 && + (sc->hw_type == IWN_HW_REV_TYPE_5150 || + sc->hw_type >= IWN_HW_REV_TYPE_6000)) idx = 0; break; case IWN5000_PHY_CALIB_LO: @@ -4367,7 +4374,7 @@ iwn5000_init_gains(struct iwn_softc *sc) struct iwn_phy_calib cmd; memset(&cmd, 0, sizeof cmd); - cmd.code = IWN5000_PHY_CALIB_RESET_NOISE_GAIN; + cmd.code = sc->reset_noise_gain; cmd.ngroups = 1; cmd.isvalid = 1; DPRINTF(sc, IWN_DEBUG_CALIBRATE, @@ -4419,7 +4426,7 @@ iwn5000_set_gains(struct iwn_softc *sc) div = (sc->hw_type == IWN_HW_REV_TYPE_6050) ? 20 : 30; memset(&cmd, 0, sizeof cmd); - cmd.code = IWN5000_PHY_CALIB_NOISE_GAIN; + cmd.code = sc->noise_gain; cmd.ngroups = 1; cmd.isvalid = 1; /* Get first available RX antenna as referential. */ @@ -5900,7 +5907,7 @@ iwn_read_firmware_tlv(struct iwn_softc * const struct iwn_fw_tlv *tlv; const uint8_t *ptr, *end; uint64_t altmask; - uint32_t len; + uint32_t len, tmp; if (fw->size < sizeof (*hdr)) { device_printf(sc->sc_dev, "%s: firmware too short: %zu bytes\n", @@ -5965,6 +5972,17 @@ iwn_read_firmware_tlv(struct iwn_softc * fw->boot.text = ptr; fw->boot.textsz = len; break; + case IWN_FW_TLV_ENH_SENS: + if (!len) + sc->sc_flags |= IWN_FLAG_ENH_SENS; + break; + case IWN_FW_TLV_PHY_CALIB: + tmp = htole32(*ptr); + if (tmp < 253) { + sc->reset_noise_gain = tmp; + sc->noise_gain = tmp + 1; + } + break; default: DPRINTF(sc, IWN_DEBUG_RESET, "TLV type %d not handled\n", le16toh(tlv->type)); Modified: stable/8/sys/dev/iwn/if_iwnreg.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:07:06 2011 (r223250) +++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:10:06 2011 (r223251) @@ -1322,6 +1322,8 @@ struct iwn_fw_tlv { #define IWN_FW_TLV_INIT_DATA 4 #define IWN_FW_TLV_BOOT_TEXT 5 #define IWN_FW_TLV_PBREQ_MAXLEN 6 +#define IWN_FW_TLV_ENH_SENS 14 +#define IWN_FW_TLV_PHY_CALIB 15 uint16_t alt; uint32_t len; Modified: stable/8/sys/dev/iwn/if_iwnvar.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:07:06 2011 (r223250) +++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:10:06 2011 (r223251) @@ -222,6 +222,8 @@ struct iwn_softc { uint32_t fw_data_maxsz; uint32_t fwsz; bus_size_t sched_txfact_addr; + uint32_t reset_noise_gain; + uint32_t noise_gain; /* TX scheduler rings. */ struct iwn_dma_info sched_dma; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:11:49 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3FE62106566B; Sat, 18 Jun 2011 12:11:49 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2E1A28FC13; Sat, 18 Jun 2011 12:11:49 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5ICBnpW040451; Sat, 18 Jun 2011 12:11:49 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5ICBn5k040447; Sat, 18 Jun 2011 12:11:49 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181211.p5ICBn5k040447@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:11:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223252 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:11:49 -0000 Author: bschmidt Date: Sat Jun 18 12:11:48 2011 New Revision: 223252 URL: http://svn.freebsd.org/changeset/base/223252 Log: MFC r220891: Add basic support for advanced bluetooth coexistence required for 6005 gen2b (1030/6030) adapters. Modified: stable/8/sys/dev/iwn/if_iwn.c stable/8/sys/dev/iwn/if_iwnreg.h stable/8/sys/dev/iwn/if_iwnvar.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:10:06 2011 (r223251) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:11:48 2011 (r223252) @@ -253,6 +253,7 @@ static void iwn_tune_sensitivity(struct static int iwn_send_sensitivity(struct iwn_softc *); static int iwn_set_pslevel(struct iwn_softc *, int, int, int); static int iwn_send_btcoex(struct iwn_softc *); +static int iwn_send_advanced_btcoex(struct iwn_softc *); static int iwn_config(struct iwn_softc *); static uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int); static int iwn_scan(struct iwn_softc *); @@ -816,6 +817,8 @@ iwn5000_attach(struct iwn_softc *sc, uin case IWN_HW_REV_TYPE_6005: sc->limits = &iwn6000_sensitivity_limits; sc->fwname = "iwn6005fw"; + if (pid != 0x0082 && pid != 0x0085) + sc->sc_flags |= IWN_FLAG_ADV_BTCOEX; break; default: device_printf(sc->sc_dev, "adapter type %d not supported\n", @@ -4721,6 +4724,63 @@ iwn_send_btcoex(struct iwn_softc *sc) } static int +iwn_send_advanced_btcoex(struct iwn_softc *sc) +{ + static const uint32_t btcoex_3wire[12] = { + 0xaaaaaaaa, 0xaaaaaaaa, 0xaeaaaaaa, 0xaaaaaaaa, + 0xcc00ff28, 0x0000aaaa, 0xcc00aaaa, 0x0000aaaa, + 0xc0004000, 0x00004000, 0xf0005000, 0xf0005000, + }; + struct iwn6000_btcoex_config btconfig; + struct iwn_btcoex_priotable btprio; + struct iwn_btcoex_prot btprot; + int error, i; + + memset(&btconfig, 0, sizeof btconfig); + btconfig.flags = 145; + btconfig.max_kill = 5; + btconfig.bt3_t7_timer = 1; + btconfig.kill_ack = htole32(0xffff0000); + btconfig.kill_cts = htole32(0xffff0000); + btconfig.sample_time = 2; + btconfig.bt3_t2_timer = 0xc; + for (i = 0; i < 12; i++) + btconfig.lookup_table[i] = htole32(btcoex_3wire[i]); + btconfig.valid = htole16(0xff); + btconfig.prio_boost = 0xf0; + DPRINTF(sc, IWN_DEBUG_RESET, + "%s: configuring advanced bluetooth coexistence\n", __func__); + error = iwn_cmd(sc, IWN_CMD_BT_COEX, &btconfig, sizeof(btconfig), 1); + if (error != 0) + return error; + + memset(&btprio, 0, sizeof btprio); + btprio.calib_init1 = 0x6; + btprio.calib_init2 = 0x7; + btprio.calib_periodic_low1 = 0x2; + btprio.calib_periodic_low2 = 0x3; + btprio.calib_periodic_high1 = 0x4; + btprio.calib_periodic_high2 = 0x5; + btprio.dtim = 0x6; + btprio.scan52 = 0x8; + btprio.scan24 = 0xa; + error = iwn_cmd(sc, IWN_CMD_BT_COEX_PRIOTABLE, &btprio, sizeof(btprio), + 1); + if (error != 0) + return error; + + /* Force BT state machine change. */ + memset(&btprot, 0, sizeof btprio); + btprot.open = 1; + btprot.type = 1; + error = iwn_cmd(sc, IWN_CMD_BT_COEX_PROT, &btprot, sizeof(btprot), 1); + if (error != 0) + return error; + btprot.open = 0; + return iwn_cmd(sc, IWN_CMD_BT_COEX_PROT, &btprot, sizeof(btprot), 1); +} + +static int iwn_config(struct iwn_softc *sc) { struct iwn_ops *ops = &sc->ops; @@ -4756,7 +4816,10 @@ iwn_config(struct iwn_softc *sc) } /* Configure bluetooth coexistence. */ - error = iwn_send_btcoex(sc); + if (sc->sc_flags & IWN_FLAG_ADV_BTCOEX) + error = iwn_send_advanced_btcoex(sc); + else + error = iwn_send_btcoex(sc); if (error != 0) { device_printf(sc->sc_dev, "%s: could not configure bluetooth coexistence, error %d\n", Modified: stable/8/sys/dev/iwn/if_iwnreg.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:10:06 2011 (r223251) +++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:11:48 2011 (r223252) @@ -434,6 +434,8 @@ struct iwn_tx_cmd { #define IWN_CMD_SET_CRITICAL_TEMP 164 #define IWN_CMD_SET_SENSITIVITY 168 #define IWN_CMD_PHY_CALIB 176 +#define IWN_CMD_BT_COEX_PRIOTABLE 204 +#define IWN_CMD_BT_COEX_PROT 205 uint8_t flags; uint8_t idx; @@ -829,7 +831,7 @@ struct iwn5000_cmd_txpower { uint8_t reserved; } __packed; -/* Structure for command IWN_CMD_BLUETOOTH. */ +/* Structures for command IWN_CMD_BLUETOOTH. */ struct iwn_bluetooth { uint8_t flags; #define IWN_BT_COEX_CHAN_ANN (1 << 0) @@ -847,6 +849,43 @@ struct iwn_bluetooth { uint32_t kill_cts; } __packed; +struct iwn6000_btcoex_config { + uint8_t flags; + uint8_t lead_time; + uint8_t max_kill; + uint8_t bt3_t7_timer; + uint32_t kill_ack; + uint32_t kill_cts; + uint8_t sample_time; + uint8_t bt3_t2_timer; + uint16_t bt4_reaction; + uint32_t lookup_table[12]; + uint16_t bt4_decision; + uint16_t valid; + uint8_t prio_boost; + uint8_t tx_prio_boost; + uint16_t rx_prio_boost; +} __packed; + +struct iwn_btcoex_priotable { + uint8_t calib_init1; + uint8_t calib_init2; + uint8_t calib_periodic_low1; + uint8_t calib_periodic_low2; + uint8_t calib_periodic_high1; + uint8_t calib_periodic_high2; + uint8_t dtim; + uint8_t scan52; + uint8_t scan24; + uint8_t reserved[7]; +} __packed; + +struct iwn_btcoex_prot { + uint8_t open; + uint8_t type; + uint8_t reserved[2]; +} __packed; + /* Structure for command IWN_CMD_SET_CRITICAL_TEMP. */ struct iwn_critical_temp { uint32_t reserved; Modified: stable/8/sys/dev/iwn/if_iwnvar.h ============================================================================== --- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:10:06 2011 (r223251) +++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:11:48 2011 (r223252) @@ -206,6 +206,7 @@ struct iwn_softc { #define IWN_FLAG_INTERNAL_PA (1 << 4) #define IWN_FLAG_HAS_11N (1 << 6) #define IWN_FLAG_ENH_SENS (1 << 7) +#define IWN_FLAG_ADV_BTCOEX (1 << 8) uint8_t hw_type; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:13:27 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7C8931065675; Sat, 18 Jun 2011 12:13:27 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6B8CC8FC13; Sat, 18 Jun 2011 12:13:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5ICDRwM040546; Sat, 18 Jun 2011 12:13:27 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5ICDRiq040544; Sat, 18 Jun 2011 12:13:27 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181213.p5ICDRiq040544@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:13:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223253 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:13:27 -0000 Author: bschmidt Date: Sat Jun 18 12:13:27 2011 New Revision: 223253 URL: http://svn.freebsd.org/changeset/base/223253 Log: MFC r220894: The 6000 series gen2 adapters have 2 firmware images, one with advanced btcoex support and one without. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:11:48 2011 (r223252) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:13:27 2011 (r223253) @@ -816,9 +816,11 @@ iwn5000_attach(struct iwn_softc *sc, uin break; case IWN_HW_REV_TYPE_6005: sc->limits = &iwn6000_sensitivity_limits; - sc->fwname = "iwn6005fw"; - if (pid != 0x0082 && pid != 0x0085) + if (pid != 0x0082 && pid != 0x0085) { + sc->fwname = "iwn6000g2bfw"; sc->sc_flags |= IWN_FLAG_ADV_BTCOEX; + } else + sc->fwname = "iwn6000g2afw"; break; default: device_printf(sc->sc_dev, "adapter type %d not supported\n", From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:27:49 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6F581106566C; Sat, 18 Jun 2011 12:27:49 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5B8BC8FC0C; Sat, 18 Jun 2011 12:27:49 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5ICRnMc041129; Sat, 18 Jun 2011 12:27:49 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5ICRnsN041126; Sat, 18 Jun 2011 12:27:49 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181227.p5ICRnsN041126@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:27:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223255 - in stable/8/sys: conf contrib/dev/iwn modules/iwnfw/iwn1000 modules/iwnfw/iwn5000 modules/iwnfw/iwn6050 X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:27:49 -0000 Author: bschmidt Date: Sat Jun 18 12:27:49 2011 New Revision: 223255 URL: http://svn.freebsd.org/changeset/base/223255 Log: MFC r220892: Update iwn(4) firmware blobs: - bump iwn1000fw to 39.31.5.1 - bump iwn5000fw to 8.83.5.1 - bump iwn6050fw to 41.28.5.1 Added: stable/8/sys/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu - copied unchanged from r220892, head/sys/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu stable/8/sys/contrib/dev/iwn/iwlwifi-5000-8.83.5.1.fw.uu - copied unchanged from r220892, head/sys/contrib/dev/iwn/iwlwifi-5000-8.83.5.1.fw.uu stable/8/sys/contrib/dev/iwn/iwlwifi-6050-41.28.5.1.fw.uu - copied unchanged from r220892, head/sys/contrib/dev/iwn/iwlwifi-6050-41.28.5.1.fw.uu Deleted: stable/8/sys/contrib/dev/iwn/iwlwifi-1000-128.50.3.1.fw.uu stable/8/sys/contrib/dev/iwn/iwlwifi-5000-8.24.2.12.fw.uu stable/8/sys/contrib/dev/iwn/iwlwifi-6050-9.201.4.1.fw.uu Modified: stable/8/sys/conf/files stable/8/sys/modules/iwnfw/iwn1000/Makefile stable/8/sys/modules/iwnfw/iwn5000/Makefile stable/8/sys/modules/iwnfw/iwn6050/Makefile Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/conf/files ============================================================================== --- stable/8/sys/conf/files Sat Jun 18 12:13:28 2011 (r223254) +++ stable/8/sys/conf/files Sat Jun 18 12:27:49 2011 (r223255) @@ -1139,8 +1139,8 @@ iwn1000fw.fwo optional iwn1000fw | iwn no-implicit-rule \ clean "iwn1000fw.fwo" iwn1000.fw optional iwn1000fw | iwnfw \ - dependency ".PHONY" \ - compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-1000-128.50.3.1.fw.uu" \ + dependency "$S/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu" \ no-obj no-implicit-rule \ clean "iwn1000.fw" iwn4965fw.c optional iwn4965fw | iwnfw \ @@ -1167,8 +1167,8 @@ iwn5000fw.fwo optional iwn5000fw | iwnf no-implicit-rule \ clean "iwn5000fw.fwo" iwn5000.fw optional iwn5000fw | iwnfw \ - dependency ".PHONY" \ - compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-5000-8.24.2.12.fw.uu" \ + dependency "$S/contrib/dev/iwn/iwlwifi-5000-8.83.5.1.fw.uu" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-5000-8.83.5.1.fw.uu" \ no-obj no-implicit-rule \ clean "iwn5000.fw" iwn5150fw.c optional iwn5150fw | iwnfw \ @@ -1209,8 +1209,8 @@ iwn6050fw.fwo optional iwn6050fw | iwn no-implicit-rule \ clean "iwn6050fw.fwo" iwn6050.fw optional iwn6050fw | iwnfw \ - dependency ".PHONY" \ - compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-6050-9.201.4.1.fw.uu" \ + dependency "$S/contrib/dev/iwn/iwlwifi-6050-41.28.5.1.fw.uu" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-6050-41.28.5.1.fw.uu" \ no-obj no-implicit-rule \ clean "iwn6050.fw" dev/ixgb/if_ixgb.c optional ixgb Copied: stable/8/sys/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu (from r220892, head/sys/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/sys/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu Sat Jun 18 12:27:49 2011 (r223255, copy of r220892, head/sys/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu) @@ -0,0 +1,5963 @@ +Copyright (c) 2006-2011, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 +COPYRIGHT OWNER 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. +begin-base64 644 iwlwifi-1000-39.31.5.1.fw.uu +AAAAAElXTAoxMDAwIGZ3IHYzOS4zMS41LjEgYnVpbGQgMzUxMzgKAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAQUfJ0KJAAABAAAAAAAAAAEAAAAY7AEAICCADwAAQABpIAAAaSBAAGkg +AABpIEAAICCADwAA6ABpIAAAaSBAAGkgAABpIEAAICCADwAAMAVpIAAAaSBAAGkgAABKIAAASiEA +AEoiAABKIwAASiQAAEolAABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQ +SiAAIEohACBKIgAgSiMAIEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+AAADAQSycMEAsnDBC +JBw0CiKAP4AA1FkKIwA3jg4AAEomAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAHAEQHggIECH +AAAAAAAAAAAAAArIz3GgAMgfDhkYgAvIDxkYgAzIEBkYgA0SAjYAyER4ERkYgA7ILRkYgOB+4cT8 +HMi+/BxIvuHA4cHhwuHD/BwIsfwcSLH8HIix/BzIsfwcCLL8HEiy/ByIsvwcyLL8HAi/aiSAEOHE +aiTAEOHE8cDPcKAA0BsUgM9xgABsBAQggI/PUQThAKEK8i8pAQDPcIAAYAnwIEAAQHja/9HAwcRr +JMAQwcRrJIAQwcSfdAQUCzQEFAo0BBQJNAQUCDQEFAc0BBQGNAQUBTQEFAQ0wcPBwsHBwcDBxEUs +fhAKJkB+wcRrJIAUwcQgIECHCsiHuAoaGDALyJu4CxoYMAzIDBoYMA3Ih7gNGhgwDsiFIMMPDhoY +MOB+4HjxwArIlbgKGhgwC8ibuAsaGDANyIq4jbiQuA0aGDDPcIAAmAoYiIHgC/QNyM9xAAAQCqy4 +DRoYMEINIAAP2GfY6g3gAIohRwHRwOB+8cDPcQMAQA3PcKAAqCAtoM9ygAC4BCCCAWkAoqINIAFI +2M9wgADECCWAI4EggcdxAACIE3oOgAfi8eB4z3CAAMQICQaAB+B48cBmC0ABgODPdoAAbAQG8oHg +BvQB2APwANgLroDhBvKB4Qb0AdgD8ADYCq6A4gbygeIG9AHYA/AA2AyuANjPdaAAyB8YHRiQC46A +4IohEAAO8giOgOAM8s9wAwBADUUdGBAwpQLYGB0YkAPwMaUKjoDgGvIJjoDgFvLPcAEAGOwgHRiQ +z3CAACgAIR0YkM9wgABoBCIdGJAYFQCWRSAAAxgdGJAMjoDgB/IYFQCWhSABBBgdGJCA4xjyANiU +uM92gACoBACmcdgGuAYIIAH82SCGz3AAAEwc9g/gAJ+5GBUAloW4GB0YkOkCQAFpIEAA/vHgePHA +pcFBwELBDBwAMRAcQDHPcYAA/Fo0GcAPMBkADywZwA4oGYAOJBlADs9wgAD8WiAYQAvPcIAA/Foc +GAALz3CAAPxaGBjACs9wgAD8WhQYgArPcIAA/FoQGMAIz3CAAPxaDBiACM9wgAD8WggYQAjPcYAA +gFqAGQAIfBnAB3gZgAd0GUAHcBkAB2wZAAdoGYAGZBlABmAZAAZcGcAFWBmABVQZQAVQGQAFTBnA +BEgZgAREGUAEQBkABO+hzqGtoYyhLBnAAigZgAIkGUACIBkAAhwZwAEYGYABFBlAARAZAAFjoWog +AAPYGQAAaiDAAtQZAABqIIAC0BkAAGogQAHIGQAAaiAAAcQZAABqIMAAwBkAAGoggAC8GQAAaiBA +ALgZAABqIAAAtBkAAGoggAHMGQAAz3GfALj/GIFTJ841UyXENVMmxTWUuBihQMMBwALB17oMFAYw +yXMA3ZYL4AAQFAcwz3CgALQPvKDPcaAAyDsugS4L4AB92LYJQAGSDuAAqXAI2ADZUg7gAJm5NvHx +wLYIYAF72AoL4ADX2c9xgAD8WjQZwA8wGQAPLBnADigZgA4kGUAOz3CAAPxaIBhAC89wgAD8WhwY +AAvPcIAA/FoYGMAKz3CAAPxaFBiACs9wgAD8WhAYwAjPcIAA/FoMGIAIz3CAAPxaCBhACM9xgACA +WoAZAAh8GcAHeBmAB3QZQAdwGQAHbBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlABVAZAAVMGcAE +SBmABEQZQARAGQAE76HOoa2hjKEsGcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUABEBkAAWOhaiAA +A9gZAABqIMAC1BkAAGoggALQGQAAaiBAAcgZAABqIAABxBkAAGogwADAGQAAaiCAALwZAABqIEAA +uBkAAGogAAC0GQAAaiCAAcwZAADrds91oADQG1wVEBDPcAAARBziCSABCifAHzpwz3CAAIAWA4CA +4AbyF4VRIMCAlAcCAQfYwgkgAQq4UyBBBwfY2gzgAAq4z3CgANQLGIBCIAAISCAAAM9zgADcFc9x +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 *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:30:33 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A1A21106566C; Sat, 18 Jun 2011 12:30:33 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8DD168FC17; Sat, 18 Jun 2011 12:30:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5ICUXgZ041255; Sat, 18 Jun 2011 12:30:33 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5ICUXe0041251; Sat, 18 Jun 2011 12:30:33 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181230.p5ICUXe0041251@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:30:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223256 - in stable/8/sys: conf contrib/dev/iwn modules/iwnfw modules/iwnfw/iwn6000g2a modules/iwnfw/iwn6000g2b X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:30:33 -0000 Author: bschmidt Date: Sat Jun 18 12:30:33 2011 New Revision: 223256 URL: http://svn.freebsd.org/changeset/base/223256 Log: MFC r220893: - Add firmware images for the 6000 series g2a and g2b adapters. Added: stable/8/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu - copied unchanged from r220893, head/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu stable/8/sys/contrib/dev/iwn/iwlwifi-6000g2b-17.168.5.2.fw.uu - copied unchanged from r220893, head/sys/contrib/dev/iwn/iwlwifi-6000g2b-17.168.5.2.fw.uu stable/8/sys/modules/iwnfw/iwn6000g2a/ - copied from r220893, head/sys/modules/iwnfw/iwn6000g2a/ stable/8/sys/modules/iwnfw/iwn6000g2b/ - copied from r220893, head/sys/modules/iwnfw/iwn6000g2b/ Modified: stable/8/sys/conf/files stable/8/sys/modules/iwnfw/Makefile Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/conf/files ============================================================================== --- stable/8/sys/conf/files Sat Jun 18 12:27:49 2011 (r223255) +++ stable/8/sys/conf/files Sat Jun 18 12:30:33 2011 (r223256) @@ -1199,6 +1199,34 @@ iwn6000.fw optional iwn6000fw | iwnfw compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-6000-9.221.4.1.fw.uu" \ no-obj no-implicit-rule \ clean "iwn6000.fw" +iwn6000g2afw.c optional iwn6000g2afw | iwnfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk iwn6000g2a.fw:iwn6000g2afw -miwn6000g2afw -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "iwn6000g2afw.c" +iwn6000g2afw.fwo optional iwn6000g2afw | iwnfw \ + dependency "iwn6000g2a.fw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn6000g2a.fw" \ + no-implicit-rule \ + clean "iwn6000g2afw.fwo" +iwn6000g2a.fw optional iwn6000g2afw | iwnfw \ + dependency "$S/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu" \ + no-obj no-implicit-rule \ + clean "iwn6000g2a.fw" +iwn6000g2bfw.c optional iwn6000g2bfw | iwnfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk iwn6000g2b.fw:iwn6000g2bfw -miwn6000g2bfw -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "iwn6000g2bfw.c" +iwn6000g2bfw.fwo optional iwn6000g2bfw | iwnfw \ + dependency "iwn6000g2b.fw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn6000g2b.fw" \ + no-implicit-rule \ + clean "iwn6000g2bfw.fwo" +iwn6000g2b.fw optional iwn6000g2bfw | iwnfw \ + dependency "$S/contrib/dev/iwn/iwlwifi-6000g2b-17.168.5.2.fw.uu" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-6000g2b-17.168.5.2.fw.uu" \ + no-obj no-implicit-rule \ + clean "iwn6000g2b.fw" iwn6050fw.c optional iwn6050fw | iwnfw \ compile-with "${AWK} -f $S/tools/fw_stub.awk iwn6050.fw:iwn6050fw -miwn6050fw -c${.TARGET}" \ no-implicit-rule before-depend local \ Copied: stable/8/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu (from r220893, head/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/8/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu Sat Jun 18 12:30:33 2011 (r223256, copy of r220893, head/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.2.fw.uu) @@ -0,0 +1,7833 @@ +Copyright (c) 2006-2011, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 +COPYRIGHT OWNER 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. +begin-base64 644 iwlwifi-6000g2a-17.168.5.2.fw.uu +AAAAAElXTAo2MDAwZzJhIGZ3IHYxNy4xNjguNS4yIGJ1aWxkIDM1OTA1CgAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAgWoEUGMAAABAAAAAAAAAAEAAAAASAIAICCADwAAQABpIAAAaSBAAGkg +AABpIEAAICCADwAA6ABpIAAAaSBAAGkgAABpIEAAICCADwAApPZpIAAAaSBAAGkgAABKIAAASiEA +AEoiAABKIwAASiQAAEolAABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQ +SiAAIEohACBKIgAgSiMAIEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+BAABAQSycMEAsnDBC +JBw0CiKAP4AAWG8KIwA3xgpAB0omAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAFQcQHggIECH +AAAAAAAAAAAAAPwciLb8HEi2/BwItvwcyLX8HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzI +s/wciLP8HEiz4H7geATcON018OB4BNw03TPw4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTd +K/DgeATcIN0p8OB4BNwc3Sfw4HgE3BjdJfDgeATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c +8OB4BNwE3RnwNBQaMDAUGTAsFBgwKBQXMCQUFjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHG +sCRNM7AkHzPgfvHATg/P/89xoACsLxiBz3WgAMgfIN6auBihBdjQpUMdGBAA2DYI4BGNuNGljQfP +//HAHg/P/89xoACsLxiBz3WgAMgfIN6zuLq4GKFk2NClQx0YEADYBgjgEY240aVdB8//4HjgfuB4 +4H7geOB+4HjgfuB4CiJAgADZ7gABAC8mAPBKJkAATgAGAE8AIACKJf8P4HgKIkCAANnOAAEAbAAk +AC8mAPBcAAUAKwg1CEomQAAIcQDYAiG+gOAgxQdCeQHgAiG+gOAgxQdCeesH7/8B4C8tAQBAJUUA +AiZ88QAAIAAAKEAB6CBiAy8gAIAvIUsAAiG+gMAghgHCIYYA4H4RACAASiAAEEogQBAOIkIALyAL +Es4gRYCKJf8PCAAFAC8tAQBAJUUAAiZ88QAAIAAAKEABSiZAAOggIgMvIACALyFLAAIhvoDAIIYB +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 +D/QhwQPhDyBAAAMUgTAD4Q8gQAACFIEwA+EPIEAACRSBMIHhDvQCFIEwCrlPIQIEAxSBMAy5JXoh +wQ65RXkleCDBgeEI9AcUgTAiwga5CLpFeSV44H+jwKPB4cVCwQkUgTBDwoPhQcAA2Ar2gOHI9goU +gTCA4cT2g+HD9gHYBxSCMAYUgzBQcwbyIsEwc8wiQoAD9AHYIcWB5RD0ChSBMCPDcHFK9gsUgjBQ +ccwjqoCE9oDiyiBpAIHgDfSKIckPz3CAAEAHIKCB5f/ZyiEiACGgwcXgf6PA8cCGCc/+z3aAAMQH +ABYFEEwlQII8AAYAz3eAAMxbAIahhgi4IIcFfTB1CfIQuYogSwVeCCAGpXmgpyCGz3CAAIBq8CBA +AEB4gODr86EBz/4KIcAP63LPcAAAhidj220BIABKJIAA4HiiweHFQsFBKAICB3pBKAEER3nPcoAA +kMXGuSpi57oS9AgUAzHPdYAAkMipcVZ5QIFQcAX0QpFwcgbyR4nnuvfzgNgD8AaJwcXgf6LA8cDW +CO/+uHBKJEAAkODKIsoHyiCKDwAAzhvKI4oPAAD8APQAKgDKIcoPQC1DAcdzgAAQxsaLjCYCkADY +DfLPcIAAkMgWII0DoIWgoSaLNngCkACyiHDtAM/+4HjgfuB48cAIyJW4CBoYMAnIm7gJGhgwC8iK +uI24kLgLGhgwz3CAAMgdA4AYiIHgDPQLyM9xAABILqy4CxoYMAYMYAYP2GfYOg/gBYohCADRwOB+ +4HjxwOHFCHU+iM9wgADoE0CAQCUAFAO5NXlZYaIPYA0K2o4P7/+pcHUAz/7gePHA4cXPcoAATDmE +EgAAgBIBAM91oADIHyR4LykBAM9wAwBADUUdGBDwIkAAQHiA2BUdGJA5AM/+8cClwUHAQsEMHAAx +EBxAMc9xgAD8kjQZwA8wGQAPLBnADigZgA4kGUAOz3CAAPySIBhAC89wgAD8khwYAAvPcIAA/JIY +GMAKz3CAAPySFBiACs9wgAD8khAYwAjPcIAA/JIMGIAIz3CAAPySCBhACM9xgACAkoAZAAh8GcAH +eBmAB3QZQAdwGQAHbBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlABVAZAAVMGcAESBmABEQZQARA +GQAE76HOoa2hjKEsGcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUABEBkAAWOhaiAAA9gZAABqIMAC +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 *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:32:49 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 17F8E106566B; Sat, 18 Jun 2011 12:32:49 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F1E498FC19; Sat, 18 Jun 2011 12:32:48 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5ICWmvV041369; Sat, 18 Jun 2011 12:32:48 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5ICWmbB041367; Sat, 18 Jun 2011 12:32:48 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181232.p5ICWmbB041367@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:32:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223257 - stable/8/sys/dev/iwn X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:32:49 -0000 Author: bschmidt Date: Sat Jun 18 12:32:48 2011 New Revision: 223257 URL: http://svn.freebsd.org/changeset/base/223257 Log: MFC r220895,221634: Now that all bits are in for 1030/6230 adapters enable those. While here pull the adapter names from the Linux driver and sort the list by ID. Modified: stable/8/sys/dev/iwn/if_iwn.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/dev/iwn/if_iwn.c ============================================================================== --- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:30:33 2011 (r223256) +++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:32:48 2011 (r223257) @@ -78,38 +78,33 @@ struct iwn_ident { const char *name; }; -static const struct iwn_ident iwn_ident_table [] = { - { 0x8086, 0x4229, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x422D, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4230, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4233, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4232, "Intel(R) PRO/Wireless 5100" }, - { 0x8086, 0x4237, "Intel(R) PRO/Wireless 5100" }, - { 0x8086, 0x423C, "Intel(R) PRO/Wireless 5150" }, - { 0x8086, 0x423D, "Intel(R) PRO/Wireless 5150" }, - { 0x8086, 0x4235, "Intel(R) PRO/Wireless 5300" }, - { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5300" }, - { 0x8086, 0x423A, "Intel(R) PRO/Wireless 5350" }, - { 0x8086, 0x423B, "Intel(R) PRO/Wireless 5350" }, - { 0x8086, 0x0083, "Intel(R) PRO/Wireless 1000" }, - { 0x8086, 0x0084, "Intel(R) PRO/Wireless 1000" }, - { 0x8086, 0x008D, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x008E, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x4238, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x4239, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x422B, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x422C, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x0087, "Intel(R) PRO/Wireless 6250" }, - { 0x8086, 0x0089, "Intel(R) PRO/Wireless 6250" }, - { 0x8086, 0x0082, "Intel(R) PRO/Wireless 6205a" }, - { 0x8086, 0x0085, "Intel(R) PRO/Wireless 6205a" }, -#ifdef notyet - { 0x8086, 0x008a, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x008b, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x008f, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x0090, "Intel(R) PRO/Wireless 6205b" }, - { 0x8086, 0x0091, "Intel(R) PRO/Wireless 6205b" }, -#endif +static const struct iwn_ident iwn_ident_table[] = { + { 0x8086, 0x0082, "Intel(R) Centrino(R) Advanced-N 6205" }, + { 0x8086, 0x0083, "Intel(R) Centrino(R) Wireless-N 1000" }, + { 0x8086, 0x0084, "Intel(R) Centrino(R) Wireless-N 1000" }, + { 0x8086, 0x0085, "Intel(R) Centrino(R) Advanced-N 6205" }, + { 0x8086, 0x0087, "Intel(R) Centrino(R) Advanced-N + WiMAX 6250" }, + { 0x8086, 0x0089, "Intel(R) Centrino(R) Advanced-N + WiMAX 6250" }, + { 0x8086, 0x008a, "Intel(R) Centrino(R) Wireless-N 1030" }, + { 0x8086, 0x008b, "Intel(R) Centrino(R) Wireless-N 1030" }, + { 0x8086, 0x0090, "Intel(R) Centrino(R) Advanced-N 6230" }, + { 0x8086, 0x0091, "Intel(R) Centrino(R) Advanced-N 6230" }, + { 0x8086, 0x4229, "Intel(R) Wireless WiFi Link 4965" }, + { 0x8086, 0x422b, "Intel(R) Centrino(R) Ultimate-N 6300" }, + { 0x8086, 0x422c, "Intel(R) Centrino(R) Advanced-N 6200" }, + { 0x8086, 0x422d, "Intel(R) Wireless WiFi Link 4965" }, + { 0x8086, 0x4230, "Intel(R) Wireless WiFi Link 4965" }, + { 0x8086, 0x4232, "Intel(R) WiFi Link 5100" }, + { 0x8086, 0x4233, "Intel(R) Wireless WiFi Link 4965" }, + { 0x8086, 0x4235, "Intel(R) Ultimate N WiFi Link 5300" }, + { 0x8086, 0x4236, "Intel(R) Ultimate N WiFi Link 5300" }, + { 0x8086, 0x4237, "Intel(R) WiFi Link 5100" }, + { 0x8086, 0x4238, "Intel(R) Centrino(R) Ultimate-N 6300" }, + { 0x8086, 0x4239, "Intel(R) Centrino(R) Advanced-N 6200" }, + { 0x8086, 0x423a, "Intel(R) WiMAX/WiFi Link 5350" }, + { 0x8086, 0x423b, "Intel(R) WiMAX/WiFi Link 5350" }, + { 0x8086, 0x423c, "Intel(R) WiMAX/WiFi Link 5150" }, + { 0x8086, 0x423d, "Intel(R) WiMAX/WiFi Link 5150" }, { 0, 0, NULL } }; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 12:35:08 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7A55E106566B; Sat, 18 Jun 2011 12:35:08 +0000 (UTC) (envelope-from bschmidt@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 697098FC08; Sat, 18 Jun 2011 12:35:08 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5ICZ88B041492; Sat, 18 Jun 2011 12:35:08 GMT (envelope-from bschmidt@svn.freebsd.org) Received: (from bschmidt@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5ICZ8gM041490; Sat, 18 Jun 2011 12:35:08 GMT (envelope-from bschmidt@svn.freebsd.org) Message-Id: <201106181235.p5ICZ8gM041490@svn.freebsd.org> From: Bernhard Schmidt Date: Sat, 18 Jun 2011 12:35:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223258 - stable/8/share/man/man4 X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 12:35:08 -0000 Author: bschmidt Date: Sat Jun 18 12:35:08 2011 New Revision: 223258 URL: http://svn.freebsd.org/changeset/base/223258 Log: MFC r220896: Add ref to the latest firmware additions. Modified: stable/8/share/man/man4/iwnfw.4 Directory Properties: stable/8/share/man/man4/ (props changed) Modified: stable/8/share/man/man4/iwnfw.4 ============================================================================== --- stable/8/share/man/man4/iwnfw.4 Sat Jun 18 12:32:48 2011 (r223257) +++ stable/8/share/man/man4/iwnfw.4 Sat Jun 18 12:35:08 2011 (r223258) @@ -22,7 +22,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 20, 2010 +.Dd April 20, 2011 .Dt IWNFW 4 .Os .Sh NAME @@ -45,6 +45,8 @@ of the following: .Cd "device iwn5000fw" .Cd "device iwn5150fw" .Cd "device iwn6000fw" +.Cd "device iwn6000g2afw" +.Cd "device iwn6000g2bfw" .Cd "device iwn6050fw" .Ed .Pp @@ -57,6 +59,8 @@ iwn1000fw_load="YES" iwn5000fw_load="YES" iwn5150fw_load="YES" iwn6000fw_load="YES" +iwn6000g2afw_load="YES" +iwn6000g2bfw_load="YES" iwn6050fw_load="YES" .Ed .Sh DESCRIPTION From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 22:09:22 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D7E921065675; Sat, 18 Jun 2011 22:09:22 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C6E008FC13; Sat, 18 Jun 2011 22:09:22 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IM9MJ2059062; Sat, 18 Jun 2011 22:09:22 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IM9MTT059059; Sat, 18 Jun 2011 22:09:22 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201106182209.p5IM9MTT059059@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Sat, 18 Jun 2011 22:09:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223272 - in stable/8/sys: netinet netinet6 X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 22:09:22 -0000 Author: bz Date: Sat Jun 18 22:09:22 2011 New Revision: 223272 URL: http://svn.freebsd.org/changeset/base/223272 Log: MFC r222272: Add FEATURE() definitions for IPv4 and IPv6 so that we can use feature_present(3) to dynamically decide whether to use one or the other family. Modified: stable/8/sys/netinet/in_proto.c stable/8/sys/netinet6/in6_proto.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/netinet/in_proto.c ============================================================================== --- stable/8/sys/netinet/in_proto.c Sat Jun 18 21:53:36 2011 (r223271) +++ stable/8/sys/netinet/in_proto.c Sat Jun 18 22:09:22 2011 (r223272) @@ -93,6 +93,8 @@ static struct pr_usrreqs nousrreqs; #include #endif +FEATURE(inet, "Internet Protocol version 4"); + extern struct domain inetdomain; /* Spacer for loadable protocols. */ Modified: stable/8/sys/netinet6/in6_proto.c ============================================================================== --- stable/8/sys/netinet6/in6_proto.c Sat Jun 18 21:53:36 2011 (r223271) +++ stable/8/sys/netinet6/in6_proto.c Sat Jun 18 22:09:22 2011 (r223272) @@ -128,6 +128,7 @@ __FBSDID("$FreeBSD$"); /* * TCP/IP protocol family: IP6, ICMP6, UDP, TCP. */ +FEATURE(inet6, "Internet Protocol version 6"); extern struct domain inet6domain; static struct pr_usrreqs nousrreqs; From owner-svn-src-stable-8@FreeBSD.ORG Sat Jun 18 22:12:17 2011 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7AF67106564A; Sat, 18 Jun 2011 22:12:17 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 68C568FC08; Sat, 18 Jun 2011 22:12:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IMCHda059303; Sat, 18 Jun 2011 22:12:17 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IMCHMX059295; Sat, 18 Jun 2011 22:12:17 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201106182212.p5IMCHMX059295@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Sat, 18 Jun 2011 22:12:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223274 - stable/8/usr.sbin/mfiutil X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 22:12:17 -0000 Author: bz Date: Sat Jun 18 22:12:17 2011 New Revision: 223274 URL: http://svn.freebsd.org/changeset/base/223274 Log: MFC r219722 (by jhb): Preserve errno in an error case. Submitted by: gcooper MFC r222899: Contrary to when returning in all-good cases at the end of functions we did not free memory (1) or close the file descriptor (2) in error cases. Reported by: Mark Johnston (1) Reported by: attilio (2) Reviewed by: jhb Sponsored by: Sandvine Incorporated Modified: stable/8/usr.sbin/mfiutil/mfi_config.c stable/8/usr.sbin/mfiutil/mfi_drive.c stable/8/usr.sbin/mfiutil/mfi_evt.c stable/8/usr.sbin/mfiutil/mfi_flash.c stable/8/usr.sbin/mfiutil/mfi_patrol.c stable/8/usr.sbin/mfiutil/mfi_show.c stable/8/usr.sbin/mfiutil/mfi_volume.c Directory Properties: stable/8/usr.sbin/mfiutil/ (props changed) Modified: stable/8/usr.sbin/mfiutil/mfi_config.c ============================================================================== --- stable/8/usr.sbin/mfiutil/mfi_config.c Sat Jun 18 22:09:44 2011 (r223273) +++ stable/8/usr.sbin/mfiutil/mfi_config.c Sat Jun 18 22:12:17 2011 (r223274) @@ -85,6 +85,7 @@ mfi_config_read(int fd, struct mfi_confi { struct mfi_config_data *config; uint32_t config_size; + int error; /* * Keep fetching the config in a loop until we have a large enough @@ -97,8 +98,12 @@ fetch: if (config == NULL) return (-1); if (mfi_dcmd_command(fd, MFI_DCMD_CFG_READ, config, - config_size, NULL, 0, NULL) < 0) + config_size, NULL, 0, NULL) < 0) { + error = errno; + free(config); + errno = error; return (-1); + } if (config->size > config_size) { config_size = config->size; @@ -162,12 +167,14 @@ clear_config(int ac, char **av) if (!mfi_reconfig_supported()) { warnx("The current mfi(4) driver does not support " "configuration changes."); + close(fd); return (EOPNOTSUPP); } if (mfi_ld_get_list(fd, &list, NULL) < 0) { error = errno; warn("Failed to get volume list"); + close(fd); return (error); } @@ -175,6 +182,7 @@ clear_config(int ac, char **av) if (mfi_volume_busy(fd, list.ld_list[i].ld.v.target_id)) { warnx("Volume %s is busy and cannot be deleted", mfi_volume_name(fd, list.ld_list[i].ld.v.target_id)); + close(fd); return (EBUSY); } } @@ -185,12 +193,14 @@ clear_config(int ac, char **av) ch = getchar(); if (ch != 'y' && ch != 'Y') { printf("\nAborting\n"); + close(fd); return (0); } if (mfi_dcmd_command(fd, MFI_DCMD_CFG_CLEAR, NULL, 0, NULL, 0, NULL) < 0) { error = errno; warn("Failed to clear configuration"); + close(fd); return (error); } @@ -336,17 +346,21 @@ parse_array(int fd, int raid_type, char for (pinfo = info->drives; (cp = strsep(&array_str, ",")) != NULL; pinfo++) { error = mfi_lookup_drive(fd, cp, &device_id); - if (error) + if (error) { + free(info->drives); return (error); + } if (mfi_pd_get_info(fd, device_id, pinfo, NULL) < 0) { error = errno; warn("Failed to fetch drive info for drive %s", cp); + free(info->drives); return (error); } if (pinfo->fw_state != MFI_PD_STATE_UNCONFIGURED_GOOD) { warnx("Drive %u is not available", device_id); + free(info->drives); return (EINVAL); } } @@ -551,7 +565,12 @@ create_volume(int ac, char **av) return (EINVAL); } - + bzero(&state, sizeof(state)); + config = NULL; + arrays = NULL; + narrays = 0; + error = 0; + fd = mfi_open(mfi_unit); if (fd < 0) { error = errno; @@ -562,7 +581,8 @@ create_volume(int ac, char **av) if (!mfi_reconfig_supported()) { warnx("The current mfi(4) driver does not support " "configuration changes."); - return (EOPNOTSUPP); + error = EOPNOTSUPP; + goto error; } /* Lookup the RAID type first. */ @@ -575,7 +595,8 @@ create_volume(int ac, char **av) if (raid_type == -1) { warnx("Unknown or unsupported volume type %s", av[1]); - return (EINVAL); + error = EINVAL; + goto error; } /* Parse any options. */ @@ -603,7 +624,8 @@ create_volume(int ac, char **av) break; case '?': default: - return (EINVAL); + error = EINVAL; + goto error; } } ac -= optind; @@ -613,7 +635,8 @@ create_volume(int ac, char **av) narrays = ac; if (narrays == 0) { warnx("At least one drive list is required"); - return (EINVAL); + error = EINVAL; + goto error; } switch (raid_type) { case RT_RAID0: @@ -623,7 +646,8 @@ create_volume(int ac, char **av) case RT_CONCAT: if (narrays != 1) { warnx("Only one drive list can be specified"); - return (EINVAL); + error = EINVAL; + goto error; } break; case RT_RAID10: @@ -632,24 +656,27 @@ create_volume(int ac, char **av) if (narrays < 1) { warnx("RAID10, RAID50, and RAID60 require at least " "two drive lists"); - return (EINVAL); + error = EINVAL; + goto error; } if (narrays > MFI_MAX_SPAN_DEPTH) { warnx("Volume spans more than %d arrays", MFI_MAX_SPAN_DEPTH); - return (EINVAL); + error = EINVAL; + goto error; } break; } arrays = calloc(narrays, sizeof(*arrays)); if (arrays == NULL) { warnx("malloc failed"); - return (ENOMEM); + error = ENOMEM; + goto error; } for (i = 0; i < narrays; i++) { error = parse_array(fd, raid_type, av[i], &arrays[i]); if (error) - return (error); + goto error; } switch (raid_type) { @@ -660,7 +687,8 @@ create_volume(int ac, char **av) if (arrays[i].drive_count != arrays[0].drive_count) { warnx("All arrays must contain the same " "number of drives"); - return (EINVAL); + error = EINVAL; + goto error; } } break; @@ -673,7 +701,7 @@ create_volume(int ac, char **av) if (mfi_config_read(fd, &config) < 0) { error = errno; warn("Failed to read configuration"); - return (error); + goto error; } p = (char *)config->array; state.array_ref = 0xffff; @@ -683,7 +711,8 @@ create_volume(int ac, char **av) state.arrays = calloc(config->array_count, sizeof(int)); if (state.arrays == NULL) { warnx("malloc failed"); - return (ENOMEM); + error = ENOMEM; + goto error; } for (i = 0; i < config->array_count; i++) { ar = (struct mfi_array *)p; @@ -699,7 +728,8 @@ create_volume(int ac, char **av) state.volumes = calloc(config->log_drv_count, sizeof(int)); if (state.volumes == NULL) { warnx("malloc failed"); - return (ENOMEM); + error = ENOMEM; + goto error; } for (i = 0; i < config->log_drv_count; i++) { ld = (struct mfi_ld_config *)p; @@ -739,7 +769,8 @@ create_volume(int ac, char **av) config = calloc(1, config_size); if (config == NULL) { warnx("malloc failed"); - return (ENOMEM); + error = ENOMEM; + goto error; } config->size = config_size; config->array_count = narrays; @@ -776,21 +807,20 @@ create_volume(int ac, char **av) NULL, 0, NULL) < 0) { error = errno; warn("Failed to add volume"); - return (error); + /* FALLTHROUGH */ } +error: /* Clean up. */ free(config); - if (state.log_drv_count > 0) - free(state.volumes); - if (state.array_count > 0) - free(state.arrays); + free(state.volumes); + free(state.arrays); for (i = 0; i < narrays; i++) free(arrays[i].drives); free(arrays); close(fd); - return (0); + return (error); } MFI_COMMAND(top, create, create_volume); @@ -831,24 +861,28 @@ delete_volume(int ac, char **av) if (!mfi_reconfig_supported()) { warnx("The current mfi(4) driver does not support " "configuration changes."); + close(fd); return (EOPNOTSUPP); } if (mfi_lookup_volume(fd, av[1], &target_id) < 0) { error = errno; warn("Invalid volume %s", av[1]); + close(fd); return (error); } if (mfi_ld_get_info(fd, target_id, &info, NULL) < 0) { error = errno; warn("Failed to get info for volume %d", target_id); + close(fd); return (error); } if (mfi_volume_busy(fd, target_id)) { warnx("Volume %s is busy and cannot be deleted", mfi_volume_name(fd, target_id)); + close(fd); return (EBUSY); } @@ -857,6 +891,7 @@ delete_volume(int ac, char **av) sizeof(mbox), NULL) < 0) { error = errno; warn("Failed to delete volume"); + close(fd); return (error); } @@ -891,40 +926,44 @@ add_spare(int ac, char **av) return (error); } + config = NULL; + spare = NULL; error = mfi_lookup_drive(fd, av[1], &device_id); if (error) - return (error); + goto error; if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) { error = errno; warn("Failed to fetch drive info"); - return (error); + goto error; } if (info.fw_state != MFI_PD_STATE_UNCONFIGURED_GOOD) { warnx("Drive %u is not available", device_id); - return (EINVAL); + error = EINVAL; + goto error; } if (ac > 2) { if (mfi_lookup_volume(fd, av[2], &target_id) < 0) { error = errno; warn("Invalid volume %s", av[2]); - return (error); + goto error; } } if (mfi_config_read(fd, &config) < 0) { error = errno; warn("Failed to read configuration"); - return (error); + goto error; } spare = malloc(sizeof(struct mfi_spare) + sizeof(uint16_t) * config->array_count); if (spare == NULL) { warnx("malloc failed"); - return (ENOMEM); + error = ENOMEM; + goto error; } bzero(spare, sizeof(struct mfi_spare)); spare->ref = info.ref; @@ -937,7 +976,8 @@ add_spare(int ac, char **av) if (ar->size > info.coerced_size) { warnx("Spare isn't large enough for array %u", ar->array_ref); - return (EINVAL); + error = EINVAL; + goto error; } p += config->array_size; } @@ -950,7 +990,8 @@ add_spare(int ac, char **av) ld = mfi_config_lookup_volume(config, target_id); if (ld == NULL) { warnx("Did not find volume %d", target_id); - return (EINVAL); + error = EINVAL; + goto error; } spare->spare_type |= MFI_SPARE_DEDICATED; @@ -960,29 +1001,33 @@ add_spare(int ac, char **av) ld->span[i].array_ref); if (ar == NULL) { warnx("Missing array; inconsistent config?"); - return (ENXIO); + error = ENXIO; + goto error; } if (ar->size > info.coerced_size) { warnx("Spare isn't large enough for array %u", ar->array_ref); - return (EINVAL); + error = EINVAL; + goto error; } spare->array_ref[i] = ar->array_ref; } } - free(config); if (mfi_dcmd_command(fd, MFI_DCMD_CFG_MAKE_SPARE, spare, sizeof(struct mfi_spare) + sizeof(uint16_t) * spare->array_count, NULL, 0, NULL) < 0) { error = errno; warn("Failed to assign spare"); - return (error); + /* FALLTHROUGH. */ } +error: + free(spare); + free(config); close(fd); - return (0); + return (error); } MFI_COMMAND(top, add, add_spare); @@ -1007,18 +1052,22 @@ remove_spare(int ac, char **av) } error = mfi_lookup_drive(fd, av[1], &device_id); - if (error) + if (error) { + close(fd); return (error); + } /* Get the info for this drive. */ if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) { error = errno; warn("Failed to fetch info for drive %u", device_id); + close(fd); return (error); } if (info.fw_state != MFI_PD_STATE_HOT_SPARE) { warnx("Drive %u is not a hot spare", device_id); + close(fd); return (EINVAL); } @@ -1027,6 +1076,7 @@ remove_spare(int ac, char **av) sizeof(mbox), NULL) < 0) { error = errno; warn("Failed to delete spare"); + close(fd); return (error); } @@ -1151,6 +1201,7 @@ debug_config(int ac, char **av) if (mfi_config_read(fd, &config) < 0) { error = errno; warn("Failed to get config"); + close(fd); return (error); } @@ -1190,17 +1241,21 @@ dump(int ac, char **av) warn("Failed to read debug command"); if (error == ENOENT) error = EOPNOTSUPP; + close(fd); return (error); } config = malloc(len); if (config == NULL) { warnx("malloc failed"); + close(fd); return (ENOMEM); } if (sysctlbyname(buf, config, &len, NULL, 0) < 0) { error = errno; warn("Failed to read debug command"); + free(config); + close(fd); return (error); } dump_config(fd, config); Modified: stable/8/usr.sbin/mfiutil/mfi_drive.c ============================================================================== --- stable/8/usr.sbin/mfiutil/mfi_drive.c Sat Jun 18 22:09:44 2011 (r223273) +++ stable/8/usr.sbin/mfiutil/mfi_drive.c Sat Jun 18 22:12:17 2011 (r223274) @@ -310,19 +310,23 @@ drive_set_state(char *drive, uint16_t ne } error = mfi_lookup_drive(fd, drive, &device_id); - if (error) + if (error) { + close(fd); return (error); + } /* Get the info for this drive. */ if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) { error = errno; warn("Failed to fetch info for drive %u", device_id); + close(fd); return (error); } /* Try to change the state. */ if (info.fw_state == new_state) { warnx("Drive %u is already in the desired state", device_id); + close(fd); return (EINVAL); } @@ -334,6 +338,7 @@ drive_set_state(char *drive, uint16_t ne error = errno; warn("Failed to set drive %u to %s", device_id, mfi_pdstate(new_state)); + close(fd); return (error); } @@ -406,19 +411,23 @@ start_rebuild(int ac, char **av) } error = mfi_lookup_drive(fd, av[1], &device_id); - if (error) + if (error) { + close(fd); return (error); + } /* Get the info for this drive. */ if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) { error = errno; warn("Failed to fetch info for drive %u", device_id); + close(fd); return (error); } /* Check the state, must be REBUILD. */ if (info.fw_state != MFI_PD_STATE_REBUILD) { warnx("Drive %d is not in the REBUILD state", device_id); + close(fd); return (EINVAL); } @@ -428,6 +437,7 @@ start_rebuild(int ac, char **av) NULL) < 0) { error = errno; warn("Failed to start rebuild on drive %u", device_id); + close(fd); return (error); } close(fd); @@ -458,19 +468,23 @@ abort_rebuild(int ac, char **av) } error = mfi_lookup_drive(fd, av[1], &device_id); - if (error) + if (error) { + close(fd); return (error); + } /* Get the info for this drive. */ if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) { error = errno; warn("Failed to fetch info for drive %u", device_id); + close(fd); return (error); } /* Check the state, must be REBUILD. */ if (info.fw_state != MFI_PD_STATE_REBUILD) { warn("Drive %d is not in the REBUILD state", device_id); + close(fd); return (EINVAL); } @@ -480,6 +494,7 @@ abort_rebuild(int ac, char **av) NULL) < 0) { error = errno; warn("Failed to abort rebuild on drive %u", device_id); + close(fd); return (error); } close(fd); @@ -509,13 +524,16 @@ drive_progress(int ac, char **av) } error = mfi_lookup_drive(fd, av[1], &device_id); - if (error) + if (error) { + close(fd); return (error); + } /* Get the info for this drive. */ if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) { error = errno; warn("Failed to fetch info for drive %u", device_id); + close(fd); return (error); } close(fd); @@ -570,13 +588,16 @@ drive_clear(int ac, char **av) } error = mfi_lookup_drive(fd, av[1], &device_id); - if (error) + if (error) { + close(fd); return (error); + } /* Get the info for this drive. */ if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) { error = errno; warn("Failed to fetch info for drive %u", device_id); + close(fd); return (error); } @@ -586,6 +607,7 @@ drive_clear(int ac, char **av) warn("Failed to %s clear on drive %u", opcode == MFI_DCMD_PD_CLEAR_START ? "start" : "stop", device_id); + close(fd); return (error); } @@ -626,8 +648,10 @@ drive_locate(int ac, char **av) } error = mfi_lookup_drive(fd, av[1], &device_id); - if (error) + if (error) { + close(fd); return (error); + } mbox_store_device_id(&mbox[0], device_id); @@ -638,6 +662,7 @@ drive_locate(int ac, char **av) warn("Failed to %s locate on drive %u", opcode == MFI_DCMD_PD_LOCATE_START ? "start" : "stop", device_id); + close(fd); return (error); } close(fd); Modified: stable/8/usr.sbin/mfiutil/mfi_evt.c ============================================================================== --- stable/8/usr.sbin/mfiutil/mfi_evt.c Sat Jun 18 22:09:44 2011 (r223273) +++ stable/8/usr.sbin/mfiutil/mfi_evt.c Sat Jun 18 22:12:17 2011 (r223274) @@ -83,6 +83,7 @@ show_logstate(int ac, char **av) if (mfi_event_get_info(fd, &info, NULL) < 0) { error = errno; warn("Failed to get event log info"); + close(fd); return (error); } @@ -550,6 +551,7 @@ show_events(int ac, char **av) if (mfi_event_get_info(fd, &info, NULL) < 0) { error = errno; warn("Failed to get event log info"); + close(fd); return (error); } @@ -570,6 +572,7 @@ show_events(int ac, char **av) if (parse_class(optarg, &filter.members.evt_class) < 0) { error = errno; warn("Error parsing event class"); + close(fd); return (error); } break; @@ -577,6 +580,7 @@ show_events(int ac, char **av) if (parse_locale(optarg, &filter.members.locale) < 0) { error = errno; warn("Error parsing event locale"); + close(fd); return (error); } break; @@ -584,6 +588,7 @@ show_events(int ac, char **av) val = strtol(optarg, &cp, 0); if (*cp != '\0' || val <= 0) { warnx("Invalid event count"); + close(fd); return (EINVAL); } num_events = val; @@ -593,6 +598,7 @@ show_events(int ac, char **av) break; case '?': default: + close(fd); return (EINVAL); } } @@ -604,28 +610,33 @@ show_events(int ac, char **av) (num_events - 1); if (size > getpagesize()) { warnx("Event count is too high"); + close(fd); return (EINVAL); } /* Handle optional start and stop sequence numbers. */ if (ac > 2) { warnx("show events: extra arguments"); + close(fd); return (EINVAL); } if (ac > 0 && parse_seq(&info, av[0], &start) < 0) { error = errno; warn("Error parsing starting sequence number"); + close(fd); return (error); } if (ac > 1 && parse_seq(&info, av[1], &stop) < 0) { error = errno; warn("Error parsing ending sequence number"); + close(fd); return (error); } list = malloc(size); if (list == NULL) { warnx("malloc failed"); + close(fd); return (ENOMEM); } for (seq = start;;) { @@ -633,6 +644,8 @@ show_events(int ac, char **av) &status) < 0) { error = errno; warn("Failed to fetch events"); + free(list); + close(fd); return (error); } if (status == MFI_STAT_NOT_FOUND) { @@ -642,6 +655,8 @@ show_events(int ac, char **av) } if (status != MFI_STAT_OK) { warnx("Error fetching events: %s", mfi_status(status)); + free(list); + close(fd); return (EIO); } Modified: stable/8/usr.sbin/mfiutil/mfi_flash.c ============================================================================== --- stable/8/usr.sbin/mfiutil/mfi_flash.c Sat Jun 18 22:09:44 2011 (r223273) +++ stable/8/usr.sbin/mfiutil/mfi_flash.c Sat Jun 18 22:12:17 2011 (r223274) @@ -136,21 +136,25 @@ flash_adapter(int ac, char **av) return (error); } + buf = NULL; + fd = -1; + if (fstat(flash, &sb) < 0) { error = errno; warn("fstat(%s)", av[1]); - return (error); + goto error; } if (sb.st_size % 1024 != 0 || sb.st_size > 0x7fffffff) { warnx("Invalid flash file size"); - return (EINVAL); + error = EINVAL; + goto error; } fd = mfi_open(mfi_unit); if (fd < 0) { error = errno; warn("mfi_open"); - return (error); + goto error; } /* First, ask the firmware to allocate space for the flash file. */ @@ -158,14 +162,16 @@ flash_adapter(int ac, char **av) mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_OPEN, NULL, 0, mbox, 4, &status); if (status != MFI_STAT_OK) { warnx("Failed to alloc flash memory: %s", mfi_status(status)); - return (EIO); + error = EIO; + goto error; } /* Upload the file 64k at a time. */ buf = malloc(FLASH_BUF_SIZE); if (buf == NULL) { warnx("malloc failed"); - return (ENOMEM); + error = ENOMEM; + goto error; } offset = 0; while (sb.st_size > 0) { @@ -174,7 +180,8 @@ flash_adapter(int ac, char **av) warnx("Bad read from flash file"); mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_CLOSE, NULL, 0, NULL, 0, NULL); - return (ENXIO); + error = ENXIO; + goto error; } mbox_store_word(mbox, offset); @@ -184,12 +191,12 @@ flash_adapter(int ac, char **av) warnx("Flash download failed: %s", mfi_status(status)); mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_CLOSE, NULL, 0, NULL, 0, NULL); - return (ENXIO); + error = ENXIO; + goto error; } sb.st_size -= nread; offset += nread; } - close(flash); /* Kick off the flash. */ printf("WARNING: Firmware flash in progress, do not reboot machine... "); @@ -198,12 +205,17 @@ flash_adapter(int ac, char **av) NULL, 0, &status); if (status != MFI_STAT_OK) { printf("failed:\n\t%s\n", mfi_status(status)); - return (ENXIO); + error = ENXIO; + goto error; } printf("finished\n"); error = display_pending_firmware(fd); - close(fd); +error: + free(buf); + if (fd >= 0) + close(fd); + close(flash); return (error); } Modified: stable/8/usr.sbin/mfiutil/mfi_patrol.c ============================================================================== --- stable/8/usr.sbin/mfiutil/mfi_patrol.c Sat Jun 18 22:09:44 2011 (r223273) +++ stable/8/usr.sbin/mfiutil/mfi_patrol.c Sat Jun 18 22:12:17 2011 (r223274) @@ -96,8 +96,10 @@ show_patrol(int ac, char **av) time(&now); mfi_get_time(fd, &at); error = patrol_get_props(fd, &prop); - if (error) + if (error) { + close(fd); return (error); + } printf("Operation Mode: "); switch (prop.op_mode) { case MFI_PR_OPMODE_AUTO: @@ -128,6 +130,7 @@ show_patrol(int ac, char **av) sizeof(status), NULL, 0, NULL) < 0) { error = errno; warn("Failed to get patrol read properties"); + close(fd); return (error); } printf("Runs Completed: %u\n", status.num_iteration); @@ -153,6 +156,7 @@ show_patrol(int ac, char **av) if (mfi_pd_get_list(fd, &list, NULL) < 0) { error = errno; warn("Failed to get drive list"); + close(fd); return (error); } @@ -165,6 +169,8 @@ show_patrol(int ac, char **av) error = errno; warn("Failed to fetch info for drive %u", list->addr[i].device_id); + free(list); + close(fd); return (error); } if (info.prog_info.active & MFI_PD_PROGRESS_PATROL) { @@ -174,6 +180,7 @@ show_patrol(int ac, char **av) &info.prog_info.patrol); } } + free(list); } close(fd); @@ -198,6 +205,7 @@ start_patrol(int ac, char **av) 0) { error = errno; warn("Failed to start patrol read"); + close(fd); return (error); } @@ -223,6 +231,7 @@ stop_patrol(int ac, char **av) 0) { error = errno; warn("Failed to stop patrol read"); + close(fd); return (error); } @@ -290,8 +299,10 @@ patrol_config(int ac, char **av) } error = patrol_get_props(fd, &prop); - if (error) + if (error) { + close(fd); return (error); + } prop.op_mode = op_mode; if (op_mode == MFI_PR_OPMODE_AUTO) { if (ac > 2) @@ -299,8 +310,10 @@ patrol_config(int ac, char **av) if (ac > 3) { time(&now); mfi_get_time(fd, &at); - if (at == 0) + if (at == 0) { + close(fd); return (ENXIO); + } prop.next_exec = at + next_exec; printf("Starting next patrol read at %s", adapter_time(now, at, prop.next_exec)); @@ -310,6 +323,7 @@ patrol_config(int ac, char **av) sizeof(prop), NULL, 0, NULL) < 0) { error = errno; warn("Failed to set patrol read properties"); + close(fd); return (error); } Modified: stable/8/usr.sbin/mfiutil/mfi_show.c ============================================================================== --- stable/8/usr.sbin/mfiutil/mfi_show.c Sat Jun 18 22:09:44 2011 (r223273) +++ stable/8/usr.sbin/mfiutil/mfi_show.c Sat Jun 18 22:12:17 2011 (r223274) @@ -71,6 +71,7 @@ show_adapter(int ac, char **av) if (mfi_ctrl_get_info(fd, &info, NULL) < 0) { error = errno; warn("Failed to get controller info"); + close(fd); return (error); } printf("mfi%d Adapter:\n", mfi_unit); @@ -158,10 +159,12 @@ show_battery(int ac, char **av) sizeof(cap), NULL, 0, &status) < 0) { if (status == MFI_STAT_NO_HW_PRESENT) { printf("mfi%d: No battery present\n", mfi_unit); + close(fd); return (0); } error = errno; warn("Failed to get capacity info"); + close(fd); return (error); } @@ -169,13 +172,16 @@ show_battery(int ac, char **av) sizeof(design), NULL, 0, NULL) < 0) { error = errno; warn("Failed to get design info"); + close(fd); return (error); } if (mfi_dcmd_command(fd, MFI_DCMD_BBU_GET_STATUS, &stat, sizeof(stat), NULL, 0, NULL) < 0) { + error = errno; warn("Failed to get status"); - return (errno); + close(fd); + return (error); } printf("mfi%d: Battery State:\n", mfi_unit); @@ -307,6 +313,7 @@ show_config(int ac, char **av) if (mfi_config_read(fd, &config) < 0) { error = errno; warn("Failed to get config"); + close(fd); return (error); } @@ -375,6 +382,7 @@ show_config(int ac, char **av) printf("\n"); p += config->spares_size; } + free(config); close(fd); return (0); @@ -405,6 +413,7 @@ show_volumes(int ac, char **av) if (mfi_ld_get_list(fd, &list, NULL) < 0) { error = errno; warn("Failed to get volume list"); + close(fd); return (error); } @@ -430,6 +439,7 @@ show_volumes(int ac, char **av) error = errno; warn("Failed to get info for volume %d", list.ld_list[i].ld.v.target_id); + close(fd); return (error); } printf("%6s ", @@ -482,10 +492,11 @@ show_drives(int ac, char **av) return (error); } *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***