1 // SPDX-License-Identifier: GPL-2.0
3 * phylink models the MAC to optional PHY connection, supporting
4 * technologies such as SFP cages where the PHY is hot-pluggable.
6 * Copyright (C) 2015 Russell King
8 #include <linux/ethtool.h>
9 #include <linux/export.h>
10 #include <linux/gpio/consumer.h>
11 #include <linux/netdevice.h>
13 #include <linux/of_mdio.h>
14 #include <linux/phy.h>
15 #include <linux/phy_fixed.h>
16 #include <linux/phylink.h>
17 #include <linux/rtnetlink.h>
18 #include <linux/spinlock.h>
19 #include <linux/timer.h>
20 #include <linux/workqueue.h>
25 #define SUPPORTED_INTERFACES \
26 (SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_FIBRE | \
27 SUPPORTED_BNC | SUPPORTED_AUI | SUPPORTED_Backplane)
28 #define ADVERTISED_INTERFACES \
29 (ADVERTISED_TP | ADVERTISED_MII | ADVERTISED_FIBRE | \
30 ADVERTISED_BNC | ADVERTISED_AUI | ADVERTISED_Backplane)
33 PHYLINK_DISABLE_STOPPED
,
38 * struct phylink - internal data type for phylink
42 struct net_device
*netdev
;
43 const struct phylink_mac_ops
*ops
;
45 unsigned long phylink_disable_state
; /* bitmask of disables */
46 struct phy_device
*phydev
;
47 phy_interface_t link_interface
; /* PHY_INTERFACE_xxx */
48 u8 link_an_mode
; /* MLO_AN_xxx */
49 u8 link_port
; /* The current non-phy ethtool port */
50 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported
);
52 /* The link configuration settings */
53 struct phylink_link_state link_config
;
54 struct gpio_desc
*link_gpio
;
55 struct timer_list link_poll
;
56 void (*get_fixed_state
)(struct net_device
*dev
,
57 struct phylink_link_state
*s
);
59 struct mutex state_mutex
;
60 struct phylink_link_state phy_state
;
61 struct work_struct resolve
;
63 bool mac_link_dropped
;
65 struct sfp_bus
*sfp_bus
;
69 * phylink_set_port_modes() - set the port type modes in the ethtool mask
70 * @mask: ethtool link mode mask
72 * Sets all the port type modes in the ethtool mask. MAC drivers should
73 * use this in their 'validate' callback.
75 void phylink_set_port_modes(unsigned long *mask
)
77 phylink_set(mask
, TP
);
78 phylink_set(mask
, AUI
);
79 phylink_set(mask
, MII
);
80 phylink_set(mask
, FIBRE
);
81 phylink_set(mask
, BNC
);
82 phylink_set(mask
, Backplane
);
84 EXPORT_SYMBOL_GPL(phylink_set_port_modes
);
86 static int phylink_is_empty_linkmode(const unsigned long *linkmode
)
88 __ETHTOOL_DECLARE_LINK_MODE_MASK(tmp
) = { 0, };
90 phylink_set_port_modes(tmp
);
91 phylink_set(tmp
, Autoneg
);
92 phylink_set(tmp
, Pause
);
93 phylink_set(tmp
, Asym_Pause
);
95 bitmap_andnot(tmp
, linkmode
, tmp
, __ETHTOOL_LINK_MODE_MASK_NBITS
);
97 return linkmode_empty(tmp
);
100 static const char *phylink_an_mode_str(unsigned int mode
)
102 static const char *modestr
[] = {
103 [MLO_AN_PHY
] = "phy",
104 [MLO_AN_FIXED
] = "fixed",
105 [MLO_AN_INBAND
] = "inband",
108 return mode
< ARRAY_SIZE(modestr
) ? modestr
[mode
] : "unknown";
111 static int phylink_validate(struct phylink
*pl
, unsigned long *supported
,
112 struct phylink_link_state
*state
)
114 pl
->ops
->validate(pl
->netdev
, supported
, state
);
116 return phylink_is_empty_linkmode(supported
) ? -EINVAL
: 0;
119 static int phylink_parse_fixedlink(struct phylink
*pl
,
120 struct fwnode_handle
*fwnode
)
122 struct fwnode_handle
*fixed_node
;
123 const struct phy_setting
*s
;
124 struct gpio_desc
*desc
;
128 fixed_node
= fwnode_get_named_child_node(fwnode
, "fixed-link");
130 ret
= fwnode_property_read_u32(fixed_node
, "speed", &speed
);
132 pl
->link_config
.speed
= speed
;
133 pl
->link_config
.duplex
= DUPLEX_HALF
;
135 if (fwnode_property_read_bool(fixed_node
, "full-duplex"))
136 pl
->link_config
.duplex
= DUPLEX_FULL
;
138 /* We treat the "pause" and "asym-pause" terminology as
139 * defining the link partner's ability. */
140 if (fwnode_property_read_bool(fixed_node
, "pause"))
141 pl
->link_config
.pause
|= MLO_PAUSE_SYM
;
142 if (fwnode_property_read_bool(fixed_node
, "asym-pause"))
143 pl
->link_config
.pause
|= MLO_PAUSE_ASYM
;
146 desc
= fwnode_get_named_gpiod(fixed_node
, "link-gpios",
150 pl
->link_gpio
= desc
;
151 else if (desc
== ERR_PTR(-EPROBE_DEFER
))
154 fwnode_handle_put(fixed_node
);
161 ret
= fwnode_property_read_u32_array(fwnode
, "fixed-link",
163 if (ret
!= ARRAY_SIZE(prop
)) {
164 netdev_err(pl
->netdev
, "broken fixed-link?\n");
168 ret
= fwnode_property_read_u32_array(fwnode
, "fixed-link",
169 prop
, ARRAY_SIZE(prop
));
171 pl
->link_config
.duplex
= prop
[1] ?
172 DUPLEX_FULL
: DUPLEX_HALF
;
173 pl
->link_config
.speed
= prop
[2];
175 pl
->link_config
.pause
|= MLO_PAUSE_SYM
;
177 pl
->link_config
.pause
|= MLO_PAUSE_ASYM
;
181 if (pl
->link_config
.speed
> SPEED_1000
&&
182 pl
->link_config
.duplex
!= DUPLEX_FULL
)
183 netdev_warn(pl
->netdev
, "fixed link specifies half duplex for %dMbps link?\n",
184 pl
->link_config
.speed
);
186 bitmap_fill(pl
->supported
, __ETHTOOL_LINK_MODE_MASK_NBITS
);
187 linkmode_copy(pl
->link_config
.advertising
, pl
->supported
);
188 phylink_validate(pl
, pl
->supported
, &pl
->link_config
);
190 s
= phy_lookup_setting(pl
->link_config
.speed
, pl
->link_config
.duplex
,
191 pl
->supported
, true);
192 linkmode_zero(pl
->supported
);
193 phylink_set(pl
->supported
, MII
);
195 __set_bit(s
->bit
, pl
->supported
);
197 netdev_warn(pl
->netdev
, "fixed link %s duplex %dMbps not recognised\n",
198 pl
->link_config
.duplex
== DUPLEX_FULL
? "full" : "half",
199 pl
->link_config
.speed
);
202 linkmode_and(pl
->link_config
.advertising
, pl
->link_config
.advertising
,
205 pl
->link_config
.link
= 1;
206 pl
->link_config
.an_complete
= 1;
211 static int phylink_parse_mode(struct phylink
*pl
, struct fwnode_handle
*fwnode
)
213 struct fwnode_handle
*dn
;
216 dn
= fwnode_get_named_child_node(fwnode
, "fixed-link");
217 if (dn
|| fwnode_property_present(fwnode
, "fixed-link"))
218 pl
->link_an_mode
= MLO_AN_FIXED
;
219 fwnode_handle_put(dn
);
221 if (fwnode_property_read_string(fwnode
, "managed", &managed
) == 0 &&
222 strcmp(managed
, "in-band-status") == 0) {
223 if (pl
->link_an_mode
== MLO_AN_FIXED
) {
224 netdev_err(pl
->netdev
,
225 "can't use both fixed-link and in-band-status\n");
229 linkmode_zero(pl
->supported
);
230 phylink_set(pl
->supported
, MII
);
231 phylink_set(pl
->supported
, Autoneg
);
232 phylink_set(pl
->supported
, Asym_Pause
);
233 phylink_set(pl
->supported
, Pause
);
234 pl
->link_config
.an_enabled
= true;
235 pl
->link_an_mode
= MLO_AN_INBAND
;
237 switch (pl
->link_config
.interface
) {
238 case PHY_INTERFACE_MODE_SGMII
:
239 phylink_set(pl
->supported
, 10baseT_Half
);
240 phylink_set(pl
->supported
, 10baseT_Full
);
241 phylink_set(pl
->supported
, 100baseT_Half
);
242 phylink_set(pl
->supported
, 100baseT_Full
);
243 phylink_set(pl
->supported
, 1000baseT_Half
);
244 phylink_set(pl
->supported
, 1000baseT_Full
);
247 case PHY_INTERFACE_MODE_1000BASEX
:
248 phylink_set(pl
->supported
, 1000baseX_Full
);
251 case PHY_INTERFACE_MODE_2500BASEX
:
252 phylink_set(pl
->supported
, 2500baseX_Full
);
255 case PHY_INTERFACE_MODE_10GKR
:
256 phylink_set(pl
->supported
, 10baseT_Half
);
257 phylink_set(pl
->supported
, 10baseT_Full
);
258 phylink_set(pl
->supported
, 100baseT_Half
);
259 phylink_set(pl
->supported
, 100baseT_Full
);
260 phylink_set(pl
->supported
, 1000baseT_Half
);
261 phylink_set(pl
->supported
, 1000baseT_Full
);
262 phylink_set(pl
->supported
, 1000baseX_Full
);
263 phylink_set(pl
->supported
, 10000baseKR_Full
);
264 phylink_set(pl
->supported
, 10000baseCR_Full
);
265 phylink_set(pl
->supported
, 10000baseSR_Full
);
266 phylink_set(pl
->supported
, 10000baseLR_Full
);
267 phylink_set(pl
->supported
, 10000baseLRM_Full
);
268 phylink_set(pl
->supported
, 10000baseER_Full
);
272 netdev_err(pl
->netdev
,
273 "incorrect link mode %s for in-band status\n",
274 phy_modes(pl
->link_config
.interface
));
278 linkmode_copy(pl
->link_config
.advertising
, pl
->supported
);
280 if (phylink_validate(pl
, pl
->supported
, &pl
->link_config
)) {
281 netdev_err(pl
->netdev
,
282 "failed to validate link configuration for in-band status\n");
290 static void phylink_mac_config(struct phylink
*pl
,
291 const struct phylink_link_state
*state
)
293 netdev_dbg(pl
->netdev
,
294 "%s: mode=%s/%s/%s/%s adv=%*pb pause=%02x link=%u an=%u\n",
295 __func__
, phylink_an_mode_str(pl
->link_an_mode
),
296 phy_modes(state
->interface
),
297 phy_speed_to_str(state
->speed
),
298 phy_duplex_to_str(state
->duplex
),
299 __ETHTOOL_LINK_MODE_MASK_NBITS
, state
->advertising
,
300 state
->pause
, state
->link
, state
->an_enabled
);
302 pl
->ops
->mac_config(pl
->netdev
, pl
->link_an_mode
, state
);
305 static void phylink_mac_config_up(struct phylink
*pl
,
306 const struct phylink_link_state
*state
)
309 phylink_mac_config(pl
, state
);
312 static void phylink_mac_an_restart(struct phylink
*pl
)
314 if (pl
->link_config
.an_enabled
&&
315 phy_interface_mode_is_8023z(pl
->link_config
.interface
))
316 pl
->ops
->mac_an_restart(pl
->netdev
);
319 static int phylink_get_mac_state(struct phylink
*pl
, struct phylink_link_state
*state
)
321 struct net_device
*ndev
= pl
->netdev
;
323 linkmode_copy(state
->advertising
, pl
->link_config
.advertising
);
324 linkmode_zero(state
->lp_advertising
);
325 state
->interface
= pl
->link_config
.interface
;
326 state
->an_enabled
= pl
->link_config
.an_enabled
;
327 state
->speed
= SPEED_UNKNOWN
;
328 state
->duplex
= DUPLEX_UNKNOWN
;
329 state
->pause
= MLO_PAUSE_NONE
;
330 state
->an_complete
= 0;
333 return pl
->ops
->mac_link_state(ndev
, state
);
336 /* The fixed state is... fixed except for the link state,
337 * which may be determined by a GPIO or a callback.
339 static void phylink_get_fixed_state(struct phylink
*pl
, struct phylink_link_state
*state
)
341 *state
= pl
->link_config
;
342 if (pl
->get_fixed_state
)
343 pl
->get_fixed_state(pl
->netdev
, state
);
344 else if (pl
->link_gpio
)
345 state
->link
= !!gpiod_get_value_cansleep(pl
->link_gpio
);
348 /* Flow control is resolved according to our and the link partners
349 * advertisements using the following drawn from the 802.3 specs:
350 * Local device Link partner
351 * Pause AsymDir Pause AsymDir Result
356 static void phylink_resolve_flow(struct phylink
*pl
,
357 struct phylink_link_state
*state
)
361 if (pl
->link_config
.pause
& MLO_PAUSE_AN
) {
364 if (phylink_test(pl
->link_config
.advertising
, Pause
))
365 pause
|= MLO_PAUSE_SYM
;
366 if (phylink_test(pl
->link_config
.advertising
, Asym_Pause
))
367 pause
|= MLO_PAUSE_ASYM
;
369 pause
&= state
->pause
;
371 if (pause
& MLO_PAUSE_SYM
)
372 new_pause
= MLO_PAUSE_TX
| MLO_PAUSE_RX
;
373 else if (pause
& MLO_PAUSE_ASYM
)
374 new_pause
= state
->pause
& MLO_PAUSE_SYM
?
375 MLO_PAUSE_RX
: MLO_PAUSE_TX
;
377 new_pause
= pl
->link_config
.pause
& MLO_PAUSE_TXRX_MASK
;
380 state
->pause
&= ~MLO_PAUSE_TXRX_MASK
;
381 state
->pause
|= new_pause
;
384 static const char *phylink_pause_to_str(int pause
)
386 switch (pause
& MLO_PAUSE_TXRX_MASK
) {
387 case MLO_PAUSE_TX
| MLO_PAUSE_RX
:
398 static void phylink_resolve(struct work_struct
*w
)
400 struct phylink
*pl
= container_of(w
, struct phylink
, resolve
);
401 struct phylink_link_state link_state
;
402 struct net_device
*ndev
= pl
->netdev
;
404 mutex_lock(&pl
->state_mutex
);
405 if (pl
->phylink_disable_state
) {
406 pl
->mac_link_dropped
= false;
407 link_state
.link
= false;
408 } else if (pl
->mac_link_dropped
) {
409 link_state
.link
= false;
411 switch (pl
->link_an_mode
) {
413 link_state
= pl
->phy_state
;
414 phylink_resolve_flow(pl
, &link_state
);
415 phylink_mac_config_up(pl
, &link_state
);
419 phylink_get_fixed_state(pl
, &link_state
);
420 phylink_mac_config_up(pl
, &link_state
);
424 phylink_get_mac_state(pl
, &link_state
);
426 bool changed
= false;
428 link_state
.link
= link_state
.link
&&
431 if (pl
->phy_state
.interface
!=
432 link_state
.interface
) {
433 link_state
.interface
= pl
->phy_state
.interface
;
437 /* Propagate the flow control from the PHY
438 * to the MAC. Also propagate the interface
441 if (pl
->phy_state
.link
|| changed
) {
442 link_state
.pause
|= pl
->phy_state
.pause
;
443 phylink_resolve_flow(pl
, &link_state
);
445 phylink_mac_config(pl
, &link_state
);
452 if (link_state
.link
!= netif_carrier_ok(ndev
)) {
453 if (!link_state
.link
) {
454 netif_carrier_off(ndev
);
455 pl
->ops
->mac_link_down(ndev
, pl
->link_an_mode
,
456 pl
->phy_state
.interface
);
457 netdev_info(ndev
, "Link is Down\n");
459 pl
->ops
->mac_link_up(ndev
, pl
->link_an_mode
,
460 pl
->phy_state
.interface
,
463 netif_carrier_on(ndev
);
466 "Link is Up - %s/%s - flow control %s\n",
467 phy_speed_to_str(link_state
.speed
),
468 phy_duplex_to_str(link_state
.duplex
),
469 phylink_pause_to_str(link_state
.pause
));
472 if (!link_state
.link
&& pl
->mac_link_dropped
) {
473 pl
->mac_link_dropped
= false;
474 queue_work(system_power_efficient_wq
, &pl
->resolve
);
476 mutex_unlock(&pl
->state_mutex
);
479 static void phylink_run_resolve(struct phylink
*pl
)
481 if (!pl
->phylink_disable_state
)
482 queue_work(system_power_efficient_wq
, &pl
->resolve
);
485 static void phylink_run_resolve_and_disable(struct phylink
*pl
, int bit
)
487 unsigned long state
= pl
->phylink_disable_state
;
489 set_bit(bit
, &pl
->phylink_disable_state
);
491 queue_work(system_power_efficient_wq
, &pl
->resolve
);
492 flush_work(&pl
->resolve
);
496 static void phylink_fixed_poll(struct timer_list
*t
)
498 struct phylink
*pl
= container_of(t
, struct phylink
, link_poll
);
500 mod_timer(t
, jiffies
+ HZ
);
502 phylink_run_resolve(pl
);
505 static const struct sfp_upstream_ops sfp_phylink_ops
;
507 static int phylink_register_sfp(struct phylink
*pl
,
508 struct fwnode_handle
*fwnode
)
510 struct fwnode_reference_args ref
;
516 ret
= fwnode_property_get_reference_args(fwnode
, "sfp", NULL
,
522 netdev_err(pl
->netdev
, "unable to parse \"sfp\" node: %d\n",
527 pl
->sfp_bus
= sfp_register_upstream(ref
.fwnode
, pl
->netdev
, pl
,
536 * phylink_create() - create a phylink instance
537 * @ndev: a pointer to the &struct net_device
538 * @fwnode: a pointer to a &struct fwnode_handle describing the network
540 * @iface: the desired link mode defined by &typedef phy_interface_t
541 * @ops: a pointer to a &struct phylink_mac_ops for the MAC.
543 * Create a new phylink instance, and parse the link parameters found in @np.
544 * This will parse in-band modes, fixed-link or SFP configuration.
546 * Returns a pointer to a &struct phylink, or an error-pointer value. Users
547 * must use IS_ERR() to check for errors from this function.
549 struct phylink
*phylink_create(struct net_device
*ndev
,
550 struct fwnode_handle
*fwnode
,
551 phy_interface_t iface
,
552 const struct phylink_mac_ops
*ops
)
557 pl
= kzalloc(sizeof(*pl
), GFP_KERNEL
);
559 return ERR_PTR(-ENOMEM
);
561 mutex_init(&pl
->state_mutex
);
562 INIT_WORK(&pl
->resolve
, phylink_resolve
);
564 pl
->phy_state
.interface
= iface
;
565 pl
->link_interface
= iface
;
566 if (iface
== PHY_INTERFACE_MODE_MOCA
)
567 pl
->link_port
= PORT_BNC
;
569 pl
->link_port
= PORT_MII
;
570 pl
->link_config
.interface
= iface
;
571 pl
->link_config
.pause
= MLO_PAUSE_AN
;
572 pl
->link_config
.speed
= SPEED_UNKNOWN
;
573 pl
->link_config
.duplex
= DUPLEX_UNKNOWN
;
574 pl
->link_config
.an_enabled
= true;
576 __set_bit(PHYLINK_DISABLE_STOPPED
, &pl
->phylink_disable_state
);
577 timer_setup(&pl
->link_poll
, phylink_fixed_poll
, 0);
579 bitmap_fill(pl
->supported
, __ETHTOOL_LINK_MODE_MASK_NBITS
);
580 linkmode_copy(pl
->link_config
.advertising
, pl
->supported
);
581 phylink_validate(pl
, pl
->supported
, &pl
->link_config
);
583 ret
= phylink_parse_mode(pl
, fwnode
);
589 if (pl
->link_an_mode
== MLO_AN_FIXED
) {
590 ret
= phylink_parse_fixedlink(pl
, fwnode
);
597 ret
= phylink_register_sfp(pl
, fwnode
);
605 EXPORT_SYMBOL_GPL(phylink_create
);
608 * phylink_destroy() - cleanup and destroy the phylink instance
609 * @pl: a pointer to a &struct phylink returned from phylink_create()
611 * Destroy a phylink instance. Any PHY that has been attached must have been
612 * cleaned up via phylink_disconnect_phy() prior to calling this function.
614 void phylink_destroy(struct phylink
*pl
)
617 sfp_unregister_upstream(pl
->sfp_bus
);
618 if (!IS_ERR_OR_NULL(pl
->link_gpio
))
619 gpiod_put(pl
->link_gpio
);
621 cancel_work_sync(&pl
->resolve
);
624 EXPORT_SYMBOL_GPL(phylink_destroy
);
626 static void phylink_phy_change(struct phy_device
*phydev
, bool up
,
629 struct phylink
*pl
= phydev
->phylink
;
631 mutex_lock(&pl
->state_mutex
);
632 pl
->phy_state
.speed
= phydev
->speed
;
633 pl
->phy_state
.duplex
= phydev
->duplex
;
634 pl
->phy_state
.pause
= MLO_PAUSE_NONE
;
636 pl
->phy_state
.pause
|= MLO_PAUSE_SYM
;
637 if (phydev
->asym_pause
)
638 pl
->phy_state
.pause
|= MLO_PAUSE_ASYM
;
639 pl
->phy_state
.interface
= phydev
->interface
;
640 pl
->phy_state
.link
= up
;
641 mutex_unlock(&pl
->state_mutex
);
643 phylink_run_resolve(pl
);
645 netdev_dbg(pl
->netdev
, "phy link %s %s/%s/%s\n", up
? "up" : "down",
646 phy_modes(phydev
->interface
),
647 phy_speed_to_str(phydev
->speed
),
648 phy_duplex_to_str(phydev
->duplex
));
651 static int phylink_bringup_phy(struct phylink
*pl
, struct phy_device
*phy
)
653 struct phylink_link_state config
;
654 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported
);
657 memset(&config
, 0, sizeof(config
));
658 linkmode_copy(supported
, phy
->supported
);
659 linkmode_copy(config
.advertising
, phy
->advertising
);
660 config
.interface
= pl
->link_config
.interface
;
663 * This is the new way of dealing with flow control for PHYs,
664 * as described by Timur Tabi in commit 529ed1275263 ("net: phy:
665 * phy drivers should not set SUPPORTED_[Asym_]Pause") except
666 * using our validate call to the MAC, we rely upon the MAC
667 * clearing the bits from both supported and advertising fields.
669 if (phylink_test(supported
, Pause
))
670 phylink_set(config
.advertising
, Pause
);
671 if (phylink_test(supported
, Asym_Pause
))
672 phylink_set(config
.advertising
, Asym_Pause
);
674 ret
= phylink_validate(pl
, supported
, &config
);
679 phy
->phy_link_change
= phylink_phy_change
;
681 netdev_info(pl
->netdev
,
682 "PHY [%s] driver [%s]\n", dev_name(&phy
->mdio
.dev
),
685 mutex_lock(&phy
->lock
);
686 mutex_lock(&pl
->state_mutex
);
688 linkmode_copy(pl
->supported
, supported
);
689 linkmode_copy(pl
->link_config
.advertising
, config
.advertising
);
691 /* Restrict the phy advertisement according to the MAC support. */
692 linkmode_copy(phy
->advertising
, config
.advertising
);
693 mutex_unlock(&pl
->state_mutex
);
694 mutex_unlock(&phy
->lock
);
696 netdev_dbg(pl
->netdev
,
697 "phy: setting supported %*pb advertising %*pb\n",
698 __ETHTOOL_LINK_MODE_MASK_NBITS
, pl
->supported
,
699 __ETHTOOL_LINK_MODE_MASK_NBITS
, phy
->advertising
);
701 if (phy_interrupt_is_valid(phy
))
702 phy_request_interrupt(phy
);
707 static int __phylink_connect_phy(struct phylink
*pl
, struct phy_device
*phy
,
708 phy_interface_t interface
)
712 if (WARN_ON(pl
->link_an_mode
== MLO_AN_FIXED
||
713 (pl
->link_an_mode
== MLO_AN_INBAND
&&
714 phy_interface_mode_is_8023z(interface
))))
720 ret
= phy_attach_direct(pl
->netdev
, phy
, 0, interface
);
724 ret
= phylink_bringup_phy(pl
, phy
);
732 * phylink_connect_phy() - connect a PHY to the phylink instance
733 * @pl: a pointer to a &struct phylink returned from phylink_create()
734 * @phy: a pointer to a &struct phy_device.
736 * Connect @phy to the phylink instance specified by @pl by calling
737 * phy_attach_direct(). Configure the @phy according to the MAC driver's
738 * capabilities, start the PHYLIB state machine and enable any interrupts
739 * that the PHY supports.
741 * This updates the phylink's ethtool supported and advertising link mode
744 * Returns 0 on success or a negative errno.
746 int phylink_connect_phy(struct phylink
*pl
, struct phy_device
*phy
)
748 /* Use PHY device/driver interface */
749 if (pl
->link_interface
== PHY_INTERFACE_MODE_NA
) {
750 pl
->link_interface
= phy
->interface
;
751 pl
->link_config
.interface
= pl
->link_interface
;
754 return __phylink_connect_phy(pl
, phy
, pl
->link_interface
);
756 EXPORT_SYMBOL_GPL(phylink_connect_phy
);
759 * phylink_of_phy_connect() - connect the PHY specified in the DT mode.
760 * @pl: a pointer to a &struct phylink returned from phylink_create()
761 * @dn: a pointer to a &struct device_node.
762 * @flags: PHY-specific flags to communicate to the PHY device driver
764 * Connect the phy specified in the device node @dn to the phylink instance
765 * specified by @pl. Actions specified in phylink_connect_phy() will be
768 * Returns 0 on success or a negative errno.
770 int phylink_of_phy_connect(struct phylink
*pl
, struct device_node
*dn
,
773 struct device_node
*phy_node
;
774 struct phy_device
*phy_dev
;
777 /* Fixed links and 802.3z are handled without needing a PHY */
778 if (pl
->link_an_mode
== MLO_AN_FIXED
||
779 (pl
->link_an_mode
== MLO_AN_INBAND
&&
780 phy_interface_mode_is_8023z(pl
->link_interface
)))
783 phy_node
= of_parse_phandle(dn
, "phy-handle", 0);
785 phy_node
= of_parse_phandle(dn
, "phy", 0);
787 phy_node
= of_parse_phandle(dn
, "phy-device", 0);
790 if (pl
->link_an_mode
== MLO_AN_PHY
)
795 phy_dev
= of_phy_attach(pl
->netdev
, phy_node
, flags
,
797 /* We're done with the phy_node handle */
798 of_node_put(phy_node
);
803 ret
= phylink_bringup_phy(pl
, phy_dev
);
809 EXPORT_SYMBOL_GPL(phylink_of_phy_connect
);
812 * phylink_disconnect_phy() - disconnect any PHY attached to the phylink
814 * @pl: a pointer to a &struct phylink returned from phylink_create()
816 * Disconnect any current PHY from the phylink instance described by @pl.
818 void phylink_disconnect_phy(struct phylink
*pl
)
820 struct phy_device
*phy
;
826 mutex_lock(&phy
->lock
);
827 mutex_lock(&pl
->state_mutex
);
829 mutex_unlock(&pl
->state_mutex
);
830 mutex_unlock(&phy
->lock
);
831 flush_work(&pl
->resolve
);
836 EXPORT_SYMBOL_GPL(phylink_disconnect_phy
);
839 * phylink_fixed_state_cb() - allow setting a fixed link callback
840 * @pl: a pointer to a &struct phylink returned from phylink_create()
841 * @cb: callback to execute to determine the fixed link state.
843 * The MAC driver should call this driver when the state of its link
844 * can be determined through e.g: an out of band MMIO register.
846 int phylink_fixed_state_cb(struct phylink
*pl
,
847 void (*cb
)(struct net_device
*dev
,
848 struct phylink_link_state
*state
))
850 /* It does not make sense to let the link be overriden unless we use
853 if (pl
->link_an_mode
!= MLO_AN_FIXED
)
856 mutex_lock(&pl
->state_mutex
);
857 pl
->get_fixed_state
= cb
;
858 mutex_unlock(&pl
->state_mutex
);
862 EXPORT_SYMBOL_GPL(phylink_fixed_state_cb
);
865 * phylink_mac_change() - notify phylink of a change in MAC state
866 * @pl: a pointer to a &struct phylink returned from phylink_create()
867 * @up: indicates whether the link is currently up.
869 * The MAC driver should call this driver when the state of its link
870 * changes (eg, link failure, new negotiation results, etc.)
872 void phylink_mac_change(struct phylink
*pl
, bool up
)
875 pl
->mac_link_dropped
= true;
876 phylink_run_resolve(pl
);
877 netdev_dbg(pl
->netdev
, "mac link %s\n", up
? "up" : "down");
879 EXPORT_SYMBOL_GPL(phylink_mac_change
);
882 * phylink_start() - start a phylink instance
883 * @pl: a pointer to a &struct phylink returned from phylink_create()
885 * Start the phylink instance specified by @pl, configuring the MAC for the
886 * desired link mode(s) and negotiation style. This should be called from the
887 * network device driver's &struct net_device_ops ndo_open() method.
889 void phylink_start(struct phylink
*pl
)
893 netdev_info(pl
->netdev
, "configuring for %s/%s link mode\n",
894 phylink_an_mode_str(pl
->link_an_mode
),
895 phy_modes(pl
->link_config
.interface
));
897 /* Always set the carrier off */
898 netif_carrier_off(pl
->netdev
);
900 /* Apply the link configuration to the MAC when starting. This allows
901 * a fixed-link to start with the correct parameters, and also
902 * ensures that we set the appropriate advertisement for Serdes links.
904 phylink_resolve_flow(pl
, &pl
->link_config
);
905 phylink_mac_config(pl
, &pl
->link_config
);
907 /* Restart autonegotiation if using 802.3z to ensure that the link
908 * parameters are properly negotiated. This is necessary for DSA
909 * switches using 802.3z negotiation to ensure they see our modes.
911 phylink_mac_an_restart(pl
);
913 clear_bit(PHYLINK_DISABLE_STOPPED
, &pl
->phylink_disable_state
);
914 phylink_run_resolve(pl
);
916 if (pl
->link_an_mode
== MLO_AN_FIXED
&& !IS_ERR(pl
->link_gpio
))
917 mod_timer(&pl
->link_poll
, jiffies
+ HZ
);
919 sfp_upstream_start(pl
->sfp_bus
);
921 phy_start(pl
->phydev
);
923 EXPORT_SYMBOL_GPL(phylink_start
);
926 * phylink_stop() - stop a phylink instance
927 * @pl: a pointer to a &struct phylink returned from phylink_create()
929 * Stop the phylink instance specified by @pl. This should be called from the
930 * network device driver's &struct net_device_ops ndo_stop() method. The
931 * network device's carrier state should not be changed prior to calling this
934 void phylink_stop(struct phylink
*pl
)
939 phy_stop(pl
->phydev
);
941 sfp_upstream_stop(pl
->sfp_bus
);
942 if (pl
->link_an_mode
== MLO_AN_FIXED
&& !IS_ERR(pl
->link_gpio
))
943 del_timer_sync(&pl
->link_poll
);
945 phylink_run_resolve_and_disable(pl
, PHYLINK_DISABLE_STOPPED
);
947 EXPORT_SYMBOL_GPL(phylink_stop
);
950 * phylink_ethtool_get_wol() - get the wake on lan parameters for the PHY
951 * @pl: a pointer to a &struct phylink returned from phylink_create()
952 * @wol: a pointer to &struct ethtool_wolinfo to hold the read parameters
954 * Read the wake on lan parameters from the PHY attached to the phylink
955 * instance specified by @pl. If no PHY is currently attached, report no
956 * support for wake on lan.
958 void phylink_ethtool_get_wol(struct phylink
*pl
, struct ethtool_wolinfo
*wol
)
966 phy_ethtool_get_wol(pl
->phydev
, wol
);
968 EXPORT_SYMBOL_GPL(phylink_ethtool_get_wol
);
971 * phylink_ethtool_set_wol() - set wake on lan parameters
972 * @pl: a pointer to a &struct phylink returned from phylink_create()
973 * @wol: a pointer to &struct ethtool_wolinfo for the desired parameters
975 * Set the wake on lan parameters for the PHY attached to the phylink
976 * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP
979 * Returns zero on success or negative errno code.
981 int phylink_ethtool_set_wol(struct phylink
*pl
, struct ethtool_wolinfo
*wol
)
983 int ret
= -EOPNOTSUPP
;
988 ret
= phy_ethtool_set_wol(pl
->phydev
, wol
);
992 EXPORT_SYMBOL_GPL(phylink_ethtool_set_wol
);
994 static void phylink_merge_link_mode(unsigned long *dst
, const unsigned long *b
)
996 __ETHTOOL_DECLARE_LINK_MODE_MASK(mask
);
999 phylink_set_port_modes(mask
);
1001 linkmode_and(dst
, dst
, mask
);
1002 linkmode_or(dst
, dst
, b
);
1005 static void phylink_get_ksettings(const struct phylink_link_state
*state
,
1006 struct ethtool_link_ksettings
*kset
)
1008 phylink_merge_link_mode(kset
->link_modes
.advertising
, state
->advertising
);
1009 linkmode_copy(kset
->link_modes
.lp_advertising
, state
->lp_advertising
);
1010 kset
->base
.speed
= state
->speed
;
1011 kset
->base
.duplex
= state
->duplex
;
1012 kset
->base
.autoneg
= state
->an_enabled
? AUTONEG_ENABLE
:
1017 * phylink_ethtool_ksettings_get() - get the current link settings
1018 * @pl: a pointer to a &struct phylink returned from phylink_create()
1019 * @kset: a pointer to a &struct ethtool_link_ksettings to hold link settings
1021 * Read the current link settings for the phylink instance specified by @pl.
1022 * This will be the link settings read from the MAC, PHY or fixed link
1023 * settings depending on the current negotiation mode.
1025 int phylink_ethtool_ksettings_get(struct phylink
*pl
,
1026 struct ethtool_link_ksettings
*kset
)
1028 struct phylink_link_state link_state
;
1033 phy_ethtool_ksettings_get(pl
->phydev
, kset
);
1035 kset
->base
.port
= pl
->link_port
;
1038 linkmode_copy(kset
->link_modes
.supported
, pl
->supported
);
1040 switch (pl
->link_an_mode
) {
1042 /* We are using fixed settings. Report these as the
1043 * current link settings - and note that these also
1044 * represent the supported speeds/duplex/pause modes.
1046 phylink_get_fixed_state(pl
, &link_state
);
1047 phylink_get_ksettings(&link_state
, kset
);
1051 /* If there is a phy attached, then use the reported
1052 * settings from the phy with no modification.
1057 phylink_get_mac_state(pl
, &link_state
);
1059 /* The MAC is reporting the link results from its own PCS
1060 * layer via in-band status. Report these as the current
1063 phylink_get_ksettings(&link_state
, kset
);
1069 EXPORT_SYMBOL_GPL(phylink_ethtool_ksettings_get
);
1072 * phylink_ethtool_ksettings_set() - set the link settings
1073 * @pl: a pointer to a &struct phylink returned from phylink_create()
1074 * @kset: a pointer to a &struct ethtool_link_ksettings for the desired modes
1076 int phylink_ethtool_ksettings_set(struct phylink
*pl
,
1077 const struct ethtool_link_ksettings
*kset
)
1079 struct ethtool_link_ksettings our_kset
;
1080 struct phylink_link_state config
;
1085 if (kset
->base
.autoneg
!= AUTONEG_DISABLE
&&
1086 kset
->base
.autoneg
!= AUTONEG_ENABLE
)
1089 config
= pl
->link_config
;
1091 /* Mask out unsupported advertisements */
1092 linkmode_and(config
.advertising
, kset
->link_modes
.advertising
,
1095 /* FIXME: should we reject autoneg if phy/mac does not support it? */
1096 if (kset
->base
.autoneg
== AUTONEG_DISABLE
) {
1097 const struct phy_setting
*s
;
1099 /* Autonegotiation disabled, select a suitable speed and
1102 s
= phy_lookup_setting(kset
->base
.speed
, kset
->base
.duplex
,
1103 pl
->supported
, false);
1107 /* If we have a fixed link (as specified by firmware), refuse
1108 * to change link parameters.
1110 if (pl
->link_an_mode
== MLO_AN_FIXED
&&
1111 (s
->speed
!= pl
->link_config
.speed
||
1112 s
->duplex
!= pl
->link_config
.duplex
))
1115 config
.speed
= s
->speed
;
1116 config
.duplex
= s
->duplex
;
1117 config
.an_enabled
= false;
1119 __clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
, config
.advertising
);
1121 /* If we have a fixed link, refuse to enable autonegotiation */
1122 if (pl
->link_an_mode
== MLO_AN_FIXED
)
1125 config
.speed
= SPEED_UNKNOWN
;
1126 config
.duplex
= DUPLEX_UNKNOWN
;
1127 config
.an_enabled
= true;
1129 __set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
, config
.advertising
);
1132 if (phylink_validate(pl
, pl
->supported
, &config
))
1135 /* If autonegotiation is enabled, we must have an advertisement */
1136 if (config
.an_enabled
&& phylink_is_empty_linkmode(config
.advertising
))
1140 linkmode_copy(our_kset
.link_modes
.advertising
, config
.advertising
);
1141 our_kset
.base
.speed
= config
.speed
;
1142 our_kset
.base
.duplex
= config
.duplex
;
1144 /* If we have a PHY, configure the phy */
1146 ret
= phy_ethtool_ksettings_set(pl
->phydev
, &our_kset
);
1151 mutex_lock(&pl
->state_mutex
);
1152 /* Configure the MAC to match the new settings */
1153 linkmode_copy(pl
->link_config
.advertising
, our_kset
.link_modes
.advertising
);
1154 pl
->link_config
.interface
= config
.interface
;
1155 pl
->link_config
.speed
= our_kset
.base
.speed
;
1156 pl
->link_config
.duplex
= our_kset
.base
.duplex
;
1157 pl
->link_config
.an_enabled
= our_kset
.base
.autoneg
!= AUTONEG_DISABLE
;
1159 if (!test_bit(PHYLINK_DISABLE_STOPPED
, &pl
->phylink_disable_state
)) {
1160 phylink_mac_config(pl
, &pl
->link_config
);
1161 phylink_mac_an_restart(pl
);
1163 mutex_unlock(&pl
->state_mutex
);
1167 EXPORT_SYMBOL_GPL(phylink_ethtool_ksettings_set
);
1170 * phylink_ethtool_nway_reset() - restart negotiation
1171 * @pl: a pointer to a &struct phylink returned from phylink_create()
1173 * Restart negotiation for the phylink instance specified by @pl. This will
1174 * cause any attached phy to restart negotiation with the link partner, and
1175 * if the MAC is in a BaseX mode, the MAC will also be requested to restart
1178 * Returns zero on success, or negative error code.
1180 int phylink_ethtool_nway_reset(struct phylink
*pl
)
1187 ret
= phy_restart_aneg(pl
->phydev
);
1188 phylink_mac_an_restart(pl
);
1192 EXPORT_SYMBOL_GPL(phylink_ethtool_nway_reset
);
1195 * phylink_ethtool_get_pauseparam() - get the current pause parameters
1196 * @pl: a pointer to a &struct phylink returned from phylink_create()
1197 * @pause: a pointer to a &struct ethtool_pauseparam
1199 void phylink_ethtool_get_pauseparam(struct phylink
*pl
,
1200 struct ethtool_pauseparam
*pause
)
1204 pause
->autoneg
= !!(pl
->link_config
.pause
& MLO_PAUSE_AN
);
1205 pause
->rx_pause
= !!(pl
->link_config
.pause
& MLO_PAUSE_RX
);
1206 pause
->tx_pause
= !!(pl
->link_config
.pause
& MLO_PAUSE_TX
);
1208 EXPORT_SYMBOL_GPL(phylink_ethtool_get_pauseparam
);
1211 * phylink_ethtool_set_pauseparam() - set the current pause parameters
1212 * @pl: a pointer to a &struct phylink returned from phylink_create()
1213 * @pause: a pointer to a &struct ethtool_pauseparam
1215 int phylink_ethtool_set_pauseparam(struct phylink
*pl
,
1216 struct ethtool_pauseparam
*pause
)
1218 struct phylink_link_state
*config
= &pl
->link_config
;
1222 if (!phylink_test(pl
->supported
, Pause
) &&
1223 !phylink_test(pl
->supported
, Asym_Pause
))
1226 if (!phylink_test(pl
->supported
, Asym_Pause
) &&
1227 !pause
->autoneg
&& pause
->rx_pause
!= pause
->tx_pause
)
1230 config
->pause
&= ~(MLO_PAUSE_AN
| MLO_PAUSE_TXRX_MASK
);
1233 config
->pause
|= MLO_PAUSE_AN
;
1234 if (pause
->rx_pause
)
1235 config
->pause
|= MLO_PAUSE_RX
;
1236 if (pause
->tx_pause
)
1237 config
->pause
|= MLO_PAUSE_TX
;
1239 if (!test_bit(PHYLINK_DISABLE_STOPPED
, &pl
->phylink_disable_state
)) {
1240 switch (pl
->link_an_mode
) {
1242 /* Silently mark the carrier down, and then trigger a resolve */
1243 netif_carrier_off(pl
->netdev
);
1244 phylink_run_resolve(pl
);
1248 /* Should we allow fixed links to change against the config? */
1249 phylink_resolve_flow(pl
, config
);
1250 phylink_mac_config(pl
, config
);
1254 phylink_mac_config(pl
, config
);
1255 phylink_mac_an_restart(pl
);
1262 EXPORT_SYMBOL_GPL(phylink_ethtool_set_pauseparam
);
1265 * phylink_ethtool_get_eee_err() - read the energy efficient ethernet error
1267 * @pl: a pointer to a &struct phylink returned from phylink_create().
1269 * Read the Energy Efficient Ethernet error counter from the PHY associated
1270 * with the phylink instance specified by @pl.
1272 * Returns positive error counter value, or negative error code.
1274 int phylink_get_eee_err(struct phylink
*pl
)
1281 ret
= phy_get_eee_err(pl
->phydev
);
1285 EXPORT_SYMBOL_GPL(phylink_get_eee_err
);
1288 * phylink_init_eee() - init and check the EEE features
1289 * @pl: a pointer to a &struct phylink returned from phylink_create()
1290 * @clk_stop_enable: allow PHY to stop receive clock
1292 * Must be called either with RTNL held or within mac_link_up()
1294 int phylink_init_eee(struct phylink
*pl
, bool clk_stop_enable
)
1296 int ret
= -EOPNOTSUPP
;
1299 ret
= phy_init_eee(pl
->phydev
, clk_stop_enable
);
1303 EXPORT_SYMBOL_GPL(phylink_init_eee
);
1306 * phylink_ethtool_get_eee() - read the energy efficient ethernet parameters
1307 * @pl: a pointer to a &struct phylink returned from phylink_create()
1308 * @eee: a pointer to a &struct ethtool_eee for the read parameters
1310 int phylink_ethtool_get_eee(struct phylink
*pl
, struct ethtool_eee
*eee
)
1312 int ret
= -EOPNOTSUPP
;
1317 ret
= phy_ethtool_get_eee(pl
->phydev
, eee
);
1321 EXPORT_SYMBOL_GPL(phylink_ethtool_get_eee
);
1324 * phylink_ethtool_set_eee() - set the energy efficient ethernet parameters
1325 * @pl: a pointer to a &struct phylink returned from phylink_create()
1326 * @eee: a pointer to a &struct ethtool_eee for the desired parameters
1328 int phylink_ethtool_set_eee(struct phylink
*pl
, struct ethtool_eee
*eee
)
1330 int ret
= -EOPNOTSUPP
;
1335 ret
= phy_ethtool_set_eee(pl
->phydev
, eee
);
1339 EXPORT_SYMBOL_GPL(phylink_ethtool_set_eee
);
1341 /* This emulates MII registers for a fixed-mode phy operating as per the
1342 * passed in state. "aneg" defines if we report negotiation is possible.
1344 * FIXME: should deal with negotiation state too.
1346 static int phylink_mii_emul_read(struct net_device
*ndev
, unsigned int reg
,
1347 struct phylink_link_state
*state
, bool aneg
)
1349 struct fixed_phy_status fs
;
1352 fs
.link
= state
->link
;
1353 fs
.speed
= state
->speed
;
1354 fs
.duplex
= state
->duplex
;
1355 fs
.pause
= state
->pause
& MLO_PAUSE_SYM
;
1356 fs
.asym_pause
= state
->pause
& MLO_PAUSE_ASYM
;
1358 val
= swphy_read_reg(reg
, &fs
);
1359 if (reg
== MII_BMSR
) {
1360 if (!state
->an_complete
)
1361 val
&= ~BMSR_ANEGCOMPLETE
;
1363 val
&= ~BMSR_ANEGCAPABLE
;
1368 static int phylink_phy_read(struct phylink
*pl
, unsigned int phy_id
,
1371 struct phy_device
*phydev
= pl
->phydev
;
1374 if (mdio_phy_id_is_c45(phy_id
)) {
1375 prtad
= mdio_phy_id_prtad(phy_id
);
1376 devad
= mdio_phy_id_devad(phy_id
);
1377 devad
= MII_ADDR_C45
| devad
<< 16 | reg
;
1378 } else if (phydev
->is_c45
) {
1384 devad
= __ffs(phydev
->c45_ids
.devices_in_package
);
1388 if (!(phydev
->c45_ids
.devices_in_package
& MDIO_DEVS_AN
))
1390 devad
= MDIO_MMD_AN
;
1391 if (reg
== MII_ADVERTISE
)
1392 reg
= MDIO_AN_ADVERTISE
;
1400 devad
= MII_ADDR_C45
| devad
<< 16 | reg
;
1405 return mdiobus_read(pl
->phydev
->mdio
.bus
, prtad
, devad
);
1408 static int phylink_phy_write(struct phylink
*pl
, unsigned int phy_id
,
1409 unsigned int reg
, unsigned int val
)
1411 struct phy_device
*phydev
= pl
->phydev
;
1414 if (mdio_phy_id_is_c45(phy_id
)) {
1415 prtad
= mdio_phy_id_prtad(phy_id
);
1416 devad
= mdio_phy_id_devad(phy_id
);
1417 devad
= MII_ADDR_C45
| devad
<< 16 | reg
;
1418 } else if (phydev
->is_c45
) {
1424 devad
= __ffs(phydev
->c45_ids
.devices_in_package
);
1428 if (!(phydev
->c45_ids
.devices_in_package
& MDIO_DEVS_AN
))
1430 devad
= MDIO_MMD_AN
;
1431 if (reg
== MII_ADVERTISE
)
1432 reg
= MDIO_AN_ADVERTISE
;
1440 devad
= MII_ADDR_C45
| devad
<< 16 | reg
;
1446 return mdiobus_write(phydev
->mdio
.bus
, prtad
, devad
, val
);
1449 static int phylink_mii_read(struct phylink
*pl
, unsigned int phy_id
,
1452 struct phylink_link_state state
;
1455 switch (pl
->link_an_mode
) {
1458 phylink_get_fixed_state(pl
, &state
);
1459 val
= phylink_mii_emul_read(pl
->netdev
, reg
, &state
,
1469 val
= phylink_get_mac_state(pl
, &state
);
1473 val
= phylink_mii_emul_read(pl
->netdev
, reg
, &state
,
1479 return val
& 0xffff;
1482 static int phylink_mii_write(struct phylink
*pl
, unsigned int phy_id
,
1483 unsigned int reg
, unsigned int val
)
1485 switch (pl
->link_an_mode
) {
1500 * phylink_mii_ioctl() - generic mii ioctl interface
1501 * @pl: a pointer to a &struct phylink returned from phylink_create()
1502 * @ifr: a pointer to a &struct ifreq for socket ioctls
1503 * @cmd: ioctl cmd to execute
1505 * Perform the specified MII ioctl on the PHY attached to the phylink instance
1506 * specified by @pl. If no PHY is attached, emulate the presence of the PHY.
1508 * Returns: zero on success or negative error code.
1511 * read register from the current PHY.
1513 * read register from the specified PHY.
1515 * set a register on the specified PHY.
1517 int phylink_mii_ioctl(struct phylink
*pl
, struct ifreq
*ifr
, int cmd
)
1519 struct mii_ioctl_data
*mii
= if_mii(ifr
);
1525 /* PHYs only exist for MLO_AN_PHY and SGMII */
1528 mii
->phy_id
= pl
->phydev
->mdio
.addr
;
1532 ret
= phylink_phy_read(pl
, mii
->phy_id
, mii
->reg_num
);
1540 ret
= phylink_phy_write(pl
, mii
->phy_id
, mii
->reg_num
,
1545 ret
= phy_mii_ioctl(pl
->phydev
, ifr
, cmd
);
1555 ret
= phylink_mii_read(pl
, mii
->phy_id
, mii
->reg_num
);
1563 ret
= phylink_mii_write(pl
, mii
->phy_id
, mii
->reg_num
,
1575 EXPORT_SYMBOL_GPL(phylink_mii_ioctl
);
1577 static int phylink_sfp_module_insert(void *upstream
,
1578 const struct sfp_eeprom_id
*id
)
1580 struct phylink
*pl
= upstream
;
1581 __ETHTOOL_DECLARE_LINK_MODE_MASK(support
) = { 0, };
1582 struct phylink_link_state config
;
1583 phy_interface_t iface
;
1590 sfp_parse_support(pl
->sfp_bus
, id
, support
);
1591 port
= sfp_parse_port(pl
->sfp_bus
, id
, support
);
1593 memset(&config
, 0, sizeof(config
));
1594 linkmode_copy(config
.advertising
, support
);
1595 config
.interface
= PHY_INTERFACE_MODE_NA
;
1596 config
.speed
= SPEED_UNKNOWN
;
1597 config
.duplex
= DUPLEX_UNKNOWN
;
1598 config
.pause
= MLO_PAUSE_AN
;
1599 config
.an_enabled
= pl
->link_config
.an_enabled
;
1601 /* Ignore errors if we're expecting a PHY to attach later */
1602 ret
= phylink_validate(pl
, support
, &config
);
1604 netdev_err(pl
->netdev
, "validation with support %*pb failed: %d\n",
1605 __ETHTOOL_LINK_MODE_MASK_NBITS
, support
, ret
);
1609 iface
= sfp_select_interface(pl
->sfp_bus
, id
, config
.advertising
);
1610 if (iface
== PHY_INTERFACE_MODE_NA
) {
1611 netdev_err(pl
->netdev
,
1612 "selection of interface failed, advertisement %*pb\n",
1613 __ETHTOOL_LINK_MODE_MASK_NBITS
, config
.advertising
);
1617 config
.interface
= iface
;
1618 ret
= phylink_validate(pl
, support
, &config
);
1620 netdev_err(pl
->netdev
, "validation of %s/%s with support %*pb failed: %d\n",
1621 phylink_an_mode_str(MLO_AN_INBAND
),
1622 phy_modes(config
.interface
),
1623 __ETHTOOL_LINK_MODE_MASK_NBITS
, support
, ret
);
1627 netdev_dbg(pl
->netdev
, "requesting link mode %s/%s with support %*pb\n",
1628 phylink_an_mode_str(MLO_AN_INBAND
),
1629 phy_modes(config
.interface
),
1630 __ETHTOOL_LINK_MODE_MASK_NBITS
, support
);
1632 if (phy_interface_mode_is_8023z(iface
) && pl
->phydev
)
1635 changed
= !bitmap_equal(pl
->supported
, support
,
1636 __ETHTOOL_LINK_MODE_MASK_NBITS
);
1638 linkmode_copy(pl
->supported
, support
);
1639 linkmode_copy(pl
->link_config
.advertising
, config
.advertising
);
1642 if (pl
->link_an_mode
!= MLO_AN_INBAND
||
1643 pl
->link_config
.interface
!= config
.interface
) {
1644 pl
->link_config
.interface
= config
.interface
;
1645 pl
->link_an_mode
= MLO_AN_INBAND
;
1649 netdev_info(pl
->netdev
, "switched to %s/%s link mode\n",
1650 phylink_an_mode_str(MLO_AN_INBAND
),
1651 phy_modes(config
.interface
));
1654 pl
->link_port
= port
;
1656 if (changed
&& !test_bit(PHYLINK_DISABLE_STOPPED
,
1657 &pl
->phylink_disable_state
))
1658 phylink_mac_config(pl
, &pl
->link_config
);
1663 static void phylink_sfp_link_down(void *upstream
)
1665 struct phylink
*pl
= upstream
;
1669 phylink_run_resolve_and_disable(pl
, PHYLINK_DISABLE_LINK
);
1672 static void phylink_sfp_link_up(void *upstream
)
1674 struct phylink
*pl
= upstream
;
1678 clear_bit(PHYLINK_DISABLE_LINK
, &pl
->phylink_disable_state
);
1679 phylink_run_resolve(pl
);
1682 static int phylink_sfp_connect_phy(void *upstream
, struct phy_device
*phy
)
1684 struct phylink
*pl
= upstream
;
1686 return __phylink_connect_phy(upstream
, phy
, pl
->link_config
.interface
);
1689 static void phylink_sfp_disconnect_phy(void *upstream
)
1691 phylink_disconnect_phy(upstream
);
1694 static const struct sfp_upstream_ops sfp_phylink_ops
= {
1695 .module_insert
= phylink_sfp_module_insert
,
1696 .link_up
= phylink_sfp_link_up
,
1697 .link_down
= phylink_sfp_link_down
,
1698 .connect_phy
= phylink_sfp_connect_phy
,
1699 .disconnect_phy
= phylink_sfp_disconnect_phy
,
1702 /* Helpers for MAC drivers */
1705 * phylink_helper_basex_speed() - 1000BaseX/2500BaseX helper
1706 * @state: a pointer to a &struct phylink_link_state
1708 * Inspect the interface mode, advertising mask or forced speed and
1709 * decide whether to run at 2.5Gbit or 1Gbit appropriately, switching
1710 * the interface mode to suit. @state->interface is appropriately
1711 * updated, and the advertising mask has the "other" baseX_Full flag
1714 void phylink_helper_basex_speed(struct phylink_link_state
*state
)
1716 if (phy_interface_mode_is_8023z(state
->interface
)) {
1717 bool want_2500
= state
->an_enabled
?
1718 phylink_test(state
->advertising
, 2500baseX_Full
) :
1719 state
->speed
== SPEED_2500
;
1722 phylink_clear(state
->advertising
, 1000baseX_Full
);
1723 state
->interface
= PHY_INTERFACE_MODE_2500BASEX
;
1725 phylink_clear(state
->advertising
, 2500baseX_Full
);
1726 state
->interface
= PHY_INTERFACE_MODE_1000BASEX
;
1730 EXPORT_SYMBOL_GPL(phylink_helper_basex_speed
);
1732 MODULE_LICENSE("GPL v2");