mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
dp83640: Only wait for timestamps for packets with timestamping enabled.
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>
This commit is contained in:
parent
5f94c943d5
commit
a1f8723f38
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user