static int mmc_queue_thread(void *d) { struct mmc_queue *mq = d; struct request_queue *q = mq->queue; current->flags |= PF_MEMALLOC; down(&mq->thread_sem); do { struct request *req = NULL; struct mmc_queue_req *tmp; spin_lock_irq(q->queue_lock); set_current_state(TASK_INTERRUPTIBLE); req = blk_fetch_request(q); mq->mqrq_cur->req = req; spin_unlock_irq(q->queue_lock); if (req || mq->mqrq_prev->req) { set_current_state(TASK_RUNNING); /* Abort any current bk ops of eMMC card by issuing HPI */ if (mmc_card_mmc(mq->card) && mmc_card_doing_bkops(mq->card)) { mmc_interrupt_hpi(mq->card); } mq->issue_fn(mq, req); } else { /* * Since the queue is empty, start synchronous * background ops if there is a request for it. */ if (mmc_card_need_bkops(mq->card)) mmc_bkops_start(mq->card, false, true); if (kthread_should_stop()) { set_current_state(TASK_RUNNING); break; } up(&mq->thread_sem); schedule(); down(&mq->thread_sem); } /* Current request becomes previous request and vice versa. */ mq->mqrq_prev->brq.mrq.data = NULL; mq->mqrq_prev->req = NULL; tmp = mq->mqrq_prev; mq->mqrq_prev = mq->mqrq_cur; mq->mqrq_cur = tmp; } while (1); up(&mq->thread_sem); return 0; }
static int mmc_runtime_suspend(struct device *dev) { struct mmc_card *card = mmc_dev_to_card(dev); if (mmc_use_core_runtime_pm(card->host)) { /* * If idle time bkops is running on the card, let's not get * into suspend. */ if (mmc_card_doing_bkops(card) && mmc_card_is_prog_state(card)) return -EBUSY; else return 0; } else { return mmc_power_save_host(card->host); } }