net/sfc/base: support filters for encapsulated packets
[dpdk.git] / drivers / net / sfc / base / siena_phy.c
index 73690f1..b90ccab 100644 (file)
@@ -226,6 +226,30 @@ siena_phy_get_link(
                            MCDI_OUT_DWORD(req, GET_LINK_OUT_FCNTL),
                            &slsp->sls_link_mode, &slsp->sls_fcntl);
 
+#if EFSYS_OPT_LOOPBACK
+       /* Assert the MC_CMD_LOOPBACK and EFX_LOOPBACK namespace agree */
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_NONE == EFX_LOOPBACK_OFF);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_DATA == EFX_LOOPBACK_DATA);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMAC == EFX_LOOPBACK_GMAC);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGMII == EFX_LOOPBACK_XGMII);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGXS == EFX_LOOPBACK_XGXS);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI == EFX_LOOPBACK_XAUI);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII == EFX_LOOPBACK_GMII);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SGMII == EFX_LOOPBACK_SGMII);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGBR == EFX_LOOPBACK_XGBR);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI == EFX_LOOPBACK_XFI);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_FAR == EFX_LOOPBACK_XAUI_FAR);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII_FAR == EFX_LOOPBACK_GMII_FAR);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SGMII_FAR == EFX_LOOPBACK_SGMII_FAR);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI_FAR == EFX_LOOPBACK_XFI_FAR);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GPHY == EFX_LOOPBACK_GPHY);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PHYXS == EFX_LOOPBACK_PHY_XS);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PCS == EFX_LOOPBACK_PCS);
+       EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PMAPMD == EFX_LOOPBACK_PMA_PMD);
+
+       slsp->sls_loopback = MCDI_OUT_DWORD(req, GET_LINK_OUT_LOOPBACK_MODE);
+#endif /* EFSYS_OPT_LOOPBACK */
+
        slsp->sls_mac_up = MCDI_OUT_DWORD(req, GET_LINK_OUT_MAC_FAULT) == 0;
 
        return (0);
@@ -273,8 +297,26 @@ siena_phy_reconfigure(
                PHY_CAP_ASYM, (cap_mask >> EFX_PHY_CAP_ASYM) & 0x1,
                PHY_CAP_AN, (cap_mask >> EFX_PHY_CAP_AN) & 0x1);
 
+#if EFSYS_OPT_LOOPBACK
+       MCDI_IN_SET_DWORD(req, SET_LINK_IN_LOOPBACK_MODE,
+                   epp->ep_loopback_type);
+       switch (epp->ep_loopback_link_mode) {
+       case EFX_LINK_100FDX:
+               speed = 100;
+               break;
+       case EFX_LINK_1000FDX:
+               speed = 1000;
+               break;
+       case EFX_LINK_10000FDX:
+               speed = 10000;
+               break;
+       default:
+               speed = 0;
+       }
+#else
        MCDI_IN_SET_DWORD(req, SET_LINK_IN_LOOPBACK_MODE, MC_CMD_LOOPBACK_NONE);
        speed = 0;
+#endif /* EFSYS_OPT_LOOPBACK */
        MCDI_IN_SET_DWORD(req, SET_LINK_IN_LOOPBACK_SPEED, speed);
 
 #if EFSYS_OPT_PHY_FLAGS
@@ -298,7 +340,26 @@ siena_phy_reconfigure(
        req.emr_out_buf = payload;
        req.emr_out_length = MC_CMD_SET_ID_LED_OUT_LEN;
 
+#if EFSYS_OPT_PHY_LED_CONTROL
+       switch (epp->ep_phy_led_mode) {
+       case EFX_PHY_LED_DEFAULT:
+               led_mode = MC_CMD_LED_DEFAULT;
+               break;
+       case EFX_PHY_LED_OFF:
+               led_mode = MC_CMD_LED_OFF;
+               break;
+       case EFX_PHY_LED_ON:
+               led_mode = MC_CMD_LED_ON;
+               break;
+       default:
+               EFSYS_ASSERT(0);
+               led_mode = MC_CMD_LED_DEFAULT;
+       }
+
+       MCDI_IN_SET_DWORD(req, SET_ID_LED_IN_STATE, led_mode);
+#else
        MCDI_IN_SET_DWORD(req, SET_ID_LED_IN_STATE, MC_CMD_LED_DEFAULT);
+#endif /* EFSYS_OPT_PHY_LED_CONTROL */
 
        efx_mcdi_execute(enp, &req);