[no subject]

From: Dong Zhu
Date: Mon May 13 2013 - 05:27:59 EST


Currently kernel only support setting the hw time stamping policy
through ioctl,now add a method to check which packets(Outgoing and
Incoming) are time stamped by nic.

Add this to igb_get_ts_info, we can query this by using the GET_TS_INFO
ethtool command. Testing on I350 and 82576NS it seems work well.

Signed-off-by: Dong Zhu <bluezhudong@xxxxxxxxx>
---
drivers/net/ethernet/intel/igb/igb_ethtool.c | 78 +++++++++++++++++++++++++++-
include/uapi/linux/ethtool.h | 3 ++
2 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index 7876240..49486b8 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -2327,6 +2327,8 @@ static int igb_get_ts_info(struct net_device *dev,
struct ethtool_ts_info *info)
{
struct igb_adapter *adapter = netdev_priv(dev);
+ struct e1000_hw *hw = &adapter->hw;
+ u32 regval;

switch (adapter->hw.mac.type) {
case e1000_82575:
@@ -2360,10 +2362,29 @@ static int igb_get_ts_info(struct net_device *dev,

info->rx_filters = 1 << HWTSTAMP_FILTER_NONE;

+ regval = rd32(E1000_TSYNCTXCTL);
+ if (regval & E1000_TSYNCTXCTL_ENABLED)
+ info->tx_reserved[0] = 1 << HWTSTAMP_TX_ON;
+ else
+ info->tx_reserved[0] = 1 << HWTSTAMP_TX_OFF;
+
+ regval = rd32(E1000_TSYNCRXCTL);
+
/* 82576 does not support timestamping all packets. */
- if (adapter->hw.mac.type >= e1000_82580)
+ if (adapter->hw.mac.type >= e1000_82580) {
info->rx_filters |= 1 << HWTSTAMP_FILTER_ALL;
- else
+
+ if (!(regval & E1000_TSYNCRXCTL_ENABLED))
+ info->rx_reserved[0] =
+ 1 << HWTSTAMP_FILTER_NONE;
+ else if (E1000_TSYNCRXCTL_TYPE_ALL ==
+ (regval & E1000_TSYNCRXCTL_TYPE_MASK))
+ info->rx_reserved[0] = 1 << HWTSTAMP_FILTER_ALL;
+ else
+ return -ERANGE;
+
+ return 0;
+ } else {
info->rx_filters |=
(1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
(1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
@@ -2373,6 +2394,59 @@ static int igb_get_ts_info(struct net_device *dev,
(1 << HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ) |
(1 << HWTSTAMP_FILTER_PTP_V2_EVENT);

+ if (!(regval & E1000_TSYNCRXCTL_ENABLED)) {
+ info->rx_reserved[0] =
+ 1 << HWTSTAMP_FILTER_NONE;
+ return 0;
+ }
+ }
+
+ switch (regval & E1000_TSYNCRXCTL_TYPE_MASK) {
+ case E1000_TSYNCRXCTL_TYPE_L4_V1:
+ regval = rd32(E1000_TSYNCRXCFG);
+ if (E1000_TSYNCRXCFG_PTP_V1_SYNC_MESSAGE ==
+ (regval &
+ E1000_TSYNCRXCFG_PTP_V1_CTRLT_MASK))
+ info->rx_reserved[0] =
+ (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC);
+ else if (E1000_TSYNCRXCFG_PTP_V1_DELAY_REQ_MESSAGE
+ == (regval &
+ E1000_TSYNCRXCFG_PTP_V1_CTRLT_MASK))
+ info->rx_reserved[0] =
+ (1 <<
+ HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ);
+ else
+ return -ERANGE;
+ break;
+ case E1000_TSYNCRXCTL_TYPE_L2_L4_V2:
+ regval = rd32(E1000_TSYNCRXCFG);
+ if (E1000_TSYNCRXCFG_PTP_V2_SYNC_MESSAGE ==
+ (regval &
+ E1000_TSYNCRXCFG_PTP_V2_MSGID_MASK))
+ info->rx_reserved[0] =
+ (1 << HWTSTAMP_FILTER_PTP_V2_L2_SYNC) |
+ (1 << HWTSTAMP_FILTER_PTP_V2_L4_SYNC);
+ else if (E1000_TSYNCRXCFG_PTP_V2_DELAY_REQ_MESSAGE ==
+ (regval &
+ E1000_TSYNCRXCFG_PTP_V2_MSGID_MASK))
+ info->rx_reserved[0] =
+ (1 <<
+ HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ) |
+ (1 <<
+ HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ);
+ else
+ return -ERANGE;
+ break;
+ case E1000_TSYNCRXCTL_TYPE_EVENT_V2:
+ info->rx_reserved[0] =
+ (1 << HWTSTAMP_FILTER_PTP_V2_EVENT) |
+ (1 << HWTSTAMP_FILTER_PTP_V2_SYNC) |
+ (1 << HWTSTAMP_FILTER_PTP_V2_DELAY_REQ);
+ break;
+ default:
+ return -ERANGE;
+ }
+
return 0;
default:
return -EOPNOTSUPP;
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 0c9b448..06cdbc0 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -772,7 +772,10 @@ struct ethtool_sfeatures {
* @so_timestamping: bit mask of the sum of the supported SO_TIMESTAMPING flags
* @phc_index: device index of the associated PHC, or -1 if there is none
* @tx_types: bit mask of the supported hwtstamp_tx_types enumeration values
+ * @tx_reserved[0]: bit mask of the in use hwtstamp_tx_types enumeration values
* @rx_filters: bit mask of the supported hwtstamp_rx_filters enumeration values
+ * @rx_reserved[0]: bit mask of the in use hwtstamp_rx_filters enumeration
+ * values
*
* The bits in the 'tx_types' and 'rx_filters' fields correspond to
* the 'hwtstamp_tx_types' and 'hwtstamp_rx_filters' enumeration values,
--
1.7.11.7


--
Best Regards,
Dong Zhu
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/