aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/phy
diff options
context:
space:
mode:
authorRichard Cochran <richardcochran@gmail.com>2011-10-20 20:49:17 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-24 19:14:50 -0400
commit8b3408f8ee994973869d8ba32c5bf482bc4ddca4 (patch)
tree4394a829b509a481799a65868c61488a26698a74 /drivers/net/phy
parentf5ff7cd1a84caa9545d952a37ac872ccb73825fb (diff)
dp83640: free packet queues on remove
If the PHY should disappear (for example, on an USB Ethernet MAC), then the driver would leak any undelivered time stamp packets. This commit fixes the issue by calling the appropriate functions to free any packets left in the transmit and receive queues. The driver first appeared in v3.0. Signed-off-by: Richard Cochran <richard.cochran@omicron.at> Acked-by: Eric Dumazet <eric.dumazet@gmail.com> Cc: <stable@vger.kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/phy')
-rw-r--r--drivers/net/phy/dp83640.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
index 13e571325a9c..9663e0ba6003 100644
--- a/drivers/net/phy/dp83640.c
+++ b/drivers/net/phy/dp83640.c
@@ -1007,6 +1007,7 @@ static void dp83640_remove(struct phy_device *phydev)
1007 struct dp83640_clock *clock; 1007 struct dp83640_clock *clock;
1008 struct list_head *this, *next; 1008 struct list_head *this, *next;
1009 struct dp83640_private *tmp, *dp83640 = phydev->priv; 1009 struct dp83640_private *tmp, *dp83640 = phydev->priv;
1010 struct sk_buff *skb;
1010 1011
1011 if (phydev->addr == BROADCAST_ADDR) 1012 if (phydev->addr == BROADCAST_ADDR)
1012 return; 1013 return;
@@ -1014,6 +1015,12 @@ static void dp83640_remove(struct phy_device *phydev)
1014 enable_status_frames(phydev, false); 1015 enable_status_frames(phydev, false);
1015 cancel_work_sync(&dp83640->ts_work); 1016 cancel_work_sync(&dp83640->ts_work);
1016 1017
1018 while ((skb = skb_dequeue(&dp83640->rx_queue)) != NULL)
1019 kfree_skb(skb);
1020
1021 while ((skb = skb_dequeue(&dp83640->tx_queue)) != NULL)
1022 skb_complete_tx_timestamp(skb, NULL);
1023
1017 clock = dp83640_clock_get(dp83640->clock); 1024 clock = dp83640_clock_get(dp83640->clock);
1018 1025
1019 if (dp83640 == clock->chosen) { 1026 if (dp83640 == clock->chosen) {