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

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

?? mmc_block.c

?? linux下mmc_sd卡的驅動.rar
?? C
?? 第 1 頁 / 共 2 頁
字號:
		goto out;			} else {		card = mmc_get_card( host, slot );		if ( !card ) {			MMC_DEBUG( MMC_DEBUG_LEVEL2, "failed to get card: "					"host=%d, slot=%d\n", host, slot );			__mmc_block_wrunlock_devices();			goto error;		}		dev->card = card;	}	__mmc_block_wrunlock_devices(); 	/* FIXME */	__mmc_block_rdlock_devices(); /* handle the request for sector 0 */	grok_partitions( &mmc_block_gendisk, MINOR( start ),			 mmc_block_gendisk.max_p,			 card->info.capacity>>9 /* sectors */		       );	__mmc_block_rdunlock_devices();	/* FIXME */	__mmc_block_wrlock_devices();	for ( i = start + mmc_block_gendisk.max_p - 1; i >= 0; --i ) {		int minor = MINOR( i );				dev = &mmc_block_device[minor];		if ( mmc_block_gendisk.part[minor].nr_sects > 0 )			dev->card = card;	}	__mmc_block_wrunlock_devices();out:error:	__LEAVE( "ret=%d", ret );	return ret;}static void mmc_block_handle_request( void ){	struct request *request;	mmc_block_device_t dev;	mmc_card_t card;	char *buf;	loff_t pos;	unsigned int result = 0;	for (;;) {		int minor;				INIT_REQUEST;		request = CURRENT;		spin_unlock_irq( &io_request_lock );				minor = MINOR( request->rq_dev );		dev = __mmc_block_get_device( request->rq_dev );		if ( !dev ) {			MMC_DEBUG( MMC_DEBUG_LEVEL2, "invalid device (%x:%x)\n",					MAJOR( request->rq_dev ), minor );							goto end_req;		}				card = dev->card;		(void)__mmc_block_put_device( dev );				MMC_DEBUG( MMC_DEBUG_LEVEL2, //		printk( KERN_INFO __FUNCTION__"(): "				"request %p: cmd %i sec %li (nr. %li)\n", 				CURRENT, CURRENT->cmd, CURRENT->sector, 				CURRENT->current_nr_sectors );				if ( request->current_nr_sectors >				mmc_block_gendisk.part[minor].nr_sects )			goto end_req;				// Handle the request		// TODO: handle clusterred requests in multiple block transfer mode 		buf = request->buffer;		pos = (mmc_block_gendisk.part[minor].start_sect +			request->sector) * MMC_BLOCK_SECT_SIZE;				switch ( request->cmd )		{			int i, ret;						case READ:#if 0				ret = mmc_read( card, 					(request->current_nr_sectors > 1) ?					MMC_TRANSFER_MODE_BLOCK_MULTIPLE :					MMC_TRANSFER_MODE_BLOCK_SINGLE,					buf, 					request->current_nr_sectors 					     * MMC_BLOCK_SECT_SIZE, /* FIXME */					&pos );				if ( ret < 0 ) 					goto end_req;				#else				for ( i = 0;				      i < request->current_nr_sectors;				      i++ ) {					ret = mmc_read( card,						MMC_TRANSFER_MODE_BLOCK_SINGLE,						buf,						MMC_BLOCK_SECT_SIZE, /* FIXME */						&pos );					if ( ret < 0 )						goto end_req;					else						buf += ret;				}#endif				result = 1;				break;			case WRITE:			// TODO: Read only device#if 0				ret = mmc_write( card, 					(request->current_nr_sectors > 1) ?					MMC_TRANSFER_MODE_BLOCK_MULTIPLE :					MMC_TRANSFER_MODE_BLOCK_SINGLE,					buf, 					request->current_nr_sectors 					    * MMC_BLOCK_SECT_SIZE, /* FIXME */					&pos );				if ( ret < 0 ) 					goto end_req;				#else				for ( i = 0;				      i < request->current_nr_sectors;				      i++ ) {					ret = mmc_write( card,						MMC_TRANSFER_MODE_BLOCK_SINGLE,						buf,						MMC_BLOCK_SECT_SIZE, /* FIXME */						&pos ); 					if ( ret < 0 )						goto end_req;					else						buf += ret;				}#endif				result = 1;				break;		}end_req:		__LEAVE( "result=%d", result );		spin_lock_irq( &io_request_lock );		end_request( result );	}}static volatile int leaving = 0;static DECLARE_MUTEX_LOCKED( thread_sem );static DECLARE_WAIT_QUEUE_HEAD( thr_wq );static pid_t thr_id = -1;int mmc_block_thread( void *arg ){	struct task_struct *task = current;	DECLARE_WAITQUEUE(wait, task);	__ENTER0();		task->session = 1;	task->pgrp = 1;	task->flags |= PF_MEMALLOC;	strcpy( task->comm, "mmcblockd" );	task->tty = NULL;	spin_lock_irq( &task->sigmask_lock );	sigfillset( &task->blocked );	recalc_sigpending( task );	spin_unlock_irq( &task->sigmask_lock );	exit_mm( task );	exit_files( task );	exit_sighand( task );	exit_fs( task );	while ( !leaving ) {		add_wait_queue( &thr_wq, &wait);		set_current_state( TASK_INTERRUPTIBLE );		spin_lock_irq( &io_request_lock );		if ( QUEUE_EMPTY || QUEUE_PLUGGED ) {			spin_unlock_irq( &io_request_lock );			schedule();			remove_wait_queue( &thr_wq, &wait ); 		} else {			remove_wait_queue( &thr_wq, &wait ); 			set_current_state( TASK_RUNNING );			mmc_block_handle_request(); /* handle the request */			spin_unlock_irq( &io_request_lock );		}	}	up( &thread_sem );		__LEAVE0();	return 0;}#if LINUX_VERSION_CODE < 0x20300#define RQFUNC_ARG void#else#define RQFUNC_ARG request_queue_t *q#endifstatic void mmc_block_request( RQFUNC_ARG ){	wake_up( &thr_wq );}static int mmc_block_ioctl( struct inode * inode, struct file * file,		      unsigned int cmd, unsigned long arg ){	int ret = -ENODEV;	mmc_block_device_t dev;	mmc_card_t card;	int minor;	__ENTER0();		if ( !inode || !file ) {		ret = -EINVAL;		goto error;	}	minor = MINOR( inode->i_rdev );		dev = __mmc_block_get_device( inode->i_rdev );	if ( !dev ) {		MMC_DEBUG( MMC_DEBUG_LEVEL0, "invalid device\n" );		goto error;	}		card = dev->card; 	__mmc_block_put_device( dev );		switch ( cmd ) {	case BLKGETSIZE:   /* Return device size */		{			unsigned long value;						__mmc_block_rdlock_devices();			value = mmc_block_gendisk.part[minor].nr_sects;			__mmc_block_rdunlock_devices();						if ( put_user( value, (unsigned long *) arg) ) {				ret = -EFAULT;				goto error;			}		}		break;#ifdef BLKGETSIZE64	case BLKGETSIZE64:		{			unsigned long value;						__mmc_block_rdlock_devices();			value = mmc_block_gendisk.part[minor].nr_sects;			__mmc_block_rdunlock_devices();						if ( put_user( (u64)value, (u64 *) arg) ) {				ret = -EFAULT;				goto error;			}		}		break;#endif	case HDIO_GETGEO:		{			struct hd_geometry geo;						ret = !access_ok( VERIFY_WRITE, arg, sizeof( geo ) );			if ( ret ) {				ret = -EFAULT;				goto error;			}			geo.heads = 1;			geo.sectors = 1;			__mmc_block_rdlock_devices();			geo.cylinders = mmc_block_gendisk.part[minor].nr_sects;			geo.start = mmc_block_gendisk.part[minor].start_sect;			__mmc_block_rdunlock_devices();			if ( copy_to_user( (int *)arg, &geo, sizeof( geo ) ) ) {				ret = -EFAULT;				goto error;			}		}		break;			case BLKRRPART:		if ( !capable( CAP_SYS_ADMIN ) ) {			ret = -EACCES;			goto error;		}		(void)mmc_block_revalidate( inode->i_rdev );		break;			default:		ret = blk_ioctl( inode->i_rdev, cmd, arg );		goto out;	}	ret = 0;error:	out:	__LEAVE( "ret=%d", ret );	return ret;}#if LINUX_VERSION_CODE < 0x20326static struct file_operations mmc_block_fops ={	open: 			mmc_block_open,	ioctl:			mmc_block_ioctl,	release:		mmc_block_release,	check_media_change:	mmc_block_check_disk_change,	revalidate:		mmc_block_revalidate,	read:			block_read,	write:			block_write};#elsestatic struct block_device_operations mmc_block_fops = {#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,14)	owner:			THIS_MODULE,#endif	open:			mmc_block_open,	release:		mmc_block_release,	ioctl:			mmc_block_ioctl,	check_media_change:	mmc_block_check_disk_change,	revalidate:		mmc_block_revalidate};#endifstatic int mmc_block_notify_add( mmc_card_t card ){	int ret = -1;	mmc_block_device_t dev;	kdev_t start;	int minor;	__ENTER0();      //  printk("%s::%s",__FILE__, __FUNCTION__);		if ( !card || !card->ctrlr ) 		goto error;		start = MMC_BLOCK_MKDEV( card->ctrlr->slot, card->slot );	dev = &mmc_block_device[MINOR( start )];			__mmc_block_wrlock_devices();	if ( !dev->card ) {		dev->card = card;		ret = 0;	}	__mmc_block_wrunlock_devices();	if ( !ret ) {		int i;		/* allow to read partition table */		__mmc_block_rdlock_devices(); 		grok_partitions( &mmc_block_gendisk, MINOR( start ),			 mmc_block_gendisk.max_p,			 card->info.capacity>>9 /* sectors */		);		__mmc_block_rdunlock_devices();				__mmc_block_wrlock_devices();		for ( i = start + mmc_block_gendisk.max_p - 1; i >= 0; --i ) {			minor = MINOR( i );			dev = &mmc_block_device[minor];			if ( mmc_block_gendisk.part[minor].nr_sects > 0 )				dev->card = card;		}		__mmc_block_wrunlock_devices();	}error:		__LEAVE( "ret=%d", ret );	return ret;}static int mmc_block_notify_remove( mmc_card_t card ){	int ret = -1;		__ENTER( "card=0x%p", card );		if ( card && card->ctrlr )		ret = __mmc_block_invalidate_card( card, FALSE );		__LEAVE( "ret=%d", ret );	return ret;}static mmc_notifier_rec_t mmc_block_notifier = {	add: mmc_block_notify_add,	remove: mmc_block_notify_remove};static int __init mmc_block_module_init( void ){	int ret = -ENODEV;	int i;	__ENTER0();		init_rwsem( &mmc_block_device_sem );		if ( devfs_register_blkdev( MAJOR_NR, MAJOR_NAME, &mmc_block_fops ) ) {		MMC_ERROR( "Can't allocate major number %d for MMC block devices.\n", MMC_BLOCK_MAJOR );		ret = -EAGAIN;		goto error;	}		for ( i = 0; i < (1<<MINORBITS); i++ ) {		__mmc_block_device_init( i );		init_MUTEX( &mmc_block_device[i].sem );		/* We fill it in at open() time. */		mmc_block_blk_sizes[i] = 0;		mmc_block_blk_blksizes[i] = BLOCK_SIZE;		mmc_block_hardsect_sizes[i] = 0;	}		init_waitqueue_head( &thr_wq );	/* Allow the block size to default to BLOCK_SIZE. */	blksize_size[MAJOR_NR] = mmc_block_blk_blksizes;	hardsect_size[MAJOR_NR] = mmc_block_hardsect_sizes;	/* Gendisk stuff */	memset( mmc_block_partitions, 0, sizeof( mmc_block_partitions ) );	add_gendisk( &mmc_block_gendisk );/* FIXME: per controller request queue, I/O and card stack update threads */		blk_init_queue( BLK_DEFAULT_QUEUE( MAJOR_NR ), &mmc_block_request );	thr_id = kernel_thread( mmc_block_thread, NULL, 			CLONE_FS|CLONE_FILES|CLONE_SIGHAND );	if ( !mmc_register( MMC_REG_TYPE_USER, &mmc_block_notifier, 0 ) ) {		MMC_DEBUG( MMC_DEBUG_LEVEL0, "failed to register with MMC core\n" );		goto error;	}	ret = 0;	goto out;error:	if ( thr_id != -1 ) {/* quit the thread */		leaving = 1;		wake_up(&thr_wq);			down(&thread_sem);	}	blksize_size[MAJOR_NR] = NULL;	blk_size[MAJOR_NR] = NULL;	hardsect_size[MAJOR_NR] = NULL;out:		__LEAVE0();	return ret;}static void __exit mmc_block_module_cleanup( void ){/* quit the thread */	leaving = 1;	wake_up(&thr_wq);		down(&thread_sem);		mmc_unregister( MMC_REG_TYPE_USER, &mmc_block_notifier );	del_gendisk( &mmc_block_gendisk );	devfs_unregister_blkdev( MAJOR_NR, MAJOR_NAME );		blk_cleanup_queue( BLK_DEFAULT_QUEUE( MAJOR_NR ) );	blksize_size[MAJOR_NR] = NULL;	blk_size[MAJOR_NR] = NULL;	hardsect_size[MAJOR_NR] = NULL;}EXPORT_NO_SYMBOLS;module_init( mmc_block_module_init );module_exit( mmc_block_module_cleanup );MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区丝袜| 美女免费视频一区| 日韩你懂的在线播放| 成人h动漫精品一区二区| 天天综合网天天综合色 | 亚洲国产高清在线| 91精品国产色综合久久久蜜香臀| 成人做爰69片免费看网站| 日韩不卡一区二区三区| 亚洲精品久久7777| 国产天堂亚洲国产碰碰| 欧美一三区三区四区免费在线看| 91蝌蚪porny九色| 国产综合久久久久久鬼色| 视频一区视频二区在线观看| 日韩美女精品在线| 久久精品视频一区二区| 日韩限制级电影在线观看| 欧美色窝79yyyycom| 91丨porny丨首页| 懂色av中文字幕一区二区三区| 美女一区二区久久| 日产国产欧美视频一区精品| 亚洲国产精品天堂| 一区二区三区在线视频观看| 亚洲色图清纯唯美| 国产精品无人区| 久久精品在这里| 欧美大黄免费观看| 奇米777欧美一区二区| 亚洲另类春色校园小说| 国产精品短视频| 中文字幕一区二区三区在线观看| 国产日韩欧美不卡在线| 国产亚洲欧美激情| 国产午夜亚洲精品羞羞网站| 久久精品亚洲麻豆av一区二区| 日韩色视频在线观看| 欧美精品第一页| 777亚洲妇女| 欧美一级免费大片| 日韩一二三四区| 精品捆绑美女sm三区| 久久影院电视剧免费观看| 精品国产精品网麻豆系列| 精品福利视频一区二区三区| 国产亚洲欧美在线| 欧美激情一区在线观看| 中文字幕一区二区在线播放| 一区二区三区四区乱视频| 一区二区免费看| 午夜精品影院在线观看| 日本美女一区二区三区| 狠狠久久亚洲欧美| 成人a免费在线看| 麻豆91精品视频| 国产呦精品一区二区三区网站| 韩国视频一区二区| 风间由美中文字幕在线看视频国产欧美 | 麻豆国产欧美日韩综合精品二区| 另类欧美日韩国产在线| 国产在线播放一区| www.欧美精品一二区| 欧美色中文字幕| 精品国产乱码久久久久久图片| 国产精品毛片a∨一区二区三区| 亚洲精品亚洲人成人网| 日本不卡视频一二三区| 国产乱码精品一区二区三区忘忧草 | 国产成人av电影在线观看| 成人av在线观| 欧美日韩一区视频| 精品欧美久久久| 国产精品视频yy9299一区| 香蕉成人伊视频在线观看| 国产一区在线视频| 日本韩国一区二区| 亚洲精品一区二区三区四区高清| 国产精品丝袜久久久久久app| 亚洲高清中文字幕| 国产一区二区剧情av在线| 一本色道久久加勒比精品 | 亚洲色大成网站www久久九九| 亚洲国产成人精品视频| 国产一区二区三区综合| 在线一区二区视频| 久久综合网色—综合色88| 亚洲免费观看在线观看| 麻豆国产一区二区| 日本乱人伦aⅴ精品| 久久欧美中文字幕| 亚洲3atv精品一区二区三区| 成人性色生活片| 精品少妇一区二区三区日产乱码 | 久久欧美一区二区| 亚洲成人动漫一区| 99r国产精品| 久久美女艺术照精彩视频福利播放| 亚洲高清不卡在线观看| 成人av在线一区二区三区| 欧美大胆人体bbbb| 午夜视频一区二区三区| 9i看片成人免费高清| 欧美xfplay| 日韩中文字幕91| 色网站国产精品| 欧美激情一区不卡| 国产一区二区电影| 日韩亚洲欧美高清| 日日摸夜夜添夜夜添国产精品| 91美女片黄在线| 一区二区中文字幕在线| 国产成人在线电影| 久久人人超碰精品| 久久机这里只有精品| 欧美一区二区三区免费在线看| 亚洲午夜私人影院| 99riav久久精品riav| 国产精品亲子伦对白| 国产成人免费视频精品含羞草妖精 | 国产一区二区日韩精品| 日韩一卡二卡三卡四卡| 三级在线观看一区二区| 精品视频999| 午夜精品免费在线观看| 在线中文字幕一区| 亚洲精品免费在线观看| 91麻豆成人久久精品二区三区| 亚洲欧洲一区二区在线播放| a在线欧美一区| 中文字幕视频一区| 99re在线视频这里只有精品| 中文字幕在线不卡一区二区三区| 国产成人亚洲综合a∨猫咪| 国产亚洲一区字幕| 国产mv日韩mv欧美| 国产精品视频一区二区三区不卡| 国产福利视频一区二区三区| 精品久久久久一区二区国产| 国产一区二区三区黄视频 | aa级大片欧美| 最新中文字幕一区二区三区| av一区二区三区在线| 亚洲免费在线电影| 欧美三区在线观看| 日本不卡一区二区三区 | 一区二区三区**美女毛片| 91福利精品视频| 日韩电影免费在线看| 日韩一区二区免费视频| 国产在线视频一区二区| 国产日韩欧美在线一区| 97久久久精品综合88久久| 一区二区三区四区亚洲| 777a∨成人精品桃花网| 麻豆国产精品官网| 中文字幕国产精品一区二区| 99久久国产综合精品女不卡| 亚洲成人免费在线观看| 精品美女一区二区| 99视频在线精品| 婷婷综合五月天| 国产亚洲精品aa午夜观看| 99vv1com这只有精品| 日韩成人av影视| 国产精品久久久久婷婷| 欧美三级日韩三级| 国产一区二区三区美女| 亚洲免费看黄网站| 日韩精品在线看片z| av爱爱亚洲一区| 男人的j进女人的j一区| 国产精品乱码一区二区三区软件| 欧美性生活一区| 国产精品主播直播| 亚洲中国最大av网站| 欧美精品一区视频| 欧美亚洲另类激情小说| 狠狠色综合播放一区二区| 欧美激情在线看| 欧美猛男男办公室激情| 久久不见久久见免费视频1| 久久久亚洲午夜电影| 色菇凉天天综合网| 久久se精品一区二区| 亚洲免费观看高清完整版在线观看 | 日本伊人色综合网| 国产精品久久久久久久久久免费看 | 成人免费一区二区三区在线观看| 成人一区在线看| 天天操天天综合网| 国产精品人成在线观看免费| 4438x亚洲最大成人网| 成人动漫视频在线| 蜜臀av性久久久久av蜜臀妖精| 国产精品系列在线| 日韩欧美国产不卡| 在线精品视频免费播放| 国产成人在线视频免费播放| 日日夜夜精品视频天天综合网|