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