亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mmc_queue.c

?? The latest MontaVista Linux driver about SD/MMC code
?? C
字號:
/* *  linux/drivers/mmc/mmc_queue.c * *  Copyright (C) 2003 Russell King, All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */#include <linux/module.h>#include <linux/blkdev.h>#include <linux/mmc/card.h>#include <linux/mmc/host.h>#include "mmc_queue.h"#define MMC_QUEUE_EXIT		(1 << 0)#define MMC_QUEUE_SUSPENDED	(1 << 1)/* * Prepare a MMC request.  Essentially, this means passing the * preparation off to the media driver.  The media driver will * create a mmc_io_request in req->special. */static int mmc_prep_request(struct request_queue *q, struct request *req){	struct mmc_queue *mq = q->queuedata;	int ret = BLKPREP_KILL;	if (req->flags & REQ_SPECIAL) {		/*		 * Special commands already have the command		 * blocks already setup in req->special.		 */		BUG_ON(!req->special);		ret = BLKPREP_OK;	} else if (req->flags & (REQ_CMD | REQ_BLOCK_PC)) {		/*		 * Block I/O requests need translating according		 * to the protocol.		 */		ret = mq->prep_fn(mq, req);	} else {		/*		 * Everything else is invalid.		 */		blk_dump_rq_flags(req, "MMC bad request");	}	if (ret == BLKPREP_OK)		req->flags |= REQ_DONTPREP;	return ret;}static int mmc_queue_thread(void *d){	struct mmc_queue *mq = d;	struct request_queue *q = mq->queue;	DECLARE_WAITQUEUE(wait, current);	/*	 * Set iothread to ensure that we aren't put to sleep by	 * the process freezing.  We handle suspension ourselves.	 */	current->flags |= PF_MEMALLOC|PF_NOFREEZE;	daemonize("mmcqd");	complete(&mq->thread_complete);	down(&mq->thread_sem);	add_wait_queue(&mq->thread_wq, &wait);	do {		struct request *req = NULL;		spin_lock_irq(q->queue_lock);		set_current_state(TASK_INTERRUPTIBLE);		if (!blk_queue_plugged(q))			mq->req = req = elv_next_request(q);		spin_unlock_irq(q->queue_lock);		if (!req) {			if (mq->flags & MMC_QUEUE_EXIT)				break;			up(&mq->thread_sem);			schedule();			down(&mq->thread_sem);			continue;		}		set_current_state(TASK_RUNNING);		mq->issue_fn(mq, req);	} while (1);	set_current_state(TASK_RUNNING);	remove_wait_queue(&mq->thread_wq, &wait);	up(&mq->thread_sem);	complete_and_exit(&mq->thread_complete, 0);	return 0;}/* * Generic MMC request handler.  This is called for any queue on a * particular host.  When the host is not busy, we look for a request * on any queue on this host, and attempt to issue it.  This may * not be the queue we were asked to process. */static void mmc_request(request_queue_t *q){	struct mmc_queue *mq = q->queuedata;	if (!mq->req)		wake_up(&mq->thread_wq);}/** * mmc_init_queue - initialise a queue structure. * @mq: mmc queue * @card: mmc card to attach this queue * @lock: queue lock * * Initialise a MMC card request queue. */int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock){	struct mmc_host *host = card->host;	u64 limit = BLK_BOUNCE_HIGH;	int ret;	if (host->dev->dma_mask && *host->dev->dma_mask)		limit = *host->dev->dma_mask;	mq->card = card;	mq->queue = blk_init_queue(mmc_request, lock);	if (!mq->queue)		return -ENOMEM;	blk_queue_prep_rq(mq->queue, mmc_prep_request);	blk_queue_bounce_limit(mq->queue, limit);	blk_queue_max_sectors(mq->queue, host->max_sectors);	blk_queue_max_phys_segments(mq->queue, host->max_phys_segs);	blk_queue_max_hw_segments(mq->queue, host->max_hw_segs);	blk_queue_max_segment_size(mq->queue, host->max_seg_size);	mq->queue->queuedata = mq;	mq->req = NULL;	mq->sg = kmalloc(sizeof(struct scatterlist) * host->max_phys_segs,			 GFP_KERNEL);	if (!mq->sg) {		ret = -ENOMEM;		goto cleanup;	}	init_completion(&mq->thread_complete);	init_waitqueue_head(&mq->thread_wq);	init_MUTEX(&mq->thread_sem);	ret = kernel_thread(mmc_queue_thread, mq, CLONE_KERNEL);	if (ret >= 0) {		wait_for_completion(&mq->thread_complete);		init_completion(&mq->thread_complete);		ret = 0;		goto out;	} cleanup:	kfree(mq->sg);	mq->sg = NULL;	blk_cleanup_queue(mq->queue); out:	return ret;}EXPORT_SYMBOL(mmc_init_queue);void mmc_cleanup_queue(struct mmc_queue *mq){	mq->flags |= MMC_QUEUE_EXIT;	wake_up(&mq->thread_wq);	wait_for_completion(&mq->thread_complete);	kfree(mq->sg);	mq->sg = NULL;	blk_cleanup_queue(mq->queue);	mq->card = NULL;}EXPORT_SYMBOL(mmc_cleanup_queue);/** * mmc_queue_suspend - suspend a MMC request queue * @mq: MMC queue to suspend * * Stop the block request queue, and wait for our thread to * complete any outstanding requests.  This ensures that we * won't suspend while a request is being processed. */void mmc_queue_suspend(struct mmc_queue *mq){	request_queue_t *q = mq->queue;	unsigned long flags;	if (!(mq->flags & MMC_QUEUE_SUSPENDED)) {		mq->flags |= MMC_QUEUE_SUSPENDED;		spin_lock_irqsave(q->queue_lock, flags);		blk_stop_queue(q);		spin_unlock_irqrestore(q->queue_lock, flags);		down(&mq->thread_sem);	}}EXPORT_SYMBOL(mmc_queue_suspend);/** * mmc_queue_resume - resume a previously suspended MMC request queue * @mq: MMC queue to resume */void mmc_queue_resume(struct mmc_queue *mq){	request_queue_t *q = mq->queue;	unsigned long flags;	if (mq->flags & MMC_QUEUE_SUSPENDED) {		mq->flags &= ~MMC_QUEUE_SUSPENDED;		up(&mq->thread_sem);		spin_lock_irqsave(q->queue_lock, flags);		blk_start_queue(q);		spin_unlock_irqrestore(q->queue_lock, flags);	}}EXPORT_SYMBOL(mmc_queue_resume);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品菠萝久久久久久久| 午夜激情一区二区三区| 精品久久一区二区| 91亚洲国产成人精品一区二区三 | 欧美一区二区三区公司| 不卡视频一二三| 国产剧情一区二区三区| 狠狠色狠狠色综合系列| 麻豆91免费观看| 久久国产精品露脸对白| 国产精品一区二区x88av| 国产在线视视频有精品| 国产美女在线观看一区| 国产成人av资源| 91一区二区在线| 欧美自拍偷拍一区| 欧美精品三级在线观看| 欧美一二三在线| 国产亚洲精品中文字幕| 国产精品久久久一本精品| 亚洲六月丁香色婷婷综合久久| 亚洲女人小视频在线观看| 亚洲动漫第一页| 久久精品国产色蜜蜜麻豆| 国产在线国偷精品产拍免费yy| 国产精品资源网| 一本到不卡免费一区二区| 欧美在线观看视频一区二区三区| 678五月天丁香亚洲综合网| 精品入口麻豆88视频| 久久久777精品电影网影网| 午夜欧美2019年伦理| 久久精品国产亚洲一区二区三区| 高清久久久久久| 欧美视频一区二区三区在线观看| 欧美一区二区日韩一区二区| 国产午夜精品一区二区三区嫩草 | 亚洲午夜av在线| 狠狠色丁香婷综合久久| 94-欧美-setu| 日韩丝袜美女视频| 亚洲女人的天堂| 国产在线国偷精品免费看| 欧美亚男人的天堂| 国产亚洲成aⅴ人片在线观看| 亚洲综合清纯丝袜自拍| 国产主播一区二区| 欧美午夜精品理论片a级按摩| 久久久国产精品午夜一区ai换脸| 亚洲免费资源在线播放| 韩国女主播一区| 欧美男人的天堂一二区| 亚洲人一二三区| 国产成人aaaa| 日韩欧美自拍偷拍| 亚洲在线观看免费视频| 高清在线成人网| 精品乱码亚洲一区二区不卡| 亚洲美女淫视频| 大白屁股一区二区视频| 欧美一区二区视频在线观看2022| 国产精品白丝在线| 福利一区二区在线观看| 久久久777精品电影网影网 | 成人国产精品免费网站| 久久亚洲影视婷婷| 韩国av一区二区三区在线观看| 在线视频欧美精品| 亚洲青青青在线视频| va亚洲va日韩不卡在线观看| 久久久久久久综合日本| 韩国视频一区二区| 精品国产乱码91久久久久久网站| 日本视频一区二区| 日韩一区二区免费在线电影| 三级精品在线观看| 91精品综合久久久久久| 日韩av中文字幕一区二区| 欧美日韩国产成人在线免费| 亚洲一二三区在线观看| 欧美日韩亚洲综合一区二区三区| 一区二区三区四区激情| 欧美在线免费观看亚洲| 亚洲va欧美va人人爽| 欧美日韩国产综合一区二区三区| 亚洲图片欧美一区| 欧美视频日韩视频在线观看| 亚洲午夜在线观看视频在线| 欧美日韩免费一区二区三区 | 国产乱码精品一区二区三区忘忧草| 精品国产一区二区国模嫣然| 国产做a爰片久久毛片| 久久精品视频网| 99精品视频一区二区三区| 一色屋精品亚洲香蕉网站| 一本一道综合狠狠老| 亚洲成人av中文| 欧美xxx久久| av一区二区三区在线| 亚洲主播在线观看| 精品国产乱码久久久久久免费| 成人高清伦理免费影院在线观看| 亚洲欧美偷拍卡通变态| 在线播放中文字幕一区| 国产在线一区二区| 亚洲最新在线观看| 精品少妇一区二区| 日本韩国一区二区三区视频| 奇米精品一区二区三区在线观看| 日本一区二区三区国色天香 | 中文字幕在线不卡一区二区三区 | 欧美大片免费久久精品三p| 国产一区二区三区免费在线观看| 亚洲色大成网站www久久九九| 欧美精品精品一区| 成人毛片在线观看| 免费高清在线一区| 亚洲视频精选在线| 久久免费美女视频| 7777精品伊人久久久大香线蕉最新版| 国产一区二区0| 亚洲综合丝袜美腿| 国产精品网站在线| 91精品国产色综合久久不卡电影 | 亚洲一线二线三线久久久| 精品国免费一区二区三区| 欧美无乱码久久久免费午夜一区 | 欧美亚洲禁片免费| 成人性色生活片免费看爆迷你毛片| 亚洲一区在线免费观看| 中文字幕乱码久久午夜不卡| 欧美一卡二卡在线观看| 在线免费精品视频| 99国产精品久久久久久久久久| 麻豆精品在线看| 午夜久久久久久久久久一区二区| 国产精品久久午夜夜伦鲁鲁| 精品av久久707| 91精品国产综合久久福利| 在线观看亚洲a| 99精品一区二区三区| 成人免费视频网站在线观看| 精品影院一区二区久久久| 丝瓜av网站精品一区二区| 亚洲午夜国产一区99re久久| 18欧美亚洲精品| 国产精品福利一区二区| 中文字幕高清一区| 久久奇米777| 国产欧美日本一区视频| 久久综合九色综合97婷婷女人| 日韩欧美一区二区免费| 欧美福利视频一区| 91精品麻豆日日躁夜夜躁| 欧美狂野另类xxxxoooo| 欧美日韩美少妇| 欧美一区二区私人影院日本| 91精品国产综合久久香蕉麻豆| 欧美日韩一本到| 欧美一区二区三级| 久久婷婷成人综合色| 久久色成人在线| 中文字幕不卡在线观看| 中文字幕一区二区三区不卡 | 亚洲大片精品永久免费| 亚洲sss视频在线视频| 奇米在线7777在线精品| 精品在线亚洲视频| 99久久久国产精品| 91一区二区在线| 欧美精品自拍偷拍动漫精品| 欧美一区二区三区小说| 久久综合九色欧美综合狠狠| 国产午夜精品一区二区| 亚洲情趣在线观看| 欧美aⅴ一区二区三区视频| 国产一区二区三区日韩 | 另类小说色综合网站| 国产资源在线一区| 色婷婷av一区| 日韩欧美精品在线| 中文字幕一区二区三区不卡| 亚洲.国产.中文慕字在线| 老司机精品视频线观看86| 国产精品影视在线观看| 色综合视频在线观看| 精品国产在天天线2019| 一区二区三区在线播放| 久久成人免费网站| 91成人网在线| 久久精品亚洲乱码伦伦中文 | 精品国精品国产尤物美女| 亚洲免费在线视频一区 二区| 日本亚洲欧美天堂免费| 91在线porny国产在线看| 日韩亚洲电影在线| 亚洲国产一区视频| 99热国产精品| 久久婷婷色综合| 日本视频在线一区|