[Linux-parport] Problem with ECP+EPP

Eduardo Pérez Ureta eduardo.perez at uc3m.es
Mon Apr 18 12:32:58 EDT 2005


On 2004-10-13 04:11:56 +0000, ZIGLIO, Frediano, VF-IT wrote:
> I set up my port for ECP+EPP under bios. Linux detect nor ECP nor EPP. I
> have a NVIDIA+Athlon setup. I have also the same problem with a Intel
> (pentium 4, hp d530 product).
> I realize that this code 
> 
> /* Check for Intel bug. */
> if (priv->ecr) {
> 	unsigned char i;
> 	for (i = 0x00; i < 0x80; i += 0x20) {
> 		ECR_WRITE (pb, i);
> 		if (clear_epp_timeout (pb)) {
> 			/* Phony EPP in ECP. */
> 			return 0;
> 		}
> 	}
> }

I also have a (2003) Intel Chipset and removing that code made EPP mode
detected.

Could someone point me what bug is that supposed to fix?
(The comment should include at least a reference to it)

I'd just remove that piece of code, but I don't know if there's some
buggy chipset around there.

> cause the misdetection. Removing it fix half the problem (it see EPP but
> not ECP). I don't understand why above of this I have 
> 
> /* If EPP timeout bit clear then EPP available */
> if (!clear_epp_timeout(pb)) {
> 	return 0;  /* No way to clear timeout */
> }
> 
> before you check if clear_epp_timeout returns == 0 and after this you
> check if clear_epp_timeout != 0. If EPP it's enabled the port should
> behave the same... or not?
> 
> Below
> 
> static int __devinit parport_ECPEPP_supported(struct parport *pb)
> {
> 	struct parport_pc_private *priv = pb->private_data;
> 	int result;
> 	unsigned char oecr;
> 
> 	if (!priv->ecr) {
> 		return 0;
> 	}
> 
> 	oecr = inb (ECONTROL (pb));
> 	/* Search for SMC style EPP+ECP mode */
> 	ECR_WRITE (pb, 0x80);
> 	outb (0x04, CONTROL (pb));
> 	result = parport_EPP_supported(pb);
> 
> 	ECR_WRITE (pb, oecr);
> 
> 	if (result) {
> 		/* Set up access functions to use ECP+EPP hardware. */
> 		pb->ops->epp_read_data = parport_pc_ecpepp_read_data;
> 		pb->ops->epp_write_data = parport_pc_ecpepp_write_data;
> 		pb->ops->epp_read_addr = parport_pc_ecpepp_read_addr;
> 		pb->ops->epp_write_addr = parport_pc_ecpepp_write_addr;
> 	}
> 
> 	return result;
> }
> 
> why you detect ECP+EPP but not set the mode ?? in parport_EPP_supported
> you have
> 
> pb->modes |= PARPORT_MODE_EPP;
> 
> so in parport_ECPEPP_supported we should have
> 
> pb->modes |= PARPORT_MODE_EPP | PARPORT_MODE_ECP;
> 
> More over
> 
> if (base != 0x3bc) {
> 	EPP_res = request_region(base+0x3, 5, p->name);
> 	if (EPP_res)
> 		if (!parport_EPP_supported(p))
> 			parport_ECPEPP_supported(p);
> }
> 
> so if EPP it's not supported you don't test for EPP+ECP. Perhaps should
> be
> 
> if (base != 0x3bc) {
> 	EPP_res = request_region(base+0x3, 5, p->name);
> 	if (EPP_res)
> 		if (!parport_ECPEPP_supported(p))
> 			parport_EPP_supported(p);
> }
> 
> ???
> 
> removed intel check bug and reverse check and I got correctly EPP,ECP in
> modes. Note also that on my machine parport_pc detect correctly irq
> however /proc/sys/dev/parport/parport0/irq it's still -1. If I set dma
> (modprobe parport_pc io=0x378 io_hi=0x778 irq=7 dma=3) but parport_pc do
> not detect ECP, I can read dma in /proc/sys/dev/parport/parport0/dma and
> when unloaded parport_pc try to free dma (IMHO it shouldn't free it).



More information about the Linux-parport mailing list