Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mv643xx_eth: fix PPC DMA breakage

After 2.6.29, PPC no more admits passing NULL to the dev parameter of
the DMA API. The result is a BUG followed by solid lock-up when the
mv643xx_eth driver brings an interface up. The following patch makes
the driver work on my Pegasos again; it is mostly a search and replace
of NULL by mp->dev->dev.parent in dma allocation/freeing/mapping/unmapping
functions.

Signed-off-by: Gabriel Paubert <paubert@iram.es>
Acked-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Gabriel Paubert and committed by
David S. Miller
eb0519b5 4cd6fe1c

+22 -19
+22 -19
drivers/net/mv643xx_eth.c
··· 569 569 if (rxq->rx_curr_desc == rxq->rx_ring_size) 570 570 rxq->rx_curr_desc = 0; 571 571 572 - dma_unmap_single(NULL, rx_desc->buf_ptr, 572 + dma_unmap_single(mp->dev->dev.parent, rx_desc->buf_ptr, 573 573 rx_desc->buf_size, DMA_FROM_DEVICE); 574 574 rxq->rx_desc_count--; 575 575 rx++; ··· 678 678 679 679 rx_desc = rxq->rx_desc_area + rx; 680 680 681 - rx_desc->buf_ptr = dma_map_single(NULL, skb->data, 682 - mp->skb_size, DMA_FROM_DEVICE); 681 + rx_desc->buf_ptr = dma_map_single(mp->dev->dev.parent, 682 + skb->data, mp->skb_size, 683 + DMA_FROM_DEVICE); 683 684 rx_desc->buf_size = mp->skb_size; 684 685 rxq->rx_skb[rx] = skb; 685 686 wmb(); ··· 719 718 720 719 static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb) 721 720 { 721 + struct mv643xx_eth_private *mp = txq_to_mp(txq); 722 722 int nr_frags = skb_shinfo(skb)->nr_frags; 723 723 int frag; 724 724 ··· 748 746 749 747 desc->l4i_chk = 0; 750 748 desc->byte_cnt = this_frag->size; 751 - desc->buf_ptr = dma_map_page(NULL, this_frag->page, 752 - this_frag->page_offset, 753 - this_frag->size, 754 - DMA_TO_DEVICE); 749 + desc->buf_ptr = dma_map_page(mp->dev->dev.parent, 750 + this_frag->page, 751 + this_frag->page_offset, 752 + this_frag->size, DMA_TO_DEVICE); 755 753 } 756 754 } 757 755 ··· 828 826 829 827 desc->l4i_chk = l4i_chk; 830 828 desc->byte_cnt = length; 831 - desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE); 829 + desc->buf_ptr = dma_map_single(mp->dev->dev.parent, skb->data, 830 + length, DMA_TO_DEVICE); 832 831 833 832 __skb_queue_tail(&txq->tx_skb, skb); 834 833 ··· 959 956 } 960 957 961 958 if (cmd_sts & TX_FIRST_DESC) { 962 - dma_unmap_single(NULL, desc->buf_ptr, 959 + dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr, 963 960 desc->byte_cnt, DMA_TO_DEVICE); 964 961 } else { 965 - dma_unmap_page(NULL, desc->buf_ptr, 962 + dma_unmap_page(mp->dev->dev.parent, desc->buf_ptr, 966 963 desc->byte_cnt, DMA_TO_DEVICE); 967 964 } 968 965 ··· 1897 1894 mp->rx_desc_sram_size); 1898 1895 rxq->rx_desc_dma = mp->rx_desc_sram_addr; 1899 1896 } else { 1900 - rxq->rx_desc_area = dma_alloc_coherent(NULL, size, 1901 - &rxq->rx_desc_dma, 1902 - GFP_KERNEL); 1897 + rxq->rx_desc_area = dma_alloc_coherent(mp->dev->dev.parent, 1898 + size, &rxq->rx_desc_dma, 1899 + GFP_KERNEL); 1903 1900 } 1904 1901 1905 1902 if (rxq->rx_desc_area == NULL) { ··· 1950 1947 if (index == 0 && size <= mp->rx_desc_sram_size) 1951 1948 iounmap(rxq->rx_desc_area); 1952 1949 else 1953 - dma_free_coherent(NULL, size, 1950 + dma_free_coherent(mp->dev->dev.parent, size, 1954 1951 rxq->rx_desc_area, 1955 1952 rxq->rx_desc_dma); 1956 1953 ··· 1982 1979 rxq->rx_desc_area_size <= mp->rx_desc_sram_size) 1983 1980 iounmap(rxq->rx_desc_area); 1984 1981 else 1985 - dma_free_coherent(NULL, rxq->rx_desc_area_size, 1982 + dma_free_coherent(mp->dev->dev.parent, rxq->rx_desc_area_size, 1986 1983 rxq->rx_desc_area, rxq->rx_desc_dma); 1987 1984 1988 1985 kfree(rxq->rx_skb); ··· 2010 2007 mp->tx_desc_sram_size); 2011 2008 txq->tx_desc_dma = mp->tx_desc_sram_addr; 2012 2009 } else { 2013 - txq->tx_desc_area = dma_alloc_coherent(NULL, size, 2014 - &txq->tx_desc_dma, 2015 - GFP_KERNEL); 2010 + txq->tx_desc_area = dma_alloc_coherent(mp->dev->dev.parent, 2011 + size, &txq->tx_desc_dma, 2012 + GFP_KERNEL); 2016 2013 } 2017 2014 2018 2015 if (txq->tx_desc_area == NULL) { ··· 2056 2053 txq->tx_desc_area_size <= mp->tx_desc_sram_size) 2057 2054 iounmap(txq->tx_desc_area); 2058 2055 else 2059 - dma_free_coherent(NULL, txq->tx_desc_area_size, 2056 + dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size, 2060 2057 txq->tx_desc_area, txq->tx_desc_dma); 2061 2058 } 2062 2059