xref: /OK3568_Linux_fs/kernel/drivers/net/phy/phy_device.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /* Framework for finding and configuring PHYs.
3*4882a593Smuzhiyun  * Also contains generic PHY driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Author: Andy Fleming
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (c) 2004 Freescale Semiconductor, Inc.
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/bitmap.h>
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/errno.h>
15*4882a593Smuzhiyun #include <linux/etherdevice.h>
16*4882a593Smuzhiyun #include <linux/ethtool.h>
17*4882a593Smuzhiyun #include <linux/init.h>
18*4882a593Smuzhiyun #include <linux/interrupt.h>
19*4882a593Smuzhiyun #include <linux/io.h>
20*4882a593Smuzhiyun #include <linux/kernel.h>
21*4882a593Smuzhiyun #include <linux/mdio.h>
22*4882a593Smuzhiyun #include <linux/mii.h>
23*4882a593Smuzhiyun #include <linux/mm.h>
24*4882a593Smuzhiyun #include <linux/module.h>
25*4882a593Smuzhiyun #include <linux/netdevice.h>
26*4882a593Smuzhiyun #include <linux/phy.h>
27*4882a593Smuzhiyun #include <linux/phy_led_triggers.h>
28*4882a593Smuzhiyun #include <linux/property.h>
29*4882a593Smuzhiyun #include <linux/sfp.h>
30*4882a593Smuzhiyun #include <linux/skbuff.h>
31*4882a593Smuzhiyun #include <linux/slab.h>
32*4882a593Smuzhiyun #include <linux/string.h>
33*4882a593Smuzhiyun #include <linux/uaccess.h>
34*4882a593Smuzhiyun #include <linux/unistd.h>
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun MODULE_DESCRIPTION("PHY library");
37*4882a593Smuzhiyun MODULE_AUTHOR("Andy Fleming");
38*4882a593Smuzhiyun MODULE_LICENSE("GPL");
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_features) __ro_after_init;
41*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_basic_features);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1_features) __ro_after_init;
44*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_basic_t1_features);
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_features) __ro_after_init;
47*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_gbit_features);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_fibre_features) __ro_after_init;
50*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_gbit_fibre_features);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_all_ports_features) __ro_after_init;
53*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_gbit_all_ports_features);
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_features) __ro_after_init;
56*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_10gbit_features);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_fec_features) __ro_after_init;
59*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_10gbit_fec_features);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun const int phy_basic_ports_array[3] = {
62*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_Autoneg_BIT,
63*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_TP_BIT,
64*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_MII_BIT,
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_basic_ports_array);
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun const int phy_fibre_port_array[1] = {
69*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_FIBRE_BIT,
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_fibre_port_array);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun const int phy_all_ports_features_array[7] = {
74*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_Autoneg_BIT,
75*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_TP_BIT,
76*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_MII_BIT,
77*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_FIBRE_BIT,
78*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_AUI_BIT,
79*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_BNC_BIT,
80*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_Backplane_BIT,
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_all_ports_features_array);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun const int phy_10_100_features_array[4] = {
85*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_10baseT_Half_BIT,
86*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_10baseT_Full_BIT,
87*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_100baseT_Half_BIT,
88*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_100baseT_Full_BIT,
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_10_100_features_array);
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun const int phy_basic_t1_features_array[2] = {
93*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_TP_BIT,
94*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_100baseT1_Full_BIT,
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_basic_t1_features_array);
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun const int phy_gbit_features_array[2] = {
99*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
100*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_gbit_features_array);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun const int phy_10gbit_features_array[1] = {
105*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_10gbit_features_array);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun static const int phy_10gbit_fec_features_array[1] = {
110*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_10000baseR_FEC_BIT,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init;
114*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_10gbit_full_features);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun static const int phy_10gbit_full_features_array[] = {
117*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_10baseT_Full_BIT,
118*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_100baseT_Full_BIT,
119*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
120*4882a593Smuzhiyun 	ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
features_init(void)123*4882a593Smuzhiyun static void features_init(void)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun 	/* 10/100 half/full*/
126*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_basic_ports_array,
127*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_basic_ports_array),
128*4882a593Smuzhiyun 			       phy_basic_features);
129*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10_100_features_array,
130*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10_100_features_array),
131*4882a593Smuzhiyun 			       phy_basic_features);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	/* 100 full, TP */
134*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_basic_t1_features_array,
135*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_basic_t1_features_array),
136*4882a593Smuzhiyun 			       phy_basic_t1_features);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	/* 10/100 half/full + 1000 half/full */
139*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_basic_ports_array,
140*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_basic_ports_array),
141*4882a593Smuzhiyun 			       phy_gbit_features);
142*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10_100_features_array,
143*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10_100_features_array),
144*4882a593Smuzhiyun 			       phy_gbit_features);
145*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_gbit_features_array,
146*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_gbit_features_array),
147*4882a593Smuzhiyun 			       phy_gbit_features);
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	/* 10/100 half/full + 1000 half/full + fibre*/
150*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_basic_ports_array,
151*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_basic_ports_array),
152*4882a593Smuzhiyun 			       phy_gbit_fibre_features);
153*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10_100_features_array,
154*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10_100_features_array),
155*4882a593Smuzhiyun 			       phy_gbit_fibre_features);
156*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_gbit_features_array,
157*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_gbit_features_array),
158*4882a593Smuzhiyun 			       phy_gbit_fibre_features);
159*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_fibre_port_array,
160*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_fibre_port_array),
161*4882a593Smuzhiyun 			       phy_gbit_fibre_features);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	/* 10/100 half/full + 1000 half/full + TP/MII/FIBRE/AUI/BNC/Backplane*/
164*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_all_ports_features_array,
165*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_all_ports_features_array),
166*4882a593Smuzhiyun 			       phy_gbit_all_ports_features);
167*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10_100_features_array,
168*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10_100_features_array),
169*4882a593Smuzhiyun 			       phy_gbit_all_ports_features);
170*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_gbit_features_array,
171*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_gbit_features_array),
172*4882a593Smuzhiyun 			       phy_gbit_all_ports_features);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	/* 10/100 half/full + 1000 half/full + 10G full*/
175*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_all_ports_features_array,
176*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_all_ports_features_array),
177*4882a593Smuzhiyun 			       phy_10gbit_features);
178*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10_100_features_array,
179*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10_100_features_array),
180*4882a593Smuzhiyun 			       phy_10gbit_features);
181*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_gbit_features_array,
182*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_gbit_features_array),
183*4882a593Smuzhiyun 			       phy_10gbit_features);
184*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10gbit_features_array,
185*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10gbit_features_array),
186*4882a593Smuzhiyun 			       phy_10gbit_features);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	/* 10/100/1000/10G full */
189*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_all_ports_features_array,
190*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_all_ports_features_array),
191*4882a593Smuzhiyun 			       phy_10gbit_full_features);
192*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10gbit_full_features_array,
193*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10gbit_full_features_array),
194*4882a593Smuzhiyun 			       phy_10gbit_full_features);
195*4882a593Smuzhiyun 	/* 10G FEC only */
196*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_10gbit_fec_features_array,
197*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_10gbit_fec_features_array),
198*4882a593Smuzhiyun 			       phy_10gbit_fec_features);
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
phy_device_free(struct phy_device * phydev)201*4882a593Smuzhiyun void phy_device_free(struct phy_device *phydev)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun 	put_device(&phydev->mdio.dev);
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun EXPORT_SYMBOL(phy_device_free);
206*4882a593Smuzhiyun 
phy_mdio_device_free(struct mdio_device * mdiodev)207*4882a593Smuzhiyun static void phy_mdio_device_free(struct mdio_device *mdiodev)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun 	struct phy_device *phydev;
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	phydev = container_of(mdiodev, struct phy_device, mdio);
212*4882a593Smuzhiyun 	phy_device_free(phydev);
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun 
phy_device_release(struct device * dev)215*4882a593Smuzhiyun static void phy_device_release(struct device *dev)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun 	kfree(to_phy_device(dev));
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
phy_mdio_device_remove(struct mdio_device * mdiodev)220*4882a593Smuzhiyun static void phy_mdio_device_remove(struct mdio_device *mdiodev)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun 	struct phy_device *phydev;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	phydev = container_of(mdiodev, struct phy_device, mdio);
225*4882a593Smuzhiyun 	phy_device_remove(phydev);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun static struct phy_driver genphy_driver;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun static LIST_HEAD(phy_fixup_list);
231*4882a593Smuzhiyun static DEFINE_MUTEX(phy_fixup_lock);
232*4882a593Smuzhiyun 
mdio_bus_phy_may_suspend(struct phy_device * phydev)233*4882a593Smuzhiyun static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun 	struct device_driver *drv = phydev->mdio.dev.driver;
236*4882a593Smuzhiyun 	struct phy_driver *phydrv = to_phy_driver(drv);
237*4882a593Smuzhiyun 	struct net_device *netdev = phydev->attached_dev;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	if (!drv || !phydrv->suspend)
240*4882a593Smuzhiyun 		return false;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	/* PHY not attached? May suspend if the PHY has not already been
243*4882a593Smuzhiyun 	 * suspended as part of a prior call to phy_disconnect() ->
244*4882a593Smuzhiyun 	 * phy_detach() -> phy_suspend() because the parent netdev might be the
245*4882a593Smuzhiyun 	 * MDIO bus driver and clock gated at this point.
246*4882a593Smuzhiyun 	 */
247*4882a593Smuzhiyun 	if (!netdev)
248*4882a593Smuzhiyun 		goto out;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	if (netdev->wol_enabled)
251*4882a593Smuzhiyun 		return false;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	/* As long as not all affected network drivers support the
254*4882a593Smuzhiyun 	 * wol_enabled flag, let's check for hints that WoL is enabled.
255*4882a593Smuzhiyun 	 * Don't suspend PHY if the attached netdev parent may wake up.
256*4882a593Smuzhiyun 	 * The parent may point to a PCI device, as in tg3 driver.
257*4882a593Smuzhiyun 	 */
258*4882a593Smuzhiyun 	if (netdev->dev.parent && device_may_wakeup(netdev->dev.parent))
259*4882a593Smuzhiyun 		return false;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	/* Also don't suspend PHY if the netdev itself may wakeup. This
262*4882a593Smuzhiyun 	 * is the case for devices w/o underlaying pwr. mgmt. aware bus,
263*4882a593Smuzhiyun 	 * e.g. SoC devices.
264*4882a593Smuzhiyun 	 */
265*4882a593Smuzhiyun 	if (device_may_wakeup(&netdev->dev))
266*4882a593Smuzhiyun 		return false;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun out:
269*4882a593Smuzhiyun 	return !phydev->suspended;
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun 
mdio_bus_phy_suspend(struct device * dev)272*4882a593Smuzhiyun static __maybe_unused int mdio_bus_phy_suspend(struct device *dev)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	/* We must stop the state machine manually, otherwise it stops out of
277*4882a593Smuzhiyun 	 * control, possibly with the phydev->lock held. Upon resume, netdev
278*4882a593Smuzhiyun 	 * may call phy routines that try to grab the same lock, and that may
279*4882a593Smuzhiyun 	 * lead to a deadlock.
280*4882a593Smuzhiyun 	 */
281*4882a593Smuzhiyun 	if (phydev->attached_dev && phydev->adjust_link)
282*4882a593Smuzhiyun 		phy_stop_machine(phydev);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	if (!mdio_bus_phy_may_suspend(phydev))
285*4882a593Smuzhiyun 		return 0;
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	phydev->suspended_by_mdio_bus = 1;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	return phy_suspend(phydev);
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun 
mdio_bus_phy_resume(struct device * dev)292*4882a593Smuzhiyun static __maybe_unused int mdio_bus_phy_resume(struct device *dev)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
295*4882a593Smuzhiyun 	int ret;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	if (!phydev->suspended_by_mdio_bus)
298*4882a593Smuzhiyun 		goto no_resume;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	phydev->suspended_by_mdio_bus = 0;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	ret = phy_init_hw(phydev);
303*4882a593Smuzhiyun 	if (ret < 0)
304*4882a593Smuzhiyun 		return ret;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	ret = phy_resume(phydev);
307*4882a593Smuzhiyun 	if (ret < 0)
308*4882a593Smuzhiyun 		return ret;
309*4882a593Smuzhiyun no_resume:
310*4882a593Smuzhiyun 	if (phydev->attached_dev && phydev->adjust_link)
311*4882a593Smuzhiyun 		phy_start_machine(phydev);
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	return 0;
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(mdio_bus_phy_pm_ops, mdio_bus_phy_suspend,
317*4882a593Smuzhiyun 			 mdio_bus_phy_resume);
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun /**
320*4882a593Smuzhiyun  * phy_register_fixup - creates a new phy_fixup and adds it to the list
321*4882a593Smuzhiyun  * @bus_id: A string which matches phydev->mdio.dev.bus_id (or PHY_ANY_ID)
322*4882a593Smuzhiyun  * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
323*4882a593Smuzhiyun  *	It can also be PHY_ANY_UID
324*4882a593Smuzhiyun  * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
325*4882a593Smuzhiyun  *	comparison
326*4882a593Smuzhiyun  * @run: The actual code to be run when a matching PHY is found
327*4882a593Smuzhiyun  */
phy_register_fixup(const char * bus_id,u32 phy_uid,u32 phy_uid_mask,int (* run)(struct phy_device *))328*4882a593Smuzhiyun int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
329*4882a593Smuzhiyun 		       int (*run)(struct phy_device *))
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	struct phy_fixup *fixup = kzalloc(sizeof(*fixup), GFP_KERNEL);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	if (!fixup)
334*4882a593Smuzhiyun 		return -ENOMEM;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	strlcpy(fixup->bus_id, bus_id, sizeof(fixup->bus_id));
337*4882a593Smuzhiyun 	fixup->phy_uid = phy_uid;
338*4882a593Smuzhiyun 	fixup->phy_uid_mask = phy_uid_mask;
339*4882a593Smuzhiyun 	fixup->run = run;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	mutex_lock(&phy_fixup_lock);
342*4882a593Smuzhiyun 	list_add_tail(&fixup->list, &phy_fixup_list);
343*4882a593Smuzhiyun 	mutex_unlock(&phy_fixup_lock);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	return 0;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun EXPORT_SYMBOL(phy_register_fixup);
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun /* Registers a fixup to be run on any PHY with the UID in phy_uid */
phy_register_fixup_for_uid(u32 phy_uid,u32 phy_uid_mask,int (* run)(struct phy_device *))350*4882a593Smuzhiyun int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
351*4882a593Smuzhiyun 			       int (*run)(struct phy_device *))
352*4882a593Smuzhiyun {
353*4882a593Smuzhiyun 	return phy_register_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask, run);
354*4882a593Smuzhiyun }
355*4882a593Smuzhiyun EXPORT_SYMBOL(phy_register_fixup_for_uid);
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun /* Registers a fixup to be run on the PHY with id string bus_id */
phy_register_fixup_for_id(const char * bus_id,int (* run)(struct phy_device *))358*4882a593Smuzhiyun int phy_register_fixup_for_id(const char *bus_id,
359*4882a593Smuzhiyun 			      int (*run)(struct phy_device *))
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun 	return phy_register_fixup(bus_id, PHY_ANY_UID, 0xffffffff, run);
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun EXPORT_SYMBOL(phy_register_fixup_for_id);
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun /**
366*4882a593Smuzhiyun  * phy_unregister_fixup - remove a phy_fixup from the list
367*4882a593Smuzhiyun  * @bus_id: A string matches fixup->bus_id (or PHY_ANY_ID) in phy_fixup_list
368*4882a593Smuzhiyun  * @phy_uid: A phy id matches fixup->phy_id (or PHY_ANY_UID) in phy_fixup_list
369*4882a593Smuzhiyun  * @phy_uid_mask: Applied to phy_uid and fixup->phy_uid before comparison
370*4882a593Smuzhiyun  */
phy_unregister_fixup(const char * bus_id,u32 phy_uid,u32 phy_uid_mask)371*4882a593Smuzhiyun int phy_unregister_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask)
372*4882a593Smuzhiyun {
373*4882a593Smuzhiyun 	struct list_head *pos, *n;
374*4882a593Smuzhiyun 	struct phy_fixup *fixup;
375*4882a593Smuzhiyun 	int ret;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	ret = -ENODEV;
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	mutex_lock(&phy_fixup_lock);
380*4882a593Smuzhiyun 	list_for_each_safe(pos, n, &phy_fixup_list) {
381*4882a593Smuzhiyun 		fixup = list_entry(pos, struct phy_fixup, list);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 		if ((!strcmp(fixup->bus_id, bus_id)) &&
384*4882a593Smuzhiyun 		    ((fixup->phy_uid & phy_uid_mask) ==
385*4882a593Smuzhiyun 		     (phy_uid & phy_uid_mask))) {
386*4882a593Smuzhiyun 			list_del(&fixup->list);
387*4882a593Smuzhiyun 			kfree(fixup);
388*4882a593Smuzhiyun 			ret = 0;
389*4882a593Smuzhiyun 			break;
390*4882a593Smuzhiyun 		}
391*4882a593Smuzhiyun 	}
392*4882a593Smuzhiyun 	mutex_unlock(&phy_fixup_lock);
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 	return ret;
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun EXPORT_SYMBOL(phy_unregister_fixup);
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun /* Unregisters a fixup of any PHY with the UID in phy_uid */
phy_unregister_fixup_for_uid(u32 phy_uid,u32 phy_uid_mask)399*4882a593Smuzhiyun int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask)
400*4882a593Smuzhiyun {
401*4882a593Smuzhiyun 	return phy_unregister_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask);
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun EXPORT_SYMBOL(phy_unregister_fixup_for_uid);
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun /* Unregisters a fixup of the PHY with id string bus_id */
phy_unregister_fixup_for_id(const char * bus_id)406*4882a593Smuzhiyun int phy_unregister_fixup_for_id(const char *bus_id)
407*4882a593Smuzhiyun {
408*4882a593Smuzhiyun 	return phy_unregister_fixup(bus_id, PHY_ANY_UID, 0xffffffff);
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun EXPORT_SYMBOL(phy_unregister_fixup_for_id);
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun /* Returns 1 if fixup matches phydev in bus_id and phy_uid.
413*4882a593Smuzhiyun  * Fixups can be set to match any in one or more fields.
414*4882a593Smuzhiyun  */
phy_needs_fixup(struct phy_device * phydev,struct phy_fixup * fixup)415*4882a593Smuzhiyun static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun 	if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0)
418*4882a593Smuzhiyun 		if (strcmp(fixup->bus_id, PHY_ANY_ID) != 0)
419*4882a593Smuzhiyun 			return 0;
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun 	if ((fixup->phy_uid & fixup->phy_uid_mask) !=
422*4882a593Smuzhiyun 	    (phydev->phy_id & fixup->phy_uid_mask))
423*4882a593Smuzhiyun 		if (fixup->phy_uid != PHY_ANY_UID)
424*4882a593Smuzhiyun 			return 0;
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	return 1;
427*4882a593Smuzhiyun }
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun /* Runs any matching fixups for this phydev */
phy_scan_fixups(struct phy_device * phydev)430*4882a593Smuzhiyun static int phy_scan_fixups(struct phy_device *phydev)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun 	struct phy_fixup *fixup;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	mutex_lock(&phy_fixup_lock);
435*4882a593Smuzhiyun 	list_for_each_entry(fixup, &phy_fixup_list, list) {
436*4882a593Smuzhiyun 		if (phy_needs_fixup(phydev, fixup)) {
437*4882a593Smuzhiyun 			int err = fixup->run(phydev);
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 			if (err < 0) {
440*4882a593Smuzhiyun 				mutex_unlock(&phy_fixup_lock);
441*4882a593Smuzhiyun 				return err;
442*4882a593Smuzhiyun 			}
443*4882a593Smuzhiyun 			phydev->has_fixups = true;
444*4882a593Smuzhiyun 		}
445*4882a593Smuzhiyun 	}
446*4882a593Smuzhiyun 	mutex_unlock(&phy_fixup_lock);
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	return 0;
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun 
phy_bus_match(struct device * dev,struct device_driver * drv)451*4882a593Smuzhiyun static int phy_bus_match(struct device *dev, struct device_driver *drv)
452*4882a593Smuzhiyun {
453*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
454*4882a593Smuzhiyun 	struct phy_driver *phydrv = to_phy_driver(drv);
455*4882a593Smuzhiyun 	const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
456*4882a593Smuzhiyun 	int i;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
459*4882a593Smuzhiyun 		return 0;
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun 	if (phydrv->match_phy_device)
462*4882a593Smuzhiyun 		return phydrv->match_phy_device(phydev);
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	if (phydev->is_c45) {
465*4882a593Smuzhiyun 		for (i = 1; i < num_ids; i++) {
466*4882a593Smuzhiyun 			if (phydev->c45_ids.device_ids[i] == 0xffffffff)
467*4882a593Smuzhiyun 				continue;
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 			if ((phydrv->phy_id & phydrv->phy_id_mask) ==
470*4882a593Smuzhiyun 			    (phydev->c45_ids.device_ids[i] &
471*4882a593Smuzhiyun 			     phydrv->phy_id_mask))
472*4882a593Smuzhiyun 				return 1;
473*4882a593Smuzhiyun 		}
474*4882a593Smuzhiyun 		return 0;
475*4882a593Smuzhiyun 	} else {
476*4882a593Smuzhiyun 		return (phydrv->phy_id & phydrv->phy_id_mask) ==
477*4882a593Smuzhiyun 			(phydev->phy_id & phydrv->phy_id_mask);
478*4882a593Smuzhiyun 	}
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun static ssize_t
phy_id_show(struct device * dev,struct device_attribute * attr,char * buf)482*4882a593Smuzhiyun phy_id_show(struct device *dev, struct device_attribute *attr, char *buf)
483*4882a593Smuzhiyun {
484*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id);
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun static DEVICE_ATTR_RO(phy_id);
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun static ssize_t
phy_interface_show(struct device * dev,struct device_attribute * attr,char * buf)491*4882a593Smuzhiyun phy_interface_show(struct device *dev, struct device_attribute *attr, char *buf)
492*4882a593Smuzhiyun {
493*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
494*4882a593Smuzhiyun 	const char *mode = NULL;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 	if (phy_is_internal(phydev))
497*4882a593Smuzhiyun 		mode = "internal";
498*4882a593Smuzhiyun 	else
499*4882a593Smuzhiyun 		mode = phy_modes(phydev->interface);
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun 	return sprintf(buf, "%s\n", mode);
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun static DEVICE_ATTR_RO(phy_interface);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun static ssize_t
phy_has_fixups_show(struct device * dev,struct device_attribute * attr,char * buf)506*4882a593Smuzhiyun phy_has_fixups_show(struct device *dev, struct device_attribute *attr,
507*4882a593Smuzhiyun 		    char *buf)
508*4882a593Smuzhiyun {
509*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", phydev->has_fixups);
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun static DEVICE_ATTR_RO(phy_has_fixups);
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun static ssize_t
phy_registers_show(struct device * dev,struct device_attribute * attr,char * buf)516*4882a593Smuzhiyun phy_registers_show(struct device *dev, struct device_attribute *attr, char *buf)
517*4882a593Smuzhiyun {
518*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
519*4882a593Smuzhiyun 	int index;
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 	for (index = 0; index < 32; index++)
522*4882a593Smuzhiyun 		sprintf(buf, "%s%2d: 0x%x\n", buf, index,
523*4882a593Smuzhiyun 			phy_read(phydev, index));
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun 	return strlen(buf);
526*4882a593Smuzhiyun }
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun static ssize_t
phy_registers_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)529*4882a593Smuzhiyun phy_registers_store(struct device *dev,
530*4882a593Smuzhiyun 		    struct device_attribute *attr,
531*4882a593Smuzhiyun 		    const char *buf, size_t count)
532*4882a593Smuzhiyun {
533*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
534*4882a593Smuzhiyun 	int index = 0, val = 0;
535*4882a593Smuzhiyun 	char tmp[32];
536*4882a593Smuzhiyun 	char *data;
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun 	if (count >= sizeof(tmp))
539*4882a593Smuzhiyun 		goto out;
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun 	memset(tmp, 0, sizeof(tmp));
542*4882a593Smuzhiyun 	memcpy(tmp, buf, count);
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun 	data = tmp;
545*4882a593Smuzhiyun 	data = strstr(data, " ");
546*4882a593Smuzhiyun 	if (!data)
547*4882a593Smuzhiyun 		goto out;
548*4882a593Smuzhiyun 	*data = 0;
549*4882a593Smuzhiyun 	data++;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 	if (kstrtoint(tmp, 0, &index) || index >= 32)
552*4882a593Smuzhiyun 		goto out;
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	if (kstrtoint(data, 0, &val) || val > 0xffff)
555*4882a593Smuzhiyun 		goto out;
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	pr_info("Set Ethernet PHY register %d to 0x%x\n", (int)index, (int)val);
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 	phy_write(phydev, index, val);
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	return count;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun out:
564*4882a593Smuzhiyun 	pr_err("wrong register value input\n");
565*4882a593Smuzhiyun 	pr_err("usage: <reg index> <value>\n");
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	return count;
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun static DEVICE_ATTR_RW(phy_registers);
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun static struct attribute *phy_dev_attrs[] = {
573*4882a593Smuzhiyun 	&dev_attr_phy_id.attr,
574*4882a593Smuzhiyun 	&dev_attr_phy_interface.attr,
575*4882a593Smuzhiyun 	&dev_attr_phy_has_fixups.attr,
576*4882a593Smuzhiyun 	&dev_attr_phy_registers.attr,
577*4882a593Smuzhiyun 	NULL,
578*4882a593Smuzhiyun };
579*4882a593Smuzhiyun ATTRIBUTE_GROUPS(phy_dev);
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun static const struct device_type mdio_bus_phy_type = {
582*4882a593Smuzhiyun 	.name = "PHY",
583*4882a593Smuzhiyun 	.groups = phy_dev_groups,
584*4882a593Smuzhiyun 	.release = phy_device_release,
585*4882a593Smuzhiyun 	.pm = pm_ptr(&mdio_bus_phy_pm_ops),
586*4882a593Smuzhiyun };
587*4882a593Smuzhiyun 
phy_request_driver_module(struct phy_device * dev,u32 phy_id)588*4882a593Smuzhiyun static int phy_request_driver_module(struct phy_device *dev, u32 phy_id)
589*4882a593Smuzhiyun {
590*4882a593Smuzhiyun 	int ret;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	ret = request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT,
593*4882a593Smuzhiyun 			     MDIO_ID_ARGS(phy_id));
594*4882a593Smuzhiyun 	/* We only check for failures in executing the usermode binary,
595*4882a593Smuzhiyun 	 * not whether a PHY driver module exists for the PHY ID.
596*4882a593Smuzhiyun 	 * Accept -ENOENT because this may occur in case no initramfs exists,
597*4882a593Smuzhiyun 	 * then modprobe isn't available.
598*4882a593Smuzhiyun 	 */
599*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_MODULES) && ret < 0 && ret != -ENOENT) {
600*4882a593Smuzhiyun 		phydev_err(dev, "error %d loading PHY driver module for ID 0x%08lx\n",
601*4882a593Smuzhiyun 			   ret, (unsigned long)phy_id);
602*4882a593Smuzhiyun 		return ret;
603*4882a593Smuzhiyun 	}
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	return 0;
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun 
phy_device_create(struct mii_bus * bus,int addr,u32 phy_id,bool is_c45,struct phy_c45_device_ids * c45_ids)608*4882a593Smuzhiyun struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id,
609*4882a593Smuzhiyun 				     bool is_c45,
610*4882a593Smuzhiyun 				     struct phy_c45_device_ids *c45_ids)
611*4882a593Smuzhiyun {
612*4882a593Smuzhiyun 	struct phy_device *dev;
613*4882a593Smuzhiyun 	struct mdio_device *mdiodev;
614*4882a593Smuzhiyun 	int ret = 0;
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	/* We allocate the device, and initialize the default values */
617*4882a593Smuzhiyun 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
618*4882a593Smuzhiyun 	if (!dev)
619*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	mdiodev = &dev->mdio;
622*4882a593Smuzhiyun 	mdiodev->dev.parent = &bus->dev;
623*4882a593Smuzhiyun 	mdiodev->dev.bus = &mdio_bus_type;
624*4882a593Smuzhiyun 	mdiodev->dev.type = &mdio_bus_phy_type;
625*4882a593Smuzhiyun 	mdiodev->bus = bus;
626*4882a593Smuzhiyun 	mdiodev->bus_match = phy_bus_match;
627*4882a593Smuzhiyun 	mdiodev->addr = addr;
628*4882a593Smuzhiyun 	mdiodev->flags = MDIO_DEVICE_FLAG_PHY;
629*4882a593Smuzhiyun 	mdiodev->device_free = phy_mdio_device_free;
630*4882a593Smuzhiyun 	mdiodev->device_remove = phy_mdio_device_remove;
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 	dev->speed = SPEED_UNKNOWN;
633*4882a593Smuzhiyun 	dev->duplex = DUPLEX_UNKNOWN;
634*4882a593Smuzhiyun 	dev->pause = 0;
635*4882a593Smuzhiyun 	dev->asym_pause = 0;
636*4882a593Smuzhiyun 	dev->link = 0;
637*4882a593Smuzhiyun 	dev->port = PORT_TP;
638*4882a593Smuzhiyun 	dev->interface = PHY_INTERFACE_MODE_GMII;
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 	dev->autoneg = AUTONEG_ENABLE;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun 	dev->is_c45 = is_c45;
643*4882a593Smuzhiyun 	dev->phy_id = phy_id;
644*4882a593Smuzhiyun 	if (c45_ids)
645*4882a593Smuzhiyun 		dev->c45_ids = *c45_ids;
646*4882a593Smuzhiyun 	dev->irq = bus->irq[addr];
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 	dev_set_name(&mdiodev->dev, PHY_ID_FMT, bus->id, addr);
649*4882a593Smuzhiyun 	device_initialize(&mdiodev->dev);
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	dev->state = PHY_DOWN;
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun 	mutex_init(&dev->lock);
654*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 	/* Request the appropriate module unconditionally; don't
657*4882a593Smuzhiyun 	 * bother trying to do so only if it isn't already loaded,
658*4882a593Smuzhiyun 	 * because that gets complicated. A hotplug event would have
659*4882a593Smuzhiyun 	 * done an unconditional modprobe anyway.
660*4882a593Smuzhiyun 	 * We don't do normal hotplug because it won't work for MDIO
661*4882a593Smuzhiyun 	 * -- because it relies on the device staying around for long
662*4882a593Smuzhiyun 	 * enough for the driver to get loaded. With MDIO, the NIC
663*4882a593Smuzhiyun 	 * driver will get bored and give up as soon as it finds that
664*4882a593Smuzhiyun 	 * there's no driver _already_ loaded.
665*4882a593Smuzhiyun 	 */
666*4882a593Smuzhiyun 	if (is_c45 && c45_ids) {
667*4882a593Smuzhiyun 		const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
668*4882a593Smuzhiyun 		int i;
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 		for (i = 1; i < num_ids; i++) {
671*4882a593Smuzhiyun 			if (c45_ids->device_ids[i] == 0xffffffff)
672*4882a593Smuzhiyun 				continue;
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 			ret = phy_request_driver_module(dev,
675*4882a593Smuzhiyun 						c45_ids->device_ids[i]);
676*4882a593Smuzhiyun 			if (ret)
677*4882a593Smuzhiyun 				break;
678*4882a593Smuzhiyun 		}
679*4882a593Smuzhiyun 	} else {
680*4882a593Smuzhiyun 		ret = phy_request_driver_module(dev, phy_id);
681*4882a593Smuzhiyun 	}
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 	if (ret) {
684*4882a593Smuzhiyun 		put_device(&mdiodev->dev);
685*4882a593Smuzhiyun 		dev = ERR_PTR(ret);
686*4882a593Smuzhiyun 	}
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun 	return dev;
689*4882a593Smuzhiyun }
690*4882a593Smuzhiyun EXPORT_SYMBOL(phy_device_create);
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun /* phy_c45_probe_present - checks to see if a MMD is present in the package
693*4882a593Smuzhiyun  * @bus: the target MII bus
694*4882a593Smuzhiyun  * @prtad: PHY package address on the MII bus
695*4882a593Smuzhiyun  * @devad: PHY device (MMD) address
696*4882a593Smuzhiyun  *
697*4882a593Smuzhiyun  * Read the MDIO_STAT2 register, and check whether a device is responding
698*4882a593Smuzhiyun  * at this address.
699*4882a593Smuzhiyun  *
700*4882a593Smuzhiyun  * Returns: negative error number on bus access error, zero if no device
701*4882a593Smuzhiyun  * is responding, or positive if a device is present.
702*4882a593Smuzhiyun  */
phy_c45_probe_present(struct mii_bus * bus,int prtad,int devad)703*4882a593Smuzhiyun static int phy_c45_probe_present(struct mii_bus *bus, int prtad, int devad)
704*4882a593Smuzhiyun {
705*4882a593Smuzhiyun 	int stat2;
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 	stat2 = mdiobus_c45_read(bus, prtad, devad, MDIO_STAT2);
708*4882a593Smuzhiyun 	if (stat2 < 0)
709*4882a593Smuzhiyun 		return stat2;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	return (stat2 & MDIO_STAT2_DEVPRST) == MDIO_STAT2_DEVPRST_VAL;
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun /* get_phy_c45_devs_in_pkg - reads a MMD's devices in package registers.
715*4882a593Smuzhiyun  * @bus: the target MII bus
716*4882a593Smuzhiyun  * @addr: PHY address on the MII bus
717*4882a593Smuzhiyun  * @dev_addr: MMD address in the PHY.
718*4882a593Smuzhiyun  * @devices_in_package: where to store the devices in package information.
719*4882a593Smuzhiyun  *
720*4882a593Smuzhiyun  * Description: reads devices in package registers of a MMD at @dev_addr
721*4882a593Smuzhiyun  * from PHY at @addr on @bus.
722*4882a593Smuzhiyun  *
723*4882a593Smuzhiyun  * Returns: 0 on success, -EIO on failure.
724*4882a593Smuzhiyun  */
get_phy_c45_devs_in_pkg(struct mii_bus * bus,int addr,int dev_addr,u32 * devices_in_package)725*4882a593Smuzhiyun static int get_phy_c45_devs_in_pkg(struct mii_bus *bus, int addr, int dev_addr,
726*4882a593Smuzhiyun 				   u32 *devices_in_package)
727*4882a593Smuzhiyun {
728*4882a593Smuzhiyun 	int phy_reg;
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun 	phy_reg = mdiobus_c45_read(bus, addr, dev_addr, MDIO_DEVS2);
731*4882a593Smuzhiyun 	if (phy_reg < 0)
732*4882a593Smuzhiyun 		return -EIO;
733*4882a593Smuzhiyun 	*devices_in_package = phy_reg << 16;
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	phy_reg = mdiobus_c45_read(bus, addr, dev_addr, MDIO_DEVS1);
736*4882a593Smuzhiyun 	if (phy_reg < 0)
737*4882a593Smuzhiyun 		return -EIO;
738*4882a593Smuzhiyun 	*devices_in_package |= phy_reg;
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun 	return 0;
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun /**
744*4882a593Smuzhiyun  * get_phy_c45_ids - reads the specified addr for its 802.3-c45 IDs.
745*4882a593Smuzhiyun  * @bus: the target MII bus
746*4882a593Smuzhiyun  * @addr: PHY address on the MII bus
747*4882a593Smuzhiyun  * @c45_ids: where to store the c45 ID information.
748*4882a593Smuzhiyun  *
749*4882a593Smuzhiyun  * Read the PHY "devices in package". If this appears to be valid, read
750*4882a593Smuzhiyun  * the PHY identifiers for each device. Return the "devices in package"
751*4882a593Smuzhiyun  * and identifiers in @c45_ids.
752*4882a593Smuzhiyun  *
753*4882a593Smuzhiyun  * Returns zero on success, %-EIO on bus access error, or %-ENODEV if
754*4882a593Smuzhiyun  * the "devices in package" is invalid.
755*4882a593Smuzhiyun  */
get_phy_c45_ids(struct mii_bus * bus,int addr,struct phy_c45_device_ids * c45_ids)756*4882a593Smuzhiyun static int get_phy_c45_ids(struct mii_bus *bus, int addr,
757*4882a593Smuzhiyun 			   struct phy_c45_device_ids *c45_ids)
758*4882a593Smuzhiyun {
759*4882a593Smuzhiyun 	const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
760*4882a593Smuzhiyun 	u32 devs_in_pkg = 0;
761*4882a593Smuzhiyun 	int i, ret, phy_reg;
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 	/* Find first non-zero Devices In package. Device zero is reserved
764*4882a593Smuzhiyun 	 * for 802.3 c45 complied PHYs, so don't probe it at first.
765*4882a593Smuzhiyun 	 */
766*4882a593Smuzhiyun 	for (i = 1; i < MDIO_MMD_NUM && (devs_in_pkg == 0 ||
767*4882a593Smuzhiyun 	     (devs_in_pkg & 0x1fffffff) == 0x1fffffff); i++) {
768*4882a593Smuzhiyun 		if (i == MDIO_MMD_VEND1 || i == MDIO_MMD_VEND2) {
769*4882a593Smuzhiyun 			/* Check that there is a device present at this
770*4882a593Smuzhiyun 			 * address before reading the devices-in-package
771*4882a593Smuzhiyun 			 * register to avoid reading garbage from the PHY.
772*4882a593Smuzhiyun 			 * Some PHYs (88x3310) vendor space is not IEEE802.3
773*4882a593Smuzhiyun 			 * compliant.
774*4882a593Smuzhiyun 			 */
775*4882a593Smuzhiyun 			ret = phy_c45_probe_present(bus, addr, i);
776*4882a593Smuzhiyun 			if (ret < 0)
777*4882a593Smuzhiyun 				return -EIO;
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 			if (!ret)
780*4882a593Smuzhiyun 				continue;
781*4882a593Smuzhiyun 		}
782*4882a593Smuzhiyun 		phy_reg = get_phy_c45_devs_in_pkg(bus, addr, i, &devs_in_pkg);
783*4882a593Smuzhiyun 		if (phy_reg < 0)
784*4882a593Smuzhiyun 			return -EIO;
785*4882a593Smuzhiyun 	}
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	if ((devs_in_pkg & 0x1fffffff) == 0x1fffffff) {
788*4882a593Smuzhiyun 		/* If mostly Fs, there is no device there, then let's probe
789*4882a593Smuzhiyun 		 * MMD 0, as some 10G PHYs have zero Devices In package,
790*4882a593Smuzhiyun 		 * e.g. Cortina CS4315/CS4340 PHY.
791*4882a593Smuzhiyun 		 */
792*4882a593Smuzhiyun 		phy_reg = get_phy_c45_devs_in_pkg(bus, addr, 0, &devs_in_pkg);
793*4882a593Smuzhiyun 		if (phy_reg < 0)
794*4882a593Smuzhiyun 			return -EIO;
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 		/* no device there, let's get out of here */
797*4882a593Smuzhiyun 		if ((devs_in_pkg & 0x1fffffff) == 0x1fffffff)
798*4882a593Smuzhiyun 			return -ENODEV;
799*4882a593Smuzhiyun 	}
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	/* Now probe Device Identifiers for each device present. */
802*4882a593Smuzhiyun 	for (i = 1; i < num_ids; i++) {
803*4882a593Smuzhiyun 		if (!(devs_in_pkg & (1 << i)))
804*4882a593Smuzhiyun 			continue;
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun 		if (i == MDIO_MMD_VEND1 || i == MDIO_MMD_VEND2) {
807*4882a593Smuzhiyun 			/* Probe the "Device Present" bits for the vendor MMDs
808*4882a593Smuzhiyun 			 * to ignore these if they do not contain IEEE 802.3
809*4882a593Smuzhiyun 			 * registers.
810*4882a593Smuzhiyun 			 */
811*4882a593Smuzhiyun 			ret = phy_c45_probe_present(bus, addr, i);
812*4882a593Smuzhiyun 			if (ret < 0)
813*4882a593Smuzhiyun 				return ret;
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 			if (!ret)
816*4882a593Smuzhiyun 				continue;
817*4882a593Smuzhiyun 		}
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 		phy_reg = mdiobus_c45_read(bus, addr, i, MII_PHYSID1);
820*4882a593Smuzhiyun 		if (phy_reg < 0)
821*4882a593Smuzhiyun 			return -EIO;
822*4882a593Smuzhiyun 		c45_ids->device_ids[i] = phy_reg << 16;
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun 		phy_reg = mdiobus_c45_read(bus, addr, i, MII_PHYSID2);
825*4882a593Smuzhiyun 		if (phy_reg < 0)
826*4882a593Smuzhiyun 			return -EIO;
827*4882a593Smuzhiyun 		c45_ids->device_ids[i] |= phy_reg;
828*4882a593Smuzhiyun 	}
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun 	c45_ids->devices_in_package = devs_in_pkg;
831*4882a593Smuzhiyun 	/* Bit 0 doesn't represent a device, it indicates c22 regs presence */
832*4882a593Smuzhiyun 	c45_ids->mmds_present = devs_in_pkg & ~BIT(0);
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun 	return 0;
835*4882a593Smuzhiyun }
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun /**
838*4882a593Smuzhiyun  * get_phy_c22_id - reads the specified addr for its clause 22 ID.
839*4882a593Smuzhiyun  * @bus: the target MII bus
840*4882a593Smuzhiyun  * @addr: PHY address on the MII bus
841*4882a593Smuzhiyun  * @phy_id: where to store the ID retrieved.
842*4882a593Smuzhiyun  *
843*4882a593Smuzhiyun  * Read the 802.3 clause 22 PHY ID from the PHY at @addr on the @bus,
844*4882a593Smuzhiyun  * placing it in @phy_id. Return zero on successful read and the ID is
845*4882a593Smuzhiyun  * valid, %-EIO on bus access error, or %-ENODEV if no device responds
846*4882a593Smuzhiyun  * or invalid ID.
847*4882a593Smuzhiyun  */
get_phy_c22_id(struct mii_bus * bus,int addr,u32 * phy_id)848*4882a593Smuzhiyun static int get_phy_c22_id(struct mii_bus *bus, int addr, u32 *phy_id)
849*4882a593Smuzhiyun {
850*4882a593Smuzhiyun 	int phy_reg;
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun 	/* Grab the bits from PHYIR1, and put them in the upper half */
853*4882a593Smuzhiyun 	phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
854*4882a593Smuzhiyun 	if (phy_reg < 0) {
855*4882a593Smuzhiyun 		/* returning -ENODEV doesn't stop bus scanning */
856*4882a593Smuzhiyun 		return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO;
857*4882a593Smuzhiyun 	}
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 	*phy_id = phy_reg << 16;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	/* Grab the bits from PHYIR2, and put them in the lower half */
862*4882a593Smuzhiyun 	phy_reg = mdiobus_read(bus, addr, MII_PHYSID2);
863*4882a593Smuzhiyun 	if (phy_reg < 0) {
864*4882a593Smuzhiyun 		/* returning -ENODEV doesn't stop bus scanning */
865*4882a593Smuzhiyun 		return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO;
866*4882a593Smuzhiyun 	}
867*4882a593Smuzhiyun 
868*4882a593Smuzhiyun 	*phy_id |= phy_reg;
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun 	/* If the phy_id is mostly Fs, there is no device there */
871*4882a593Smuzhiyun 	if ((*phy_id & 0x1fffffff) == 0x1fffffff)
872*4882a593Smuzhiyun 		return -ENODEV;
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 	return 0;
875*4882a593Smuzhiyun }
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun /**
878*4882a593Smuzhiyun  * get_phy_device - reads the specified PHY device and returns its @phy_device
879*4882a593Smuzhiyun  *		    struct
880*4882a593Smuzhiyun  * @bus: the target MII bus
881*4882a593Smuzhiyun  * @addr: PHY address on the MII bus
882*4882a593Smuzhiyun  * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
883*4882a593Smuzhiyun  *
884*4882a593Smuzhiyun  * Probe for a PHY at @addr on @bus.
885*4882a593Smuzhiyun  *
886*4882a593Smuzhiyun  * When probing for a clause 22 PHY, then read the ID registers. If we find
887*4882a593Smuzhiyun  * a valid ID, allocate and return a &struct phy_device.
888*4882a593Smuzhiyun  *
889*4882a593Smuzhiyun  * When probing for a clause 45 PHY, read the "devices in package" registers.
890*4882a593Smuzhiyun  * If the "devices in package" appears valid, read the ID registers for each
891*4882a593Smuzhiyun  * MMD, allocate and return a &struct phy_device.
892*4882a593Smuzhiyun  *
893*4882a593Smuzhiyun  * Returns an allocated &struct phy_device on success, %-ENODEV if there is
894*4882a593Smuzhiyun  * no PHY present, or %-EIO on bus access error.
895*4882a593Smuzhiyun  */
get_phy_device(struct mii_bus * bus,int addr,bool is_c45)896*4882a593Smuzhiyun struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
897*4882a593Smuzhiyun {
898*4882a593Smuzhiyun 	struct phy_c45_device_ids c45_ids;
899*4882a593Smuzhiyun 	u32 phy_id = 0;
900*4882a593Smuzhiyun 	int r;
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 	c45_ids.devices_in_package = 0;
903*4882a593Smuzhiyun 	c45_ids.mmds_present = 0;
904*4882a593Smuzhiyun 	memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids));
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun 	if (is_c45)
907*4882a593Smuzhiyun 		r = get_phy_c45_ids(bus, addr, &c45_ids);
908*4882a593Smuzhiyun 	else
909*4882a593Smuzhiyun 		r = get_phy_c22_id(bus, addr, &phy_id);
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun 	if (r)
912*4882a593Smuzhiyun 		return ERR_PTR(r);
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun 	return phy_device_create(bus, addr, phy_id, is_c45, &c45_ids);
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun EXPORT_SYMBOL(get_phy_device);
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun /**
919*4882a593Smuzhiyun  * phy_device_register - Register the phy device on the MDIO bus
920*4882a593Smuzhiyun  * @phydev: phy_device structure to be added to the MDIO bus
921*4882a593Smuzhiyun  */
phy_device_register(struct phy_device * phydev)922*4882a593Smuzhiyun int phy_device_register(struct phy_device *phydev)
923*4882a593Smuzhiyun {
924*4882a593Smuzhiyun 	int err;
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun 	err = mdiobus_register_device(&phydev->mdio);
927*4882a593Smuzhiyun 	if (err)
928*4882a593Smuzhiyun 		return err;
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun 	/* Deassert the reset signal */
931*4882a593Smuzhiyun 	phy_device_reset(phydev, 0);
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	/* Run all of the fixups for this PHY */
934*4882a593Smuzhiyun 	err = phy_scan_fixups(phydev);
935*4882a593Smuzhiyun 	if (err) {
936*4882a593Smuzhiyun 		phydev_err(phydev, "failed to initialize\n");
937*4882a593Smuzhiyun 		goto out;
938*4882a593Smuzhiyun 	}
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 	err = device_add(&phydev->mdio.dev);
941*4882a593Smuzhiyun 	if (err) {
942*4882a593Smuzhiyun 		phydev_err(phydev, "failed to add\n");
943*4882a593Smuzhiyun 		goto out;
944*4882a593Smuzhiyun 	}
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	return 0;
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun  out:
949*4882a593Smuzhiyun 	/* Assert the reset signal */
950*4882a593Smuzhiyun 	phy_device_reset(phydev, 1);
951*4882a593Smuzhiyun 
952*4882a593Smuzhiyun 	mdiobus_unregister_device(&phydev->mdio);
953*4882a593Smuzhiyun 	return err;
954*4882a593Smuzhiyun }
955*4882a593Smuzhiyun EXPORT_SYMBOL(phy_device_register);
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun /**
958*4882a593Smuzhiyun  * phy_device_remove - Remove a previously registered phy device from the MDIO bus
959*4882a593Smuzhiyun  * @phydev: phy_device structure to remove
960*4882a593Smuzhiyun  *
961*4882a593Smuzhiyun  * This doesn't free the phy_device itself, it merely reverses the effects
962*4882a593Smuzhiyun  * of phy_device_register(). Use phy_device_free() to free the device
963*4882a593Smuzhiyun  * after calling this function.
964*4882a593Smuzhiyun  */
phy_device_remove(struct phy_device * phydev)965*4882a593Smuzhiyun void phy_device_remove(struct phy_device *phydev)
966*4882a593Smuzhiyun {
967*4882a593Smuzhiyun 	if (phydev->mii_ts)
968*4882a593Smuzhiyun 		unregister_mii_timestamper(phydev->mii_ts);
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun 	device_del(&phydev->mdio.dev);
971*4882a593Smuzhiyun 
972*4882a593Smuzhiyun 	/* Assert the reset signal */
973*4882a593Smuzhiyun 	phy_device_reset(phydev, 1);
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun 	mdiobus_unregister_device(&phydev->mdio);
976*4882a593Smuzhiyun }
977*4882a593Smuzhiyun EXPORT_SYMBOL(phy_device_remove);
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun /**
980*4882a593Smuzhiyun  * phy_find_first - finds the first PHY device on the bus
981*4882a593Smuzhiyun  * @bus: the target MII bus
982*4882a593Smuzhiyun  */
phy_find_first(struct mii_bus * bus)983*4882a593Smuzhiyun struct phy_device *phy_find_first(struct mii_bus *bus)
984*4882a593Smuzhiyun {
985*4882a593Smuzhiyun 	struct phy_device *phydev;
986*4882a593Smuzhiyun 	int addr;
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 	for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
989*4882a593Smuzhiyun 		phydev = mdiobus_get_phy(bus, addr);
990*4882a593Smuzhiyun 		if (phydev)
991*4882a593Smuzhiyun 			return phydev;
992*4882a593Smuzhiyun 	}
993*4882a593Smuzhiyun 	return NULL;
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun EXPORT_SYMBOL(phy_find_first);
996*4882a593Smuzhiyun 
phy_link_change(struct phy_device * phydev,bool up)997*4882a593Smuzhiyun static void phy_link_change(struct phy_device *phydev, bool up)
998*4882a593Smuzhiyun {
999*4882a593Smuzhiyun 	struct net_device *netdev = phydev->attached_dev;
1000*4882a593Smuzhiyun 
1001*4882a593Smuzhiyun 	if (up)
1002*4882a593Smuzhiyun 		netif_carrier_on(netdev);
1003*4882a593Smuzhiyun 	else
1004*4882a593Smuzhiyun 		netif_carrier_off(netdev);
1005*4882a593Smuzhiyun 	phydev->adjust_link(netdev);
1006*4882a593Smuzhiyun 	if (phydev->mii_ts && phydev->mii_ts->link_state)
1007*4882a593Smuzhiyun 		phydev->mii_ts->link_state(phydev->mii_ts, phydev);
1008*4882a593Smuzhiyun }
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun /**
1011*4882a593Smuzhiyun  * phy_prepare_link - prepares the PHY layer to monitor link status
1012*4882a593Smuzhiyun  * @phydev: target phy_device struct
1013*4882a593Smuzhiyun  * @handler: callback function for link status change notifications
1014*4882a593Smuzhiyun  *
1015*4882a593Smuzhiyun  * Description: Tells the PHY infrastructure to handle the
1016*4882a593Smuzhiyun  *   gory details on monitoring link status (whether through
1017*4882a593Smuzhiyun  *   polling or an interrupt), and to call back to the
1018*4882a593Smuzhiyun  *   connected device driver when the link status changes.
1019*4882a593Smuzhiyun  *   If you want to monitor your own link state, don't call
1020*4882a593Smuzhiyun  *   this function.
1021*4882a593Smuzhiyun  */
phy_prepare_link(struct phy_device * phydev,void (* handler)(struct net_device *))1022*4882a593Smuzhiyun static void phy_prepare_link(struct phy_device *phydev,
1023*4882a593Smuzhiyun 			     void (*handler)(struct net_device *))
1024*4882a593Smuzhiyun {
1025*4882a593Smuzhiyun 	phydev->adjust_link = handler;
1026*4882a593Smuzhiyun }
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun /**
1029*4882a593Smuzhiyun  * phy_connect_direct - connect an ethernet device to a specific phy_device
1030*4882a593Smuzhiyun  * @dev: the network device to connect
1031*4882a593Smuzhiyun  * @phydev: the pointer to the phy device
1032*4882a593Smuzhiyun  * @handler: callback function for state change notifications
1033*4882a593Smuzhiyun  * @interface: PHY device's interface
1034*4882a593Smuzhiyun  */
phy_connect_direct(struct net_device * dev,struct phy_device * phydev,void (* handler)(struct net_device *),phy_interface_t interface)1035*4882a593Smuzhiyun int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
1036*4882a593Smuzhiyun 		       void (*handler)(struct net_device *),
1037*4882a593Smuzhiyun 		       phy_interface_t interface)
1038*4882a593Smuzhiyun {
1039*4882a593Smuzhiyun 	int rc;
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun 	if (!dev)
1042*4882a593Smuzhiyun 		return -EINVAL;
1043*4882a593Smuzhiyun 
1044*4882a593Smuzhiyun 	rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
1045*4882a593Smuzhiyun 	if (rc)
1046*4882a593Smuzhiyun 		return rc;
1047*4882a593Smuzhiyun 
1048*4882a593Smuzhiyun 	phy_prepare_link(phydev, handler);
1049*4882a593Smuzhiyun 	if (phy_interrupt_is_valid(phydev))
1050*4882a593Smuzhiyun 		phy_request_interrupt(phydev);
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun 	return 0;
1053*4882a593Smuzhiyun }
1054*4882a593Smuzhiyun EXPORT_SYMBOL(phy_connect_direct);
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun /**
1057*4882a593Smuzhiyun  * phy_connect - connect an ethernet device to a PHY device
1058*4882a593Smuzhiyun  * @dev: the network device to connect
1059*4882a593Smuzhiyun  * @bus_id: the id string of the PHY device to connect
1060*4882a593Smuzhiyun  * @handler: callback function for state change notifications
1061*4882a593Smuzhiyun  * @interface: PHY device's interface
1062*4882a593Smuzhiyun  *
1063*4882a593Smuzhiyun  * Description: Convenience function for connecting ethernet
1064*4882a593Smuzhiyun  *   devices to PHY devices.  The default behavior is for
1065*4882a593Smuzhiyun  *   the PHY infrastructure to handle everything, and only notify
1066*4882a593Smuzhiyun  *   the connected driver when the link status changes.  If you
1067*4882a593Smuzhiyun  *   don't want, or can't use the provided functionality, you may
1068*4882a593Smuzhiyun  *   choose to call only the subset of functions which provide
1069*4882a593Smuzhiyun  *   the desired functionality.
1070*4882a593Smuzhiyun  */
phy_connect(struct net_device * dev,const char * bus_id,void (* handler)(struct net_device *),phy_interface_t interface)1071*4882a593Smuzhiyun struct phy_device *phy_connect(struct net_device *dev, const char *bus_id,
1072*4882a593Smuzhiyun 			       void (*handler)(struct net_device *),
1073*4882a593Smuzhiyun 			       phy_interface_t interface)
1074*4882a593Smuzhiyun {
1075*4882a593Smuzhiyun 	struct phy_device *phydev;
1076*4882a593Smuzhiyun 	struct device *d;
1077*4882a593Smuzhiyun 	int rc;
1078*4882a593Smuzhiyun 
1079*4882a593Smuzhiyun 	/* Search the list of PHY devices on the mdio bus for the
1080*4882a593Smuzhiyun 	 * PHY with the requested name
1081*4882a593Smuzhiyun 	 */
1082*4882a593Smuzhiyun 	d = bus_find_device_by_name(&mdio_bus_type, NULL, bus_id);
1083*4882a593Smuzhiyun 	if (!d) {
1084*4882a593Smuzhiyun 		pr_err("PHY %s not found\n", bus_id);
1085*4882a593Smuzhiyun 		return ERR_PTR(-ENODEV);
1086*4882a593Smuzhiyun 	}
1087*4882a593Smuzhiyun 	phydev = to_phy_device(d);
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 	rc = phy_connect_direct(dev, phydev, handler, interface);
1090*4882a593Smuzhiyun 	put_device(d);
1091*4882a593Smuzhiyun 	if (rc)
1092*4882a593Smuzhiyun 		return ERR_PTR(rc);
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun 	return phydev;
1095*4882a593Smuzhiyun }
1096*4882a593Smuzhiyun EXPORT_SYMBOL(phy_connect);
1097*4882a593Smuzhiyun 
1098*4882a593Smuzhiyun /**
1099*4882a593Smuzhiyun  * phy_disconnect - disable interrupts, stop state machine, and detach a PHY
1100*4882a593Smuzhiyun  *		    device
1101*4882a593Smuzhiyun  * @phydev: target phy_device struct
1102*4882a593Smuzhiyun  */
phy_disconnect(struct phy_device * phydev)1103*4882a593Smuzhiyun void phy_disconnect(struct phy_device *phydev)
1104*4882a593Smuzhiyun {
1105*4882a593Smuzhiyun 	if (phy_is_started(phydev))
1106*4882a593Smuzhiyun 		phy_stop(phydev);
1107*4882a593Smuzhiyun 
1108*4882a593Smuzhiyun 	if (phy_interrupt_is_valid(phydev))
1109*4882a593Smuzhiyun 		phy_free_interrupt(phydev);
1110*4882a593Smuzhiyun 
1111*4882a593Smuzhiyun 	phydev->adjust_link = NULL;
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun 	phy_detach(phydev);
1114*4882a593Smuzhiyun }
1115*4882a593Smuzhiyun EXPORT_SYMBOL(phy_disconnect);
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun /**
1118*4882a593Smuzhiyun  * phy_poll_reset - Safely wait until a PHY reset has properly completed
1119*4882a593Smuzhiyun  * @phydev: The PHY device to poll
1120*4882a593Smuzhiyun  *
1121*4882a593Smuzhiyun  * Description: According to IEEE 802.3, Section 2, Subsection 22.2.4.1.1, as
1122*4882a593Smuzhiyun  *   published in 2008, a PHY reset may take up to 0.5 seconds.  The MII BMCR
1123*4882a593Smuzhiyun  *   register must be polled until the BMCR_RESET bit clears.
1124*4882a593Smuzhiyun  *
1125*4882a593Smuzhiyun  *   Furthermore, any attempts to write to PHY registers may have no effect
1126*4882a593Smuzhiyun  *   or even generate MDIO bus errors until this is complete.
1127*4882a593Smuzhiyun  *
1128*4882a593Smuzhiyun  *   Some PHYs (such as the Marvell 88E1111) don't entirely conform to the
1129*4882a593Smuzhiyun  *   standard and do not fully reset after the BMCR_RESET bit is set, and may
1130*4882a593Smuzhiyun  *   even *REQUIRE* a soft-reset to properly restart autonegotiation.  In an
1131*4882a593Smuzhiyun  *   effort to support such broken PHYs, this function is separate from the
1132*4882a593Smuzhiyun  *   standard phy_init_hw() which will zero all the other bits in the BMCR
1133*4882a593Smuzhiyun  *   and reapply all driver-specific and board-specific fixups.
1134*4882a593Smuzhiyun  */
phy_poll_reset(struct phy_device * phydev)1135*4882a593Smuzhiyun static int phy_poll_reset(struct phy_device *phydev)
1136*4882a593Smuzhiyun {
1137*4882a593Smuzhiyun 	/* Poll until the reset bit clears (50ms per retry == 0.6 sec) */
1138*4882a593Smuzhiyun 	int ret, val;
1139*4882a593Smuzhiyun 
1140*4882a593Smuzhiyun 	ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET),
1141*4882a593Smuzhiyun 				    50000, 600000, true);
1142*4882a593Smuzhiyun 	if (ret)
1143*4882a593Smuzhiyun 		return ret;
1144*4882a593Smuzhiyun 	/* Some chips (smsc911x) may still need up to another 1ms after the
1145*4882a593Smuzhiyun 	 * BMCR_RESET bit is cleared before they are usable.
1146*4882a593Smuzhiyun 	 */
1147*4882a593Smuzhiyun 	msleep(1);
1148*4882a593Smuzhiyun 	return 0;
1149*4882a593Smuzhiyun }
1150*4882a593Smuzhiyun 
phy_init_hw(struct phy_device * phydev)1151*4882a593Smuzhiyun int phy_init_hw(struct phy_device *phydev)
1152*4882a593Smuzhiyun {
1153*4882a593Smuzhiyun 	int ret = 0;
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun 	/* Deassert the reset signal */
1156*4882a593Smuzhiyun 	phy_device_reset(phydev, 0);
1157*4882a593Smuzhiyun 
1158*4882a593Smuzhiyun 	if (!phydev->drv)
1159*4882a593Smuzhiyun 		return 0;
1160*4882a593Smuzhiyun 
1161*4882a593Smuzhiyun 	if (phydev->drv->soft_reset) {
1162*4882a593Smuzhiyun 		ret = phydev->drv->soft_reset(phydev);
1163*4882a593Smuzhiyun 		/* see comment in genphy_soft_reset for an explanation */
1164*4882a593Smuzhiyun 		if (!ret)
1165*4882a593Smuzhiyun 			phydev->suspended = 0;
1166*4882a593Smuzhiyun 	}
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun 	if (ret < 0)
1169*4882a593Smuzhiyun 		return ret;
1170*4882a593Smuzhiyun 
1171*4882a593Smuzhiyun 	ret = phy_scan_fixups(phydev);
1172*4882a593Smuzhiyun 	if (ret < 0)
1173*4882a593Smuzhiyun 		return ret;
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun 	if (phydev->drv->config_init) {
1176*4882a593Smuzhiyun 		ret = phydev->drv->config_init(phydev);
1177*4882a593Smuzhiyun 		if (ret < 0)
1178*4882a593Smuzhiyun 			return ret;
1179*4882a593Smuzhiyun 	}
1180*4882a593Smuzhiyun 
1181*4882a593Smuzhiyun 	if (phydev->drv->config_intr) {
1182*4882a593Smuzhiyun 		ret = phydev->drv->config_intr(phydev);
1183*4882a593Smuzhiyun 		if (ret < 0)
1184*4882a593Smuzhiyun 			return ret;
1185*4882a593Smuzhiyun 	}
1186*4882a593Smuzhiyun 
1187*4882a593Smuzhiyun 	return 0;
1188*4882a593Smuzhiyun }
1189*4882a593Smuzhiyun EXPORT_SYMBOL(phy_init_hw);
1190*4882a593Smuzhiyun 
phy_attached_info(struct phy_device * phydev)1191*4882a593Smuzhiyun void phy_attached_info(struct phy_device *phydev)
1192*4882a593Smuzhiyun {
1193*4882a593Smuzhiyun 	phy_attached_print(phydev, NULL);
1194*4882a593Smuzhiyun }
1195*4882a593Smuzhiyun EXPORT_SYMBOL(phy_attached_info);
1196*4882a593Smuzhiyun 
1197*4882a593Smuzhiyun #define ATTACHED_FMT "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%s)"
phy_attached_info_irq(struct phy_device * phydev)1198*4882a593Smuzhiyun char *phy_attached_info_irq(struct phy_device *phydev)
1199*4882a593Smuzhiyun {
1200*4882a593Smuzhiyun 	char *irq_str;
1201*4882a593Smuzhiyun 	char irq_num[8];
1202*4882a593Smuzhiyun 
1203*4882a593Smuzhiyun 	switch(phydev->irq) {
1204*4882a593Smuzhiyun 	case PHY_POLL:
1205*4882a593Smuzhiyun 		irq_str = "POLL";
1206*4882a593Smuzhiyun 		break;
1207*4882a593Smuzhiyun 	case PHY_IGNORE_INTERRUPT:
1208*4882a593Smuzhiyun 		irq_str = "IGNORE";
1209*4882a593Smuzhiyun 		break;
1210*4882a593Smuzhiyun 	default:
1211*4882a593Smuzhiyun 		snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq);
1212*4882a593Smuzhiyun 		irq_str = irq_num;
1213*4882a593Smuzhiyun 		break;
1214*4882a593Smuzhiyun 	}
1215*4882a593Smuzhiyun 
1216*4882a593Smuzhiyun 	return kasprintf(GFP_KERNEL, "%s", irq_str);
1217*4882a593Smuzhiyun }
1218*4882a593Smuzhiyun EXPORT_SYMBOL(phy_attached_info_irq);
1219*4882a593Smuzhiyun 
phy_attached_print(struct phy_device * phydev,const char * fmt,...)1220*4882a593Smuzhiyun void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
1221*4882a593Smuzhiyun {
1222*4882a593Smuzhiyun 	const char *drv_name = phydev->drv ? phydev->drv->name : "unbound";
1223*4882a593Smuzhiyun 	char *irq_str = phy_attached_info_irq(phydev);
1224*4882a593Smuzhiyun 
1225*4882a593Smuzhiyun 	if (!fmt) {
1226*4882a593Smuzhiyun 		phydev_info(phydev, ATTACHED_FMT "\n",
1227*4882a593Smuzhiyun 			 drv_name, phydev_name(phydev),
1228*4882a593Smuzhiyun 			 irq_str);
1229*4882a593Smuzhiyun 	} else {
1230*4882a593Smuzhiyun 		va_list ap;
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun 		phydev_info(phydev, ATTACHED_FMT,
1233*4882a593Smuzhiyun 			 drv_name, phydev_name(phydev),
1234*4882a593Smuzhiyun 			 irq_str);
1235*4882a593Smuzhiyun 
1236*4882a593Smuzhiyun 		va_start(ap, fmt);
1237*4882a593Smuzhiyun 		vprintk(fmt, ap);
1238*4882a593Smuzhiyun 		va_end(ap);
1239*4882a593Smuzhiyun 	}
1240*4882a593Smuzhiyun 	kfree(irq_str);
1241*4882a593Smuzhiyun }
1242*4882a593Smuzhiyun EXPORT_SYMBOL(phy_attached_print);
1243*4882a593Smuzhiyun 
phy_sysfs_create_links(struct phy_device * phydev)1244*4882a593Smuzhiyun static void phy_sysfs_create_links(struct phy_device *phydev)
1245*4882a593Smuzhiyun {
1246*4882a593Smuzhiyun 	struct net_device *dev = phydev->attached_dev;
1247*4882a593Smuzhiyun 	int err;
1248*4882a593Smuzhiyun 
1249*4882a593Smuzhiyun 	if (!dev)
1250*4882a593Smuzhiyun 		return;
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun 	err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj,
1253*4882a593Smuzhiyun 				"attached_dev");
1254*4882a593Smuzhiyun 	if (err)
1255*4882a593Smuzhiyun 		return;
1256*4882a593Smuzhiyun 
1257*4882a593Smuzhiyun 	err = sysfs_create_link_nowarn(&dev->dev.kobj,
1258*4882a593Smuzhiyun 				       &phydev->mdio.dev.kobj,
1259*4882a593Smuzhiyun 				       "phydev");
1260*4882a593Smuzhiyun 	if (err) {
1261*4882a593Smuzhiyun 		dev_err(&dev->dev, "could not add device link to %s err %d\n",
1262*4882a593Smuzhiyun 			kobject_name(&phydev->mdio.dev.kobj),
1263*4882a593Smuzhiyun 			err);
1264*4882a593Smuzhiyun 		/* non-fatal - some net drivers can use one netdevice
1265*4882a593Smuzhiyun 		 * with more then one phy
1266*4882a593Smuzhiyun 		 */
1267*4882a593Smuzhiyun 	}
1268*4882a593Smuzhiyun 
1269*4882a593Smuzhiyun 	phydev->sysfs_links = true;
1270*4882a593Smuzhiyun }
1271*4882a593Smuzhiyun 
1272*4882a593Smuzhiyun static ssize_t
phy_standalone_show(struct device * dev,struct device_attribute * attr,char * buf)1273*4882a593Smuzhiyun phy_standalone_show(struct device *dev, struct device_attribute *attr,
1274*4882a593Smuzhiyun 		    char *buf)
1275*4882a593Smuzhiyun {
1276*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
1277*4882a593Smuzhiyun 
1278*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", !phydev->attached_dev);
1279*4882a593Smuzhiyun }
1280*4882a593Smuzhiyun static DEVICE_ATTR_RO(phy_standalone);
1281*4882a593Smuzhiyun 
1282*4882a593Smuzhiyun /**
1283*4882a593Smuzhiyun  * phy_sfp_attach - attach the SFP bus to the PHY upstream network device
1284*4882a593Smuzhiyun  * @upstream: pointer to the phy device
1285*4882a593Smuzhiyun  * @bus: sfp bus representing cage being attached
1286*4882a593Smuzhiyun  *
1287*4882a593Smuzhiyun  * This is used to fill in the sfp_upstream_ops .attach member.
1288*4882a593Smuzhiyun  */
phy_sfp_attach(void * upstream,struct sfp_bus * bus)1289*4882a593Smuzhiyun void phy_sfp_attach(void *upstream, struct sfp_bus *bus)
1290*4882a593Smuzhiyun {
1291*4882a593Smuzhiyun 	struct phy_device *phydev = upstream;
1292*4882a593Smuzhiyun 
1293*4882a593Smuzhiyun 	if (phydev->attached_dev)
1294*4882a593Smuzhiyun 		phydev->attached_dev->sfp_bus = bus;
1295*4882a593Smuzhiyun 	phydev->sfp_bus_attached = true;
1296*4882a593Smuzhiyun }
1297*4882a593Smuzhiyun EXPORT_SYMBOL(phy_sfp_attach);
1298*4882a593Smuzhiyun 
1299*4882a593Smuzhiyun /**
1300*4882a593Smuzhiyun  * phy_sfp_detach - detach the SFP bus from the PHY upstream network device
1301*4882a593Smuzhiyun  * @upstream: pointer to the phy device
1302*4882a593Smuzhiyun  * @bus: sfp bus representing cage being attached
1303*4882a593Smuzhiyun  *
1304*4882a593Smuzhiyun  * This is used to fill in the sfp_upstream_ops .detach member.
1305*4882a593Smuzhiyun  */
phy_sfp_detach(void * upstream,struct sfp_bus * bus)1306*4882a593Smuzhiyun void phy_sfp_detach(void *upstream, struct sfp_bus *bus)
1307*4882a593Smuzhiyun {
1308*4882a593Smuzhiyun 	struct phy_device *phydev = upstream;
1309*4882a593Smuzhiyun 
1310*4882a593Smuzhiyun 	if (phydev->attached_dev)
1311*4882a593Smuzhiyun 		phydev->attached_dev->sfp_bus = NULL;
1312*4882a593Smuzhiyun 	phydev->sfp_bus_attached = false;
1313*4882a593Smuzhiyun }
1314*4882a593Smuzhiyun EXPORT_SYMBOL(phy_sfp_detach);
1315*4882a593Smuzhiyun 
1316*4882a593Smuzhiyun /**
1317*4882a593Smuzhiyun  * phy_sfp_probe - probe for a SFP cage attached to this PHY device
1318*4882a593Smuzhiyun  * @phydev: Pointer to phy_device
1319*4882a593Smuzhiyun  * @ops: SFP's upstream operations
1320*4882a593Smuzhiyun  */
phy_sfp_probe(struct phy_device * phydev,const struct sfp_upstream_ops * ops)1321*4882a593Smuzhiyun int phy_sfp_probe(struct phy_device *phydev,
1322*4882a593Smuzhiyun 		  const struct sfp_upstream_ops *ops)
1323*4882a593Smuzhiyun {
1324*4882a593Smuzhiyun 	struct sfp_bus *bus;
1325*4882a593Smuzhiyun 	int ret = 0;
1326*4882a593Smuzhiyun 
1327*4882a593Smuzhiyun 	if (phydev->mdio.dev.fwnode) {
1328*4882a593Smuzhiyun 		bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode);
1329*4882a593Smuzhiyun 		if (IS_ERR(bus))
1330*4882a593Smuzhiyun 			return PTR_ERR(bus);
1331*4882a593Smuzhiyun 
1332*4882a593Smuzhiyun 		phydev->sfp_bus = bus;
1333*4882a593Smuzhiyun 
1334*4882a593Smuzhiyun 		ret = sfp_bus_add_upstream(bus, phydev, ops);
1335*4882a593Smuzhiyun 		sfp_bus_put(bus);
1336*4882a593Smuzhiyun 	}
1337*4882a593Smuzhiyun 	return ret;
1338*4882a593Smuzhiyun }
1339*4882a593Smuzhiyun EXPORT_SYMBOL(phy_sfp_probe);
1340*4882a593Smuzhiyun 
1341*4882a593Smuzhiyun /**
1342*4882a593Smuzhiyun  * phy_attach_direct - attach a network device to a given PHY device pointer
1343*4882a593Smuzhiyun  * @dev: network device to attach
1344*4882a593Smuzhiyun  * @phydev: Pointer to phy_device to attach
1345*4882a593Smuzhiyun  * @flags: PHY device's dev_flags
1346*4882a593Smuzhiyun  * @interface: PHY device's interface
1347*4882a593Smuzhiyun  *
1348*4882a593Smuzhiyun  * Description: Called by drivers to attach to a particular PHY
1349*4882a593Smuzhiyun  *     device. The phy_device is found, and properly hooked up
1350*4882a593Smuzhiyun  *     to the phy_driver.  If no driver is attached, then a
1351*4882a593Smuzhiyun  *     generic driver is used.  The phy_device is given a ptr to
1352*4882a593Smuzhiyun  *     the attaching device, and given a callback for link status
1353*4882a593Smuzhiyun  *     change.  The phy_device is returned to the attaching driver.
1354*4882a593Smuzhiyun  *     This function takes a reference on the phy device.
1355*4882a593Smuzhiyun  */
phy_attach_direct(struct net_device * dev,struct phy_device * phydev,u32 flags,phy_interface_t interface)1356*4882a593Smuzhiyun int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
1357*4882a593Smuzhiyun 		      u32 flags, phy_interface_t interface)
1358*4882a593Smuzhiyun {
1359*4882a593Smuzhiyun 	struct mii_bus *bus = phydev->mdio.bus;
1360*4882a593Smuzhiyun 	struct device *d = &phydev->mdio.dev;
1361*4882a593Smuzhiyun 	struct module *ndev_owner = NULL;
1362*4882a593Smuzhiyun 	bool using_genphy = false;
1363*4882a593Smuzhiyun 	int err;
1364*4882a593Smuzhiyun 
1365*4882a593Smuzhiyun 	/* For Ethernet device drivers that register their own MDIO bus, we
1366*4882a593Smuzhiyun 	 * will have bus->owner match ndev_mod, so we do not want to increment
1367*4882a593Smuzhiyun 	 * our own module->refcnt here, otherwise we would not be able to
1368*4882a593Smuzhiyun 	 * unload later on.
1369*4882a593Smuzhiyun 	 */
1370*4882a593Smuzhiyun 	if (dev)
1371*4882a593Smuzhiyun 		ndev_owner = dev->dev.parent->driver->owner;
1372*4882a593Smuzhiyun 	if (ndev_owner != bus->owner && !try_module_get(bus->owner)) {
1373*4882a593Smuzhiyun 		phydev_err(phydev, "failed to get the bus module\n");
1374*4882a593Smuzhiyun 		return -EIO;
1375*4882a593Smuzhiyun 	}
1376*4882a593Smuzhiyun 
1377*4882a593Smuzhiyun 	get_device(d);
1378*4882a593Smuzhiyun 
1379*4882a593Smuzhiyun 	/* Assume that if there is no driver, that it doesn't
1380*4882a593Smuzhiyun 	 * exist, and we should use the genphy driver.
1381*4882a593Smuzhiyun 	 */
1382*4882a593Smuzhiyun 	if (!d->driver) {
1383*4882a593Smuzhiyun 		if (phydev->is_c45)
1384*4882a593Smuzhiyun 			d->driver = &genphy_c45_driver.mdiodrv.driver;
1385*4882a593Smuzhiyun 		else
1386*4882a593Smuzhiyun 			d->driver = &genphy_driver.mdiodrv.driver;
1387*4882a593Smuzhiyun 
1388*4882a593Smuzhiyun 		using_genphy = true;
1389*4882a593Smuzhiyun 	}
1390*4882a593Smuzhiyun 
1391*4882a593Smuzhiyun 	if (!try_module_get(d->driver->owner)) {
1392*4882a593Smuzhiyun 		phydev_err(phydev, "failed to get the device driver module\n");
1393*4882a593Smuzhiyun 		err = -EIO;
1394*4882a593Smuzhiyun 		goto error_put_device;
1395*4882a593Smuzhiyun 	}
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun 	if (using_genphy) {
1398*4882a593Smuzhiyun 		err = d->driver->probe(d);
1399*4882a593Smuzhiyun 		if (err >= 0)
1400*4882a593Smuzhiyun 			err = device_bind_driver(d);
1401*4882a593Smuzhiyun 
1402*4882a593Smuzhiyun 		if (err)
1403*4882a593Smuzhiyun 			goto error_module_put;
1404*4882a593Smuzhiyun 	}
1405*4882a593Smuzhiyun 
1406*4882a593Smuzhiyun 	if (phydev->attached_dev) {
1407*4882a593Smuzhiyun 		dev_err(&dev->dev, "PHY already attached\n");
1408*4882a593Smuzhiyun 		err = -EBUSY;
1409*4882a593Smuzhiyun 		goto error;
1410*4882a593Smuzhiyun 	}
1411*4882a593Smuzhiyun 
1412*4882a593Smuzhiyun 	phydev->phy_link_change = phy_link_change;
1413*4882a593Smuzhiyun 	if (dev) {
1414*4882a593Smuzhiyun 		phydev->attached_dev = dev;
1415*4882a593Smuzhiyun 		dev->phydev = phydev;
1416*4882a593Smuzhiyun 
1417*4882a593Smuzhiyun 		if (phydev->sfp_bus_attached)
1418*4882a593Smuzhiyun 			dev->sfp_bus = phydev->sfp_bus;
1419*4882a593Smuzhiyun 	}
1420*4882a593Smuzhiyun 
1421*4882a593Smuzhiyun 	/* Some Ethernet drivers try to connect to a PHY device before
1422*4882a593Smuzhiyun 	 * calling register_netdevice() -> netdev_register_kobject() and
1423*4882a593Smuzhiyun 	 * does the dev->dev.kobj initialization. Here we only check for
1424*4882a593Smuzhiyun 	 * success which indicates that the network device kobject is
1425*4882a593Smuzhiyun 	 * ready. Once we do that we still need to keep track of whether
1426*4882a593Smuzhiyun 	 * links were successfully set up or not for phy_detach() to
1427*4882a593Smuzhiyun 	 * remove them accordingly.
1428*4882a593Smuzhiyun 	 */
1429*4882a593Smuzhiyun 	phydev->sysfs_links = false;
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun 	phy_sysfs_create_links(phydev);
1432*4882a593Smuzhiyun 
1433*4882a593Smuzhiyun 	if (!phydev->attached_dev) {
1434*4882a593Smuzhiyun 		err = sysfs_create_file(&phydev->mdio.dev.kobj,
1435*4882a593Smuzhiyun 					&dev_attr_phy_standalone.attr);
1436*4882a593Smuzhiyun 		if (err)
1437*4882a593Smuzhiyun 			phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n");
1438*4882a593Smuzhiyun 	}
1439*4882a593Smuzhiyun 
1440*4882a593Smuzhiyun 	phydev->dev_flags |= flags;
1441*4882a593Smuzhiyun 
1442*4882a593Smuzhiyun 	phydev->interface = interface;
1443*4882a593Smuzhiyun 
1444*4882a593Smuzhiyun 	phydev->state = PHY_READY;
1445*4882a593Smuzhiyun 
1446*4882a593Smuzhiyun 	/* Port is set to PORT_TP by default and the actual PHY driver will set
1447*4882a593Smuzhiyun 	 * it to different value depending on the PHY configuration. If we have
1448*4882a593Smuzhiyun 	 * the generic PHY driver we can't figure it out, thus set the old
1449*4882a593Smuzhiyun 	 * legacy PORT_MII value.
1450*4882a593Smuzhiyun 	 */
1451*4882a593Smuzhiyun 	if (using_genphy)
1452*4882a593Smuzhiyun 		phydev->port = PORT_MII;
1453*4882a593Smuzhiyun 
1454*4882a593Smuzhiyun 	/* Initial carrier state is off as the phy is about to be
1455*4882a593Smuzhiyun 	 * (re)initialized.
1456*4882a593Smuzhiyun 	 */
1457*4882a593Smuzhiyun 	if (dev)
1458*4882a593Smuzhiyun 		netif_carrier_off(phydev->attached_dev);
1459*4882a593Smuzhiyun 
1460*4882a593Smuzhiyun 	/* Do initial configuration here, now that
1461*4882a593Smuzhiyun 	 * we have certain key parameters
1462*4882a593Smuzhiyun 	 * (dev_flags and interface)
1463*4882a593Smuzhiyun 	 */
1464*4882a593Smuzhiyun 	err = phy_init_hw(phydev);
1465*4882a593Smuzhiyun 	if (err)
1466*4882a593Smuzhiyun 		goto error;
1467*4882a593Smuzhiyun 
1468*4882a593Smuzhiyun 	err = phy_disable_interrupts(phydev);
1469*4882a593Smuzhiyun 	if (err)
1470*4882a593Smuzhiyun 		return err;
1471*4882a593Smuzhiyun 
1472*4882a593Smuzhiyun 	phy_resume(phydev);
1473*4882a593Smuzhiyun 	phy_led_triggers_register(phydev);
1474*4882a593Smuzhiyun 
1475*4882a593Smuzhiyun 	return err;
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun error:
1478*4882a593Smuzhiyun 	/* phy_detach() does all of the cleanup below */
1479*4882a593Smuzhiyun 	phy_detach(phydev);
1480*4882a593Smuzhiyun 	return err;
1481*4882a593Smuzhiyun 
1482*4882a593Smuzhiyun error_module_put:
1483*4882a593Smuzhiyun 	module_put(d->driver->owner);
1484*4882a593Smuzhiyun 	d->driver = NULL;
1485*4882a593Smuzhiyun error_put_device:
1486*4882a593Smuzhiyun 	put_device(d);
1487*4882a593Smuzhiyun 	if (ndev_owner != bus->owner)
1488*4882a593Smuzhiyun 		module_put(bus->owner);
1489*4882a593Smuzhiyun 	return err;
1490*4882a593Smuzhiyun }
1491*4882a593Smuzhiyun EXPORT_SYMBOL(phy_attach_direct);
1492*4882a593Smuzhiyun 
1493*4882a593Smuzhiyun /**
1494*4882a593Smuzhiyun  * phy_attach - attach a network device to a particular PHY device
1495*4882a593Smuzhiyun  * @dev: network device to attach
1496*4882a593Smuzhiyun  * @bus_id: Bus ID of PHY device to attach
1497*4882a593Smuzhiyun  * @interface: PHY device's interface
1498*4882a593Smuzhiyun  *
1499*4882a593Smuzhiyun  * Description: Same as phy_attach_direct() except that a PHY bus_id
1500*4882a593Smuzhiyun  *     string is passed instead of a pointer to a struct phy_device.
1501*4882a593Smuzhiyun  */
phy_attach(struct net_device * dev,const char * bus_id,phy_interface_t interface)1502*4882a593Smuzhiyun struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,
1503*4882a593Smuzhiyun 			      phy_interface_t interface)
1504*4882a593Smuzhiyun {
1505*4882a593Smuzhiyun 	struct bus_type *bus = &mdio_bus_type;
1506*4882a593Smuzhiyun 	struct phy_device *phydev;
1507*4882a593Smuzhiyun 	struct device *d;
1508*4882a593Smuzhiyun 	int rc;
1509*4882a593Smuzhiyun 
1510*4882a593Smuzhiyun 	if (!dev)
1511*4882a593Smuzhiyun 		return ERR_PTR(-EINVAL);
1512*4882a593Smuzhiyun 
1513*4882a593Smuzhiyun 	/* Search the list of PHY devices on the mdio bus for the
1514*4882a593Smuzhiyun 	 * PHY with the requested name
1515*4882a593Smuzhiyun 	 */
1516*4882a593Smuzhiyun 	d = bus_find_device_by_name(bus, NULL, bus_id);
1517*4882a593Smuzhiyun 	if (!d) {
1518*4882a593Smuzhiyun 		pr_err("PHY %s not found\n", bus_id);
1519*4882a593Smuzhiyun 		return ERR_PTR(-ENODEV);
1520*4882a593Smuzhiyun 	}
1521*4882a593Smuzhiyun 	phydev = to_phy_device(d);
1522*4882a593Smuzhiyun 
1523*4882a593Smuzhiyun 	rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
1524*4882a593Smuzhiyun 	put_device(d);
1525*4882a593Smuzhiyun 	if (rc)
1526*4882a593Smuzhiyun 		return ERR_PTR(rc);
1527*4882a593Smuzhiyun 
1528*4882a593Smuzhiyun 	return phydev;
1529*4882a593Smuzhiyun }
1530*4882a593Smuzhiyun EXPORT_SYMBOL(phy_attach);
1531*4882a593Smuzhiyun 
phy_driver_is_genphy_kind(struct phy_device * phydev,struct device_driver * driver)1532*4882a593Smuzhiyun static bool phy_driver_is_genphy_kind(struct phy_device *phydev,
1533*4882a593Smuzhiyun 				      struct device_driver *driver)
1534*4882a593Smuzhiyun {
1535*4882a593Smuzhiyun 	struct device *d = &phydev->mdio.dev;
1536*4882a593Smuzhiyun 	bool ret = false;
1537*4882a593Smuzhiyun 
1538*4882a593Smuzhiyun 	if (!phydev->drv)
1539*4882a593Smuzhiyun 		return ret;
1540*4882a593Smuzhiyun 
1541*4882a593Smuzhiyun 	get_device(d);
1542*4882a593Smuzhiyun 	ret = d->driver == driver;
1543*4882a593Smuzhiyun 	put_device(d);
1544*4882a593Smuzhiyun 
1545*4882a593Smuzhiyun 	return ret;
1546*4882a593Smuzhiyun }
1547*4882a593Smuzhiyun 
phy_driver_is_genphy(struct phy_device * phydev)1548*4882a593Smuzhiyun bool phy_driver_is_genphy(struct phy_device *phydev)
1549*4882a593Smuzhiyun {
1550*4882a593Smuzhiyun 	return phy_driver_is_genphy_kind(phydev,
1551*4882a593Smuzhiyun 					 &genphy_driver.mdiodrv.driver);
1552*4882a593Smuzhiyun }
1553*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_driver_is_genphy);
1554*4882a593Smuzhiyun 
phy_driver_is_genphy_10g(struct phy_device * phydev)1555*4882a593Smuzhiyun bool phy_driver_is_genphy_10g(struct phy_device *phydev)
1556*4882a593Smuzhiyun {
1557*4882a593Smuzhiyun 	return phy_driver_is_genphy_kind(phydev,
1558*4882a593Smuzhiyun 					 &genphy_c45_driver.mdiodrv.driver);
1559*4882a593Smuzhiyun }
1560*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_driver_is_genphy_10g);
1561*4882a593Smuzhiyun 
1562*4882a593Smuzhiyun /**
1563*4882a593Smuzhiyun  * phy_package_join - join a common PHY group
1564*4882a593Smuzhiyun  * @phydev: target phy_device struct
1565*4882a593Smuzhiyun  * @addr: cookie and PHY address for global register access
1566*4882a593Smuzhiyun  * @priv_size: if non-zero allocate this amount of bytes for private data
1567*4882a593Smuzhiyun  *
1568*4882a593Smuzhiyun  * This joins a PHY group and provides a shared storage for all phydevs in
1569*4882a593Smuzhiyun  * this group. This is intended to be used for packages which contain
1570*4882a593Smuzhiyun  * more than one PHY, for example a quad PHY transceiver.
1571*4882a593Smuzhiyun  *
1572*4882a593Smuzhiyun  * The addr parameter serves as a cookie which has to have the same value
1573*4882a593Smuzhiyun  * for all members of one group and as a PHY address to access generic
1574*4882a593Smuzhiyun  * registers of a PHY package. Usually, one of the PHY addresses of the
1575*4882a593Smuzhiyun  * different PHYs in the package provides access to these global registers.
1576*4882a593Smuzhiyun  * The address which is given here, will be used in the phy_package_read()
1577*4882a593Smuzhiyun  * and phy_package_write() convenience functions. If your PHY doesn't have
1578*4882a593Smuzhiyun  * global registers you can just pick any of the PHY addresses.
1579*4882a593Smuzhiyun  *
1580*4882a593Smuzhiyun  * This will set the shared pointer of the phydev to the shared storage.
1581*4882a593Smuzhiyun  * If this is the first call for a this cookie the shared storage will be
1582*4882a593Smuzhiyun  * allocated. If priv_size is non-zero, the given amount of bytes are
1583*4882a593Smuzhiyun  * allocated for the priv member.
1584*4882a593Smuzhiyun  *
1585*4882a593Smuzhiyun  * Returns < 1 on error, 0 on success. Esp. calling phy_package_join()
1586*4882a593Smuzhiyun  * with the same cookie but a different priv_size is an error.
1587*4882a593Smuzhiyun  */
phy_package_join(struct phy_device * phydev,int addr,size_t priv_size)1588*4882a593Smuzhiyun int phy_package_join(struct phy_device *phydev, int addr, size_t priv_size)
1589*4882a593Smuzhiyun {
1590*4882a593Smuzhiyun 	struct mii_bus *bus = phydev->mdio.bus;
1591*4882a593Smuzhiyun 	struct phy_package_shared *shared;
1592*4882a593Smuzhiyun 	int ret;
1593*4882a593Smuzhiyun 
1594*4882a593Smuzhiyun 	if (addr < 0 || addr >= PHY_MAX_ADDR)
1595*4882a593Smuzhiyun 		return -EINVAL;
1596*4882a593Smuzhiyun 
1597*4882a593Smuzhiyun 	mutex_lock(&bus->shared_lock);
1598*4882a593Smuzhiyun 	shared = bus->shared[addr];
1599*4882a593Smuzhiyun 	if (!shared) {
1600*4882a593Smuzhiyun 		ret = -ENOMEM;
1601*4882a593Smuzhiyun 		shared = kzalloc(sizeof(*shared), GFP_KERNEL);
1602*4882a593Smuzhiyun 		if (!shared)
1603*4882a593Smuzhiyun 			goto err_unlock;
1604*4882a593Smuzhiyun 		if (priv_size) {
1605*4882a593Smuzhiyun 			shared->priv = kzalloc(priv_size, GFP_KERNEL);
1606*4882a593Smuzhiyun 			if (!shared->priv)
1607*4882a593Smuzhiyun 				goto err_free;
1608*4882a593Smuzhiyun 			shared->priv_size = priv_size;
1609*4882a593Smuzhiyun 		}
1610*4882a593Smuzhiyun 		shared->addr = addr;
1611*4882a593Smuzhiyun 		refcount_set(&shared->refcnt, 1);
1612*4882a593Smuzhiyun 		bus->shared[addr] = shared;
1613*4882a593Smuzhiyun 	} else {
1614*4882a593Smuzhiyun 		ret = -EINVAL;
1615*4882a593Smuzhiyun 		if (priv_size && priv_size != shared->priv_size)
1616*4882a593Smuzhiyun 			goto err_unlock;
1617*4882a593Smuzhiyun 		refcount_inc(&shared->refcnt);
1618*4882a593Smuzhiyun 	}
1619*4882a593Smuzhiyun 	mutex_unlock(&bus->shared_lock);
1620*4882a593Smuzhiyun 
1621*4882a593Smuzhiyun 	phydev->shared = shared;
1622*4882a593Smuzhiyun 
1623*4882a593Smuzhiyun 	return 0;
1624*4882a593Smuzhiyun 
1625*4882a593Smuzhiyun err_free:
1626*4882a593Smuzhiyun 	kfree(shared);
1627*4882a593Smuzhiyun err_unlock:
1628*4882a593Smuzhiyun 	mutex_unlock(&bus->shared_lock);
1629*4882a593Smuzhiyun 	return ret;
1630*4882a593Smuzhiyun }
1631*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_package_join);
1632*4882a593Smuzhiyun 
1633*4882a593Smuzhiyun /**
1634*4882a593Smuzhiyun  * phy_package_leave - leave a common PHY group
1635*4882a593Smuzhiyun  * @phydev: target phy_device struct
1636*4882a593Smuzhiyun  *
1637*4882a593Smuzhiyun  * This leaves a PHY group created by phy_package_join(). If this phydev
1638*4882a593Smuzhiyun  * was the last user of the shared data between the group, this data is
1639*4882a593Smuzhiyun  * freed. Resets the phydev->shared pointer to NULL.
1640*4882a593Smuzhiyun  */
phy_package_leave(struct phy_device * phydev)1641*4882a593Smuzhiyun void phy_package_leave(struct phy_device *phydev)
1642*4882a593Smuzhiyun {
1643*4882a593Smuzhiyun 	struct phy_package_shared *shared = phydev->shared;
1644*4882a593Smuzhiyun 	struct mii_bus *bus = phydev->mdio.bus;
1645*4882a593Smuzhiyun 
1646*4882a593Smuzhiyun 	if (!shared)
1647*4882a593Smuzhiyun 		return;
1648*4882a593Smuzhiyun 
1649*4882a593Smuzhiyun 	if (refcount_dec_and_mutex_lock(&shared->refcnt, &bus->shared_lock)) {
1650*4882a593Smuzhiyun 		bus->shared[shared->addr] = NULL;
1651*4882a593Smuzhiyun 		mutex_unlock(&bus->shared_lock);
1652*4882a593Smuzhiyun 		kfree(shared->priv);
1653*4882a593Smuzhiyun 		kfree(shared);
1654*4882a593Smuzhiyun 	}
1655*4882a593Smuzhiyun 
1656*4882a593Smuzhiyun 	phydev->shared = NULL;
1657*4882a593Smuzhiyun }
1658*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(phy_package_leave);
1659*4882a593Smuzhiyun 
devm_phy_package_leave(struct device * dev,void * res)1660*4882a593Smuzhiyun static void devm_phy_package_leave(struct device *dev, void *res)
1661*4882a593Smuzhiyun {
1662*4882a593Smuzhiyun 	phy_package_leave(*(struct phy_device **)res);
1663*4882a593Smuzhiyun }
1664*4882a593Smuzhiyun 
1665*4882a593Smuzhiyun /**
1666*4882a593Smuzhiyun  * devm_phy_package_join - resource managed phy_package_join()
1667*4882a593Smuzhiyun  * @dev: device that is registering this PHY package
1668*4882a593Smuzhiyun  * @phydev: target phy_device struct
1669*4882a593Smuzhiyun  * @addr: cookie and PHY address for global register access
1670*4882a593Smuzhiyun  * @priv_size: if non-zero allocate this amount of bytes for private data
1671*4882a593Smuzhiyun  *
1672*4882a593Smuzhiyun  * Managed phy_package_join(). Shared storage fetched by this function,
1673*4882a593Smuzhiyun  * phy_package_leave() is automatically called on driver detach. See
1674*4882a593Smuzhiyun  * phy_package_join() for more information.
1675*4882a593Smuzhiyun  */
devm_phy_package_join(struct device * dev,struct phy_device * phydev,int addr,size_t priv_size)1676*4882a593Smuzhiyun int devm_phy_package_join(struct device *dev, struct phy_device *phydev,
1677*4882a593Smuzhiyun 			  int addr, size_t priv_size)
1678*4882a593Smuzhiyun {
1679*4882a593Smuzhiyun 	struct phy_device **ptr;
1680*4882a593Smuzhiyun 	int ret;
1681*4882a593Smuzhiyun 
1682*4882a593Smuzhiyun 	ptr = devres_alloc(devm_phy_package_leave, sizeof(*ptr),
1683*4882a593Smuzhiyun 			   GFP_KERNEL);
1684*4882a593Smuzhiyun 	if (!ptr)
1685*4882a593Smuzhiyun 		return -ENOMEM;
1686*4882a593Smuzhiyun 
1687*4882a593Smuzhiyun 	ret = phy_package_join(phydev, addr, priv_size);
1688*4882a593Smuzhiyun 
1689*4882a593Smuzhiyun 	if (!ret) {
1690*4882a593Smuzhiyun 		*ptr = phydev;
1691*4882a593Smuzhiyun 		devres_add(dev, ptr);
1692*4882a593Smuzhiyun 	} else {
1693*4882a593Smuzhiyun 		devres_free(ptr);
1694*4882a593Smuzhiyun 	}
1695*4882a593Smuzhiyun 
1696*4882a593Smuzhiyun 	return ret;
1697*4882a593Smuzhiyun }
1698*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(devm_phy_package_join);
1699*4882a593Smuzhiyun 
1700*4882a593Smuzhiyun /**
1701*4882a593Smuzhiyun  * phy_detach - detach a PHY device from its network device
1702*4882a593Smuzhiyun  * @phydev: target phy_device struct
1703*4882a593Smuzhiyun  *
1704*4882a593Smuzhiyun  * This detaches the phy device from its network device and the phy
1705*4882a593Smuzhiyun  * driver, and drops the reference count taken in phy_attach_direct().
1706*4882a593Smuzhiyun  */
phy_detach(struct phy_device * phydev)1707*4882a593Smuzhiyun void phy_detach(struct phy_device *phydev)
1708*4882a593Smuzhiyun {
1709*4882a593Smuzhiyun 	struct net_device *dev = phydev->attached_dev;
1710*4882a593Smuzhiyun 	struct module *ndev_owner = NULL;
1711*4882a593Smuzhiyun 	struct mii_bus *bus;
1712*4882a593Smuzhiyun 
1713*4882a593Smuzhiyun 	if (phydev->sysfs_links) {
1714*4882a593Smuzhiyun 		if (dev)
1715*4882a593Smuzhiyun 			sysfs_remove_link(&dev->dev.kobj, "phydev");
1716*4882a593Smuzhiyun 		sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev");
1717*4882a593Smuzhiyun 	}
1718*4882a593Smuzhiyun 
1719*4882a593Smuzhiyun 	if (!phydev->attached_dev)
1720*4882a593Smuzhiyun 		sysfs_remove_file(&phydev->mdio.dev.kobj,
1721*4882a593Smuzhiyun 				  &dev_attr_phy_standalone.attr);
1722*4882a593Smuzhiyun 
1723*4882a593Smuzhiyun 	phy_suspend(phydev);
1724*4882a593Smuzhiyun 	if (dev) {
1725*4882a593Smuzhiyun 		phydev->attached_dev->phydev = NULL;
1726*4882a593Smuzhiyun 		phydev->attached_dev = NULL;
1727*4882a593Smuzhiyun 	}
1728*4882a593Smuzhiyun 	phydev->phylink = NULL;
1729*4882a593Smuzhiyun 
1730*4882a593Smuzhiyun 	phy_led_triggers_unregister(phydev);
1731*4882a593Smuzhiyun 
1732*4882a593Smuzhiyun 	if (phydev->mdio.dev.driver)
1733*4882a593Smuzhiyun 		module_put(phydev->mdio.dev.driver->owner);
1734*4882a593Smuzhiyun 
1735*4882a593Smuzhiyun 	/* If the device had no specific driver before (i.e. - it
1736*4882a593Smuzhiyun 	 * was using the generic driver), we unbind the device
1737*4882a593Smuzhiyun 	 * from the generic driver so that there's a chance a
1738*4882a593Smuzhiyun 	 * real driver could be loaded
1739*4882a593Smuzhiyun 	 */
1740*4882a593Smuzhiyun 	if (phy_driver_is_genphy(phydev) ||
1741*4882a593Smuzhiyun 	    phy_driver_is_genphy_10g(phydev))
1742*4882a593Smuzhiyun 		device_release_driver(&phydev->mdio.dev);
1743*4882a593Smuzhiyun 
1744*4882a593Smuzhiyun 	/* Assert the reset signal */
1745*4882a593Smuzhiyun 	phy_device_reset(phydev, 1);
1746*4882a593Smuzhiyun 
1747*4882a593Smuzhiyun 	/*
1748*4882a593Smuzhiyun 	 * The phydev might go away on the put_device() below, so avoid
1749*4882a593Smuzhiyun 	 * a use-after-free bug by reading the underlying bus first.
1750*4882a593Smuzhiyun 	 */
1751*4882a593Smuzhiyun 	bus = phydev->mdio.bus;
1752*4882a593Smuzhiyun 
1753*4882a593Smuzhiyun 	put_device(&phydev->mdio.dev);
1754*4882a593Smuzhiyun 	if (dev)
1755*4882a593Smuzhiyun 		ndev_owner = dev->dev.parent->driver->owner;
1756*4882a593Smuzhiyun 	if (ndev_owner != bus->owner)
1757*4882a593Smuzhiyun 		module_put(bus->owner);
1758*4882a593Smuzhiyun }
1759*4882a593Smuzhiyun EXPORT_SYMBOL(phy_detach);
1760*4882a593Smuzhiyun 
phy_suspend(struct phy_device * phydev)1761*4882a593Smuzhiyun int phy_suspend(struct phy_device *phydev)
1762*4882a593Smuzhiyun {
1763*4882a593Smuzhiyun 	struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
1764*4882a593Smuzhiyun 	struct net_device *netdev = phydev->attached_dev;
1765*4882a593Smuzhiyun 	struct phy_driver *phydrv = phydev->drv;
1766*4882a593Smuzhiyun 	int ret;
1767*4882a593Smuzhiyun 
1768*4882a593Smuzhiyun 	if (phydev->suspended)
1769*4882a593Smuzhiyun 		return 0;
1770*4882a593Smuzhiyun 
1771*4882a593Smuzhiyun 	/* If the device has WOL enabled, we cannot suspend the PHY */
1772*4882a593Smuzhiyun 	phy_ethtool_get_wol(phydev, &wol);
1773*4882a593Smuzhiyun 	if (wol.wolopts || (netdev && netdev->wol_enabled))
1774*4882a593Smuzhiyun 		return -EBUSY;
1775*4882a593Smuzhiyun 
1776*4882a593Smuzhiyun 	if (!phydrv || !phydrv->suspend)
1777*4882a593Smuzhiyun 		return 0;
1778*4882a593Smuzhiyun 
1779*4882a593Smuzhiyun 	ret = phydrv->suspend(phydev);
1780*4882a593Smuzhiyun 	if (!ret)
1781*4882a593Smuzhiyun 		phydev->suspended = true;
1782*4882a593Smuzhiyun 
1783*4882a593Smuzhiyun 	return ret;
1784*4882a593Smuzhiyun }
1785*4882a593Smuzhiyun EXPORT_SYMBOL(phy_suspend);
1786*4882a593Smuzhiyun 
__phy_resume(struct phy_device * phydev)1787*4882a593Smuzhiyun int __phy_resume(struct phy_device *phydev)
1788*4882a593Smuzhiyun {
1789*4882a593Smuzhiyun 	struct phy_driver *phydrv = phydev->drv;
1790*4882a593Smuzhiyun 	int ret;
1791*4882a593Smuzhiyun 
1792*4882a593Smuzhiyun 	WARN_ON(!mutex_is_locked(&phydev->lock));
1793*4882a593Smuzhiyun 
1794*4882a593Smuzhiyun 	if (!phydrv || !phydrv->resume)
1795*4882a593Smuzhiyun 		return 0;
1796*4882a593Smuzhiyun 
1797*4882a593Smuzhiyun 	ret = phydrv->resume(phydev);
1798*4882a593Smuzhiyun 	if (!ret)
1799*4882a593Smuzhiyun 		phydev->suspended = false;
1800*4882a593Smuzhiyun 
1801*4882a593Smuzhiyun 	return ret;
1802*4882a593Smuzhiyun }
1803*4882a593Smuzhiyun EXPORT_SYMBOL(__phy_resume);
1804*4882a593Smuzhiyun 
phy_resume(struct phy_device * phydev)1805*4882a593Smuzhiyun int phy_resume(struct phy_device *phydev)
1806*4882a593Smuzhiyun {
1807*4882a593Smuzhiyun 	int ret;
1808*4882a593Smuzhiyun 
1809*4882a593Smuzhiyun 	mutex_lock(&phydev->lock);
1810*4882a593Smuzhiyun 	ret = __phy_resume(phydev);
1811*4882a593Smuzhiyun 	mutex_unlock(&phydev->lock);
1812*4882a593Smuzhiyun 
1813*4882a593Smuzhiyun 	return ret;
1814*4882a593Smuzhiyun }
1815*4882a593Smuzhiyun EXPORT_SYMBOL(phy_resume);
1816*4882a593Smuzhiyun 
phy_loopback(struct phy_device * phydev,bool enable)1817*4882a593Smuzhiyun int phy_loopback(struct phy_device *phydev, bool enable)
1818*4882a593Smuzhiyun {
1819*4882a593Smuzhiyun 	struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver);
1820*4882a593Smuzhiyun 	int ret = 0;
1821*4882a593Smuzhiyun 
1822*4882a593Smuzhiyun 	mutex_lock(&phydev->lock);
1823*4882a593Smuzhiyun 
1824*4882a593Smuzhiyun 	if (enable && phydev->loopback_enabled) {
1825*4882a593Smuzhiyun 		ret = -EBUSY;
1826*4882a593Smuzhiyun 		goto out;
1827*4882a593Smuzhiyun 	}
1828*4882a593Smuzhiyun 
1829*4882a593Smuzhiyun 	if (!enable && !phydev->loopback_enabled) {
1830*4882a593Smuzhiyun 		ret = -EINVAL;
1831*4882a593Smuzhiyun 		goto out;
1832*4882a593Smuzhiyun 	}
1833*4882a593Smuzhiyun 
1834*4882a593Smuzhiyun 	if (phydev->drv && phydrv->set_loopback)
1835*4882a593Smuzhiyun 		ret = phydrv->set_loopback(phydev, enable);
1836*4882a593Smuzhiyun 	else
1837*4882a593Smuzhiyun 		ret = -EOPNOTSUPP;
1838*4882a593Smuzhiyun 
1839*4882a593Smuzhiyun 	if (ret)
1840*4882a593Smuzhiyun 		goto out;
1841*4882a593Smuzhiyun 
1842*4882a593Smuzhiyun 	phydev->loopback_enabled = enable;
1843*4882a593Smuzhiyun 
1844*4882a593Smuzhiyun out:
1845*4882a593Smuzhiyun 	mutex_unlock(&phydev->lock);
1846*4882a593Smuzhiyun 	return ret;
1847*4882a593Smuzhiyun }
1848*4882a593Smuzhiyun EXPORT_SYMBOL(phy_loopback);
1849*4882a593Smuzhiyun 
1850*4882a593Smuzhiyun /**
1851*4882a593Smuzhiyun  * phy_reset_after_clk_enable - perform a PHY reset if needed
1852*4882a593Smuzhiyun  * @phydev: target phy_device struct
1853*4882a593Smuzhiyun  *
1854*4882a593Smuzhiyun  * Description: Some PHYs are known to need a reset after their refclk was
1855*4882a593Smuzhiyun  *   enabled. This function evaluates the flags and perform the reset if it's
1856*4882a593Smuzhiyun  *   needed. Returns < 0 on error, 0 if the phy wasn't reset and 1 if the phy
1857*4882a593Smuzhiyun  *   was reset.
1858*4882a593Smuzhiyun  */
phy_reset_after_clk_enable(struct phy_device * phydev)1859*4882a593Smuzhiyun int phy_reset_after_clk_enable(struct phy_device *phydev)
1860*4882a593Smuzhiyun {
1861*4882a593Smuzhiyun 	if (!phydev || !phydev->drv)
1862*4882a593Smuzhiyun 		return -ENODEV;
1863*4882a593Smuzhiyun 
1864*4882a593Smuzhiyun 	if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) {
1865*4882a593Smuzhiyun 		phy_device_reset(phydev, 1);
1866*4882a593Smuzhiyun 		phy_device_reset(phydev, 0);
1867*4882a593Smuzhiyun 		return 1;
1868*4882a593Smuzhiyun 	}
1869*4882a593Smuzhiyun 
1870*4882a593Smuzhiyun 	return 0;
1871*4882a593Smuzhiyun }
1872*4882a593Smuzhiyun EXPORT_SYMBOL(phy_reset_after_clk_enable);
1873*4882a593Smuzhiyun 
1874*4882a593Smuzhiyun /* Generic PHY support and helper functions */
1875*4882a593Smuzhiyun 
1876*4882a593Smuzhiyun /**
1877*4882a593Smuzhiyun  * genphy_config_advert - sanitize and advertise auto-negotiation parameters
1878*4882a593Smuzhiyun  * @phydev: target phy_device struct
1879*4882a593Smuzhiyun  *
1880*4882a593Smuzhiyun  * Description: Writes MII_ADVERTISE with the appropriate values,
1881*4882a593Smuzhiyun  *   after sanitizing the values to make sure we only advertise
1882*4882a593Smuzhiyun  *   what is supported.  Returns < 0 on error, 0 if the PHY's advertisement
1883*4882a593Smuzhiyun  *   hasn't changed, and > 0 if it has changed.
1884*4882a593Smuzhiyun  */
genphy_config_advert(struct phy_device * phydev)1885*4882a593Smuzhiyun static int genphy_config_advert(struct phy_device *phydev)
1886*4882a593Smuzhiyun {
1887*4882a593Smuzhiyun 	int err, bmsr, changed = 0;
1888*4882a593Smuzhiyun 	u32 adv;
1889*4882a593Smuzhiyun 
1890*4882a593Smuzhiyun 	/* Only allow advertising what this PHY supports */
1891*4882a593Smuzhiyun 	linkmode_and(phydev->advertising, phydev->advertising,
1892*4882a593Smuzhiyun 		     phydev->supported);
1893*4882a593Smuzhiyun 
1894*4882a593Smuzhiyun 	adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
1895*4882a593Smuzhiyun 
1896*4882a593Smuzhiyun 	/* Setup standard advertisement */
1897*4882a593Smuzhiyun 	err = phy_modify_changed(phydev, MII_ADVERTISE,
1898*4882a593Smuzhiyun 				 ADVERTISE_ALL | ADVERTISE_100BASE4 |
1899*4882a593Smuzhiyun 				 ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
1900*4882a593Smuzhiyun 				 adv);
1901*4882a593Smuzhiyun 	if (err < 0)
1902*4882a593Smuzhiyun 		return err;
1903*4882a593Smuzhiyun 	if (err > 0)
1904*4882a593Smuzhiyun 		changed = 1;
1905*4882a593Smuzhiyun 
1906*4882a593Smuzhiyun 	bmsr = phy_read(phydev, MII_BMSR);
1907*4882a593Smuzhiyun 	if (bmsr < 0)
1908*4882a593Smuzhiyun 		return bmsr;
1909*4882a593Smuzhiyun 
1910*4882a593Smuzhiyun 	/* Per 802.3-2008, Section 22.2.4.2.16 Extended status all
1911*4882a593Smuzhiyun 	 * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a
1912*4882a593Smuzhiyun 	 * logical 1.
1913*4882a593Smuzhiyun 	 */
1914*4882a593Smuzhiyun 	if (!(bmsr & BMSR_ESTATEN))
1915*4882a593Smuzhiyun 		return changed;
1916*4882a593Smuzhiyun 
1917*4882a593Smuzhiyun 	adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
1918*4882a593Smuzhiyun 
1919*4882a593Smuzhiyun 	err = phy_modify_changed(phydev, MII_CTRL1000,
1920*4882a593Smuzhiyun 				 ADVERTISE_1000FULL | ADVERTISE_1000HALF,
1921*4882a593Smuzhiyun 				 adv);
1922*4882a593Smuzhiyun 	if (err < 0)
1923*4882a593Smuzhiyun 		return err;
1924*4882a593Smuzhiyun 	if (err > 0)
1925*4882a593Smuzhiyun 		changed = 1;
1926*4882a593Smuzhiyun 
1927*4882a593Smuzhiyun 	return changed;
1928*4882a593Smuzhiyun }
1929*4882a593Smuzhiyun 
1930*4882a593Smuzhiyun /**
1931*4882a593Smuzhiyun  * genphy_c37_config_advert - sanitize and advertise auto-negotiation parameters
1932*4882a593Smuzhiyun  * @phydev: target phy_device struct
1933*4882a593Smuzhiyun  *
1934*4882a593Smuzhiyun  * Description: Writes MII_ADVERTISE with the appropriate values,
1935*4882a593Smuzhiyun  *   after sanitizing the values to make sure we only advertise
1936*4882a593Smuzhiyun  *   what is supported.  Returns < 0 on error, 0 if the PHY's advertisement
1937*4882a593Smuzhiyun  *   hasn't changed, and > 0 if it has changed. This function is intended
1938*4882a593Smuzhiyun  *   for Clause 37 1000Base-X mode.
1939*4882a593Smuzhiyun  */
genphy_c37_config_advert(struct phy_device * phydev)1940*4882a593Smuzhiyun static int genphy_c37_config_advert(struct phy_device *phydev)
1941*4882a593Smuzhiyun {
1942*4882a593Smuzhiyun 	u16 adv = 0;
1943*4882a593Smuzhiyun 
1944*4882a593Smuzhiyun 	/* Only allow advertising what this PHY supports */
1945*4882a593Smuzhiyun 	linkmode_and(phydev->advertising, phydev->advertising,
1946*4882a593Smuzhiyun 		     phydev->supported);
1947*4882a593Smuzhiyun 
1948*4882a593Smuzhiyun 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
1949*4882a593Smuzhiyun 			      phydev->advertising))
1950*4882a593Smuzhiyun 		adv |= ADVERTISE_1000XFULL;
1951*4882a593Smuzhiyun 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
1952*4882a593Smuzhiyun 			      phydev->advertising))
1953*4882a593Smuzhiyun 		adv |= ADVERTISE_1000XPAUSE;
1954*4882a593Smuzhiyun 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
1955*4882a593Smuzhiyun 			      phydev->advertising))
1956*4882a593Smuzhiyun 		adv |= ADVERTISE_1000XPSE_ASYM;
1957*4882a593Smuzhiyun 
1958*4882a593Smuzhiyun 	return phy_modify_changed(phydev, MII_ADVERTISE,
1959*4882a593Smuzhiyun 				  ADVERTISE_1000XFULL | ADVERTISE_1000XPAUSE |
1960*4882a593Smuzhiyun 				  ADVERTISE_1000XHALF | ADVERTISE_1000XPSE_ASYM,
1961*4882a593Smuzhiyun 				  adv);
1962*4882a593Smuzhiyun }
1963*4882a593Smuzhiyun 
1964*4882a593Smuzhiyun /**
1965*4882a593Smuzhiyun  * genphy_config_eee_advert - disable unwanted eee mode advertisement
1966*4882a593Smuzhiyun  * @phydev: target phy_device struct
1967*4882a593Smuzhiyun  *
1968*4882a593Smuzhiyun  * Description: Writes MDIO_AN_EEE_ADV after disabling unsupported energy
1969*4882a593Smuzhiyun  *   efficent ethernet modes. Returns 0 if the PHY's advertisement hasn't
1970*4882a593Smuzhiyun  *   changed, and 1 if it has changed.
1971*4882a593Smuzhiyun  */
genphy_config_eee_advert(struct phy_device * phydev)1972*4882a593Smuzhiyun int genphy_config_eee_advert(struct phy_device *phydev)
1973*4882a593Smuzhiyun {
1974*4882a593Smuzhiyun 	int err;
1975*4882a593Smuzhiyun 
1976*4882a593Smuzhiyun 	/* Nothing to disable */
1977*4882a593Smuzhiyun 	if (!phydev->eee_broken_modes)
1978*4882a593Smuzhiyun 		return 0;
1979*4882a593Smuzhiyun 
1980*4882a593Smuzhiyun 	err = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV,
1981*4882a593Smuzhiyun 				     phydev->eee_broken_modes, 0);
1982*4882a593Smuzhiyun 	/* If the call failed, we assume that EEE is not supported */
1983*4882a593Smuzhiyun 	return err < 0 ? 0 : err;
1984*4882a593Smuzhiyun }
1985*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_config_eee_advert);
1986*4882a593Smuzhiyun 
1987*4882a593Smuzhiyun /**
1988*4882a593Smuzhiyun  * genphy_setup_forced - configures/forces speed/duplex from @phydev
1989*4882a593Smuzhiyun  * @phydev: target phy_device struct
1990*4882a593Smuzhiyun  *
1991*4882a593Smuzhiyun  * Description: Configures MII_BMCR to force speed/duplex
1992*4882a593Smuzhiyun  *   to the values in phydev. Assumes that the values are valid.
1993*4882a593Smuzhiyun  *   Please see phy_sanitize_settings().
1994*4882a593Smuzhiyun  */
genphy_setup_forced(struct phy_device * phydev)1995*4882a593Smuzhiyun int genphy_setup_forced(struct phy_device *phydev)
1996*4882a593Smuzhiyun {
1997*4882a593Smuzhiyun 	u16 ctl = 0;
1998*4882a593Smuzhiyun 
1999*4882a593Smuzhiyun 	phydev->pause = 0;
2000*4882a593Smuzhiyun 	phydev->asym_pause = 0;
2001*4882a593Smuzhiyun 
2002*4882a593Smuzhiyun 	if (SPEED_1000 == phydev->speed)
2003*4882a593Smuzhiyun 		ctl |= BMCR_SPEED1000;
2004*4882a593Smuzhiyun 	else if (SPEED_100 == phydev->speed)
2005*4882a593Smuzhiyun 		ctl |= BMCR_SPEED100;
2006*4882a593Smuzhiyun 
2007*4882a593Smuzhiyun 	if (DUPLEX_FULL == phydev->duplex)
2008*4882a593Smuzhiyun 		ctl |= BMCR_FULLDPLX;
2009*4882a593Smuzhiyun 
2010*4882a593Smuzhiyun 	return phy_modify(phydev, MII_BMCR,
2011*4882a593Smuzhiyun 			  ~(BMCR_LOOPBACK | BMCR_ISOLATE | BMCR_PDOWN), ctl);
2012*4882a593Smuzhiyun }
2013*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_setup_forced);
2014*4882a593Smuzhiyun 
genphy_setup_master_slave(struct phy_device * phydev)2015*4882a593Smuzhiyun static int genphy_setup_master_slave(struct phy_device *phydev)
2016*4882a593Smuzhiyun {
2017*4882a593Smuzhiyun 	u16 ctl = 0;
2018*4882a593Smuzhiyun 
2019*4882a593Smuzhiyun 	if (!phydev->is_gigabit_capable)
2020*4882a593Smuzhiyun 		return 0;
2021*4882a593Smuzhiyun 
2022*4882a593Smuzhiyun 	switch (phydev->master_slave_set) {
2023*4882a593Smuzhiyun 	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
2024*4882a593Smuzhiyun 		ctl |= CTL1000_PREFER_MASTER;
2025*4882a593Smuzhiyun 		break;
2026*4882a593Smuzhiyun 	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
2027*4882a593Smuzhiyun 		break;
2028*4882a593Smuzhiyun 	case MASTER_SLAVE_CFG_MASTER_FORCE:
2029*4882a593Smuzhiyun 		ctl |= CTL1000_AS_MASTER;
2030*4882a593Smuzhiyun 		fallthrough;
2031*4882a593Smuzhiyun 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
2032*4882a593Smuzhiyun 		ctl |= CTL1000_ENABLE_MASTER;
2033*4882a593Smuzhiyun 		break;
2034*4882a593Smuzhiyun 	case MASTER_SLAVE_CFG_UNKNOWN:
2035*4882a593Smuzhiyun 	case MASTER_SLAVE_CFG_UNSUPPORTED:
2036*4882a593Smuzhiyun 		return 0;
2037*4882a593Smuzhiyun 	default:
2038*4882a593Smuzhiyun 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
2039*4882a593Smuzhiyun 		return -EOPNOTSUPP;
2040*4882a593Smuzhiyun 	}
2041*4882a593Smuzhiyun 
2042*4882a593Smuzhiyun 	return phy_modify_changed(phydev, MII_CTRL1000,
2043*4882a593Smuzhiyun 				  (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER |
2044*4882a593Smuzhiyun 				   CTL1000_PREFER_MASTER), ctl);
2045*4882a593Smuzhiyun }
2046*4882a593Smuzhiyun 
genphy_read_master_slave(struct phy_device * phydev)2047*4882a593Smuzhiyun static int genphy_read_master_slave(struct phy_device *phydev)
2048*4882a593Smuzhiyun {
2049*4882a593Smuzhiyun 	int cfg, state;
2050*4882a593Smuzhiyun 	int val;
2051*4882a593Smuzhiyun 
2052*4882a593Smuzhiyun 	if (!phydev->is_gigabit_capable) {
2053*4882a593Smuzhiyun 		phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED;
2054*4882a593Smuzhiyun 		phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
2055*4882a593Smuzhiyun 		return 0;
2056*4882a593Smuzhiyun 	}
2057*4882a593Smuzhiyun 
2058*4882a593Smuzhiyun 	phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
2059*4882a593Smuzhiyun 	phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
2060*4882a593Smuzhiyun 
2061*4882a593Smuzhiyun 	val = phy_read(phydev, MII_CTRL1000);
2062*4882a593Smuzhiyun 	if (val < 0)
2063*4882a593Smuzhiyun 		return val;
2064*4882a593Smuzhiyun 
2065*4882a593Smuzhiyun 	if (val & CTL1000_ENABLE_MASTER) {
2066*4882a593Smuzhiyun 		if (val & CTL1000_AS_MASTER)
2067*4882a593Smuzhiyun 			cfg = MASTER_SLAVE_CFG_MASTER_FORCE;
2068*4882a593Smuzhiyun 		else
2069*4882a593Smuzhiyun 			cfg = MASTER_SLAVE_CFG_SLAVE_FORCE;
2070*4882a593Smuzhiyun 	} else {
2071*4882a593Smuzhiyun 		if (val & CTL1000_PREFER_MASTER)
2072*4882a593Smuzhiyun 			cfg = MASTER_SLAVE_CFG_MASTER_PREFERRED;
2073*4882a593Smuzhiyun 		else
2074*4882a593Smuzhiyun 			cfg = MASTER_SLAVE_CFG_SLAVE_PREFERRED;
2075*4882a593Smuzhiyun 	}
2076*4882a593Smuzhiyun 
2077*4882a593Smuzhiyun 	val = phy_read(phydev, MII_STAT1000);
2078*4882a593Smuzhiyun 	if (val < 0)
2079*4882a593Smuzhiyun 		return val;
2080*4882a593Smuzhiyun 
2081*4882a593Smuzhiyun 	if (val & LPA_1000MSFAIL) {
2082*4882a593Smuzhiyun 		state = MASTER_SLAVE_STATE_ERR;
2083*4882a593Smuzhiyun 	} else if (phydev->link) {
2084*4882a593Smuzhiyun 		/* this bits are valid only for active link */
2085*4882a593Smuzhiyun 		if (val & LPA_1000MSRES)
2086*4882a593Smuzhiyun 			state = MASTER_SLAVE_STATE_MASTER;
2087*4882a593Smuzhiyun 		else
2088*4882a593Smuzhiyun 			state = MASTER_SLAVE_STATE_SLAVE;
2089*4882a593Smuzhiyun 	} else {
2090*4882a593Smuzhiyun 		state = MASTER_SLAVE_STATE_UNKNOWN;
2091*4882a593Smuzhiyun 	}
2092*4882a593Smuzhiyun 
2093*4882a593Smuzhiyun 	phydev->master_slave_get = cfg;
2094*4882a593Smuzhiyun 	phydev->master_slave_state = state;
2095*4882a593Smuzhiyun 
2096*4882a593Smuzhiyun 	return 0;
2097*4882a593Smuzhiyun }
2098*4882a593Smuzhiyun 
2099*4882a593Smuzhiyun /**
2100*4882a593Smuzhiyun  * genphy_restart_aneg - Enable and Restart Autonegotiation
2101*4882a593Smuzhiyun  * @phydev: target phy_device struct
2102*4882a593Smuzhiyun  */
genphy_restart_aneg(struct phy_device * phydev)2103*4882a593Smuzhiyun int genphy_restart_aneg(struct phy_device *phydev)
2104*4882a593Smuzhiyun {
2105*4882a593Smuzhiyun 	/* Don't isolate the PHY if we're negotiating */
2106*4882a593Smuzhiyun 	return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE,
2107*4882a593Smuzhiyun 			  BMCR_ANENABLE | BMCR_ANRESTART);
2108*4882a593Smuzhiyun }
2109*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_restart_aneg);
2110*4882a593Smuzhiyun 
2111*4882a593Smuzhiyun /**
2112*4882a593Smuzhiyun  * genphy_check_and_restart_aneg - Enable and restart auto-negotiation
2113*4882a593Smuzhiyun  * @phydev: target phy_device struct
2114*4882a593Smuzhiyun  * @restart: whether aneg restart is requested
2115*4882a593Smuzhiyun  *
2116*4882a593Smuzhiyun  * Check, and restart auto-negotiation if needed.
2117*4882a593Smuzhiyun  */
genphy_check_and_restart_aneg(struct phy_device * phydev,bool restart)2118*4882a593Smuzhiyun int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart)
2119*4882a593Smuzhiyun {
2120*4882a593Smuzhiyun 	int ret;
2121*4882a593Smuzhiyun 
2122*4882a593Smuzhiyun 	if (!restart) {
2123*4882a593Smuzhiyun 		/* Advertisement hasn't changed, but maybe aneg was never on to
2124*4882a593Smuzhiyun 		 * begin with?  Or maybe phy was isolated?
2125*4882a593Smuzhiyun 		 */
2126*4882a593Smuzhiyun 		ret = phy_read(phydev, MII_BMCR);
2127*4882a593Smuzhiyun 		if (ret < 0)
2128*4882a593Smuzhiyun 			return ret;
2129*4882a593Smuzhiyun 
2130*4882a593Smuzhiyun 		if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE))
2131*4882a593Smuzhiyun 			restart = true;
2132*4882a593Smuzhiyun 	}
2133*4882a593Smuzhiyun 
2134*4882a593Smuzhiyun 	if (restart)
2135*4882a593Smuzhiyun 		return genphy_restart_aneg(phydev);
2136*4882a593Smuzhiyun 
2137*4882a593Smuzhiyun 	return 0;
2138*4882a593Smuzhiyun }
2139*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_check_and_restart_aneg);
2140*4882a593Smuzhiyun 
2141*4882a593Smuzhiyun /**
2142*4882a593Smuzhiyun  * __genphy_config_aneg - restart auto-negotiation or write BMCR
2143*4882a593Smuzhiyun  * @phydev: target phy_device struct
2144*4882a593Smuzhiyun  * @changed: whether autoneg is requested
2145*4882a593Smuzhiyun  *
2146*4882a593Smuzhiyun  * Description: If auto-negotiation is enabled, we configure the
2147*4882a593Smuzhiyun  *   advertising, and then restart auto-negotiation.  If it is not
2148*4882a593Smuzhiyun  *   enabled, then we write the BMCR.
2149*4882a593Smuzhiyun  */
__genphy_config_aneg(struct phy_device * phydev,bool changed)2150*4882a593Smuzhiyun int __genphy_config_aneg(struct phy_device *phydev, bool changed)
2151*4882a593Smuzhiyun {
2152*4882a593Smuzhiyun 	int err;
2153*4882a593Smuzhiyun 
2154*4882a593Smuzhiyun 	if (genphy_config_eee_advert(phydev))
2155*4882a593Smuzhiyun 		changed = true;
2156*4882a593Smuzhiyun 
2157*4882a593Smuzhiyun 	err = genphy_setup_master_slave(phydev);
2158*4882a593Smuzhiyun 	if (err < 0)
2159*4882a593Smuzhiyun 		return err;
2160*4882a593Smuzhiyun 	else if (err)
2161*4882a593Smuzhiyun 		changed = true;
2162*4882a593Smuzhiyun 
2163*4882a593Smuzhiyun 	if (AUTONEG_ENABLE != phydev->autoneg)
2164*4882a593Smuzhiyun 		return genphy_setup_forced(phydev);
2165*4882a593Smuzhiyun 
2166*4882a593Smuzhiyun 	err = genphy_config_advert(phydev);
2167*4882a593Smuzhiyun 	if (err < 0) /* error */
2168*4882a593Smuzhiyun 		return err;
2169*4882a593Smuzhiyun 	else if (err)
2170*4882a593Smuzhiyun 		changed = true;
2171*4882a593Smuzhiyun 
2172*4882a593Smuzhiyun 	return genphy_check_and_restart_aneg(phydev, changed);
2173*4882a593Smuzhiyun }
2174*4882a593Smuzhiyun EXPORT_SYMBOL(__genphy_config_aneg);
2175*4882a593Smuzhiyun 
2176*4882a593Smuzhiyun /**
2177*4882a593Smuzhiyun  * genphy_c37_config_aneg - restart auto-negotiation or write BMCR
2178*4882a593Smuzhiyun  * @phydev: target phy_device struct
2179*4882a593Smuzhiyun  *
2180*4882a593Smuzhiyun  * Description: If auto-negotiation is enabled, we configure the
2181*4882a593Smuzhiyun  *   advertising, and then restart auto-negotiation.  If it is not
2182*4882a593Smuzhiyun  *   enabled, then we write the BMCR. This function is intended
2183*4882a593Smuzhiyun  *   for use with Clause 37 1000Base-X mode.
2184*4882a593Smuzhiyun  */
genphy_c37_config_aneg(struct phy_device * phydev)2185*4882a593Smuzhiyun int genphy_c37_config_aneg(struct phy_device *phydev)
2186*4882a593Smuzhiyun {
2187*4882a593Smuzhiyun 	int err, changed;
2188*4882a593Smuzhiyun 
2189*4882a593Smuzhiyun 	if (phydev->autoneg != AUTONEG_ENABLE)
2190*4882a593Smuzhiyun 		return genphy_setup_forced(phydev);
2191*4882a593Smuzhiyun 
2192*4882a593Smuzhiyun 	err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100,
2193*4882a593Smuzhiyun 			 BMCR_SPEED1000);
2194*4882a593Smuzhiyun 	if (err)
2195*4882a593Smuzhiyun 		return err;
2196*4882a593Smuzhiyun 
2197*4882a593Smuzhiyun 	changed = genphy_c37_config_advert(phydev);
2198*4882a593Smuzhiyun 	if (changed < 0) /* error */
2199*4882a593Smuzhiyun 		return changed;
2200*4882a593Smuzhiyun 
2201*4882a593Smuzhiyun 	if (!changed) {
2202*4882a593Smuzhiyun 		/* Advertisement hasn't changed, but maybe aneg was never on to
2203*4882a593Smuzhiyun 		 * begin with?  Or maybe phy was isolated?
2204*4882a593Smuzhiyun 		 */
2205*4882a593Smuzhiyun 		int ctl = phy_read(phydev, MII_BMCR);
2206*4882a593Smuzhiyun 
2207*4882a593Smuzhiyun 		if (ctl < 0)
2208*4882a593Smuzhiyun 			return ctl;
2209*4882a593Smuzhiyun 
2210*4882a593Smuzhiyun 		if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
2211*4882a593Smuzhiyun 			changed = 1; /* do restart aneg */
2212*4882a593Smuzhiyun 	}
2213*4882a593Smuzhiyun 
2214*4882a593Smuzhiyun 	/* Only restart aneg if we are advertising something different
2215*4882a593Smuzhiyun 	 * than we were before.
2216*4882a593Smuzhiyun 	 */
2217*4882a593Smuzhiyun 	if (changed > 0)
2218*4882a593Smuzhiyun 		return genphy_restart_aneg(phydev);
2219*4882a593Smuzhiyun 
2220*4882a593Smuzhiyun 	return 0;
2221*4882a593Smuzhiyun }
2222*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_c37_config_aneg);
2223*4882a593Smuzhiyun 
2224*4882a593Smuzhiyun /**
2225*4882a593Smuzhiyun  * genphy_aneg_done - return auto-negotiation status
2226*4882a593Smuzhiyun  * @phydev: target phy_device struct
2227*4882a593Smuzhiyun  *
2228*4882a593Smuzhiyun  * Description: Reads the status register and returns 0 either if
2229*4882a593Smuzhiyun  *   auto-negotiation is incomplete, or if there was an error.
2230*4882a593Smuzhiyun  *   Returns BMSR_ANEGCOMPLETE if auto-negotiation is done.
2231*4882a593Smuzhiyun  */
genphy_aneg_done(struct phy_device * phydev)2232*4882a593Smuzhiyun int genphy_aneg_done(struct phy_device *phydev)
2233*4882a593Smuzhiyun {
2234*4882a593Smuzhiyun 	int retval = phy_read(phydev, MII_BMSR);
2235*4882a593Smuzhiyun 
2236*4882a593Smuzhiyun 	return (retval < 0) ? retval : (retval & BMSR_ANEGCOMPLETE);
2237*4882a593Smuzhiyun }
2238*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_aneg_done);
2239*4882a593Smuzhiyun 
2240*4882a593Smuzhiyun /**
2241*4882a593Smuzhiyun  * genphy_update_link - update link status in @phydev
2242*4882a593Smuzhiyun  * @phydev: target phy_device struct
2243*4882a593Smuzhiyun  *
2244*4882a593Smuzhiyun  * Description: Update the value in phydev->link to reflect the
2245*4882a593Smuzhiyun  *   current link value.  In order to do this, we need to read
2246*4882a593Smuzhiyun  *   the status register twice, keeping the second value.
2247*4882a593Smuzhiyun  */
genphy_update_link(struct phy_device * phydev)2248*4882a593Smuzhiyun int genphy_update_link(struct phy_device *phydev)
2249*4882a593Smuzhiyun {
2250*4882a593Smuzhiyun 	int status = 0, bmcr;
2251*4882a593Smuzhiyun 
2252*4882a593Smuzhiyun 	bmcr = phy_read(phydev, MII_BMCR);
2253*4882a593Smuzhiyun 	if (bmcr < 0)
2254*4882a593Smuzhiyun 		return bmcr;
2255*4882a593Smuzhiyun 
2256*4882a593Smuzhiyun 	/* Autoneg is being started, therefore disregard BMSR value and
2257*4882a593Smuzhiyun 	 * report link as down.
2258*4882a593Smuzhiyun 	 */
2259*4882a593Smuzhiyun 	if (bmcr & BMCR_ANRESTART)
2260*4882a593Smuzhiyun 		goto done;
2261*4882a593Smuzhiyun 
2262*4882a593Smuzhiyun 	/* The link state is latched low so that momentary link
2263*4882a593Smuzhiyun 	 * drops can be detected. Do not double-read the status
2264*4882a593Smuzhiyun 	 * in polling mode to detect such short link drops except
2265*4882a593Smuzhiyun 	 * the link was already down.
2266*4882a593Smuzhiyun 	 */
2267*4882a593Smuzhiyun 	if (!phy_polling_mode(phydev) || !phydev->link) {
2268*4882a593Smuzhiyun 		status = phy_read(phydev, MII_BMSR);
2269*4882a593Smuzhiyun 		if (status < 0)
2270*4882a593Smuzhiyun 			return status;
2271*4882a593Smuzhiyun 		else if (status & BMSR_LSTATUS)
2272*4882a593Smuzhiyun 			goto done;
2273*4882a593Smuzhiyun 	}
2274*4882a593Smuzhiyun 
2275*4882a593Smuzhiyun 	/* Read link and autonegotiation status */
2276*4882a593Smuzhiyun 	status = phy_read(phydev, MII_BMSR);
2277*4882a593Smuzhiyun 	if (status < 0)
2278*4882a593Smuzhiyun 		return status;
2279*4882a593Smuzhiyun done:
2280*4882a593Smuzhiyun 	phydev->link = status & BMSR_LSTATUS ? 1 : 0;
2281*4882a593Smuzhiyun 	phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0;
2282*4882a593Smuzhiyun 
2283*4882a593Smuzhiyun 	/* Consider the case that autoneg was started and "aneg complete"
2284*4882a593Smuzhiyun 	 * bit has been reset, but "link up" bit not yet.
2285*4882a593Smuzhiyun 	 */
2286*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete)
2287*4882a593Smuzhiyun 		phydev->link = 0;
2288*4882a593Smuzhiyun 
2289*4882a593Smuzhiyun 	return 0;
2290*4882a593Smuzhiyun }
2291*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_update_link);
2292*4882a593Smuzhiyun 
genphy_read_lpa(struct phy_device * phydev)2293*4882a593Smuzhiyun int genphy_read_lpa(struct phy_device *phydev)
2294*4882a593Smuzhiyun {
2295*4882a593Smuzhiyun 	int lpa, lpagb;
2296*4882a593Smuzhiyun 
2297*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_ENABLE) {
2298*4882a593Smuzhiyun 		if (!phydev->autoneg_complete) {
2299*4882a593Smuzhiyun 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
2300*4882a593Smuzhiyun 							0);
2301*4882a593Smuzhiyun 			mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
2302*4882a593Smuzhiyun 			return 0;
2303*4882a593Smuzhiyun 		}
2304*4882a593Smuzhiyun 
2305*4882a593Smuzhiyun 		if (phydev->is_gigabit_capable) {
2306*4882a593Smuzhiyun 			lpagb = phy_read(phydev, MII_STAT1000);
2307*4882a593Smuzhiyun 			if (lpagb < 0)
2308*4882a593Smuzhiyun 				return lpagb;
2309*4882a593Smuzhiyun 
2310*4882a593Smuzhiyun 			if (lpagb & LPA_1000MSFAIL) {
2311*4882a593Smuzhiyun 				int adv = phy_read(phydev, MII_CTRL1000);
2312*4882a593Smuzhiyun 
2313*4882a593Smuzhiyun 				if (adv < 0)
2314*4882a593Smuzhiyun 					return adv;
2315*4882a593Smuzhiyun 
2316*4882a593Smuzhiyun 				if (adv & CTL1000_ENABLE_MASTER)
2317*4882a593Smuzhiyun 					phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n");
2318*4882a593Smuzhiyun 				else
2319*4882a593Smuzhiyun 					phydev_err(phydev, "Master/Slave resolution failed\n");
2320*4882a593Smuzhiyun 				return -ENOLINK;
2321*4882a593Smuzhiyun 			}
2322*4882a593Smuzhiyun 
2323*4882a593Smuzhiyun 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
2324*4882a593Smuzhiyun 							lpagb);
2325*4882a593Smuzhiyun 		}
2326*4882a593Smuzhiyun 
2327*4882a593Smuzhiyun 		lpa = phy_read(phydev, MII_LPA);
2328*4882a593Smuzhiyun 		if (lpa < 0)
2329*4882a593Smuzhiyun 			return lpa;
2330*4882a593Smuzhiyun 
2331*4882a593Smuzhiyun 		mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);
2332*4882a593Smuzhiyun 	} else {
2333*4882a593Smuzhiyun 		linkmode_zero(phydev->lp_advertising);
2334*4882a593Smuzhiyun 	}
2335*4882a593Smuzhiyun 
2336*4882a593Smuzhiyun 	return 0;
2337*4882a593Smuzhiyun }
2338*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_read_lpa);
2339*4882a593Smuzhiyun 
2340*4882a593Smuzhiyun /**
2341*4882a593Smuzhiyun  * genphy_read_status_fixed - read the link parameters for !aneg mode
2342*4882a593Smuzhiyun  * @phydev: target phy_device struct
2343*4882a593Smuzhiyun  *
2344*4882a593Smuzhiyun  * Read the current duplex and speed state for a PHY operating with
2345*4882a593Smuzhiyun  * autonegotiation disabled.
2346*4882a593Smuzhiyun  */
genphy_read_status_fixed(struct phy_device * phydev)2347*4882a593Smuzhiyun int genphy_read_status_fixed(struct phy_device *phydev)
2348*4882a593Smuzhiyun {
2349*4882a593Smuzhiyun 	int bmcr = phy_read(phydev, MII_BMCR);
2350*4882a593Smuzhiyun 
2351*4882a593Smuzhiyun 	if (bmcr < 0)
2352*4882a593Smuzhiyun 		return bmcr;
2353*4882a593Smuzhiyun 
2354*4882a593Smuzhiyun 	if (bmcr & BMCR_FULLDPLX)
2355*4882a593Smuzhiyun 		phydev->duplex = DUPLEX_FULL;
2356*4882a593Smuzhiyun 	else
2357*4882a593Smuzhiyun 		phydev->duplex = DUPLEX_HALF;
2358*4882a593Smuzhiyun 
2359*4882a593Smuzhiyun 	if (bmcr & BMCR_SPEED1000)
2360*4882a593Smuzhiyun 		phydev->speed = SPEED_1000;
2361*4882a593Smuzhiyun 	else if (bmcr & BMCR_SPEED100)
2362*4882a593Smuzhiyun 		phydev->speed = SPEED_100;
2363*4882a593Smuzhiyun 	else
2364*4882a593Smuzhiyun 		phydev->speed = SPEED_10;
2365*4882a593Smuzhiyun 
2366*4882a593Smuzhiyun 	return 0;
2367*4882a593Smuzhiyun }
2368*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_read_status_fixed);
2369*4882a593Smuzhiyun 
2370*4882a593Smuzhiyun /**
2371*4882a593Smuzhiyun  * genphy_read_status - check the link status and update current link state
2372*4882a593Smuzhiyun  * @phydev: target phy_device struct
2373*4882a593Smuzhiyun  *
2374*4882a593Smuzhiyun  * Description: Check the link, then figure out the current state
2375*4882a593Smuzhiyun  *   by comparing what we advertise with what the link partner
2376*4882a593Smuzhiyun  *   advertises.  Start by checking the gigabit possibilities,
2377*4882a593Smuzhiyun  *   then move on to 10/100.
2378*4882a593Smuzhiyun  */
genphy_read_status(struct phy_device * phydev)2379*4882a593Smuzhiyun int genphy_read_status(struct phy_device *phydev)
2380*4882a593Smuzhiyun {
2381*4882a593Smuzhiyun 	int err, old_link = phydev->link;
2382*4882a593Smuzhiyun 
2383*4882a593Smuzhiyun 	/* Update the link, but return if there was an error */
2384*4882a593Smuzhiyun 	err = genphy_update_link(phydev);
2385*4882a593Smuzhiyun 	if (err)
2386*4882a593Smuzhiyun 		return err;
2387*4882a593Smuzhiyun 
2388*4882a593Smuzhiyun 	/* why bother the PHY if nothing can have changed */
2389*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link)
2390*4882a593Smuzhiyun 		return 0;
2391*4882a593Smuzhiyun 
2392*4882a593Smuzhiyun 	phydev->speed = SPEED_UNKNOWN;
2393*4882a593Smuzhiyun 	phydev->duplex = DUPLEX_UNKNOWN;
2394*4882a593Smuzhiyun 	phydev->pause = 0;
2395*4882a593Smuzhiyun 	phydev->asym_pause = 0;
2396*4882a593Smuzhiyun 
2397*4882a593Smuzhiyun 	err = genphy_read_master_slave(phydev);
2398*4882a593Smuzhiyun 	if (err < 0)
2399*4882a593Smuzhiyun 		return err;
2400*4882a593Smuzhiyun 
2401*4882a593Smuzhiyun 	err = genphy_read_lpa(phydev);
2402*4882a593Smuzhiyun 	if (err < 0)
2403*4882a593Smuzhiyun 		return err;
2404*4882a593Smuzhiyun 
2405*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
2406*4882a593Smuzhiyun 		phy_resolve_aneg_linkmode(phydev);
2407*4882a593Smuzhiyun 	} else if (phydev->autoneg == AUTONEG_DISABLE) {
2408*4882a593Smuzhiyun 		err = genphy_read_status_fixed(phydev);
2409*4882a593Smuzhiyun 		if (err < 0)
2410*4882a593Smuzhiyun 			return err;
2411*4882a593Smuzhiyun 	}
2412*4882a593Smuzhiyun 
2413*4882a593Smuzhiyun 	return 0;
2414*4882a593Smuzhiyun }
2415*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_read_status);
2416*4882a593Smuzhiyun 
2417*4882a593Smuzhiyun /**
2418*4882a593Smuzhiyun  * genphy_c37_read_status - check the link status and update current link state
2419*4882a593Smuzhiyun  * @phydev: target phy_device struct
2420*4882a593Smuzhiyun  *
2421*4882a593Smuzhiyun  * Description: Check the link, then figure out the current state
2422*4882a593Smuzhiyun  *   by comparing what we advertise with what the link partner
2423*4882a593Smuzhiyun  *   advertises. This function is for Clause 37 1000Base-X mode.
2424*4882a593Smuzhiyun  */
genphy_c37_read_status(struct phy_device * phydev)2425*4882a593Smuzhiyun int genphy_c37_read_status(struct phy_device *phydev)
2426*4882a593Smuzhiyun {
2427*4882a593Smuzhiyun 	int lpa, err, old_link = phydev->link;
2428*4882a593Smuzhiyun 
2429*4882a593Smuzhiyun 	/* Update the link, but return if there was an error */
2430*4882a593Smuzhiyun 	err = genphy_update_link(phydev);
2431*4882a593Smuzhiyun 	if (err)
2432*4882a593Smuzhiyun 		return err;
2433*4882a593Smuzhiyun 
2434*4882a593Smuzhiyun 	/* why bother the PHY if nothing can have changed */
2435*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link)
2436*4882a593Smuzhiyun 		return 0;
2437*4882a593Smuzhiyun 
2438*4882a593Smuzhiyun 	phydev->duplex = DUPLEX_UNKNOWN;
2439*4882a593Smuzhiyun 	phydev->pause = 0;
2440*4882a593Smuzhiyun 	phydev->asym_pause = 0;
2441*4882a593Smuzhiyun 
2442*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
2443*4882a593Smuzhiyun 		lpa = phy_read(phydev, MII_LPA);
2444*4882a593Smuzhiyun 		if (lpa < 0)
2445*4882a593Smuzhiyun 			return lpa;
2446*4882a593Smuzhiyun 
2447*4882a593Smuzhiyun 		linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
2448*4882a593Smuzhiyun 				 phydev->lp_advertising, lpa & LPA_LPACK);
2449*4882a593Smuzhiyun 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
2450*4882a593Smuzhiyun 				 phydev->lp_advertising, lpa & LPA_1000XFULL);
2451*4882a593Smuzhiyun 		linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2452*4882a593Smuzhiyun 				 phydev->lp_advertising, lpa & LPA_1000XPAUSE);
2453*4882a593Smuzhiyun 		linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2454*4882a593Smuzhiyun 				 phydev->lp_advertising,
2455*4882a593Smuzhiyun 				 lpa & LPA_1000XPAUSE_ASYM);
2456*4882a593Smuzhiyun 
2457*4882a593Smuzhiyun 		phy_resolve_aneg_linkmode(phydev);
2458*4882a593Smuzhiyun 	} else if (phydev->autoneg == AUTONEG_DISABLE) {
2459*4882a593Smuzhiyun 		int bmcr = phy_read(phydev, MII_BMCR);
2460*4882a593Smuzhiyun 
2461*4882a593Smuzhiyun 		if (bmcr < 0)
2462*4882a593Smuzhiyun 			return bmcr;
2463*4882a593Smuzhiyun 
2464*4882a593Smuzhiyun 		if (bmcr & BMCR_FULLDPLX)
2465*4882a593Smuzhiyun 			phydev->duplex = DUPLEX_FULL;
2466*4882a593Smuzhiyun 		else
2467*4882a593Smuzhiyun 			phydev->duplex = DUPLEX_HALF;
2468*4882a593Smuzhiyun 	}
2469*4882a593Smuzhiyun 
2470*4882a593Smuzhiyun 	return 0;
2471*4882a593Smuzhiyun }
2472*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_c37_read_status);
2473*4882a593Smuzhiyun 
2474*4882a593Smuzhiyun /**
2475*4882a593Smuzhiyun  * genphy_soft_reset - software reset the PHY via BMCR_RESET bit
2476*4882a593Smuzhiyun  * @phydev: target phy_device struct
2477*4882a593Smuzhiyun  *
2478*4882a593Smuzhiyun  * Description: Perform a software PHY reset using the standard
2479*4882a593Smuzhiyun  * BMCR_RESET bit and poll for the reset bit to be cleared.
2480*4882a593Smuzhiyun  *
2481*4882a593Smuzhiyun  * Returns: 0 on success, < 0 on failure
2482*4882a593Smuzhiyun  */
genphy_soft_reset(struct phy_device * phydev)2483*4882a593Smuzhiyun int genphy_soft_reset(struct phy_device *phydev)
2484*4882a593Smuzhiyun {
2485*4882a593Smuzhiyun 	u16 res = BMCR_RESET;
2486*4882a593Smuzhiyun 	int ret;
2487*4882a593Smuzhiyun 
2488*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_ENABLE)
2489*4882a593Smuzhiyun 		res |= BMCR_ANRESTART;
2490*4882a593Smuzhiyun 
2491*4882a593Smuzhiyun 	ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res);
2492*4882a593Smuzhiyun 	if (ret < 0)
2493*4882a593Smuzhiyun 		return ret;
2494*4882a593Smuzhiyun 
2495*4882a593Smuzhiyun 	/* Clause 22 states that setting bit BMCR_RESET sets control registers
2496*4882a593Smuzhiyun 	 * to their default value. Therefore the POWER DOWN bit is supposed to
2497*4882a593Smuzhiyun 	 * be cleared after soft reset.
2498*4882a593Smuzhiyun 	 */
2499*4882a593Smuzhiyun 	phydev->suspended = 0;
2500*4882a593Smuzhiyun 
2501*4882a593Smuzhiyun 	ret = phy_poll_reset(phydev);
2502*4882a593Smuzhiyun 	if (ret)
2503*4882a593Smuzhiyun 		return ret;
2504*4882a593Smuzhiyun 
2505*4882a593Smuzhiyun 	/* BMCR may be reset to defaults */
2506*4882a593Smuzhiyun 	if (phydev->autoneg == AUTONEG_DISABLE)
2507*4882a593Smuzhiyun 		ret = genphy_setup_forced(phydev);
2508*4882a593Smuzhiyun 
2509*4882a593Smuzhiyun 	return ret;
2510*4882a593Smuzhiyun }
2511*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_soft_reset);
2512*4882a593Smuzhiyun 
2513*4882a593Smuzhiyun /**
2514*4882a593Smuzhiyun  * genphy_read_abilities - read PHY abilities from Clause 22 registers
2515*4882a593Smuzhiyun  * @phydev: target phy_device struct
2516*4882a593Smuzhiyun  *
2517*4882a593Smuzhiyun  * Description: Reads the PHY's abilities and populates
2518*4882a593Smuzhiyun  * phydev->supported accordingly.
2519*4882a593Smuzhiyun  *
2520*4882a593Smuzhiyun  * Returns: 0 on success, < 0 on failure
2521*4882a593Smuzhiyun  */
genphy_read_abilities(struct phy_device * phydev)2522*4882a593Smuzhiyun int genphy_read_abilities(struct phy_device *phydev)
2523*4882a593Smuzhiyun {
2524*4882a593Smuzhiyun 	int val;
2525*4882a593Smuzhiyun 
2526*4882a593Smuzhiyun 	linkmode_set_bit_array(phy_basic_ports_array,
2527*4882a593Smuzhiyun 			       ARRAY_SIZE(phy_basic_ports_array),
2528*4882a593Smuzhiyun 			       phydev->supported);
2529*4882a593Smuzhiyun 
2530*4882a593Smuzhiyun 	val = phy_read(phydev, MII_BMSR);
2531*4882a593Smuzhiyun 	if (val < 0)
2532*4882a593Smuzhiyun 		return val;
2533*4882a593Smuzhiyun 
2534*4882a593Smuzhiyun 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
2535*4882a593Smuzhiyun 			 val & BMSR_ANEGCAPABLE);
2536*4882a593Smuzhiyun 
2537*4882a593Smuzhiyun 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
2538*4882a593Smuzhiyun 			 val & BMSR_100FULL);
2539*4882a593Smuzhiyun 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
2540*4882a593Smuzhiyun 			 val & BMSR_100HALF);
2541*4882a593Smuzhiyun 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
2542*4882a593Smuzhiyun 			 val & BMSR_10FULL);
2543*4882a593Smuzhiyun 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
2544*4882a593Smuzhiyun 			 val & BMSR_10HALF);
2545*4882a593Smuzhiyun 
2546*4882a593Smuzhiyun 	if (val & BMSR_ESTATEN) {
2547*4882a593Smuzhiyun 		val = phy_read(phydev, MII_ESTATUS);
2548*4882a593Smuzhiyun 		if (val < 0)
2549*4882a593Smuzhiyun 			return val;
2550*4882a593Smuzhiyun 
2551*4882a593Smuzhiyun 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
2552*4882a593Smuzhiyun 				 phydev->supported, val & ESTATUS_1000_TFULL);
2553*4882a593Smuzhiyun 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
2554*4882a593Smuzhiyun 				 phydev->supported, val & ESTATUS_1000_THALF);
2555*4882a593Smuzhiyun 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
2556*4882a593Smuzhiyun 				 phydev->supported, val & ESTATUS_1000_XFULL);
2557*4882a593Smuzhiyun 	}
2558*4882a593Smuzhiyun 
2559*4882a593Smuzhiyun 	return 0;
2560*4882a593Smuzhiyun }
2561*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_read_abilities);
2562*4882a593Smuzhiyun 
2563*4882a593Smuzhiyun /* This is used for the phy device which doesn't support the MMD extended
2564*4882a593Smuzhiyun  * register access, but it does have side effect when we are trying to access
2565*4882a593Smuzhiyun  * the MMD register via indirect method.
2566*4882a593Smuzhiyun  */
genphy_read_mmd_unsupported(struct phy_device * phdev,int devad,u16 regnum)2567*4882a593Smuzhiyun int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad, u16 regnum)
2568*4882a593Smuzhiyun {
2569*4882a593Smuzhiyun 	return -EOPNOTSUPP;
2570*4882a593Smuzhiyun }
2571*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_read_mmd_unsupported);
2572*4882a593Smuzhiyun 
genphy_write_mmd_unsupported(struct phy_device * phdev,int devnum,u16 regnum,u16 val)2573*4882a593Smuzhiyun int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
2574*4882a593Smuzhiyun 				 u16 regnum, u16 val)
2575*4882a593Smuzhiyun {
2576*4882a593Smuzhiyun 	return -EOPNOTSUPP;
2577*4882a593Smuzhiyun }
2578*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_write_mmd_unsupported);
2579*4882a593Smuzhiyun 
genphy_suspend(struct phy_device * phydev)2580*4882a593Smuzhiyun int genphy_suspend(struct phy_device *phydev)
2581*4882a593Smuzhiyun {
2582*4882a593Smuzhiyun 	return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN);
2583*4882a593Smuzhiyun }
2584*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_suspend);
2585*4882a593Smuzhiyun 
genphy_resume(struct phy_device * phydev)2586*4882a593Smuzhiyun int genphy_resume(struct phy_device *phydev)
2587*4882a593Smuzhiyun {
2588*4882a593Smuzhiyun 	return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN);
2589*4882a593Smuzhiyun }
2590*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_resume);
2591*4882a593Smuzhiyun 
genphy_loopback(struct phy_device * phydev,bool enable)2592*4882a593Smuzhiyun int genphy_loopback(struct phy_device *phydev, bool enable)
2593*4882a593Smuzhiyun {
2594*4882a593Smuzhiyun 	return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
2595*4882a593Smuzhiyun 			  enable ? BMCR_LOOPBACK : 0);
2596*4882a593Smuzhiyun }
2597*4882a593Smuzhiyun EXPORT_SYMBOL(genphy_loopback);
2598*4882a593Smuzhiyun 
2599*4882a593Smuzhiyun /**
2600*4882a593Smuzhiyun  * phy_remove_link_mode - Remove a supported link mode
2601*4882a593Smuzhiyun  * @phydev: phy_device structure to remove link mode from
2602*4882a593Smuzhiyun  * @link_mode: Link mode to be removed
2603*4882a593Smuzhiyun  *
2604*4882a593Smuzhiyun  * Description: Some MACs don't support all link modes which the PHY
2605*4882a593Smuzhiyun  * does.  e.g. a 1G MAC often does not support 1000Half. Add a helper
2606*4882a593Smuzhiyun  * to remove a link mode.
2607*4882a593Smuzhiyun  */
phy_remove_link_mode(struct phy_device * phydev,u32 link_mode)2608*4882a593Smuzhiyun void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
2609*4882a593Smuzhiyun {
2610*4882a593Smuzhiyun 	linkmode_clear_bit(link_mode, phydev->supported);
2611*4882a593Smuzhiyun 	phy_advertise_supported(phydev);
2612*4882a593Smuzhiyun }
2613*4882a593Smuzhiyun EXPORT_SYMBOL(phy_remove_link_mode);
2614*4882a593Smuzhiyun 
phy_copy_pause_bits(unsigned long * dst,unsigned long * src)2615*4882a593Smuzhiyun static void phy_copy_pause_bits(unsigned long *dst, unsigned long *src)
2616*4882a593Smuzhiyun {
2617*4882a593Smuzhiyun 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, dst,
2618*4882a593Smuzhiyun 		linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, src));
2619*4882a593Smuzhiyun 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT, dst,
2620*4882a593Smuzhiyun 		linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, src));
2621*4882a593Smuzhiyun }
2622*4882a593Smuzhiyun 
2623*4882a593Smuzhiyun /**
2624*4882a593Smuzhiyun  * phy_advertise_supported - Advertise all supported modes
2625*4882a593Smuzhiyun  * @phydev: target phy_device struct
2626*4882a593Smuzhiyun  *
2627*4882a593Smuzhiyun  * Description: Called to advertise all supported modes, doesn't touch
2628*4882a593Smuzhiyun  * pause mode advertising.
2629*4882a593Smuzhiyun  */
phy_advertise_supported(struct phy_device * phydev)2630*4882a593Smuzhiyun void phy_advertise_supported(struct phy_device *phydev)
2631*4882a593Smuzhiyun {
2632*4882a593Smuzhiyun 	__ETHTOOL_DECLARE_LINK_MODE_MASK(new);
2633*4882a593Smuzhiyun 
2634*4882a593Smuzhiyun 	linkmode_copy(new, phydev->supported);
2635*4882a593Smuzhiyun 	phy_copy_pause_bits(new, phydev->advertising);
2636*4882a593Smuzhiyun 	linkmode_copy(phydev->advertising, new);
2637*4882a593Smuzhiyun }
2638*4882a593Smuzhiyun EXPORT_SYMBOL(phy_advertise_supported);
2639*4882a593Smuzhiyun 
2640*4882a593Smuzhiyun /**
2641*4882a593Smuzhiyun  * phy_support_sym_pause - Enable support of symmetrical pause
2642*4882a593Smuzhiyun  * @phydev: target phy_device struct
2643*4882a593Smuzhiyun  *
2644*4882a593Smuzhiyun  * Description: Called by the MAC to indicate is supports symmetrical
2645*4882a593Smuzhiyun  * Pause, but not asym pause.
2646*4882a593Smuzhiyun  */
phy_support_sym_pause(struct phy_device * phydev)2647*4882a593Smuzhiyun void phy_support_sym_pause(struct phy_device *phydev)
2648*4882a593Smuzhiyun {
2649*4882a593Smuzhiyun 	linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported);
2650*4882a593Smuzhiyun 	phy_copy_pause_bits(phydev->advertising, phydev->supported);
2651*4882a593Smuzhiyun }
2652*4882a593Smuzhiyun EXPORT_SYMBOL(phy_support_sym_pause);
2653*4882a593Smuzhiyun 
2654*4882a593Smuzhiyun /**
2655*4882a593Smuzhiyun  * phy_support_asym_pause - Enable support of asym pause
2656*4882a593Smuzhiyun  * @phydev: target phy_device struct
2657*4882a593Smuzhiyun  *
2658*4882a593Smuzhiyun  * Description: Called by the MAC to indicate is supports Asym Pause.
2659*4882a593Smuzhiyun  */
phy_support_asym_pause(struct phy_device * phydev)2660*4882a593Smuzhiyun void phy_support_asym_pause(struct phy_device *phydev)
2661*4882a593Smuzhiyun {
2662*4882a593Smuzhiyun 	phy_copy_pause_bits(phydev->advertising, phydev->supported);
2663*4882a593Smuzhiyun }
2664*4882a593Smuzhiyun EXPORT_SYMBOL(phy_support_asym_pause);
2665*4882a593Smuzhiyun 
2666*4882a593Smuzhiyun /**
2667*4882a593Smuzhiyun  * phy_set_sym_pause - Configure symmetric Pause
2668*4882a593Smuzhiyun  * @phydev: target phy_device struct
2669*4882a593Smuzhiyun  * @rx: Receiver Pause is supported
2670*4882a593Smuzhiyun  * @tx: Transmit Pause is supported
2671*4882a593Smuzhiyun  * @autoneg: Auto neg should be used
2672*4882a593Smuzhiyun  *
2673*4882a593Smuzhiyun  * Description: Configure advertised Pause support depending on if
2674*4882a593Smuzhiyun  * receiver pause and pause auto neg is supported. Generally called
2675*4882a593Smuzhiyun  * from the set_pauseparam .ndo.
2676*4882a593Smuzhiyun  */
phy_set_sym_pause(struct phy_device * phydev,bool rx,bool tx,bool autoneg)2677*4882a593Smuzhiyun void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx,
2678*4882a593Smuzhiyun 		       bool autoneg)
2679*4882a593Smuzhiyun {
2680*4882a593Smuzhiyun 	linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported);
2681*4882a593Smuzhiyun 
2682*4882a593Smuzhiyun 	if (rx && tx && autoneg)
2683*4882a593Smuzhiyun 		linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2684*4882a593Smuzhiyun 				 phydev->supported);
2685*4882a593Smuzhiyun 
2686*4882a593Smuzhiyun 	linkmode_copy(phydev->advertising, phydev->supported);
2687*4882a593Smuzhiyun }
2688*4882a593Smuzhiyun EXPORT_SYMBOL(phy_set_sym_pause);
2689*4882a593Smuzhiyun 
2690*4882a593Smuzhiyun /**
2691*4882a593Smuzhiyun  * phy_set_asym_pause - Configure Pause and Asym Pause
2692*4882a593Smuzhiyun  * @phydev: target phy_device struct
2693*4882a593Smuzhiyun  * @rx: Receiver Pause is supported
2694*4882a593Smuzhiyun  * @tx: Transmit Pause is supported
2695*4882a593Smuzhiyun  *
2696*4882a593Smuzhiyun  * Description: Configure advertised Pause support depending on if
2697*4882a593Smuzhiyun  * transmit and receiver pause is supported. If there has been a
2698*4882a593Smuzhiyun  * change in adverting, trigger a new autoneg. Generally called from
2699*4882a593Smuzhiyun  * the set_pauseparam .ndo.
2700*4882a593Smuzhiyun  */
phy_set_asym_pause(struct phy_device * phydev,bool rx,bool tx)2701*4882a593Smuzhiyun void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx)
2702*4882a593Smuzhiyun {
2703*4882a593Smuzhiyun 	__ETHTOOL_DECLARE_LINK_MODE_MASK(oldadv);
2704*4882a593Smuzhiyun 
2705*4882a593Smuzhiyun 	linkmode_copy(oldadv, phydev->advertising);
2706*4882a593Smuzhiyun 	linkmode_set_pause(phydev->advertising, tx, rx);
2707*4882a593Smuzhiyun 
2708*4882a593Smuzhiyun 	if (!linkmode_equal(oldadv, phydev->advertising) &&
2709*4882a593Smuzhiyun 	    phydev->autoneg)
2710*4882a593Smuzhiyun 		phy_start_aneg(phydev);
2711*4882a593Smuzhiyun }
2712*4882a593Smuzhiyun EXPORT_SYMBOL(phy_set_asym_pause);
2713*4882a593Smuzhiyun 
2714*4882a593Smuzhiyun /**
2715*4882a593Smuzhiyun  * phy_validate_pause - Test if the PHY/MAC support the pause configuration
2716*4882a593Smuzhiyun  * @phydev: phy_device struct
2717*4882a593Smuzhiyun  * @pp: requested pause configuration
2718*4882a593Smuzhiyun  *
2719*4882a593Smuzhiyun  * Description: Test if the PHY/MAC combination supports the Pause
2720*4882a593Smuzhiyun  * configuration the user is requesting. Returns True if it is
2721*4882a593Smuzhiyun  * supported, false otherwise.
2722*4882a593Smuzhiyun  */
phy_validate_pause(struct phy_device * phydev,struct ethtool_pauseparam * pp)2723*4882a593Smuzhiyun bool phy_validate_pause(struct phy_device *phydev,
2724*4882a593Smuzhiyun 			struct ethtool_pauseparam *pp)
2725*4882a593Smuzhiyun {
2726*4882a593Smuzhiyun 	if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2727*4882a593Smuzhiyun 			       phydev->supported) && pp->rx_pause)
2728*4882a593Smuzhiyun 		return false;
2729*4882a593Smuzhiyun 
2730*4882a593Smuzhiyun 	if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2731*4882a593Smuzhiyun 			       phydev->supported) &&
2732*4882a593Smuzhiyun 	    pp->rx_pause != pp->tx_pause)
2733*4882a593Smuzhiyun 		return false;
2734*4882a593Smuzhiyun 
2735*4882a593Smuzhiyun 	return true;
2736*4882a593Smuzhiyun }
2737*4882a593Smuzhiyun EXPORT_SYMBOL(phy_validate_pause);
2738*4882a593Smuzhiyun 
2739*4882a593Smuzhiyun /**
2740*4882a593Smuzhiyun  * phy_get_pause - resolve negotiated pause modes
2741*4882a593Smuzhiyun  * @phydev: phy_device struct
2742*4882a593Smuzhiyun  * @tx_pause: pointer to bool to indicate whether transmit pause should be
2743*4882a593Smuzhiyun  * enabled.
2744*4882a593Smuzhiyun  * @rx_pause: pointer to bool to indicate whether receive pause should be
2745*4882a593Smuzhiyun  * enabled.
2746*4882a593Smuzhiyun  *
2747*4882a593Smuzhiyun  * Resolve and return the flow control modes according to the negotiation
2748*4882a593Smuzhiyun  * result. This includes checking that we are operating in full duplex mode.
2749*4882a593Smuzhiyun  * See linkmode_resolve_pause() for further details.
2750*4882a593Smuzhiyun  */
phy_get_pause(struct phy_device * phydev,bool * tx_pause,bool * rx_pause)2751*4882a593Smuzhiyun void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause)
2752*4882a593Smuzhiyun {
2753*4882a593Smuzhiyun 	if (phydev->duplex != DUPLEX_FULL) {
2754*4882a593Smuzhiyun 		*tx_pause = false;
2755*4882a593Smuzhiyun 		*rx_pause = false;
2756*4882a593Smuzhiyun 		return;
2757*4882a593Smuzhiyun 	}
2758*4882a593Smuzhiyun 
2759*4882a593Smuzhiyun 	return linkmode_resolve_pause(phydev->advertising,
2760*4882a593Smuzhiyun 				      phydev->lp_advertising,
2761*4882a593Smuzhiyun 				      tx_pause, rx_pause);
2762*4882a593Smuzhiyun }
2763*4882a593Smuzhiyun EXPORT_SYMBOL(phy_get_pause);
2764*4882a593Smuzhiyun 
2765*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_OF_MDIO)
phy_get_int_delay_property(struct device * dev,const char * name)2766*4882a593Smuzhiyun static int phy_get_int_delay_property(struct device *dev, const char *name)
2767*4882a593Smuzhiyun {
2768*4882a593Smuzhiyun 	s32 int_delay;
2769*4882a593Smuzhiyun 	int ret;
2770*4882a593Smuzhiyun 
2771*4882a593Smuzhiyun 	ret = device_property_read_u32(dev, name, &int_delay);
2772*4882a593Smuzhiyun 	if (ret)
2773*4882a593Smuzhiyun 		return ret;
2774*4882a593Smuzhiyun 
2775*4882a593Smuzhiyun 	return int_delay;
2776*4882a593Smuzhiyun }
2777*4882a593Smuzhiyun #else
phy_get_int_delay_property(struct device * dev,const char * name)2778*4882a593Smuzhiyun static int phy_get_int_delay_property(struct device *dev, const char *name)
2779*4882a593Smuzhiyun {
2780*4882a593Smuzhiyun 	return -EINVAL;
2781*4882a593Smuzhiyun }
2782*4882a593Smuzhiyun #endif
2783*4882a593Smuzhiyun 
2784*4882a593Smuzhiyun /**
2785*4882a593Smuzhiyun  * phy_get_delay_index - returns the index of the internal delay
2786*4882a593Smuzhiyun  * @phydev: phy_device struct
2787*4882a593Smuzhiyun  * @dev: pointer to the devices device struct
2788*4882a593Smuzhiyun  * @delay_values: array of delays the PHY supports
2789*4882a593Smuzhiyun  * @size: the size of the delay array
2790*4882a593Smuzhiyun  * @is_rx: boolean to indicate to get the rx internal delay
2791*4882a593Smuzhiyun  *
2792*4882a593Smuzhiyun  * Returns the index within the array of internal delay passed in.
2793*4882a593Smuzhiyun  * If the device property is not present then the interface type is checked
2794*4882a593Smuzhiyun  * if the interface defines use of internal delay then a 1 is returned otherwise
2795*4882a593Smuzhiyun  * a 0 is returned.
2796*4882a593Smuzhiyun  * The array must be in ascending order. If PHY does not have an ascending order
2797*4882a593Smuzhiyun  * array then size = 0 and the value of the delay property is returned.
2798*4882a593Smuzhiyun  * Return -EINVAL if the delay is invalid or cannot be found.
2799*4882a593Smuzhiyun  */
phy_get_internal_delay(struct phy_device * phydev,struct device * dev,const int * delay_values,int size,bool is_rx)2800*4882a593Smuzhiyun s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev,
2801*4882a593Smuzhiyun 			   const int *delay_values, int size, bool is_rx)
2802*4882a593Smuzhiyun {
2803*4882a593Smuzhiyun 	s32 delay;
2804*4882a593Smuzhiyun 	int i;
2805*4882a593Smuzhiyun 
2806*4882a593Smuzhiyun 	if (is_rx) {
2807*4882a593Smuzhiyun 		delay = phy_get_int_delay_property(dev, "rx-internal-delay-ps");
2808*4882a593Smuzhiyun 		if (delay < 0 && size == 0) {
2809*4882a593Smuzhiyun 			if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
2810*4882a593Smuzhiyun 			    phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
2811*4882a593Smuzhiyun 				return 1;
2812*4882a593Smuzhiyun 			else
2813*4882a593Smuzhiyun 				return 0;
2814*4882a593Smuzhiyun 		}
2815*4882a593Smuzhiyun 
2816*4882a593Smuzhiyun 	} else {
2817*4882a593Smuzhiyun 		delay = phy_get_int_delay_property(dev, "tx-internal-delay-ps");
2818*4882a593Smuzhiyun 		if (delay < 0 && size == 0) {
2819*4882a593Smuzhiyun 			if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
2820*4882a593Smuzhiyun 			    phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
2821*4882a593Smuzhiyun 				return 1;
2822*4882a593Smuzhiyun 			else
2823*4882a593Smuzhiyun 				return 0;
2824*4882a593Smuzhiyun 		}
2825*4882a593Smuzhiyun 	}
2826*4882a593Smuzhiyun 
2827*4882a593Smuzhiyun 	if (delay < 0)
2828*4882a593Smuzhiyun 		return delay;
2829*4882a593Smuzhiyun 
2830*4882a593Smuzhiyun 	if (delay && size == 0)
2831*4882a593Smuzhiyun 		return delay;
2832*4882a593Smuzhiyun 
2833*4882a593Smuzhiyun 	if (delay < delay_values[0] || delay > delay_values[size - 1]) {
2834*4882a593Smuzhiyun 		phydev_err(phydev, "Delay %d is out of range\n", delay);
2835*4882a593Smuzhiyun 		return -EINVAL;
2836*4882a593Smuzhiyun 	}
2837*4882a593Smuzhiyun 
2838*4882a593Smuzhiyun 	if (delay == delay_values[0])
2839*4882a593Smuzhiyun 		return 0;
2840*4882a593Smuzhiyun 
2841*4882a593Smuzhiyun 	for (i = 1; i < size; i++) {
2842*4882a593Smuzhiyun 		if (delay == delay_values[i])
2843*4882a593Smuzhiyun 			return i;
2844*4882a593Smuzhiyun 
2845*4882a593Smuzhiyun 		/* Find an approximate index by looking up the table */
2846*4882a593Smuzhiyun 		if (delay > delay_values[i - 1] &&
2847*4882a593Smuzhiyun 		    delay < delay_values[i]) {
2848*4882a593Smuzhiyun 			if (delay - delay_values[i - 1] <
2849*4882a593Smuzhiyun 			    delay_values[i] - delay)
2850*4882a593Smuzhiyun 				return i - 1;
2851*4882a593Smuzhiyun 			else
2852*4882a593Smuzhiyun 				return i;
2853*4882a593Smuzhiyun 		}
2854*4882a593Smuzhiyun 	}
2855*4882a593Smuzhiyun 
2856*4882a593Smuzhiyun 	phydev_err(phydev, "error finding internal delay index for %d\n",
2857*4882a593Smuzhiyun 		   delay);
2858*4882a593Smuzhiyun 
2859*4882a593Smuzhiyun 	return -EINVAL;
2860*4882a593Smuzhiyun }
2861*4882a593Smuzhiyun EXPORT_SYMBOL(phy_get_internal_delay);
2862*4882a593Smuzhiyun 
phy_drv_supports_irq(struct phy_driver * phydrv)2863*4882a593Smuzhiyun static bool phy_drv_supports_irq(struct phy_driver *phydrv)
2864*4882a593Smuzhiyun {
2865*4882a593Smuzhiyun 	return phydrv->config_intr && phydrv->ack_interrupt;
2866*4882a593Smuzhiyun }
2867*4882a593Smuzhiyun 
2868*4882a593Smuzhiyun /**
2869*4882a593Smuzhiyun  * phy_probe - probe and init a PHY device
2870*4882a593Smuzhiyun  * @dev: device to probe and init
2871*4882a593Smuzhiyun  *
2872*4882a593Smuzhiyun  * Description: Take care of setting up the phy_device structure,
2873*4882a593Smuzhiyun  *   set the state to READY (the driver's init function should
2874*4882a593Smuzhiyun  *   set it to STARTING if needed).
2875*4882a593Smuzhiyun  */
phy_probe(struct device * dev)2876*4882a593Smuzhiyun static int phy_probe(struct device *dev)
2877*4882a593Smuzhiyun {
2878*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
2879*4882a593Smuzhiyun 	struct device_driver *drv = phydev->mdio.dev.driver;
2880*4882a593Smuzhiyun 	struct phy_driver *phydrv = to_phy_driver(drv);
2881*4882a593Smuzhiyun 	int err = 0;
2882*4882a593Smuzhiyun 
2883*4882a593Smuzhiyun 	phydev->drv = phydrv;
2884*4882a593Smuzhiyun 
2885*4882a593Smuzhiyun 	/* Disable the interrupt if the PHY doesn't support it
2886*4882a593Smuzhiyun 	 * but the interrupt is still a valid one
2887*4882a593Smuzhiyun 	 */
2888*4882a593Smuzhiyun 	 if (!phy_drv_supports_irq(phydrv) && phy_interrupt_is_valid(phydev))
2889*4882a593Smuzhiyun 		phydev->irq = PHY_POLL;
2890*4882a593Smuzhiyun 
2891*4882a593Smuzhiyun 	if (phydrv->flags & PHY_IS_INTERNAL)
2892*4882a593Smuzhiyun 		phydev->is_internal = true;
2893*4882a593Smuzhiyun 
2894*4882a593Smuzhiyun 	mutex_lock(&phydev->lock);
2895*4882a593Smuzhiyun 
2896*4882a593Smuzhiyun 	/* Deassert the reset signal */
2897*4882a593Smuzhiyun 	phy_device_reset(phydev, 0);
2898*4882a593Smuzhiyun 
2899*4882a593Smuzhiyun 	if (phydev->drv->probe) {
2900*4882a593Smuzhiyun 		err = phydev->drv->probe(phydev);
2901*4882a593Smuzhiyun 		if (err)
2902*4882a593Smuzhiyun 			goto out;
2903*4882a593Smuzhiyun 	}
2904*4882a593Smuzhiyun 
2905*4882a593Smuzhiyun 	/* Start out supporting everything. Eventually,
2906*4882a593Smuzhiyun 	 * a controller will attach, and may modify one
2907*4882a593Smuzhiyun 	 * or both of these values
2908*4882a593Smuzhiyun 	 */
2909*4882a593Smuzhiyun 	if (phydrv->features) {
2910*4882a593Smuzhiyun 		linkmode_copy(phydev->supported, phydrv->features);
2911*4882a593Smuzhiyun 	} else if (phydrv->get_features) {
2912*4882a593Smuzhiyun 		err = phydrv->get_features(phydev);
2913*4882a593Smuzhiyun 	} else if (phydev->is_c45) {
2914*4882a593Smuzhiyun 		err = genphy_c45_pma_read_abilities(phydev);
2915*4882a593Smuzhiyun 	} else {
2916*4882a593Smuzhiyun 		err = genphy_read_abilities(phydev);
2917*4882a593Smuzhiyun 	}
2918*4882a593Smuzhiyun 
2919*4882a593Smuzhiyun 	if (err)
2920*4882a593Smuzhiyun 		goto out;
2921*4882a593Smuzhiyun 
2922*4882a593Smuzhiyun 	if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
2923*4882a593Smuzhiyun 			       phydev->supported))
2924*4882a593Smuzhiyun 		phydev->autoneg = 0;
2925*4882a593Smuzhiyun 
2926*4882a593Smuzhiyun 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
2927*4882a593Smuzhiyun 			      phydev->supported))
2928*4882a593Smuzhiyun 		phydev->is_gigabit_capable = 1;
2929*4882a593Smuzhiyun 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
2930*4882a593Smuzhiyun 			      phydev->supported))
2931*4882a593Smuzhiyun 		phydev->is_gigabit_capable = 1;
2932*4882a593Smuzhiyun 
2933*4882a593Smuzhiyun 	of_set_phy_supported(phydev);
2934*4882a593Smuzhiyun 	phy_advertise_supported(phydev);
2935*4882a593Smuzhiyun 
2936*4882a593Smuzhiyun 	/* Get the EEE modes we want to prohibit. We will ask
2937*4882a593Smuzhiyun 	 * the PHY stop advertising these mode later on
2938*4882a593Smuzhiyun 	 */
2939*4882a593Smuzhiyun 	of_set_phy_eee_broken(phydev);
2940*4882a593Smuzhiyun 
2941*4882a593Smuzhiyun 	/* The Pause Frame bits indicate that the PHY can support passing
2942*4882a593Smuzhiyun 	 * pause frames. During autonegotiation, the PHYs will determine if
2943*4882a593Smuzhiyun 	 * they should allow pause frames to pass.  The MAC driver should then
2944*4882a593Smuzhiyun 	 * use that result to determine whether to enable flow control via
2945*4882a593Smuzhiyun 	 * pause frames.
2946*4882a593Smuzhiyun 	 *
2947*4882a593Smuzhiyun 	 * Normally, PHY drivers should not set the Pause bits, and instead
2948*4882a593Smuzhiyun 	 * allow phylib to do that.  However, there may be some situations
2949*4882a593Smuzhiyun 	 * (e.g. hardware erratum) where the driver wants to set only one
2950*4882a593Smuzhiyun 	 * of these bits.
2951*4882a593Smuzhiyun 	 */
2952*4882a593Smuzhiyun 	if (!test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported) &&
2953*4882a593Smuzhiyun 	    !test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported)) {
2954*4882a593Smuzhiyun 		linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2955*4882a593Smuzhiyun 				 phydev->supported);
2956*4882a593Smuzhiyun 		linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2957*4882a593Smuzhiyun 				 phydev->supported);
2958*4882a593Smuzhiyun 	}
2959*4882a593Smuzhiyun 
2960*4882a593Smuzhiyun 	/* Set the state to READY by default */
2961*4882a593Smuzhiyun 	phydev->state = PHY_READY;
2962*4882a593Smuzhiyun 
2963*4882a593Smuzhiyun out:
2964*4882a593Smuzhiyun 	/* Assert the reset signal */
2965*4882a593Smuzhiyun 	if (err)
2966*4882a593Smuzhiyun 		phy_device_reset(phydev, 1);
2967*4882a593Smuzhiyun 
2968*4882a593Smuzhiyun 	mutex_unlock(&phydev->lock);
2969*4882a593Smuzhiyun 
2970*4882a593Smuzhiyun 	return err;
2971*4882a593Smuzhiyun }
2972*4882a593Smuzhiyun 
phy_remove(struct device * dev)2973*4882a593Smuzhiyun static int phy_remove(struct device *dev)
2974*4882a593Smuzhiyun {
2975*4882a593Smuzhiyun 	struct phy_device *phydev = to_phy_device(dev);
2976*4882a593Smuzhiyun 
2977*4882a593Smuzhiyun 	cancel_delayed_work_sync(&phydev->state_queue);
2978*4882a593Smuzhiyun 
2979*4882a593Smuzhiyun 	mutex_lock(&phydev->lock);
2980*4882a593Smuzhiyun 	phydev->state = PHY_DOWN;
2981*4882a593Smuzhiyun 	mutex_unlock(&phydev->lock);
2982*4882a593Smuzhiyun 
2983*4882a593Smuzhiyun 	sfp_bus_del_upstream(phydev->sfp_bus);
2984*4882a593Smuzhiyun 	phydev->sfp_bus = NULL;
2985*4882a593Smuzhiyun 
2986*4882a593Smuzhiyun 	if (phydev->drv && phydev->drv->remove)
2987*4882a593Smuzhiyun 		phydev->drv->remove(phydev);
2988*4882a593Smuzhiyun 
2989*4882a593Smuzhiyun 	/* Assert the reset signal */
2990*4882a593Smuzhiyun 	phy_device_reset(phydev, 1);
2991*4882a593Smuzhiyun 
2992*4882a593Smuzhiyun 	phydev->drv = NULL;
2993*4882a593Smuzhiyun 
2994*4882a593Smuzhiyun 	return 0;
2995*4882a593Smuzhiyun }
2996*4882a593Smuzhiyun 
2997*4882a593Smuzhiyun /**
2998*4882a593Smuzhiyun  * phy_driver_register - register a phy_driver with the PHY layer
2999*4882a593Smuzhiyun  * @new_driver: new phy_driver to register
3000*4882a593Smuzhiyun  * @owner: module owning this PHY
3001*4882a593Smuzhiyun  */
phy_driver_register(struct phy_driver * new_driver,struct module * owner)3002*4882a593Smuzhiyun int phy_driver_register(struct phy_driver *new_driver, struct module *owner)
3003*4882a593Smuzhiyun {
3004*4882a593Smuzhiyun 	int retval;
3005*4882a593Smuzhiyun 
3006*4882a593Smuzhiyun 	/* Either the features are hard coded, or dynamically
3007*4882a593Smuzhiyun 	 * determined. It cannot be both.
3008*4882a593Smuzhiyun 	 */
3009*4882a593Smuzhiyun 	if (WARN_ON(new_driver->features && new_driver->get_features)) {
3010*4882a593Smuzhiyun 		pr_err("%s: features and get_features must not both be set\n",
3011*4882a593Smuzhiyun 		       new_driver->name);
3012*4882a593Smuzhiyun 		return -EINVAL;
3013*4882a593Smuzhiyun 	}
3014*4882a593Smuzhiyun 
3015*4882a593Smuzhiyun 	new_driver->mdiodrv.flags |= MDIO_DEVICE_IS_PHY;
3016*4882a593Smuzhiyun 	new_driver->mdiodrv.driver.name = new_driver->name;
3017*4882a593Smuzhiyun 	new_driver->mdiodrv.driver.bus = &mdio_bus_type;
3018*4882a593Smuzhiyun 	new_driver->mdiodrv.driver.probe = phy_probe;
3019*4882a593Smuzhiyun 	new_driver->mdiodrv.driver.remove = phy_remove;
3020*4882a593Smuzhiyun 	new_driver->mdiodrv.driver.owner = owner;
3021*4882a593Smuzhiyun 	new_driver->mdiodrv.driver.probe_type = PROBE_FORCE_SYNCHRONOUS;
3022*4882a593Smuzhiyun 
3023*4882a593Smuzhiyun 	retval = driver_register(&new_driver->mdiodrv.driver);
3024*4882a593Smuzhiyun 	if (retval) {
3025*4882a593Smuzhiyun 		pr_err("%s: Error %d in registering driver\n",
3026*4882a593Smuzhiyun 		       new_driver->name, retval);
3027*4882a593Smuzhiyun 
3028*4882a593Smuzhiyun 		return retval;
3029*4882a593Smuzhiyun 	}
3030*4882a593Smuzhiyun 
3031*4882a593Smuzhiyun 	pr_debug("%s: Registered new driver\n", new_driver->name);
3032*4882a593Smuzhiyun 
3033*4882a593Smuzhiyun 	return 0;
3034*4882a593Smuzhiyun }
3035*4882a593Smuzhiyun EXPORT_SYMBOL(phy_driver_register);
3036*4882a593Smuzhiyun 
phy_drivers_register(struct phy_driver * new_driver,int n,struct module * owner)3037*4882a593Smuzhiyun int phy_drivers_register(struct phy_driver *new_driver, int n,
3038*4882a593Smuzhiyun 			 struct module *owner)
3039*4882a593Smuzhiyun {
3040*4882a593Smuzhiyun 	int i, ret = 0;
3041*4882a593Smuzhiyun 
3042*4882a593Smuzhiyun 	for (i = 0; i < n; i++) {
3043*4882a593Smuzhiyun 		ret = phy_driver_register(new_driver + i, owner);
3044*4882a593Smuzhiyun 		if (ret) {
3045*4882a593Smuzhiyun 			while (i-- > 0)
3046*4882a593Smuzhiyun 				phy_driver_unregister(new_driver + i);
3047*4882a593Smuzhiyun 			break;
3048*4882a593Smuzhiyun 		}
3049*4882a593Smuzhiyun 	}
3050*4882a593Smuzhiyun 	return ret;
3051*4882a593Smuzhiyun }
3052*4882a593Smuzhiyun EXPORT_SYMBOL(phy_drivers_register);
3053*4882a593Smuzhiyun 
phy_driver_unregister(struct phy_driver * drv)3054*4882a593Smuzhiyun void phy_driver_unregister(struct phy_driver *drv)
3055*4882a593Smuzhiyun {
3056*4882a593Smuzhiyun 	driver_unregister(&drv->mdiodrv.driver);
3057*4882a593Smuzhiyun }
3058*4882a593Smuzhiyun EXPORT_SYMBOL(phy_driver_unregister);
3059*4882a593Smuzhiyun 
phy_drivers_unregister(struct phy_driver * drv,int n)3060*4882a593Smuzhiyun void phy_drivers_unregister(struct phy_driver *drv, int n)
3061*4882a593Smuzhiyun {
3062*4882a593Smuzhiyun 	int i;
3063*4882a593Smuzhiyun 
3064*4882a593Smuzhiyun 	for (i = 0; i < n; i++)
3065*4882a593Smuzhiyun 		phy_driver_unregister(drv + i);
3066*4882a593Smuzhiyun }
3067*4882a593Smuzhiyun EXPORT_SYMBOL(phy_drivers_unregister);
3068*4882a593Smuzhiyun 
3069*4882a593Smuzhiyun static struct phy_driver genphy_driver = {
3070*4882a593Smuzhiyun 	.phy_id		= 0xffffffff,
3071*4882a593Smuzhiyun 	.phy_id_mask	= 0xffffffff,
3072*4882a593Smuzhiyun 	.name		= "Generic PHY",
3073*4882a593Smuzhiyun 	.get_features	= genphy_read_abilities,
3074*4882a593Smuzhiyun 	.suspend	= genphy_suspend,
3075*4882a593Smuzhiyun 	.resume		= genphy_resume,
3076*4882a593Smuzhiyun 	.set_loopback   = genphy_loopback,
3077*4882a593Smuzhiyun };
3078*4882a593Smuzhiyun 
3079*4882a593Smuzhiyun static const struct ethtool_phy_ops phy_ethtool_phy_ops = {
3080*4882a593Smuzhiyun 	.get_sset_count		= phy_ethtool_get_sset_count,
3081*4882a593Smuzhiyun 	.get_strings		= phy_ethtool_get_strings,
3082*4882a593Smuzhiyun 	.get_stats		= phy_ethtool_get_stats,
3083*4882a593Smuzhiyun 	.start_cable_test	= phy_start_cable_test,
3084*4882a593Smuzhiyun 	.start_cable_test_tdr	= phy_start_cable_test_tdr,
3085*4882a593Smuzhiyun };
3086*4882a593Smuzhiyun 
phy_init(void)3087*4882a593Smuzhiyun static int __init phy_init(void)
3088*4882a593Smuzhiyun {
3089*4882a593Smuzhiyun 	int rc;
3090*4882a593Smuzhiyun 
3091*4882a593Smuzhiyun 	rc = mdio_bus_init();
3092*4882a593Smuzhiyun 	if (rc)
3093*4882a593Smuzhiyun 		return rc;
3094*4882a593Smuzhiyun 
3095*4882a593Smuzhiyun 	ethtool_set_ethtool_phy_ops(&phy_ethtool_phy_ops);
3096*4882a593Smuzhiyun 	features_init();
3097*4882a593Smuzhiyun 
3098*4882a593Smuzhiyun 	rc = phy_driver_register(&genphy_c45_driver, THIS_MODULE);
3099*4882a593Smuzhiyun 	if (rc)
3100*4882a593Smuzhiyun 		goto err_c45;
3101*4882a593Smuzhiyun 
3102*4882a593Smuzhiyun 	rc = phy_driver_register(&genphy_driver, THIS_MODULE);
3103*4882a593Smuzhiyun 	if (rc) {
3104*4882a593Smuzhiyun 		phy_driver_unregister(&genphy_c45_driver);
3105*4882a593Smuzhiyun err_c45:
3106*4882a593Smuzhiyun 		mdio_bus_exit();
3107*4882a593Smuzhiyun 	}
3108*4882a593Smuzhiyun 
3109*4882a593Smuzhiyun 	return rc;
3110*4882a593Smuzhiyun }
3111*4882a593Smuzhiyun 
phy_exit(void)3112*4882a593Smuzhiyun static void __exit phy_exit(void)
3113*4882a593Smuzhiyun {
3114*4882a593Smuzhiyun 	phy_driver_unregister(&genphy_c45_driver);
3115*4882a593Smuzhiyun 	phy_driver_unregister(&genphy_driver);
3116*4882a593Smuzhiyun 	mdio_bus_exit();
3117*4882a593Smuzhiyun 	ethtool_set_ethtool_phy_ops(NULL);
3118*4882a593Smuzhiyun }
3119*4882a593Smuzhiyun 
3120*4882a593Smuzhiyun subsys_initcall(phy_init);
3121*4882a593Smuzhiyun module_exit(phy_exit);
3122