Commit 8b3408f8 authored by Richard Cochran's avatar Richard Cochran Committed by David S. Miller

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: default avatarRichard Cochran <richard.cochran@omicron.at>
Acked-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f5ff7cd1
...@@ -1007,6 +1007,7 @@ static void dp83640_remove(struct phy_device *phydev) ...@@ -1007,6 +1007,7 @@ static void dp83640_remove(struct phy_device *phydev)
struct dp83640_clock *clock; struct dp83640_clock *clock;
struct list_head *this, *next; struct list_head *this, *next;
struct dp83640_private *tmp, *dp83640 = phydev->priv; struct dp83640_private *tmp, *dp83640 = phydev->priv;
struct sk_buff *skb;
if (phydev->addr == BROADCAST_ADDR) if (phydev->addr == BROADCAST_ADDR)
return; return;
...@@ -1014,6 +1015,12 @@ static void dp83640_remove(struct phy_device *phydev) ...@@ -1014,6 +1015,12 @@ static void dp83640_remove(struct phy_device *phydev)
enable_status_frames(phydev, false); enable_status_frames(phydev, false);
cancel_work_sync(&dp83640->ts_work); cancel_work_sync(&dp83640->ts_work);
while ((skb = skb_dequeue(&dp83640->rx_queue)) != NULL)
kfree_skb(skb);
while ((skb = skb_dequeue(&dp83640->tx_queue)) != NULL)
skb_complete_tx_timestamp(skb, NULL);
clock = dp83640_clock_get(dp83640->clock); clock = dp83640_clock_get(dp83640->clock);
if (dp83640 == clock->chosen) { if (dp83640 == clock->chosen) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment