Lines Matching +full:m3 +full:- +full:dump

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
23 SER_EV_L1_RESET_PREPARE, /* pre-M0 */
25 SER_EV_DO_RECOVERY, /* M3 */
65 return ser->ev_tbl[event].name; in ser_ev_name()
72 if (ser->state < SER_ST_MAX_ST) in ser_st_name()
73 return ser->st_tbl[ser->state].name; in ser_st_name()
87 p->type = _type; \
88 p->type_size = sizeof(p->data); \
89 p->padding = 0x0123456789abcdef; \
118 ser_cd_fw_rsvd_ple_init(&buf->fwple); in rtw89_ser_cd_prep()
119 ser_cd_fw_backtrace_init(&buf->fwbt); in rtw89_ser_cd_prep()
127 rtw89_debug(rtwdev, RTW89_DBG_SER, "SER sends core dump\n"); in rtw89_ser_cd_send()
130 * handled by the device coredump framework. Note that a new dump in rtw89_ser_cd_send()
134 dev_coredumpv(rtwdev->dev, buf, sizeof(*buf), GFP_KERNEL); in rtw89_ser_cd_send()
143 rtw89_debug(rtwdev, RTW89_DBG_SER, "SER frees core dump by self\n"); in rtw89_ser_cd_free()
145 /* When some problems happen during filling data of core dump, in rtw89_ser_cd_free()
159 wiphy_lock(rtwdev->hw->wiphy); in ser_state_run()
161 wiphy_unlock(rtwdev->hw->wiphy); in ser_state_run()
163 ser->st_tbl[ser->state].st_func(ser, evt); in ser_state_run()
170 if (ser->state == new_state || new_state >= SER_ST_MAX_ST) in ser_state_goto()
174 rtw89_debug(rtwdev, RTW89_DBG_SER, "ser: %s goto -> %s\n", in ser_state_goto()
175 ser_st_name(ser), ser->st_tbl[new_state].name); in ser_state_goto()
177 ser->state = new_state; in ser_state_goto()
185 spin_lock_irq(&ser->msg_q_lock); in __rtw89_ser_dequeue_msg()
186 msg = list_first_entry_or_null(&ser->msg_q, struct ser_msg, list); in __rtw89_ser_dequeue_msg()
188 list_del(&msg->list); in __rtw89_ser_dequeue_msg()
189 spin_unlock_irq(&ser->msg_q_lock); in __rtw89_ser_dequeue_msg()
201 ser_state_run(ser, msg->event); in rtw89_ser_hdl_work()
211 if (test_bit(RTW89_SER_DRV_STOP_RUN, ser->flags)) in ser_send_msg()
212 return -EIO; in ser_send_msg()
216 return -ENOMEM; in ser_send_msg()
218 msg->event = event; in ser_send_msg()
220 spin_lock_irq(&ser->msg_q_lock); in ser_send_msg()
221 list_add(&msg->list, &ser->msg_q); in ser_send_msg()
222 spin_unlock_irq(&ser->msg_q_lock); in ser_send_msg()
224 ieee80211_queue_work(rtwdev->hw, &ser->ser_hdl_work); in ser_send_msg()
233 ser_send_msg(ser, ser->alarm_event); in rtw89_ser_alarm_work()
234 ser->alarm_event = SER_EV_NONE; in rtw89_ser_alarm_work()
241 if (test_bit(RTW89_SER_DRV_STOP_RUN, ser->flags)) in ser_set_alarm()
244 ser->alarm_event = event; in ser_set_alarm()
245 ieee80211_queue_delayed_work(rtwdev->hw, &ser->ser_alarm_work, in ser_set_alarm()
251 cancel_delayed_work(&ser->ser_alarm_work); in ser_del_alarm()
252 ser->alarm_event = SER_EV_NONE; in ser_del_alarm()
260 ieee80211_stop_queues(rtwdev->hw); in drv_stop_tx()
261 set_bit(RTW89_SER_DRV_STOP_TX, ser->flags); in drv_stop_tx()
268 clear_bit(RTW89_FLAG_RUNNING, rtwdev->flags); in drv_stop_rx()
269 set_bit(RTW89_SER_DRV_STOP_RX, ser->flags); in drv_stop_rx()
283 if (!test_bit(RTW89_SER_DRV_STOP_TX, ser->flags)) in drv_resume_tx()
286 ieee80211_wake_queues(rtwdev->hw); in drv_resume_tx()
287 clear_bit(RTW89_SER_DRV_STOP_TX, ser->flags); in drv_resume_tx()
294 if (!test_bit(RTW89_SER_DRV_STOP_RX, ser->flags)) in drv_resume_rx()
297 set_bit(RTW89_FLAG_RUNNING, rtwdev->flags); in drv_resume_rx()
298 clear_bit(RTW89_SER_DRV_STOP_RX, ser->flags); in drv_resume_rx()
306 rtwvif->tdls_peer = 0; in ser_reset_vif()
309 rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif_link->port); in ser_reset_vif()
310 rtwvif_link->net_type = RTW89_NET_TYPE_NO_LINK; in ser_reset_vif()
311 rtwvif_link->trigger = false; in ser_reset_vif()
312 rtwvif_link->rand_tsf_done = false; in ser_reset_vif()
322 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in ser_sta_deinit_cam_iter()
323 struct rtw89_dev *rtwdev = rtwvif->rtwdev; in ser_sta_deinit_cam_iter()
332 rtwvif_link = rtwsta_link->rtwvif_link; in ser_sta_deinit_cam_iter()
334 if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls) in ser_sta_deinit_cam_iter()
335 rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta_link->addr_cam); in ser_sta_deinit_cam_iter()
336 if (sta->tdls) in ser_sta_deinit_cam_iter()
337 rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta_link->bssid_cam); in ser_sta_deinit_cam_iter()
339 INIT_LIST_HEAD(&rtwsta_link->ba_cam_list); in ser_sta_deinit_cam_iter()
348 ieee80211_iterate_stations_atomic(rtwdev->hw, in ser_deinit_cam()
355 bitmap_zero(rtwdev->cam_info.ba_cam_map, RTW89_MAX_BA_CAM_NUM); in ser_deinit_cam()
366 rtw89_core_release_all_bits_map(rtwdev->mac_id_map, RTW89_MAX_MAC_ID_NUM); in ser_reset_mac_binding()
370 rtwdev->total_sta_assoc = 0; in ser_reset_mac_binding()
371 refcount_set(&rtwdev->refcount_ap_info, 0); in ser_reset_mac_binding()
380 if (!test_bit(RTW89_SER_HAL_STOP_DMA, ser->flags)) in hal_enable_dma()
383 if (!rtwdev->hci.ops->mac_lv1_rcvy) in hal_enable_dma()
384 return -EIO; in hal_enable_dma()
386 ret = rtwdev->hci.ops->mac_lv1_rcvy(rtwdev, RTW89_LV1_RCVY_STEP_2); in hal_enable_dma()
388 clear_bit(RTW89_SER_HAL_STOP_DMA, ser->flags); in hal_enable_dma()
401 if (!rtwdev->hci.ops->mac_lv1_rcvy) in hal_stop_dma()
402 return -EIO; in hal_stop_dma()
404 ret = rtwdev->hci.ops->mac_lv1_rcvy(rtwdev, RTW89_LV1_RCVY_STEP_1); in hal_stop_dma()
406 set_bit(RTW89_SER_HAL_STOP_DMA, ser->flags); in hal_stop_dma()
443 clear_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags); in ser_idle_st_hdl()
444 clear_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags); in ser_idle_st_hdl()
456 set_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags); in ser_idle_st_hdl()
468 ser->prehandle_l1 = true; in ser_l1_reset_pre_st_hdl()
489 struct wiphy *wiphy = rtwdev->hw->wiphy; in ser_reset_trx_st_hdl()
494 wiphy_delayed_work_cancel(wiphy, &rtwdev->track_work); in ser_reset_trx_st_hdl()
495 wiphy_delayed_work_cancel(wiphy, &rtwdev->track_ps_work); in ser_reset_trx_st_hdl()
507 /* wait m3 */ in ser_reset_trx_st_hdl()
527 wiphy_delayed_work_queue(wiphy, &rtwdev->track_work, in ser_reset_trx_st_hdl()
529 wiphy_delayed_work_queue(wiphy, &rtwdev->track_ps_work, in ser_reset_trx_st_hdl()
569 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in ser_mac_mem_dump()
570 u32 filter_model_addr = mac->filter_model_addr; in ser_mac_mem_dump()
571 u32 indir_access_addr = mac->indir_access_addr; in ser_mac_mem_dump()
572 u32 mem_page_size = mac->mem_page_size; in ser_mac_mem_dump()
580 base_addr = mac->mem_base_addrs[sel]; in ser_mac_mem_dump()
602 u32 start_addr = rtwdev->chip->rsvd_ple_ofst; in rtw89_ser_fw_rsvd_ple_dump()
605 "dump mem for fw rsvd payload engine (start addr: 0x%x)\n", in rtw89_ser_fw_rsvd_ple_dump()
641 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_ser_fw_backtrace_dump()
642 u32 filter_model_addr = mac->filter_model_addr; in rtw89_ser_fw_backtrace_dump()
643 u32 indir_access_addr = mac->indir_access_addr; in rtw89_ser_fw_backtrace_dump()
644 u32 fwbt_addr = convert_addr_from_wcpu(ent->wcpu_addr); in rtw89_ser_fw_backtrace_dump()
645 u32 fwbt_size = ent->size; in rtw89_ser_fw_backtrace_dump()
646 u32 fwbt_key = ent->key; in rtw89_ser_fw_backtrace_dump()
652 return -EINVAL; in rtw89_ser_fw_backtrace_dump()
658 return -EINVAL; in rtw89_ser_fw_backtrace_dump()
665 return -EINVAL; in rtw89_ser_fw_backtrace_dump()
668 rtw89_debug(rtwdev, RTW89_DBG_SER, "dump fw backtrace start\n"); in rtw89_ser_fw_backtrace_dump()
680 ptr->sp, ptr->ra); in rtw89_ser_fw_backtrace_dump()
683 rtw89_debug(rtwdev, RTW89_DBG_SER, "dump fw backtrace end\n"); in rtw89_ser_fw_backtrace_dump()
696 ret = -ENOMEM; in ser_l2_reset_st_pre_hdl()
700 rtw89_ser_fw_rsvd_ple_dump(rtwdev, buf->fwple.data); in ser_l2_reset_st_pre_hdl()
702 fwbt_ent = *(struct __fw_backtrace_entry *)buf->fwple.data; in ser_l2_reset_st_pre_hdl()
703 ret = rtw89_ser_fw_backtrace_dump(rtwdev, buf->fwbt.data, &fwbt_ent); in ser_l2_reset_st_pre_hdl()
716 INIT_LIST_HEAD(&rtwdev->rtwvifs_list); in ser_l2_reset_st_pre_hdl()
725 wiphy_lock(rtwdev->hw->wiphy); in ser_l2_reset_st_hdl()
727 wiphy_unlock(rtwdev->hw->wiphy); in ser_l2_reset_st_hdl()
729 ieee80211_restart_hw(rtwdev->hw); in ser_l2_reset_st_hdl()
734 rtw89_info(rtwdev, "Err: ser L2 re-config timeout\n"); in ser_l2_reset_st_hdl()
753 {SER_EV_L1_RESET_PREPARE, "SER_EV_L1_RESET_PREPARE pre-m0"},
755 {SER_EV_DO_RECOVERY, "SER_EV_DO_RECOVERY m3"},
777 struct rtw89_ser *ser = &rtwdev->ser; in rtw89_ser_init()
780 INIT_LIST_HEAD(&ser->msg_q); in rtw89_ser_init()
781 ser->state = SER_IDLE_ST; in rtw89_ser_init()
782 ser->st_tbl = ser_st_tbl; in rtw89_ser_init()
783 ser->ev_tbl = ser_ev_tbl; in rtw89_ser_init()
785 bitmap_zero(ser->flags, RTW89_NUM_OF_SER_FLAGS); in rtw89_ser_init()
786 spin_lock_init(&ser->msg_q_lock); in rtw89_ser_init()
787 INIT_WORK(&ser->ser_hdl_work, rtw89_ser_hdl_work); in rtw89_ser_init()
788 INIT_DELAYED_WORK(&ser->ser_alarm_work, rtw89_ser_alarm_work); in rtw89_ser_init()
794 struct rtw89_ser *ser = (struct rtw89_ser *)&rtwdev->ser; in rtw89_ser_deinit()
796 set_bit(RTW89_SER_DRV_STOP_RUN, ser->flags); in rtw89_ser_deinit()
797 cancel_delayed_work_sync(&ser->ser_alarm_work); in rtw89_ser_deinit()
798 cancel_work_sync(&ser->ser_hdl_work); in rtw89_ser_deinit()
799 clear_bit(RTW89_SER_DRV_STOP_RUN, ser->flags); in rtw89_ser_deinit()
805 ser_send_msg(&rtwdev->ser, SER_EV_L2_RECFG_DONE); in rtw89_ser_recfg_done()
815 case MAC_AX_ERR_L1_PREERR_DMAC: /* pre-M0 */ in rtw89_ser_notify()
823 event = SER_EV_DO_RECOVERY; /* M3 */ in rtw89_ser_notify()
843 return -EINVAL; in rtw89_ser_notify()
846 ser_send_msg(&rtwdev->ser, event); in rtw89_ser_notify()