defxx: Discard DMA maps on buffer deallocation
authorMaciej W. Rozycki <macro@linux-mips.org>
Sat, 5 Jul 2014 14:14:30 +0000 (15:14 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Jul 2014 22:30:11 +0000 (15:30 -0700)
Prearranged receive DMA bounce buffer mappings are not released in the
card reboot/shutdown path.  That does not affect frame reception, but
probably explains the random segmentation fault I observed the other day
on interface shutdown.  Card is rebooted as required by the spec in the
process of ring fault recovery when a PC Trace signal has been received.

This change fixes the problem in an obvious manner.

Reported-by: Robert Coerver <Robert.Coerver@ll.mit.edu>
Tested-by: Robert Coerver <Robert.Coerver@ll.mit.edu>
Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/fddi/defxx.c

index 4dcfb32983d992c31e92a18ac72fda8a8c91388f..0b2e80940b95aabf7325e6c6a894bc7130e5ad4c 100644 (file)
@@ -3447,8 +3447,13 @@ static void dfx_rcv_flush( DFX_board_t *bp )
                {
                        struct sk_buff *skb;
                        skb = (struct sk_buff *)bp->p_rcv_buff_va[i+j];
-                       if (skb)
+                       if (skb) {
+                               dma_unmap_single(bp->bus_dev,
+                                                bp->descr_block_virt->rcv_data[i+j].long_1,
+                                                PI_RCV_DATA_K_SIZE_MAX,
+                                                DMA_FROM_DEVICE);
                                dev_kfree_skb(skb);
+                       }
                        bp->p_rcv_buff_va[i+j] = NULL;
                }