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

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

?? mmc_block.c

?? linux下mmc_sd卡的驅動.rar
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/drivers/mmc/mmc_block.c  *  	 driver for the block device on the MMC card * *  Author:	Vladimir Shebordaev	 *  Copyright:	MontaVista Software Inc. * *	$Id: mmc_block.c,v 0.3.1.16 2002/09/27 17:36:09 ted Exp ted $ * *  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/version.h>#include <linux/config.h>#include <linux/types.h>#include <linux/module.h>#include <linux/init.h>#include <linux/devfs_fs_kernel.h>#include <linux/kernel.h>#include <linux/slab.h>#include <linux/hdreg.h>#include <linux/blkpg.h>#include <asm/uaccess.h>#include <mmc/types.h>#include <mmc/mmc.h>#include "types.h"#include "mmc.h"#include "error.h"#define MAJOR_NR MMC_BLOCK_MAJOR#define MAJOR_NAME "mmc"#define DEVICE_NAME "mmc_block"#define DEVICE_REQUEST mmc_block_request#define DEVICE_NR(device) (device)#define DEVICE_ON(device)#define DEVICE_OFF(device)#define DEVICE_NO_RANDOM#include <linux/blk.h>/* for old kernels... */#ifndef QUEUE_EMPTY#define QUEUE_EMPTY  (!CURRENT)#endif#if LINUX_VERSION_CODE < 0x20300#define QUEUE_PLUGGED (blk_dev[MAJOR_NR].plug_tq.sync)#else#define QUEUE_PLUGGED (blk_dev[MAJOR_NR].request_queue.plugged)#endif#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,14)#define BLK_INC_USE_COUNT MOD_INC_USE_COUNT#define BLK_DEC_USE_COUNT MOD_DEC_USE_COUNT#else#define BLK_INC_USE_COUNT do {} while(0)#define BLK_DEC_USE_COUNT do {} while(0)#endif#define MMC_BLOCK_RAW_DEVICE( device ) ((device>>MMC_BLOCK_PARTNBITS)<<MMC_BLOCK_PARTNBITS)#define MMC_BLOCK_MKDEV( host, slot ) \	MKDEV( MMC_BLOCK_MAJOR, \	(host<<MMC_MINOR_HOST_SHIFT) \	| (slot<<MMC_BLOCK_PARTNBITS) )typedef struct _mmc_block_device mmc_block_device_rec_t;typedef struct _mmc_block_device *mmc_block_device_t;struct _mmc_block_device {	mmc_card_t card;	int host;	int slot;	kdev_t rdev;	int usage;	semaphore_t sem;};static int mmc_block_blk_sizes[1<<MINORBITS];static int mmc_block_blk_blksizes[1<<MINORBITS];static int mmc_block_hardsect_sizes[1<<MINORBITS];static struct hd_struct mmc_block_partitions[1<<MINORBITS];/* Accessed under device table lock */static gendisk_rec_t mmc_block_gendisk = {	major:		MMC_BLOCK_MAJOR,	major_name:	MAJOR_NAME,	minor_shift:	MMC_BLOCK_PARTNBITS,	max_p:		(1<<MMC_BLOCK_PARTNBITS),	sizes:		mmc_block_blk_sizes,	part:		mmc_block_partitions};static mmc_block_device_rec_t mmc_block_device[1<<MINORBITS];static rwsemaphore_t mmc_block_device_sem;static inline void __mmc_block_rdlock_devices( void ){	down_read( &mmc_block_device_sem );}static inline void __mmc_block_rdunlock_devices( void ){	up_read( &mmc_block_device_sem );}static inline void __mmc_block_wrlock_devices( void ){	down_write( &mmc_block_device_sem );}static inline void __mmc_block_wrunlock_devices( void ){	up_write( &mmc_block_device_sem );}static inline void __mmc_block_lock_device( kdev_t rdev ){	__mmc_block_rdlock_devices();	down( &mmc_block_device[MINOR( rdev )].sem );}static inline void __mmc_block_unlock_device( kdev_t rdev ){	up( &mmc_block_device[MINOR( rdev )].sem );	__mmc_block_rdunlock_devices();}static inline void __mmc_block_device_init( int minor ){	mmc_block_device_t dev = &mmc_block_device[minor];		dev->usage = 0;	dev->card = NULL;	dev->host = minor >> MMC_MINOR_HOST_SHIFT;	dev->slot = (minor & MMC_MINOR_CARD_MASK)>>MMC_BLOCK_PARTNBITS;	dev->rdev = MKDEV( MMC_BLOCK_MAJOR, minor );}static inline int __mmc_block_validate_device( kdev_t rdev ){	int ret = -1;	int minor = MINOR( rdev );		if ( mmc_block_device[minor].card 			&& (mmc_block_gendisk.part[minor].nr_sects > 0) )		ret = 0;	return ret;}static inline int __mmc_block_invalidate_card( mmc_card_t card, int invalidate ){	int ret = 0;	kdev_t start;	int minor;	__ENTER( "card = 0x%p", card );		if ( card && card->ctrlr ) {		register int i;				start = MMC_BLOCK_MKDEV( card->ctrlr->slot, card->slot );		minor = MINOR( start );		__mmc_block_wrlock_devices();		for ( i = mmc_block_gendisk.max_p - 1; i >= 0; --i ) {			if ( invalidate )				invalidate_device( start + i, 0 );						__mmc_block_device_init( minor + i );						mmc_block_gendisk.part[minor + i].nr_sects = 0;			mmc_block_gendisk.part[minor + i].start_sect = 0;		}		__mmc_block_wrunlock_devices();	}		__LEAVE( "ret=%d", ret );	return ret;}static inline int mmc_block_invalidate_card( int host, int slot, int invalidate ){	int ret = 0;	kdev_t start;	int minor;	__ENTER( "host=%d slot=%d", host, slot );		if ( (host >= 0) && (slot >= 0) ) {		register int i;		mmc_card_t card = NULL;				start = MMC_BLOCK_MKDEV( host, slot );		minor = MINOR( start );		__mmc_block_wrlock_devices();		for ( i = mmc_block_gendisk.max_p - 1; i >= 0; --i ) {			if ( !card ) 				card = mmc_block_device[minor + i].card;						if ( invalidate )				invalidate_device( start + i, 0 );						__mmc_block_device_init( minor + i );						mmc_block_gendisk.part[minor + i].nr_sects = 0;			mmc_block_gendisk.part[minor + i].start_sect = 0;		}		if ( card )			mmc_put_card( card );		__mmc_block_wrunlock_devices();	}		__LEAVE( "ret=%d", ret );	return ret;}/* Get device reference locked for writing */static inline mmc_block_device_t __mmc_block_get_device( kdev_t rdev ){	mmc_block_device_t ret = NULL;	u8 minor = MINOR( rdev );	int host_no, card_no;	__ENTER( "rdev=%x:%x", MAJOR( rdev ), MINOR( rdev ) );	host_no = minor >> MMC_MINOR_HOST_SHIFT;	if ( host_no >= MMC_CONTROLLERS_MAX )		goto error;	card_no = (minor & MMC_MINOR_CARD_MASK)>>MMC_BLOCK_PARTNBITS;	if ( card_no >= MMC_CARDS_MAX )		goto error;		__mmc_block_lock_device( rdev );	if ( __mmc_block_validate_device( rdev ) ) {		__mmc_block_unlock_device( rdev );			goto error;	}	ret = &mmc_block_device[minor];	MMC_DEBUG( MMC_DEBUG_LEVEL2, "(%x:%x) card=%p, dusage=%d\n",			MAJOR( ret->rdev ), MINOR( ret->rdev ), 			ret->card, ret->usage );error:	__LEAVE( "ret=0x%p", ret );	return ret;}/* Unlocks the device */static inline void __mmc_block_put_device( mmc_block_device_t dev ){	__ENTER0();		if ( dev ) {		MMC_DEBUG( MMC_DEBUG_LEVEL2, "(%x:%x) card=%p, dusage=%d\n",				MAJOR( dev->rdev ), MINOR( dev->rdev ), 				dev->card, dev->usage );		__mmc_block_unlock_device( dev->rdev );	}		__LEAVE0();}/* Atomically increases use count of the valid device */static inline mmc_block_device_t mmc_block_get_device( kdev_t rdev ){	mmc_block_device_t ret = NULL;		__ENTER0();		ret = __mmc_block_get_device( rdev );	if ( !ret )		goto error;		ret->usage++;	__mmc_block_put_device( ret );error:	__LEAVE( "ret=0x%p dusage=%d card=0x%p cusage=%d",			ret, ret ? ret->usage : -1, 			ret ? ret->card : NULL, 			ret ? (ret->card ? ret->card->usage : -1) : -1 );	return ret;}/* Check is there references to the card */static inline int __mmc_block_check_card( kdev_t rdev ) {	int ret = TRUE;	int start = MINOR( MMC_BLOCK_RAW_DEVICE( rdev ) );	register int i;	for ( i = 0; i < mmc_block_gendisk.max_p; i++ )		if ( mmc_block_device[start + i].usage > 0 ) {			ret = FALSE;			break;		}	return ret;}/* Atomically decreases device use count */static inline void mmc_block_put_device( mmc_block_device_t dev ){	__ENTER0();		if ( dev ) {		int invalidate = FALSE;				__mmc_block_get_device( dev->rdev );		if ( dev->usage > 0 )			--dev->usage;				if ( dev->usage ) {			__mmc_block_put_device( dev );			goto out;		} else {			int host, slot;			mmc_card_t card = NULL;						invalidate = __mmc_block_check_card( dev->rdev );				if ( invalidate ) {				host = dev->card->ctrlr->slot;				slot = dev->card->slot;				if ( dev->card ) {					card = dev->card;					mmc_put_card( dev->card );					dev->card = NULL;				}			}			__mmc_block_put_device( dev );			if ( invalidate )				__mmc_block_invalidate_card( card, TRUE );		}			}out:	__LEAVE0();}static int mmc_block_open( struct inode *inode, struct file *file ){	int ret = -ENODEV;	mmc_block_device_t dev = NULL;		__ENTER0();	if ( !inode || !file )		goto error;		BLK_INC_USE_COUNT;		check_disk_change( inode->i_rdev );		dev = mmc_block_get_device( inode->i_rdev );	if ( !dev )		goto error;		dev = __mmc_block_get_device( inode->i_rdev );	if ( !dev )		goto error;		if ( file->f_mode & FMODE_WRITE ) { /* FIXME */		if ( dev->usage > 1 ) {			ret = -EBUSY;			__mmc_block_put_device( dev );			mmc_block_put_device( dev );			goto error;		}	}		__mmc_block_put_device( dev );		if ( file )		file->private_data = dev;	ret = 0;	goto out;error:	BLK_DEC_USE_COUNT;out:	__LEAVE( "ret=%d", ret );	return ret;}static int mmc_block_release( struct inode *inode, struct file *file ){	int ret = -EINVAL;	mmc_block_device_t dev = NULL;		__ENTER( "inode=0x%p file=0x%p rdev=(%x:%x)", inode, file,			inode ? MAJOR( inode->i_rdev ) : 0xff,			inode ? MINOR( inode->i_rdev ) : 0xff );	if ( !file && !inode )		goto error;		if ( file )		dev = file->private_data;	else		dev = __mmc_block_get_device( inode->i_rdev );	if ( !dev ) {		MMC_DEBUG( MMC_DEBUG_LEVEL0, "invalid device\n" );		goto error;	}		if ( file ) {		mmc_block_put_device( dev );		file->private_data = NULL;	} else {		int invalidate = FALSE;				if ( dev->usage > 0 )			--dev->usage;				if ( dev->usage ) {			__mmc_block_put_device( dev );			goto out;					} else {			int host, slot;			mmc_card_t card = NULL;						invalidate = __mmc_block_check_card( dev->rdev );				if ( invalidate ) {				host = dev->card->ctrlr->slot;				slot = dev->card->slot;				if ( dev->card ) {					card = dev->card;					mmc_put_card( dev->card );					dev->card = NULL;				}			}			__mmc_block_put_device( dev );			if ( invalidate )				__mmc_block_invalidate_card( card, TRUE );			}	}	out:	BLK_DEC_USE_COUNT;	ret = 0;error:	__LEAVE0();	return ret;}  static int mmc_block_check_disk_change( kdev_t rdev ){	int ret = 0;#if 0	mmc_block_device_t dev = &mmc_block_device[MINOR( rdev )];		__mmc_block_lock_device( rdev );	if ( !dev->card )		ret = 1;	__mmc_block_unlock_device( rdev );#else	ret = 1;#endif	return ret;}static int mmc_block_revalidate( kdev_t rdev ){	int ret = 1;	mmc_card_t card;	mmc_block_device_t dev;	kdev_t start = MMC_BLOCK_RAW_DEVICE( rdev );	int minor = MINOR( start );	int host, slot;	int i;		__ENTER0();	(void)mmc_update_card_stack( MINOR( start )>>MMC_MINOR_HOST_SHIFT );	__mmc_block_wrlock_devices();	dev = &mmc_block_device[minor];	host = dev->host;	slot = dev->slot;	if ( dev->card ) { /* card has not been changed actually */		__mmc_block_wrunlock_devices();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久丝袜美腿综合| 日本麻豆一区二区三区视频| 成人中文字幕在线| 国产视频一区二区在线| 国内精品伊人久久久久av一坑 | 蜜桃久久av一区| 日韩欧美中文字幕精品| 极品少妇一区二区三区精品视频| 精品国产乱码久久久久久蜜臀| 国产资源精品在线观看| 国产欧美一二三区| 91福利在线观看| 日韩在线卡一卡二| 久久精品视频网| 91色九色蝌蚪| 全国精品久久少妇| 国产色综合久久| 91高清在线观看| 久久99久久99精品免视看婷婷| 日本一区二区免费在线观看视频| 色悠久久久久综合欧美99| 日本成人在线电影网| 亚洲国产精品激情在线观看| 日本黄色一区二区| 久久精品99国产精品日本| 国产精品久久久久久久裸模| 欧美日韩不卡一区| 国产91精品一区二区麻豆网站| 一区二区三区四区蜜桃 | 在线观看欧美精品| 美腿丝袜亚洲色图| 日韩毛片精品高清免费| 欧美一区二区高清| 97久久久精品综合88久久| 日韩av网站在线观看| 国产精品久99| 精品免费一区二区三区| 91丨九色丨国产丨porny| 久久精品国产亚洲aⅴ| 亚洲色图视频网| www国产成人免费观看视频 深夜成人网 | 欧美亚洲国产bt| 国产精品1区2区3区在线观看| 亚洲成人7777| 综合久久一区二区三区| 欧美精品一区二区三区蜜桃视频 | 9i在线看片成人免费| 麻豆精品在线看| 亚洲一区二区欧美| 国产精品视频你懂的| 精品免费视频一区二区| 91精品国产黑色紧身裤美女| 一本到三区不卡视频| 成人午夜在线免费| 国产一区二区h| 麻豆精品在线视频| 午夜精品久久久久久久99水蜜桃| 日韩一区在线免费观看| 国产欧美日韩三级| 欧美va亚洲va在线观看蝴蝶网| 欧美日韩高清一区二区三区| 日本久久一区二区| 99r精品视频| av不卡免费电影| 高清国产一区二区| 韩国成人精品a∨在线观看| 日韩影院免费视频| 视频一区视频二区中文字幕| 一区二区国产视频| 亚洲人成人一区二区在线观看| 国产精品嫩草影院av蜜臀| 久久精品人人做人人爽97| 日韩亚洲欧美高清| 日韩免费视频一区| 日韩精品一区二区三区swag| 日韩美女一区二区三区| 日韩女优视频免费观看| 精品国产一区二区三区不卡| 精品国产一区久久| 久久综合久久99| 国产女人aaa级久久久级| 国产欧美一区二区三区在线看蜜臀 | 日韩欧美国产1| 欧美第一区第二区| 精品国产一区二区三区久久久蜜月| 精品国产一区a| 久久精品夜夜夜夜久久| 中文一区在线播放| 亚洲婷婷综合色高清在线| 一区二区三区精品在线观看| 亚洲国产精品一区二区www在线| 亚洲国产成人91porn| 三级欧美在线一区| 精品无人区卡一卡二卡三乱码免费卡| 国内精品久久久久影院薰衣草| 国产精品自拍毛片| 成人h版在线观看| 色综合久久综合网97色综合| 欧美日韩国产欧美日美国产精品| 日韩一区二区在线看片| 2023国产一二三区日本精品2022| 国产欧美日韩在线| 亚洲视频在线一区二区| 亚洲成人1区2区| 国产一区福利在线| 99国产欧美另类久久久精品 | 国模一区二区三区白浆| av在线不卡免费看| 欧美另类一区二区三区| 国产亚洲福利社区一区| 亚洲精品五月天| 六月丁香婷婷色狠狠久久| 成人污污视频在线观看| 色呦呦一区二区三区| 制服丝袜亚洲精品中文字幕| 精品动漫一区二区三区在线观看| 久久久久久综合| 中文字幕一区二区在线播放| 日本伊人色综合网| 国产盗摄精品一区二区三区在线 | 欧美人妖巨大在线| 日韩欧美一级在线播放| 中文字幕精品三区| 亚洲国产成人av网| 成人自拍视频在线观看| 91精品国产高清一区二区三区| 国产亚洲综合色| 亚洲综合一区在线| 国产激情91久久精品导航 | 欧美电影在线免费观看| 国产精品视频你懂的| 久久精品国产精品亚洲精品| 91玉足脚交白嫩脚丫在线播放| 精品久久久久av影院| 亚洲一区二区三区视频在线| 成人美女视频在线看| 日韩欧美一区二区不卡| 亚洲一区二区三区美女| www.欧美.com| 精品99999| 日韩精品亚洲专区| 色噜噜夜夜夜综合网| 国产日韩欧美不卡在线| 久久精品国产成人一区二区三区 | 欧美日韩成人一区| 亚洲视频免费在线| 国产成人在线视频免费播放| 欧美一区二区三区在线观看| 亚洲综合视频网| 成人黄色免费短视频| 日韩女优视频免费观看| 亚洲一区二区三区爽爽爽爽爽| 97久久人人超碰| 中文字幕不卡的av| 国产在线视频精品一区| 欧美精品丝袜中出| 亚洲欧洲av色图| 成人免费毛片a| 欧美激情在线一区二区| 国内欧美视频一区二区| 欧美久久久久久蜜桃| 洋洋成人永久网站入口| 91高清视频在线| 亚洲一区二区三区爽爽爽爽爽| 在线一区二区三区| 国产精品黄色在线观看| 成人av午夜影院| 中文字幕亚洲电影| 91香蕉视频在线| 亚洲麻豆国产自偷在线| 91麻豆精品一区二区三区| 成人欧美一区二区三区视频网页| 99久久精品一区二区| 亚洲男帅同性gay1069| 在线观看亚洲专区| 亚洲一二三区不卡| 欧美日韩国产a| 麻豆精品一区二区三区| 精品精品欲导航| 国产精品一区二区久久精品爱涩| 91精品国产色综合久久不卡电影| 肉肉av福利一精品导航| 精品少妇一区二区三区在线视频 | 九色综合狠狠综合久久| 精品少妇一区二区三区| 国产在线精品免费av| 国产亚洲欧美激情| 91丨porny丨户外露出| 一区二区三区不卡在线观看| 91行情网站电视在线观看高清版| 一区av在线播放| 91精品国产aⅴ一区二区| 国产一区久久久| 亚洲激情自拍视频| 91精品在线观看入口| 精品一区二区三区免费| 一色桃子久久精品亚洲| 欧美美女黄视频| 国产高清一区日本| 一二三区精品视频|