1717#include "b53_serdes.h"
1818#include "b53_regs.h"
1919
20+ static inline struct b53_pcs * pcs_to_b53_pcs (struct phylink_pcs * pcs )
21+ {
22+ return container_of (pcs , struct b53_pcs , pcs );
23+ }
24+
2025static void b53_serdes_write_blk (struct b53_device * dev , u8 offset , u16 block ,
2126 u16 value )
2227{
@@ -60,51 +65,47 @@ static u16 b53_serdes_read(struct b53_device *dev, u8 lane,
6065 return b53_serdes_read_blk (dev , offset , block );
6166}
6267
63- void b53_serdes_config (struct b53_device * dev , int port , unsigned int mode ,
64- const struct phylink_link_state * state )
68+ static int b53_serdes_config (struct phylink_pcs * pcs , unsigned int mode ,
69+ phy_interface_t interface ,
70+ const unsigned long * advertising ,
71+ bool permit_pause_to_mac )
6572{
66- u8 lane = b53_serdes_map_lane (dev , port );
73+ struct b53_device * dev = pcs_to_b53_pcs (pcs )-> dev ;
74+ u8 lane = pcs_to_b53_pcs (pcs )-> lane ;
6775 u16 reg ;
6876
69- if (lane == B53_INVALID_LANE )
70- return ;
71-
7277 reg = b53_serdes_read (dev , lane , B53_SERDES_DIGITAL_CONTROL (1 ),
7378 SERDES_DIGITAL_BLK );
74- if (state -> interface == PHY_INTERFACE_MODE_1000BASEX )
79+ if (interface == PHY_INTERFACE_MODE_1000BASEX )
7580 reg |= FIBER_MODE_1000X ;
7681 else
7782 reg &= ~FIBER_MODE_1000X ;
7883 b53_serdes_write (dev , lane , B53_SERDES_DIGITAL_CONTROL (1 ),
7984 SERDES_DIGITAL_BLK , reg );
85+
86+ return 0 ;
8087}
81- EXPORT_SYMBOL (b53_serdes_config );
8288
83- void b53_serdes_an_restart (struct b53_device * dev , int port )
89+ static void b53_serdes_an_restart (struct phylink_pcs * pcs )
8490{
85- u8 lane = b53_serdes_map_lane (dev , port );
91+ struct b53_device * dev = pcs_to_b53_pcs (pcs )-> dev ;
92+ u8 lane = pcs_to_b53_pcs (pcs )-> lane ;
8693 u16 reg ;
8794
88- if (lane == B53_INVALID_LANE )
89- return ;
90-
9195 reg = b53_serdes_read (dev , lane , B53_SERDES_MII_REG (MII_BMCR ),
9296 SERDES_MII_BLK );
9397 reg |= BMCR_ANRESTART ;
9498 b53_serdes_write (dev , lane , B53_SERDES_MII_REG (MII_BMCR ),
9599 SERDES_MII_BLK , reg );
96100}
97- EXPORT_SYMBOL (b53_serdes_an_restart );
98101
99- int b53_serdes_link_state (struct b53_device * dev , int port ,
100- struct phylink_link_state * state )
102+ static void b53_serdes_get_state (struct phylink_pcs * pcs ,
103+ struct phylink_link_state * state )
101104{
102- u8 lane = b53_serdes_map_lane (dev , port );
105+ struct b53_device * dev = pcs_to_b53_pcs (pcs )-> dev ;
106+ u8 lane = pcs_to_b53_pcs (pcs )-> lane ;
103107 u16 dig , bmsr ;
104108
105- if (lane == B53_INVALID_LANE )
106- return 1 ;
107-
108109 dig = b53_serdes_read (dev , lane , B53_SERDES_DIGITAL_STATUS ,
109110 SERDES_DIGITAL_BLK );
110111 bmsr = b53_serdes_read (dev , lane , B53_SERDES_MII_REG (MII_BMSR ),
@@ -133,10 +134,7 @@ int b53_serdes_link_state(struct b53_device *dev, int port,
133134 state -> pause |= MLO_PAUSE_RX ;
134135 if (dig & PAUSE_RESOLUTION_TX_SIDE )
135136 state -> pause |= MLO_PAUSE_TX ;
136-
137- return 0 ;
138137}
139- EXPORT_SYMBOL (b53_serdes_link_state );
140138
141139void b53_serdes_link_set (struct b53_device * dev , int port , unsigned int mode ,
142140 phy_interface_t interface , bool link_up )
@@ -158,6 +156,12 @@ void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode,
158156}
159157EXPORT_SYMBOL (b53_serdes_link_set );
160158
159+ static const struct phylink_pcs_ops b53_pcs_ops = {
160+ .pcs_get_state = b53_serdes_get_state ,
161+ .pcs_config = b53_serdes_config ,
162+ .pcs_an_restart = b53_serdes_an_restart ,
163+ };
164+
161165void b53_serdes_phylink_get_caps (struct b53_device * dev , int port ,
162166 struct phylink_config * config )
163167{
@@ -187,9 +191,28 @@ void b53_serdes_phylink_get_caps(struct b53_device *dev, int port,
187191}
188192EXPORT_SYMBOL (b53_serdes_phylink_get_caps );
189193
194+ struct phylink_pcs * b53_serdes_phylink_mac_select_pcs (struct b53_device * dev ,
195+ int port ,
196+ phy_interface_t interface )
197+ {
198+ u8 lane = b53_serdes_map_lane (dev , port );
199+
200+ if (lane == B53_INVALID_LANE || lane >= B53_N_PCS ||
201+ !dev -> pcs [lane ].dev )
202+ return NULL ;
203+
204+ if (!phy_interface_mode_is_8023z (interface ) &&
205+ interface != PHY_INTERFACE_MODE_SGMII )
206+ return NULL ;
207+
208+ return & dev -> pcs [lane ].pcs ;
209+ }
210+ EXPORT_SYMBOL (b53_serdes_phylink_mac_select_pcs );
211+
190212int b53_serdes_init (struct b53_device * dev , int port )
191213{
192214 u8 lane = b53_serdes_map_lane (dev , port );
215+ struct b53_pcs * pcs ;
193216 u16 id0 , msb , lsb ;
194217
195218 if (lane == B53_INVALID_LANE )
@@ -212,6 +235,11 @@ int b53_serdes_init(struct b53_device *dev, int port)
212235 (id0 >> SERDES_ID0_REV_NUM_SHIFT ) & SERDES_ID0_REV_NUM_MASK ,
213236 (u32 )msb << 16 | lsb );
214237
238+ pcs = & dev -> pcs [lane ];
239+ pcs -> dev = dev ;
240+ pcs -> lane = lane ;
241+ pcs -> pcs .ops = & b53_pcs_ops ;
242+
215243 return 0 ;
216244}
217245EXPORT_SYMBOL (b53_serdes_init );
0 commit comments