xref: /linux/drivers/net/ethernet/stmicro/stmmac/stmmac_pcs.c (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
12c81f335SRussell King (Oracle) // SPDX-License-Identifier: GPL-2.0-only
22c81f335SRussell King (Oracle) #include "stmmac.h"
32c81f335SRussell King (Oracle) #include "stmmac_pcs.h"
42c81f335SRussell King (Oracle) 
5*eed68edaSRussell King (Oracle) static int dwmac_integrated_pcs_enable(struct phylink_pcs *pcs)
6*eed68edaSRussell King (Oracle) {
7*eed68edaSRussell King (Oracle) 	struct stmmac_pcs *spcs = phylink_pcs_to_stmmac_pcs(pcs);
8*eed68edaSRussell King (Oracle) 
9*eed68edaSRussell King (Oracle) 	stmmac_mac_irq_modify(spcs->priv, 0, spcs->int_mask);
10*eed68edaSRussell King (Oracle) 
11*eed68edaSRussell King (Oracle) 	return 0;
12*eed68edaSRussell King (Oracle) }
13*eed68edaSRussell King (Oracle) 
14*eed68edaSRussell King (Oracle) static void dwmac_integrated_pcs_disable(struct phylink_pcs *pcs)
15*eed68edaSRussell King (Oracle) {
16*eed68edaSRussell King (Oracle) 	struct stmmac_pcs *spcs = phylink_pcs_to_stmmac_pcs(pcs);
17*eed68edaSRussell King (Oracle) 
18*eed68edaSRussell King (Oracle) 	stmmac_mac_irq_modify(spcs->priv, spcs->int_mask, 0);
19*eed68edaSRussell King (Oracle) }
20*eed68edaSRussell King (Oracle) 
212c81f335SRussell King (Oracle) static void dwmac_integrated_pcs_get_state(struct phylink_pcs *pcs,
222c81f335SRussell King (Oracle) 					   unsigned int neg_mode,
232c81f335SRussell King (Oracle) 					   struct phylink_link_state *state)
242c81f335SRussell King (Oracle) {
252c81f335SRussell King (Oracle) 	state->link = false;
262c81f335SRussell King (Oracle) }
272c81f335SRussell King (Oracle) 
282c81f335SRussell King (Oracle) static int dwmac_integrated_pcs_config(struct phylink_pcs *pcs,
292c81f335SRussell King (Oracle) 				       unsigned int neg_mode,
302c81f335SRussell King (Oracle) 				       phy_interface_t interface,
312c81f335SRussell King (Oracle) 				       const unsigned long *advertising,
322c81f335SRussell King (Oracle) 				       bool permit_pause_to_mac)
332c81f335SRussell King (Oracle) {
342c81f335SRussell King (Oracle) 	struct stmmac_pcs *spcs = phylink_pcs_to_stmmac_pcs(pcs);
352c81f335SRussell King (Oracle) 
362c81f335SRussell King (Oracle) 	dwmac_ctrl_ane(spcs->base, 0, 1, spcs->priv->hw->reverse_sgmii_enable);
372c81f335SRussell King (Oracle) 
382c81f335SRussell King (Oracle) 	return 0;
392c81f335SRussell King (Oracle) }
402c81f335SRussell King (Oracle) 
412c81f335SRussell King (Oracle) static const struct phylink_pcs_ops dwmac_integrated_pcs_ops = {
42*eed68edaSRussell King (Oracle) 	.pcs_enable = dwmac_integrated_pcs_enable,
43*eed68edaSRussell King (Oracle) 	.pcs_disable = dwmac_integrated_pcs_disable,
442c81f335SRussell King (Oracle) 	.pcs_get_state = dwmac_integrated_pcs_get_state,
452c81f335SRussell King (Oracle) 	.pcs_config = dwmac_integrated_pcs_config,
462c81f335SRussell King (Oracle) };
472c81f335SRussell King (Oracle) 
48*eed68edaSRussell King (Oracle) int stmmac_integrated_pcs_init(struct stmmac_priv *priv, unsigned int offset,
49*eed68edaSRussell King (Oracle) 			       u32 int_mask)
502c81f335SRussell King (Oracle) {
512c81f335SRussell King (Oracle) 	struct stmmac_pcs *spcs;
522c81f335SRussell King (Oracle) 
532c81f335SRussell King (Oracle) 	spcs = devm_kzalloc(priv->device, sizeof(*spcs), GFP_KERNEL);
542c81f335SRussell King (Oracle) 	if (!spcs)
552c81f335SRussell King (Oracle) 		return -ENOMEM;
562c81f335SRussell King (Oracle) 
572c81f335SRussell King (Oracle) 	spcs->priv = priv;
582c81f335SRussell King (Oracle) 	spcs->base = priv->ioaddr + offset;
59*eed68edaSRussell King (Oracle) 	spcs->int_mask = int_mask;
602c81f335SRussell King (Oracle) 	spcs->pcs.ops = &dwmac_integrated_pcs_ops;
612c81f335SRussell King (Oracle) 
622c81f335SRussell King (Oracle) 	__set_bit(PHY_INTERFACE_MODE_SGMII, spcs->pcs.supported_interfaces);
632c81f335SRussell King (Oracle) 
642c81f335SRussell King (Oracle) 	priv->integrated_pcs = spcs;
652c81f335SRussell King (Oracle) 
662c81f335SRussell King (Oracle) 	return 0;
672c81f335SRussell King (Oracle) }
68