1  /*
2   * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  
20  /**
21   * DOC: wlan_qct_wma_legacy.c
22   *
23   * This software unit holds the implementation of the WLAN Device Adaptation
24   * Layer for the legacy functionalities that were part of the old HAL.
25   *
26   * The functions externalized by this module are to be called ONLY by other
27   * WLAN modules that properly register with the Transport Layer initially.
28   *
29   */
30  
31  /* Standard include files */
32  /* Application Specific include files */
33  #include "lim_api.h"
34  #include "wma.h"
35  #include "sme_power_save_api.h"
36  /* Locally used Defines */
37  
38  #define HAL_MMH_MB_MSG_TYPE_MASK    0xFF00
39  
40  /**
41   * wma_post_ctrl_msg() - Posts WMA messages to MC thread
42   * @mac: MAC parameters structure
43   * @pMsg: pointer with message
44   *
45   * Return: Success or Failure
46   */
47  
wma_post_ctrl_msg(struct mac_context * mac,struct scheduler_msg * pMsg)48  QDF_STATUS wma_post_ctrl_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
49  {
50  	if (QDF_STATUS_SUCCESS !=
51  	    scheduler_post_message(QDF_MODULE_ID_WMA,
52  				   QDF_MODULE_ID_WMA,
53  				   QDF_MODULE_ID_WMA, pMsg))
54  		return QDF_STATUS_E_FAILURE;
55  	else
56  		return QDF_STATUS_SUCCESS;
57  }
58  
59  /**
60   * u_mac_post_ctrl_msg() - post ctrl msg
61   * @pMb: A pointer to the mailbox message
62   *
63   * Forwards the completely received message to the respective
64   * modules for further processing.
65   *
66   * NOTE:
67   *  This function has been moved to the API file because for MAC running
68   *  on Windows host, the host module will call this routine directly to
69   *  send any mailbox messages. Making this function an API makes sure that
70   *  outside world (any module outside MMH) only calls APIs to use MMH
71   *  services and not an internal function.
72   *
73   * Return: success/error code
74   */
75  
u_mac_post_ctrl_msg(void * pSirGlobal,tSirMbMsg * pMb)76  QDF_STATUS u_mac_post_ctrl_msg(void *pSirGlobal, tSirMbMsg *pMb)
77  {
78  	struct scheduler_msg msg = {0};
79  	QDF_STATUS status = QDF_STATUS_SUCCESS;
80  	struct mac_context *mac = (struct mac_context *) pSirGlobal;
81  
82  	msg.type = pMb->type;
83  	msg.bodyval = 0;
84  	msg.bodyptr = pMb;
85  
86  	switch (msg.type & HAL_MMH_MB_MSG_TYPE_MASK) {
87  	case WMA_MSG_TYPES_BEGIN:       /* Posts a message to the HAL MsgQ */
88  		status = wma_post_ctrl_msg(mac, &msg);
89  		break;
90  
91  	case SIR_LIM_MSG_TYPES_BEGIN:   /* Posts a message to the LIM MsgQ */
92  		status = lim_post_msg_api(mac, &msg);
93  		break;
94  
95  	case SIR_SME_MSG_TYPES_BEGIN:   /* Posts a message to the LIM MsgQ */
96  		status = sme_post_pe_message(mac, &msg);
97  		break;
98  
99  	default:
100  		wma_debug("Unknown message type = 0x%X", msg.type);
101  		qdf_mem_free(msg.bodyptr);
102  		return QDF_STATUS_E_FAILURE;
103  	}
104  
105  	if (status != QDF_STATUS_SUCCESS)
106  		qdf_mem_free(msg.bodyptr);
107  
108  	return status;
109  
110  } /* u_mac_post_ctrl_msg() */
111  
umac_send_mb_message_to_mac(void * msg)112  QDF_STATUS umac_send_mb_message_to_mac(void *msg)
113  {
114  	void *mac_handle = cds_get_context(QDF_MODULE_ID_SME);
115  
116  	if (!mac_handle) {
117  		qdf_mem_free(msg);
118  		return QDF_STATUS_E_FAILURE;
119  	}
120  
121  	return u_mac_post_ctrl_msg(mac_handle, msg);
122  }
123