瀏覽代碼

net: ethernet: ti: cpsw: fix sw timestamping for non PTP packets

The cpts can timestmap only ptp packets at this moment, so driver
cannot mark every packet as though it's going to be timestamped,
only because h/w timestamping for given skb is enabled with
SKBTX_HW_TSTAMP. It doesn't allow to use sw timestamping, as result
outgoing packet is not timestamped at all if it's not PTP and h/w
timestamping is enabled. So, fix it by setting SKBTX_IN_PROGRESS
only for PTP packets.

Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Ivan Khoronzhuk 8 年之前
父節點
當前提交
f44f8417ba
共有 2 個文件被更改,包括 18 次插入1 次删除
  1. 2 1
      drivers/net/ethernet/ti/cpsw.c
  2. 16 0
      drivers/net/ethernet/ti/cpts.h

+ 2 - 1
drivers/net/ethernet/ti/cpsw.c

@@ -1598,6 +1598,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
 {
 {
 	struct cpsw_priv *priv = netdev_priv(ndev);
 	struct cpsw_priv *priv = netdev_priv(ndev);
 	struct cpsw_common *cpsw = priv->cpsw;
 	struct cpsw_common *cpsw = priv->cpsw;
+	struct cpts *cpts = cpsw->cpts;
 	struct netdev_queue *txq;
 	struct netdev_queue *txq;
 	struct cpdma_chan *txch;
 	struct cpdma_chan *txch;
 	int ret, q_idx;
 	int ret, q_idx;
@@ -1609,7 +1610,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
 	}
 	}
 
 
 	if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
 	if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
-	    cpts_is_tx_enabled(cpsw->cpts))
+	    cpts_is_tx_enabled(cpts) && cpts_can_timestamp(cpts, skb))
 		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 
 
 	q_idx = skb_get_queue_mapping(skb);
 	q_idx = skb_get_queue_mapping(skb);

+ 16 - 0
drivers/net/ethernet/ti/cpts.h

@@ -30,6 +30,7 @@
 #include <linux/of.h>
 #include <linux/of.h>
 #include <linux/ptp_clock_kernel.h>
 #include <linux/ptp_clock_kernel.h>
 #include <linux/skbuff.h>
 #include <linux/skbuff.h>
+#include <linux/ptp_classify.h>
 #include <linux/timecounter.h>
 #include <linux/timecounter.h>
 
 
 struct cpsw_cpts {
 struct cpsw_cpts {
@@ -155,6 +156,16 @@ static inline bool cpts_is_tx_enabled(struct cpts *cpts)
 	return !!cpts->tx_enable;
 	return !!cpts->tx_enable;
 }
 }
 
 
+static inline bool cpts_can_timestamp(struct cpts *cpts, struct sk_buff *skb)
+{
+	unsigned int class = ptp_classify_raw(skb);
+
+	if (class == PTP_CLASS_NONE)
+		return false;
+
+	return true;
+}
+
 #else
 #else
 struct cpts;
 struct cpts;
 
 
@@ -203,6 +214,11 @@ static inline bool cpts_is_tx_enabled(struct cpts *cpts)
 {
 {
 	return false;
 	return false;
 }
 }
+
+static inline bool cpts_can_timestamp(struct cpts *cpts, struct sk_buff *skb)
+{
+	return false;
+}
 #endif
 #endif