]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
sfc: add output flag decoding to efx_mcdi_set_workaround
authorDaniel Pieczko <dpieczko@solarflare.com>
Tue, 21 Jul 2015 14:09:43 +0000 (15:09 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Jul 2015 05:21:32 +0000 (22:21 -0700)
The initial use of this will be to check a flag reporting if an FLR was
performed on other functions when enabling cascaded multicast filters.

Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/ef10.c
drivers/net/ethernet/sfc/mcdi.c
drivers/net/ethernet/sfc/mcdi.h

index 44071176859d1b99a248a99a005a47542ea68427..2b93f63a04218216b1c0402e7fa1c102f274a3b0 100644 (file)
@@ -387,7 +387,7 @@ static int efx_ef10_probe(struct efx_nic *efx)
         * First try to enable it, then if we get EPERM, just
         * ask if it's already enabled
         */
-       rc = efx_mcdi_set_workaround(efx, MC_CMD_WORKAROUND_BUG35388, true);
+       rc = efx_mcdi_set_workaround(efx, MC_CMD_WORKAROUND_BUG35388, true, NULL);
        if (rc == 0) {
                nic_data->workaround_35388 = true;
        } else if (rc == -EPERM) {
@@ -2291,8 +2291,9 @@ static int efx_ef10_ev_init(struct efx_channel *channel)
 
                if (implemented & MC_CMD_GET_WORKAROUNDS_OUT_BUG26807 &&
                    !nic_data->workaround_26807) {
-                       rc = efx_mcdi_set_workaround(efx, MC_CMD_WORKAROUND_BUG26807,
-                                                    true);
+                       rc = efx_mcdi_set_workaround(efx,
+                                                    MC_CMD_WORKAROUND_BUG26807,
+                                                    true, NULL);
                        if (!rc)
                                nic_data->workaround_26807 = true;
                        else if (rc == -EPERM)
index 58232e78feaae49c22fc35e22c2b66913d58dc68..98d172b04f71815a1105b304ea5cadfa552687a2 100644 (file)
@@ -1779,15 +1779,31 @@ int efx_mcdi_wol_filter_reset(struct efx_nic *efx)
        return rc;
 }
 
-int efx_mcdi_set_workaround(struct efx_nic *efx, u32 type, bool enabled)
+int efx_mcdi_set_workaround(struct efx_nic *efx, u32 type, bool enabled,
+                           unsigned int *flags)
 {
        MCDI_DECLARE_BUF(inbuf, MC_CMD_WORKAROUND_IN_LEN);
+       MCDI_DECLARE_BUF(outbuf, MC_CMD_WORKAROUND_EXT_OUT_LEN);
+       size_t outlen;
+       int rc;
 
        BUILD_BUG_ON(MC_CMD_WORKAROUND_OUT_LEN != 0);
        MCDI_SET_DWORD(inbuf, WORKAROUND_IN_TYPE, type);
        MCDI_SET_DWORD(inbuf, WORKAROUND_IN_ENABLED, enabled);
-       return efx_mcdi_rpc(efx, MC_CMD_WORKAROUND, inbuf, sizeof(inbuf),
-                           NULL, 0, NULL);
+       rc = efx_mcdi_rpc(efx, MC_CMD_WORKAROUND, inbuf, sizeof(inbuf),
+                         outbuf, sizeof(outbuf), &outlen);
+       if (rc)
+               return rc;
+
+       if (!flags)
+               return 0;
+
+       if (outlen >= MC_CMD_WORKAROUND_EXT_OUT_LEN)
+               *flags = MCDI_DWORD(outbuf, WORKAROUND_EXT_OUT_FLAGS);
+       else
+               *flags = 0;
+
+       return 0;
 }
 
 int efx_mcdi_get_workarounds(struct efx_nic *efx, unsigned int *impl_out,
index 1838afe2da920c59f7ca43744c7a27a0f4e62a6c..025d504c472b5e4ff0bfc516162e69926f65ede6 100644 (file)
@@ -346,7 +346,8 @@ void efx_mcdi_mac_pull_stats(struct efx_nic *efx);
 bool efx_mcdi_mac_check_fault(struct efx_nic *efx);
 enum reset_type efx_mcdi_map_reset_reason(enum reset_type reason);
 int efx_mcdi_reset(struct efx_nic *efx, enum reset_type method);
-int efx_mcdi_set_workaround(struct efx_nic *efx, u32 type, bool enabled);
+int efx_mcdi_set_workaround(struct efx_nic *efx, u32 type, bool enabled,
+                           unsigned int *flags);
 int efx_mcdi_get_workarounds(struct efx_nic *efx, unsigned int *impl_out,
                             unsigned int *enabled_out);