sfc: Store flags from MC_CMD_DRV_ATTACH for later use
authorBen Hutchings <bhutchings@solarflare.com>
Wed, 16 Oct 2013 17:32:34 +0000 (18:32 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Thu, 12 Dec 2013 22:07:03 +0000 (22:07 +0000)
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/mcdi.c
drivers/net/ethernet/sfc/mcdi.h

index d317dfd..d608838 100644 (file)
@@ -1132,13 +1132,27 @@ static int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
                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 |
index 171f5f5..52931ae 100644 (file)
@@ -94,12 +94,14 @@ struct efx_mcdi_mtd_partition {
  * 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