diff options
-rw-r--r-- | Documentation/networking/packet_mmap.txt | 18 | ||||
-rw-r--r-- | Documentation/networking/timestamping.txt | 12 | ||||
-rw-r--r-- | Documentation/networking/timestamping/timestamping.c | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/neterion/vxge/vxge-main.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/octeon/octeon_mgmt.c | 25 | ||||
-rw-r--r-- | include/linux/skbuff.h | 14 | ||||
-rw-r--r-- | include/net/sock.h | 11 | ||||
-rw-r--r-- | include/uapi/linux/if_packet.h | 2 | ||||
-rw-r--r-- | net/core/sock.c | 4 | ||||
-rw-r--r-- | net/packet/af_packet.c | 12 | ||||
-rw-r--r-- | net/socket.c | 12 |
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 | |||
1008 | of hardware timestamps with SIOCSHWTSTAMP (see related information from | 1008 | of hardware timestamps with SIOCSHWTSTAMP (see related information from |
1009 | Documentation/networking/timestamping.txt). | 1009 | Documentation/networking/timestamping.txt). |
1010 | 1010 | ||
1011 | PACKET_TIMESTAMP accepts the same integer bit field as | 1011 | PACKET_TIMESTAMP accepts the same integer bit field as SO_TIMESTAMPING: |
1012 | SO_TIMESTAMPING. However, only the SOF_TIMESTAMPING_SYS_HARDWARE | 1012 | |
1013 | and SOF_TIMESTAMPING_RAW_HARDWARE values are recognized by | 1013 | int req = SOF_TIMESTAMPING_RAW_HARDWARE; |
1014 | PACKET_TIMESTAMP. SOF_TIMESTAMPING_SYS_HARDWARE takes precedence over | ||
1015 | SOF_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 | ||
1021 | For the mmap(2)ed ring buffers, such timestamps are stored in the | 1016 | For 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 | |||
1023 | what kind of timestamp has been reported, the tp_status field is binary |'ed | 1018 | what kind of timestamp has been reported, the tp_status field is binary |'ed |
1024 | with the following possible bits ... | 1019 | with 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 |
1031 | RX_RING, if none of those 3 are set (i.e. PACKET_TIMESTAMP is not set), | 1025 | RX_RING, if neither is set (i.e. PACKET_TIMESTAMP is not set), then a |
1032 | then this means that a software fallback was invoked *within* PF_PACKET's | 1026 | software fallback was invoked *within* PF_PACKET's processing code (less |
1033 | processing code (less precise). | 1027 | precise). |
1034 | 1028 | ||
1035 | Getting timestamps for the TX_RING works as follows: i) fill the ring frames, | 1029 | Getting timestamps for the TX_RING works as follows: i) fill the ring frames, |
1036 | ii) call sendto() e.g. in blocking mode, iii) wait for status of relevant | 1030 | ii) 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 | |||
88 | SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its | 88 | SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its |
89 | relation to system time should be made. | 89 | relation to system time should be made. |
90 | 90 | ||
91 | hwtimetrans is the hardware time stamp transformed so that it | 91 | hwtimetrans is always zero. This field is deprecated. It used to hold |
92 | corresponds as good as possible to system time. This correlation is | 92 | hw timestamps converted to system time. Instead, expose the hardware |
93 | not perfect; as a consequence, sorting packets received via different | ||
94 | NICs by their hwtimetrans may differ from the order in which they were | ||
95 | received. hwtimetrans may be non-monotonic even for the same NIC. | ||
96 | Filled in if SOF_TIMESTAMPING_SYS_HARDWARE is set. Requires support | ||
97 | by the network device and will be empty without that support. This | ||
98 | field is DEPRECATED. Only one driver computes this value. New device | ||
99 | drivers must leave this zero. Instead, they can expose the hardware | ||
100 | clock device on the NIC directly as a HW PTP clock source, to allow | 93 | clock device on the NIC directly as a HW PTP clock source, to allow |
101 | time conversion in userspace and optionally synchronize system time | 94 | time conversion in userspace and optionally synchronize system time |
102 | with a userspace PTP stack such as linuxptp. For the PTP clock API, | 95 | with 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 | ||
197 | Time stamps for outgoing packets are to be generated as follows: | 189 | Time 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 | ||
250 | static 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 | |||
272 | static void octeon_mgmt_clean_tx_buffers(struct octeon_mgmt *p) | 250 | static 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 | */ |
234 | struct skb_shared_hwtstamps { | 223 | struct 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); |