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;
|
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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 @@
|
||||||
#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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue