[PATCH] spidernet: read firmware from the OF device tree
authorArnd Bergmann <arnd@arndb.de>
Thu, 12 Jan 2006 22:16:42 +0000 (17:16 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Tue, 17 Jan 2006 12:25:00 +0000 (07:25 -0500)
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: Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
Signed-off-by: Arnd Bergmann <arndb@de.ibm.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/net/spider_net.c

index 2154469678b73ade5123b11fd4651801bbd903f9..94e238f6ed31d62adae483aec9b65416b2e97226 100644 (file)
@@ -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)) {