Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d7bb7b6 authored by Surabhi Vishnoi's avatar Surabhi Vishnoi Committed by Gerrit - the friendly Code Review server
Browse files

wlan: Register the callbacks for receiving driver state

Register the callbacks with the platform driver to receive
driver states (WCNSS_SMD_OPEN and WCNSS_SMD_CLOSE). This
is required due to migration to upstream rpmsg.

Change-Id: I05c6129921a42cb130e0998a2bffd0010bcad762
CRs-Fixed:
parent 62e99f0e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -610,4 +610,6 @@ VOS_STATUS vos_smd_open(const char *szname, WCTS_ControlBlockType* wcts_cb);
 * Return: None
 */
void wcts_state_open(WCTS_ControlBlockType* wcts_cb);

void wlan_unregister_driver(void);
#endif // if !defined __VOS_NVITEM_H
+12 −0
Original line number Diff line number Diff line
@@ -3960,6 +3960,11 @@ v_BOOL_t vos_check_monitor_state(void)
}

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))
struct wcnss_driver_ops driver_ops = {
	.name = "WLAN_CTRL",
	.driver_state = WCTS_driver_state_process
};

VOS_STATUS vos_smd_open(const char *szname, WCTS_ControlBlockType* wcts_cb)
{
	wcts_cb->wctsChannel = wcnss_open_channel(szname,
@@ -3973,8 +3978,15 @@ VOS_STATUS vos_smd_open(const char *szname, WCTS_ControlBlockType* wcts_cb)

	wcts_state_open(wcts_cb);

	wcnss_register_driver(&driver_ops, wcts_cb);

	return VOS_STATUS_SUCCESS;
}

void wlan_unregister_driver(void )
{
	wcnss_unregister_driver(&driver_ops);
}
#else
VOS_STATUS vos_smd_open(const char *szname, WCTS_ControlBlockType* wcts_cb)
{
+11 −0
Original line number Diff line number Diff line
@@ -346,5 +346,16 @@ void WCTS_NotifyCallback( void *data, unsigned event);
 */
int WCTS_smd_resp_process(struct rpmsg_device *rpdev,
			  void *buf, int len, void *priv, u32 addr);

enum wcnss_driver_state;
/**
 * WCTS_driver_state_process() - Callback to process driver state info
 *
 * @priv: The user-supplied data provided in wcnss_register_driver()
 * @state: driver state
 *
 * @return status
 */
int WCTS_driver_state_process(void *priv, enum wcnss_driver_state state);
#endif
#endif /* #ifndef WLAN_QCT_WDI_CTS_H */
+48 −0
Original line number Diff line number Diff line
@@ -530,6 +530,53 @@ void wcts_state_open(WCTS_ControlBlockType* wcts_cb)
   /* serialize this event */
   wpalPostCtrlMsg(WDI_GET_PAL_CTX(), palMsg);
}

int WCTS_driver_state_process(void *priv, enum wcnss_driver_state state)
{
	WCTS_ControlBlockType* wcts_cb = (WCTS_ControlBlockType*) priv;
	wpt_msg *pal_msg;

	switch (state) {
	case WCNSS_SMD_OPEN:
		WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
			   "%s: received WCNSS_SMD_OPEN from SMD", __func__);
		/* If the prev state was 'remote closed' then it is a Riva 'restart',
		 * subsystem restart re-init
		 */
		if (WCTS_STATE_REM_CLOSED == wcts_cb->wctsState) {
			WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
				   "%s: received WCNSS_SMD_OPEN in WCTS_STATE_REM_CLOSED state",
				   __func__);
			/* call subsystem restart re-init function */
			wpalDriverReInit();
			return 0;
		}
		gWdiSmdStats.smd_event_open++;
		pal_msg = &wcts_cb->wctsOpenMsg;
		break;
	case WCNSS_SMD_CLOSE:
		WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
			   "%s: received WCNSS_SMD_CLOSE from SMD", __func__);
		/* SMD channel was closed from the remote side,
		 * this would happen only when Riva crashed and SMD is
		 * closing the channel on behalf of Riva */
		vos_spin_lock_acquire(&wcts_cb->wctsStateLock);
		wcts_cb->wctsState = WCTS_STATE_REM_CLOSED;
		WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
			   "%s: received WCNSS_SMD_CLOSE WLAN driver going down now",
			   __func__);
		vos_spin_lock_release(&wcts_cb->wctsStateLock);

		/* subsystem restart: shutdown */
		wpalDriverShutdown();
		gWdiSmdStats.smd_event_close++;
		return 0;
	}

	/* serialize this event */
	wpalPostCtrlMsg(WDI_GET_PAL_CTX(), pal_msg);
	return 0;
}
#else
void
WCTS_NotifyCallback
@@ -867,6 +914,7 @@ WCTS_CloseTransport
   }
#else
   wcnss_close_channel(pWCTSCb->wctsChannel);
   wlan_unregister_driver();
#endif

   /* channel has (hopefully) been closed */