sfc: Rename efx_board::init_leds to init_phy and use for SFN4111T
authorBen Hutchings <bhutchings@solarflare.com>
Mon, 23 Nov 2009 16:04:23 +0000 (16:04 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 24 Nov 2009 18:58:40 +0000 (10:58 -0800)
efx_board::init_leds was introduced as a second stage of
initialisation because of the inter-dependency between the board and
PHY.  We want to move board initialisation into NIC probing, which is
too early to use MDIO, so SFN4111T initialisation also needs to be
split.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sfc/efx.c
drivers/net/sfc/falcon_boards.c
drivers/net/sfc/net_driver.h
drivers/net/sfc/qt202x_phy.c
drivers/net/sfc/tenxpress.c

index 612cd815088f4b7f3f1944b58f8f9fd8cc7c1aeb..d7705a7551647e7d85e2b52c3f795f762f0cf5cb 100644 (file)
@@ -1910,7 +1910,7 @@ static struct efx_phy_operations efx_dummy_phy_operations = {
 
 static struct efx_board efx_dummy_board_info = {
        .init           = efx_port_dummy_op_int,
-       .init_leds      = efx_port_dummy_op_void,
+       .init_phy       = efx_port_dummy_op_void,
        .set_id_led     = efx_port_dummy_op_set_id_led,
        .monitor        = efx_port_dummy_op_int,
        .fini           = efx_port_dummy_op_void,
index b2505fc5c1f78b2af4855344781d0d82cad10522..429d3cd646b5809d54af43ca143da664d358493e 100644 (file)
@@ -499,9 +499,22 @@ static struct i2c_board_info sfn4111t_r5_hwmon_info = {
        I2C_BOARD_INFO("max6646", 0x4d),
 };
 
+static void sfn4111t_init_phy(struct efx_nic *efx)
+{
+       if (!(efx->phy_mode & PHY_MODE_SPECIAL)) {
+               if (sft9001_wait_boot(efx) != -EINVAL)
+                       return;
+
+               efx->phy_mode = PHY_MODE_SPECIAL;
+               efx_stats_disable(efx);
+       }
+
+       sfn4111t_reset(efx);
+       sft9001_wait_boot(efx);
+}
+
 static int sfn4111t_init(struct efx_nic *efx)
 {
-       int i = 0;
        int rc;
 
        efx->board_info.hwmon_client =
@@ -512,6 +525,7 @@ static int sfn4111t_init(struct efx_nic *efx)
        if (!efx->board_info.hwmon_client)
                return -EIO;
 
+       efx->board_info.init_phy = sfn4111t_init_phy;
        efx->board_info.set_id_led = tenxpress_set_id_led;
        efx->board_info.monitor = sfn4111t_check_hw;
        efx->board_info.fini = sfn4111t_fini;
@@ -520,20 +534,13 @@ static int sfn4111t_init(struct efx_nic *efx)
        if (rc)
                goto fail_hwmon;
 
-       do {
-               if (efx->phy_mode & PHY_MODE_SPECIAL) {
-                       /* PHY may not generate a 156.25 MHz clock and MAC
-                        * stats fetch will fail. */
-                       efx_stats_disable(efx);
-                       sfn4111t_reset(efx);
-               }
-               rc = sft9001_wait_boot(efx);
-               if (rc == 0)
-                       return 0;
-               efx->phy_mode = PHY_MODE_SPECIAL;
-       } while (rc == -EINVAL && ++i < 2);
+       if (efx->phy_mode & PHY_MODE_SPECIAL)
+               /* PHY may not generate a 156.25 MHz clock and MAC
+                * stats fetch will fail. */
+               efx_stats_disable(efx);
+
+       return 0;
 
-       device_remove_file(&efx->pci_dev->dev, &dev_attr_phy_flash_cfg);
 fail_hwmon:
        i2c_unregister_device(efx->board_info.hwmon_client);
        return rc;
@@ -574,7 +581,7 @@ static struct i2c_board_info sfe4002_hwmon_info = {
 #define SFE4002_RX_LED    (0)  /* Green */
 #define SFE4002_TX_LED    (1)  /* Amber */
 
-static void sfe4002_init_leds(struct efx_nic *efx)
+static void sfe4002_init_phy(struct efx_nic *efx)
 {
        /* Set the TX and RX LEDs to reflect status and activity, and the
         * fault LED off */
@@ -609,7 +616,7 @@ static int sfe4002_init(struct efx_nic *efx)
        if (rc)
                return rc;
        efx->board_info.monitor = sfe4002_check_hw;
-       efx->board_info.init_leds = sfe4002_init_leds;
+       efx->board_info.init_phy = sfe4002_init_phy;
        efx->board_info.set_id_led = sfe4002_set_id_led;
        efx->board_info.fini = efx_fini_lm87;
        return 0;
@@ -641,7 +648,7 @@ static struct i2c_board_info sfn4112f_hwmon_info = {
 #define SFN4112F_ACT_LED       0
 #define SFN4112F_LINK_LED      1
 
-static void sfn4112f_init_leds(struct efx_nic *efx)
+static void sfn4112f_init_phy(struct efx_nic *efx)
 {
        falcon_qt202x_set_led(efx, SFN4112F_ACT_LED,
                              QUAKE_LED_RXLINK | QUAKE_LED_LINK_ACT);
@@ -680,7 +687,7 @@ static int sfn4112f_init(struct efx_nic *efx)
        if (rc)
                return rc;
        efx->board_info.monitor = sfn4112f_check_hw;
-       efx->board_info.init_leds = sfn4112f_init_leds;
+       efx->board_info.init_phy = sfn4112f_init_phy;
        efx->board_info.set_id_led = sfn4112f_set_id_led;
        efx->board_info.fini = efx_fini_lm87;
        return 0;
index 6b05d69429ee6063ca0275b9850916722d7aa23f..e1df589dff604e83fd706e14838488cc0b1479d7 100644 (file)
@@ -399,11 +399,11 @@ enum efx_led_mode {
  * @type: Board model type
  * @major: Major rev. ('A', 'B' ...)
  * @minor: Minor rev. (0, 1, ...)
- * @init: Initialisation function
- * @init_leds: Sets up board LEDs. May be called repeatedly.
+ * @init: Allocate resources and initialise peripheral hardware
+ * @init_phy: Do board-specific PHY initialisation
  * @set_id_led: Set state of identifying LED or revert to automatic function
  * @monitor: Board-specific health check function
- * @fini: Cleanup function
+ * @fini: Shut down hardware and free resources
  * @hwmon_client: I2C client for hardware monitor
  * @ioexp_client: I2C client for power/port control
  */
@@ -412,10 +412,7 @@ struct efx_board {
        int major;
        int minor;
        int (*init) (struct efx_nic *nic);
-       /* As the LEDs are typically attached to the PHY, LEDs
-        * have a separate init callback that happens later than
-        * board init. */
-       void (*init_leds)(struct efx_nic *efx);
+       void (*init_phy) (struct efx_nic *efx);
        void (*set_id_led) (struct efx_nic *efx, enum efx_led_mode mode);
        int (*monitor) (struct efx_nic *nic);
        void (*fini) (struct efx_nic *nic);
index 05c0f9acedbdbf5567fcbc2da74da469e4b3b6a1..f26684fc8cafc60c9fee50ee79ed526fd664eb57 100644 (file)
@@ -126,7 +126,7 @@ static int qt202x_reset_phy(struct efx_nic *efx)
        if (rc < 0)
                goto fail;
 
-       efx->board_info.init_leds(efx);
+       efx->board_info.init_phy(efx);
 
        return rc;
 
index 6a8e3ea038113d29685b5564085cf3aad8286a5c..2923e3d1e027b1ff17b575a89d88b5e7fe0e9df6 100644 (file)
@@ -303,6 +303,8 @@ static int tenxpress_phy_init(struct efx_nic *efx)
        u16 old_adv, adv;
        int rc = 0;
 
+       efx->board_info.init_phy(efx);
+
        phy_data = kzalloc(sizeof(*phy_data), GFP_KERNEL);
        if (!phy_data)
                return -ENOMEM;