Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 030d6753 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Jeff Garzik
Browse files

[PATCH] spidernet: read firmware from the OF device tree



request_firmware() is sometimes problematic, especially
in initramfs, reading the firmware from Open Firmware
is much preferrable.

We still try to get the firmware from the file system
first, in order to support old SLOF releases and to allow
updates of the spidernet firmware without reflashing
the system.

From: Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
Signed-off-by: default avatarJens Osterkamp <Jens.Osterkamp@de.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arndb@de.ibm.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 0d3ea166
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -1895,16 +1895,27 @@ spider_net_download_firmware(struct spider_net_card *card,
static int
spider_net_init_firmware(struct spider_net_card *card)
{
	const struct firmware *firmware;
	struct firmware *firmware;
	struct device_node *dn;
	u8 *fw_prop;
	int err = -EIO;

	if (request_firmware(&firmware,
	if (request_firmware((const struct firmware **)&firmware,
			     SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) < 0) {
		if (netif_msg_probe(card))
			pr_err("Couldn't read in sequencer data file %s.\n",
			       SPIDER_NET_FIRMWARE_NAME);
		firmware = NULL;

		dn = pci_device_to_OF_node(card->pdev);
		if (!dn)
			goto out;

		fw_prop = (u8 *)get_property(dn, "firmware", NULL);
		if (!fw_prop)
			goto out;

		memcpy(firmware->data, fw_prop, 6 * SPIDER_NET_FIRMWARE_LEN * sizeof(u32));
		firmware->size = 6 * SPIDER_NET_FIRMWARE_LEN * sizeof(u32);
	}

	if (firmware->size != 6 * SPIDER_NET_FIRMWARE_LEN * sizeof(u32)) {