@@ -15,6 +15,18 @@ static int phy_mode(enum dpmac_eth_if eth_if, phy_interface_t *if_mode)
15
15
case DPMAC_ETH_IF_RGMII :
16
16
* if_mode = PHY_INTERFACE_MODE_RGMII ;
17
17
break ;
18
+ case DPMAC_ETH_IF_USXGMII :
19
+ * if_mode = PHY_INTERFACE_MODE_USXGMII ;
20
+ break ;
21
+ case DPMAC_ETH_IF_QSGMII :
22
+ * if_mode = PHY_INTERFACE_MODE_QSGMII ;
23
+ break ;
24
+ case DPMAC_ETH_IF_SGMII :
25
+ * if_mode = PHY_INTERFACE_MODE_SGMII ;
26
+ break ;
27
+ case DPMAC_ETH_IF_XFI :
28
+ * if_mode = PHY_INTERFACE_MODE_10GBASER ;
29
+ break ;
18
30
default :
19
31
return - EINVAL ;
20
32
}
@@ -67,6 +79,10 @@ static bool dpaa2_mac_phy_mode_mismatch(struct dpaa2_mac *mac,
67
79
phy_interface_t interface )
68
80
{
69
81
switch (interface ) {
82
+ case PHY_INTERFACE_MODE_10GBASER :
83
+ case PHY_INTERFACE_MODE_USXGMII :
84
+ case PHY_INTERFACE_MODE_QSGMII :
85
+ case PHY_INTERFACE_MODE_SGMII :
70
86
case PHY_INTERFACE_MODE_RGMII :
71
87
case PHY_INTERFACE_MODE_RGMII_ID :
72
88
case PHY_INTERFACE_MODE_RGMII_RXID :
@@ -95,6 +111,17 @@ static void dpaa2_mac_validate(struct phylink_config *config,
95
111
phylink_set (mask , Asym_Pause );
96
112
97
113
switch (state -> interface ) {
114
+ case PHY_INTERFACE_MODE_NA :
115
+ case PHY_INTERFACE_MODE_10GBASER :
116
+ case PHY_INTERFACE_MODE_USXGMII :
117
+ phylink_set (mask , 10000b aseT_Full );
118
+ if (state -> interface == PHY_INTERFACE_MODE_10GBASER )
119
+ break ;
120
+ phylink_set (mask , 5000b aseT_Full );
121
+ phylink_set (mask , 2500b aseT_Full );
122
+ fallthrough ;
123
+ case PHY_INTERFACE_MODE_SGMII :
124
+ case PHY_INTERFACE_MODE_QSGMII :
98
125
case PHY_INTERFACE_MODE_RGMII :
99
126
case PHY_INTERFACE_MODE_RGMII_ID :
100
127
case PHY_INTERFACE_MODE_RGMII_RXID :
@@ -227,6 +254,52 @@ bool dpaa2_mac_is_type_fixed(struct fsl_mc_device *dpmac_dev,
227
254
return fixed ;
228
255
}
229
256
257
+ static int dpaa2_pcs_create (struct dpaa2_mac * mac ,
258
+ struct device_node * dpmac_node , int id )
259
+ {
260
+ struct mdio_device * mdiodev ;
261
+ struct device_node * node ;
262
+
263
+ node = of_parse_phandle (dpmac_node , "pcs-handle" , 0 );
264
+ if (!node ) {
265
+ /* do not error out on old DTS files */
266
+ netdev_warn (mac -> net_dev , "pcs-handle node not found\n" );
267
+ return 0 ;
268
+ }
269
+
270
+ if (!of_device_is_available (node ) ||
271
+ !of_device_is_available (node -> parent )) {
272
+ netdev_err (mac -> net_dev , "pcs-handle node not available\n" );
273
+ return - ENODEV ;
274
+ }
275
+
276
+ mdiodev = of_mdio_find_device (node );
277
+ of_node_put (node );
278
+ if (!mdiodev )
279
+ return - EPROBE_DEFER ;
280
+
281
+ mac -> pcs = lynx_pcs_create (mdiodev );
282
+ if (!mac -> pcs ) {
283
+ netdev_err (mac -> net_dev , "lynx_pcs_create() failed\n" );
284
+ put_device (& mdiodev -> dev );
285
+ return - ENOMEM ;
286
+ }
287
+
288
+ return 0 ;
289
+ }
290
+
291
+ static void dpaa2_pcs_destroy (struct dpaa2_mac * mac )
292
+ {
293
+ struct lynx_pcs * pcs = mac -> pcs ;
294
+ struct device * dev = & pcs -> mdio -> dev ;
295
+
296
+ if (pcs ) {
297
+ lynx_pcs_destroy (pcs );
298
+ put_device (dev );
299
+ mac -> pcs = NULL ;
300
+ }
301
+ }
302
+
230
303
int dpaa2_mac_connect (struct dpaa2_mac * mac )
231
304
{
232
305
struct fsl_mc_device * dpmac_dev = mac -> mc_dev ;
@@ -278,6 +351,13 @@ int dpaa2_mac_connect(struct dpaa2_mac *mac)
278
351
goto err_put_node ;
279
352
}
280
353
354
+ if (attr .link_type == DPMAC_LINK_TYPE_PHY &&
355
+ attr .eth_if != DPMAC_ETH_IF_RGMII ) {
356
+ err = dpaa2_pcs_create (mac , dpmac_node , attr .id );
357
+ if (err )
358
+ goto err_put_node ;
359
+ }
360
+
281
361
mac -> phylink_config .dev = & net_dev -> dev ;
282
362
mac -> phylink_config .type = PHYLINK_NETDEV ;
283
363
@@ -286,10 +366,13 @@ int dpaa2_mac_connect(struct dpaa2_mac *mac)
286
366
& dpaa2_mac_phylink_ops );
287
367
if (IS_ERR (phylink )) {
288
368
err = PTR_ERR (phylink );
289
- goto err_put_node ;
369
+ goto err_pcs_destroy ;
290
370
}
291
371
mac -> phylink = phylink ;
292
372
373
+ if (mac -> pcs )
374
+ phylink_set_pcs (mac -> phylink , & mac -> pcs -> pcs );
375
+
293
376
err = phylink_of_phy_connect (mac -> phylink , dpmac_node , 0 );
294
377
if (err ) {
295
378
netdev_err (net_dev , "phylink_of_phy_connect() = %d\n" , err );
@@ -302,6 +385,8 @@ int dpaa2_mac_connect(struct dpaa2_mac *mac)
302
385
303
386
err_phylink_destroy :
304
387
phylink_destroy (mac -> phylink );
388
+ err_pcs_destroy :
389
+ dpaa2_pcs_destroy (mac );
305
390
err_put_node :
306
391
of_node_put (dpmac_node );
307
392
err_close_dpmac :
@@ -316,6 +401,8 @@ void dpaa2_mac_disconnect(struct dpaa2_mac *mac)
316
401
317
402
phylink_disconnect_phy (mac -> phylink );
318
403
phylink_destroy (mac -> phylink );
404
+ dpaa2_pcs_destroy (mac );
405
+
319
406
dpmac_close (mac -> mc_io , 0 , mac -> mc_dev -> mc_handle );
320
407
}
321
408
0 commit comments