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: Grygorii Strashko <grygorii.strashko@ti.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
869684a70d
|
@ -1236,6 +1236,7 @@ static inline int cpsw_tx_packet_submit(struct cpsw_priv *priv,
|
|||
{
|
||||
struct cpsw_common *cpsw = priv->cpsw;
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
return cpdma_chan_submit(txch, skb, skb->data, skb->len,
|
||||
priv->emac_port + cpsw->data.dual_emac);
|
||||
}
|
||||
|
@ -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_common *cpsw = priv->cpsw;
|
||||
struct cpts *cpts = cpsw->cpts;
|
||||
struct netdev_queue *txq;
|
||||
struct cpdma_chan *txch;
|
||||
int ret, q_idx;
|
||||
|
@ -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 &&
|
||||
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_tx_timestamp(skb);
|
||||
|
||||
q_idx = skb_get_queue_mapping(skb);
|
||||
if (q_idx >= cpsw->tx_ch_num)
|
||||
q_idx = q_idx % cpsw->tx_ch_num;
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/ptp_clock_kernel.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ptp_classify.h>
|
||||
#include <linux/timecounter.h>
|
||||
|
||||
struct cpsw_cpts {
|
||||
|
@ -155,6 +156,16 @@ static inline bool cpts_is_tx_enabled(struct cpts *cpts)
|
|||
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
|
||||
struct cpts;
|
||||
|
||||
|
@ -203,6 +214,11 @@ static inline bool cpts_is_tx_enabled(struct cpts *cpts)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool cpts_can_timestamp(struct cpts *cpts, struct sk_buff *skb)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -2503,24 +2503,8 @@ static bool gbe_need_txtstamp(struct gbe_intf *gbe_intf,
|
|||
const struct netcp_packet *p_info)
|
||||
{
|
||||
struct sk_buff *skb = p_info->skb;
|
||||
unsigned int class = ptp_classify_raw(skb);
|
||||
|
||||
if (class == PTP_CLASS_NONE)
|
||||
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;
|
||||
return cpts_can_timestamp(gbe_intf->gbe_dev->cpts, skb);
|
||||
}
|
||||
|
||||
static int gbe_txtstamp_mark_pkt(struct gbe_intf *gbe_intf,
|
||||
|
|
Loading…
Reference in New Issue