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

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

?? xd.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 2 頁
字號:
static void xd_interrupt_handler (int unused)
{
	if (inb(XD_STATUS) & STAT_INTERRUPT) {							/* check if it was our device */
#ifdef DEBUG_OTHER
		printk("xd_interrupt_handler: interrupt detected\n");
#endif /* DEBUG_OTHER */
		outb(0,XD_CONTROL);								/* acknowledge interrupt */
		wake_up(&xd_wait_int);								/* and wake up sleeping processes */
	}
	else
		printk("xd_interrupt_handler: unexpected interrupt\n");
}

/* xd_dma: set up the DMA controller for a data transfer */
static u_char xd_setup_dma (u_char mode,u_char *buffer,u_int count)
{
	if (buffer < ((u_char *) 0x1000000 - count)) {		/* transfer to address < 16M? */
		if (((u_int) buffer & 0xFFFF0000) != ((u_int) buffer + count) & 0xFFFF0000) {
#ifdef DEBUG_OTHER
			printk("xd_setup_dma: using PIO, transfer overlaps 64k boundary\n");
#endif /* DEBUG_OTHER */
			return (PIO_MODE);
		}
		disable_dma(xd_dma);
		clear_dma_ff(xd_dma);
		set_dma_mode(xd_dma,mode);
		set_dma_addr(xd_dma,(u_int) buffer);
		set_dma_count(xd_dma,count);

		return (DMA_MODE);			/* use DMA and INT */
	}
#ifdef DEBUG_OTHER
	printk("xd_setup_dma: using PIO, cannot DMA above 16 meg\n");
#endif /* DEBUG_OTHER */
	return (PIO_MODE);
}

/* xd_build: put stuff into an array in a format suitable for the controller */
static u_char *xd_build (u_char *cmdblk,u_char command,u_char drive,u_char head,u_short cylinder,u_char sector,u_char count,u_char control)
{
	cmdblk[0] = command;
	cmdblk[1] = ((drive & 0x07) << 5) | (head & 0x1F);
	cmdblk[2] = ((cylinder & 0x300) >> 2) | (sector & 0x3F);
	cmdblk[3] = cylinder & 0xFF;
	cmdblk[4] = count;
	cmdblk[5] = control;
	
	return (cmdblk);
}

/* xd_waitport: waits until port & mask == flags or a timeout occurs. return 1 for a timeout */
static inline u_char xd_waitport (u_short port,u_char flags,u_char mask,u_long timeout)
{
	u_long expiry = jiffies + timeout;

	while (((inb(port) & mask) != flags) && (jiffies < expiry))
		;

	return (jiffies >= expiry);
}

/* xd_command: handle all data transfers necessary for a single command */
static u_int xd_command (u_char *command,u_char mode,u_char *indata,u_char *outdata,u_char *sense,u_long timeout)
{
	u_char cmdblk[6],csb,complete = 0;

#ifdef DEBUG_COMMAND
	printk("xd_command: command = 0x%X, mode = 0x%X, indata = 0x%X, outdata = 0x%X, sense = 0x%X\n",command,mode,indata,outdata,sense);
#endif /* DEBUG_COMMAND */

	outb(0,XD_SELECT);
	outb(mode,XD_CONTROL);

	if (xd_waitport(XD_STATUS,STAT_SELECT,STAT_SELECT,timeout))
		return (1);
	
	while (!complete) {
		if (xd_waitport(XD_STATUS,STAT_READY,STAT_READY,timeout))
			return (1);
		switch (inb(XD_STATUS) & (STAT_COMMAND | STAT_INPUT)) {
			case 0:			if (mode == DMA_MODE) {
							enable_dma(xd_dma);
							sleep_on(&xd_wait_int);
							disable_dma(xd_dma);
						}
						else
							outb(outdata ? *outdata++ : 0,XD_DATA);
						break;
			case STAT_INPUT:	if (mode == DMA_MODE) {
							enable_dma(xd_dma);
							sleep_on(&xd_wait_int);
							disable_dma(xd_dma);
						}
						else
							if (indata)
								*indata++ = inb(XD_DATA);
							else
								inb(XD_DATA);
						break;
			case STAT_COMMAND:	outb(command ? *command++ : 0,XD_DATA); break;
			case STAT_COMMAND
			     | STAT_INPUT:	complete = 1; break;
		}
	}
	csb = inb(XD_DATA);

	if (xd_waitport(XD_STATUS,0,STAT_SELECT,timeout))					/* wait until deselected */
		return (1);

	if (csb & CSB_ERROR) {									/* read sense data if error */
		xd_build(cmdblk,CMD_SENSE,(csb & CSB_LUN) >> 5,0,0,0,0,0);
		if (xd_command(cmdblk,0,sense,0,0,XD_TIMEOUT))
			printk("xd_command: warning! sense command failed!\n");
	}

#ifdef DEBUG_COMMAND
	printk("xd_command: completed with csb = 0x%X\n",csb);
#endif /* DEBUG_COMMAND */

	return (csb & CSB_ERROR);
}

static u_char xd_initdrives (void (*init_drive)(u_char drive))
{
	u_char cmdblk[6],i,count = 0;

	for (i = 0; i < XD_MAXDRIVES; i++) {
		xd_build(cmdblk,CMD_TESTREADY,i,0,0,0,0,0);
		if (!xd_command(cmdblk,PIO_MODE,0,0,0,XD_TIMEOUT * 2)) {
			init_drive(count);
			count++;
		}
	}
	return (count);
}

static void xd_dtc_init_controller (u_char *address)
{
	switch ((u_long) address) {
		case 0xC8000:	xd_iobase = 0x320; break;
		case 0xCA000:	xd_iobase = 0x324; break;
		default:        printk("xd_dtc_init_controller: unsupported BIOS address %p\n",address);
				xd_iobase = 0x320; break;
	}
	xd_irq = 5;			/* the IRQ _can_ be changed on this card, but requires a hardware mod */
	xd_dma = 3;
	xd_maxsectors = 0x01;		/* my card seems to have trouble doing multi-block transfers? */

	outb(0,XD_RESET);		/* reset the controller */
}

static void xd_dtc_init_drive (u_char drive)
{
	u_char cmdblk[6],buf[64];

	xd_build(cmdblk,CMD_DTCGETGEOM,drive,0,0,0,0,0);
	if (!xd_command(cmdblk,PIO_MODE,buf,0,0,XD_TIMEOUT * 2)) {
		xd_info[drive].heads = buf[0x0A];			/* heads */
		xd_info[drive].cylinders = ((u_short *) (buf))[0x04];	/* cylinders */
		xd_info[drive].sectors = 17;				/* sectors */
#if 0
		xd_info[drive].rwrite = ((u_short *) (buf + 1))[0x05];	/* reduced write */
		xd_info[drive].precomp = ((u_short *) (buf + 1))[0x06];	/* write precomp */
		xd_info[drive].ecc = buf[0x0F];				/* ecc length */
#endif /* 0 */
		xd_info[drive].control = 0;				/* control byte */

		xd_setparam(CMD_DTCSETPARAM,drive,xd_info[drive].heads,xd_info[drive].cylinders,((u_short *) (buf + 1))[0x05],((u_short *) (buf + 1))[0x06],buf[0x0F]);
		xd_build(cmdblk,CMD_DTCSETSTEP,drive,0,0,0,0,7);
		if (xd_command(cmdblk,PIO_MODE,0,0,0,XD_TIMEOUT * 2))
			printk("xd_dtc_init_drive: error setting step rate for drive %d\n",drive);
	}
	else
		printk("xd_dtc_init_drive: error reading geometry for drive %d\n",drive);
}

static void xd_wd_init_controller (u_char *address)
{
	switch ((u_long) address) {
		case 0xC8000:	xd_iobase = 0x320; break;
		case 0xCA000:	xd_iobase = 0x324; break;
		case 0xCC000:   xd_iobase = 0x328; break;
		case 0xCE000:   xd_iobase = 0x32C; break;
		case 0xD0000:	xd_iobase = 0x328; break;
		case 0xD8000:	xd_iobase = 0x32C; break;
		default:        printk("xd_wd_init_controller: unsupported BIOS address %p\n",address);
				xd_iobase = 0x320; break;
	}
	xd_irq = 5;			/* don't know how to auto-detect this yet */
	xd_dma = 3;
	xd_maxsectors = 0x01;		/* this one doesn't wrap properly either... */

	/* outb(0,XD_RESET); */		/* reset the controller */
}

static void xd_wd_init_drive (u_char drive)
{
	u_char cmdblk[6],buf[0x200];

	xd_build(cmdblk,CMD_READ,drive,0,0,0,1,0);
	if (!xd_command(cmdblk,PIO_MODE,buf,0,0,XD_TIMEOUT * 2)) {
		xd_info[drive].heads = buf[0x1AF];				/* heads */
		xd_info[drive].cylinders = ((u_short *) (buf + 1))[0xD6];	/* cylinders */
		xd_info[drive].sectors = 17;					/* sectors */
#if 0
		xd_info[drive].rwrite = ((u_short *) (buf))[0xD8];		/* reduced write */
		xd_info[drive].wprecomp = ((u_short *) (buf))[0xDA];		/* write precomp */
		xd_info[drive].ecc = buf[0x1B4];				/* ecc length */
#endif /* 0 */
		xd_info[drive].control = buf[0x1B5];				/* control byte */

		xd_setparam(CMD_WDSETPARAM,drive,xd_info[drive].heads,xd_info[drive].cylinders,((u_short *) (buf))[0xD8],((u_short *) (buf))[0xDA],buf[0x1B4]);
	}
	else
		printk("xd_wd_init_drive: error reading geometry for drive %d\n",drive);	
}

static void xd_seagate_init_controller (u_char *address)
{
	switch ((u_long) address) {
		case 0xC8000:	xd_iobase = 0x320; break;
		case 0xD0000:	xd_iobase = 0x324; break;
		case 0xD8000:	xd_iobase = 0x328; break;
		case 0xE0000:	xd_iobase = 0x32C; break;
		default:	printk("xd_seagate_init_controller: unsupported BIOS address %p\n",address);
				xd_iobase = 0x320; break;
	}
	xd_irq = 5;			/* the IRQ and DMA channel are fixed on the Seagate controllers */
	xd_dma = 3;
	xd_maxsectors = 0x40;

	outb(0,XD_RESET);		/* reset the controller */
}

static void xd_seagate_init_drive (u_char drive)
{
	u_char cmdblk[6],buf[0x200];

	xd_build(cmdblk,CMD_ST11GETGEOM,drive,0,0,0,1,0);
	if (!xd_command(cmdblk,PIO_MODE,buf,0,0,XD_TIMEOUT * 2)) {
		xd_info[drive].heads = buf[0x04];				/* heads */
		xd_info[drive].cylinders = (buf[0x02] << 8) | buf[0x03];	/* cylinders */
		xd_info[drive].sectors = buf[0x05];				/* sectors */
		xd_info[drive].control = 0;					/* control byte */
	}
	else
		printk("xd_seagate_init_drive: error reading geometry from drive %d\n",drive);
}

/* Omti support courtesy Dirk Melchers */
static void xd_omti_init_controller (u_char *address)
{
	switch ((u_long) address) {
		case 0xC8000:	xd_iobase = 0x320; break;
		case 0xD0000:	xd_iobase = 0x324; break;
		case 0xD8000:	xd_iobase = 0x328; break;
		case 0xE0000:	xd_iobase = 0x32C; break;
		default:	printk("xd_omti_init_controller: unsupported BIOS address %p\n",address);
				xd_iobase = 0x320; break;
	}
	
	xd_irq = 5;			/* the IRQ and DMA channel are fixed on the Omti controllers */
	xd_dma = 3;
	xd_maxsectors = 0x40;

	outb(0,XD_RESET);		/* reset the controller */
}

static void xd_omti_init_drive (u_char drive)
{
	/* gets infos from drive */
	xd_override_init_drive(drive);

	/* set other parameters, Hardcoded, not that nice :-) */
	xd_info[drive].control = 2;
}

/* xd_override_init_drive: this finds disk geometry in a "binary search" style, narrowing in on the "correct" number of heads
   etc. by trying values until it gets the highest successful value. Idea courtesy Salvador Abreu (spa@fct.unl.pt). */
static void xd_override_init_drive (u_char drive)
{
	u_short min[] = { 0,0,0 },max[] = { 16,1024,64 },test[] = { 0,0,0 };
	u_char cmdblk[6],i;

	for (i = 0; i < 3; i++) {
		while (min[i] != max[i] - 1) {
			test[i] = (min[i] + max[i]) / 2;
			xd_build(cmdblk,CMD_SEEK,drive,(u_char) test[0],(u_short) test[1],(u_char) test[2],0,0);
			if (!xd_command(cmdblk,PIO_MODE,0,0,0,XD_TIMEOUT * 2))
				min[i] = test[i];
			else
				max[i] = test[i];
		}
		test[i] = min[i];
	}
	xd_info[drive].heads = (u_char) min[0] + 1;
	xd_info[drive].cylinders = (u_short) min[1] + 1;
	xd_info[drive].sectors = (u_char) min[2] + 1;
	xd_info[drive].control = 0;
}

/* xd_setup: initialise from command line parameters */
void xd_setup (char *command,int *integers)
{
	xd_override = 1;

	xd_type = integers[1];
	xd_irq = integers[2];
	xd_iobase = integers[3];
	xd_dma = integers[4];

	xd_maxsectors = 0x01;
}

/* xd_setparam: set the drive characteristics */
static void xd_setparam (u_char command,u_char drive,u_char heads,u_short cylinders,u_short rwrite,u_short wprecomp,u_char ecc)
{
	u_char cmdblk[14];

	xd_build(cmdblk,command,drive,0,0,0,0,0);
	cmdblk[6] = (u_char) (cylinders >> 8) & 0x03;
	cmdblk[7] = (u_char) (cylinders & 0xFF);
	cmdblk[8] = heads & 0x1F;
	cmdblk[9] = (u_char) (rwrite >> 8) & 0x03;
	cmdblk[10] = (u_char) (rwrite & 0xFF);
	cmdblk[11] = (u_char) (wprecomp >> 8) & 0x03;
	cmdblk[12] = (u_char) (wprecomp & 0xFF);
	cmdblk[13] = ecc;

	if (xd_command(cmdblk,PIO_MODE,0,0,0,XD_TIMEOUT * 2))
		printk("xd_setparam: error setting characteristics for drive %d\n",drive);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本久久a久久精品亚洲| 日本欧洲一区二区| 成人动漫一区二区在线| 国产人伦精品一区二区| 99这里都是精品| 一二三四社区欧美黄| 欧美亚洲国产一区在线观看网站| 亚洲一区二区偷拍精品| 在线不卡a资源高清| 久久精品999| 国产精品色在线观看| 日本韩国欧美国产| 视频一区二区欧美| 久久久精品国产免大香伊 | 国产黄人亚洲片| 国产精品美女一区二区三区| 色综合天天综合在线视频| 日韩—二三区免费观看av| 久久久久久久网| 日本精品一级二级| 久久99精品视频| 亚洲欧美日本在线| 日韩视频免费观看高清完整版 | 亚洲国产成人精品视频| 日韩精品一区二区三区在线| 国产成人a级片| 亚洲国产视频一区二区| 久久亚洲一区二区三区四区| 日本高清不卡视频| 国产一区视频在线看| 洋洋成人永久网站入口| 久久无码av三级| 欧美性视频一区二区三区| 国产一区二区伦理片| 亚洲一区二区三区小说| 国产亚洲污的网站| 欧美日韩国产大片| 91亚洲国产成人精品一区二区三| 美女视频黄 久久| 亚洲精品国产第一综合99久久| 精品国偷自产国产一区| 在线观看亚洲精品视频| 国产91在线看| 久草精品在线观看| 午夜精品久久一牛影视| 国产精品高潮呻吟| 久久天堂av综合合色蜜桃网| 欧美精品精品一区| 一本大道久久a久久精二百| 紧缚捆绑精品一区二区| 婷婷一区二区三区| 亚洲欧美区自拍先锋| 久久久久国产精品厨房| 日韩网站在线看片你懂的| 欧美日韩一区二区三区在线 | 成人国产亚洲欧美成人综合网 | 91激情在线视频| 国产成人午夜精品影院观看视频 | 国产精品国产三级国产aⅴ入口| 欧美精品一区二区三区高清aⅴ | 久久综合狠狠综合久久综合88| 欧美绝品在线观看成人午夜影视| 一本到不卡精品视频在线观看| 国产suv精品一区二区三区| 精品一区二区免费在线观看| 人人爽香蕉精品| 日韩国产欧美三级| 日精品一区二区三区| 亚洲大片一区二区三区| 一区二区三区精密机械公司| 亚洲欧洲中文日韩久久av乱码| 中文av一区二区| 国产精品无遮挡| 中文字幕欧美三区| 国产精品女主播av| 中文字幕乱码一区二区免费| 中文字幕欧美日本乱码一线二线 | 亚洲欧美中日韩| 国产精品盗摄一区二区三区| 亚洲国产岛国毛片在线| 国产精品久久久久一区| 亚洲男人天堂av| 一区二区三区在线视频免费| 一区二区三区四区精品在线视频 | 91香蕉视频黄| 91一区在线观看| 欧美在线观看视频一区二区三区| 欧美亚洲日本国产| 国产欧美一区二区三区在线老狼| 国产日韩欧美不卡在线| 亚洲人成网站精品片在线观看| 亚洲视频香蕉人妖| 亚洲国产视频直播| 久久精品99国产精品日本| 国产精品1区2区3区| 成人午夜视频福利| 91久久精品一区二区二区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲一区二区欧美日韩| 日韩国产欧美在线视频| 国产精品一品视频| 色狠狠桃花综合| 91麻豆精品国产91久久久久久久久 | www.久久精品| 欧美日韩性生活| 精品国产在天天线2019| 国产精品久久久久久久浪潮网站| 一区二区三区四区蜜桃| 精品一区二区三区av| eeuss鲁一区二区三区| 欧美日韩国产综合一区二区三区 | 国产欧美一区二区三区沐欲| 亚洲免费观看高清| 久久精品国产一区二区三 | 亚洲一区二三区| 精品一区二区三区视频在线观看 | 91精品久久久久久久99蜜桃| 久久久国产午夜精品| 洋洋成人永久网站入口| 国产麻豆欧美日韩一区| 欧美影院一区二区| 久久亚区不卡日本| 亚洲第一成年网| 懂色av中文一区二区三区| 911精品产国品一二三产区| 国产精品网站在线观看| 美女视频第一区二区三区免费观看网站 | 秋霞午夜鲁丝一区二区老狼| av在线播放一区二区三区| 日韩一区二区精品| 亚洲成人三级小说| 99久久精品免费看国产免费软件| 欧美一级高清片| 亚洲图片欧美综合| 99国产精品视频免费观看| 日韩视频在线你懂得| 亚洲午夜激情av| 99久久er热在这里只有精品66| 精品国产制服丝袜高跟| 亚洲h动漫在线| 91丝袜美女网| 国产精品久久久久久久久图文区| 麻豆精品一二三| 欧美日韩国产大片| 亚洲蜜臀av乱码久久精品| 成人一区二区三区在线观看| 精品少妇一区二区三区免费观看| 五月婷婷综合在线| 欧美日韩在线精品一区二区三区激情 | 成人av电影观看| 国产欧美一区在线| 国产乱码字幕精品高清av| 日韩欧美一二三区| 美女久久久精品| 欧美人动与zoxxxx乱| 亚洲国产美国国产综合一区二区| 97精品国产97久久久久久久久久久久| 26uuu国产在线精品一区二区| 日韩电影在线免费| 欧美久久久久久久久| 五月婷婷综合网| 欧美日韩你懂的| 五月天国产精品| 在线不卡欧美精品一区二区三区| 午夜精品福利一区二区三区av| 在线观看视频一区二区欧美日韩| 亚洲男女一区二区三区| 91美女福利视频| 亚洲最新视频在线观看| 欧美日韩一区二区三区视频| 亚洲国产aⅴ成人精品无吗| 欧美群妇大交群的观看方式| 婷婷夜色潮精品综合在线| 欧美一区二区三区成人| 蜜桃精品视频在线| 精品国偷自产国产一区| 国产精品一区二区在线看| 国产欧美一区二区精品性| 波多野结衣中文字幕一区二区三区 | 亚洲专区一二三| 欧美日产国产精品| 久久国产精品一区二区| 国产亚洲欧美激情| 一本一道综合狠狠老| 亚洲国产精品久久久久婷婷884| 91精品国产综合久久香蕉麻豆| 美女任你摸久久| 中文久久乱码一区二区| 91女人视频在线观看| 亚洲大片免费看| 久久婷婷国产综合精品青草 | 精品视频色一区| 精品一区二区日韩| 成人欧美一区二区三区1314| 91极品视觉盛宴| 国产真实乱子伦精品视频| 国产精品人成在线观看免费| 欧美日韩在线观看一区二区| 久久国产乱子精品免费女| 成人欧美一区二区三区小说|