History

bus: mhi: core: Remove the system error worker thread

Remove the system error worker thread and instead have the execution environment worker handle that transition to serialize processing and avoid any possible race conditions during shutdown.

Hemant Kumar committed 6 years ago

Commit bc7ccce1 parent 0ab9fcd5 files · +20 −25Browse files

Unified · Split

5 files
  1. drivers/bus/mhi/core/init.c +1 −1
  2. drivers/bus/mhi/core/internal.h +2 −1
  3. drivers/bus/mhi/core/main.c +3 −3
  4. drivers/bus/mhi/core/pm.c +14 −18
  5. include/linux/mhi.h +0 −2
drivers/bus/mhi/core/init.c+1−1
@@ -34,6 +34,7 @@ const char * const dev_state_tran_str[DEV_ST_TRANSITION_MAX] = { · 33 unmodified lines
3434 [DEV_ST_TRANSITION_READY] = "READY",
3535 [DEV_ST_TRANSITION_SBL] = "SBL",
3636 [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
37+ [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
3738 };
3839
3940 const char * const mhi_state_str[MHI_STATE_MAX] = {
@@ -834,7 +835,6 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl, · 794 unmodified lines
834835 spin_lock_init(&mhi_cntrl->transition_lock);
835836 spin_lock_init(&mhi_cntrl->wlock);
836837 INIT_WORK(&mhi_cntrl->st_worker, mhi_pm_st_worker);
837− INIT_WORK(&mhi_cntrl->syserr_worker, mhi_pm_sys_err_worker);
838838 init_waitqueue_head(&mhi_cntrl->state_event);
839839
840840 mhi_cmd = mhi_cntrl->mhi_cmd;
drivers/bus/mhi/core/internal.h+2−1
@@ -386,6 +386,7 @@ enum dev_st_transition { · 385 unmodified lines
386386 DEV_ST_TRANSITION_READY,
387387 DEV_ST_TRANSITION_SBL,
388388 DEV_ST_TRANSITION_MISSION_MODE,
389+ DEV_ST_TRANSITION_SYS_ERR,
389390 DEV_ST_TRANSITION_MAX,
390391 };
391392
@@ -587,7 +588,7 @@ enum mhi_ee_type mhi_get_exec_env(struct mhi_controller *mhi_cntrl); · 195 unmodified lines
587588 int mhi_queue_state_transition(struct mhi_controller *mhi_cntrl,
588589 enum dev_st_transition state);
589590 void mhi_pm_st_worker(struct work_struct *work);
590−void mhi_pm_sys_err_worker(struct work_struct *work);
591+void mhi_pm_sys_err_handler(struct mhi_controller *mhi_cntrl);
591592 void mhi_fw_load_worker(struct work_struct *work);
592593 int mhi_ready_state_transition(struct mhi_controller *mhi_cntrl);
593594 void mhi_ctrl_ev_task(unsigned long data);
drivers/bus/mhi/core/main.c+3−3
@@ -406,7 +406,7 @@ irqreturn_t mhi_intvec_threaded_handler(int irq_number, void *dev) · 405 unmodified lines
406406 if (MHI_IN_PBL(ee))
407407 mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_FATAL_ERROR);
408408 else
409− schedule_work(&mhi_cntrl->syserr_worker);
409+ mhi_pm_sys_err_handler(mhi_cntrl);
410410 }
411411
412412 exit_intvec:
@@ -734,7 +734,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl, · 321 unmodified lines
734734 MHI_PM_SYS_ERR_DETECT);
735735 write_unlock_irq(&mhi_cntrl->pm_lock);
736736 if (new_state == MHI_PM_SYS_ERR_DETECT)
737− schedule_work(&mhi_cntrl->syserr_worker);
737+ mhi_pm_sys_err_handler(mhi_cntrl);
738738 break;
739739 }
740740 default:
@@ -920,7 +920,7 @@ void mhi_ctrl_ev_task(unsigned long data) · 179 unmodified lines
920920 }
921921 write_unlock_irq(&mhi_cntrl->pm_lock);
922922 if (pm_state == MHI_PM_SYS_ERR_DETECT)
923− schedule_work(&mhi_cntrl->syserr_worker);
923+ mhi_pm_sys_err_handler(mhi_cntrl);
924924 }
925925 }
926926
drivers/bus/mhi/core/pm.c+14−18
@@ -449,19 +449,8 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl, · 448 unmodified lines
449449 to_mhi_pm_state_str(transition_state));
450450
451451 /* We must notify MHI control driver so it can clean up first */
452− if (transition_state == MHI_PM_SYS_ERR_PROCESS) {
453− /*
454− * If controller supports RDDM, we do not process
455− * SYS error state, instead we will jump directly
456− * to RDDM state
457− */
458− if (mhi_cntrl->rddm_image) {
459− dev_dbg(dev,
460− "Controller supports RDDM, so skip SYS_ERR\n");
461− return;
462− }
452+ if (transition_state == MHI_PM_SYS_ERR_PROCESS)
463453 mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_SYS_ERROR);
464− }
465454
466455 mutex_lock(&mhi_cntrl->pm_mutex);
467456 write_lock_irq(&mhi_cntrl->pm_lock);
@@ -527,7 +516,6 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl, · 59 unmodified lines
527516 mutex_unlock(&mhi_cntrl->pm_mutex);
528517 dev_dbg(dev, "Waiting for all pending threads to complete\n");
529518 wake_up_all(&mhi_cntrl->state_event);
530− flush_work(&mhi_cntrl->st_worker);
531519
532520 dev_dbg(dev, "Reset all active channels and remove MHI devices\n");
533521 device_for_each_child(mhi_cntrl->cntrl_dev, NULL, mhi_destroy_device);
@@ -607,13 +595,17 @@ int mhi_queue_state_transition(struct mhi_controller *mhi_cntrl, · 73 unmodified lines
607595 }
608596
609597 /* SYS_ERR worker */
610−void mhi_pm_sys_err_worker(struct work_struct *work)
598+void mhi_pm_sys_err_handler(struct mhi_controller *mhi_cntrl)
611599 {
612− struct mhi_controller *mhi_cntrl = container_of(work,
613− struct mhi_controller,
614− syserr_worker);
600+ struct device *dev = &mhi_cntrl->mhi_dev->dev;
601+
602+ /* skip if controller supports RDDM */
603+ if (mhi_cntrl->rddm_image) {
604+ dev_dbg(dev, "Controller supports RDDM, skip SYS_ERROR\n");
605+ return;
606+ }
615607
616− mhi_pm_disable_transition(mhi_cntrl, MHI_PM_SYS_ERR_PROCESS);
608+ mhi_queue_state_transition(mhi_cntrl, DEV_ST_TRANSITION_SYS_ERR);
617609 }
618610
619611 /* Device State Transition worker */
@@ -661,6 +653,10 @@ void mhi_pm_st_worker(struct work_struct *work) · 41 unmodified lines
661653 case DEV_ST_TRANSITION_READY:
662654 mhi_ready_state_transition(mhi_cntrl);
663655 break;
656+ case DEV_ST_TRANSITION_SYS_ERR:
657+ mhi_pm_disable_transition
658+ (mhi_cntrl, MHI_PM_SYS_ERR_PROCESS);
659+ break;
664660 default:
665661 break;
666662 }
include/linux/mhi.h+0−2
@@ -331,7 +331,6 @@ struct mhi_controller_config { · 330 unmodified lines
331331 * @wlock: Lock for protecting device wakeup
332332 * @mhi_link_info: Device bandwidth info
333333 * @st_worker: State transition worker
334− * @syserr_worker: System error worker
335334 * @state_event: State change event
336335 * @status_cb: CB function to notify power states of the device (required)
337336 * @wake_get: CB function to assert device wake (optional)
@@ -411,7 +410,6 @@ struct mhi_controller { · 73 unmodified lines
411410 spinlock_t wlock;
412411 struct mhi_link_info mhi_link_info;
413412 struct work_struct st_worker;
414− struct work_struct syserr_worker;
415413 wait_queue_head_t state_event;
416414
417415 void (*status_cb)(struct mhi_controller *mhi_cntrl,