@@ -1011,6 +1011,28 @@ ice_ptp_release_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx)
1011
1011
tx -> len = 0 ;
1012
1012
}
1013
1013
1014
+ /**
1015
+ * ice_ptp_init_tx_eth56g - Initialize tracking for Tx timestamps
1016
+ * @pf: Board private structure
1017
+ * @tx: the Tx tracking structure to initialize
1018
+ * @port: the port this structure tracks
1019
+ *
1020
+ * Initialize the Tx timestamp tracker for this port. ETH56G PHYs
1021
+ * have independent memory blocks for all ports.
1022
+ *
1023
+ * Return: 0 for success, -ENOMEM when failed to allocate Tx tracker
1024
+ */
1025
+ static int ice_ptp_init_tx_eth56g (struct ice_pf * pf , struct ice_ptp_tx * tx ,
1026
+ u8 port )
1027
+ {
1028
+ tx -> block = port ;
1029
+ tx -> offset = 0 ;
1030
+ tx -> len = INDEX_PER_PORT_ETH56G ;
1031
+ tx -> has_ready_bitmap = 1 ;
1032
+
1033
+ return ice_ptp_alloc_tx_tracker (tx );
1034
+ }
1035
+
1014
1036
/**
1015
1037
* ice_ptp_init_tx_e82x - Initialize tracking for Tx timestamps
1016
1038
* @pf: Board private structure
@@ -1341,10 +1363,19 @@ ice_ptp_port_phy_stop(struct ice_ptp_port *ptp_port)
1341
1363
1342
1364
mutex_lock (& ptp_port -> ps_lock );
1343
1365
1344
- kthread_cancel_delayed_work_sync (& ptp_port -> ov_work );
1366
+ switch (hw -> ptp .phy_model ) {
1367
+ case ICE_PHY_ETH56G :
1368
+ err = ice_stop_phy_timer_eth56g (hw , port , true);
1369
+ break ;
1370
+ case ICE_PHY_E82X :
1371
+ kthread_cancel_delayed_work_sync (& ptp_port -> ov_work );
1345
1372
1346
- err = ice_stop_phy_timer_e82x (hw , port , true);
1347
- if (err )
1373
+ err = ice_stop_phy_timer_e82x (hw , port , true);
1374
+ break ;
1375
+ default :
1376
+ err = - ENODEV ;
1377
+ }
1378
+ if (err && err != - EBUSY )
1348
1379
dev_err (ice_pf_to_dev (pf ), "PTP failed to set PHY port %d down, err %d\n" ,
1349
1380
port , err );
1350
1381
@@ -1378,27 +1409,39 @@ ice_ptp_port_phy_restart(struct ice_ptp_port *ptp_port)
1378
1409
1379
1410
mutex_lock (& ptp_port -> ps_lock );
1380
1411
1381
- kthread_cancel_delayed_work_sync (& ptp_port -> ov_work );
1412
+ switch (hw -> ptp .phy_model ) {
1413
+ case ICE_PHY_ETH56G :
1414
+ err = ice_start_phy_timer_eth56g (hw , port );
1415
+ break ;
1416
+ case ICE_PHY_E82X :
1417
+ /* Start the PHY timer in Vernier mode */
1418
+ kthread_cancel_delayed_work_sync (& ptp_port -> ov_work );
1382
1419
1383
- /* temporarily disable Tx timestamps while calibrating PHY offset */
1384
- spin_lock_irqsave (& ptp_port -> tx .lock , flags );
1385
- ptp_port -> tx .calibrating = true;
1386
- spin_unlock_irqrestore (& ptp_port -> tx .lock , flags );
1387
- ptp_port -> tx_fifo_busy_cnt = 0 ;
1420
+ /* temporarily disable Tx timestamps while calibrating
1421
+ * PHY offset
1422
+ */
1423
+ spin_lock_irqsave (& ptp_port -> tx .lock , flags );
1424
+ ptp_port -> tx .calibrating = true;
1425
+ spin_unlock_irqrestore (& ptp_port -> tx .lock , flags );
1426
+ ptp_port -> tx_fifo_busy_cnt = 0 ;
1388
1427
1389
- /* Start the PHY timer in Vernier mode */
1390
- err = ice_start_phy_timer_e82x (hw , port );
1391
- if (err )
1392
- goto out_unlock ;
1428
+ /* Start the PHY timer in Vernier mode */
1429
+ err = ice_start_phy_timer_e82x (hw , port );
1430
+ if (err )
1431
+ break ;
1393
1432
1394
- /* Enable Tx timestamps right away */
1395
- spin_lock_irqsave (& ptp_port -> tx .lock , flags );
1396
- ptp_port -> tx .calibrating = false;
1397
- spin_unlock_irqrestore (& ptp_port -> tx .lock , flags );
1433
+ /* Enable Tx timestamps right away */
1434
+ spin_lock_irqsave (& ptp_port -> tx .lock , flags );
1435
+ ptp_port -> tx .calibrating = false;
1436
+ spin_unlock_irqrestore (& ptp_port -> tx .lock , flags );
1398
1437
1399
- kthread_queue_delayed_work (pf -> ptp .kworker , & ptp_port -> ov_work , 0 );
1438
+ kthread_queue_delayed_work (pf -> ptp .kworker , & ptp_port -> ov_work ,
1439
+ 0 );
1440
+ break ;
1441
+ default :
1442
+ err = - ENODEV ;
1443
+ }
1400
1444
1401
- out_unlock :
1402
1445
if (err )
1403
1446
dev_err (ice_pf_to_dev (pf ), "PTP failed to set PHY port %d up, err %d\n" ,
1404
1447
port , err );
@@ -1436,6 +1479,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
1436
1479
case ICE_PHY_E810 :
1437
1480
/* Do not reconfigure E810 PHY */
1438
1481
return ;
1482
+ case ICE_PHY_ETH56G :
1439
1483
case ICE_PHY_E82X :
1440
1484
ice_ptp_port_phy_restart (ptp_port );
1441
1485
return ;
@@ -1465,6 +1509,22 @@ static int ice_ptp_cfg_phy_interrupt(struct ice_pf *pf, bool ena, u32 threshold)
1465
1509
ice_ptp_reset_ts_memory (hw );
1466
1510
1467
1511
switch (hw -> ptp .phy_model ) {
1512
+ case ICE_PHY_ETH56G : {
1513
+ int port ;
1514
+
1515
+ for (port = 0 ; port < hw -> ptp .num_lports ; port ++ ) {
1516
+ int err ;
1517
+
1518
+ err = ice_phy_cfg_intr_eth56g (hw , port , ena , threshold );
1519
+ if (err ) {
1520
+ dev_err (dev , "Failed to configure PHY interrupt for port %d, err %d\n" ,
1521
+ port , err );
1522
+ return err ;
1523
+ }
1524
+ }
1525
+
1526
+ return 0 ;
1527
+ }
1468
1528
case ICE_PHY_E82X : {
1469
1529
int quad ;
1470
1530
@@ -3075,6 +3135,9 @@ static int ice_ptp_init_port(struct ice_pf *pf, struct ice_ptp_port *ptp_port)
3075
3135
mutex_init (& ptp_port -> ps_lock );
3076
3136
3077
3137
switch (hw -> ptp .phy_model ) {
3138
+ case ICE_PHY_ETH56G :
3139
+ return ice_ptp_init_tx_eth56g (pf , & ptp_port -> tx ,
3140
+ ptp_port -> port_num );
3078
3141
case ICE_PHY_E810 :
3079
3142
return ice_ptp_init_tx_e810 (pf , & ptp_port -> tx );
3080
3143
case ICE_PHY_E82X :
0 commit comments