Index: head/include/paths.h =================================================================== --- head/include/paths.h (revision 297204) +++ head/include/paths.h (revision 297205) @@ -1,144 +1,145 @@ /* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. * * @(#)paths.h 8.1 (Berkeley) 6/2/93 * $FreeBSD$ */ #ifndef _PATHS_H_ #define _PATHS_H_ #include /* Default search path. */ #define _PATH_DEFPATH "/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" /* All standard utilities path. */ #define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin" /* Locate system binaries. */ #define _PATH_SYSPATH "/sbin:/usr/sbin" #define _PATH_BSHELL "/bin/sh" #define _PATH_CAPABILITY "/etc/capability" #define _PATH_CAPABILITY_DB "/etc/capability.db" #define _PATH_CONSOLE "/dev/console" #define _PATH_CP "/bin/cp" #define _PATH_CSHELL "/bin/csh" #define _PATH_CSMAPPER "/usr/share/i18n/csmapper" #define _PATH_DEFTAPE "/dev/sa0" #define _PATH_DEVGPIOC "/dev/gpioc" #define _PATH_DEVNULL "/dev/null" #define _PATH_DEVZERO "/dev/zero" #define _PATH_DRUM "/dev/drum" #define _PATH_ESDB "/usr/share/i18n/esdb" #define _PATH_ETC "/etc" +#define _PATH_FIRMWARE "/usr/share/firmware" #define _PATH_FTPUSERS "/etc/ftpusers" #define _PATH_FWMEM "/dev/fwmem" #define _PATH_GBDE "/sbin/gbde" #define _PATH_GELI "/sbin/geli" #define _PATH_HALT "/sbin/halt" #ifdef COMPAT_32BIT #define _PATH_I18NMODULE "/usr/lib32/i18n" #else #define _PATH_I18NMODULE "/usr/lib/i18n" #endif #define _PATH_IFCONFIG "/sbin/ifconfig" #define _PATH_KMEM "/dev/kmem" #define _PATH_LIBMAP_CONF "/etc/libmap.conf" #define _PATH_LOCALE "/usr/share/locale" #define _PATH_LOGIN "/usr/bin/login" #define _PATH_MAILDIR "/var/mail" #define _PATH_MAN "/usr/share/man" #define _PATH_MDCONFIG "/sbin/mdconfig" #define _PATH_MEM "/dev/mem" #define _PATH_MKSNAP_FFS "/sbin/mksnap_ffs" #define _PATH_MOUNT "/sbin/mount" #define _PATH_NEWFS "/sbin/newfs" #define _PATH_NOLOGIN "/var/run/nologin" #define _PATH_RCP "/bin/rcp" #define _PATH_REBOOT "/sbin/reboot" #define _PATH_RLOGIN "/usr/bin/rlogin" #define _PATH_RM "/bin/rm" #define _PATH_RSH "/usr/bin/rsh" #define _PATH_SENDMAIL "/usr/sbin/sendmail" #define _PATH_SHELLS "/etc/shells" #define _PATH_TTY "/dev/tty" #define _PATH_UNIX "don't use _PATH_UNIX" #define _PATH_UFSSUSPEND "/dev/ufssuspend" #define _PATH_VI "/usr/bin/vi" #define _PATH_WALL "/usr/bin/wall" /* Provide trailing slash, since mostly used for building pathnames. */ #define _PATH_DEV "/dev/" #define _PATH_TMP "/tmp/" #define _PATH_VARDB "/var/db/" #define _PATH_VARRUN "/var/run/" #define _PATH_VARTMP "/var/tmp/" #define _PATH_YP "/var/yp/" #define _PATH_UUCPLOCK "/var/spool/lock/" /* How to get the correct name of the kernel. */ __BEGIN_DECLS const char *getbootfile(void); __END_DECLS #ifdef RESCUE #undef _PATH_DEFPATH #define _PATH_DEFPATH "/rescue:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" #undef _PATH_STDPATH #define _PATH_STDPATH "/rescue:/usr/bin:/bin:/usr/sbin:/sbin" #undef _PATH_SYSPATH #define _PATH_SYSPATH "/rescue:/sbin:/usr/sbin" #undef _PATH_BSHELL #define _PATH_BSHELL "/rescue/sh" #undef _PATH_CP #define _PATH_CP "/rescue/cp" #undef _PATH_CSHELL #define _PATH_CSHELL "/rescue/csh" #undef _PATH_HALT #define _PATH_HALT "/rescue/halt" #undef _PATH_IFCONFIG #define _PATH_IFCONFIG "/rescue/ifconfig" #undef _PATH_MDCONFIG #define _PATH_MDCONFIG "/rescue/mdconfig" #undef _PATH_MOUNT #define _PATH_MOUNT "/rescue/mount" #undef _PATH_NEWFS #define _PATH_NEWFS "/rescue/newfs" #undef _PATH_RCP #define _PATH_RCP "/rescue/rcp" #undef _PATH_REBOOT #define _PATH_REBOOT "/rescue/reboot" #undef _PATH_RM #define _PATH_RM "/rescue/rm" #undef _PATH_VI #define _PATH_VI "/rescue/vi" #undef _PATH_WALL #define _PATH_WALL "/rescue/wall" #endif /* RESCUE */ #endif /* !_PATHS_H_ */ Index: head/usr.sbin/uathload/uathload.c =================================================================== --- head/usr.sbin/uathload/uathload.c (revision 297204) +++ head/usr.sbin/uathload/uathload.c (revision 297205) @@ -1,229 +1,229 @@ /*- * Copyright (c) 2006 Sam Leffler, Errno Consulting * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any * redistribution must be conditioned upon including a substantially * similar Disclaimer requirement for further binary redistribution. * * NO WARRANTY * 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 NONINFRINGEMENT, MERCHANTIBILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. * * $FreeBSD$ */ /* * Atheros AR5523 USB Station Firmware downloader. * * uathload -d ugen-device [firmware-file] * * Intended to be called from devd on device discovery. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* all fields are big endian */ struct uath_fwmsg { uint32_t flags; #define UATH_WRITE_BLOCK (1 << 4) uint32_t len; #define UATH_MAX_FWBLOCK_SIZE 2048 uint32_t total; uint32_t remain; uint32_t rxtotal; uint32_t pad[123]; } __packed; #define UATH_DATA_TIMEOUT 10000 #define UATH_CMD_TIMEOUT 1000 #define VERBOSE(_fmt, ...) do { \ if (verbose) { \ printf(_fmt, __VA_ARGS__); \ fflush(stdout); \ } \ } while (0) extern uint8_t _binary_ar5523_bin_start; extern uint8_t _binary_ar5523_bin_end; static int getdevname(const char *devname, char *msgdev, char *datadev) { char *bn, *dn; dn = dirname(devname); if (dn == NULL) return (-1); bn = basename(devname); if (bn == NULL || strncmp(bn, "ugen", 4)) return (-1); bn += 4; /* NB: pipes are hardcoded */ snprintf(msgdev, 256, "%s/usb/%s.1", dn, bn); snprintf(datadev, 256, "%s/usb/%s.2", dn, bn); return (0); } static void usage(void) { errx(-1, "usage: uathload [-v] -d devname [firmware]"); } int main(int argc, char *argv[]) { const char *fwname, *devname; char msgdev[256], datadev[256]; struct uath_fwmsg txmsg, rxmsg; char *txdata; struct stat sb; int msg, data, fw, timeout, b, c; int bufsize = 512, verbose = 0; ssize_t len; devname = NULL; while ((c = getopt(argc, argv, "d:v")) != -1) { switch (c) { case 'd': devname = optarg; break; case 'v': verbose = 1; break; default: usage(); /*NOTREACHED*/ } } argc -= optind; argv += optind; if (devname == NULL) errx(-1, "No device name; use -d to specify the ugen device"); if (argc > 1) usage(); if (argc == 1) fwname = argv[0]; else - fwname = "/usr/share/firmware/ar5523.bin"; + fwname = _PATH_FIRMWARE "/ar5523.bin"; fw = open(fwname, O_RDONLY, 0); if (fw < 0) err(-1, "open(%s)", fwname); if (fstat(fw, &sb) < 0) err(-1, "fstat(%s)", fwname); txdata = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fw, 0); if (txdata == MAP_FAILED) err(-1, "mmap(%s)", fwname); len = sb.st_size; /* XXX verify device is an AR5005 part */ if (getdevname(devname, msgdev, datadev)) err(-1, "getdevname error"); msg = open(msgdev, O_RDWR, 0); if (msg < 0) err(-1, "open(%s)", msgdev); timeout = UATH_DATA_TIMEOUT; if (ioctl(msg, USB_SET_RX_TIMEOUT, &timeout) < 0) err(-1, "%s: USB_SET_RX_TIMEOUT(%u)", msgdev, UATH_DATA_TIMEOUT); if (ioctl(msg, USB_SET_RX_BUFFER_SIZE, &bufsize) < 0) err(-1, "%s: USB_SET_RX_BUFFER_SIZE(%u)", msgdev, bufsize); data = open(datadev, O_WRONLY, 0); if (data < 0) err(-1, "open(%s)", datadev); timeout = UATH_DATA_TIMEOUT; if (ioctl(data, USB_SET_TX_TIMEOUT, &timeout) < 0) err(-1, "%s: USB_SET_TX_TIMEOUT(%u)", datadev, UATH_DATA_TIMEOUT); VERBOSE("Load firmware %s to %s\n", fwname, devname); bzero(&txmsg, sizeof (struct uath_fwmsg)); txmsg.flags = htobe32(UATH_WRITE_BLOCK); txmsg.total = htobe32(len); b = 0; while (len > 0) { int mlen; mlen = len; if (mlen > UATH_MAX_FWBLOCK_SIZE) mlen = UATH_MAX_FWBLOCK_SIZE; txmsg.remain = htobe32(len - mlen); txmsg.len = htobe32(mlen); /* send firmware block meta-data */ VERBOSE("send block %2u: %zd bytes remaining", b, len - mlen); if (write(msg, &txmsg, sizeof(txmsg)) != sizeof(txmsg)) { VERBOSE("%s", "\n"); err(-1, "error sending msg (%s)", msgdev); break; } /* send firmware block data */ VERBOSE("%s", "\n : data..."); if (write(data, txdata, mlen) != mlen) { VERBOSE("%s", "\n"); err(-1, "error sending data (%s)", datadev); break; } /* wait for ack from firmware */ VERBOSE("%s", "\n : wait for ack..."); bzero(&rxmsg, sizeof(rxmsg)); if (read(msg, &rxmsg, sizeof(rxmsg)) != sizeof(rxmsg)) { VERBOSE("%s", "\n"); err(-1, "error reading msg (%s)", msgdev); break; } VERBOSE("flags=0x%x total=%d\n", be32toh(rxmsg.flags), be32toh(rxmsg.rxtotal)); len -= mlen; txdata += mlen; b++; } sleep(1); close(fw); close(msg); close(data); return 0; }