goto fail;
        }
 
+       if (driver_operating) {
+               if (outlen >= MC_CMD_DRV_ATTACH_EXT_OUT_LEN) {
+                       efx->mcdi->fn_flags =
+                               MCDI_DWORD(outbuf,
+                                          DRV_ATTACH_EXT_OUT_FUNC_FLAGS);
+               } else {
+                       /* Synthesise flags for Siena */
+                       efx->mcdi->fn_flags =
+                               1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL |
+                               1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_TRUSTED |
+                               (efx_port_num(efx) == 0) <<
+                               MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_PRIMARY;
+               }
+       }
+
        /* We currently assume we have control of the external link
         * and are completely trusted by firmware.  Abort probing
         * if that's not true for this function.
         */
        if (driver_operating &&
-           outlen >= MC_CMD_DRV_ATTACH_EXT_OUT_LEN &&
-           (MCDI_DWORD(outbuf, DRV_ATTACH_EXT_OUT_FUNC_FLAGS) &
+           (efx->mcdi->fn_flags &
             (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL |
              1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_TRUSTED)) !=
            (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL |
 
  * struct efx_mcdi_data - extra state for NICs that implement MCDI
  * @iface: Interface/protocol state
  * @hwmon: Hardware monitor state
+ * @fn_flags: Flags for this function, as returned by %MC_CMD_DRV_ATTACH.
  */
 struct efx_mcdi_data {
        struct efx_mcdi_iface iface;
 #ifdef CONFIG_SFC_MCDI_MON
        struct efx_mcdi_mon hwmon;
 #endif
+       u32 fn_flags;
 };
 
 #ifdef CONFIG_SFC_MCDI_MON