From owner-svn-src-head@FreeBSD.ORG Thu Jan 28 22:46:05 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 11DAE106566C; Thu, 28 Jan 2010 22:46:05 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 004588FC1D; Thu, 28 Jan 2010 22:46:05 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o0SMk4eY075505; Thu, 28 Jan 2010 22:46:04 GMT (envelope-from thompsa@svn.freebsd.org) Received: (from thompsa@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o0SMk4oZ075502; Thu, 28 Jan 2010 22:46:04 GMT (envelope-from thompsa@svn.freebsd.org) Message-Id: <201001282246.o0SMk4oZ075502@svn.freebsd.org> From: Andrew Thompson Date: Thu, 28 Jan 2010 22:46:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r203137 - head/sys/dev/usb/wlan X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Jan 2010 22:46:05 -0000 Author: thompsa Date: Thu Jan 28 22:46:04 2010 New Revision: 203137 URL: http://svn.freebsd.org/changeset/base/203137 Log: Release the firmware after loading to the device. Modified: head/sys/dev/usb/wlan/if_run.c head/sys/dev/usb/wlan/if_runvar.h Modified: head/sys/dev/usb/wlan/if_run.c ============================================================================== --- head/sys/dev/usb/wlan/if_run.c Thu Jan 28 22:28:59 2010 (r203136) +++ head/sys/dev/usb/wlan/if_run.c Thu Jan 28 22:46:04 2010 (r203137) @@ -803,22 +803,25 @@ int run_load_microcode(struct run_softc *sc) { usb_device_request_t req; + const struct firmware *fw; const u_char *base; uint32_t tmp; int ntries, error; const uint64_t *temp; uint64_t bytes; - if((sc->fwp = firmware_get("runfw")) == NULL){ + fw = firmware_get("runfw"); + if(fw == NULL){ printf("%s: failed loadfirmware of file %s (error %d)\n", device_get_nameunit(sc->sc_dev), "runfw", ENOENT); return ENOENT; } - if (sc->fwp->datasize != 8192) { + if (fw->datasize != 8192) { printf("%s: invalid firmware size (should be 8KB)\n", device_get_nameunit(sc->sc_dev)); - return EINVAL; + error = EINVAL; + goto fail; } /* @@ -827,7 +830,7 @@ run_load_microcode(struct run_softc *sc) * first half (4KB) is for rt2870, * last half is for rt3071. */ - base = sc->fwp->data; + base = fw->data; if ((sc->mac_rev >> 16) != 0x2860 && (sc->mac_rev >> 16) != 0x2872 && (sc->mac_rev >> 16) != 0x3070 && @@ -840,10 +843,14 @@ run_load_microcode(struct run_softc *sc) device_get_nameunit(sc->sc_dev)); /* cheap sanity check */ - temp = sc->fwp->data; + temp = fw->data; bytes = *temp; - if(bytes != be64toh(0xffffff0210280210)) - return EINVAL; + if(bytes != be64toh(0xffffff0210280210)) { + printf("%s: firmware checksum failed\n", + device_get_nameunit(sc->sc_dev)); + error = EINVAL; + goto fail; + } run_read(sc, RT2860_ASIC_VER_ID, &tmp); /* write microcode image */ @@ -856,19 +863,23 @@ run_load_microcode(struct run_softc *sc) USETW(req.wValue, 8); USETW(req.wIndex, 0); USETW(req.wLength, 0); - if ((error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL)) != 0) - return error; + if ((error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL)) != 0) { + printf("%s: firmware reset failed\n", + device_get_nameunit(sc->sc_dev)); + goto fail; + } run_delay(sc, 10); run_write(sc, RT2860_H2M_MAILBOX, 0); if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_BOOT, 0)) != 0) - return error; + goto fail; /* wait until microcontroller is ready */ for (ntries = 0; ntries < 1000; ntries++) { - if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0) - return error; + if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0) { + goto fail; + } if (tmp & RT2860_MCU_READY) break; run_delay(sc, 10); @@ -876,11 +887,14 @@ run_load_microcode(struct run_softc *sc) if (ntries == 1000) { printf("%s: timeout waiting for MCU to initialize\n", device_get_nameunit(sc->sc_dev)); - return ETIMEDOUT; + error = ETIMEDOUT; + goto fail; } DPRINTF("microcode successfully loaded after %d tries\n", ntries); - return 0; +fail: + firmware_put(fw, FIRMWARE_UNLOAD); + return (error); } int Modified: head/sys/dev/usb/wlan/if_runvar.h ============================================================================== --- head/sys/dev/usb/wlan/if_runvar.h Thu Jan 28 22:28:59 2010 (r203136) +++ head/sys/dev/usb/wlan/if_runvar.h Thu Jan 28 22:46:04 2010 (r203137) @@ -154,8 +154,6 @@ struct run_softc { int (*sc_srom_read)(struct run_softc *, uint16_t, uint16_t *); - const struct firmware *fwp; - uint32_t mac_rev; uint8_t rf_rev; uint8_t freq;