From: linas@austin.ibm.com (Linas Vepstas)
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: arnd@arndb.de, linuxppc-dev@ozlabs.org
Subject: [PATCH 4/12] spidernet: load firmware when open
Date: Thu, 15 Feb 2007 18:46:40 -0600 [thread overview]
Message-ID: <20070216004640.GD8192@austin.ibm.com> (raw)
In-Reply-To: <20070216004325.GA8192@austin.ibm.com>
This patch moves calling init_firmware() from spider_net_probe() to
spider_net_open() so as to use the driver by built-in.
Signed-off-by: Kou Ishizaki <kou.ishizaki@toshiba.co.jp>
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 247 +++++++++++++++++++++++------------------------
1 file changed, 123 insertions(+), 124 deletions(-)
Index: linux-2.6.20-git4/drivers/net/spider_net.c
===================================================================
--- linux-2.6.20-git4.orig/drivers/net/spider_net.c 2007-02-15 17:53:49.000000000 -0600
+++ linux-2.6.20-git4/drivers/net/spider_net.c 2007-02-15 17:54:23.000000000 -0600
@@ -1705,6 +1705,124 @@ spider_net_enable_card(struct spider_net
}
/**
+ * spider_net_download_firmware - loads firmware into the adapter
+ * @card: card structure
+ * @firmware_ptr: pointer to firmware data
+ *
+ * spider_net_download_firmware loads the firmware data into the
+ * adapter. It assumes the length etc. to be allright.
+ */
+static int
+spider_net_download_firmware(struct spider_net_card *card,
+ const void *firmware_ptr)
+{
+ int sequencer, i;
+ const u32 *fw_ptr = firmware_ptr;
+
+ /* stop sequencers */
+ spider_net_write_reg(card, SPIDER_NET_GSINIT,
+ SPIDER_NET_STOP_SEQ_VALUE);
+
+ for (sequencer = 0; sequencer < SPIDER_NET_FIRMWARE_SEQS;
+ sequencer++) {
+ spider_net_write_reg(card,
+ SPIDER_NET_GSnPRGADR + sequencer * 8, 0);
+ for (i = 0; i < SPIDER_NET_FIRMWARE_SEQWORDS; i++) {
+ spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT +
+ sequencer * 8, *fw_ptr);
+ fw_ptr++;
+ }
+ }
+
+ if (spider_net_read_reg(card, SPIDER_NET_GSINIT))
+ return -EIO;
+
+ spider_net_write_reg(card, SPIDER_NET_GSINIT,
+ SPIDER_NET_RUN_SEQ_VALUE);
+
+ return 0;
+}
+
+/**
+ * spider_net_init_firmware - reads in firmware parts
+ * @card: card structure
+ *
+ * Returns 0 on success, <0 on failure
+ *
+ * spider_net_init_firmware opens the sequencer firmware and does some basic
+ * checks. This function opens and releases the firmware structure. A call
+ * to download the firmware is performed before the release.
+ *
+ * Firmware format
+ * ===============
+ * spider_fw.bin is expected to be a file containing 6*1024*4 bytes, 4k being
+ * the program for each sequencer. Use the command
+ * tail -q -n +2 Seq_code1_0x088.txt Seq_code2_0x090.txt \
+ * Seq_code3_0x098.txt Seq_code4_0x0A0.txt Seq_code5_0x0A8.txt \
+ * Seq_code6_0x0B0.txt | xxd -r -p -c4 > spider_fw.bin
+ *
+ * to generate spider_fw.bin, if you have sequencer programs with something
+ * like the following contents for each sequencer:
+ * <ONE LINE COMMENT>
+ * <FIRST 4-BYTES-WORD FOR SEQUENCER>
+ * <SECOND 4-BYTES-WORD FOR SEQUENCER>
+ * ...
+ * <1024th 4-BYTES-WORD FOR SEQUENCER>
+ */
+static int
+spider_net_init_firmware(struct spider_net_card *card)
+{
+ struct firmware *firmware = NULL;
+ struct device_node *dn;
+ const u8 *fw_prop = NULL;
+ int err = -ENOENT;
+ int fw_size;
+
+ if (request_firmware((const struct firmware **)&firmware,
+ SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) == 0) {
+ if ( (firmware->size != SPIDER_NET_FIRMWARE_LEN) &&
+ netif_msg_probe(card) ) {
+ pr_err("Incorrect size of spidernet firmware in " \
+ "filesystem. Looking in host firmware...\n");
+ goto try_host_fw;
+ }
+ err = spider_net_download_firmware(card, firmware->data);
+
+ release_firmware(firmware);
+ if (err)
+ goto try_host_fw;
+
+ goto done;
+ }
+
+try_host_fw:
+ dn = pci_device_to_OF_node(card->pdev);
+ if (!dn)
+ goto out_err;
+
+ fw_prop = get_property(dn, "firmware", &fw_size);
+ if (!fw_prop)
+ goto out_err;
+
+ if ( (fw_size != SPIDER_NET_FIRMWARE_LEN) &&
+ netif_msg_probe(card) ) {
+ pr_err("Incorrect size of spidernet firmware in " \
+ "host firmware\n");
+ goto done;
+ }
+
+ err = spider_net_download_firmware(card, fw_prop);
+
+done:
+ return err;
+out_err:
+ if (netif_msg_probe(card))
+ pr_err("Couldn't find spidernet firmware in filesystem " \
+ "or host firmware\n");
+ return err;
+}
+
+/**
* spider_net_open - called upon ifonfig up
* @netdev: interface device structure
*
@@ -1719,6 +1837,10 @@ spider_net_open(struct net_device *netde
struct spider_net_card *card = netdev_priv(netdev);
int result;
+ result = spider_net_init_firmware(card);
+ if (result)
+ goto init_firmware_failed;
+
/* start probing with copper */
spider_net_setup_aneg(card);
if (card->phy.def->phy_id)
@@ -1762,6 +1884,7 @@ alloc_rx_failed:
spider_net_free_chain(card, &card->tx_chain);
alloc_tx_failed:
del_timer_sync(&card->aneg_timer);
+init_firmware_failed:
return result;
}
@@ -1873,124 +1996,6 @@ spider_net_setup_phy(struct spider_net_c
}
/**
- * spider_net_download_firmware - loads firmware into the adapter
- * @card: card structure
- * @firmware_ptr: pointer to firmware data
- *
- * spider_net_download_firmware loads the firmware data into the
- * adapter. It assumes the length etc. to be allright.
- */
-static int
-spider_net_download_firmware(struct spider_net_card *card,
- const void *firmware_ptr)
-{
- int sequencer, i;
- const u32 *fw_ptr = firmware_ptr;
-
- /* stop sequencers */
- spider_net_write_reg(card, SPIDER_NET_GSINIT,
- SPIDER_NET_STOP_SEQ_VALUE);
-
- for (sequencer = 0; sequencer < SPIDER_NET_FIRMWARE_SEQS;
- sequencer++) {
- spider_net_write_reg(card,
- SPIDER_NET_GSnPRGADR + sequencer * 8, 0);
- for (i = 0; i < SPIDER_NET_FIRMWARE_SEQWORDS; i++) {
- spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT +
- sequencer * 8, *fw_ptr);
- fw_ptr++;
- }
- }
-
- if (spider_net_read_reg(card, SPIDER_NET_GSINIT))
- return -EIO;
-
- spider_net_write_reg(card, SPIDER_NET_GSINIT,
- SPIDER_NET_RUN_SEQ_VALUE);
-
- return 0;
-}
-
-/**
- * spider_net_init_firmware - reads in firmware parts
- * @card: card structure
- *
- * Returns 0 on success, <0 on failure
- *
- * spider_net_init_firmware opens the sequencer firmware and does some basic
- * checks. This function opens and releases the firmware structure. A call
- * to download the firmware is performed before the release.
- *
- * Firmware format
- * ===============
- * spider_fw.bin is expected to be a file containing 6*1024*4 bytes, 4k being
- * the program for each sequencer. Use the command
- * tail -q -n +2 Seq_code1_0x088.txt Seq_code2_0x090.txt \
- * Seq_code3_0x098.txt Seq_code4_0x0A0.txt Seq_code5_0x0A8.txt \
- * Seq_code6_0x0B0.txt | xxd -r -p -c4 > spider_fw.bin
- *
- * to generate spider_fw.bin, if you have sequencer programs with something
- * like the following contents for each sequencer:
- * <ONE LINE COMMENT>
- * <FIRST 4-BYTES-WORD FOR SEQUENCER>
- * <SECOND 4-BYTES-WORD FOR SEQUENCER>
- * ...
- * <1024th 4-BYTES-WORD FOR SEQUENCER>
- */
-static int
-spider_net_init_firmware(struct spider_net_card *card)
-{
- struct firmware *firmware = NULL;
- struct device_node *dn;
- const u8 *fw_prop = NULL;
- int err = -ENOENT;
- int fw_size;
-
- if (request_firmware((const struct firmware **)&firmware,
- SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) == 0) {
- if ( (firmware->size != SPIDER_NET_FIRMWARE_LEN) &&
- netif_msg_probe(card) ) {
- pr_err("Incorrect size of spidernet firmware in " \
- "filesystem. Looking in host firmware...\n");
- goto try_host_fw;
- }
- err = spider_net_download_firmware(card, firmware->data);
-
- release_firmware(firmware);
- if (err)
- goto try_host_fw;
-
- goto done;
- }
-
-try_host_fw:
- dn = pci_device_to_OF_node(card->pdev);
- if (!dn)
- goto out_err;
-
- fw_prop = get_property(dn, "firmware", &fw_size);
- if (!fw_prop)
- goto out_err;
-
- if ( (fw_size != SPIDER_NET_FIRMWARE_LEN) &&
- netif_msg_probe(card) ) {
- pr_err("Incorrect size of spidernet firmware in " \
- "host firmware\n");
- goto done;
- }
-
- err = spider_net_download_firmware(card, fw_prop);
-
-done:
- return err;
-out_err:
- if (netif_msg_probe(card))
- pr_err("Couldn't find spidernet firmware in filesystem " \
- "or host firmware\n");
- return err;
-}
-
-/**
* spider_net_workaround_rxramfull - work around firmware bug
* @card: card structure
*
@@ -2090,8 +2095,6 @@ spider_net_tx_timeout_task(struct work_s
if (spider_net_setup_phy(card))
goto out;
- if (spider_net_init_firmware(card))
- goto out;
spider_net_open(netdev);
spider_net_kick_tx_dma(card);
@@ -2363,10 +2366,6 @@ spider_net_probe(struct pci_dev *pdev, c
if (err)
goto out_undo_pci;
- err = spider_net_init_firmware(card);
- if (err)
- goto out_undo_pci;
-
err = spider_net_setup_netdev(card);
if (err)
goto out_undo_pci;
next prev parent reply other threads:[~2007-02-16 0:46 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-26 7:24 [PATCHSET] libata: PATA driver for Celleb Akira Iguchi
2007-01-26 7:46 ` Jeff Garzik
2007-01-26 7:46 ` Jeff Garzik
2007-02-14 5:19 ` Akira Iguchi
2007-02-14 5:19 ` Akira Iguchi
[not found] ` <200702140518.l1E5IoWX010896@toshiba.co.jp>
2007-02-14 5:29 ` Benjamin Herrenschmidt
2007-02-14 5:29 ` Benjamin Herrenschmidt
2007-02-15 5:07 ` Jeff Garzik
2007-02-15 5:07 ` Jeff Garzik
2007-02-15 7:52 ` Benjamin Herrenschmidt
2007-02-15 7:52 ` Benjamin Herrenschmidt
2007-02-15 10:41 ` Jens Osterkamp
2007-02-15 10:41 ` Jens Osterkamp
2007-02-15 16:03 ` Jim Lewis
2007-02-15 17:14 ` Linas Vepstas
2007-02-15 17:14 ` Linas Vepstas
2007-02-15 18:09 ` Arnd Bergmann
2007-02-15 18:09 ` Arnd Bergmann
2007-02-15 19:11 ` Linas Vepstas
2007-02-15 19:11 ` Linas Vepstas
2007-02-19 21:56 ` Alan
2007-02-19 21:56 ` Alan
2007-02-19 21:21 ` Benjamin Herrenschmidt
2007-02-19 21:21 ` Benjamin Herrenschmidt
2007-02-19 23:46 ` Alan
2007-02-19 23:46 ` Alan
2007-02-19 23:17 ` Bartlomiej Zolnierkiewicz
2007-02-19 23:17 ` Bartlomiej Zolnierkiewicz
2007-02-19 23:28 ` Benjamin Herrenschmidt
2007-02-19 23:28 ` Benjamin Herrenschmidt
2007-02-19 23:18 ` Benjamin Herrenschmidt
2007-02-19 23:18 ` Benjamin Herrenschmidt
2007-02-19 21:43 ` Benjamin Herrenschmidt
2007-02-19 21:43 ` Benjamin Herrenschmidt
2007-02-20 8:14 ` Geert Uytterhoeven
2007-02-20 8:14 ` Geert Uytterhoeven
2007-02-15 20:46 ` Benjamin Herrenschmidt
2007-02-15 20:46 ` Benjamin Herrenschmidt
2007-02-16 0:18 ` [PATCHSET] spidernet, sungem_phy: consolidated patch series Linas Vepstas
2007-02-16 0:18 ` Linas Vepstas
2007-02-16 0:43 ` [PATCH 1/12]: sungem_phy: support bcm5461 phy, autoneg Linas Vepstas
2007-02-16 0:44 ` [PATCH 2/12]: spidernet: compile break Linas Vepstas
2007-02-16 0:45 ` [PATCH 3/12] spidernet: autoneg support for Celleb Linas Vepstas
2007-02-16 0:46 ` Linas Vepstas [this message]
2007-02-16 0:48 ` [PATCH 5/12] spidernet: spidernet: add " Linas Vepstas
2007-02-16 0:49 ` [PATCH 6/12] spidernet: remove txram full logging Linas Vepstas
2007-02-16 0:50 ` [PATCH 7/12] spidernet: move medium variable into card struct Linas Vepstas
2007-02-16 0:52 ` [PATCH 8/12] Spidernet: separate hardware state from driver state Linas Vepstas
2007-02-16 0:53 ` [PATCH: 9/12]: spidernet: fix racy double-free of skb Linas Vepstas
2007-02-16 0:55 ` [PATCH 10/12] spidernet: transmit race Linas Vepstas
2007-02-16 0:57 ` [PATCH 11/12] spidernet: janitorial, typos Linas Vepstas
2007-02-16 0:58 ` [PATCH 12/12]: spidernet: maintainership Linas Vepstas
2007-02-16 14:46 ` [PATCH 1/12]: sungem_phy: support bcm5461 phy, autoneg Arnd Bergmann
2007-02-16 16:19 ` Linas Vepstas
2007-02-15 5:12 ` spidernet (was Re: [PATCHSET] libata: PATA driver for Celleb) Jeff Garzik
2007-02-15 5:12 ` Jeff Garzik
2007-02-15 7:52 ` Benjamin Herrenschmidt
2007-02-15 7:52 ` Benjamin Herrenschmidt
-- strict thread matches above, loose matches on Subject: below --
2007-02-20 22:13 [PATCH 0/12]: spidernet updates Linas Vepstas
2007-02-20 22:34 ` [PATCH 4/12] spidernet: load firmware when open Linas Vepstas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070216004640.GD8192@austin.ibm.com \
--to=linas@austin.ibm.com \
--cc=arnd@arndb.de \
--cc=benh@kernel.crashing.org \
--cc=linuxppc-dev@ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.