forked from Minki/linux
dbccc92b5d
Depending on the underlying DMA implementation its not possible to partially unmap DMA buffers. Moreover its not possible to understand the intent of passing 0 as the size to dma unmap. The intent of this driver is unmap the entire skb buffer. The only way to ensure that the size matches on unmap is to store both the dma address and the size in the skb ca field. Introduce a mwifiex_dma_mapping structure which tracks the dma address and the size. Additionally, provide a mwifiex_unmap_pci_memory() that utilizes the new structure. This also provide symmetry within the internal API. Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Paul Stewart <pstew@chromium.org> Reviewed-by: Avinash Patil <patila@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
54 lines
1.6 KiB
C
54 lines
1.6 KiB
C
/*
|
|
* Marvell Wireless LAN device driver: utility functions
|
|
*
|
|
* Copyright (C) 2011, Marvell International Ltd.
|
|
*
|
|
* This software file (the "File") is distributed by Marvell International
|
|
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
|
|
* (the "License"). You may use, redistribute and/or modify this File in
|
|
* accordance with the terms and conditions of the License, a copy of which
|
|
* is available by writing to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
|
|
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
*
|
|
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
|
|
* this warranty disclaimer.
|
|
*/
|
|
|
|
#ifndef _MWIFIEX_UTIL_H_
|
|
#define _MWIFIEX_UTIL_H_
|
|
|
|
static inline struct mwifiex_rxinfo *MWIFIEX_SKB_RXCB(struct sk_buff *skb)
|
|
{
|
|
return (struct mwifiex_rxinfo *)(skb->cb + sizeof(dma_addr_t));
|
|
}
|
|
|
|
static inline struct mwifiex_txinfo *MWIFIEX_SKB_TXCB(struct sk_buff *skb)
|
|
{
|
|
return (struct mwifiex_txinfo *)(skb->cb + sizeof(dma_addr_t));
|
|
}
|
|
|
|
struct mwifiex_dma_mapping {
|
|
dma_addr_t addr;
|
|
size_t len;
|
|
};
|
|
|
|
static inline void MWIFIEX_SKB_PACB(struct sk_buff *skb,
|
|
struct mwifiex_dma_mapping *mapping)
|
|
{
|
|
memcpy(mapping, skb->cb, sizeof(*mapping));
|
|
}
|
|
|
|
static inline dma_addr_t MWIFIEX_SKB_DMA_ADDR(struct sk_buff *skb)
|
|
{
|
|
struct mwifiex_dma_mapping mapping;
|
|
|
|
MWIFIEX_SKB_PACB(skb, &mapping);
|
|
|
|
return mapping.addr;
|
|
}
|
|
|
|
#endif /* !_MWIFIEX_UTIL_H_ */
|