Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-phy-micrel-add-support-for-lan8842'

Horatiu Vultur says:

====================
net: phy: micrel: Add support for lan8842

Add support for LAN8842 which supports industry-standard SGMII.
While add this the first 3 patches in the series cleans more the
driver, they should not introduce any functional changes.
====================

Link: https://patch.msgid.link/20250818075121.1298170-1-horatiu.vultur@microchip.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

+555 -232
+554 -232
drivers/net/phy/micrel.c
··· 448 448 struct kszphy_phy_stats phy_stats; 449 449 }; 450 450 451 + struct lan8842_phy_stats { 452 + u64 rx_packets; 453 + u64 rx_errors; 454 + u64 tx_packets; 455 + u64 tx_errors; 456 + }; 457 + 458 + struct lan8842_priv { 459 + struct lan8842_phy_stats phy_stats; 460 + }; 461 + 451 462 static const struct kszphy_type lan8814_type = { 452 463 .led_mode_reg = ~LAN8814_LED_CTRL_1, 453 464 .cable_diag_reg = LAN8814_CABLE_DIAG, ··· 2801 2790 return ret; 2802 2791 } 2803 2792 2793 + /** 2794 + * LAN8814_PAGE_AFE_PMA - Selects Extended Page 1. 2795 + * 2796 + * This page appears to control the Analog Front-End (AFE) and Physical 2797 + * Medium Attachment (PMA) layers. It is used to access registers like 2798 + * LAN8814_PD_CONTROLS and LAN8814_LINK_QUALITY. 2799 + */ 2800 + #define LAN8814_PAGE_AFE_PMA 1 2801 + 2802 + /** 2803 + * LAN8814_PAGE_PCS_DIGITAL - Selects Extended Page 2. 2804 + * 2805 + * This page seems dedicated to the Physical Coding Sublayer (PCS) and other 2806 + * digital logic. It is used for MDI-X alignment (LAN8814_ALIGN_SWAP) and EEE 2807 + * state (LAN8814_EEE_STATE) in the LAN8814, and is repurposed for statistics 2808 + * and self-test counters in the LAN8842. 2809 + */ 2810 + #define LAN8814_PAGE_PCS_DIGITAL 2 2811 + 2812 + /** 2813 + * LAN8814_PAGE_COMMON_REGS - Selects Extended Page 4. 2814 + * 2815 + * This page contains device-common registers that affect the entire chip. 2816 + * It includes controls for chip-level resets, strap status, GPIO, 2817 + * QSGMII, the shared 1588 PTP block, and the PVT monitor. 2818 + */ 2819 + #define LAN8814_PAGE_COMMON_REGS 4 2820 + 2821 + /** 2822 + * LAN8814_PAGE_PORT_REGS - Selects Extended Page 5. 2823 + * 2824 + * This page contains port-specific registers that must be accessed 2825 + * on a per-port basis. It includes controls for port LEDs, QSGMII PCS, 2826 + * rate adaptation FIFOs, and the per-port 1588 TSU block. 2827 + */ 2828 + #define LAN8814_PAGE_PORT_REGS 5 2829 + 2830 + /** 2831 + * LAN8814_PAGE_SYSTEM_CTRL - Selects Extended Page 31. 2832 + * 2833 + * This page appears to hold fundamental system or global controls. In the 2834 + * driver, it is used by the related LAN8804 to access the 2835 + * LAN8814_CLOCK_MANAGEMENT register. 2836 + */ 2837 + #define LAN8814_PAGE_SYSTEM_CTRL 31 2838 + 2804 2839 #define LAN_EXT_PAGE_ACCESS_CONTROL 0x16 2805 2840 #define LAN_EXT_PAGE_ACCESS_ADDRESS_DATA 0x17 2806 2841 #define LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC 0x4000 ··· 2897 2840 return val; 2898 2841 } 2899 2842 2843 + static int lanphy_modify_page_reg(struct phy_device *phydev, int page, u16 addr, 2844 + u16 mask, u16 set) 2845 + { 2846 + int ret; 2847 + 2848 + phy_lock_mdio_bus(phydev); 2849 + __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); 2850 + __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); 2851 + __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, 2852 + (page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC)); 2853 + ret = __phy_modify_changed(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, 2854 + mask, set); 2855 + phy_unlock_mdio_bus(phydev); 2856 + 2857 + if (ret < 0) 2858 + phydev_err(phydev, "__phy_modify_changed() failed: %pe\n", 2859 + ERR_PTR(ret)); 2860 + 2861 + return ret; 2862 + } 2863 + 2900 2864 static int lan8814_config_ts_intr(struct phy_device *phydev, bool enable) 2901 2865 { 2902 2866 u16 val = 0; ··· 2928 2850 PTP_TSU_INT_EN_PTP_RX_TS_EN_ | 2929 2851 PTP_TSU_INT_EN_PTP_RX_TS_OVRFL_EN_; 2930 2852 2931 - return lanphy_write_page_reg(phydev, 5, PTP_TSU_INT_EN, val); 2853 + return lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2854 + PTP_TSU_INT_EN, val); 2932 2855 } 2933 2856 2934 2857 static void lan8814_ptp_rx_ts_get(struct phy_device *phydev, 2935 2858 u32 *seconds, u32 *nano_seconds, u16 *seq_id) 2936 2859 { 2937 - *seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_HI); 2860 + *seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2861 + PTP_RX_INGRESS_SEC_HI); 2938 2862 *seconds = (*seconds << 16) | 2939 - lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_LO); 2863 + lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2864 + PTP_RX_INGRESS_SEC_LO); 2940 2865 2941 - *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_HI); 2866 + *nano_seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2867 + PTP_RX_INGRESS_NS_HI); 2942 2868 *nano_seconds = ((*nano_seconds & 0x3fff) << 16) | 2943 - lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_LO); 2869 + lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2870 + PTP_RX_INGRESS_NS_LO); 2944 2871 2945 - *seq_id = lanphy_read_page_reg(phydev, 5, PTP_RX_MSG_HEADER2); 2872 + *seq_id = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2873 + PTP_RX_MSG_HEADER2); 2946 2874 } 2947 2875 2948 2876 static void lan8814_ptp_tx_ts_get(struct phy_device *phydev, 2949 2877 u32 *seconds, u32 *nano_seconds, u16 *seq_id) 2950 2878 { 2951 - *seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_HI); 2879 + *seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2880 + PTP_TX_EGRESS_SEC_HI); 2952 2881 *seconds = *seconds << 16 | 2953 - lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_LO); 2882 + lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2883 + PTP_TX_EGRESS_SEC_LO); 2954 2884 2955 - *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_HI); 2885 + *nano_seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2886 + PTP_TX_EGRESS_NS_HI); 2956 2887 *nano_seconds = ((*nano_seconds & 0x3fff) << 16) | 2957 - lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_LO); 2888 + lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2889 + PTP_TX_EGRESS_NS_LO); 2958 2890 2959 - *seq_id = lanphy_read_page_reg(phydev, 5, PTP_TX_MSG_HEADER2); 2891 + *seq_id = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 2892 + PTP_TX_MSG_HEADER2); 2960 2893 } 2961 2894 2962 2895 static int lan8814_ts_info(struct mii_timestamper *mii_ts, struct kernel_ethtool_ts_info *info) ··· 3001 2912 int i; 3002 2913 3003 2914 for (i = 0; i < FIFO_SIZE; ++i) 3004 - lanphy_read_page_reg(phydev, 5, 2915 + lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 3005 2916 egress ? PTP_TX_MSG_HEADER2 : PTP_RX_MSG_HEADER2); 3006 2917 3007 2918 /* Read to clear overflow status bit */ 3008 - lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); 2919 + lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_TSU_INT_STS); 3009 2920 } 3010 2921 3011 2922 static int lan8814_hwtstamp(struct mii_timestamper *mii_ts, ··· 3017 2928 struct lan8814_ptp_rx_ts *rx_ts, *tmp; 3018 2929 int txcfg = 0, rxcfg = 0; 3019 2930 int pkt_ts_enable; 3020 - int tx_mod; 3021 2931 3022 2932 ptp_priv->hwts_tx_type = config->tx_type; 3023 2933 ptp_priv->rx_filter = config->rx_filter; ··· 3055 2967 rxcfg |= PTP_RX_PARSE_CONFIG_IPV4_EN_ | PTP_RX_PARSE_CONFIG_IPV6_EN_; 3056 2968 txcfg |= PTP_TX_PARSE_CONFIG_IPV4_EN_ | PTP_TX_PARSE_CONFIG_IPV6_EN_; 3057 2969 } 3058 - lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_PARSE_CONFIG, rxcfg); 3059 - lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_PARSE_CONFIG, txcfg); 2970 + lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, 2971 + PTP_RX_PARSE_CONFIG, rxcfg); 2972 + lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, 2973 + PTP_TX_PARSE_CONFIG, txcfg); 3060 2974 3061 2975 pkt_ts_enable = PTP_TIMESTAMP_EN_SYNC_ | PTP_TIMESTAMP_EN_DREQ_ | 3062 2976 PTP_TIMESTAMP_EN_PDREQ_ | PTP_TIMESTAMP_EN_PDRES_; 3063 - lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_TIMESTAMP_EN, pkt_ts_enable); 3064 - lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_TIMESTAMP_EN, pkt_ts_enable); 2977 + lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, 2978 + PTP_RX_TIMESTAMP_EN, pkt_ts_enable); 2979 + lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, 2980 + PTP_TX_TIMESTAMP_EN, pkt_ts_enable); 3065 2981 3066 - tx_mod = lanphy_read_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD); 3067 2982 if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC) { 3068 - lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, 3069 - tx_mod | PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_); 2983 + lanphy_modify_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, 2984 + PTP_TX_MOD, 2985 + PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_, 2986 + PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_); 3070 2987 } else if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ON) { 3071 - lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, 3072 - tx_mod & ~PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_); 2988 + lanphy_modify_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, 2989 + PTP_TX_MOD, 2990 + PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_, 2991 + 0); 3073 2992 } 3074 2993 3075 2994 if (config->rx_filter != HWTSTAMP_FILTER_NONE) ··· 3198 3103 static void lan8814_ptp_clock_set(struct phy_device *phydev, 3199 3104 time64_t sec, u32 nsec) 3200 3105 { 3201 - lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_LO, lower_16_bits(sec)); 3202 - lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_MID, upper_16_bits(sec)); 3203 - lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_HI, upper_32_bits(sec)); 3204 - lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_LO, lower_16_bits(nsec)); 3205 - lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_HI, upper_16_bits(nsec)); 3106 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3107 + PTP_CLOCK_SET_SEC_LO, lower_16_bits(sec)); 3108 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3109 + PTP_CLOCK_SET_SEC_MID, upper_16_bits(sec)); 3110 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3111 + PTP_CLOCK_SET_SEC_HI, upper_32_bits(sec)); 3112 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3113 + PTP_CLOCK_SET_NS_LO, lower_16_bits(nsec)); 3114 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3115 + PTP_CLOCK_SET_NS_HI, upper_16_bits(nsec)); 3206 3116 3207 - lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_LOAD_); 3117 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL, 3118 + PTP_CMD_CTL_PTP_CLOCK_LOAD_); 3208 3119 } 3209 3120 3210 3121 static void lan8814_ptp_clock_get(struct phy_device *phydev, 3211 3122 time64_t *sec, u32 *nsec) 3212 3123 { 3213 - lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_READ_); 3124 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL, 3125 + PTP_CMD_CTL_PTP_CLOCK_READ_); 3214 3126 3215 - *sec = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_HI); 3127 + *sec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3128 + PTP_CLOCK_READ_SEC_HI); 3216 3129 *sec <<= 16; 3217 - *sec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_MID); 3130 + *sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3131 + PTP_CLOCK_READ_SEC_MID); 3218 3132 *sec <<= 16; 3219 - *sec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_LO); 3133 + *sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3134 + PTP_CLOCK_READ_SEC_LO); 3220 3135 3221 - *nsec = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_HI); 3136 + *nsec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3137 + PTP_CLOCK_READ_NS_HI); 3222 3138 *nsec <<= 16; 3223 - *nsec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_LO); 3139 + *nsec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3140 + PTP_CLOCK_READ_NS_LO); 3224 3141 } 3225 3142 3226 3143 static int lan8814_ptpci_gettime64(struct ptp_clock_info *ptpci, ··· 3271 3164 s64 start_sec, u32 start_nsec) 3272 3165 { 3273 3166 /* Set the start time */ 3274 - lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_SEC_LO(event), 3167 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3168 + LAN8814_PTP_CLOCK_TARGET_SEC_LO(event), 3275 3169 lower_16_bits(start_sec)); 3276 - lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_SEC_HI(event), 3170 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3171 + LAN8814_PTP_CLOCK_TARGET_SEC_HI(event), 3277 3172 upper_16_bits(start_sec)); 3278 3173 3279 - lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_NS_LO(event), 3174 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3175 + LAN8814_PTP_CLOCK_TARGET_NS_LO(event), 3280 3176 lower_16_bits(start_nsec)); 3281 - lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_NS_HI(event), 3177 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3178 + LAN8814_PTP_CLOCK_TARGET_NS_HI(event), 3282 3179 upper_16_bits(start_nsec) & 0x3fff); 3283 3180 } 3284 3181 ··· 3380 3269 adjustment_value_lo = adjustment_value & 0xffff; 3381 3270 adjustment_value_hi = (adjustment_value >> 16) & 0x3fff; 3382 3271 3383 - lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, 3272 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3273 + PTP_LTC_STEP_ADJ_LO, 3384 3274 adjustment_value_lo); 3385 - lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, 3275 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3276 + PTP_LTC_STEP_ADJ_HI, 3386 3277 PTP_LTC_STEP_ADJ_DIR_ | 3387 3278 adjustment_value_hi); 3388 3279 seconds -= ((s32)adjustment_value); ··· 3402 3289 adjustment_value_lo = adjustment_value & 0xffff; 3403 3290 adjustment_value_hi = (adjustment_value >> 16) & 0x3fff; 3404 3291 3405 - lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, 3292 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3293 + PTP_LTC_STEP_ADJ_LO, 3406 3294 adjustment_value_lo); 3407 - lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, 3295 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3296 + PTP_LTC_STEP_ADJ_HI, 3408 3297 adjustment_value_hi); 3409 3298 seconds += ((s32)adjustment_value); 3410 3299 ··· 3414 3299 set_seconds += adjustment_value; 3415 3300 lan8814_ptp_update_target(phydev, set_seconds); 3416 3301 } 3417 - lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, 3418 - PTP_CMD_CTL_PTP_LTC_STEP_SEC_); 3302 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3303 + PTP_CMD_CTL, PTP_CMD_CTL_PTP_LTC_STEP_SEC_); 3419 3304 } 3420 3305 if (nano_seconds) { 3421 3306 u16 nano_seconds_lo; ··· 3424 3309 nano_seconds_lo = nano_seconds & 0xffff; 3425 3310 nano_seconds_hi = (nano_seconds >> 16) & 0x3fff; 3426 3311 3427 - lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, 3312 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3313 + PTP_LTC_STEP_ADJ_LO, 3428 3314 nano_seconds_lo); 3429 - lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, 3315 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3316 + PTP_LTC_STEP_ADJ_HI, 3430 3317 PTP_LTC_STEP_ADJ_DIR_ | 3431 3318 nano_seconds_hi); 3432 - lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, 3319 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL, 3433 3320 PTP_CMD_CTL_PTP_LTC_STEP_NSEC_); 3434 3321 } 3435 3322 } ··· 3473 3356 kszphy_rate_adj_hi |= PTP_CLOCK_RATE_ADJ_DIR_; 3474 3357 3475 3358 mutex_lock(&shared->shared_lock); 3476 - lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_HI, kszphy_rate_adj_hi); 3477 - lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_LO, kszphy_rate_adj_lo); 3359 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CLOCK_RATE_ADJ_HI, 3360 + kszphy_rate_adj_hi); 3361 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CLOCK_RATE_ADJ_LO, 3362 + kszphy_rate_adj_lo); 3478 3363 mutex_unlock(&shared->shared_lock); 3479 3364 3480 3365 return 0; ··· 3485 3366 static void lan8814_ptp_set_reload(struct phy_device *phydev, int event, 3486 3367 s64 period_sec, u32 period_nsec) 3487 3368 { 3488 - lanphy_write_page_reg(phydev, 4, 3369 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3489 3370 LAN8814_PTP_CLOCK_TARGET_RELOAD_SEC_LO(event), 3490 3371 lower_16_bits(period_sec)); 3491 - lanphy_write_page_reg(phydev, 4, 3372 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3492 3373 LAN8814_PTP_CLOCK_TARGET_RELOAD_SEC_HI(event), 3493 3374 upper_16_bits(period_sec)); 3494 3375 3495 - lanphy_write_page_reg(phydev, 4, 3376 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3496 3377 LAN8814_PTP_CLOCK_TARGET_RELOAD_NS_LO(event), 3497 3378 lower_16_bits(period_nsec)); 3498 - lanphy_write_page_reg(phydev, 4, 3379 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3499 3380 LAN8814_PTP_CLOCK_TARGET_RELOAD_NS_HI(event), 3500 3381 upper_16_bits(period_nsec) & 0x3fff); 3501 3382 } ··· 3503 3384 static void lan8814_ptp_enable_event(struct phy_device *phydev, int event, 3504 3385 int pulse_width) 3505 3386 { 3506 - u16 val; 3507 - 3508 - val = lanphy_read_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG); 3509 - /* Set the pulse width of the event */ 3510 - val &= ~(LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_MASK(event)); 3511 - /* Make sure that the target clock will be incremented each time when 3387 + /* Set the pulse width of the event, 3388 + * Make sure that the target clock will be incremented each time when 3512 3389 * local time reaches or pass it 3390 + * Set the polarity high 3513 3391 */ 3514 - val |= LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_SET(event, pulse_width); 3515 - val &= ~(LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event)); 3516 - /* Set the polarity high */ 3517 - val |= LAN8814_PTP_GENERAL_CONFIG_POLARITY_X(event); 3518 - lanphy_write_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG, val); 3392 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, LAN8814_PTP_GENERAL_CONFIG, 3393 + LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_MASK(event) | 3394 + LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_SET(event, pulse_width) | 3395 + LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event) | 3396 + LAN8814_PTP_GENERAL_CONFIG_POLARITY_X(event), 3397 + LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_SET(event, pulse_width) | 3398 + LAN8814_PTP_GENERAL_CONFIG_POLARITY_X(event)); 3519 3399 } 3520 3400 3521 3401 static void lan8814_ptp_disable_event(struct phy_device *phydev, int event) 3522 3402 { 3523 - u16 val; 3524 - 3525 3403 /* Set target to too far in the future, effectively disabling it */ 3526 3404 lan8814_ptp_set_target(phydev, event, 0xFFFFFFFF, 0); 3527 3405 3528 3406 /* And then reload once it recheas the target */ 3529 - val = lanphy_read_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG); 3530 - val |= LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event); 3531 - lanphy_write_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG, val); 3407 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, LAN8814_PTP_GENERAL_CONFIG, 3408 + LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event), 3409 + LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event)); 3532 3410 } 3533 3411 3534 3412 static void lan8814_ptp_perout_off(struct phy_device *phydev, int pin) 3535 3413 { 3536 - u16 val; 3537 - 3538 3414 /* Disable gpio alternate function, 3539 3415 * 1: select as gpio, 3540 3416 * 0: select alt func 3541 3417 */ 3542 - val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); 3543 - val |= LAN8814_GPIO_EN_BIT(pin); 3544 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), val); 3418 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3419 + LAN8814_GPIO_EN_ADDR(pin), 3420 + LAN8814_GPIO_EN_BIT(pin), 3421 + LAN8814_GPIO_EN_BIT(pin)); 3545 3422 3546 - val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); 3547 - val &= ~LAN8814_GPIO_DIR_BIT(pin); 3548 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), val); 3423 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3424 + LAN8814_GPIO_DIR_ADDR(pin), 3425 + LAN8814_GPIO_DIR_BIT(pin), 3426 + 0); 3549 3427 3550 - val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin)); 3551 - val &= ~LAN8814_GPIO_BUF_BIT(pin); 3552 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin), val); 3428 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3429 + LAN8814_GPIO_BUF_ADDR(pin), 3430 + LAN8814_GPIO_BUF_BIT(pin), 3431 + 0); 3553 3432 } 3554 3433 3555 3434 static void lan8814_ptp_perout_on(struct phy_device *phydev, int pin) 3556 3435 { 3557 - int val; 3558 - 3559 3436 /* Set as gpio output */ 3560 - val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); 3561 - val |= LAN8814_GPIO_DIR_BIT(pin); 3562 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), val); 3437 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3438 + LAN8814_GPIO_DIR_ADDR(pin), 3439 + LAN8814_GPIO_DIR_BIT(pin), 3440 + LAN8814_GPIO_DIR_BIT(pin)); 3563 3441 3564 3442 /* Enable gpio 0:for alternate function, 1:gpio */ 3565 - val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); 3566 - val &= ~LAN8814_GPIO_EN_BIT(pin); 3567 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), val); 3443 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3444 + LAN8814_GPIO_EN_ADDR(pin), 3445 + LAN8814_GPIO_EN_BIT(pin), 3446 + 0); 3568 3447 3569 3448 /* Set buffer type to push pull */ 3570 - val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin)); 3571 - val |= LAN8814_GPIO_BUF_BIT(pin); 3572 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin), val); 3449 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3450 + LAN8814_GPIO_BUF_ADDR(pin), 3451 + LAN8814_GPIO_BUF_BIT(pin), 3452 + LAN8814_GPIO_BUF_BIT(pin)); 3573 3453 } 3574 3454 3575 3455 static int lan8814_ptp_perout(struct ptp_clock_info *ptpci, ··· 3683 3565 3684 3566 static void lan8814_ptp_extts_on(struct phy_device *phydev, int pin, u32 flags) 3685 3567 { 3686 - u16 tmp; 3687 - 3688 3568 /* Set as gpio input */ 3689 - tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); 3690 - tmp &= ~LAN8814_GPIO_DIR_BIT(pin); 3691 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), tmp); 3569 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3570 + LAN8814_GPIO_DIR_ADDR(pin), 3571 + LAN8814_GPIO_DIR_BIT(pin), 3572 + 0); 3692 3573 3693 3574 /* Map the pin to ltc pin 0 of the capture map registers */ 3694 - tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO); 3695 - tmp |= pin; 3696 - lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO, tmp); 3575 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3576 + PTP_GPIO_CAP_MAP_LO, pin, pin); 3697 3577 3698 3578 /* Enable capture on the edges of the ltc pin */ 3699 - tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_EN); 3700 3579 if (flags & PTP_RISING_EDGE) 3701 - tmp |= PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(0); 3580 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3581 + PTP_GPIO_CAP_EN, 3582 + PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(0), 3583 + PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(0)); 3702 3584 if (flags & PTP_FALLING_EDGE) 3703 - tmp |= PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(0); 3704 - lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_EN, tmp); 3585 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3586 + PTP_GPIO_CAP_EN, 3587 + PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(0), 3588 + PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(0)); 3705 3589 3706 3590 /* Enable interrupt top interrupt */ 3707 - tmp = lanphy_read_page_reg(phydev, 4, PTP_COMMON_INT_ENA); 3708 - tmp |= PTP_COMMON_INT_ENA_GPIO_CAP_EN; 3709 - lanphy_write_page_reg(phydev, 4, PTP_COMMON_INT_ENA, tmp); 3591 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_COMMON_INT_ENA, 3592 + PTP_COMMON_INT_ENA_GPIO_CAP_EN, 3593 + PTP_COMMON_INT_ENA_GPIO_CAP_EN); 3710 3594 } 3711 3595 3712 3596 static void lan8814_ptp_extts_off(struct phy_device *phydev, int pin) 3713 3597 { 3714 - u16 tmp; 3715 - 3716 3598 /* Set as gpio out */ 3717 - tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); 3718 - tmp |= LAN8814_GPIO_DIR_BIT(pin); 3719 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), tmp); 3599 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3600 + LAN8814_GPIO_DIR_ADDR(pin), 3601 + LAN8814_GPIO_DIR_BIT(pin), 3602 + LAN8814_GPIO_DIR_BIT(pin)); 3720 3603 3721 3604 /* Enable alternate, 0:for alternate function, 1:gpio */ 3722 - tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); 3723 - tmp &= ~LAN8814_GPIO_EN_BIT(pin); 3724 - lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), tmp); 3605 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3606 + LAN8814_GPIO_EN_ADDR(pin), 3607 + LAN8814_GPIO_EN_BIT(pin), 3608 + 0); 3725 3609 3726 3610 /* Clear the mapping of pin to registers 0 of the capture registers */ 3727 - tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO); 3728 - tmp &= ~GENMASK(3, 0); 3729 - lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO, tmp); 3611 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3612 + PTP_GPIO_CAP_MAP_LO, 3613 + GENMASK(3, 0), 3614 + 0); 3730 3615 3731 3616 /* Disable capture on both of the edges */ 3732 - tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_EN); 3733 - tmp &= ~PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(pin); 3734 - tmp &= ~PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(pin); 3735 - lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_EN, tmp); 3617 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_GPIO_CAP_EN, 3618 + PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(pin) | 3619 + PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(pin), 3620 + 0); 3736 3621 3737 3622 /* Disable interrupt top interrupt */ 3738 - tmp = lanphy_read_page_reg(phydev, 4, PTP_COMMON_INT_ENA); 3739 - tmp &= ~PTP_COMMON_INT_ENA_GPIO_CAP_EN; 3740 - lanphy_write_page_reg(phydev, 4, PTP_COMMON_INT_ENA, tmp); 3623 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_COMMON_INT_ENA, 3624 + PTP_COMMON_INT_ENA_GPIO_CAP_EN, 3625 + 0); 3741 3626 } 3742 3627 3743 3628 static int lan8814_ptp_extts(struct ptp_clock_info *ptpci, ··· 3870 3749 /* If other timestamps are available in the FIFO, 3871 3750 * process them. 3872 3751 */ 3873 - reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); 3752 + reg = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 3753 + PTP_CAP_INFO); 3874 3754 } while (PTP_CAP_INFO_TX_TS_CNT_GET_(reg) > 0); 3875 3755 } 3876 3756 ··· 3944 3822 /* If other timestamps are available in the FIFO, 3945 3823 * process them. 3946 3824 */ 3947 - reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); 3825 + reg = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 3826 + PTP_CAP_INFO); 3948 3827 } while (PTP_CAP_INFO_RX_TS_CNT_GET_(reg) > 0); 3949 3828 } 3950 3829 ··· 3982 3859 /* This is 0 because whatever was the input pin it was mapped it to 3983 3860 * ltc gpio pin 0 3984 3861 */ 3985 - tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_SEL); 3986 - tmp |= PTP_GPIO_SEL_GPIO_SEL(0); 3987 - lanphy_write_page_reg(phydev, 4, PTP_GPIO_SEL, tmp); 3862 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_GPIO_SEL, 3863 + PTP_GPIO_SEL_GPIO_SEL(0), 3864 + PTP_GPIO_SEL_GPIO_SEL(0)); 3988 3865 3989 - tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_STS); 3866 + tmp = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3867 + PTP_GPIO_CAP_STS); 3990 3868 if (!(tmp & PTP_GPIO_CAP_STS_PTP_GPIO_RE_STS(0)) && 3991 3869 !(tmp & PTP_GPIO_CAP_STS_PTP_GPIO_FE_STS(0))) 3992 3870 return -1; 3993 3871 3994 3872 if (tmp & BIT(0)) { 3995 - sec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_SEC_HI_CAP); 3873 + sec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3874 + PTP_GPIO_RE_LTC_SEC_HI_CAP); 3996 3875 sec <<= 16; 3997 - sec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_SEC_LO_CAP); 3876 + sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3877 + PTP_GPIO_RE_LTC_SEC_LO_CAP); 3998 3878 3999 - nsec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff; 3879 + nsec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3880 + PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff; 4000 3881 nsec <<= 16; 4001 - nsec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_LO_CAP); 3882 + nsec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3883 + PTP_GPIO_RE_LTC_NS_LO_CAP); 4002 3884 } else { 4003 - sec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_SEC_HI_CAP); 3885 + sec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3886 + PTP_GPIO_FE_LTC_SEC_HI_CAP); 4004 3887 sec <<= 16; 4005 - sec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_SEC_LO_CAP); 3888 + sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3889 + PTP_GPIO_FE_LTC_SEC_LO_CAP); 4006 3890 4007 - nsec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff; 3891 + nsec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3892 + PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff; 4008 3893 nsec <<= 16; 4009 - nsec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_LO_CAP); 3894 + nsec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 3895 + PTP_GPIO_RE_LTC_NS_LO_CAP); 4010 3896 } 4011 3897 4012 3898 ptp_event.index = 0; ··· 4040 3908 4041 3909 static int lan8804_config_init(struct phy_device *phydev) 4042 3910 { 4043 - int val; 4044 - 4045 3911 /* MDI-X setting for swap A,B transmit */ 4046 - val = lanphy_read_page_reg(phydev, 2, LAN8804_ALIGN_SWAP); 4047 - val &= ~LAN8804_ALIGN_TX_A_B_SWAP_MASK; 4048 - val |= LAN8804_ALIGN_TX_A_B_SWAP; 4049 - lanphy_write_page_reg(phydev, 2, LAN8804_ALIGN_SWAP, val); 3912 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, LAN8804_ALIGN_SWAP, 3913 + LAN8804_ALIGN_TX_A_B_SWAP_MASK, 3914 + LAN8804_ALIGN_TX_A_B_SWAP); 4050 3915 4051 3916 /* Make sure that the PHY will not stop generating the clock when the 4052 3917 * link partner goes down 4053 3918 */ 4054 - lanphy_write_page_reg(phydev, 31, LAN8814_CLOCK_MANAGEMENT, 0x27e); 4055 - lanphy_read_page_reg(phydev, 1, LAN8814_LINK_QUALITY); 3919 + lanphy_write_page_reg(phydev, LAN8814_PAGE_SYSTEM_CTRL, 3920 + LAN8814_CLOCK_MANAGEMENT, 0x27e); 3921 + lanphy_read_page_reg(phydev, LAN8814_PAGE_AFE_PMA, LAN8814_LINK_QUALITY); 4056 3922 4057 3923 return 0; 4058 3924 } ··· 4132 4002 } 4133 4003 4134 4004 while (true) { 4135 - irq_status = lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); 4005 + irq_status = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4006 + PTP_TSU_INT_STS); 4136 4007 if (!irq_status) 4137 4008 break; 4138 4009 ··· 4161 4030 { 4162 4031 int err; 4163 4032 4164 - lanphy_write_page_reg(phydev, 4, LAN8814_INTR_CTRL_REG, 4033 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, LAN8814_INTR_CTRL_REG, 4165 4034 LAN8814_INTR_CTRL_REG_POLARITY | 4166 4035 LAN8814_INTR_CTRL_REG_INTR_ENABLE); 4167 4036 ··· 4187 4056 { 4188 4057 struct kszphy_priv *priv = phydev->priv; 4189 4058 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; 4190 - u32 temp; 4191 4059 4192 4060 if (!IS_ENABLED(CONFIG_PTP_1588_CLOCK) || 4193 4061 !IS_ENABLED(CONFIG_NETWORK_PHY_TIMESTAMPING)) 4194 4062 return; 4195 4063 4196 - lanphy_write_page_reg(phydev, 5, TSU_HARD_RESET, TSU_HARD_RESET_); 4064 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4065 + TSU_HARD_RESET, TSU_HARD_RESET_); 4197 4066 4198 - temp = lanphy_read_page_reg(phydev, 5, PTP_TX_MOD); 4199 - temp |= PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_; 4200 - lanphy_write_page_reg(phydev, 5, PTP_TX_MOD, temp); 4067 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_TX_MOD, 4068 + PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_, 4069 + PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_); 4201 4070 4202 - temp = lanphy_read_page_reg(phydev, 5, PTP_RX_MOD); 4203 - temp |= PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_; 4204 - lanphy_write_page_reg(phydev, 5, PTP_RX_MOD, temp); 4071 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_RX_MOD, 4072 + PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_, 4073 + PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_); 4205 4074 4206 - lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_CONFIG, 0); 4207 - lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_CONFIG, 0); 4075 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4076 + PTP_RX_PARSE_CONFIG, 0); 4077 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4078 + PTP_TX_PARSE_CONFIG, 0); 4208 4079 4209 4080 /* Removing default registers configs related to L2 and IP */ 4210 - lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_L2_ADDR_EN, 0); 4211 - lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_L2_ADDR_EN, 0); 4212 - lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_IP_ADDR_EN, 0); 4213 - lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_IP_ADDR_EN, 0); 4081 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4082 + PTP_TX_PARSE_L2_ADDR_EN, 0); 4083 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4084 + PTP_RX_PARSE_L2_ADDR_EN, 0); 4085 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4086 + PTP_TX_PARSE_IP_ADDR_EN, 0); 4087 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4088 + PTP_RX_PARSE_IP_ADDR_EN, 0); 4214 4089 4215 4090 /* Disable checking for minorVersionPTP field */ 4216 - lanphy_write_page_reg(phydev, 5, PTP_RX_VERSION, 4091 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_RX_VERSION, 4217 4092 PTP_MAX_VERSION(0xff) | PTP_MIN_VERSION(0x0)); 4218 - lanphy_write_page_reg(phydev, 5, PTP_TX_VERSION, 4093 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_TX_VERSION, 4219 4094 PTP_MAX_VERSION(0xff) | PTP_MIN_VERSION(0x0)); 4220 4095 4221 4096 skb_queue_head_init(&ptp_priv->tx_queue); ··· 4306 4169 /* The EP.4 is shared between all the PHYs in the package and also it 4307 4170 * can be accessed by any of the PHYs 4308 4171 */ 4309 - lanphy_write_page_reg(phydev, 4, LTC_HARD_RESET, LTC_HARD_RESET_); 4310 - lanphy_write_page_reg(phydev, 4, PTP_OPERATING_MODE, 4172 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 4173 + LTC_HARD_RESET, LTC_HARD_RESET_); 4174 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_OPERATING_MODE, 4311 4175 PTP_OPERATING_MODE_STANDALONE_); 4312 4176 4313 4177 /* Enable ptp to run LTC clock for ptp and gpio 1PPS operation */ 4314 - lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_ENABLE_); 4178 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL, 4179 + PTP_CMD_CTL_PTP_ENABLE_); 4315 4180 4316 4181 return 0; 4317 4182 } ··· 4322 4183 { 4323 4184 int temp; 4324 4185 4325 - temp = lanphy_read_page_reg(phydev, 5, LAN8814_LED_CTRL_1); 4186 + temp = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4187 + LAN8814_LED_CTRL_1); 4326 4188 4327 4189 if (val) 4328 4190 temp |= LAN8814_LED_CTRL_1_KSZ9031_LED_MODE_; 4329 4191 else 4330 4192 temp &= ~LAN8814_LED_CTRL_1_KSZ9031_LED_MODE_; 4331 4193 4332 - lanphy_write_page_reg(phydev, 5, LAN8814_LED_CTRL_1, temp); 4194 + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 4195 + LAN8814_LED_CTRL_1, temp); 4333 4196 } 4334 4197 4335 4198 static int lan8814_config_init(struct phy_device *phydev) 4336 4199 { 4337 4200 struct kszphy_priv *lan8814 = phydev->priv; 4338 - int val; 4339 4201 4340 4202 /* Reset the PHY */ 4341 - val = lanphy_read_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET); 4342 - val |= LAN8814_QSGMII_SOFT_RESET_BIT; 4343 - lanphy_write_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET, val); 4203 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 4204 + LAN8814_QSGMII_SOFT_RESET, 4205 + LAN8814_QSGMII_SOFT_RESET_BIT, 4206 + LAN8814_QSGMII_SOFT_RESET_BIT); 4344 4207 4345 4208 /* Disable ANEG with QSGMII PCS Host side */ 4346 - val = lanphy_read_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG); 4347 - val &= ~LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA; 4348 - lanphy_write_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG, val); 4209 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 4210 + LAN8814_QSGMII_PCS1G_ANEG_CONFIG, 4211 + LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA, 4212 + 0); 4349 4213 4350 4214 /* MDI-X setting for swap A,B transmit */ 4351 - val = lanphy_read_page_reg(phydev, 2, LAN8814_ALIGN_SWAP); 4352 - val &= ~LAN8814_ALIGN_TX_A_B_SWAP_MASK; 4353 - val |= LAN8814_ALIGN_TX_A_B_SWAP; 4354 - lanphy_write_page_reg(phydev, 2, LAN8814_ALIGN_SWAP, val); 4215 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, LAN8814_ALIGN_SWAP, 4216 + LAN8814_ALIGN_TX_A_B_SWAP_MASK, 4217 + LAN8814_ALIGN_TX_A_B_SWAP); 4355 4218 4356 4219 if (lan8814->led_mode >= 0) 4357 4220 lan8814_setup_led(phydev, lan8814->led_mode); ··· 4384 4243 4385 4244 static void lan8814_clear_2psp_bit(struct phy_device *phydev) 4386 4245 { 4387 - u16 val; 4388 - 4389 4246 /* It was noticed that when traffic is passing through the PHY and the 4390 4247 * cable is removed then the LED was still one even though there is no 4391 4248 * link 4392 4249 */ 4393 - val = lanphy_read_page_reg(phydev, 2, LAN8814_EEE_STATE); 4394 - val &= ~LAN8814_EEE_STATE_MASK2P5P; 4395 - lanphy_write_page_reg(phydev, 2, LAN8814_EEE_STATE, val); 4250 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, LAN8814_EEE_STATE, 4251 + LAN8814_EEE_STATE_MASK2P5P, 4252 + 0); 4396 4253 } 4397 4254 4398 4255 static void lan8814_update_meas_time(struct phy_device *phydev) 4399 4256 { 4400 - u16 val; 4401 - 4402 4257 /* By setting the measure time to a value of 0xb this will allow cables 4403 4258 * longer than 100m to be used. This configuration can be used 4404 4259 * regardless of the mode of operation of the PHY 4405 4260 */ 4406 - val = lanphy_read_page_reg(phydev, 1, LAN8814_PD_CONTROLS); 4407 - val &= ~LAN8814_PD_CONTROLS_PD_MEAS_TIME_MASK; 4408 - val |= LAN8814_PD_CONTROLS_PD_MEAS_TIME_VAL; 4409 - lanphy_write_page_reg(phydev, 1, LAN8814_PD_CONTROLS, val); 4261 + lanphy_modify_page_reg(phydev, LAN8814_PAGE_AFE_PMA, LAN8814_PD_CONTROLS, 4262 + LAN8814_PD_CONTROLS_PD_MEAS_TIME_MASK, 4263 + LAN8814_PD_CONTROLS_PD_MEAS_TIME_VAL); 4410 4264 } 4411 4265 4412 4266 static int lan8814_probe(struct phy_device *phydev) ··· 4424 4288 /* Strap-in value for PHY address, below register read gives starting 4425 4289 * phy address value 4426 4290 */ 4427 - addr = lanphy_read_page_reg(phydev, 4, 0) & 0x1F; 4291 + addr = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 0) & 0x1F; 4428 4292 devm_phy_package_join(&phydev->mdio.dev, phydev, 4429 4293 addr, sizeof(struct lan8814_shared_priv)); 4430 4294 ··· 5779 5643 return kszphy_resume(phydev); 5780 5644 } 5781 5645 5646 + #define LAN8842_SELF_TEST 14 /* 0x0e */ 5647 + #define LAN8842_SELF_TEST_RX_CNT_ENA BIT(8) 5648 + #define LAN8842_SELF_TEST_TX_CNT_ENA BIT(4) 5649 + 5650 + static int lan8842_probe(struct phy_device *phydev) 5651 + { 5652 + struct lan8842_priv *priv; 5653 + int ret; 5654 + 5655 + priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); 5656 + if (!priv) 5657 + return -ENOMEM; 5658 + 5659 + phydev->priv = priv; 5660 + 5661 + /* Similar to lan8814 this PHY has a pin which needs to be pulled down 5662 + * to enable to pass any traffic through it. Therefore use the same 5663 + * function as lan8814 5664 + */ 5665 + ret = lan8814_release_coma_mode(phydev); 5666 + if (ret) 5667 + return ret; 5668 + 5669 + /* Enable to count the RX and TX packets */ 5670 + ret = lanphy_write_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, 5671 + LAN8842_SELF_TEST, 5672 + LAN8842_SELF_TEST_RX_CNT_ENA | 5673 + LAN8842_SELF_TEST_TX_CNT_ENA); 5674 + if (ret < 0) 5675 + return ret; 5676 + 5677 + return 0; 5678 + } 5679 + 5680 + static int lan8842_config_init(struct phy_device *phydev) 5681 + { 5682 + int ret; 5683 + 5684 + /* Reset the PHY */ 5685 + ret = lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 5686 + LAN8814_QSGMII_SOFT_RESET, 5687 + LAN8814_QSGMII_SOFT_RESET_BIT, 5688 + LAN8814_QSGMII_SOFT_RESET_BIT); 5689 + if (ret < 0) 5690 + return ret; 5691 + 5692 + /* To allow the PHY to control the LEDs the GPIOs of the PHY should have 5693 + * a function mode and not the GPIO. Apparently by default the value is 5694 + * GPIO and not function even though the datasheet it says that it is 5695 + * function. Therefore set this value. 5696 + */ 5697 + return lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 5698 + LAN8814_GPIO_EN2, 0); 5699 + } 5700 + 5701 + #define LAN8842_INTR_CTRL_REG 52 /* 0x34 */ 5702 + 5703 + static int lan8842_config_intr(struct phy_device *phydev) 5704 + { 5705 + int err; 5706 + 5707 + lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 5708 + LAN8842_INTR_CTRL_REG, 5709 + LAN8814_INTR_CTRL_REG_INTR_ENABLE); 5710 + 5711 + /* enable / disable interrupts */ 5712 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { 5713 + err = lan8814_ack_interrupt(phydev); 5714 + if (err) 5715 + return err; 5716 + 5717 + err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); 5718 + } else { 5719 + err = phy_write(phydev, LAN8814_INTC, 0); 5720 + if (err) 5721 + return err; 5722 + 5723 + err = lan8814_ack_interrupt(phydev); 5724 + } 5725 + 5726 + return err; 5727 + } 5728 + 5729 + static unsigned int lan8842_inband_caps(struct phy_device *phydev, 5730 + phy_interface_t interface) 5731 + { 5732 + /* Inband configuration can be enabled or disabled using the registers 5733 + * PCS1G_ANEG_CONFIG. 5734 + */ 5735 + return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE; 5736 + } 5737 + 5738 + static int lan8842_config_inband(struct phy_device *phydev, unsigned int modes) 5739 + { 5740 + bool enable; 5741 + 5742 + if (modes == LINK_INBAND_DISABLE) 5743 + enable = false; 5744 + else 5745 + enable = true; 5746 + 5747 + /* Disable or enable in-band autoneg with PCS Host side 5748 + * It has the same address as lan8814 5749 + */ 5750 + return lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS, 5751 + LAN8814_QSGMII_PCS1G_ANEG_CONFIG, 5752 + LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA, 5753 + enable ? LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA : 0); 5754 + } 5755 + 5756 + static irqreturn_t lan8842_handle_interrupt(struct phy_device *phydev) 5757 + { 5758 + int ret = IRQ_NONE; 5759 + int irq_status; 5760 + 5761 + irq_status = phy_read(phydev, LAN8814_INTS); 5762 + if (irq_status < 0) { 5763 + phy_error(phydev); 5764 + return IRQ_NONE; 5765 + } 5766 + 5767 + if (irq_status & LAN8814_INT_LINK) { 5768 + phy_trigger_machine(phydev); 5769 + ret = IRQ_HANDLED; 5770 + } 5771 + 5772 + return ret; 5773 + } 5774 + 5775 + static u64 lan8842_get_stat(struct phy_device *phydev, int count, int *regs) 5776 + { 5777 + u64 ret = 0; 5778 + int val; 5779 + 5780 + for (int j = 0; j < count; ++j) { 5781 + val = lanphy_read_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, 5782 + regs[j]); 5783 + if (val < 0) 5784 + return U64_MAX; 5785 + 5786 + ret <<= 16; 5787 + ret += val; 5788 + } 5789 + return ret; 5790 + } 5791 + 5792 + static int lan8842_update_stats(struct phy_device *phydev) 5793 + { 5794 + struct lan8842_priv *priv = phydev->priv; 5795 + int rx_packets_regs[] = {88, 61, 60}; 5796 + int rx_errors_regs[] = {63, 62}; 5797 + int tx_packets_regs[] = {89, 85, 84}; 5798 + int tx_errors_regs[] = {87, 86}; 5799 + 5800 + priv->phy_stats.rx_packets = lan8842_get_stat(phydev, 5801 + ARRAY_SIZE(rx_packets_regs), 5802 + rx_packets_regs); 5803 + priv->phy_stats.rx_errors = lan8842_get_stat(phydev, 5804 + ARRAY_SIZE(rx_errors_regs), 5805 + rx_errors_regs); 5806 + priv->phy_stats.tx_packets = lan8842_get_stat(phydev, 5807 + ARRAY_SIZE(tx_packets_regs), 5808 + tx_packets_regs); 5809 + priv->phy_stats.tx_errors = lan8842_get_stat(phydev, 5810 + ARRAY_SIZE(tx_errors_regs), 5811 + tx_errors_regs); 5812 + 5813 + return 0; 5814 + } 5815 + 5816 + static void lan8842_get_phy_stats(struct phy_device *phydev, 5817 + struct ethtool_eth_phy_stats *eth_stats, 5818 + struct ethtool_phy_stats *stats) 5819 + { 5820 + struct lan8842_priv *priv = phydev->priv; 5821 + 5822 + stats->rx_packets = priv->phy_stats.rx_packets; 5823 + stats->rx_errors = priv->phy_stats.rx_errors; 5824 + stats->tx_packets = priv->phy_stats.tx_packets; 5825 + stats->tx_errors = priv->phy_stats.tx_errors; 5826 + } 5827 + 5782 5828 static struct phy_driver ksphy_driver[] = { 5783 5829 { 5784 - .phy_id = PHY_ID_KS8737, 5785 - .phy_id_mask = MICREL_PHY_ID_MASK, 5830 + PHY_ID_MATCH_MODEL(PHY_ID_KS8737), 5786 5831 .name = "Micrel KS8737", 5787 5832 /* PHY_BASIC_FEATURES */ 5788 5833 .driver_data = &ks8737_type, ··· 6004 5687 .suspend = kszphy_suspend, 6005 5688 .resume = kszphy_resume, 6006 5689 }, { 6007 - .phy_id = PHY_ID_KSZ8041, 6008 - .phy_id_mask = MICREL_PHY_ID_MASK, 5690 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041), 6009 5691 .name = "Micrel KSZ8041", 6010 5692 /* PHY_BASIC_FEATURES */ 6011 5693 .driver_data = &ksz8041_type, ··· 6019 5703 .suspend = ksz8041_suspend, 6020 5704 .resume = ksz8041_resume, 6021 5705 }, { 6022 - .phy_id = PHY_ID_KSZ8041RNLI, 6023 - .phy_id_mask = MICREL_PHY_ID_MASK, 5706 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041RNLI), 6024 5707 .name = "Micrel KSZ8041RNLI", 6025 5708 /* PHY_BASIC_FEATURES */ 6026 5709 .driver_data = &ksz8041_type, ··· 6062 5747 .suspend = kszphy_suspend, 6063 5748 .resume = kszphy_resume, 6064 5749 }, { 6065 - .phy_id = PHY_ID_KSZ8081, 5750 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ8081), 6066 5751 .name = "Micrel KSZ8081 or KSZ8091", 6067 - .phy_id_mask = MICREL_PHY_ID_MASK, 6068 5752 .flags = PHY_POLL_CABLE_TEST, 6069 5753 /* PHY_BASIC_FEATURES */ 6070 5754 .driver_data = &ksz8081_type, ··· 6082 5768 .cable_test_start = ksz886x_cable_test_start, 6083 5769 .cable_test_get_status = ksz886x_cable_test_get_status, 6084 5770 }, { 6085 - .phy_id = PHY_ID_KSZ8061, 5771 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ8061), 6086 5772 .name = "Micrel KSZ8061", 6087 - .phy_id_mask = MICREL_PHY_ID_MASK, 6088 5773 /* PHY_BASIC_FEATURES */ 6089 5774 .probe = kszphy_probe, 6090 5775 .config_init = ksz8061_config_init, ··· 6111 5798 .read_mmd = genphy_read_mmd_unsupported, 6112 5799 .write_mmd = genphy_write_mmd_unsupported, 6113 5800 }, { 6114 - .phy_id = PHY_ID_KSZ9031, 6115 - .phy_id_mask = MICREL_PHY_ID_MASK, 5801 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ9031), 6116 5802 .name = "Micrel KSZ9031 Gigabit PHY", 6117 5803 .flags = PHY_POLL_CABLE_TEST, 6118 5804 .driver_data = &ksz9021_type, ··· 6131 5819 .cable_test_get_status = ksz9x31_cable_test_get_status, 6132 5820 .set_loopback = ksz9031_set_loopback, 6133 5821 }, { 6134 - .phy_id = PHY_ID_LAN8814, 6135 - .phy_id_mask = MICREL_PHY_ID_MASK, 5822 + PHY_ID_MATCH_MODEL(PHY_ID_LAN8814), 6136 5823 .name = "Microchip INDY Gigabit Quad PHY", 6137 5824 .flags = PHY_POLL_CABLE_TEST, 6138 5825 .config_init = lan8814_config_init, ··· 6149 5838 .cable_test_start = lan8814_cable_test_start, 6150 5839 .cable_test_get_status = ksz886x_cable_test_get_status, 6151 5840 }, { 6152 - .phy_id = PHY_ID_LAN8804, 6153 - .phy_id_mask = MICREL_PHY_ID_MASK, 5841 + PHY_ID_MATCH_MODEL(PHY_ID_LAN8804), 6154 5842 .name = "Microchip LAN966X Gigabit PHY", 6155 5843 .config_init = lan8804_config_init, 6156 5844 .driver_data = &ksz9021_type, ··· 6164 5854 .config_intr = lan8804_config_intr, 6165 5855 .handle_interrupt = lan8804_handle_interrupt, 6166 5856 }, { 6167 - .phy_id = PHY_ID_LAN8841, 6168 - .phy_id_mask = MICREL_PHY_ID_MASK, 5857 + PHY_ID_MATCH_MODEL(PHY_ID_LAN8841), 6169 5858 .name = "Microchip LAN8841 Gigabit PHY", 6170 5859 .flags = PHY_POLL_CABLE_TEST, 6171 5860 .driver_data = &lan8841_type, ··· 6181 5872 .cable_test_start = lan8814_cable_test_start, 6182 5873 .cable_test_get_status = ksz886x_cable_test_get_status, 6183 5874 }, { 6184 - .phy_id = PHY_ID_KSZ9131, 6185 - .phy_id_mask = MICREL_PHY_ID_MASK, 5875 + PHY_ID_MATCH_MODEL(PHY_ID_LAN8842), 5876 + .name = "Microchip LAN8842 Gigabit PHY", 5877 + .flags = PHY_POLL_CABLE_TEST, 5878 + .driver_data = &lan8814_type, 5879 + .probe = lan8842_probe, 5880 + .config_init = lan8842_config_init, 5881 + .config_intr = lan8842_config_intr, 5882 + .inband_caps = lan8842_inband_caps, 5883 + .config_inband = lan8842_config_inband, 5884 + .handle_interrupt = lan8842_handle_interrupt, 5885 + .get_phy_stats = lan8842_get_phy_stats, 5886 + .update_stats = lan8842_update_stats, 5887 + .cable_test_start = lan8814_cable_test_start, 5888 + .cable_test_get_status = ksz886x_cable_test_get_status, 5889 + }, { 5890 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ9131), 6186 5891 .name = "Microchip KSZ9131 Gigabit PHY", 6187 5892 /* PHY_GBIT_FEATURES */ 6188 5893 .flags = PHY_POLL_CABLE_TEST, ··· 6217 5894 .cable_test_get_status = ksz9x31_cable_test_get_status, 6218 5895 .get_features = ksz9477_get_features, 6219 5896 }, { 6220 - .phy_id = PHY_ID_KSZ8873MLL, 6221 - .phy_id_mask = MICREL_PHY_ID_MASK, 5897 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ8873MLL), 6222 5898 .name = "Micrel KSZ8873MLL Switch", 6223 5899 /* PHY_BASIC_FEATURES */ 6224 5900 .config_init = kszphy_config_init, ··· 6226 5904 .suspend = genphy_suspend, 6227 5905 .resume = genphy_resume, 6228 5906 }, { 6229 - .phy_id = PHY_ID_KSZ886X, 6230 - .phy_id_mask = MICREL_PHY_ID_MASK, 5907 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ886X), 6231 5908 .name = "Micrel KSZ8851 Ethernet MAC or KSZ886X Switch", 6232 5909 .driver_data = &ksz886x_type, 6233 5910 /* PHY_BASIC_FEATURES */ ··· 6246 5925 .suspend = genphy_suspend, 6247 5926 .resume = genphy_resume, 6248 5927 }, { 6249 - .phy_id = PHY_ID_KSZ9477, 6250 - .phy_id_mask = MICREL_PHY_ID_MASK, 5928 + PHY_ID_MATCH_MODEL(PHY_ID_KSZ9477), 6251 5929 .name = "Microchip KSZ9477", 6252 5930 .probe = kszphy_probe, 6253 5931 /* PHY_GBIT_FEATURES */ ··· 6273 5953 6274 5954 static const struct mdio_device_id __maybe_unused micrel_tbl[] = { 6275 5955 { PHY_ID_KSZ9021, 0x000ffffe }, 6276 - { PHY_ID_KSZ9031, MICREL_PHY_ID_MASK }, 6277 - { PHY_ID_KSZ9131, MICREL_PHY_ID_MASK }, 5956 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ9031) }, 5957 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ9131) }, 6278 5958 { PHY_ID_KSZ8001, 0x00fffffc }, 6279 - { PHY_ID_KS8737, MICREL_PHY_ID_MASK }, 5959 + { PHY_ID_MATCH_MODEL(PHY_ID_KS8737) }, 6280 5960 { PHY_ID_KSZ8021, 0x00ffffff }, 6281 5961 { PHY_ID_KSZ8031, 0x00ffffff }, 6282 - { PHY_ID_KSZ8041, MICREL_PHY_ID_MASK }, 6283 - { PHY_ID_KSZ8051, MICREL_PHY_ID_MASK }, 6284 - { PHY_ID_KSZ8061, MICREL_PHY_ID_MASK }, 6285 - { PHY_ID_KSZ8081, MICREL_PHY_ID_MASK }, 6286 - { PHY_ID_KSZ8873MLL, MICREL_PHY_ID_MASK }, 6287 - { PHY_ID_KSZ886X, MICREL_PHY_ID_MASK }, 6288 - { PHY_ID_KSZ9477, MICREL_PHY_ID_MASK }, 6289 - { PHY_ID_LAN8814, MICREL_PHY_ID_MASK }, 6290 - { PHY_ID_LAN8804, MICREL_PHY_ID_MASK }, 6291 - { PHY_ID_LAN8841, MICREL_PHY_ID_MASK }, 5962 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041) }, 5963 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041RNLI) }, 5964 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ8051) }, 5965 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ8061) }, 5966 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ8081) }, 5967 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ8873MLL) }, 5968 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ886X) }, 5969 + { PHY_ID_MATCH_MODEL(PHY_ID_KSZ9477) }, 5970 + { PHY_ID_MATCH_MODEL(PHY_ID_LAN8814) }, 5971 + { PHY_ID_MATCH_MODEL(PHY_ID_LAN8804) }, 5972 + { PHY_ID_MATCH_MODEL(PHY_ID_LAN8841) }, 5973 + { PHY_ID_MATCH_MODEL(PHY_ID_LAN8842) }, 6292 5974 { } 6293 5975 }; 6294 5976
+1
include/linux/micrel_phy.h
··· 32 32 #define PHY_ID_LAN8814 0x00221660 33 33 #define PHY_ID_LAN8804 0x00221670 34 34 #define PHY_ID_LAN8841 0x00221650 35 + #define PHY_ID_LAN8842 0x002216C0 35 36 36 37 #define PHY_ID_KSZ886X 0x00221430 37 38 #define PHY_ID_KSZ8863 0x00221435