dp83640: free packet queues on remove
authorRichard Cochran <richardcochran@gmail.com>
Fri, 21 Oct 2011 00:49:17 +0000 (00:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Oct 2011 23:14:50 +0000 (19:14 -0400)
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>
drivers/net/phy/dp83640.c

index 13e571325a9cd9286145cacbf7a70a91f6ccc7ec..9663e0ba60034d8edf1806c8bcd7eb928a7c4733 100644 (file)
@@ -1007,6 +1007,7 @@ static void dp83640_remove(struct phy_device *phydev)
        struct dp83640_clock *clock;
        struct list_head *this, *next;
        struct dp83640_private *tmp, *dp83640 = phydev->priv;
+       struct sk_buff *skb;
 
        if (phydev->addr == BROADCAST_ADDR)
                return;
@@ -1014,6 +1015,12 @@ static void dp83640_remove(struct phy_device *phydev)
        enable_status_frames(phydev, false);
        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);
 
        if (dp83640 == clock->chosen) {