be2net: dma_sync each RX frag before passing it to the stack
authorSathya Perla <sathya.perla@emulex.com>
Tue, 4 Mar 2014 06:44:38 +0000 (12:14 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Mar 2014 21:17:53 +0000 (16:17 -0500)
commite50287be7c007a10e6e2e3332e52466faf4b6a04
tree7ecf4f04fe32210aba3e7c4a3f9fd0c369c619b5
parent9e82e7f4af0ad90ab41b4ae80ce42b20df20c725
be2net: dma_sync each RX frag before passing it to the stack

The driver currently maps a page for DMA, divides the page into multiple
frags and posts them to the HW. It un-maps the page after data is received
on all the frags of the page. This scheme doesn't work when bounce buffers
are used for DMA (swiotlb=force kernel param).

This patch fixes this problem by calling dma_sync_single_for_cpu() for each
frag (excepting the last one) so that the data is copied from the bounce
buffers. The page is un-mapped only when DMA finishes on the last frag of
the page.
(Thanks Ben H. for suggesting the dma_sync API!)

This patch also renames the "last_page_user" field of be_rx_page_info{}
struct to "last_frag" to improve readability of the fixed code.

Reported-by: Li Fengmao <li.fengmao@zte.com.cn>
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_main.c