Skip to content

Commit 52323ef

Browse files
Cahbdavem330
authored andcommitted
net: marvell: prestera: add phylink support
For SFP port prestera driver will use kernel phylink infrastucture to configure port mode based on the module that has beed inserted Co-developed-by: Yevhen Orlov <[email protected]> Signed-off-by: Yevhen Orlov <[email protected]> Co-developed-by: Taras Chornyi <[email protected]> Signed-off-by: Taras Chornyi <[email protected]> Signed-off-by: Oleksandr Mazur <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ffcdd11 commit 52323ef

File tree

5 files changed

+334
-62
lines changed

5 files changed

+334
-62
lines changed

drivers/net/ethernet/marvell/prestera/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ config PRESTERA
88
depends on NET_SWITCHDEV && VLAN_8021Q
99
depends on BRIDGE || BRIDGE=n
1010
select NET_DEVLINK
11+
select PHYLINK
1112
help
1213
This driver supports Marvell Prestera Switch ASICs family.
1314

drivers/net/ethernet/marvell/prestera/prestera.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <linux/notifier.h>
88
#include <linux/skbuff.h>
99
#include <linux/workqueue.h>
10+
#include <linux/phylink.h>
1011
#include <net/devlink.h>
1112
#include <uapi/linux/if_ether.h>
1213

@@ -92,6 +93,7 @@ struct prestera_lag {
9293
struct prestera_flow_block;
9394

9495
struct prestera_port_mac_state {
96+
bool valid;
9597
u32 mode;
9698
u32 speed;
9799
bool oper;
@@ -151,6 +153,13 @@ struct prestera_port {
151153
struct prestera_port_phy_config cfg_phy;
152154
struct prestera_port_mac_state state_mac;
153155
struct prestera_port_phy_state state_phy;
156+
157+
struct phylink_config phy_config;
158+
struct phylink *phy_link;
159+
struct phylink_pcs phylink_pcs;
160+
161+
/* protects state_mac */
162+
spinlock_t state_mac_lock;
154163
};
155164

156165
struct prestera_device {
@@ -291,6 +300,7 @@ struct prestera_switch {
291300
u32 mtu_min;
292301
u32 mtu_max;
293302
u8 id;
303+
struct device_node *np;
294304
struct prestera_router *router;
295305
struct prestera_lag *lags;
296306
struct prestera_counter *counter;

drivers/net/ethernet/marvell/prestera/prestera_ethtool.c

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,9 @@ prestera_ethtool_get_link_ksettings(struct net_device *dev,
521521
ecmd->base.speed = SPEED_UNKNOWN;
522522
ecmd->base.duplex = DUPLEX_UNKNOWN;
523523

524+
if (port->phy_link)
525+
return phylink_ethtool_ksettings_get(port->phy_link, ecmd);
526+
524527
ecmd->base.autoneg = port->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
525528

526529
if (port->caps.type == PRESTERA_PORT_TYPE_TP) {
@@ -648,6 +651,9 @@ prestera_ethtool_set_link_ksettings(struct net_device *dev,
648651
u8 adver_fec;
649652
int err;
650653

654+
if (port->phy_link)
655+
return phylink_ethtool_ksettings_set(port->phy_link, ecmd);
656+
651657
err = prestera_port_type_set(ecmd, port);
652658
if (err)
653659
return err;
@@ -782,28 +788,6 @@ static int prestera_ethtool_nway_reset(struct net_device *dev)
782788
return -EINVAL;
783789
}
784790

785-
void prestera_ethtool_port_state_changed(struct prestera_port *port,
786-
struct prestera_port_event *evt)
787-
{
788-
struct prestera_port_mac_state *smac = &port->state_mac;
789-
790-
smac->oper = evt->data.mac.oper;
791-
792-
if (smac->oper) {
793-
smac->mode = evt->data.mac.mode;
794-
smac->speed = evt->data.mac.speed;
795-
smac->duplex = evt->data.mac.duplex;
796-
smac->fc = evt->data.mac.fc;
797-
smac->fec = evt->data.mac.fec;
798-
} else {
799-
smac->mode = PRESTERA_MAC_MODE_MAX;
800-
smac->speed = SPEED_UNKNOWN;
801-
smac->duplex = DUPLEX_UNKNOWN;
802-
smac->fc = 0;
803-
smac->fec = 0;
804-
}
805-
}
806-
807791
const struct ethtool_ops prestera_ethtool_ops = {
808792
.get_drvinfo = prestera_ethtool_get_drvinfo,
809793
.get_link_ksettings = prestera_ethtool_get_link_ksettings,

drivers/net/ethernet/marvell/prestera/prestera_ethtool.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,4 @@ struct prestera_port;
1111

1212
extern const struct ethtool_ops prestera_ethtool_ops;
1313

14-
void prestera_ethtool_port_state_changed(struct prestera_port *port,
15-
struct prestera_port_event *evt);
16-
1714
#endif /* _PRESTERA_ETHTOOL_H_ */

0 commit comments

Comments
 (0)