qcacld-3.0: Genoa: SDIO: Handle Tx Padding & Credits

In Genoa SDIO ADMA implementation Host sends packets to FW in
multiples of SDIO Block size.
If the packet/bundle is not block aligned Host adds padding at the
end of Packet/Bundle.

If the TX packet plus padding exceeds one FW TX Buffer, Padding data
will occupy the next FW TX buffer. Same applies for bundle TX packet.

For above scenario, HTC_FLAGS_PADDING_CHECK of HTC header Flags is used
to notify the FW that - Padding data follows the currentHTC packet

Since the padding data will take one extra FW Tx Buffer, host need to
handle the extra Tx credit being used by the padding data/buffer

CRs-Fixed: 2516619
Change-Id: Ie2d2292fabb30e1a13eebe4d11b57f452e42afa8
This commit is contained in:
Visweswara Tanuku
2019-06-11 10:16:30 +05:30
کامیت شده توسط nshrivas
والد 82415b1dcf
کامیت 2e839e540c
10فایلهای تغییر یافته به همراه105 افزوده شده و 2 حذف شده

مشاهده پرونده

@@ -794,6 +794,8 @@ int htt_htc_attach(struct htt_pdev_t *pdev, uint16_t service_id)
connect.EpCallbacks.EpTxCompleteMultiple = NULL;
connect.EpCallbacks.EpRecv = htt_t2h_msg_handler;
connect.EpCallbacks.ep_resume_tx_queue = htt_tx_resume_handler;
connect.EpCallbacks.ep_padding_credit_update =
htt_tx_padding_credit_update_handler;
/* rx buffers currently are provided by HIF, not by EpRecvRefill */
connect.EpCallbacks.EpRecvRefill = NULL;

مشاهده پرونده

@@ -582,6 +582,8 @@ void htt_h2t_send_complete(void *context, HTC_PACKET *pkt);
QDF_STATUS htt_h2t_ver_req_msg(struct htt_pdev_t *pdev);
int htt_tx_padding_credit_update_handler(void *context, int pad_credit);
#if defined(HELIUMPLUS)
QDF_STATUS
htt_h2t_frag_desc_bank_cfg_msg(struct htt_pdev_t *pdev);

مشاهده پرونده

@@ -865,8 +865,43 @@ htt_tx_send_nonstd(htt_pdev_handle pdev,
return htt_tx_send_std(pdev, msdu, msdu_id);
}
#ifndef QCA_TX_PADDING_CREDIT_SUPPORT
int htt_tx_padding_credit_update_handler(void *context, int pad_credit)
{
return 1;
}
#endif
#else /*ATH_11AC_TXCOMPACT */
#ifdef QCA_TX_PADDING_CREDIT_SUPPORT
static int htt_tx_padding_credit_update(htt_pdev_handle htt_pdev,
int pad_credit)
{
int ret = 0;
if (pad_credit)
qdf_atomic_add(pad_credit,
&htt_pdev->txrx_pdev->pad_reserve_tx_credit);
ret = qdf_atomic_read(&htt_pdev->txrx_pdev->pad_reserve_tx_credit);
return ret;
}
int htt_tx_padding_credit_update_handler(void *context, int pad_credit)
{
struct htt_pdev_t *htt_pdev = (struct htt_pdev_t *)context;
return htt_tx_padding_credit_update(htt_pdev, pad_credit);
}
#else
int htt_tx_padding_credit_update_handler(void *context, int pad_credit)
{
return 1;
}
#endif
#ifdef QCA_TX_HTT2_SUPPORT
static inline HTC_ENDPOINT_ID
htt_tx_htt2_get_ep_id(htt_pdev_handle pdev, qdf_nbuf_t msdu)