Send TxCap and WiFi calibration blobs to the chip.
authorpatrick <patrick@openbsd.org>
Mon, 27 Dec 2021 13:54:39 +0000 (13:54 +0000)
committerpatrick <patrick@openbsd.org>
Mon, 27 Dec 2021 13:54:39 +0000 (13:54 +0000)
sys/dev/ic/bwfm.c
sys/dev/ic/bwfmvar.h
sys/dev/pci/if_bwfm_pci.c

index 1087892..fbc7285 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bwfm.c,v 1.94 2021/12/27 10:59:20 patrick Exp $ */
+/* $OpenBSD: bwfm.c,v 1.95 2021/12/27 13:54:39 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
  * Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
@@ -70,7 +70,7 @@ void   bwfm_update_nodes(struct bwfm_softc *);
 int     bwfm_ioctl(struct ifnet *, u_long, caddr_t);
 int     bwfm_media_change(struct ifnet *);
 
-void    bwfm_process_clm_blob(struct bwfm_softc *);
+void    bwfm_process_blob(struct bwfm_softc *, char *, u_char **, size_t *);
 
 int     bwfm_chip_attach(struct bwfm_softc *);
 void    bwfm_chip_detach(struct bwfm_softc *);
@@ -264,7 +264,9 @@ bwfm_preinit(struct bwfm_softc *sc)
 
        printf("%s: address %s\n", DEVNAME(sc), ether_sprintf(ic->ic_myaddr));
 
-       bwfm_process_clm_blob(sc);
+       bwfm_process_blob(sc, "clmload", &sc->sc_clm, &sc->sc_clmsize);
+       bwfm_process_blob(sc, "txcapload", &sc->sc_txcap, &sc->sc_txcapsize);
+       bwfm_process_blob(sc, "calload", &sc->sc_cal, &sc->sc_calsize);
 
        if (bwfm_fwvar_var_get_int(sc, "nmode", &nmode))
                nmode = 0;
@@ -2970,16 +2972,17 @@ bwfm_nvram_convert(int node, u_char **bufp, size_t *sizep, size_t *newlenp)
 }
 
 void
-bwfm_process_clm_blob(struct bwfm_softc *sc)
+bwfm_process_blob(struct bwfm_softc *sc, char *var, u_char **blob,
+    size_t *blobsize)
 {
        struct bwfm_dload_data *data;
        size_t off, remain, len;
 
-       if (sc->sc_clm == NULL || sc->sc_clmsize == 0)
+       if (*blob == NULL || *blobsize == 0)
                return;
 
        off = 0;
-       remain = sc->sc_clmsize;
+       remain = *blobsize;
        data = malloc(sizeof(*data) + BWFM_DLOAD_MAX_LEN, M_TEMP, M_WAITOK);
 
        while (remain) {
@@ -2993,11 +2996,12 @@ bwfm_process_clm_blob(struct bwfm_softc *sc)
                data->type = htole16(BWFM_DLOAD_TYPE_CLM);
                data->len = htole32(len);
                data->crc = 0;
-               memcpy(data->data, sc->sc_clm + off, len);
+               memcpy(data->data, *blob + off, len);
 
-               if (bwfm_fwvar_var_set_data(sc, "clmload", data,
+               if (bwfm_fwvar_var_set_data(sc, var, data,
                    sizeof(*data) + len)) {
-                       printf("%s: could not load CLM blob\n", DEVNAME(sc));
+                       printf("%s: could not load blob (%s)\n", DEVNAME(sc),
+                           var);
                        goto out;
                }
 
@@ -3007,9 +3011,9 @@ bwfm_process_clm_blob(struct bwfm_softc *sc)
 
 out:
        free(data, M_TEMP, sizeof(*data) + BWFM_DLOAD_MAX_LEN);
-       free(sc->sc_clm, M_DEVBUF, sc->sc_clmsize);
-       sc->sc_clm = NULL;
-       sc->sc_clmsize = 0;
+       free(*blob, M_DEVBUF, *blobsize);
+       *blob = NULL;
+       *blobsize = 0;
 }
 
 #if defined(__HAVE_FDT)
@@ -3118,5 +3122,16 @@ bwfm_loadfirmware(struct bwfm_softc *sc, const char *chip, const char *bus,
                loadfirmware(name, &sc->sc_clm, &sc->sc_clmsize);
        }
 
+       if (sysname != NULL) {
+               r = snprintf(name, sizeof(name), "brcmfmac%s%s.%s.txcap_blob",
+                   chip, bus, sysname);
+               if (r > 0 && r < sizeof(name))
+                       loadfirmware(name, &sc->sc_txcap, &sc->sc_txcapsize);
+       }
+       if (sc->sc_txcapsize == 0) {
+               snprintf(name, sizeof(name), "brcmfmac%s%s.txcap_blob", chip, bus);
+               loadfirmware(name, &sc->sc_txcap, &sc->sc_txcapsize);
+       }
+
        return 0;
 }
index 5997138..3f79789 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bwfmvar.h,v 1.27 2021/12/26 20:50:17 patrick Exp $ */
+/* $OpenBSD: bwfmvar.h,v 1.28 2021/12/27 13:54:39 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
  * Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
@@ -186,6 +186,10 @@ struct bwfm_softc {
 
        u_char                  *sc_clm;
        size_t                   sc_clmsize;
+       u_char                  *sc_txcap;
+       size_t                   sc_txcapsize;
+       u_char                  *sc_cal;
+       size_t                   sc_calsize;
        int                      sc_key_tasks;
 };
 
index de65a18..c8d326a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_bwfm_pci.c,v 1.60 2021/12/27 12:03:59 patrick Exp $        */
+/*     $OpenBSD: if_bwfm_pci.c,v 1.61 2021/12/27 13:54:39 patrick Exp $        */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
  * Copyright (c) 2017 Patrick Wildt <patrick@blueri.se>
@@ -399,6 +399,16 @@ bwfm_pci_attach(struct device *parent, struct device *self, void *aux)
 
 #if defined(__HAVE_FDT)
        sc->sc_sc.sc_node = PCITAG_NODE(pa->pa_tag);
+       if (sc->sc_sc.sc_node) {
+               if (OF_getproplen(sc->sc_sc.sc_node, "brcm,cal-blob") > 0) {
+                       sc->sc_sc.sc_calsize = OF_getproplen(sc->sc_sc.sc_node,
+                           "brcm,cal-blob");
+                       sc->sc_sc.sc_cal = malloc(sc->sc_sc.sc_calsize,
+                           M_DEVBUF, M_WAITOK);
+                       OF_getprop(sc->sc_sc.sc_node, "brcm,cal-blob",
+                           sc->sc_sc.sc_cal, sc->sc_sc.sc_calsize);
+               }
+       }
 #endif
 
        sc->sc_sc.sc_bus_ops = &bwfm_pci_bus_ops;