Пример #1
0
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;
}
Пример #2
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);
    }
}