From 030d6753f8b6251927330431a7e5f0ac86bc6da9 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Thu, 12 Jan 2006 17:16:42 -0500 Subject: [PATCH] [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 Signed-off-by: Jens Osterkamp Signed-off-by: Arnd Bergmann Signed-off-by: Jeff Garzik --- drivers/net/spider_net.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c index 2154469678b7..94e238f6ed31 100644 --- a/drivers/net/spider_net.c +++ b/drivers/net/spider_net.c @@ -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; - goto out; + + 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)) { -- 2.39.5