18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * This file contains the handling of command
48c2ecf20Sopenharmony_ci * responses as well as events generated by firmware.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/hardirq.h>
88c2ecf20Sopenharmony_ci#include <linux/slab.h>
98c2ecf20Sopenharmony_ci#include <linux/delay.h>
108c2ecf20Sopenharmony_ci#include <linux/sched.h>
118c2ecf20Sopenharmony_ci#include <asm/unaligned.h>
128c2ecf20Sopenharmony_ci#include <net/cfg80211.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include "cfg.h"
158c2ecf20Sopenharmony_ci#include "cmd.h"
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci/**
188c2ecf20Sopenharmony_ci * lbs_mac_event_disconnected - handles disconnect event. It
198c2ecf20Sopenharmony_ci * reports disconnect to upper layer, clean tx/rx packets,
208c2ecf20Sopenharmony_ci * reset link state etc.
218c2ecf20Sopenharmony_ci *
228c2ecf20Sopenharmony_ci * @priv:	A pointer to struct lbs_private structure
238c2ecf20Sopenharmony_ci * @locally_generated: indicates disconnect was requested locally
248c2ecf20Sopenharmony_ci *		(usually by userspace)
258c2ecf20Sopenharmony_ci *
268c2ecf20Sopenharmony_ci * returns:	n/a
278c2ecf20Sopenharmony_ci */
288c2ecf20Sopenharmony_civoid lbs_mac_event_disconnected(struct lbs_private *priv,
298c2ecf20Sopenharmony_ci				bool locally_generated)
308c2ecf20Sopenharmony_ci{
318c2ecf20Sopenharmony_ci	unsigned long flags;
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	if (priv->connect_status != LBS_CONNECTED)
348c2ecf20Sopenharmony_ci		return;
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	/*
378c2ecf20Sopenharmony_ci	 * Cisco AP sends EAP failure and de-auth in less than 0.5 ms.
388c2ecf20Sopenharmony_ci	 * It causes problem in the Supplicant
398c2ecf20Sopenharmony_ci	 */
408c2ecf20Sopenharmony_ci	msleep_interruptible(1000);
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	if (priv->wdev->iftype == NL80211_IFTYPE_STATION)
438c2ecf20Sopenharmony_ci		lbs_send_disconnect_notification(priv, locally_generated);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	/* report disconnect to upper layer */
468c2ecf20Sopenharmony_ci	netif_stop_queue(priv->dev);
478c2ecf20Sopenharmony_ci	netif_carrier_off(priv->dev);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	/* Free Tx and Rx packets */
508c2ecf20Sopenharmony_ci	spin_lock_irqsave(&priv->driver_lock, flags);
518c2ecf20Sopenharmony_ci	dev_kfree_skb_irq(priv->currenttxskb);
528c2ecf20Sopenharmony_ci	priv->currenttxskb = NULL;
538c2ecf20Sopenharmony_ci	priv->tx_pending_len = 0;
548c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&priv->driver_lock, flags);
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	priv->connect_status = LBS_DISCONNECTED;
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	if (priv->psstate != PS_STATE_FULL_POWER) {
598c2ecf20Sopenharmony_ci		/* make firmware to exit PS mode */
608c2ecf20Sopenharmony_ci		lbs_deb_cmd("disconnected, so exit PS mode\n");
618c2ecf20Sopenharmony_ci		lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, false);
628c2ecf20Sopenharmony_ci	}
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ciint lbs_process_command_response(struct lbs_private *priv, u8 *data, u32 len)
668c2ecf20Sopenharmony_ci{
678c2ecf20Sopenharmony_ci	uint16_t respcmd, curcmd;
688c2ecf20Sopenharmony_ci	struct cmd_header *resp;
698c2ecf20Sopenharmony_ci	int ret = 0;
708c2ecf20Sopenharmony_ci	unsigned long flags;
718c2ecf20Sopenharmony_ci	uint16_t result;
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	mutex_lock(&priv->lock);
748c2ecf20Sopenharmony_ci	spin_lock_irqsave(&priv->driver_lock, flags);
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci	if (!priv->cur_cmd) {
778c2ecf20Sopenharmony_ci		lbs_deb_host("CMD_RESP: cur_cmd is NULL\n");
788c2ecf20Sopenharmony_ci		ret = -1;
798c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&priv->driver_lock, flags);
808c2ecf20Sopenharmony_ci		goto done;
818c2ecf20Sopenharmony_ci	}
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	resp = (void *)data;
848c2ecf20Sopenharmony_ci	curcmd = le16_to_cpu(priv->cur_cmd->cmdbuf->command);
858c2ecf20Sopenharmony_ci	respcmd = le16_to_cpu(resp->command);
868c2ecf20Sopenharmony_ci	result = le16_to_cpu(resp->result);
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci	lbs_deb_cmd("CMD_RESP: response 0x%04x, seq %d, size %d\n",
898c2ecf20Sopenharmony_ci		     respcmd, le16_to_cpu(resp->seqnum), len);
908c2ecf20Sopenharmony_ci	lbs_deb_hex(LBS_DEB_CMD, "CMD_RESP", (void *) resp, len);
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) {
938c2ecf20Sopenharmony_ci		netdev_info(priv->dev,
948c2ecf20Sopenharmony_ci			    "Received CMD_RESP with invalid sequence %d (expected %d)\n",
958c2ecf20Sopenharmony_ci			    le16_to_cpu(resp->seqnum),
968c2ecf20Sopenharmony_ci			    le16_to_cpu(priv->cur_cmd->cmdbuf->seqnum));
978c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&priv->driver_lock, flags);
988c2ecf20Sopenharmony_ci		ret = -1;
998c2ecf20Sopenharmony_ci		goto done;
1008c2ecf20Sopenharmony_ci	}
1018c2ecf20Sopenharmony_ci	if (respcmd != CMD_RET(curcmd) &&
1028c2ecf20Sopenharmony_ci	    respcmd != CMD_RET_802_11_ASSOCIATE && curcmd != CMD_802_11_ASSOCIATE) {
1038c2ecf20Sopenharmony_ci		netdev_info(priv->dev, "Invalid CMD_RESP %x to command %x!\n",
1048c2ecf20Sopenharmony_ci			    respcmd, curcmd);
1058c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&priv->driver_lock, flags);
1068c2ecf20Sopenharmony_ci		ret = -1;
1078c2ecf20Sopenharmony_ci		goto done;
1088c2ecf20Sopenharmony_ci	}
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	if (resp->result == cpu_to_le16(0x0004)) {
1118c2ecf20Sopenharmony_ci		/* 0x0004 means -EAGAIN. Drop the response, let it time out
1128c2ecf20Sopenharmony_ci		   and be resubmitted */
1138c2ecf20Sopenharmony_ci		netdev_info(priv->dev,
1148c2ecf20Sopenharmony_ci			    "Firmware returns DEFER to command %x. Will let it time out...\n",
1158c2ecf20Sopenharmony_ci			    le16_to_cpu(resp->command));
1168c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&priv->driver_lock, flags);
1178c2ecf20Sopenharmony_ci		ret = -1;
1188c2ecf20Sopenharmony_ci		goto done;
1198c2ecf20Sopenharmony_ci	}
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	/* Now we got response from FW, cancel the command timer */
1228c2ecf20Sopenharmony_ci	del_timer(&priv->command_timer);
1238c2ecf20Sopenharmony_ci	priv->cmd_timed_out = 0;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {
1268c2ecf20Sopenharmony_ci		/* struct cmd_ds_802_11_ps_mode also contains
1278c2ecf20Sopenharmony_ci		 * the header
1288c2ecf20Sopenharmony_ci		 */
1298c2ecf20Sopenharmony_ci		struct cmd_ds_802_11_ps_mode *psmode = (void *)resp;
1308c2ecf20Sopenharmony_ci		u16 action = le16_to_cpu(psmode->action);
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci		lbs_deb_host(
1338c2ecf20Sopenharmony_ci		       "CMD_RESP: PS_MODE cmd reply result 0x%x, action 0x%x\n",
1348c2ecf20Sopenharmony_ci		       result, action);
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci		if (result) {
1378c2ecf20Sopenharmony_ci			lbs_deb_host("CMD_RESP: PS command failed with 0x%x\n",
1388c2ecf20Sopenharmony_ci				    result);
1398c2ecf20Sopenharmony_ci			/*
1408c2ecf20Sopenharmony_ci			 * We should not re-try enter-ps command in
1418c2ecf20Sopenharmony_ci			 * ad-hoc mode. It takes place in
1428c2ecf20Sopenharmony_ci			 * lbs_execute_next_command().
1438c2ecf20Sopenharmony_ci			 */
1448c2ecf20Sopenharmony_ci			if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR &&
1458c2ecf20Sopenharmony_ci			    action == PS_MODE_ACTION_ENTER_PS)
1468c2ecf20Sopenharmony_ci				priv->psmode = LBS802_11POWERMODECAM;
1478c2ecf20Sopenharmony_ci		} else if (action == PS_MODE_ACTION_ENTER_PS) {
1488c2ecf20Sopenharmony_ci			priv->needtowakeup = 0;
1498c2ecf20Sopenharmony_ci			priv->psstate = PS_STATE_AWAKE;
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci			lbs_deb_host("CMD_RESP: ENTER_PS command response\n");
1528c2ecf20Sopenharmony_ci			if (priv->connect_status != LBS_CONNECTED) {
1538c2ecf20Sopenharmony_ci				/*
1548c2ecf20Sopenharmony_ci				 * When Deauth Event received before Enter_PS command
1558c2ecf20Sopenharmony_ci				 * response, We need to wake up the firmware.
1568c2ecf20Sopenharmony_ci				 */
1578c2ecf20Sopenharmony_ci				lbs_deb_host(
1588c2ecf20Sopenharmony_ci				       "disconnected, invoking lbs_ps_wakeup\n");
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci				spin_unlock_irqrestore(&priv->driver_lock, flags);
1618c2ecf20Sopenharmony_ci				mutex_unlock(&priv->lock);
1628c2ecf20Sopenharmony_ci				lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS,
1638c2ecf20Sopenharmony_ci						false);
1648c2ecf20Sopenharmony_ci				mutex_lock(&priv->lock);
1658c2ecf20Sopenharmony_ci				spin_lock_irqsave(&priv->driver_lock, flags);
1668c2ecf20Sopenharmony_ci			}
1678c2ecf20Sopenharmony_ci		} else if (action == PS_MODE_ACTION_EXIT_PS) {
1688c2ecf20Sopenharmony_ci			priv->needtowakeup = 0;
1698c2ecf20Sopenharmony_ci			priv->psstate = PS_STATE_FULL_POWER;
1708c2ecf20Sopenharmony_ci			lbs_deb_host("CMD_RESP: EXIT_PS command response\n");
1718c2ecf20Sopenharmony_ci		} else {
1728c2ecf20Sopenharmony_ci			lbs_deb_host("CMD_RESP: PS action 0x%X\n", action);
1738c2ecf20Sopenharmony_ci		}
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci		__lbs_complete_command(priv, priv->cur_cmd, result);
1768c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&priv->driver_lock, flags);
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci		ret = 0;
1798c2ecf20Sopenharmony_ci		goto done;
1808c2ecf20Sopenharmony_ci	}
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci	/* If the command is not successful, cleanup and return failure */
1838c2ecf20Sopenharmony_ci	if ((result != 0 || !(respcmd & 0x8000))) {
1848c2ecf20Sopenharmony_ci		lbs_deb_host("CMD_RESP: error 0x%04x in command reply 0x%04x\n",
1858c2ecf20Sopenharmony_ci		       result, respcmd);
1868c2ecf20Sopenharmony_ci		/*
1878c2ecf20Sopenharmony_ci		 * Handling errors here
1888c2ecf20Sopenharmony_ci		 */
1898c2ecf20Sopenharmony_ci		switch (respcmd) {
1908c2ecf20Sopenharmony_ci		case CMD_RET(CMD_GET_HW_SPEC):
1918c2ecf20Sopenharmony_ci		case CMD_RET(CMD_802_11_RESET):
1928c2ecf20Sopenharmony_ci			lbs_deb_host("CMD_RESP: reset failed\n");
1938c2ecf20Sopenharmony_ci			break;
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci		}
1968c2ecf20Sopenharmony_ci		__lbs_complete_command(priv, priv->cur_cmd, result);
1978c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&priv->driver_lock, flags);
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci		ret = -1;
2008c2ecf20Sopenharmony_ci		goto done;
2018c2ecf20Sopenharmony_ci	}
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&priv->driver_lock, flags);
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	if (priv->cur_cmd && priv->cur_cmd->callback) {
2068c2ecf20Sopenharmony_ci		ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg,
2078c2ecf20Sopenharmony_ci				resp);
2088c2ecf20Sopenharmony_ci	}
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	spin_lock_irqsave(&priv->driver_lock, flags);
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci	if (priv->cur_cmd) {
2138c2ecf20Sopenharmony_ci		/* Clean up and Put current command back to cmdfreeq */
2148c2ecf20Sopenharmony_ci		__lbs_complete_command(priv, priv->cur_cmd, result);
2158c2ecf20Sopenharmony_ci	}
2168c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&priv->driver_lock, flags);
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_cidone:
2198c2ecf20Sopenharmony_ci	mutex_unlock(&priv->lock);
2208c2ecf20Sopenharmony_ci	return ret;
2218c2ecf20Sopenharmony_ci}
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_civoid lbs_process_event(struct lbs_private *priv, u32 event)
2248c2ecf20Sopenharmony_ci{
2258c2ecf20Sopenharmony_ci	struct cmd_header cmd;
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci	switch (event) {
2288c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_LINK_SENSED:
2298c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: link sensed\n");
2308c2ecf20Sopenharmony_ci		break;
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_DEAUTHENTICATED:
2338c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: deauthenticated\n");
2348c2ecf20Sopenharmony_ci		lbs_mac_event_disconnected(priv, false);
2358c2ecf20Sopenharmony_ci		break;
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_DISASSOCIATED:
2388c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: disassociated\n");
2398c2ecf20Sopenharmony_ci		lbs_mac_event_disconnected(priv, false);
2408c2ecf20Sopenharmony_ci		break;
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_LINK_LOST_NO_SCAN:
2438c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: link lost\n");
2448c2ecf20Sopenharmony_ci		lbs_mac_event_disconnected(priv, true);
2458c2ecf20Sopenharmony_ci		break;
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_PS_SLEEP:
2488c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: ps sleep\n");
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ci		/* handle unexpected PS SLEEP event */
2518c2ecf20Sopenharmony_ci		if (priv->psstate == PS_STATE_FULL_POWER) {
2528c2ecf20Sopenharmony_ci			lbs_deb_cmd(
2538c2ecf20Sopenharmony_ci			       "EVENT: in FULL POWER mode, ignoring PS_SLEEP\n");
2548c2ecf20Sopenharmony_ci			break;
2558c2ecf20Sopenharmony_ci		}
2568c2ecf20Sopenharmony_ci		if (!list_empty(&priv->cmdpendingq)) {
2578c2ecf20Sopenharmony_ci			lbs_deb_cmd("EVENT: commands in queue, do not sleep\n");
2588c2ecf20Sopenharmony_ci			break;
2598c2ecf20Sopenharmony_ci		}
2608c2ecf20Sopenharmony_ci		priv->psstate = PS_STATE_PRE_SLEEP;
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci		lbs_ps_confirm_sleep(priv);
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci		break;
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_HOST_AWAKE:
2678c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: host awake\n");
2688c2ecf20Sopenharmony_ci		if (priv->reset_deep_sleep_wakeup)
2698c2ecf20Sopenharmony_ci			priv->reset_deep_sleep_wakeup(priv);
2708c2ecf20Sopenharmony_ci		priv->is_deep_sleep = 0;
2718c2ecf20Sopenharmony_ci		lbs_cmd_async(priv, CMD_802_11_WAKEUP_CONFIRM, &cmd,
2728c2ecf20Sopenharmony_ci				sizeof(cmd));
2738c2ecf20Sopenharmony_ci		priv->is_host_sleep_activated = 0;
2748c2ecf20Sopenharmony_ci		wake_up_interruptible(&priv->host_sleep_q);
2758c2ecf20Sopenharmony_ci		break;
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_DEEP_SLEEP_AWAKE:
2788c2ecf20Sopenharmony_ci		if (priv->reset_deep_sleep_wakeup)
2798c2ecf20Sopenharmony_ci			priv->reset_deep_sleep_wakeup(priv);
2808c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: ds awake\n");
2818c2ecf20Sopenharmony_ci		priv->is_deep_sleep = 0;
2828c2ecf20Sopenharmony_ci		priv->wakeup_dev_required = 0;
2838c2ecf20Sopenharmony_ci		wake_up_interruptible(&priv->ds_awake_q);
2848c2ecf20Sopenharmony_ci		break;
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_PS_AWAKE:
2878c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: ps awake\n");
2888c2ecf20Sopenharmony_ci		/* handle unexpected PS AWAKE event */
2898c2ecf20Sopenharmony_ci		if (priv->psstate == PS_STATE_FULL_POWER) {
2908c2ecf20Sopenharmony_ci			lbs_deb_cmd(
2918c2ecf20Sopenharmony_ci			       "EVENT: In FULL POWER mode - ignore PS AWAKE\n");
2928c2ecf20Sopenharmony_ci			break;
2938c2ecf20Sopenharmony_ci		}
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ci		priv->psstate = PS_STATE_AWAKE;
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ci		if (priv->needtowakeup) {
2988c2ecf20Sopenharmony_ci			/*
2998c2ecf20Sopenharmony_ci			 * wait for the command processing to finish
3008c2ecf20Sopenharmony_ci			 * before resuming sending
3018c2ecf20Sopenharmony_ci			 * priv->needtowakeup will be set to FALSE
3028c2ecf20Sopenharmony_ci			 * in lbs_ps_wakeup()
3038c2ecf20Sopenharmony_ci			 */
3048c2ecf20Sopenharmony_ci			lbs_deb_cmd("waking up ...\n");
3058c2ecf20Sopenharmony_ci			lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, false);
3068c2ecf20Sopenharmony_ci		}
3078c2ecf20Sopenharmony_ci		break;
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_MIC_ERR_UNICAST:
3108c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: UNICAST MIC ERROR\n");
3118c2ecf20Sopenharmony_ci		lbs_send_mic_failureevent(priv, event);
3128c2ecf20Sopenharmony_ci		break;
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_MIC_ERR_MULTICAST:
3158c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: MULTICAST MIC ERROR\n");
3168c2ecf20Sopenharmony_ci		lbs_send_mic_failureevent(priv, event);
3178c2ecf20Sopenharmony_ci		break;
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_MIB_CHANGED:
3208c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: MIB CHANGED\n");
3218c2ecf20Sopenharmony_ci		break;
3228c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_INIT_DONE:
3238c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: INIT DONE\n");
3248c2ecf20Sopenharmony_ci		break;
3258c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_ADHOC_BCN_LOST:
3268c2ecf20Sopenharmony_ci		lbs_deb_cmd("EVENT: ADHOC beacon lost\n");
3278c2ecf20Sopenharmony_ci		break;
3288c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_RSSI_LOW:
3298c2ecf20Sopenharmony_ci		netdev_alert(priv->dev, "EVENT: rssi low\n");
3308c2ecf20Sopenharmony_ci		break;
3318c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_SNR_LOW:
3328c2ecf20Sopenharmony_ci		netdev_alert(priv->dev, "EVENT: snr low\n");
3338c2ecf20Sopenharmony_ci		break;
3348c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_MAX_FAIL:
3358c2ecf20Sopenharmony_ci		netdev_alert(priv->dev, "EVENT: max fail\n");
3368c2ecf20Sopenharmony_ci		break;
3378c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_RSSI_HIGH:
3388c2ecf20Sopenharmony_ci		netdev_alert(priv->dev, "EVENT: rssi high\n");
3398c2ecf20Sopenharmony_ci		break;
3408c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_SNR_HIGH:
3418c2ecf20Sopenharmony_ci		netdev_alert(priv->dev, "EVENT: snr high\n");
3428c2ecf20Sopenharmony_ci		break;
3438c2ecf20Sopenharmony_ci
3448c2ecf20Sopenharmony_ci	case MACREG_INT_CODE_MESH_AUTO_STARTED:
3458c2ecf20Sopenharmony_ci		/* Ignore spurious autostart events */
3468c2ecf20Sopenharmony_ci		netdev_info(priv->dev, "EVENT: MESH_AUTO_STARTED (ignoring)\n");
3478c2ecf20Sopenharmony_ci		break;
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_ci	default:
3508c2ecf20Sopenharmony_ci		netdev_alert(priv->dev, "EVENT: unknown event id %d\n", event);
3518c2ecf20Sopenharmony_ci		break;
3528c2ecf20Sopenharmony_ci	}
3538c2ecf20Sopenharmony_ci}
354