|
@@ -181,6 +181,7 @@ static void qede_ptp_task(struct work_struct *work)
|
|
|
skb_tstamp_tx(ptp->tx_skb, &shhwtstamps);
|
|
skb_tstamp_tx(ptp->tx_skb, &shhwtstamps);
|
|
|
dev_kfree_skb_any(ptp->tx_skb);
|
|
dev_kfree_skb_any(ptp->tx_skb);
|
|
|
ptp->tx_skb = NULL;
|
|
ptp->tx_skb = NULL;
|
|
|
|
|
+ clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS, &edev->flags);
|
|
|
|
|
|
|
|
DP_VERBOSE(edev, QED_MSG_DEBUG,
|
|
DP_VERBOSE(edev, QED_MSG_DEBUG,
|
|
|
"Tx timestamp, timestamp cycles = %llu, ns = %llu\n",
|
|
"Tx timestamp, timestamp cycles = %llu, ns = %llu\n",
|
|
@@ -208,6 +209,8 @@ static u64 qede_ptp_read_cc(const struct cyclecounter *cc)
|
|
|
|
|
|
|
|
static int qede_ptp_cfg_filters(struct qede_dev *edev)
|
|
static int qede_ptp_cfg_filters(struct qede_dev *edev)
|
|
|
{
|
|
{
|
|
|
|
|
+ enum qed_ptp_hwtstamp_tx_type tx_type = QED_PTP_HWTSTAMP_TX_ON;
|
|
|
|
|
+ enum qed_ptp_filter_type rx_filter = QED_PTP_FILTER_NONE;
|
|
|
struct qede_ptp *ptp = edev->ptp;
|
|
struct qede_ptp *ptp = edev->ptp;
|
|
|
|
|
|
|
|
if (!ptp)
|
|
if (!ptp)
|
|
@@ -221,7 +224,12 @@ static int qede_ptp_cfg_filters(struct qede_dev *edev)
|
|
|
switch (ptp->tx_type) {
|
|
switch (ptp->tx_type) {
|
|
|
case HWTSTAMP_TX_ON:
|
|
case HWTSTAMP_TX_ON:
|
|
|
edev->flags |= QEDE_TX_TIMESTAMPING_EN;
|
|
edev->flags |= QEDE_TX_TIMESTAMPING_EN;
|
|
|
- ptp->ops->hwtstamp_tx_on(edev->cdev);
|
|
|
|
|
|
|
+ tx_type = QED_PTP_HWTSTAMP_TX_ON;
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case HWTSTAMP_TX_OFF:
|
|
|
|
|
+ edev->flags &= ~QEDE_TX_TIMESTAMPING_EN;
|
|
|
|
|
+ tx_type = QED_PTP_HWTSTAMP_TX_OFF;
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
case HWTSTAMP_TX_ONESTEP_SYNC:
|
|
case HWTSTAMP_TX_ONESTEP_SYNC:
|
|
@@ -232,42 +240,57 @@ static int qede_ptp_cfg_filters(struct qede_dev *edev)
|
|
|
spin_lock_bh(&ptp->lock);
|
|
spin_lock_bh(&ptp->lock);
|
|
|
switch (ptp->rx_filter) {
|
|
switch (ptp->rx_filter) {
|
|
|
case HWTSTAMP_FILTER_NONE:
|
|
case HWTSTAMP_FILTER_NONE:
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_NONE;
|
|
|
break;
|
|
break;
|
|
|
case HWTSTAMP_FILTER_ALL:
|
|
case HWTSTAMP_FILTER_ALL:
|
|
|
case HWTSTAMP_FILTER_SOME:
|
|
case HWTSTAMP_FILTER_SOME:
|
|
|
ptp->rx_filter = HWTSTAMP_FILTER_NONE;
|
|
ptp->rx_filter = HWTSTAMP_FILTER_NONE;
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_ALL;
|
|
|
break;
|
|
break;
|
|
|
case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
|
|
case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
|
|
|
|
|
+ ptp->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V1_L4_EVENT;
|
|
|
|
|
+ break;
|
|
|
case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
|
|
case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
|
|
|
case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
|
|
case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
|
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
|
|
|
/* Initialize PTP detection for UDP/IPv4 events */
|
|
/* Initialize PTP detection for UDP/IPv4 events */
|
|
|
- ptp->ops->cfg_rx_filters(edev->cdev, QED_PTP_FILTER_IPV4);
|
|
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V1_L4_GEN;
|
|
|
break;
|
|
break;
|
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
|
|
|
|
|
+ ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V2_L4_EVENT;
|
|
|
|
|
+ break;
|
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
|
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
|
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
|
|
|
/* Initialize PTP detection for UDP/IPv4 or UDP/IPv6 events */
|
|
/* Initialize PTP detection for UDP/IPv4 or UDP/IPv6 events */
|
|
|
- ptp->ops->cfg_rx_filters(edev->cdev, QED_PTP_FILTER_IPV4_IPV6);
|
|
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V2_L4_GEN;
|
|
|
break;
|
|
break;
|
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
|
|
|
|
|
+ ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V2_L2_EVENT;
|
|
|
|
|
+ break;
|
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
|
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
|
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
|
|
|
/* Initialize PTP detection L2 events */
|
|
/* Initialize PTP detection L2 events */
|
|
|
- ptp->ops->cfg_rx_filters(edev->cdev, QED_PTP_FILTER_L2);
|
|
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V2_L2_GEN;
|
|
|
break;
|
|
break;
|
|
|
case HWTSTAMP_FILTER_PTP_V2_EVENT:
|
|
case HWTSTAMP_FILTER_PTP_V2_EVENT:
|
|
|
|
|
+ ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V2_EVENT;
|
|
|
|
|
+ break;
|
|
|
case HWTSTAMP_FILTER_PTP_V2_SYNC:
|
|
case HWTSTAMP_FILTER_PTP_V2_SYNC:
|
|
|
case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
|
|
case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
|
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
|
|
ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
|
|
|
/* Initialize PTP detection L2, UDP/IPv4 or UDP/IPv6 events */
|
|
/* Initialize PTP detection L2, UDP/IPv4 or UDP/IPv6 events */
|
|
|
- ptp->ops->cfg_rx_filters(edev->cdev,
|
|
|
|
|
- QED_PTP_FILTER_L2_IPV4_IPV6);
|
|
|
|
|
|
|
+ rx_filter = QED_PTP_FILTER_V2_GEN;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ ptp->ops->cfg_filters(edev->cdev, rx_filter, tx_type);
|
|
|
|
|
+
|
|
|
spin_unlock_bh(&ptp->lock);
|
|
spin_unlock_bh(&ptp->lock);
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -485,6 +508,9 @@ void qede_ptp_tx_ts(struct qede_dev *edev, struct sk_buff *skb)
|
|
|
if (!ptp)
|
|
if (!ptp)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
|
|
+ if (test_and_set_bit_lock(QEDE_FLAGS_PTP_TX_IN_PRORGESS, &edev->flags))
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
if (unlikely(!(edev->flags & QEDE_TX_TIMESTAMPING_EN))) {
|
|
if (unlikely(!(edev->flags & QEDE_TX_TIMESTAMPING_EN))) {
|
|
|
DP_NOTICE(edev,
|
|
DP_NOTICE(edev,
|
|
|
"Tx timestamping was not enabled, this packet will not be timestamped\n");
|
|
"Tx timestamping was not enabled, this packet will not be timestamped\n");
|