mwifiex: DMA alignment for RX packets
This patch adds support for DMA alignment of sk_buffs allocated for RX. Patch also adds support to modify skb allocation flags. Signed-off-by: Marc Yang <yangyang@marvell.com> Signed-off-by: Qingshui Gao <gaoqs@marvell.com> Signed-off-by: Cathy Luo <cluo@marvell.com> Signed-off-by: Avinash Patil <patila@marvell.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
Родитель
1c4c24eb7e
Коммит
31def91b3a
|
@ -33,6 +33,7 @@
|
|||
#define MWIFIEX_MAX_BSS_NUM (3)
|
||||
|
||||
#define MWIFIEX_DMA_ALIGN_SZ 64
|
||||
#define MWIFIEX_RX_HEADROOM 64
|
||||
#define MAX_TXPD_SZ 32
|
||||
#define INTF_HDR_ALIGN 4
|
||||
|
||||
|
|
|
@ -140,6 +140,9 @@ enum {
|
|||
|
||||
#define MWIFIEX_DRV_INFO_SIZE_MAX 0x40000
|
||||
|
||||
/* Address alignment */
|
||||
#define MWIFIEX_ALIGN_ADDR(p, a) (((long)(p) + (a) - 1) & ~((a) - 1))
|
||||
|
||||
struct mwifiex_dbg {
|
||||
u32 num_cmd_host_to_card_failure;
|
||||
u32 num_cmd_sleep_cfm_host_to_card_failure;
|
||||
|
@ -1418,6 +1421,7 @@ u8 mwifiex_adjust_data_rate(struct mwifiex_private *priv,
|
|||
u8 rx_rate, u8 ht_info);
|
||||
|
||||
void mwifiex_dump_drv_info(struct mwifiex_adapter *adapter);
|
||||
void *mwifiex_alloc_rx_buf(int rx_len, gfp_t flags);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void mwifiex_debugfs_init(void);
|
||||
|
|
|
@ -498,7 +498,8 @@ static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
|
|||
|
||||
for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
|
||||
/* Allocate skb here so that firmware can DMA data from it */
|
||||
skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
|
||||
skb = mwifiex_alloc_rx_buf(MWIFIEX_RX_DATA_BUF_SIZE,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (!skb) {
|
||||
dev_err(adapter->dev,
|
||||
"Unable to allocate skb for RX ring.\n");
|
||||
|
@ -1297,7 +1298,8 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
|
|||
}
|
||||
}
|
||||
|
||||
skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
|
||||
skb_tmp = mwifiex_alloc_rx_buf(MWIFIEX_RX_DATA_BUF_SIZE,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (!skb_tmp) {
|
||||
dev_err(adapter->dev,
|
||||
"Unable to allocate skb.\n");
|
||||
|
|
|
@ -1357,7 +1357,7 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
|
|||
return -1;
|
||||
rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
|
||||
|
||||
skb = dev_alloc_skb(rx_len);
|
||||
skb = mwifiex_alloc_rx_buf(rx_len, GFP_KERNEL | GFP_DMA);
|
||||
if (!skb)
|
||||
return -1;
|
||||
|
||||
|
@ -1454,7 +1454,8 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
|
|||
}
|
||||
rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
|
||||
|
||||
skb = dev_alloc_skb(rx_len);
|
||||
skb = mwifiex_alloc_rx_buf(rx_len,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
|
||||
if (!skb) {
|
||||
dev_err(adapter->dev, "%s: failed to alloc skb",
|
||||
|
|
|
@ -631,3 +631,26 @@ void mwifiex_hist_data_reset(struct mwifiex_private *priv)
|
|||
for (ix = 0; ix < MWIFIEX_MAX_SIG_STRENGTH; ix++)
|
||||
atomic_set(&phist_data->sig_str[ix], 0);
|
||||
}
|
||||
|
||||
void *mwifiex_alloc_rx_buf(int rx_len, gfp_t flags)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
int buf_len, pad;
|
||||
|
||||
buf_len = rx_len + MWIFIEX_RX_HEADROOM + MWIFIEX_DMA_ALIGN_SZ;
|
||||
|
||||
skb = __dev_alloc_skb(buf_len, flags);
|
||||
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
skb_reserve(skb, MWIFIEX_RX_HEADROOM);
|
||||
|
||||
pad = MWIFIEX_ALIGN_ADDR(skb->data, MWIFIEX_DMA_ALIGN_SZ) -
|
||||
(long)skb->data;
|
||||
|
||||
skb_reserve(skb, pad);
|
||||
|
||||
return skb;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mwifiex_alloc_rx_buf);
|
||||
|
|
Загрузка…
Ссылка в новой задаче