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

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

?? pcd.c

?? Linux塊設備驅動源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
			 "generic packet");}#define DBMSG(msg)	((verbose>1)?(msg):NULL)static int pcd_media_changed(struct cdrom_device_info *cdi, int slot_nr){	struct pcd_unit *cd = cdi->handle;	int res = cd->changed;	if (res)		cd->changed = 0;	return res;}static int pcd_lock_door(struct cdrom_device_info *cdi, int lock){	char un_cmd[12] = { 0x1e, 0, 0, 0, lock, 0, 0, 0, 0, 0, 0, 0 };	return pcd_atapi(cdi->handle, un_cmd, 0, pcd_scratch,			 lock ? "lock door" : "unlock door");}static int pcd_tray_move(struct cdrom_device_info *cdi, int position){	char ej_cmd[12] = { 0x1b, 0, 0, 0, 3 - position, 0, 0, 0, 0, 0, 0, 0 };	return pcd_atapi(cdi->handle, ej_cmd, 0, pcd_scratch,			 position ? "eject" : "close tray");}static void pcd_sleep(int cs){	schedule_timeout_interruptible(cs);}static int pcd_reset(struct pcd_unit *cd){	int i, k, flg;	int expect[5] = { 1, 1, 1, 0x14, 0xeb };	pi_connect(cd->pi);	write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);	write_reg(cd, 7, 8);	pcd_sleep(20 * HZ / 1000);	/* delay a bit */	k = 0;	while ((k++ < PCD_RESET_TMO) && (status_reg(cd) & IDE_BUSY))		pcd_sleep(HZ / 10);	flg = 1;	for (i = 0; i < 5; i++)		flg &= (read_reg(cd, i + 1) == expect[i]);	if (verbose) {		printk("%s: Reset (%d) signature = ", cd->name, k);		for (i = 0; i < 5; i++)			printk("%3x", read_reg(cd, i + 1));		if (!flg)			printk(" (incorrect)");		printk("\n");	}	pi_disconnect(cd->pi);	return flg - 1;}static int pcd_drive_reset(struct cdrom_device_info *cdi){	return pcd_reset(cdi->handle);}static int pcd_ready_wait(struct pcd_unit *cd, int tmo){	char tr_cmd[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };	int k, p;	k = 0;	while (k < tmo) {		cd->last_sense = 0;		pcd_atapi(cd, tr_cmd, 0, NULL, DBMSG("test unit ready"));		p = cd->last_sense;		if (!p)			return 0;		if (!(((p & 0xffff) == 0x0402) || ((p & 0xff) == 6)))			return p;		k++;		pcd_sleep(HZ);	}	return 0x000020;	/* timeout */}static int pcd_drive_status(struct cdrom_device_info *cdi, int slot_nr){	char rc_cmd[12] = { 0x25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };	struct pcd_unit *cd = cdi->handle;	if (pcd_ready_wait(cd, PCD_READY_TMO))		return CDS_DRIVE_NOT_READY;	if (pcd_atapi(cd, rc_cmd, 8, pcd_scratch, DBMSG("check media")))		return CDS_NO_DISC;	return CDS_DISC_OK;}static int pcd_identify(struct pcd_unit *cd, char *id){	int k, s;	char id_cmd[12] = { 0x12, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };	pcd_bufblk = -1;	s = pcd_atapi(cd, id_cmd, 36, pcd_buffer, "identify");	if (s)		return -1;	if ((pcd_buffer[0] & 0x1f) != 5) {		if (verbose)			printk("%s: %s is not a CD-ROM\n",			       cd->name, cd->drive ? "Slave" : "Master");		return -1;	}	memcpy(id, pcd_buffer + 16, 16);	id[16] = 0;	k = 16;	while ((k >= 0) && (id[k] <= 0x20)) {		id[k] = 0;		k--;	}	printk("%s: %s: %s\n", cd->name, cd->drive ? "Slave" : "Master", id);	return 0;}/* * returns  0, with id set if drive is detected *	    -1, if drive detection failed */static int pcd_probe(struct pcd_unit *cd, int ms, char *id){	if (ms == -1) {		for (cd->drive = 0; cd->drive <= 1; cd->drive++)			if (!pcd_reset(cd) && !pcd_identify(cd, id))				return 0;	} else {		cd->drive = ms;		if (!pcd_reset(cd) && !pcd_identify(cd, id))			return 0;	}	return -1;}static void pcd_probe_capabilities(void){	int unit, r;	char buffer[32];	char cmd[12] = { 0x5a, 1 << 3, 0x2a, 0, 0, 0, 0, 18, 0, 0, 0, 0 };	struct pcd_unit *cd;	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {		if (!cd->present)			continue;		r = pcd_atapi(cd, cmd, 18, buffer, "mode sense capabilities");		if (r)			continue;		/* we should now have the cap page */		if ((buffer[11] & 1) == 0)			cd->info.mask |= CDC_CD_R;		if ((buffer[11] & 2) == 0)			cd->info.mask |= CDC_CD_RW;		if ((buffer[12] & 1) == 0)			cd->info.mask |= CDC_PLAY_AUDIO;		if ((buffer[14] & 1) == 0)			cd->info.mask |= CDC_LOCK;		if ((buffer[14] & 8) == 0)			cd->info.mask |= CDC_OPEN_TRAY;		if ((buffer[14] >> 6) == 0)			cd->info.mask |= CDC_CLOSE_TRAY;	}}static int pcd_detect(void){	char id[18];	int k, unit;	struct pcd_unit *cd;	printk("%s: %s version %s, major %d, nice %d\n",	       name, name, PCD_VERSION, major, nice);	k = 0;	if (pcd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */		cd = pcd;		if (pi_init(cd->pi, 1, -1, -1, -1, -1, -1, pcd_buffer,			    PI_PCD, verbose, cd->name)) {			if (!pcd_probe(cd, -1, id) && cd->disk) {				cd->present = 1;				k++;			} else				pi_release(cd->pi);		}	} else {		for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {			int *conf = *drives[unit];			if (!conf[D_PRT])				continue;			if (!pi_init(cd->pi, 0, conf[D_PRT], conf[D_MOD],				     conf[D_UNI], conf[D_PRO], conf[D_DLY],				     pcd_buffer, PI_PCD, verbose, cd->name)) 				continue;			if (!pcd_probe(cd, conf[D_SLV], id) && cd->disk) {				cd->present = 1;				k++;			} else				pi_release(cd->pi);		}	}	if (k)		return 0;	printk("%s: No CD-ROM drive found\n", name);	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++)		put_disk(cd->disk);	return -1;}/* I/O request processing */static struct request_queue *pcd_queue;static void do_pcd_request(request_queue_t * q){	if (pcd_busy)		return;	while (1) {		pcd_req = elv_next_request(q);		if (!pcd_req)			return;		if (rq_data_dir(pcd_req) == READ) {			struct pcd_unit *cd = pcd_req->rq_disk->private_data;			if (cd != pcd_current)				pcd_bufblk = -1;			pcd_current = cd;			pcd_sector = pcd_req->sector;			pcd_count = pcd_req->current_nr_sectors;			pcd_buf = pcd_req->buffer;			pcd_busy = 1;			ps_set_intr(do_pcd_read, NULL, 0, nice);			return;		} else			end_request(pcd_req, 0);	}}static inline void next_request(int success){	unsigned long saved_flags;	spin_lock_irqsave(&pcd_lock, saved_flags);	end_request(pcd_req, success);	pcd_busy = 0;	do_pcd_request(pcd_queue);	spin_unlock_irqrestore(&pcd_lock, saved_flags);}static int pcd_ready(void){	return (((status_reg(pcd_current) & (IDE_BUSY | IDE_DRQ)) == IDE_DRQ));}static void pcd_transfer(void){	while (pcd_count && (pcd_sector / 4 == pcd_bufblk)) {		int o = (pcd_sector % 4) * 512;		memcpy(pcd_buf, pcd_buffer + o, 512);		pcd_count--;		pcd_buf += 512;		pcd_sector++;	}}static void pcd_start(void){	int b, i;	char rd_cmd[12] = { 0xa8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };	pcd_bufblk = pcd_sector / 4;	b = pcd_bufblk;	for (i = 0; i < 4; i++) {		rd_cmd[5 - i] = b & 0xff;		b = b >> 8;	}	if (pcd_command(pcd_current, rd_cmd, 2048, "read block")) {		pcd_bufblk = -1;		next_request(0);		return;	}	mdelay(1);	ps_set_intr(do_pcd_read_drq, pcd_ready, PCD_TMO, nice);}static void do_pcd_read(void){	pcd_busy = 1;	pcd_retries = 0;	pcd_transfer();	if (!pcd_count) {		next_request(1);		return;	}	pi_do_claimed(pcd_current->pi, pcd_start);}static void do_pcd_read_drq(void){	unsigned long saved_flags;	if (pcd_completion(pcd_current, pcd_buffer, "read block")) {		if (pcd_retries < PCD_RETRIES) {			mdelay(1);			pcd_retries++;			pi_do_claimed(pcd_current->pi, pcd_start);			return;		}		pcd_bufblk = -1;		next_request(0);		return;	}	do_pcd_read();	spin_lock_irqsave(&pcd_lock, saved_flags);	do_pcd_request(pcd_queue);	spin_unlock_irqrestore(&pcd_lock, saved_flags);}/* the audio_ioctl stuff is adapted from sr_ioctl.c */static int pcd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg){	struct pcd_unit *cd = cdi->handle;	switch (cmd) {	case CDROMREADTOCHDR:		{			char cmd[12] =			    { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,			 0, 0, 0 };			struct cdrom_tochdr *tochdr =			    (struct cdrom_tochdr *) arg;			char buffer[32];			int r;			r = pcd_atapi(cd, cmd, 12, buffer, "read toc header");			tochdr->cdth_trk0 = buffer[2];			tochdr->cdth_trk1 = buffer[3];			return r ? -EIO : 0;		}	case CDROMREADTOCENTRY:		{			char cmd[12] =			    { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,			 0, 0, 0 };			struct cdrom_tocentry *tocentry =			    (struct cdrom_tocentry *) arg;			unsigned char buffer[32];			int r;			cmd[1] =			    (tocentry->cdte_format == CDROM_MSF ? 0x02 : 0);			cmd[6] = tocentry->cdte_track;			r = pcd_atapi(cd, cmd, 12, buffer, "read toc entry");			tocentry->cdte_ctrl = buffer[5] & 0xf;			tocentry->cdte_adr = buffer[5] >> 4;			tocentry->cdte_datamode =			    (tocentry->cdte_ctrl & 0x04) ? 1 : 0;			if (tocentry->cdte_format == CDROM_MSF) {				tocentry->cdte_addr.msf.minute = buffer[9];				tocentry->cdte_addr.msf.second = buffer[10];				tocentry->cdte_addr.msf.frame = buffer[11];			} else				tocentry->cdte_addr.lba =				    (((((buffer[8] << 8) + buffer[9]) << 8)				      + buffer[10]) << 8) + buffer[11];			return r ? -EIO : 0;		}	default:		return -ENOSYS;	}}static int pcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn){	char cmd[12] =	    { GPCMD_READ_SUBCHANNEL, 0, 0x40, 2, 0, 0, 0, 0, 24, 0, 0, 0 };	char buffer[32];	if (pcd_atapi(cdi->handle, cmd, 24, buffer, "get mcn"))		return -EIO;	memcpy(mcn->medium_catalog_number, buffer + 9, 13);	mcn->medium_catalog_number[13] = 0;	return 0;}static int __init pcd_init(void){	struct pcd_unit *cd;	int unit;	if (disable)		return -1;	pcd_init_units();	if (pcd_detect())		return -1;	/* get the atapi capabilities page */	pcd_probe_capabilities();	if (register_blkdev(major, name)) {		for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++)			put_disk(cd->disk);		return -1;	}	pcd_queue = blk_init_queue(do_pcd_request, &pcd_lock);	if (!pcd_queue) {		unregister_blkdev(major, name);		for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++)			put_disk(cd->disk);		return -1;	}	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {		if (cd->present) {			register_cdrom(&cd->info);			cd->disk->private_data = cd;			cd->disk->queue = pcd_queue;			add_disk(cd->disk);		}	}	return 0;}static void __exit pcd_exit(void){	struct pcd_unit *cd;	int unit;	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {		if (cd->present) {			del_gendisk(cd->disk);			pi_release(cd->pi);			unregister_cdrom(&cd->info);		}		put_disk(cd->disk);	}	blk_cleanup_queue(pcd_queue);	unregister_blkdev(major, name);}MODULE_LICENSE("GPL");module_init(pcd_init)module_exit(pcd_exit)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品538一区二区在线| 欧美日韩久久久一区| 欧美视频在线观看一区二区| 欧美一区二区三区四区久久| 国产精品女人毛片| 日本不卡在线视频| 91蜜桃婷婷狠狠久久综合9色| 69堂成人精品免费视频| 自拍偷拍国产精品| 久久99精品国产| 欧美午夜影院一区| 国产精品不卡视频| 精东粉嫩av免费一区二区三区| 欧美四级电影网| 国产精品的网站| 国产成人av电影| 日韩一区二区麻豆国产| 午夜在线电影亚洲一区| 成人av在线影院| 久久综合色天天久久综合图片| 亚洲成av人片在www色猫咪| 色综合天天综合网天天狠天天| 久久老女人爱爱| 日本aⅴ免费视频一区二区三区| 在线亚洲一区二区| 国产精品久久久久久久久免费丝袜 | 成人av在线网| 精品国产自在久精品国产| 亚洲国产视频一区二区| 色婷婷狠狠综合| 亚洲欧美一区二区三区久本道91| 国产91高潮流白浆在线麻豆| 欧美精品一区二区三区蜜桃视频 | 欧美极品另类videosde| 黄色精品一二区| 欧美一级理论片| 日本不卡视频在线观看| 91精品国产色综合久久不卡电影| 亚洲动漫第一页| 91精品在线免费观看| 香蕉影视欧美成人| 91精品欧美一区二区三区综合在| 日韩高清在线观看| 欧美一二三在线| 国内精品久久久久影院色| 欧美精品一区二区三区四区| 极品少妇一区二区| 久久久精品免费免费| 豆国产96在线|亚洲| 国产精品国产精品国产专区不蜜| 成人午夜电影小说| 亚洲欧美另类久久久精品| 99久久久久久| 婷婷一区二区三区| 欧美不卡激情三级在线观看| 国产永久精品大片wwwapp| 国产精品久久久久影院老司| 色猫猫国产区一区二在线视频| 一卡二卡欧美日韩| 日韩欧美一级二级三级| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 色猫猫国产区一区二在线视频| 亚洲一卡二卡三卡四卡五卡| 欧美一区二区三区公司| 国产精品一区二区黑丝| 亚洲免费观看在线观看| 91麻豆精品91久久久久同性| 国产一区二区精品在线观看| 亚洲同性同志一二三专区| 欧美浪妇xxxx高跟鞋交| 国产福利一区在线| 亚洲综合激情网| 久久久久97国产精华液好用吗| caoporm超碰国产精品| 天天综合日日夜夜精品| 久久蜜臀精品av| 欧美在线色视频| 国产精品亚洲一区二区三区妖精| 一区二区三区日韩精品视频| 久久伊99综合婷婷久久伊| 欧美在线观看视频一区二区 | 日韩精品一区二区三区在线| 大桥未久av一区二区三区中文| 亚洲成人免费观看| 国产精品传媒入口麻豆| 欧美日韩国产综合视频在线观看 | 亚洲国产日韩一级| 久久久99精品免费观看不卡| 欧美亚洲综合在线| 国产白丝精品91爽爽久久 | 51久久夜色精品国产麻豆| 成人免费va视频| 精品一区二区综合| 亚洲大片免费看| 国产精品天干天干在观线| 欧美一区二区国产| 欧美日韩在线播| 91免费视频网| 成人中文字幕在线| 国产美女精品一区二区三区| 青青青伊人色综合久久| 亚洲黄一区二区三区| 国产精品麻豆欧美日韩ww| 欧美r级在线观看| 欧美喷潮久久久xxxxx| 欧美亚洲动漫另类| 91欧美激情一区二区三区成人| 国产白丝网站精品污在线入口| 久久国产麻豆精品| 日韩成人午夜精品| 婷婷综合久久一区二区三区| 亚洲黄色免费电影| 亚洲欧洲综合另类| 亚洲天堂久久久久久久| 中文一区一区三区高中清不卡| 久久精品一区二区三区四区| 久久久久久毛片| 久久香蕉国产线看观看99| 久久综合色婷婷| 精品国产乱码久久久久久闺蜜| 欧美大黄免费观看| 精品国产乱码91久久久久久网站| 日韩免费观看高清完整版在线观看| 91精品在线观看入口| 欧美一卡2卡3卡4卡| 精品免费国产一区二区三区四区| 欧美不卡视频一区| 久久综合九色综合97_久久久| 欧美成人aa大片| 久久久.com| 国产精品传媒视频| 亚洲国产综合色| 美女视频一区在线观看| 韩国三级电影一区二区| 粉嫩aⅴ一区二区三区四区| 波多野结衣中文字幕一区二区三区| 不卡影院免费观看| 欧美中文字幕不卡| 日韩精品一区二区三区swag| 337p日本欧洲亚洲大胆精品| 国产精品麻豆网站| 一区二区三区在线观看视频| 亚洲一区二区三区四区在线观看| 亚洲一区在线看| 男人的天堂亚洲一区| 国产成人免费视频网站高清观看视频| 成人深夜视频在线观看| 欧美性感一类影片在线播放| 日韩精品中午字幕| 中文字幕欧美区| 亚洲大片免费看| 国产精品一区二区三区网站| 色综合一个色综合| 日韩精品一区二区三区四区| 中文av一区二区| 亚洲va欧美va天堂v国产综合| 激情偷乱视频一区二区三区| 91在线播放网址| 日韩美女视频在线| 亚洲男人的天堂在线aⅴ视频| 免费观看91视频大全| 成人午夜电影久久影院| 在线成人小视频| 国产精品午夜久久| 青椒成人免费视频| www..com久久爱| 日韩精品一区二区三区swag| 亚洲伦在线观看| 国产精品影视在线| 欧美日韩国产乱码电影| 国产精品美女www爽爽爽| 麻豆极品一区二区三区| 在线观看亚洲成人| 国产精品女人毛片| 伦理电影国产精品| 91成人免费在线| 国产精品美女久久久久久久久| 日本午夜一区二区| 欧美性色黄大片手机版| 国产精品色婷婷| 久久爱www久久做| 欧美精品欧美精品系列| 1024成人网| 成人午夜激情在线| 国产三级欧美三级日产三级99| 午夜精品久久久久影视| 91久久线看在观草草青青| 国产精品美女久久久久久久| 激情另类小说区图片区视频区| 91精品国产乱码久久蜜臀| 亚洲五码中文字幕| 色菇凉天天综合网| 亚洲欧美日韩国产另类专区| 成人avav在线| 欧美国产激情一区二区三区蜜月| 精品中文字幕一区二区| 日韩精品一区二区三区老鸭窝| 日韩黄色免费电影| 91精品国产麻豆国产自产在线| 亚洲成人tv网|