Commit 869684a7 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-fix-sw-timestamping'

Ivan Khoronzhuk says:

====================
net: fix sw timestamping for non PTP packets

This series contains several corrections connected with timestamping
for cpsw and netcp drivers based on same cpts module.

Based on net/next
====================
Reviewed-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents bf24e136 0ccf59ba
...@@ -1236,6 +1236,7 @@ static inline int cpsw_tx_packet_submit(struct cpsw_priv *priv, ...@@ -1236,6 +1236,7 @@ static inline int cpsw_tx_packet_submit(struct cpsw_priv *priv,
{ {
struct cpsw_common *cpsw = priv->cpsw; struct cpsw_common *cpsw = priv->cpsw;
skb_tx_timestamp(skb);
return cpdma_chan_submit(txch, skb, skb->data, skb->len, return cpdma_chan_submit(txch, skb, skb->data, skb->len,
priv->emac_port + cpsw->data.dual_emac); priv->emac_port + cpsw->data.dual_emac);
} }
...@@ -1597,6 +1598,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb, ...@@ -1597,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;
...@@ -1608,11 +1610,9 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb, ...@@ -1608,11 +1610,9 @@ 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;
skb_tx_timestamp(skb);
q_idx = skb_get_queue_mapping(skb); q_idx = skb_get_queue_mapping(skb);
if (q_idx >= cpsw->tx_ch_num) if (q_idx >= cpsw->tx_ch_num)
q_idx = q_idx % cpsw->tx_ch_num; q_idx = q_idx % cpsw->tx_ch_num;
......
...@@ -30,6 +30,7 @@ ...@@ -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) ...@@ -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) ...@@ -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
......
...@@ -2503,24 +2503,8 @@ static bool gbe_need_txtstamp(struct gbe_intf *gbe_intf, ...@@ -2503,24 +2503,8 @@ static bool gbe_need_txtstamp(struct gbe_intf *gbe_intf,
const struct netcp_packet *p_info) const struct netcp_packet *p_info)
{ {
struct sk_buff *skb = p_info->skb; struct sk_buff *skb = p_info->skb;
unsigned int class = ptp_classify_raw(skb);
if (class == PTP_CLASS_NONE) return cpts_can_timestamp(gbe_intf->gbe_dev->cpts, skb);
return false;
switch (class) {
case PTP_CLASS_V1_IPV4:
case PTP_CLASS_V1_IPV6:
case PTP_CLASS_V2_IPV4:
case PTP_CLASS_V2_IPV6:
case PTP_CLASS_V2_L2:
case (PTP_CLASS_V2_VLAN | PTP_CLASS_L2):
case (PTP_CLASS_V2_VLAN | PTP_CLASS_IPV4):
case (PTP_CLASS_V2_VLAN | PTP_CLASS_IPV6):
return true;
}
return false;
} }
static int gbe_txtstamp_mark_pkt(struct gbe_intf *gbe_intf, static int gbe_txtstamp_mark_pkt(struct gbe_intf *gbe_intf,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment