diff options
Diffstat (limited to 'drivers/net/phy/dp83640.c')
-rw-r--r-- | drivers/net/phy/dp83640.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c index 18b41bc345ab..6e8807212aa3 100644 --- a/drivers/net/phy/dp83640.c +++ b/drivers/net/phy/dp83640.c | |||
@@ -898,14 +898,14 @@ static void decode_txts(struct dp83640_private *dp83640, | |||
898 | struct phy_txts *phy_txts) | 898 | struct phy_txts *phy_txts) |
899 | { | 899 | { |
900 | struct skb_shared_hwtstamps shhwtstamps; | 900 | struct skb_shared_hwtstamps shhwtstamps; |
901 | struct dp83640_skb_info *skb_info; | ||
901 | struct sk_buff *skb; | 902 | struct sk_buff *skb; |
902 | u64 ns; | ||
903 | u8 overflow; | 903 | u8 overflow; |
904 | u64 ns; | ||
904 | 905 | ||
905 | /* We must already have the skb that triggered this. */ | 906 | /* We must already have the skb that triggered this. */ |
906 | 907 | again: | |
907 | skb = skb_dequeue(&dp83640->tx_queue); | 908 | skb = skb_dequeue(&dp83640->tx_queue); |
908 | |||
909 | if (!skb) { | 909 | if (!skb) { |
910 | pr_debug("have timestamp but tx_queue empty\n"); | 910 | pr_debug("have timestamp but tx_queue empty\n"); |
911 | return; | 911 | return; |
@@ -920,6 +920,11 @@ static void decode_txts(struct dp83640_private *dp83640, | |||
920 | } | 920 | } |
921 | return; | 921 | return; |
922 | } | 922 | } |
923 | skb_info = (struct dp83640_skb_info *)skb->cb; | ||
924 | if (time_after(jiffies, skb_info->tmo)) { | ||
925 | kfree_skb(skb); | ||
926 | goto again; | ||
927 | } | ||
923 | 928 | ||
924 | ns = phy2txts(phy_txts); | 929 | ns = phy2txts(phy_txts); |
925 | memset(&shhwtstamps, 0, sizeof(shhwtstamps)); | 930 | memset(&shhwtstamps, 0, sizeof(shhwtstamps)); |
@@ -1472,6 +1477,7 @@ static bool dp83640_rxtstamp(struct phy_device *phydev, | |||
1472 | static void dp83640_txtstamp(struct phy_device *phydev, | 1477 | static void dp83640_txtstamp(struct phy_device *phydev, |
1473 | struct sk_buff *skb, int type) | 1478 | struct sk_buff *skb, int type) |
1474 | { | 1479 | { |
1480 | struct dp83640_skb_info *skb_info = (struct dp83640_skb_info *)skb->cb; | ||
1475 | struct dp83640_private *dp83640 = phydev->priv; | 1481 | struct dp83640_private *dp83640 = phydev->priv; |
1476 | 1482 | ||
1477 | switch (dp83640->hwts_tx_en) { | 1483 | switch (dp83640->hwts_tx_en) { |
@@ -1484,6 +1490,7 @@ static void dp83640_txtstamp(struct phy_device *phydev, | |||
1484 | /* fall through */ | 1490 | /* fall through */ |
1485 | case HWTSTAMP_TX_ON: | 1491 | case HWTSTAMP_TX_ON: |
1486 | skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; | 1492 | skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; |
1493 | skb_info->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT; | ||
1487 | skb_queue_tail(&dp83640->tx_queue, skb); | 1494 | skb_queue_tail(&dp83640->tx_queue, skb); |
1488 | break; | 1495 | break; |
1489 | 1496 | ||