Hello Julian, On Sunday, June 2, 2019 1:43:52 PM CEST Julian Calaby wrote: > On Sun, Jun 2, 2019 at 8:24 PM Christian Lamparter <chunkeey@xxxxxxxxx> wrote: > > > > Some devices (like the Cisco Meraki Z1 Cloud Managed Teleworker Gateway) > > need to be able to initialize the PCIe wifi device. Normally, this is done > > during the early stages of booting linux, because the necessary init code > > is read from the memory mapped SPI and passed to pci_enable_ath9k_fixup. > > However, this isn't possible for devices which have the init code for the > > Atheros chip stored on NAND in an UBI volume. Hence, this module can be > > used to initialize the chip when the user-space is ready to extract the > > init code. > > > > Martin Blumenstingl prodived the following fixes: > > owl-loader: add support for OWL emulation PCI devices > > owl-loader: don't re-scan the bus when ath9k_pci_fixup failed > > owl-loader: use dev_* instead of pr_* logging functions > > owl-loader: auto-generate the eeprom filename as fallback > > owl-loader: add a debug message when swapping the eeprom data > > owl-loader: add missing newlines in log messages > > > > Signed-off-by: Christian Lamparter <chunkeey@xxxxxxxxx> > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@xxxxxxxxxxxxxx> > > Two questions: > > 1. This seems complicated enough that the functions introduced should > probably go into a separate .c file, maybe "noeeprom.c", with a header > file with all the ifdef / config magic in it. In openwrt we called it owl-loader.c and it's a separate module there. But I don't think that noeeprom.c is that great since ath9k also supports AHB and htc_usb, so from this perspective it would mean: pci_init_noeeprom.c ? (As AR5008, AR9160 and AR92XX seem to be affected). > 2. This smells almost like a completely separate PCI(e) driver for > cards in a "weird" state. It's in the Datasheet that the device initializes into this state. See AR9280 6.1.2 DEVICE_ID. "... if the EEPROM content is not valid, a value of 0XFF1C returns when read from the register". This would also mean that this routine can be used to resurrect aging AR9280 cards that have a failed eeprom or are from APPLE, see this thread: <https://www.mail-archive.com/ath9k-devel@xxxxxxxxxxxxxxx/msg03918.html> "does anyone know whether 168c:ff1c can be supported by the current ath9k driver? It isn't listed with the PCI IDs in the source. I bought it off eBay as "Apple" AR5008. It is a PCI Express card with 3 Antenna connectors and lots of Apple stampings on it. lspci says:" > Is there anything you're using from ath9k > other than the eeprom file naming? and is that really useful? Won't > the eeprom files be device specific and therefore could always use the > device name fallback? Please take a look at the commit message. Unfortunately the Z1 stores its calibration data in a ubi volume, these can't be easily read without interfacing with either ubi or the vfs. In the future, simpler devices that have it on SPI-NOR in a mtd partition can setup a nvmem provider and the code can have a nvmem-consumer. (see attached patch). Note: There are also devices with mutliple ath9k pci(e) chips (usually one 2.4Ghz and one 5GHz), so a generic "ath9k" name is too short and the pciids of both are the same. That's why the pci-bus location is currently used for the eeprom name identifier. Regards, Christian --- Note: nvmem dts is not finalized. See commit 517f14d9cf3533d5ab4fded195ab6f80a92e378f Author: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx> Date: Fri Nov 30 11:53:25 2018 +0000 nvmem: add new config option for details why adding something like this unfinished patch just does not makes sense (yet). --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c @@ -21,6 +21,7 @@ #include <linux/module.h> #include <linux/firmware.h> #include <linux/completion.h> +#include <linux/nvmem-consumer.h> #include <linux/ath9k_platform.h> #include "ath9k.h" #include "eeprom.h" @@ -1053,6 +1054,7 @@ static int ath_pci_fixup_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct ath_pci_fixup_ctx *ctx; + struct nvmem_cell *cell; const char *eeprom_name; int err = 0; @@ -1062,6 +1064,21 @@ static int ath_pci_fixup_probe(struct pci_dev *pdev, pcim_pin_device(pdev); + cell = nvmem_cell_get(&pdev->dev, "caldata"); + if (!IS_ERR(cell)) { + void *value; + size_t len; + + value = nvmem_cell_read(cell, &len); + if (!IS_ERR(value)) { + err = ath_pci_fixup(pdev, value, len); + kfree(value); + } else + err = -EINVAL; + nvmem_cell_put(cell); + return err; + } + eeprom_name = ath_pci_fixup_get_eeprom_name(pdev); if (!eeprom_name) { dev_err(&pdev->dev, "no eeprom filename found.\n");