printk(KERN_INFO "host%d: fip: " fmt,     \
                                     (fip)->lp->host->host_no, ##args);)
 
+static const char *fcoe_ctlr_states[] = {
+       [FIP_ST_DISABLED] =     "DISABLED",
+       [FIP_ST_LINK_WAIT] =    "LINK_WAIT",
+       [FIP_ST_AUTO] =         "AUTO",
+       [FIP_ST_NON_FIP] =      "NON_FIP",
+       [FIP_ST_ENABLED] =      "ENABLED",
+};
+
+static const char *fcoe_ctlr_state(enum fip_state state)
+{
+       const char *cp = "unknown";
+
+       if (state < ARRAY_SIZE(fcoe_ctlr_states))
+               cp = fcoe_ctlr_states[state];
+       if (!cp)
+               cp = "unknown";
+       return cp;
+}
+
+/**
+ * fcoe_ctlr_set_state() - Set and do debug printing for the new FIP state.
+ * @fip: The FCoE controller
+ * @state: The new state
+ */
+static void fcoe_ctlr_set_state(struct fcoe_ctlr *fip, enum fip_state state)
+{
+       if (state == fip->state)
+               return;
+       if (fip->lp)
+               LIBFCOE_FIP_DBG(fip, "state %s -> %s\n",
+                       fcoe_ctlr_state(fip->state), fcoe_ctlr_state(state));
+       fip->state = state;
+}
+
 /**
  * fcoe_ctlr_mtu_valid() - Check if a FCF's MTU is valid
  * @fcf: The FCF to check
  */
 void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_state mode)
 {
-       fip->state = FIP_ST_LINK_WAIT;
+       fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT);
        fip->mode = mode;
        INIT_LIST_HEAD(&fip->fcfs);
        mutex_init(&fip->ctlr_mutex);
        skb_queue_purge(&fip->fip_recv_list);
 
        mutex_lock(&fip->ctlr_mutex);
-       fip->state = FIP_ST_DISABLED;
+       fcoe_ctlr_set_state(fip, FIP_ST_DISABLED);
        fcoe_ctlr_reset_fcfs(fip);
        mutex_unlock(&fip->ctlr_mutex);
        del_timer_sync(&fip->timer);
                mutex_unlock(&fip->ctlr_mutex);
                fc_linkup(fip->lp);
        } else if (fip->state == FIP_ST_LINK_WAIT) {
-               fip->state = fip->mode;
+               fcoe_ctlr_set_state(fip, fip->mode);
                mutex_unlock(&fip->ctlr_mutex);
                if (fip->state == FIP_ST_AUTO)
                        LIBFCOE_FIP_DBG(fip, "%s", "setting AUTO mode.\n");
        mutex_lock(&fip->ctlr_mutex);
        fcoe_ctlr_reset(fip);
        link_dropped = fip->state != FIP_ST_LINK_WAIT;
-       fip->state = FIP_ST_LINK_WAIT;
+       fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT);
        mutex_unlock(&fip->ctlr_mutex);
 
        if (link_dropped)
        state = fip->state;
        if (state == FIP_ST_AUTO) {
                fip->map_dest = 0;
-               fip->state = FIP_ST_ENABLED;
+               fcoe_ctlr_set_state(fip, FIP_ST_ENABLED);
                state = FIP_ST_ENABLED;
                LIBFCOE_FIP_DBG(fip, "Using FIP mode\n");
        }
                        mutex_unlock(&fip->ctlr_mutex);
                        return -EINVAL;
                }
-               fip->state = FIP_ST_NON_FIP;
+               fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP);
                LIBFCOE_FIP_DBG(fip,
                                "received FLOGI LS_ACC using non-FIP mode\n");
 
                        if (fip->state == FIP_ST_AUTO)
                                LIBFCOE_FIP_DBG(fip, "received non-FIP FLOGI. "
                                                "Setting non-FIP mode\n");
-                       fip->state = FIP_ST_NON_FIP;
+                       fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP);
                }
                mutex_unlock(&fip->ctlr_mutex);
        }