Ack, thanks!

Paul

> -----Original Message-----
> From: Nguyen, Anthony L <anthony.l.ngu...@intel.com>
> Sent: Thursday, July 23, 2020 4:47 PM
> To: da...@davemloft.net
> Cc: Stillwell Jr, Paul M <paul.m.stillwell...@intel.com>; 
> netdev@vger.kernel.org;
> nhor...@redhat.com; sassm...@redhat.com; Kirsher, Jeffrey T
> <jeffrey.t.kirs...@intel.com>; Nguyen, Anthony L
> <anthony.l.ngu...@intel.com>; Bowers, AndrewX
> <andrewx.bow...@intel.com>
> Subject: [net-next 15/15] ice: add 1G SGMII PHY type
> 
> From: Paul M Stillwell Jr <paul.m.stillwell...@intel.com>
> 
> There isn't a case for 1G SGMII in ice_get_media_type() so add the handling 
> for
> it.
> 
> Also handle the special case where some direct attach cables may report that
> they support 1G SGMII, but that is erroneous since SGMII is supposed to be a
> backplane media type (between a MAC and a PHY). If the driver doesn't handle
> this special case then a user could see the 'Port' in ethtool change from 
> 'Direct
> attach Copper' to 'Backplane' when they have forced the speed to 1G, but the
> cable hasn't changed.
> 
> Lastly, change ice_aq_get_phy_caps() to save the module_type info if the
> function was called with ICE_AQC_REPORT_TOPO_CAP. This call uses the media
> information to populate the module_type. If no media is present then the 
> values
> in module_type will be 0.
> 
> Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell...@intel.com>
> Tested-by: Andrew Bowers <andrewx.bow...@intel.com>
> Signed-off-by: Tony Nguyen <anthony.l.ngu...@intel.com>
> ---
>  drivers/net/ethernet/intel/ice/ice_adminq_cmd.h |  1 +
>  drivers/net/ethernet/intel/ice/ice_common.c     | 17 ++++++++++++++---
>  2 files changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> index 4315a784b975..b363e0223670 100644
> --- a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> +++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
> @@ -993,6 +993,7 @@ struct ice_aqc_get_phy_caps_data {
>       u8 module_type[ICE_MODULE_TYPE_TOTAL_BYTE];
>  #define ICE_AQC_MOD_TYPE_BYTE0_SFP_PLUS                      0xA0
>  #define ICE_AQC_MOD_TYPE_BYTE0_QSFP_PLUS             0x80
> +#define ICE_AQC_MOD_TYPE_IDENT                               1
>  #define ICE_AQC_MOD_TYPE_BYTE1_SFP_PLUS_CU_PASSIVE   BIT(0)
>  #define ICE_AQC_MOD_TYPE_BYTE1_SFP_PLUS_CU_ACTIVE    BIT(1)
>  #define ICE_AQC_MOD_TYPE_BYTE1_10G_BASE_SR           BIT(4)
> diff --git a/drivers/net/ethernet/intel/ice/ice_common.c
> b/drivers/net/ethernet/intel/ice/ice_common.c
> index bb9952038efa..c72cc77b8d67 100644
> --- a/drivers/net/ethernet/intel/ice/ice_common.c
> +++ b/drivers/net/ethernet/intel/ice/ice_common.c
> @@ -194,6 +194,8 @@ ice_aq_get_phy_caps(struct ice_port_info *pi, bool
> qual_mods, u8 report_mode,
>       if (!status && report_mode == ICE_AQC_REPORT_TOPO_CAP) {
>               pi->phy.phy_type_low = le64_to_cpu(pcaps->phy_type_low);
>               pi->phy.phy_type_high = le64_to_cpu(pcaps->phy_type_high);
> +             memcpy(pi->phy.link_info.module_type, &pcaps-
> >module_type,
> +                    sizeof(pi->phy.link_info.module_type));
>       }
> 
>       return status;
> @@ -266,6 +268,18 @@ static enum ice_media_type
> ice_get_media_type(struct ice_port_info *pi)
>               return ICE_MEDIA_UNKNOWN;
> 
>       if (hw_link_info->phy_type_low) {
> +             /* 1G SGMII is a special case where some DA cable PHYs
> +              * may show this as an option when it really shouldn't
> +              * be since SGMII is meant to be between a MAC and a PHY
> +              * in a backplane. Try to detect this case and handle it
> +              */
> +             if (hw_link_info->phy_type_low ==
> ICE_PHY_TYPE_LOW_1G_SGMII &&
> +                 (hw_link_info->module_type[ICE_AQC_MOD_TYPE_IDENT]
> ==
> +                 ICE_AQC_MOD_TYPE_BYTE1_SFP_PLUS_CU_ACTIVE ||
> +                 hw_link_info->module_type[ICE_AQC_MOD_TYPE_IDENT] ==
> +                 ICE_AQC_MOD_TYPE_BYTE1_SFP_PLUS_CU_PASSIVE))
> +                     return ICE_MEDIA_DA;
> +
>               switch (hw_link_info->phy_type_low) {
>               case ICE_PHY_TYPE_LOW_1000BASE_SX:
>               case ICE_PHY_TYPE_LOW_1000BASE_LX:
> @@ -2647,9 +2661,6 @@ enum ice_status ice_update_link_info(struct
> ice_port_info *pi)
> 
>               status = ice_aq_get_phy_caps(pi, false,
> ICE_AQC_REPORT_TOPO_CAP,
>                                            pcaps, NULL);
> -             if (!status)
> -                     memcpy(li->module_type, &pcaps->module_type,
> -                            sizeof(li->module_type));
> 
>               devm_kfree(ice_hw_to_dev(hw), pcaps);
>       }
> --
> 2.26.2

Reply via email to