| 2825 | } |
| 2826 | |
| 2827 | static __rte_always_inline void |
| 2828 | update_link_reg(struct i40e_hw *hw, struct rte_eth_link *link) |
| 2829 | { |
| 2830 | /* Link status registers and values*/ |
| 2831 | #define I40E_REG_LINK_UP 0x40000080 |
| 2832 | #define I40E_PRTMAC_MACC 0x001E24E0 |
| 2833 | #define I40E_REG_MACC_25GB 0x00020000 |
| 2834 | #define I40E_REG_SPEED_MASK 0x38000000 |
| 2835 | #define I40E_REG_SPEED_0 0x00000000 |
| 2836 | #define I40E_REG_SPEED_1 0x08000000 |
| 2837 | #define I40E_REG_SPEED_2 0x10000000 |
| 2838 | #define I40E_REG_SPEED_3 0x18000000 |
| 2839 | #define I40E_REG_SPEED_4 0x20000000 |
| 2840 | uint32_t link_speed; |
| 2841 | uint32_t reg_val; |
| 2842 | |
| 2843 | reg_val = I40E_READ_REG(hw, I40E_PRTMAC_LINKSTA(0)); |
| 2844 | link_speed = reg_val & I40E_REG_SPEED_MASK; |
| 2845 | reg_val &= I40E_REG_LINK_UP; |
| 2846 | link->link_status = (reg_val == I40E_REG_LINK_UP) ? 1 : 0; |
| 2847 | |
| 2848 | if (unlikely(link->link_status == 0)) |
| 2849 | return; |
| 2850 | |
| 2851 | /* Parse the link status */ |
| 2852 | switch (link_speed) { |
| 2853 | case I40E_REG_SPEED_0: |
| 2854 | link->link_speed = RTE_ETH_SPEED_NUM_100M; |
| 2855 | break; |
| 2856 | case I40E_REG_SPEED_1: |
| 2857 | link->link_speed = RTE_ETH_SPEED_NUM_1G; |
| 2858 | break; |
| 2859 | case I40E_REG_SPEED_2: |
| 2860 | if (hw->mac.type == I40E_MAC_X722) |
| 2861 | link->link_speed = RTE_ETH_SPEED_NUM_2_5G; |
| 2862 | else |
| 2863 | link->link_speed = RTE_ETH_SPEED_NUM_10G; |
| 2864 | break; |
| 2865 | case I40E_REG_SPEED_3: |
| 2866 | if (hw->mac.type == I40E_MAC_X722) { |
| 2867 | link->link_speed = RTE_ETH_SPEED_NUM_5G; |
| 2868 | } else { |
| 2869 | reg_val = I40E_READ_REG(hw, I40E_PRTMAC_MACC); |
| 2870 | |
| 2871 | if (reg_val & I40E_REG_MACC_25GB) |
| 2872 | link->link_speed = RTE_ETH_SPEED_NUM_25G; |
| 2873 | else |
| 2874 | link->link_speed = RTE_ETH_SPEED_NUM_40G; |
| 2875 | } |
| 2876 | break; |
| 2877 | case I40E_REG_SPEED_4: |
| 2878 | if (hw->mac.type == I40E_MAC_X722) |
| 2879 | link->link_speed = RTE_ETH_SPEED_NUM_10G; |
| 2880 | else |
| 2881 | link->link_speed = RTE_ETH_SPEED_NUM_20G; |
| 2882 | break; |
| 2883 | default: |
| 2884 | PMD_DRV_LOG(ERR, "Unknown link speed info %u", link_speed); |
no outgoing calls
no test coverage detected