Lines Matching refs:mq

27 static inline bool mmc_cqe_dcmd_busy(struct mmc_queue *mq)  in mmc_cqe_dcmd_busy()  argument
30 return mq->in_flight[MMC_ISSUE_DCMD]; in mmc_cqe_dcmd_busy()
33 void mmc_cqe_check_busy(struct mmc_queue *mq) in mmc_cqe_check_busy() argument
35 if ((mq->cqe_busy & MMC_CQE_DCMD_BUSY) && !mmc_cqe_dcmd_busy(mq)) in mmc_cqe_check_busy()
36 mq->cqe_busy &= ~MMC_CQE_DCMD_BUSY; in mmc_cqe_check_busy()
38 mq->cqe_busy &= ~MMC_CQE_QUEUE_FULL; in mmc_cqe_check_busy()
62 enum mmc_issue_type mmc_issue_type(struct mmc_queue *mq, struct request *req) in mmc_issue_type() argument
64 struct mmc_host *host = mq->card->host; in mmc_issue_type()
66 if (mq->use_cqe) in mmc_issue_type()
75 static void __mmc_cqe_recovery_notifier(struct mmc_queue *mq) in __mmc_cqe_recovery_notifier() argument
77 if (!mq->recovery_needed) { in __mmc_cqe_recovery_notifier()
78 mq->recovery_needed = true; in __mmc_cqe_recovery_notifier()
79 schedule_work(&mq->recovery_work); in __mmc_cqe_recovery_notifier()
89 struct mmc_queue *mq = q->queuedata; in mmc_cqe_recovery_notifier() local
93 __mmc_cqe_recovery_notifier(mq); in mmc_cqe_recovery_notifier()
101 struct mmc_queue *mq = req->q->queuedata; in mmc_cqe_timed_out() local
102 struct mmc_host *host = mq->card->host; in mmc_cqe_timed_out()
103 enum mmc_issue_type issue_type = mmc_issue_type(mq, req); in mmc_cqe_timed_out()
111 __mmc_cqe_recovery_notifier(mq); in mmc_cqe_timed_out()
127 struct mmc_queue *mq = q->queuedata; in mmc_mq_timed_out() local
133 if (mq->recovery_needed || !mq->use_cqe) in mmc_mq_timed_out()
145 struct mmc_queue *mq = container_of(work, struct mmc_queue, in mmc_mq_recovery_handler() local
147 struct request_queue *q = mq->queue; in mmc_mq_recovery_handler()
149 mmc_get_card(mq->card, &mq->ctx); in mmc_mq_recovery_handler()
151 mq->in_recovery = true; in mmc_mq_recovery_handler()
153 if (mq->use_cqe) in mmc_mq_recovery_handler()
154 mmc_blk_cqe_recovery(mq); in mmc_mq_recovery_handler()
156 mmc_blk_mq_recovery(mq); in mmc_mq_recovery_handler()
158 mq->in_recovery = false; in mmc_mq_recovery_handler()
161 mq->recovery_needed = false; in mmc_mq_recovery_handler()
164 mmc_put_card(mq->card, &mq->ctx); in mmc_mq_recovery_handler()
205 static int __mmc_init_request(struct mmc_queue *mq, struct request *req, in __mmc_init_request() argument
209 struct mmc_card *card = mq->card; in __mmc_init_request()
236 struct mmc_queue *mq = set->driver_data; in mmc_mq_exit_request() local
238 mmc_exit_request(mq->queue, req); in mmc_mq_exit_request()
246 struct mmc_queue *mq = q->queuedata; in mmc_mq_queue_rq() local
247 struct mmc_card *card = mq->card; in mmc_mq_queue_rq()
254 if (mmc_card_removed(mq->card)) { in mmc_mq_queue_rq()
259 issue_type = mmc_issue_type(mq, req); in mmc_mq_queue_rq()
263 if (mq->recovery_needed || mq->busy) { in mmc_mq_queue_rq()
270 if (mmc_cqe_dcmd_busy(mq)) { in mmc_mq_queue_rq()
271 mq->cqe_busy |= MMC_CQE_DCMD_BUSY; in mmc_mq_queue_rq()
291 mq->busy = true; in mmc_mq_queue_rq()
293 mq->in_flight[issue_type] += 1; in mmc_mq_queue_rq()
294 get_card = (mmc_tot_in_flight(mq) == 1); in mmc_mq_queue_rq()
295 cqe_retune_ok = (mmc_cqe_qcnt(mq) == 1); in mmc_mq_queue_rq()
305 mmc_get_card(card, &mq->ctx); in mmc_mq_queue_rq()
307 if (mq->use_cqe) { in mmc_mq_queue_rq()
314 issued = mmc_blk_mq_issue_rq(mq, req); in mmc_mq_queue_rq()
332 mq->in_flight[issue_type] -= 1; in mmc_mq_queue_rq()
333 if (mmc_tot_in_flight(mq) == 0) in mmc_mq_queue_rq()
335 mq->busy = false; in mmc_mq_queue_rq()
338 mmc_put_card(card, &mq->ctx); in mmc_mq_queue_rq()
340 WRITE_ONCE(mq->busy, false); in mmc_mq_queue_rq()
354 static void mmc_setup_queue(struct mmc_queue *mq, struct mmc_card *card) in mmc_setup_queue() argument
362 blk_queue_flag_set(QUEUE_FLAG_NONROT, mq->queue); in mmc_setup_queue()
363 blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, mq->queue); in mmc_setup_queue()
365 mmc_queue_setup_discard(mq->queue, card); in mmc_setup_queue()
367 blk_queue_bounce_limit(mq->queue, limit); in mmc_setup_queue()
368 blk_queue_max_hw_sectors(mq->queue, in mmc_setup_queue()
370 blk_queue_max_segments(mq->queue, host->max_segs); in mmc_setup_queue()
371 blk_queue_max_segment_size(mq->queue, host->max_seg_size); in mmc_setup_queue()
373 INIT_WORK(&mq->recovery_work, mmc_mq_recovery_handler); in mmc_setup_queue()
374 INIT_WORK(&mq->complete_work, mmc_blk_mq_complete_work); in mmc_setup_queue()
376 mutex_init(&mq->complete_lock); in mmc_setup_queue()
378 init_waitqueue_head(&mq->wait); in mmc_setup_queue()
381 static int mmc_mq_init_queue(struct mmc_queue *mq, int q_depth, in mmc_mq_init_queue() argument
386 memset(&mq->tag_set, 0, sizeof(mq->tag_set)); in mmc_mq_init_queue()
387 mq->tag_set.ops = mq_ops; in mmc_mq_init_queue()
388 mq->tag_set.queue_depth = q_depth; in mmc_mq_init_queue()
389 mq->tag_set.numa_node = NUMA_NO_NODE; in mmc_mq_init_queue()
390 mq->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE | in mmc_mq_init_queue()
392 mq->tag_set.nr_hw_queues = 1; in mmc_mq_init_queue()
393 mq->tag_set.cmd_size = sizeof(struct mmc_queue_req); in mmc_mq_init_queue()
394 mq->tag_set.driver_data = mq; in mmc_mq_init_queue()
396 ret = blk_mq_alloc_tag_set(&mq->tag_set); in mmc_mq_init_queue()
400 mq->queue = blk_mq_init_queue(&mq->tag_set); in mmc_mq_init_queue()
401 if (IS_ERR(mq->queue)) { in mmc_mq_init_queue()
402 ret = PTR_ERR(mq->queue); in mmc_mq_init_queue()
406 mq->queue->queue_lock = lock; in mmc_mq_init_queue()
407 mq->queue->queuedata = mq; in mmc_mq_init_queue()
412 blk_mq_free_tag_set(&mq->tag_set); in mmc_mq_init_queue()
420 static int mmc_mq_init(struct mmc_queue *mq, struct mmc_card *card, in mmc_mq_init() argument
431 if (mq->use_cqe) in mmc_mq_init()
436 ret = mmc_mq_init_queue(mq, q_depth, &mmc_mq_ops, lock); in mmc_mq_init()
440 blk_queue_rq_timeout(mq->queue, 60 * HZ); in mmc_mq_init()
442 mmc_setup_queue(mq, card); in mmc_mq_init()
456 int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, in mmc_init_queue() argument
461 mq->card = card; in mmc_init_queue()
463 mq->use_cqe = host->cqe_enabled; in mmc_init_queue()
465 return mmc_mq_init(mq, card, lock); in mmc_init_queue()
468 void mmc_queue_suspend(struct mmc_queue *mq) in mmc_queue_suspend() argument
470 blk_mq_quiesce_queue(mq->queue); in mmc_queue_suspend()
476 mmc_claim_host(mq->card->host); in mmc_queue_suspend()
477 mmc_release_host(mq->card->host); in mmc_queue_suspend()
480 void mmc_queue_resume(struct mmc_queue *mq) in mmc_queue_resume() argument
482 blk_mq_unquiesce_queue(mq->queue); in mmc_queue_resume()
485 void mmc_cleanup_queue(struct mmc_queue *mq) in mmc_cleanup_queue() argument
487 struct request_queue *q = mq->queue; in mmc_cleanup_queue()
503 flush_work(&mq->complete_work); in mmc_cleanup_queue()
505 mq->card = NULL; in mmc_cleanup_queue()
511 unsigned int mmc_queue_map_sg(struct mmc_queue *mq, struct mmc_queue_req *mqrq) in mmc_queue_map_sg() argument
515 return blk_rq_map_sg(mq->queue, req, mqrq->sg); in mmc_queue_map_sg()