idev->last_fw_hb = 0;
        idev->fw_hb_ready = true;
        idev->fw_status_ready = true;
+       idev->fw_generation = IONIC_FW_STS_F_GENERATION &
+                             ioread8(&idev->dev_info_regs->fw_status);
 
        mod_timer(&ionic->watchdog_timer,
                  round_jiffies(jiffies + ionic->watchdog_period));
 {
        struct ionic_dev *idev = &ionic->idev;
        unsigned long check_time, last_check_time;
-       bool fw_status_ready, fw_hb_ready;
+       bool fw_status_ready = true;
+       bool fw_hb_ready;
+       u8 fw_generation;
        u8 fw_status;
        u32 fw_hb;
 
 
        /* firmware is useful only if the running bit is set and
         * fw_status != 0xff (bad PCI read)
+        * If fw_status is not ready don't bother with the generation.
         */
        fw_status = ioread8(&idev->dev_info_regs->fw_status);
-       fw_status_ready = (fw_status != 0xff) && (fw_status & IONIC_FW_STS_F_RUNNING);
+
+       if (fw_status == 0xff || !(fw_status & IONIC_FW_STS_F_RUNNING)) {
+               fw_status_ready = false;
+       } else {
+               fw_generation = fw_status & IONIC_FW_STS_F_GENERATION;
+               if (idev->fw_generation != fw_generation) {
+                       dev_info(ionic->dev, "FW generation 0x%02x -> 0x%02x\n",
+                                idev->fw_generation, fw_generation);
+
+                       idev->fw_generation = fw_generation;
+
+                       /* If the generation changed, the fw status is not
+                        * ready so we need to trigger a fw-down cycle.  After
+                        * the down, the next watchdog will see the fw is up
+                        * and the generation value stable, so will trigger
+                        * the fw-up activity.
+                        */
+                       fw_status_ready = false;
+               }
+       }
 
        /* is this a transition? */
        if (fw_status_ready != idev->fw_status_ready) {
 
  * @asic_type:       Asic type
  * @asic_rev:        Asic revision
  * @fw_status:       Firmware status
+ *                     bit 0   - 1 = fw running
+ *                     bit 4-7 - 4 bit generation number, changes on fw restart
  * @fw_heartbeat:    Firmware heartbeat counter
  * @serial_num:      Serial number
  * @fw_version:      Firmware version
                u8     version;
                u8     asic_type;
                u8     asic_rev;
-#define IONIC_FW_STS_F_RUNNING 0x1
+#define IONIC_FW_STS_F_RUNNING         0x01
+#define IONIC_FW_STS_F_GENERATION      0xF0
                u8     fw_status;
                u32    fw_heartbeat;
                char   fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];