aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/networking/packet_mmap.txt18
-rw-r--r--Documentation/networking/timestamping.txt12
-rw-r--r--Documentation/networking/timestamping/timestamping.c7
-rw-r--r--drivers/net/ethernet/neterion/vxge/vxge-main.c1
-rw-r--r--drivers/net/ethernet/octeon/octeon_mgmt.c25
-rw-r--r--include/linux/skbuff.h14
-rw-r--r--include/net/sock.h11
-rw-r--r--include/uapi/linux/if_packet.h2
-rw-r--r--net/core/sock.c4
-rw-r--r--net/packet/af_packet.c12
-rw-r--r--net/socket.c12
11 files changed, 23 insertions, 95 deletions
diff --git a/Documentation/networking/packet_mmap.txt b/Documentation/networking/packet_mmap.txt
index 38112d512f47..a6d7cb91069e 100644
--- a/Documentation/networking/packet_mmap.txt
+++ b/Documentation/networking/packet_mmap.txt
@@ -1008,14 +1008,9 @@ hardware timestamps to be used. Note: you may need to enable the generation
1008of hardware timestamps with SIOCSHWTSTAMP (see related information from 1008of hardware timestamps with SIOCSHWTSTAMP (see related information from
1009Documentation/networking/timestamping.txt). 1009Documentation/networking/timestamping.txt).
1010 1010
1011PACKET_TIMESTAMP accepts the same integer bit field as 1011PACKET_TIMESTAMP accepts the same integer bit field as SO_TIMESTAMPING:
1012SO_TIMESTAMPING. However, only the SOF_TIMESTAMPING_SYS_HARDWARE 1012
1013and SOF_TIMESTAMPING_RAW_HARDWARE values are recognized by 1013 int req = SOF_TIMESTAMPING_RAW_HARDWARE;
1014PACKET_TIMESTAMP. SOF_TIMESTAMPING_SYS_HARDWARE takes precedence over
1015SOF_TIMESTAMPING_RAW_HARDWARE if both bits are set.
1016
1017 int req = 0;
1018 req |= SOF_TIMESTAMPING_SYS_HARDWARE;
1019 setsockopt(fd, SOL_PACKET, PACKET_TIMESTAMP, (void *) &req, sizeof(req)) 1014 setsockopt(fd, SOL_PACKET, PACKET_TIMESTAMP, (void *) &req, sizeof(req))
1020 1015
1021For the mmap(2)ed ring buffers, such timestamps are stored in the 1016For the mmap(2)ed ring buffers, such timestamps are stored in the
@@ -1023,14 +1018,13 @@ tpacket{,2,3}_hdr structure's tp_sec and tp_{n,u}sec members. To determine
1023what kind of timestamp has been reported, the tp_status field is binary |'ed 1018what kind of timestamp has been reported, the tp_status field is binary |'ed
1024with the following possible bits ... 1019with the following possible bits ...
1025 1020
1026 TP_STATUS_TS_SYS_HARDWARE
1027 TP_STATUS_TS_RAW_HARDWARE 1021 TP_STATUS_TS_RAW_HARDWARE
1028 TP_STATUS_TS_SOFTWARE 1022 TP_STATUS_TS_SOFTWARE
1029 1023
1030... that are equivalent to its SOF_TIMESTAMPING_* counterparts. For the 1024... that are equivalent to its SOF_TIMESTAMPING_* counterparts. For the
1031RX_RING, if none of those 3 are set (i.e. PACKET_TIMESTAMP is not set), 1025RX_RING, if neither is set (i.e. PACKET_TIMESTAMP is not set), then a
1032then this means that a software fallback was invoked *within* PF_PACKET's 1026software fallback was invoked *within* PF_PACKET's processing code (less
1033processing code (less precise). 1027precise).
1034 1028
1035Getting timestamps for the TX_RING works as follows: i) fill the ring frames, 1029Getting timestamps for the TX_RING works as follows: i) fill the ring frames,
1036ii) call sendto() e.g. in blocking mode, iii) wait for status of relevant 1030ii) call sendto() e.g. in blocking mode, iii) wait for status of relevant
diff --git a/Documentation/networking/timestamping.txt b/Documentation/networking/timestamping.txt
index 8b4ad809df27..897f942b976b 100644
--- a/Documentation/networking/timestamping.txt
+++ b/Documentation/networking/timestamping.txt
@@ -88,15 +88,8 @@ hwtimeraw is the original hardware time stamp. Filled in if
88SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its 88SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its
89relation to system time should be made. 89relation to system time should be made.
90 90
91hwtimetrans is the hardware time stamp transformed so that it 91hwtimetrans is always zero. This field is deprecated. It used to hold
92corresponds as good as possible to system time. This correlation is 92hw timestamps converted to system time. Instead, expose the hardware
93not perfect; as a consequence, sorting packets received via different
94NICs by their hwtimetrans may differ from the order in which they were
95received. hwtimetrans may be non-monotonic even for the same NIC.
96Filled in if SOF_TIMESTAMPING_SYS_HARDWARE is set. Requires support
97by the network device and will be empty without that support. This
98field is DEPRECATED. Only one driver computes this value. New device
99drivers must leave this zero. Instead, they can expose the hardware
100clock device on the NIC directly as a HW PTP clock source, to allow 93clock device on the NIC directly as a HW PTP clock source, to allow
101time conversion in userspace and optionally synchronize system time 94time conversion in userspace and optionally synchronize system time
102with a userspace PTP stack such as linuxptp. For the PTP clock API, 95with a userspace PTP stack such as linuxptp. For the PTP clock API,
@@ -191,7 +184,6 @@ struct skb_shared_hwtstamps {
191 * since arbitrary point in time 184 * since arbitrary point in time
192 */ 185 */
193 ktime_t hwtstamp; 186 ktime_t hwtstamp;
194 ktime_t syststamp; /* hwtstamp transformed to system time base */
195}; 187};
196 188
197Time stamps for outgoing packets are to be generated as follows: 189Time stamps for outgoing packets are to be generated as follows:
diff --git a/Documentation/networking/timestamping/timestamping.c b/Documentation/networking/timestamping/timestamping.c
index 8ba82bfe6a33..5cdfd743447b 100644
--- a/Documentation/networking/timestamping/timestamping.c
+++ b/Documentation/networking/timestamping/timestamping.c
@@ -76,7 +76,6 @@ static void usage(const char *error)
76 " SOF_TIMESTAMPING_RX_HARDWARE - hardware time stamping of incoming packets\n" 76 " SOF_TIMESTAMPING_RX_HARDWARE - hardware time stamping of incoming packets\n"
77 " SOF_TIMESTAMPING_RX_SOFTWARE - software fallback for incoming packets\n" 77 " SOF_TIMESTAMPING_RX_SOFTWARE - software fallback for incoming packets\n"
78 " SOF_TIMESTAMPING_SOFTWARE - request reporting of software time stamps\n" 78 " SOF_TIMESTAMPING_SOFTWARE - request reporting of software time stamps\n"
79 " SOF_TIMESTAMPING_SYS_HARDWARE - request reporting of transformed HW time stamps\n"
80 " SOF_TIMESTAMPING_RAW_HARDWARE - request reporting of raw HW time stamps\n" 79 " SOF_TIMESTAMPING_RAW_HARDWARE - request reporting of raw HW time stamps\n"
81 " SIOCGSTAMP - check last socket time stamp\n" 80 " SIOCGSTAMP - check last socket time stamp\n"
82 " SIOCGSTAMPNS - more accurate socket time stamp\n"); 81 " SIOCGSTAMPNS - more accurate socket time stamp\n");
@@ -202,9 +201,7 @@ static void printpacket(struct msghdr *msg, int res,
202 (long)stamp->tv_sec, 201 (long)stamp->tv_sec,
203 (long)stamp->tv_nsec); 202 (long)stamp->tv_nsec);
204 stamp++; 203 stamp++;
205 printf("HW transformed %ld.%09ld ", 204 /* skip deprecated HW transformed */
206 (long)stamp->tv_sec,
207 (long)stamp->tv_nsec);
208 stamp++; 205 stamp++;
209 printf("HW raw %ld.%09ld", 206 printf("HW raw %ld.%09ld",
210 (long)stamp->tv_sec, 207 (long)stamp->tv_sec,
@@ -361,8 +358,6 @@ int main(int argc, char **argv)
361 so_timestamping_flags |= SOF_TIMESTAMPING_RX_SOFTWARE; 358 so_timestamping_flags |= SOF_TIMESTAMPING_RX_SOFTWARE;
362 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SOFTWARE")) 359 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SOFTWARE"))
363 so_timestamping_flags |= SOF_TIMESTAMPING_SOFTWARE; 360 so_timestamping_flags |= SOF_TIMESTAMPING_SOFTWARE;
364 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SYS_HARDWARE"))
365 so_timestamping_flags |= SOF_TIMESTAMPING_SYS_HARDWARE;
366 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_RAW_HARDWARE")) 361 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_RAW_HARDWARE"))
367 so_timestamping_flags |= SOF_TIMESTAMPING_RAW_HARDWARE; 362 so_timestamping_flags |= SOF_TIMESTAMPING_RAW_HARDWARE;
368 else 363 else
diff --git a/drivers/net/ethernet/neterion/vxge/vxge-main.c b/drivers/net/ethernet/neterion/vxge/vxge-main.c
index 7a0deadd53bf..2eda153cb1e0 100644
--- a/drivers/net/ethernet/neterion/vxge/vxge-main.c
+++ b/drivers/net/ethernet/neterion/vxge/vxge-main.c
@@ -503,7 +503,6 @@ vxge_rx_1b_compl(struct __vxge_hw_ring *ringh, void *dtr,
503 503
504 skb_hwts = skb_hwtstamps(skb); 504 skb_hwts = skb_hwtstamps(skb);
505 skb_hwts->hwtstamp = ns_to_ktime(ns); 505 skb_hwts->hwtstamp = ns_to_ktime(ns);
506 skb_hwts->syststamp.tv64 = 0;
507 } 506 }
508 507
509 /* rth_hash_type and rth_it_hit are non-zero regardless of 508 /* rth_hash_type and rth_it_hit are non-zero regardless of
diff --git a/drivers/net/ethernet/octeon/octeon_mgmt.c b/drivers/net/ethernet/octeon/octeon_mgmt.c
index 7dc3e9b06d75..979c6980639f 100644
--- a/drivers/net/ethernet/octeon/octeon_mgmt.c
+++ b/drivers/net/ethernet/octeon/octeon_mgmt.c
@@ -247,28 +247,6 @@ static void octeon_mgmt_rx_fill_ring(struct net_device *netdev)
247 } 247 }
248} 248}
249 249
250static ktime_t ptp_to_ktime(u64 ptptime)
251{
252 ktime_t ktimebase;
253 u64 ptpbase;
254 unsigned long flags;
255
256 local_irq_save(flags);
257 /* Fill the icache with the code */
258 ktime_get_real();
259 /* Flush all pending operations */
260 mb();
261 /* Read the time and PTP clock as close together as
262 * possible. It is important that this sequence take the same
263 * amount of time to reduce jitter
264 */
265 ktimebase = ktime_get_real();
266 ptpbase = cvmx_read_csr(CVMX_MIO_PTP_CLOCK_HI);
267 local_irq_restore(flags);
268
269 return ktime_sub_ns(ktimebase, ptpbase - ptptime);
270}
271
272static void octeon_mgmt_clean_tx_buffers(struct octeon_mgmt *p) 250static void octeon_mgmt_clean_tx_buffers(struct octeon_mgmt *p)
273{ 251{
274 union cvmx_mixx_orcnt mix_orcnt; 252 union cvmx_mixx_orcnt mix_orcnt;
@@ -312,12 +290,12 @@ static void octeon_mgmt_clean_tx_buffers(struct octeon_mgmt *p)
312 /* Read the hardware TX timestamp if one was recorded */ 290 /* Read the hardware TX timestamp if one was recorded */
313 if (unlikely(re.s.tstamp)) { 291 if (unlikely(re.s.tstamp)) {
314 struct skb_shared_hwtstamps ts; 292 struct skb_shared_hwtstamps ts;
293 memset(&ts, 0, sizeof(ts));
315 /* Read the timestamp */ 294 /* Read the timestamp */
316 u64 ns = cvmx_read_csr(CVMX_MIXX_TSTAMP(p->port)); 295 u64 ns = cvmx_read_csr(CVMX_MIXX_TSTAMP(p->port));
317 /* Remove the timestamp from the FIFO */ 296 /* Remove the timestamp from the FIFO */
318 cvmx_write_csr(CVMX_MIXX_TSCTL(p->port), 0); 297 cvmx_write_csr(CVMX_MIXX_TSCTL(p->port), 0);
319 /* Tell the kernel about the timestamp */ 298 /* Tell the kernel about the timestamp */
320 ts.syststamp = ptp_to_ktime(ns);
321 ts.hwtstamp = ns_to_ktime(ns); 299 ts.hwtstamp = ns_to_ktime(ns);
322 skb_tstamp_tx(skb, &ts); 300 skb_tstamp_tx(skb, &ts);
323 } 301 }
@@ -429,7 +407,6 @@ good:
429 struct skb_shared_hwtstamps *ts; 407 struct skb_shared_hwtstamps *ts;
430 ts = skb_hwtstamps(skb); 408 ts = skb_hwtstamps(skb);
431 ts->hwtstamp = ns_to_ktime(ns); 409 ts->hwtstamp = ns_to_ktime(ns);
432 ts->syststamp = ptp_to_ktime(ns);
433 __skb_pull(skb, 8); 410 __skb_pull(skb, 8);
434 } 411 }
435 skb->protocol = eth_type_trans(skb, netdev); 412 skb->protocol = eth_type_trans(skb, netdev);
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index b613557132b9..281deced7469 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -210,20 +210,9 @@ static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
210 * struct skb_shared_hwtstamps - hardware time stamps 210 * struct skb_shared_hwtstamps - hardware time stamps
211 * @hwtstamp: hardware time stamp transformed into duration 211 * @hwtstamp: hardware time stamp transformed into duration
212 * since arbitrary point in time 212 * since arbitrary point in time
213 * @syststamp: hwtstamp transformed to system time base (deprecated)
214 * 213 *
215 * Software time stamps generated by ktime_get_real() are stored in 214 * Software time stamps generated by ktime_get_real() are stored in
216 * skb->tstamp. The relation between the different kinds of time 215 * skb->tstamp.
217 * stamps is as follows:
218 *
219 * syststamp and tstamp can be compared against each other in
220 * arbitrary combinations. The accuracy of a
221 * syststamp/tstamp/"syststamp from other device" comparison is
222 * limited by the accuracy of the transformation into system time
223 * base. This depends on the device driver and its underlying
224 * hardware. The syststamp implementation is deprecated in favor
225 * of hwtstamps and hw PTP clock sources exposed directly to
226 * userspace.
227 * 216 *
228 * hwtstamps can only be compared against other hwtstamps from 217 * hwtstamps can only be compared against other hwtstamps from
229 * the same device. 218 * the same device.
@@ -233,7 +222,6 @@ static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
233 */ 222 */
234struct skb_shared_hwtstamps { 223struct skb_shared_hwtstamps {
235 ktime_t hwtstamp; 224 ktime_t hwtstamp;
236 ktime_t syststamp;
237}; 225};
238 226
239/* Definitions for tx_flags in struct skb_shared_info */ 227/* Definitions for tx_flags in struct skb_shared_info */
diff --git a/include/net/sock.h b/include/net/sock.h
index 720773304a85..b91c8868ab8d 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -707,7 +707,6 @@ enum sock_flags {
707 SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */ 707 SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */
708 SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */ 708 SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */
709 SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */ 709 SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */
710 SOCK_TIMESTAMPING_SYS_HARDWARE, /* %SOF_TIMESTAMPING_SYS_HARDWARE */
711 SOCK_FASYNC, /* fasync() active */ 710 SOCK_FASYNC, /* fasync() active */
712 SOCK_RXQ_OVFL, 711 SOCK_RXQ_OVFL,
713 SOCK_ZEROCOPY, /* buffers from userspace */ 712 SOCK_ZEROCOPY, /* buffers from userspace */
@@ -2166,16 +2165,13 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
2166 * - software time stamp available and wanted 2165 * - software time stamp available and wanted
2167 * (SOCK_TIMESTAMPING_SOFTWARE) 2166 * (SOCK_TIMESTAMPING_SOFTWARE)
2168 * - hardware time stamps available and wanted 2167 * - hardware time stamps available and wanted
2169 * (SOCK_TIMESTAMPING_SYS_HARDWARE or 2168 * SOCK_TIMESTAMPING_RAW_HARDWARE
2170 * SOCK_TIMESTAMPING_RAW_HARDWARE)
2171 */ 2169 */
2172 if (sock_flag(sk, SOCK_RCVTSTAMP) || 2170 if (sock_flag(sk, SOCK_RCVTSTAMP) ||
2173 sock_flag(sk, SOCK_TIMESTAMPING_RX_SOFTWARE) || 2171 sock_flag(sk, SOCK_TIMESTAMPING_RX_SOFTWARE) ||
2174 (kt.tv64 && sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) || 2172 (kt.tv64 && sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) ||
2175 (hwtstamps->hwtstamp.tv64 && 2173 (hwtstamps->hwtstamp.tv64 &&
2176 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE)) || 2174 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE)))
2177 (hwtstamps->syststamp.tv64 &&
2178 sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE)))
2179 __sock_recv_timestamp(msg, sk, skb); 2175 __sock_recv_timestamp(msg, sk, skb);
2180 else 2176 else
2181 sk->sk_stamp = kt; 2177 sk->sk_stamp = kt;
@@ -2193,8 +2189,7 @@ static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
2193#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \ 2189#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
2194 (1UL << SOCK_RCVTSTAMP) | \ 2190 (1UL << SOCK_RCVTSTAMP) | \
2195 (1UL << SOCK_TIMESTAMPING_SOFTWARE) | \ 2191 (1UL << SOCK_TIMESTAMPING_SOFTWARE) | \
2196 (1UL << SOCK_TIMESTAMPING_RAW_HARDWARE) | \ 2192 (1UL << SOCK_TIMESTAMPING_RAW_HARDWARE))
2197 (1UL << SOCK_TIMESTAMPING_SYS_HARDWARE))
2198 2193
2199 if (sk->sk_flags & FLAGS_TS_OR_DROPS) 2194 if (sk->sk_flags & FLAGS_TS_OR_DROPS)
2200 __sock_recv_ts_and_drops(msg, sk, skb); 2195 __sock_recv_ts_and_drops(msg, sk, skb);
diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h
index bac27fa05f5b..da2d668b8cf1 100644
--- a/include/uapi/linux/if_packet.h
+++ b/include/uapi/linux/if_packet.h
@@ -108,7 +108,7 @@ struct tpacket_auxdata {
108 108
109/* Rx and Tx ring - header status */ 109/* Rx and Tx ring - header status */
110#define TP_STATUS_TS_SOFTWARE (1 << 29) 110#define TP_STATUS_TS_SOFTWARE (1 << 29)
111#define TP_STATUS_TS_SYS_HARDWARE (1 << 30) 111#define TP_STATUS_TS_SYS_HARDWARE (1 << 30) /* deprecated, never set */
112#define TP_STATUS_TS_RAW_HARDWARE (1 << 31) 112#define TP_STATUS_TS_RAW_HARDWARE (1 << 31)
113 113
114/* Rx ring - feature request bits */ 114/* Rx ring - feature request bits */
diff --git a/net/core/sock.c b/net/core/sock.c
index ca9b65199d28..134291d73fcd 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -862,8 +862,6 @@ set_rcvbuf:
862 (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)); 862 (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
863 sock_valbool_flag(sk, SOCK_TIMESTAMPING_SOFTWARE, 863 sock_valbool_flag(sk, SOCK_TIMESTAMPING_SOFTWARE,
864 val & SOF_TIMESTAMPING_SOFTWARE); 864 val & SOF_TIMESTAMPING_SOFTWARE);
865 sock_valbool_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE,
866 val & SOF_TIMESTAMPING_SYS_HARDWARE);
867 sock_valbool_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE, 865 sock_valbool_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE,
868 val & SOF_TIMESTAMPING_RAW_HARDWARE); 866 val & SOF_TIMESTAMPING_RAW_HARDWARE);
869 break; 867 break;
@@ -1102,8 +1100,6 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
1102 v.val |= SOF_TIMESTAMPING_RX_SOFTWARE; 1100 v.val |= SOF_TIMESTAMPING_RX_SOFTWARE;
1103 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) 1101 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE))
1104 v.val |= SOF_TIMESTAMPING_SOFTWARE; 1102 v.val |= SOF_TIMESTAMPING_SOFTWARE;
1105 if (sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE))
1106 v.val |= SOF_TIMESTAMPING_SYS_HARDWARE;
1107 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE)) 1103 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE))
1108 v.val |= SOF_TIMESTAMPING_RAW_HARDWARE; 1104 v.val |= SOF_TIMESTAMPING_RAW_HARDWARE;
1109 break; 1105 break;
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 614ca91f785a..8d9f8042705a 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -441,14 +441,10 @@ static __u32 tpacket_get_timestamp(struct sk_buff *skb, struct timespec *ts,
441{ 441{
442 struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb); 442 struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
443 443
444 if (shhwtstamps) { 444 if (shhwtstamps &&
445 if ((flags & SOF_TIMESTAMPING_SYS_HARDWARE) && 445 (flags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
446 ktime_to_timespec_cond(shhwtstamps->syststamp, ts)) 446 ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts))
447 return TP_STATUS_TS_SYS_HARDWARE; 447 return TP_STATUS_TS_RAW_HARDWARE;
448 if ((flags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
449 ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts))
450 return TP_STATUS_TS_RAW_HARDWARE;
451 }
452 448
453 if (ktime_to_timespec_cond(skb->tstamp, ts)) 449 if (ktime_to_timespec_cond(skb->tstamp, ts))
454 return TP_STATUS_TS_SOFTWARE; 450 return TP_STATUS_TS_SOFTWARE;
diff --git a/net/socket.c b/net/socket.c
index abf56b2a14f9..d8222c025061 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -725,14 +725,10 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
725 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE) && 725 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE) &&
726 ktime_to_timespec_cond(skb->tstamp, ts + 0)) 726 ktime_to_timespec_cond(skb->tstamp, ts + 0))
727 empty = 0; 727 empty = 0;
728 if (shhwtstamps) { 728 if (shhwtstamps &&
729 if (sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE) && 729 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE) &&
730 ktime_to_timespec_cond(shhwtstamps->syststamp, ts + 1)) 730 ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts + 2))
731 empty = 0; 731 empty = 0;
732 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE) &&
733 ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts + 2))
734 empty = 0;
735 }
736 if (!empty) 732 if (!empty)
737 put_cmsg(msg, SOL_SOCKET, 733 put_cmsg(msg, SOL_SOCKET,
738 SCM_TIMESTAMPING, sizeof(ts), &ts); 734 SCM_TIMESTAMPING, sizeof(ts), &ts);