Lines Matching refs:ser

54 	void (*st_func)(struct rtw89_ser *ser, u8 event);
62 static char *ser_ev_name(struct rtw89_ser *ser, u8 event) in ser_ev_name() argument
65 return ser->ev_tbl[event].name; in ser_ev_name()
70 static char *ser_st_name(struct rtw89_ser *ser) in ser_st_name() argument
72 if (ser->state < SER_ST_MAX_ST) in ser_st_name()
73 return ser->st_tbl[ser->state].name; in ser_st_name()
152 static void ser_state_run(struct rtw89_ser *ser, u8 evt) in ser_state_run() argument
154 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_state_run()
157 ser_st_name(ser), ser_ev_name(ser, evt)); in ser_state_run()
163 ser->st_tbl[ser->state].st_func(ser, evt); in ser_state_run()
166 static void ser_state_goto(struct rtw89_ser *ser, u8 new_state) in ser_state_goto() argument
168 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_state_goto()
170 if (ser->state == new_state || new_state >= SER_ST_MAX_ST) in ser_state_goto()
172 ser_state_run(ser, SER_EV_STATE_OUT); 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()
178 ser_state_run(ser, SER_EV_STATE_IN); in ser_state_goto()
181 static struct ser_msg *__rtw89_ser_dequeue_msg(struct rtw89_ser *ser) in __rtw89_ser_dequeue_msg() argument
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()
189 spin_unlock_irq(&ser->msg_q_lock); in __rtw89_ser_dequeue_msg()
197 struct rtw89_ser *ser = container_of(work, struct rtw89_ser, in rtw89_ser_hdl_work() local
200 while ((msg = __rtw89_ser_dequeue_msg(ser))) { in rtw89_ser_hdl_work()
201 ser_state_run(ser, msg->event); in rtw89_ser_hdl_work()
206 static int ser_send_msg(struct rtw89_ser *ser, u8 event) in ser_send_msg() argument
208 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_send_msg()
211 if (test_bit(RTW89_SER_DRV_STOP_RUN, ser->flags)) 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()
230 struct rtw89_ser *ser = container_of(work, struct rtw89_ser, in rtw89_ser_alarm_work() local
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()
237 static void ser_set_alarm(struct rtw89_ser *ser, u32 ms, u8 event) in ser_set_alarm() argument
239 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_set_alarm()
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()
249 static void ser_del_alarm(struct rtw89_ser *ser) in ser_del_alarm() argument
251 cancel_delayed_work(&ser->ser_alarm_work); in ser_del_alarm()
252 ser->alarm_event = SER_EV_NONE; in ser_del_alarm()
256 static void drv_stop_tx(struct rtw89_ser *ser) in drv_stop_tx() argument
258 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in drv_stop_tx()
261 set_bit(RTW89_SER_DRV_STOP_TX, ser->flags); in drv_stop_tx()
264 static void drv_stop_rx(struct rtw89_ser *ser) in drv_stop_rx() argument
266 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in drv_stop_rx()
269 set_bit(RTW89_SER_DRV_STOP_RX, ser->flags); in drv_stop_rx()
272 static void drv_trx_reset(struct rtw89_ser *ser) in drv_trx_reset() argument
274 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in drv_trx_reset()
279 static void drv_resume_tx(struct rtw89_ser *ser) in drv_resume_tx() argument
281 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in drv_resume_tx()
283 if (!test_bit(RTW89_SER_DRV_STOP_TX, ser->flags)) in drv_resume_tx()
287 clear_bit(RTW89_SER_DRV_STOP_TX, ser->flags); in drv_resume_tx()
290 static void drv_resume_rx(struct rtw89_ser *ser) in drv_resume_rx() argument
292 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in drv_resume_rx()
294 if (!test_bit(RTW89_SER_DRV_STOP_RX, ser->flags)) in drv_resume_rx()
298 clear_bit(RTW89_SER_DRV_STOP_RX, ser->flags); in drv_resume_rx()
354 static int hal_enable_dma(struct rtw89_ser *ser) in hal_enable_dma() argument
356 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in hal_enable_dma()
359 if (!test_bit(RTW89_SER_HAL_STOP_DMA, ser->flags)) in hal_enable_dma()
367 clear_bit(RTW89_SER_HAL_STOP_DMA, ser->flags); in hal_enable_dma()
372 static int hal_stop_dma(struct rtw89_ser *ser) in hal_stop_dma() argument
374 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in hal_stop_dma()
382 set_bit(RTW89_SER_HAL_STOP_DMA, ser->flags); in hal_stop_dma()
387 static void hal_send_post_m0_event(struct rtw89_ser *ser) in hal_send_post_m0_event() argument
389 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in hal_send_post_m0_event()
394 static void hal_send_m2_event(struct rtw89_ser *ser) in hal_send_m2_event() argument
396 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in hal_send_m2_event()
401 static void hal_send_m4_event(struct rtw89_ser *ser) in hal_send_m4_event() argument
403 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in hal_send_m4_event()
409 static void ser_idle_st_hdl(struct rtw89_ser *ser, u8 evt) in ser_idle_st_hdl() argument
411 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_idle_st_hdl()
420 ser_state_goto(ser, SER_L1_RESET_PRE_ST); in ser_idle_st_hdl()
423 ser_state_goto(ser, SER_RESET_TRX_ST); in ser_idle_st_hdl()
426 ser_state_goto(ser, SER_L2_RESET_ST); in ser_idle_st_hdl()
437 static void ser_l1_reset_pre_st_hdl(struct rtw89_ser *ser, u8 evt) in ser_l1_reset_pre_st_hdl() argument
441 ser->prehandle_l1 = true; in ser_l1_reset_pre_st_hdl()
442 hal_send_post_m0_event(ser); in ser_l1_reset_pre_st_hdl()
443 ser_set_alarm(ser, 1000, SER_EV_M1_TIMEOUT); in ser_l1_reset_pre_st_hdl()
446 ser_state_goto(ser, SER_RESET_TRX_ST); in ser_l1_reset_pre_st_hdl()
449 ser_state_goto(ser, SER_L2_RESET_ST); in ser_l1_reset_pre_st_hdl()
452 ser_del_alarm(ser); in ser_l1_reset_pre_st_hdl()
459 static void ser_reset_trx_st_hdl(struct rtw89_ser *ser, u8 evt) in ser_reset_trx_st_hdl() argument
461 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_reset_trx_st_hdl()
466 drv_stop_tx(ser); in ser_reset_trx_st_hdl()
468 if (hal_stop_dma(ser)) { in ser_reset_trx_st_hdl()
469 ser_state_goto(ser, SER_L2_RESET_ST); in ser_reset_trx_st_hdl()
473 drv_stop_rx(ser); in ser_reset_trx_st_hdl()
474 drv_trx_reset(ser); in ser_reset_trx_st_hdl()
477 hal_send_m2_event(ser); in ser_reset_trx_st_hdl()
480 ser_set_alarm(ser, 1000, SER_EV_M3_TIMEOUT); in ser_reset_trx_st_hdl()
484 ser_state_goto(ser, SER_DO_HCI_ST); in ser_reset_trx_st_hdl()
488 ser_state_goto(ser, SER_L2_RESET_ST); in ser_reset_trx_st_hdl()
492 ser_del_alarm(ser); in ser_reset_trx_st_hdl()
493 hal_enable_dma(ser); in ser_reset_trx_st_hdl()
494 drv_resume_rx(ser); in ser_reset_trx_st_hdl()
495 drv_resume_tx(ser); in ser_reset_trx_st_hdl()
505 static void ser_do_hci_st_hdl(struct rtw89_ser *ser, u8 evt) in ser_do_hci_st_hdl() argument
510 hal_send_m4_event(ser); in ser_do_hci_st_hdl()
513 ser_set_alarm(ser, 1000, SER_EV_FW_M5_TIMEOUT); in ser_do_hci_st_hdl()
517 ser_state_goto(ser, SER_L2_RESET_ST); in ser_do_hci_st_hdl()
521 ser_state_goto(ser, SER_IDLE_ST); in ser_do_hci_st_hdl()
525 ser_del_alarm(ser); in ser_do_hci_st_hdl()
641 static void ser_l2_reset_st_pre_hdl(struct rtw89_ser *ser) in ser_l2_reset_st_pre_hdl() argument
643 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_l2_reset_st_pre_hdl()
673 static void ser_l2_reset_st_hdl(struct rtw89_ser *ser, u8 evt) in ser_l2_reset_st_hdl() argument
675 struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser); in ser_l2_reset_st_hdl()
680 ser_l2_reset_st_pre_hdl(ser); in ser_l2_reset_st_hdl()
684 ser_set_alarm(ser, SER_RECFG_TIMEOUT, SER_EV_L2_RECFG_TIMEOUT); in ser_l2_reset_st_hdl()
691 ser_state_goto(ser, SER_IDLE_ST); in ser_l2_reset_st_hdl()
695 ser_del_alarm(ser); in ser_l2_reset_st_hdl()
731 struct rtw89_ser *ser = &rtwdev->ser; in rtw89_ser_init() local
733 memset(ser, 0, sizeof(*ser)); in rtw89_ser_init()
734 INIT_LIST_HEAD(&ser->msg_q); in rtw89_ser_init()
735 ser->state = SER_IDLE_ST; in rtw89_ser_init()
736 ser->st_tbl = ser_st_tbl; in rtw89_ser_init()
737 ser->ev_tbl = ser_ev_tbl; in rtw89_ser_init()
739 bitmap_zero(ser->flags, RTW89_NUM_OF_SER_FLAGS); in rtw89_ser_init()
740 spin_lock_init(&ser->msg_q_lock); in rtw89_ser_init()
741 INIT_WORK(&ser->ser_hdl_work, rtw89_ser_hdl_work); in rtw89_ser_init()
742 INIT_DELAYED_WORK(&ser->ser_alarm_work, rtw89_ser_alarm_work); in rtw89_ser_init()
748 struct rtw89_ser *ser = (struct rtw89_ser *)&rtwdev->ser; in rtw89_ser_deinit() local
750 set_bit(RTW89_SER_DRV_STOP_RUN, ser->flags); in rtw89_ser_deinit()
751 cancel_delayed_work_sync(&ser->ser_alarm_work); in rtw89_ser_deinit()
752 cancel_work_sync(&ser->ser_hdl_work); in rtw89_ser_deinit()
753 clear_bit(RTW89_SER_DRV_STOP_RUN, ser->flags); in rtw89_ser_deinit()
759 ser_send_msg(&rtwdev->ser, SER_EV_L2_RECFG_DONE); in rtw89_ser_recfg_done()
800 ser_send_msg(&rtwdev->ser, event); in rtw89_ser_notify()