Revert "qcacld-3.0: Management MGMT TXRX component over HTT"

This reverts change id I013deb6e526fc0c99b1620a9d267063d1c3406f0

Change-Id: Ie2a0201a8d5f466fbf026f163efd4413ad5993a5
This commit is contained in:
Suresh Nandini 2017-10-12 20:33:58 -07:00 • committed by Nandini Suresh
commit 433fbd4ced
7 changed files with 178 additions and 79 deletions

View file

@ -1894,13 +1894,15 @@ ol_txrx_data_tx_cb_set(struct cdp_vdev *pvdev,
void
ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev,
uint8_t type,
ol_txrx_mgmt_tx_cb download_cb,
ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt)
{
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
pdev->tx_mgmt_cb.download_cb = download_cb;
pdev->tx_mgmt_cb.ota_ack_cb = ota_ack_cb;
pdev->tx_mgmt_cb.ctxt = ctxt;
TXRX_ASSERT1(type < OL_TXRX_MGMT_NUM_TYPES);
pdev->tx_mgmt.callbacks[type].download_cb = download_cb;
pdev->tx_mgmt.callbacks[type].ota_ack_cb = ota_ack_cb;
pdev->tx_mgmt.callbacks[type].ctxt = ctxt;
}
#if defined(HELIUMPLUS)
@ -1962,7 +1964,7 @@ ol_txrx_mgmt_send_ext(struct cdp_vdev *pvdev,
tx_msdu_info.htt.info.ext_tid = HTT_TX_EXT_TID_MGMT;
tx_msdu_info.htt.info.vdev_id = vdev->vdev_id;
tx_msdu_info.htt.action.do_tx_complete =
pdev->tx_mgmt_cb.ota_ack_cb ? 1 : 0;
pdev->tx_mgmt.callbacks[type].ota_ack_cb ? 1 : 0;
/*
* FIX THIS: l2_hdr_type should only specify L2 header type

View file

@ -124,6 +124,7 @@ void ol_txrx_mgmt_tx_complete(void *ctxt, qdf_nbuf_t netbuf, int err);
* ol_txrx_mgmt_tx_cb_set() - Store a callback for delivery
* notifications for management frames.
* @ppdev: the data physical device object
* @type: the type of mgmt frame the callback is used for
* @download_cb: the callback for notification of delivery to the target
* @ota_ack_cb: the callback for notification of delivery to the peer
* @ctxt: context to use with the callback
@ -140,6 +141,7 @@ void ol_txrx_mgmt_tx_complete(void *ctxt, qdf_nbuf_t netbuf, int err);
*/
void
ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev,
uint8_t type,
ol_txrx_mgmt_tx_cb download_cb,
ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt);

View file

@ -771,7 +771,6 @@ void ol_tx_desc_frame_free_nonstd(struct ol_txrx_pdev_t *pdev,
OL_TX_RESTORE_HDR(tx_desc, (tx_desc->netbuf));
#endif
if (tx_desc->pkt_type == OL_TX_FRM_NO_FREE) {
/* free the tx desc but don't unmap or free the frame */
if (pdev->tx_data_callback.func) {
qdf_nbuf_set_next(tx_desc->netbuf, NULL);
@ -817,12 +816,15 @@ void ol_tx_desc_frame_free_nonstd(struct ol_txrx_pdev_t *pdev,
* provided to the txrx layer.
* no need to check it a 2nd time.
*/
ota_ack_cb = pdev->tx_mgmt_cb.ota_ack_cb;
ota_ack_cb = pdev->tx_mgmt.callbacks[mgmt_type].ota_ack_cb;
if (ota_ack_cb) {
void *ctxt;
ctxt = pdev->tx_mgmt_cb.ctxt;
ctxt = pdev->tx_mgmt.callbacks[mgmt_type].ctxt;
ota_ack_cb(ctxt, tx_desc->netbuf, had_error);
}
/* free the netbuf */
qdf_nbuf_free(tx_desc->netbuf);
} else if (had_error == htt_tx_status_download_fail) {
/* Failed to send to target */

View file

@ -325,10 +325,12 @@ ol_tx_download_done_base(struct ol_txrx_pdev_t *pdev,
* call the download callback if registered
*/
if (tx_desc->pkt_type >= OL_TXRX_MGMT_TYPE_BASE) {
int tx_mgmt_index = tx_desc->pkt_type - OL_TXRX_MGMT_TYPE_BASE;
ol_txrx_mgmt_tx_cb download_cb =
pdev->tx_mgmt_cb.download_cb;
pdev->tx_mgmt.callbacks[tx_mgmt_index].download_cb;
if (download_cb) {
download_cb(pdev->tx_mgmt_cb.ctxt,
download_cb(pdev->tx_mgmt.callbacks[tx_mgmt_index].ctxt,
tx_desc->netbuf, status != A_OK);
}
}

View file

@ -702,10 +702,12 @@ struct ol_txrx_pdev_t {
/* tx management delivery notification callback functions */
struct {
ol_txrx_mgmt_tx_cb download_cb;
ol_txrx_mgmt_tx_cb ota_ack_cb;
void *ctxt;
} tx_mgmt_cb;
struct {
ol_txrx_mgmt_tx_cb download_cb;
ol_txrx_mgmt_tx_cb ota_ack_cb;
void *ctxt;
} callbacks[OL_TXRX_MGMT_NUM_TYPES];
} tx_mgmt;
data_stall_detect_cb data_stall_detect_callback;
/* packetdump callback functions */

View file

@ -82,7 +82,6 @@
#include "wlan_objmgr_peer_obj.h"
#include <cdp_txrx_handle.h>
#include <wlan_pmo_ucfg_api.h>
#include "wlan_lmac_if_api.h"
struct wma_search_rate {
int32_t rate;
@ -1369,6 +1368,66 @@ QDF_STATUS wma_process_rate_update_indicate(tp_wma_handle wma,
return QDF_STATUS_SUCCESS;
}
/**
* wma_mgmt_tx_ack_work_handler() - mgmt tx ack work queue
* @ack_work: work structure
*
* Return: none
*/
static void wma_mgmt_tx_ack_work_handler(void *ack_work)
{
struct wma_tx_ack_work_ctx *work;
tp_wma_handle wma_handle;
wma_tx_ota_comp_callback ack_cb;
if (cds_is_load_or_unload_in_progress()) {
WMA_LOGE("%s: Driver load/unload in progress", __func__);
return;
}
work = (struct wma_tx_ack_work_ctx *)ack_work;
wma_handle = work->wma_handle;
ack_cb = wma_handle->umac_ota_ack_cb[work->sub_type];
WMA_LOGD("Tx Ack Cb SubType %d Status %d",
work->sub_type, work->status);
/* Call the Ack Cb registered by UMAC */
ack_cb((tpAniSirGlobal) (wma_handle->mac_context), NULL,
work->status ? 0 : 1, NULL);
qdf_mem_free(work);
wma_handle->ack_work_ctx = NULL;
}
/**
* wma_mgmt_tx_comp_conf_ind() - Post mgmt tx complete indication to PE.
* @wma_handle: Pointer to WMA handle
* @sub_type: Tx mgmt frame sub type
* @status: Mgmt frame tx status
*
* This function sends mgmt complition confirmation to PE for deauth
* and deassoc frames.
*
* Return: none
*/
static void
wma_mgmt_tx_comp_conf_ind(tp_wma_handle wma_handle, uint8_t sub_type,
int32_t status)
{
int32_t tx_comp_status;
tx_comp_status = status ? 0 : 1;
if (sub_type == SIR_MAC_MGMT_DISASSOC) {
wma_send_msg(wma_handle, WMA_DISASSOC_TX_COMP, NULL,
tx_comp_status);
} else if (sub_type == SIR_MAC_MGMT_DEAUTH) {
wma_send_msg(wma_handle, WMA_DEAUTH_TX_COMP, NULL,
tx_comp_status);
}
}
/**
* wma_mgmt_tx_ack_comp_hdlr() - handles tx ack mgmt completion
* @context: context with which the handler is registered
@ -1383,14 +1442,34 @@ QDF_STATUS wma_process_rate_update_indicate(tp_wma_handle wma,
static void
wma_mgmt_tx_ack_comp_hdlr(void *wma_context, qdf_nbuf_t netbuf, int32_t status)
{
tpSirMacFrameCtl pFc = (tpSirMacFrameCtl) (qdf_nbuf_data(netbuf));
tp_wma_handle wma_handle = (tp_wma_handle) wma_context;
struct wlan_objmgr_psoc *psoc = (struct wlan_objmgr_psoc *)
wma_handle->psoc;
uint16_t desc_id;
desc_id = QDF_NBUF_CB_MGMT_TXRX_DESC_ID(netbuf);
if (wma_handle && wma_handle->umac_ota_ack_cb[pFc->subType]) {
if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
(pFc->subType == SIR_MAC_MGMT_DEAUTH)) {
wma_mgmt_tx_comp_conf_ind(wma_handle,
(uint8_t) pFc->subType,
status);
} else {
struct wma_tx_ack_work_ctx *ack_work;
mgmt_txrx_tx_completion_handler(psoc, desc_id, status, NULL);
ack_work = qdf_mem_malloc(sizeof(
struct wma_tx_ack_work_ctx));
if (ack_work) {
ack_work->wma_handle = wma_handle;
ack_work->sub_type = pFc->subType;
ack_work->status = status;
qdf_create_work(0, &ack_work->ack_cmp_work,
wma_mgmt_tx_ack_work_handler,
ack_work);
qdf_sched_work(0, &ack_work->ack_cmp_work);
}
}
}
}
/**
@ -1451,6 +1530,15 @@ QDF_STATUS wma_tx_attach(tp_wma_handle wma_handle)
/* Register for Tx Management Frames */
cdp_mgmt_tx_cb_set(soc, txrx_pdev,
GENERIC_NODOWLOAD_ACK_COMP_INDEX,
NULL, wma_mgmt_tx_ack_comp_hdlr, wma_handle);
cdp_mgmt_tx_cb_set(soc, txrx_pdev,
GENERIC_DOWNLD_COMP_NOACK_COMP_INDEX,
wma_mgmt_tx_dload_comp_hldr, NULL, wma_handle);
cdp_mgmt_tx_cb_set(soc, txrx_pdev,
GENERIC_DOWNLD_COMP_ACK_COMP_INDEX,
wma_mgmt_tx_dload_comp_hldr,
wma_mgmt_tx_ack_comp_hdlr, wma_handle);
@ -1470,6 +1558,7 @@ QDF_STATUS wma_tx_attach(tp_wma_handle wma_handle)
*/
QDF_STATUS wma_tx_detach(tp_wma_handle wma_handle)
{
uint32_t frame_index = 0;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
/* Get the Vos Context */
@ -1486,7 +1575,12 @@ QDF_STATUS wma_tx_detach(tp_wma_handle wma_handle)
if (txrx_pdev) {
/* Deregister with TxRx for Tx Mgmt completion call back */
cdp_mgmt_tx_cb_set(soc, txrx_pdev, NULL, NULL, txrx_pdev);
for (frame_index = 0; frame_index < FRAME_INDEX_MAX;
frame_index++) {
cdp_mgmt_tx_cb_set(soc,
txrx_pdev,
frame_index, NULL, NULL, txrx_pdev);
}
}
/* Reset Tx Frm Callbacks */
@ -2680,6 +2774,11 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
else
tx_frm_index = GENERIC_NODOWLOAD_ACK_COMP_INDEX;
/* Store the Ack Cb sent by UMAC */
if (pFc->subType < SIR_MAC_MGMT_RESERVED15) {
wma_handle->umac_ota_ack_cb[pFc->subType] =
tx_frm_ota_comp_cb;
}
} else {
if (downld_comp_required)
tx_frm_index =
@ -2742,52 +2841,58 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
}
}
mgmt_param.tx_frame = tx_frame;
mgmt_param.frm_len = frmLen;
mgmt_param.vdev_id = vdev_id;
mgmt_param.pdata = pData;
mgmt_param.chanfreq = chanfreq;
mgmt_param.qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
mgmt_param.use_6mbps = use_6mbps;
mgmt_param.tx_type = tx_frm_index;
if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
WMI_SERVICE_MGMT_TX_WMI)) {
mgmt_param.tx_frame = tx_frame;
mgmt_param.frm_len = frmLen;
mgmt_param.vdev_id = vdev_id;
mgmt_param.pdata = pData;
mgmt_param.chanfreq = chanfreq;
mgmt_param.qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
/*
* Update the tx_params TLV only for rates
* other than 1Mbps and 6 Mbps
*/
if (rid < RATEID_DEFAULT &&
(rid != RATEID_1MBPS && rid != RATEID_6MBPS)) {
WMA_LOGD(FL("using rate id: %d for Tx"), rid);
mgmt_param.tx_params_valid = true;
wma_update_tx_send_params(&mgmt_param.tx_param, rid);
}
/*
* Update the tx_params TLV only for rates
* other than 1Mbps and 6 Mbps
*/
if (rid < RATEID_DEFAULT &&
(rid != RATEID_1MBPS && rid != RATEID_6MBPS)) {
WMA_LOGD(FL("using rate id: %d for Tx"), rid);
mgmt_param.tx_params_valid = true;
wma_update_tx_send_params(&mgmt_param.tx_param, rid);
}
psoc = wma_handle->psoc;
if (!psoc) {
WMA_LOGE("%s: psoc ctx is NULL", __func__);
goto error;
}
psoc = wma_handle->psoc;
if (!psoc) {
WMA_LOGE("%s: psoc ctx is NULL", __func__);
goto error;
}
wh = (struct ieee80211_frame *)(qdf_nbuf_data(tx_frame));
mac_addr = wh->i_addr1;
peer = wlan_objmgr_get_peer(psoc, mac_addr, WLAN_MGMT_NB_ID);
if (!peer) {
mac_addr = wh->i_addr2;
peer = wlan_objmgr_get_peer(psoc, mac_addr,
WLAN_MGMT_NB_ID);
}
wh = (struct ieee80211_frame *)(qdf_nbuf_data(tx_frame));
mac_addr = wh->i_addr1;
peer = wlan_objmgr_get_peer(psoc, mac_addr, WLAN_MGMT_NB_ID);
if (!peer) {
mac_addr = wh->i_addr2;
peer = wlan_objmgr_get_peer(psoc, mac_addr,
WLAN_MGMT_NB_ID);
}
status = wlan_mgmt_txrx_mgmt_frame_tx(peer,
(tpAniSirGlobal)wma_handle->mac_context,
(qdf_nbuf_t)tx_frame,
NULL, tx_frm_ota_comp_cb,
WLAN_UMAC_COMP_MLME, &mgmt_param);
status = wlan_mgmt_txrx_mgmt_frame_tx(peer,
(tpAniSirGlobal)wma_handle->mac_context,
(qdf_nbuf_t)tx_frame,
NULL, tx_frm_ota_comp_cb,
WLAN_UMAC_COMP_MLME, &mgmt_param);
wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_NB_ID);
if (status != QDF_STATUS_SUCCESS) {
WMA_LOGE("%s: mgmt tx failed", __func__);
qdf_nbuf_free((qdf_nbuf_t)tx_frame);
goto error;
wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_NB_ID);
if (status != QDF_STATUS_SUCCESS) {
WMA_LOGE("%s: mgmt tx failed", __func__);
qdf_nbuf_free((qdf_nbuf_t)tx_frame);
goto error;
}
} else {
/* Hand over the Tx Mgmt frame to TxRx */
status = cdp_mgmt_send_ext(soc,
txrx_vdev, tx_frame,
tx_frm_index, use_6mbps, chanfreq);
}
/*

View file

@ -3922,8 +3922,6 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev,
QDF_STATUS status;
struct wmi_mgmt_params *mgmt_params =
(struct wmi_mgmt_params *)mgmt_tx_params;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct cdp_vdev *txrx_vdev;
if (!mgmt_params) {
WMA_LOGE("%s: mgmt_params ptr passed is NULL", __func__);
@ -3942,22 +3940,8 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_E_INVAL;
}
txrx_vdev = wma_handle->interfaces[mgmt_params->vdev_id].handle;
if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
WMI_SERVICE_MGMT_TX_WMI)) {
status = wmi_mgmt_unified_cmd_send(wma_handle->wmi_handle,
mgmt_params);
} else {
QDF_NBUF_CB_MGMT_TXRX_DESC_ID(buf)
= mgmt_params->desc_id;
status = cdp_mgmt_send_ext(soc, txrx_vdev, buf,
mgmt_params->tx_type,
mgmt_params->use_6mbps,
mgmt_params->chanfreq);
}
status = wmi_mgmt_unified_cmd_send(wma_handle->wmi_handle,
mgmt_params);
if (status != QDF_STATUS_SUCCESS) {
WMA_LOGE("%s: mgmt tx failed", __func__);
return status;