6
6
#include <linux/tcp.h>
7
7
#include <linux/udp.h>
8
8
#include <linux/vmalloc.h>
9
+ #include <linux/ptp_classify.h>
9
10
#include <net/pkt_sched.h>
10
11
11
12
static struct sk_buff * enetc_tx_swbd_get_skb (struct enetc_tx_swbd * tx_swbd )
@@ -67,15 +68,52 @@ static void enetc_update_tx_ring_tail(struct enetc_bdr *tx_ring)
67
68
enetc_wr_reg_hot (tx_ring -> tpir , tx_ring -> next_to_use );
68
69
}
69
70
71
+ static int enetc_ptp_parse (struct sk_buff * skb , u8 * udp ,
72
+ u8 * msgtype , u8 * twostep ,
73
+ u16 * correction_offset , u16 * body_offset )
74
+ {
75
+ unsigned int ptp_class ;
76
+ struct ptp_header * hdr ;
77
+ unsigned int type ;
78
+ u8 * base ;
79
+
80
+ ptp_class = ptp_classify_raw (skb );
81
+ if (ptp_class == PTP_CLASS_NONE )
82
+ return - EINVAL ;
83
+
84
+ hdr = ptp_parse_header (skb , ptp_class );
85
+ if (!hdr )
86
+ return - EINVAL ;
87
+
88
+ type = ptp_class & PTP_CLASS_PMASK ;
89
+ if (type == PTP_CLASS_IPV4 || type == PTP_CLASS_IPV6 )
90
+ * udp = 1 ;
91
+ else
92
+ * udp = 0 ;
93
+
94
+ * msgtype = ptp_get_msgtype (hdr , ptp_class );
95
+ * twostep = hdr -> flag_field [0 ] & 0x2 ;
96
+
97
+ base = skb_mac_header (skb );
98
+ * correction_offset = (u8 * )& hdr -> correction - base ;
99
+ * body_offset = (u8 * )hdr + sizeof (struct ptp_header ) - base ;
100
+
101
+ return 0 ;
102
+ }
103
+
70
104
static int enetc_map_tx_buffs (struct enetc_bdr * tx_ring , struct sk_buff * skb )
71
105
{
106
+ bool do_vlan , do_onestep_tstamp = false, do_twostep_tstamp = false;
107
+ struct enetc_ndev_priv * priv = netdev_priv (tx_ring -> ndev );
108
+ struct enetc_hw * hw = & priv -> si -> hw ;
72
109
struct enetc_tx_swbd * tx_swbd ;
73
- skb_frag_t * frag ;
74
110
int len = skb_headlen (skb );
75
111
union enetc_tx_bd temp_bd ;
112
+ u8 msgtype , twostep , udp ;
76
113
union enetc_tx_bd * txbd ;
77
- bool do_vlan , do_tstamp ;
114
+ u16 offset1 , offset2 ;
78
115
int i , count = 0 ;
116
+ skb_frag_t * frag ;
79
117
unsigned int f ;
80
118
dma_addr_t dma ;
81
119
u8 flags = 0 ;
@@ -100,12 +138,21 @@ static int enetc_map_tx_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb)
100
138
count ++ ;
101
139
102
140
do_vlan = skb_vlan_tag_present (skb );
103
- do_tstamp = (skb -> cb [0 ] & ENETC_F_TX_TSTAMP ) &&
104
- (skb_shinfo (skb )-> tx_flags & SKBTX_HW_TSTAMP );
105
- tx_swbd -> do_tstamp = do_tstamp ;
106
- tx_swbd -> check_wb = tx_swbd -> do_tstamp ;
141
+ if (skb -> cb [0 ] & ENETC_F_TX_ONESTEP_SYNC_TSTAMP ) {
142
+ if (enetc_ptp_parse (skb , & udp , & msgtype , & twostep , & offset1 ,
143
+ & offset2 ) ||
144
+ msgtype != PTP_MSGTYPE_SYNC || twostep )
145
+ WARN_ONCE (1 , "Bad packet for one-step timestamping\n" );
146
+ else
147
+ do_onestep_tstamp = true;
148
+ } else if (skb -> cb [0 ] & ENETC_F_TX_TSTAMP ) {
149
+ do_twostep_tstamp = true;
150
+ }
151
+
152
+ tx_swbd -> do_twostep_tstamp = do_twostep_tstamp ;
153
+ tx_swbd -> check_wb = tx_swbd -> do_twostep_tstamp ;
107
154
108
- if (do_vlan || do_tstamp )
155
+ if (do_vlan || do_onestep_tstamp || do_twostep_tstamp )
109
156
flags |= ENETC_TXBD_FLAGS_EX ;
110
157
111
158
if (tx_ring -> tsd_enable )
@@ -142,7 +189,40 @@ static int enetc_map_tx_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb)
142
189
e_flags |= ENETC_TXBD_E_FLAGS_VLAN_INS ;
143
190
}
144
191
145
- if (do_tstamp ) {
192
+ if (do_onestep_tstamp ) {
193
+ u32 lo , hi , val ;
194
+ u64 sec , nsec ;
195
+ u8 * data ;
196
+
197
+ lo = enetc_rd_hot (hw , ENETC_SICTR0 );
198
+ hi = enetc_rd_hot (hw , ENETC_SICTR1 );
199
+ sec = (u64 )hi << 32 | lo ;
200
+ nsec = do_div (sec , 1000000000 );
201
+
202
+ /* Configure extension BD */
203
+ temp_bd .ext .tstamp = cpu_to_le32 (lo & 0x3fffffff );
204
+ e_flags |= ENETC_TXBD_E_FLAGS_ONE_STEP_PTP ;
205
+
206
+ /* Update originTimestamp field of Sync packet
207
+ * - 48 bits seconds field
208
+ * - 32 bits nanseconds field
209
+ */
210
+ data = skb_mac_header (skb );
211
+ * (__be16 * )(data + offset2 ) =
212
+ htons ((sec >> 32 ) & 0xffff );
213
+ * (__be32 * )(data + offset2 + 2 ) =
214
+ htonl (sec & 0xffffffff );
215
+ * (__be32 * )(data + offset2 + 6 ) = htonl (nsec );
216
+
217
+ /* Configure single-step register */
218
+ val = ENETC_PM0_SINGLE_STEP_EN ;
219
+ val |= ENETC_SET_SINGLE_STEP_OFFSET (offset1 );
220
+ if (udp )
221
+ val |= ENETC_PM0_SINGLE_STEP_CH ;
222
+
223
+ enetc_port_wr (hw , ENETC_PM0_SINGLE_STEP , val );
224
+ enetc_port_wr (hw , ENETC_PM1_SINGLE_STEP , val );
225
+ } else if (do_twostep_tstamp ) {
146
226
skb_shinfo (skb )-> tx_flags |= SKBTX_IN_PROGRESS ;
147
227
e_flags |= ENETC_TXBD_E_FLAGS_TWO_STEP_PTP ;
148
228
}
@@ -214,15 +294,13 @@ static int enetc_map_tx_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb)
214
294
return 0 ;
215
295
}
216
296
217
- netdev_tx_t enetc_xmit (struct sk_buff * skb , struct net_device * ndev )
297
+ static netdev_tx_t enetc_start_xmit (struct sk_buff * skb ,
298
+ struct net_device * ndev )
218
299
{
219
300
struct enetc_ndev_priv * priv = netdev_priv (ndev );
220
301
struct enetc_bdr * tx_ring ;
221
302
int count ;
222
303
223
- /* cb[0] used for TX timestamp type */
224
- skb -> cb [0 ] = priv -> active_offloads & ENETC_F_TX_TSTAMP_MASK ;
225
-
226
304
tx_ring = priv -> tx_ring [skb -> queue_mapping ];
227
305
228
306
if (unlikely (skb_shinfo (skb )-> nr_frags > ENETC_MAX_SKB_FRAGS ))
@@ -252,6 +330,40 @@ netdev_tx_t enetc_xmit(struct sk_buff *skb, struct net_device *ndev)
252
330
return NETDEV_TX_OK ;
253
331
}
254
332
333
+ netdev_tx_t enetc_xmit (struct sk_buff * skb , struct net_device * ndev )
334
+ {
335
+ struct enetc_ndev_priv * priv = netdev_priv (ndev );
336
+ u8 udp , msgtype , twostep ;
337
+ u16 offset1 , offset2 ;
338
+
339
+ /* Mark tx timestamp type on skb->cb[0] if requires */
340
+ if ((skb_shinfo (skb )-> tx_flags & SKBTX_HW_TSTAMP ) &&
341
+ (priv -> active_offloads & ENETC_F_TX_TSTAMP_MASK )) {
342
+ skb -> cb [0 ] = priv -> active_offloads & ENETC_F_TX_TSTAMP_MASK ;
343
+ } else {
344
+ skb -> cb [0 ] = 0 ;
345
+ }
346
+
347
+ /* Fall back to two-step timestamp if not one-step Sync packet */
348
+ if (skb -> cb [0 ] & ENETC_F_TX_ONESTEP_SYNC_TSTAMP ) {
349
+ if (enetc_ptp_parse (skb , & udp , & msgtype , & twostep ,
350
+ & offset1 , & offset2 ) ||
351
+ msgtype != PTP_MSGTYPE_SYNC || twostep != 0 )
352
+ skb -> cb [0 ] = ENETC_F_TX_TSTAMP ;
353
+ }
354
+
355
+ /* Queue one-step Sync packet if already locked */
356
+ if (skb -> cb [0 ] & ENETC_F_TX_ONESTEP_SYNC_TSTAMP ) {
357
+ if (test_and_set_bit_lock (ENETC_TX_ONESTEP_TSTAMP_IN_PROGRESS ,
358
+ & priv -> flags )) {
359
+ skb_queue_tail (& priv -> tx_skbs , skb );
360
+ return NETDEV_TX_OK ;
361
+ }
362
+ }
363
+
364
+ return enetc_start_xmit (skb , ndev );
365
+ }
366
+
255
367
static irqreturn_t enetc_msix (int irq , void * data )
256
368
{
257
369
struct enetc_int_vector * v = data ;
@@ -392,18 +504,19 @@ static void enetc_recycle_xdp_tx_buff(struct enetc_bdr *tx_ring,
392
504
static bool enetc_clean_tx_ring (struct enetc_bdr * tx_ring , int napi_budget )
393
505
{
394
506
struct net_device * ndev = tx_ring -> ndev ;
507
+ struct enetc_ndev_priv * priv = netdev_priv (ndev );
395
508
int tx_frm_cnt = 0 , tx_byte_cnt = 0 ;
396
509
struct enetc_tx_swbd * tx_swbd ;
397
510
int i , bds_to_clean ;
398
- bool do_tstamp ;
511
+ bool do_twostep_tstamp ;
399
512
u64 tstamp = 0 ;
400
513
401
514
i = tx_ring -> next_to_clean ;
402
515
tx_swbd = & tx_ring -> tx_swbd [i ];
403
516
404
517
bds_to_clean = enetc_bd_ready_count (tx_ring , i );
405
518
406
- do_tstamp = false;
519
+ do_twostep_tstamp = false;
407
520
408
521
while (bds_to_clean && tx_frm_cnt < ENETC_DEFAULT_TX_WORK ) {
409
522
struct xdp_frame * xdp_frame = enetc_tx_swbd_get_xdp_frame (tx_swbd );
@@ -417,10 +530,10 @@ static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int napi_budget)
417
530
txbd = ENETC_TXBD (* tx_ring , i );
418
531
419
532
if (txbd -> flags & ENETC_TXBD_FLAGS_W &&
420
- tx_swbd -> do_tstamp ) {
533
+ tx_swbd -> do_twostep_tstamp ) {
421
534
enetc_get_tx_tstamp (& priv -> si -> hw , txbd ,
422
535
& tstamp );
423
- do_tstamp = true;
536
+ do_twostep_tstamp = true;
424
537
}
425
538
}
426
539
@@ -433,9 +546,16 @@ static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int napi_budget)
433
546
xdp_return_frame (xdp_frame );
434
547
tx_swbd -> xdp_frame = NULL ;
435
548
} else if (skb ) {
436
- if (unlikely (do_tstamp )) {
549
+ if (unlikely (tx_swbd -> skb -> cb [0 ] &
550
+ ENETC_F_TX_ONESTEP_SYNC_TSTAMP )) {
551
+ /* Start work to release lock for next one-step
552
+ * timestamping packet. And send one skb in
553
+ * tx_skbs queue if has.
554
+ */
555
+ queue_work (system_wq , & priv -> tx_onestep_tstamp );
556
+ } else if (unlikely (do_twostep_tstamp )) {
437
557
enetc_tstamp_tx (skb , tstamp );
438
- do_tstamp = false;
558
+ do_twostep_tstamp = false;
439
559
}
440
560
napi_consume_skb (skb , napi_budget );
441
561
tx_swbd -> skb = NULL ;
@@ -1864,6 +1984,29 @@ static int enetc_phylink_connect(struct net_device *ndev)
1864
1984
return 0 ;
1865
1985
}
1866
1986
1987
+ static void enetc_tx_onestep_tstamp (struct work_struct * work )
1988
+ {
1989
+ struct enetc_ndev_priv * priv ;
1990
+ struct sk_buff * skb ;
1991
+
1992
+ priv = container_of (work , struct enetc_ndev_priv , tx_onestep_tstamp );
1993
+
1994
+ netif_tx_lock (priv -> ndev );
1995
+
1996
+ clear_bit_unlock (ENETC_TX_ONESTEP_TSTAMP_IN_PROGRESS , & priv -> flags );
1997
+ skb = skb_dequeue (& priv -> tx_skbs );
1998
+ if (skb )
1999
+ enetc_start_xmit (skb , priv -> ndev );
2000
+
2001
+ netif_tx_unlock (priv -> ndev );
2002
+ }
2003
+
2004
+ static void enetc_tx_onestep_tstamp_init (struct enetc_ndev_priv * priv )
2005
+ {
2006
+ INIT_WORK (& priv -> tx_onestep_tstamp , enetc_tx_onestep_tstamp );
2007
+ skb_queue_head_init (& priv -> tx_skbs );
2008
+ }
2009
+
1867
2010
void enetc_start (struct net_device * ndev )
1868
2011
{
1869
2012
struct enetc_ndev_priv * priv = netdev_priv (ndev );
@@ -1916,6 +2059,7 @@ int enetc_open(struct net_device *ndev)
1916
2059
if (err )
1917
2060
goto err_set_queues ;
1918
2061
2062
+ enetc_tx_onestep_tstamp_init (priv );
1919
2063
enetc_setup_bdrs (priv );
1920
2064
enetc_start (ndev );
1921
2065
@@ -2214,11 +2358,16 @@ static int enetc_hwtstamp_set(struct net_device *ndev, struct ifreq *ifr)
2214
2358
2215
2359
switch (config .tx_type ) {
2216
2360
case HWTSTAMP_TX_OFF :
2217
- priv -> active_offloads &= ~ENETC_F_TX_TSTAMP ;
2361
+ priv -> active_offloads &= ~ENETC_F_TX_TSTAMP_MASK ;
2218
2362
break ;
2219
2363
case HWTSTAMP_TX_ON :
2364
+ priv -> active_offloads &= ~ENETC_F_TX_TSTAMP_MASK ;
2220
2365
priv -> active_offloads |= ENETC_F_TX_TSTAMP ;
2221
2366
break ;
2367
+ case HWTSTAMP_TX_ONESTEP_SYNC :
2368
+ priv -> active_offloads &= ~ENETC_F_TX_TSTAMP_MASK ;
2369
+ priv -> active_offloads |= ENETC_F_TX_ONESTEP_SYNC_TSTAMP ;
2370
+ break ;
2222
2371
default :
2223
2372
return - ERANGE ;
2224
2373
}
@@ -2249,7 +2398,9 @@ static int enetc_hwtstamp_get(struct net_device *ndev, struct ifreq *ifr)
2249
2398
2250
2399
config .flags = 0 ;
2251
2400
2252
- if (priv -> active_offloads & ENETC_F_TX_TSTAMP )
2401
+ if (priv -> active_offloads & ENETC_F_TX_ONESTEP_SYNC_TSTAMP )
2402
+ config .tx_type = HWTSTAMP_TX_ONESTEP_SYNC ;
2403
+ else if (priv -> active_offloads & ENETC_F_TX_TSTAMP )
2253
2404
config .tx_type = HWTSTAMP_TX_ON ;
2254
2405
else
2255
2406
config .tx_type = HWTSTAMP_TX_OFF ;
0 commit comments