net: phy: Add state machine state transitions debug prints
authorFlorian Fainelli <f.fainelli@gmail.com>
Sat, 16 May 2015 17:17:56 +0000 (10:17 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 16 May 2015 20:47:13 +0000 (16:47 -0400)
It can be useful to debug the PHY state machine, add dynamic debug
prints of the old and new PHY devices state under a friendly format.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy.c

index 52cd8db2c57daad2767dec72149f4cdabbcf6917..1457ecf75dcc72dfb6c234a62a2ac72df7096345 100644 (file)
@@ -58,6 +58,31 @@ static const char *phy_speed_to_str(int speed)
        }
 }
 
+#define PHY_STATE_STR(_state)                  \
+       case PHY_##_state:                      \
+               return __stringify(_state);     \
+
+static const char *phy_state_to_str(enum phy_state st)
+{
+       switch (st) {
+       PHY_STATE_STR(DOWN)
+       PHY_STATE_STR(STARTING)
+       PHY_STATE_STR(READY)
+       PHY_STATE_STR(PENDING)
+       PHY_STATE_STR(UP)
+       PHY_STATE_STR(AN)
+       PHY_STATE_STR(RUNNING)
+       PHY_STATE_STR(NOLINK)
+       PHY_STATE_STR(FORCING)
+       PHY_STATE_STR(CHANGELINK)
+       PHY_STATE_STR(HALTED)
+       PHY_STATE_STR(RESUMING)
+       }
+
+       return NULL;
+}
+
+
 /**
  * phy_print_status - Convenience function to print out the current phy status
  * @phydev: the phy_device struct
@@ -770,10 +795,13 @@ void phy_state_machine(struct work_struct *work)
        struct phy_device *phydev =
                        container_of(dwork, struct phy_device, state_queue);
        bool needs_aneg = false, do_suspend = false, do_resume = false;
+       enum phy_state old_state;
        int err = 0;
 
        mutex_lock(&phydev->lock);
 
+       old_state = phydev->state;
+
        if (phydev->drv->link_change_notify)
                phydev->drv->link_change_notify(phydev);
 
@@ -949,6 +977,9 @@ void phy_state_machine(struct work_struct *work)
        if (err < 0)
                phy_error(phydev);
 
+       dev_dbg(&phydev->dev, "PHY state change %s -> %s\n",
+               phy_state_to_str(old_state), phy_state_to_str(phydev->state));
+
        queue_delayed_work(system_power_efficient_wq, &phydev->state_queue,
                           PHY_STATE_TIME * HZ);
 }