qcacmn: Genoa: SDIO: Alloc Rx SKB buffer based on Payload Len

Allocate Rx SKB buffers based on Payload Length indicated in
HTC Header

CRs-Fixed: 2517051
Change-Id: I337e70eeae804ba8ef17a671a5fc39e59382e96d
This commit is contained in:
Visweswara Tanuku 2019-08-30 16:35:23 +05:30 • committed by nshrivas
commit ebebd7632b
2 changed files with 32 additions and 24 deletions

View file

@ -373,18 +373,15 @@ QDF_STATUS hif_enable_func(struct hif_softc *ol_sc, struct hif_sdio_dev *device,
*
* Return - NULL if out of buffers, else qdf_nbuf_t
*/
#define HEAD_ROOM 256
#define RESERVE_LEN 256
#define is_pad_block(buf) (*((uint32_t *)buf) == 0xbabababa)
#if HIF_MAX_RX_Q_ALLOC
qdf_nbuf_t hif_sdio_get_nbuf(struct hif_sdio_dev *dev)
static qdf_nbuf_t hif_sdio_get_nbuf(struct hif_sdio_dev *dev, uint16_t buf_len)
{
qdf_list_node_t *node;
qdf_nbuf_t nbuf = NULL;
qdf_list_t *q = &dev->rx_q;
struct rx_q_entry *elem = NULL;
/* TODO - Alloc nbuf based on buf_len */
qdf_spin_lock_irqsave(&dev->rx_q_lock);
if (q->count) {
@ -408,12 +405,15 @@ qdf_nbuf_t hif_sdio_get_nbuf(struct hif_sdio_dev *dev)
return nbuf;
}
#else
qdf_nbuf_t hif_sdio_get_nbuf(struct hif_sdio_dev *dev)
static qdf_nbuf_t hif_sdio_get_nbuf(struct hif_sdio_dev *dev, uint16_t buf_len)
{
qdf_nbuf_t nbuf;
nbuf = qdf_nbuf_alloc(NULL, HIF_SDIO_RX_BUFFER_SIZE + RESERVE_LEN,
HEAD_ROOM, 4, 0);
if (!buf_len)
buf_len = HIF_SDIO_RX_BUFFER_SIZE;
nbuf = qdf_nbuf_alloc(NULL, buf_len, 0, 4, false);
return nbuf;
}
#endif
@ -440,8 +440,9 @@ void hif_sdio_rx_q_alloc(void *ctx)
break;
}
rx_q_elem->nbuf = qdf_nbuf_alloc(NULL, HIF_SDIO_RX_BUFFER_SIZE +
RESERVE_LEN, HEAD_ROOM, 4, 0);
/* TODO - Alloc nbuf based on payload_len in HTC Header */
rx_q_elem->nbuf = qdf_nbuf_alloc(NULL, HIF_SDIO_RX_BUFFER_SIZE,
0, 4, false);
if (!rx_q_elem->nbuf) {
HIF_ERROR("%s: failed to alloc nbuf for rx", __func__);
qdf_mem_free(rx_q_elem);
@ -739,7 +740,7 @@ void dl_data_avail_cb(struct sdio_al_channel_handle *ch_handle,
* processed in the transfer done callback.
*/
/* TODO, use global buffer instead of runtime allocations */
nbuf = qdf_nbuf_alloc(NULL, len + RESERVE_LEN, HEAD_ROOM, 4, 0);
nbuf = qdf_nbuf_alloc(NULL, len, 0, 4, false);
if (!nbuf) {
HIF_ERROR("%s: Unable to alloc netbuf %u bytes", __func__, len);
@ -750,6 +751,9 @@ void dl_data_avail_cb(struct sdio_al_channel_handle *ch_handle,
HIF_RD_ASYNC_BLOCK_FIX, nbuf);
}
#define is_pad_block(buf) (*((uint32_t *)buf) == 0xbabababa)
uint16_t g_dbg_payload_len;
/**
* dl_xfer_cb() - Call from lower layer after transfer is completed
* @ch_handle: The sdio al channel handle
@ -764,7 +768,8 @@ void dl_xfer_cb(struct sdio_al_channel_handle *ch_handle,
{
unsigned char *buf;
qdf_nbuf_t nbuf;
uint32_t len, payload_len = 0;
uint32_t len;
uint16_t payload_len = 0;
struct hif_sdio_dev *dev;
struct hif_sdio_device *device;
struct bus_request *bus_req = (struct bus_request *)ctx;
@ -798,7 +803,7 @@ void dl_xfer_cb(struct sdio_al_channel_handle *ch_handle,
buf = (unsigned char *)result->buf_addr;
len = (unsigned int)result->xfer_len;
while (len > 0 && len >= sizeof(HTC_FRAME_HDR)) {
while (len >= sizeof(HTC_FRAME_HDR)) {
if (is_pad_block(buf)) {
/* End of Rx Buffer */
break;
@ -812,18 +817,22 @@ void dl_xfer_cb(struct sdio_al_channel_handle *ch_handle,
break;
}
nbuf = hif_sdio_get_nbuf(dev);
if (!nbuf) {
HIF_ERROR("%s: failed to alloc rx buffer", __func__);
break;
}
/* Copy the HTC frame to the alloc'd packet buffer */
payload_len = HTC_GET_FIELD(buf, HTC_FRAME_HDR, PAYLOADLEN);
payload_len = qdf_le16_to_cpu(payload_len);
if (!payload_len) {
HIF_ERROR("%s:Invalid Payload len %d bytes", __func__,
payload_len);
qdf_nbuf_free(nbuf);
break;
}
if (payload_len > g_dbg_payload_len) {
g_dbg_payload_len = payload_len;
HIF_ERROR("Max Rx HTC Payload = %d", g_dbg_payload_len);
}
nbuf = hif_sdio_get_nbuf(dev, payload_len + HTC_HEADER_LEN);
if (!nbuf) {
HIF_ERROR("%s: failed to alloc rx buffer", __func__);
break;
}
@ -839,9 +848,9 @@ void dl_xfer_cb(struct sdio_al_channel_handle *ch_handle,
qdf_mem_copy((uint8_t *)qdf_nbuf_data(nbuf), buf,
payload_len + HTC_HEADER_LEN);
qdf_nbuf_set_pktlen(nbuf, payload_len + HTC_HDR_LENGTH);
rx_completion(device->hif_callbacks.Context,
nbuf,
qdf_nbuf_put_tail(nbuf, payload_len + HTC_HDR_LENGTH);
rx_completion(device->hif_callbacks.Context, nbuf,
0); /* don't care, not used */
len -= payload_len + HTC_HDR_LENGTH;

View file

@ -59,5 +59,4 @@ void dl_data_avail_cb(struct sdio_al_channel_handle *ch_handle,
unsigned int len);
void hif_sdio_rx_q_alloc(void *ctx);
qdf_nbuf_t hif_sdio_get_nbuf(struct hif_sdio_dev *dev);
#endif