Author: adrian
Date: Fri Apr 13 08:48:38 2012
New Revision: 234218
URL: http://svn.freebsd.org/changeset/base/234218

Log:
  Introduce the ability to grab local EEPROM data from the firmware(9)
  interface.
  
  * Introduce a device hint, 'eeprom_firmware', which is the name of firmware
    to lookup.
  * If the lookup succeeds, take a copy of it and use it as the eeprom data.
  
  This isn't enabled by default - you have to define ATH_EEPROM_FIRMWARE.
  I'll add it to the configuration variables in a later commit.
  
  TODO:
  
  * just keep a firmware reference in ath_softc, and remove the need to
    waste the extra memory in having sc_eepromdata be a malloc()ed block.

Modified:
  head/sys/dev/ath/if_ath_pci.c

Modified: head/sys/dev/ath/if_ath_pci.c
==============================================================================
--- head/sys/dev/ath/if_ath_pci.c       Fri Apr 13 08:45:50 2012        
(r234217)
+++ head/sys/dev/ath/if_ath_pci.c       Fri Apr 13 08:48:38 2012        
(r234218)
@@ -60,6 +60,14 @@ __FBSDID("$FreeBSD$");
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
 
+/* #define     ATH_EEPROM_FIRMWARE */
+
+/* For EEPROM firmware */
+#ifdef ATH_EEPROM_FIRMWARE
+#include <sys/linker.h>
+#include <sys/firmware.h>
+#endif /* ATH_EEPROM_FIRMWARE */
+
 /*
  * PCI glue.
  */
@@ -123,6 +131,10 @@ ath_pci_attach(device_t dev)
        struct ath_softc *sc = &psc->sc_sc;
        int error = ENXIO;
        int rid;
+#ifdef ATH_EEPROM_FIRMWARE
+       const struct firmware *fw = NULL;
+       const char *buf;
+#endif
 
        sc->sc_dev = dev;
 
@@ -191,6 +203,37 @@ ath_pci_attach(device_t dev)
                goto bad3;
        }
 
+#ifdef ATH_EEPROM_FIRMWARE
+       /*
+        * If there's an EEPROM firmware image, load that in.
+        */
+       if (resource_string_value(device_get_name(dev), device_get_unit(dev),
+           "eeprom_firmware", &buf) == 0) {
+               if (bootverbose)
+                       device_printf(dev, "%s: looking up firmware @ '%s'\n",
+                           __func__, buf);
+
+               fw = firmware_get(buf);
+               if (fw == NULL) {
+                       device_printf(dev, "%s: couldn't find firmware\n",
+                           __func__);
+                       goto bad3;
+               }
+
+               device_printf(dev, "%s: EEPROM firmware @ %p\n",
+                   __func__, fw->data);
+               sc->sc_eepromdata =
+                   malloc(fw->datasize, M_TEMP, M_WAITOK | M_ZERO);
+               if (! sc->sc_eepromdata) {
+                       device_printf(dev, "%s: can't malloc eepromdata\n",
+                           __func__);
+                       goto bad3;
+               }
+               memcpy(sc->sc_eepromdata, fw->data, fw->datasize);
+               firmware_put(fw, 0);
+       }
+#endif /* ATH_EEPROM_FIRMWARE */
+
        ATH_LOCK_INIT(sc);
        ATH_PCU_LOCK_INIT(sc);
 
@@ -234,6 +277,9 @@ ath_pci_detach(device_t dev)
        bus_dma_tag_destroy(sc->sc_dmat);
        bus_release_resource(dev, SYS_RES_MEMORY, BS_BAR, psc->sc_sr);
 
+       if (sc->sc_eepromdata)
+               free(sc->sc_eepromdata, M_TEMP);
+
        ATH_PCU_LOCK_DESTROY(sc);
        ATH_LOCK_DESTROY(sc);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to