diff options
| author | Poddar, Siddarth <siddpodd@codeaurora.org> | 2017-03-19 15:20:28 +0530 |
|---|---|---|
| committer | Sandeep Puligilla <spuligil@codeaurora.org> | 2017-03-20 18:22:57 -0700 |
| commit | e9e2325f6b0111765eea45b34b72e12b54c5db15 (patch) | |
| tree | 02bfb649705cf3f882093f7dbd46b87bfbbc2df9 | |
| parent | c8ca84208d160a6069abed1f7bd2455c39e66382 (diff) | |
qcacld-3.0: Handle error condition when dma map fail
Change the return type to QDF_STATUS of htt_tx_desc_init function
to handle dma map and other error condition.
Free the tx descriptor if this function returns error.
CRs-Fixed: 2021634
Change-Id: Ib9154de308154c43c202ad8a88ecdfff04be47a2
| -rw-r--r-- | core/dp/htt/htt_tx.c | 34 | ||||
| -rw-r--r-- | core/dp/ol/inc/ol_htt_tx_api.h | 25 | ||||
| -rw-r--r-- | core/dp/txrx/ol_tx.c | 16 | ||||
| -rw-r--r-- | core/dp/txrx/ol_tx_desc.c | 11 |
4 files changed, 52 insertions, 34 deletions
diff --git a/core/dp/htt/htt_tx.c b/core/dp/htt/htt_tx.c index c6bbcd7c1228..15863f2a7b11 100644 --- a/core/dp/htt/htt_tx.c +++ b/core/dp/htt/htt_tx.c @@ -1628,28 +1628,7 @@ void htt_push_ext_header(qdf_nbuf_t msdu, } } -/** - * htt_tx_desc_init() - Initialize the per packet HTT Tx descriptor - * @pdev: The handle of the physical device sending the - * tx data - * @htt_tx_desc: Abstract handle to the tx descriptor - * @htt_tx_desc_paddr_lo: Physical address of the HTT tx descriptor - * @msdu_id: ID to tag the descriptor with. - * The FW sends this ID back to host as a cookie - * during Tx completion, which the host uses to - * identify the MSDU. - * This ID is an index into the OL Tx desc. array. - * @msdu: The MSDU that is being prepared for transmission - * @msdu_info: Tx MSDU meta-data - * @tso_info: Storage for TSO meta-data - * @ext_header_data: extension header data - * @type: extension header type - * - * This function initializes the HTT tx descriptor. - * HTT Tx descriptor is a host-f/w interface structure, and meta-data - * accompanying every packet downloaded to f/w via the HTT interface. - */ -void +QDF_STATUS htt_tx_desc_init(htt_pdev_handle pdev, void *htt_tx_desc, qdf_dma_addr_t htt_tx_desc_paddr, @@ -1679,17 +1658,17 @@ htt_tx_desc_init(htt_pdev_handle pdev, if (qdf_unlikely(!qdf_ctx)) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: qdf_ctx is NULL", __func__); - return; + return QDF_STATUS_E_FAILURE; } if (qdf_unlikely(!msdu_info)) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: bad arg: msdu_info is NULL", __func__); - return; + return QDF_STATUS_E_FAILURE; } if (qdf_unlikely(!tso_info)) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: bad arg: tso_info is NULL", __func__); - return; + return QDF_STATUS_E_FAILURE; } word0 = (uint32_t *) htt_tx_desc; @@ -1716,7 +1695,7 @@ htt_tx_desc_init(htt_pdev_handle pdev, if (0xffffffff == ce_pkt_type) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, "Invalid HTT pkt type %d\n", pkt_type); - return; + return QDF_STATUS_E_INVAL; } } @@ -1803,7 +1782,7 @@ htt_tx_desc_init(htt_pdev_handle pdev, if (qdf_unlikely(status != QDF_STATUS_SUCCESS)) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: nbuf map failed", __func__); - return; + return QDF_STATUS_E_NOMEM; } } @@ -1832,6 +1811,7 @@ htt_tx_desc_init(htt_pdev_handle pdev, } qdf_nbuf_data_attr_set(msdu, data_attr); + return QDF_STATUS_SUCCESS; } #ifdef FEATURE_HL_GROUP_CREDIT_FLOW_CONTROL diff --git a/core/dp/ol/inc/ol_htt_tx_api.h b/core/dp/ol/inc/ol_htt_tx_api.h index 9a13307b92c3..ccd17db45d6e 100644 --- a/core/dp/ol/inc/ol_htt_tx_api.h +++ b/core/dp/ol/inc/ol_htt_tx_api.h @@ -533,7 +533,30 @@ extern const uint32_t htt_to_ce_pkt_type[]; */ #define HTT_TX_DESC_VADDR_OFFSET 8 -void +/** + * htt_tx_desc_init() - Initialize the per packet HTT Tx descriptor + * @pdev: The handle of the physical device sending the + * tx data + * @htt_tx_desc: Abstract handle to the tx descriptor + * @htt_tx_desc_paddr_lo: Physical address of the HTT tx descriptor + * @msdu_id: ID to tag the descriptor with. + * The FW sends this ID back to host as a cookie + * during Tx completion, which the host uses to + * identify the MSDU. + * This ID is an index into the OL Tx desc. array. + * @msdu: The MSDU that is being prepared for transmission + * @msdu_info: Tx MSDU meta-data + * @tso_info: Storage for TSO meta-data + * @ext_header_data: extension header data + * @type: extension header type + * + * This function initializes the HTT tx descriptor. + * HTT Tx descriptor is a host-f/w interface structure, and meta-data + * accompanying every packet downloaded to f/w via the HTT interface. + * + * Return QDF_STATUS_SUCCESS for success, otherwise error. + */ +QDF_STATUS htt_tx_desc_init(htt_pdev_handle pdev, void *htt_tx_desc, qdf_dma_addr_t htt_tx_desc_paddr, diff --git a/core/dp/txrx/ol_tx.c b/core/dp/txrx/ol_tx.c index e5980ebb2437..8993aa0a1223 100644 --- a/core/dp/txrx/ol_tx.c +++ b/core/dp/txrx/ol_tx.c @@ -490,10 +490,17 @@ ol_tx_prepare_ll_fast(struct ol_txrx_pdev_t *pdev, /* TODO: Precompute and store paddr in ol_tx_desc_t */ /* Virtual address of the HTT/HTC header, added by driver */ htc_hdr_vaddr = (char *)htt_tx_desc - HTC_HEADER_LEN; - htt_tx_desc_init(pdev->htt_pdev, htt_tx_desc, + if (qdf_unlikely(htt_tx_desc_init(pdev->htt_pdev, htt_tx_desc, tx_desc->htt_tx_desc_paddr, tx_desc->id, msdu, &msdu_info->htt, &msdu_info->tso_info, - NULL, type); + NULL, type))) { + /* + * HTT Tx descriptor initialization failed. + * therefore, free the tx desc + */ + ol_tx_desc_free(pdev, tx_desc); + return NULL; + } num_frags = qdf_nbuf_get_num_frags(msdu); /* num_frags are expected to be 2 max */ @@ -1452,12 +1459,13 @@ int ol_txrx_mgmt_send_frame( * an added L2 header. */ htt_tx_desc_mpdu_header(tx_desc->htt_tx_desc, 0); - htt_tx_desc_init( + if (qdf_unlikely(htt_tx_desc_init( pdev->htt_pdev, tx_desc->htt_tx_desc, tx_desc->htt_tx_desc_paddr, ol_tx_desc_id(pdev, tx_desc), tx_mgmt_frm, - &tx_msdu_info->htt, &tx_msdu_info->tso_info, NULL, 0); + &tx_msdu_info->htt, &tx_msdu_info->tso_info, NULL, 0))) + return 1; htt_tx_desc_display(tx_desc->htt_tx_desc); htt_tx_desc_set_chanfreq(tx_desc->htt_tx_desc, chanfreq); diff --git a/core/dp/txrx/ol_tx_desc.c b/core/dp/txrx/ol_tx_desc.c index 477a921ff53e..585be2891c43 100644 --- a/core/dp/txrx/ol_tx_desc.c +++ b/core/dp/txrx/ol_tx_desc.c @@ -584,10 +584,17 @@ struct ol_tx_desc_t *ol_tx_desc_ll(struct ol_txrx_pdev_t *pdev, type = ol_tx_get_ext_header_type(vdev, netbuf); /* initialize the HW tx descriptor */ - htt_tx_desc_init(pdev->htt_pdev, tx_desc->htt_tx_desc, + if (qdf_unlikely(htt_tx_desc_init(pdev->htt_pdev, tx_desc->htt_tx_desc, tx_desc->htt_tx_desc_paddr, ol_tx_desc_id(pdev, tx_desc), netbuf, &msdu_info->htt, - &msdu_info->tso_info, NULL, type); + &msdu_info->tso_info, NULL, type))) { + /* + * HTT Tx descriptor initialization failed. + * therefore, free the tx desc + */ + ol_tx_desc_free(pdev, tx_desc); + return NULL; + } /* * Initialize the fragmentation descriptor. |
