dp83640: Only wait for timestamps for packets with timestamping enabled.
authorStefan Sørensen <stefan.sorensen@spectralink.com>
Tue, 3 Nov 2015 08:34:08 +0000 (09:34 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Nov 2015 16:08:22 +0000 (11:08 -0500)
In the packet timestamping function, check that the ptp version and
protocol of the packet matches what we have configured the hardware to
actually generate timestamps for, before looking/waiting for a timestamp.

Signed-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/dp83640.c

index 39ac633..47b7117 100644 (file)
@@ -37,8 +37,6 @@
 
 #define DP83640_PHY_ID 0x20005ce1
 #define PAGESEL                0x13
-#define LAYER4         0x02
-#define LAYER2         0x01
 #define MAX_RXTS       64
 #define N_EXT_TS       6
 #define N_PER_OUT      7
@@ -1296,29 +1294,29 @@ static int dp83640_hwtstamp(struct phy_device *phydev, struct ifreq *ifr)
        case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
        case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
                dp83640->hwts_rx_en = 1;
-               dp83640->layer = LAYER4;
-               dp83640->version = 1;
+               dp83640->layer = PTP_CLASS_L4;
+               dp83640->version = PTP_CLASS_V1;
                break;
        case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
        case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
                dp83640->hwts_rx_en = 1;
-               dp83640->layer = LAYER4;
-               dp83640->version = 2;
+               dp83640->layer = PTP_CLASS_L4;
+               dp83640->version = PTP_CLASS_V2;
                break;
        case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
        case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
                dp83640->hwts_rx_en = 1;
-               dp83640->layer = LAYER2;
-               dp83640->version = 2;
+               dp83640->layer = PTP_CLASS_L2;
+               dp83640->version = PTP_CLASS_V2;
                break;
        case HWTSTAMP_FILTER_PTP_V2_EVENT:
        case HWTSTAMP_FILTER_PTP_V2_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
                dp83640->hwts_rx_en = 1;
-               dp83640->layer = LAYER4|LAYER2;
-               dp83640->version = 2;
+               dp83640->layer = PTP_CLASS_L4 | PTP_CLASS_L2;
+               dp83640->version = PTP_CLASS_V2;
                break;
        default:
                return -ERANGE;
@@ -1327,11 +1325,11 @@ static int dp83640_hwtstamp(struct phy_device *phydev, struct ifreq *ifr)
        txcfg0 = (dp83640->version & TX_PTP_VER_MASK) << TX_PTP_VER_SHIFT;
        rxcfg0 = (dp83640->version & TX_PTP_VER_MASK) << TX_PTP_VER_SHIFT;
 
-       if (dp83640->layer & LAYER2) {
+       if (dp83640->layer & PTP_CLASS_L2) {
                txcfg0 |= TX_L2_EN;
                rxcfg0 |= RX_L2_EN;
        }
-       if (dp83640->layer & LAYER4) {
+       if (dp83640->layer & PTP_CLASS_L4) {
                txcfg0 |= TX_IPV6_EN | TX_IPV4_EN;
                rxcfg0 |= RX_IPV6_EN | RX_IPV4_EN;
        }
@@ -1397,6 +1395,9 @@ static bool dp83640_rxtstamp(struct phy_device *phydev,
        if (!dp83640->hwts_rx_en)
                return false;
 
+       if ((type & dp83640->version) == 0 || (type & dp83640->layer) == 0)
+               return false;
+
        spin_lock_irqsave(&dp83640->rx_lock, flags);
        prune_rx_ts(dp83640);
        list_for_each_safe(this, next, &dp83640->rxts) {