atp870u.c

来自「linux 内核源代码」· C语言 代码 · 共 2,946 行 · 第 1/5 页

C
2,946
字号
		tmport -= 0x08;		k = inb(tmport);		if (k != 0x16) {			if ((k == 0x85) || (k == 0x42)) {				continue;			}			tmport = dev->ioport[0] + 0x10;			outb(0x41, tmport);			goto wait_rdyok;		}		assignid_map |= m;	}	tmport = dev->ioport[0] + 0x02;	outb(0x7f, tmport);	tmport = dev->ioport[0] + 0x1b;	outb(0x02, tmport);	outb(0, 0x80);	val = 0x0080;		/* bsy  */	tmport = dev->ioport[0] + 0x1c;	outw(val, tmport);	val |= 0x0040;		/* sel  */	outw(val, tmport);	val |= 0x0004;		/* msg  */	outw(val, tmport);	inb(0x80);		/* 2 deskew delay(45ns*2=90ns) */	val &= 0x007f;		/* no bsy  */	outw(val, tmport);	mdelay(128);	val &= 0x00fb;		/* after 1ms no msg */	outw(val, tmport);wait_nomsg:	if ((inb(tmport) & 0x04) != 0) {		goto wait_nomsg;	}	outb(1, 0x80);	udelay(100);	for (n = 0; n < 0x30000; n++) {		if ((inb(tmport) & 0x80) != 0) {	/* bsy ? */			goto wait_io;		}	}	goto TCM_SYNC;wait_io:	for (n = 0; n < 0x30000; n++) {		if ((inb(tmport) & 0x81) == 0x0081) {			goto wait_io1;		}	}	goto TCM_SYNC;wait_io1:	inb(0x80);	val |= 0x8003;		/* io,cd,db7  */	outw(val, tmport);	inb(0x80);	val &= 0x00bf;		/* no sel     */	outw(val, tmport);	outb(2, 0x80);TCM_SYNC:	udelay(0x800);	if ((inb(tmport) & 0x80) == 0x00) {	/* bsy ? */		outw(0, tmport--);		outb(0, tmport);		tmport = dev->ioport[0] + 0x15;		outb(0, tmport);		tmport += 0x03;		outb(0x09, tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0)			cpu_relax();		tmport -= 0x08;		inb(tmport);		return;	}	val &= 0x00ff;		/* synchronization  */	val |= 0x3f00;	fun_scam(dev, &val);	outb(3, 0x80);	val &= 0x00ff;		/* isolation        */	val |= 0x2000;	fun_scam(dev, &val);	outb(4, 0x80);	i = 8;	j = 0;TCM_ID:	if ((inw(tmport) & 0x2000) == 0) {		goto TCM_ID;	}	outb(5, 0x80);	val &= 0x00ff;		/* get ID_STRING */	val |= 0x2000;	k = fun_scam(dev, &val);	if ((k & 0x03) == 0) {		goto TCM_5;	}	mbuf[j] <<= 0x01;	mbuf[j] &= 0xfe;	if ((k & 0x02) != 0) {		mbuf[j] |= 0x01;	}	i--;	if (i > 0) {		goto TCM_ID;	}	j++;	i = 8;	goto TCM_ID;TCM_5:			/* isolation complete..  *//*    mbuf[32]=0;	printk(" \n%x %x %x %s\n ",assignid_map,mbuf[0],mbuf[1],&mbuf[2]); */	i = 15;	j = mbuf[0];	if ((j & 0x20) != 0) {	/* bit5=1:ID upto 7      */		i = 7;	}	if ((j & 0x06) == 0) {	/* IDvalid?             */		goto G2Q5;	}	k = mbuf[1];small_id:	m = 1;	m <<= k;	if ((m & assignid_map) == 0) {		goto G2Q_QUIN;	}	if (k > 0) {		k--;		goto small_id;	}G2Q5:			/* srch from max acceptable ID#  */	k = i;			/* max acceptable ID#            */G2Q_LP:	m = 1;	m <<= k;	if ((m & assignid_map) == 0) {		goto G2Q_QUIN;	}	if (k > 0) {		k--;		goto G2Q_LP;	}G2Q_QUIN:		/* k=binID#,       */	assignid_map |= m;	if (k < 8) {		quintet[0] = 0x38;	/* 1st dft ID<8    */	} else {		quintet[0] = 0x31;	/* 1st  ID>=8      */	}	k &= 0x07;	quintet[1] = g2q_tab[k];	val &= 0x00ff;		/* AssignID 1stQuintet,AH=001xxxxx  */	m = quintet[0] << 8;	val |= m;	fun_scam(dev, &val);	val &= 0x00ff;		/* AssignID 2ndQuintet,AH=001xxxxx */	m = quintet[1] << 8;	val |= m;	fun_scam(dev, &val);	goto TCM_SYNC;}static void is870(struct atp_unit *dev, unsigned int wkport){	unsigned int tmport;	unsigned char i, j, k, rmb, n;	unsigned short int m;	static unsigned char mbuf[512];	static unsigned char satn[9] = { 0, 0, 0, 0, 0, 0, 0, 6, 6 };	static unsigned char inqd[9] = { 0x12, 0, 0, 0, 0x24, 0, 0, 0x24, 6 };	static unsigned char synn[6] = { 0x80, 1, 3, 1, 0x19, 0x0e };	static unsigned char synu[6] = { 0x80, 1, 3, 1, 0x0c, 0x0e };	static unsigned char synw[6] = { 0x80, 1, 3, 1, 0x0c, 0x07 };	static unsigned char wide[6] = { 0x80, 1, 2, 3, 1, 0 };		tmport = wkport + 0x3a;	outb((unsigned char) (inb(tmport) | 0x10), tmport);	for (i = 0; i < 16; i++) {		if ((dev->chip_ver != 4) && (i > 7)) {			break;		}		m = 1;		m = m << i;		if ((m & dev->active_id[0]) != 0) {			continue;		}		if (i == dev->host_id[0]) {			printk(KERN_INFO "         ID: %2d  Host Adapter\n", dev->host_id[0]);			continue;		}		tmport = wkport + 0x1b;		if (dev->chip_ver == 4) {			outb(0x01, tmport);		} else {			outb(0x00, tmport);		}		tmport = wkport + 1;		outb(0x08, tmport++);		outb(0x7f, tmport++);		outb(satn[0], tmport++);		outb(satn[1], tmport++);		outb(satn[2], tmport++);		outb(satn[3], tmport++);		outb(satn[4], tmport++);		outb(satn[5], tmport++);		tmport += 0x06;		outb(0, tmport);		tmport += 0x02;		outb(dev->id[0][i].devsp, tmport++);		outb(0, tmport++);		outb(satn[6], tmport++);		outb(satn[7], tmport++);		j = i;		if ((j & 0x08) != 0) {			j = (j & 0x07) | 0x40;		}		outb(j, tmport);		tmport += 0x03;		outb(satn[8], tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();		tmport -= 0x08;		if (inb(tmport) != 0x11 && inb(tmport) != 0x8e)			continue;		while (inb(tmport) != 0x8e)			cpu_relax();		dev->active_id[0] |= m;		tmport = wkport + 0x10;		outb(0x30, tmport);		tmport = wkport + 0x04;		outb(0x00, tmport);phase_cmd:		tmport = wkport + 0x18;		outb(0x08, tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();		tmport -= 0x08;		j = inb(tmport);		if (j != 0x16) {			tmport = wkport + 0x10;			outb(0x41, tmport);			goto phase_cmd;		}sel_ok:		tmport = wkport + 3;		outb(inqd[0], tmport++);		outb(inqd[1], tmport++);		outb(inqd[2], tmport++);		outb(inqd[3], tmport++);		outb(inqd[4], tmport++);		outb(inqd[5], tmport);		tmport += 0x07;		outb(0, tmport);		tmport += 0x02;		outb(dev->id[0][i].devsp, tmport++);		outb(0, tmport++);		outb(inqd[6], tmport++);		outb(inqd[7], tmport++);		tmport += 0x03;		outb(inqd[8], tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();					tmport -= 0x08;		if (inb(tmport) != 0x11 && inb(tmport) != 0x8e)			continue;		while (inb(tmport) != 0x8e)			cpu_relax();					tmport = wkport + 0x1b;		if (dev->chip_ver == 4)			outb(0x00, tmport);		tmport = wkport + 0x18;		outb(0x08, tmport);		tmport += 0x07;		j = 0;rd_inq_data:		k = inb(tmport);		if ((k & 0x01) != 0) {			tmport -= 0x06;			mbuf[j++] = inb(tmport);			tmport += 0x06;			goto rd_inq_data;		}		if ((k & 0x80) == 0) {			goto rd_inq_data;		}		tmport -= 0x08;		j = inb(tmport);		if (j == 0x16) {			goto inq_ok;		}		tmport = wkport + 0x10;		outb(0x46, tmport);		tmport += 0x02;		outb(0, tmport++);		outb(0, tmport++);		outb(0, tmport++);		tmport += 0x03;		outb(0x08, tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();					tmport -= 0x08;		if (inb(tmport) != 0x16) {			goto sel_ok;		}inq_ok:		mbuf[36] = 0;		printk(KERN_INFO "         ID: %2d  %s\n", i, &mbuf[8]);		dev->id[0][i].devtype = mbuf[0];		rmb = mbuf[1];		n = mbuf[7];		if (dev->chip_ver != 4) {			goto not_wide;		}		if ((mbuf[7] & 0x60) == 0) {			goto not_wide;		}		if ((dev->global_map[0] & 0x20) == 0) {			goto not_wide;		}		tmport = wkport + 0x1b;		outb(0x01, tmport);		tmport = wkport + 3;		outb(satn[0], tmport++);		outb(satn[1], tmport++);		outb(satn[2], tmport++);		outb(satn[3], tmport++);		outb(satn[4], tmport++);		outb(satn[5], tmport++);		tmport += 0x06;		outb(0, tmport);		tmport += 0x02;		outb(dev->id[0][i].devsp, tmport++);		outb(0, tmport++);		outb(satn[6], tmport++);		outb(satn[7], tmport++);		tmport += 0x03;		outb(satn[8], tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();					tmport -= 0x08;		if (inb(tmport) != 0x11 && inb(tmport) != 0x8e)			continue;		while (inb(tmport) != 0x8e)			cpu_relax();			try_wide:		j = 0;		tmport = wkport + 0x14;		outb(0x05, tmport);		tmport += 0x04;		outb(0x20, tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0) {			if ((inb(tmport) & 0x01) != 0) {				tmport -= 0x06;				outb(wide[j++], tmport);				tmport += 0x06;			}		}		tmport -= 0x08;				while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();					j = inb(tmport) & 0x0f;		if (j == 0x0f) {			goto widep_in;		}		if (j == 0x0a) {			goto widep_cmd;		}		if (j == 0x0e) {			goto try_wide;		}		continue;widep_out:		tmport = wkport + 0x18;		outb(0x20, tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0) {			if ((inb(tmport) & 0x01) != 0) {				tmport -= 0x06;				outb(0, tmport);				tmport += 0x06;			}		}		tmport -= 0x08;		j = inb(tmport) & 0x0f;		if (j == 0x0f) {			goto widep_in;		}		if (j == 0x0a) {			goto widep_cmd;		}		if (j == 0x0e) {			goto widep_out;		}		continue;widep_in:		tmport = wkport + 0x14;		outb(0xff, tmport);		tmport += 0x04;		outb(0x20, tmport);		tmport += 0x07;		k = 0;widep_in1:		j = inb(tmport);		if ((j & 0x01) != 0) {			tmport -= 0x06;			mbuf[k++] = inb(tmport);			tmport += 0x06;			goto widep_in1;		}		if ((j & 0x80) == 0x00) {			goto widep_in1;		}		tmport -= 0x08;		j = inb(tmport) & 0x0f;		if (j == 0x0f) {			goto widep_in;		}		if (j == 0x0a) {			goto widep_cmd;		}		if (j == 0x0e) {			goto widep_out;		}		continue;widep_cmd:		tmport = wkport + 0x10;		outb(0x30, tmport);		tmport = wkport + 0x14;		outb(0x00, tmport);		tmport += 0x04;		outb(0x08, tmport);		tmport += 0x07;				while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();		tmport -= 0x08;		j = inb(tmport);		if (j != 0x16) {			if (j == 0x4e) {				goto widep_out;			}			continue;		}		if (mbuf[0] != 0x01) {			goto not_wide;		}		if (mbuf[1] != 0x02) {			goto not_wide;		}		if (mbuf[2] != 0x03) {			goto not_wide;		}		if (mbuf[3] != 0x01) {			goto not_wide;		}		m = 1;		m = m << i;		dev->wide_id[0] |= m;not_wide:		if ((dev->id[0][i].devtype == 0x00) || (dev->id[0][i].devtype == 0x07) || ((dev->id[0][i].devtype == 0x05) && ((n & 0x10) != 0))) {			goto set_sync;		}		continue;set_sync:		tmport = wkport + 0x1b;		j = 0;		if ((m & dev->wide_id[0]) != 0) {			j |= 0x01;		}		outb(j, tmport);		tmport = wkport + 3;		outb(satn[0], tmport++);		outb(satn[1], tmport++);		outb(satn[2], tmport++);		outb(satn[3], tmport++);		outb(satn[4], tmport++);		outb(satn[5], tmport++);		tmport += 0x06;		outb(0, tmport);		tmport += 0x02;		outb(dev->id[0][i].devsp, tmport++);		outb(0, tmport++);		outb(satn[6], tmport++);		outb(satn[7], tmport++);		tmport += 0x03;		outb(satn[8], tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();					tmport -= 0x08;		if (inb(tmport) != 0x11 && inb(tmport) != 0x8e)			continue;		while (inb(tmport) != 0x8e)			cpu_relax();			try_sync:		j = 0;		tmport = wkport + 0x14;		outb(0x06, tmport);		tmport += 0x04;		outb(0x20, tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0) {			if ((inb(tmport) & 0x01) != 0) {				tmport -= 0x06;				if ((m & dev->wide_id[0]) != 0) {					outb(synw[j++], tmport);				} else {					if ((m & dev->ultra_map[0]) != 0) {						outb(synu[j++], tmport);					} else {						outb(synn[j++], tmport);					}				}				tmport += 0x06;			}		}		tmport -= 0x08;				while ((inb(tmport) & 0x80) == 0x00)			cpu_relax();					j = inb(tmport) & 0x0f;		if (j == 0x0f) {			goto phase_ins;		}		if (j == 0x0a) {			goto phase_cmds;		}		if (j == 0x0e) {			goto try_sync;		}		continue;phase_outs:		tmport = wkport + 0x18;		outb(0x20, tmport);		tmport += 0x07;		while ((inb(tmport) & 0x80) == 0x00) {			if ((inb(tmport) & 0x01) != 0x00) {				tmport -= 0x06;				outb(0x00, tmport);				tmport += 0x06;			}		}		tmport -= 0x08;		j = inb(tmport);		if (j == 0x85) {			goto tar_dcons;		}		j &= 0x0f;		if (j == 0x0f) {			goto phase_ins;		}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?