svn commit: r206290 - stable/8/sys/dev/usb/wlan

Andrew Thompson thompsa at FreeBSD.org
Tue Apr 6 23:15:17 UTC 2010


Author: thompsa
Date: Tue Apr  6 23:15:16 2010
New Revision: 206290
URL: http://svn.freebsd.org/changeset/base/206290

Log:
  MFC r203137
  
   Release the firmware after loading to the device.

Modified:
  stable/8/sys/dev/usb/wlan/if_run.c
  stable/8/sys/dev/usb/wlan/if_runvar.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)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/usb/wlan/if_run.c
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_run.c	Tue Apr  6 23:14:43 2010	(r206289)
+++ stable/8/sys/dev/usb/wlan/if_run.c	Tue Apr  6 23:15:16 2010	(r206290)
@@ -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: stable/8/sys/dev/usb/wlan/if_runvar.h
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_runvar.h	Tue Apr  6 23:14:43 2010	(r206289)
+++ stable/8/sys/dev/usb/wlan/if_runvar.h	Tue Apr  6 23:15:16 2010	(r206290)
@@ -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;


More information about the svn-src-all mailing list