On Thu, Oct 24, 2002 at 10:12:48AM +0100, Tim Waugh wrote:
> On Thu, Oct 24, 2002 at 07:45:16AM +0200, stef wrote:
>
> > Here's the log with DEBUG defined in parport modules:
>
> I think you'll need to add more printks than just what you get with
> DEBUG. We want to know, for both O_NONBLOCK and !O_NONBLOCK, what is
> going on in the ppdev loop and what is going on in the parport_pc read
> call.
>
> Tim.
> */
After putting some debug messages, I get:
Oct 28 08:44:51 xxxx kernel: parport_pc_epp_read_data(1) called
Oct 28 08:44:51 xxxx kernel: parport_pc_epp_read_data timeout
Oct 28 08:44:51 xxxx kernel: parport_pc_epp_read_data return 0 bytes
Oct 28 08:44:51 xxxx kernel: ppdev: pp_read (fct=2) data got 0 bytes
Here are the code fragments:
ppdev.c:
while (bytes_read == 0) {
ssize_t need = min_t(unsigned long, count, PP_BUFFER_SIZE);
if (mode == IEEE1284_MODE_EPP) {
/* various specials for EPP mode */
int flags = 0;
size_t (*fn)(struct parport *, void *, size_t, int);
if (pp->flags & PP_W91284PIC) {
flags |= PARPORT_W91284PIC;
}
if (pp->flags & PP_FASTREAD) {
flags |= PARPORT_EPP_FAST;
}
if (pport->ieee1284.mode & IEEE1284_ADDR) {
fct=1;
fn = pport->ops->epp_read_addr;
} else {
fct=2;
fn = pport->ops->epp_read_data;
}
bytes_read = (*fn)(pport, kbuffer, need, flags);
} else {
fct=3;
bytes_read = parport_read (pport, kbuffer, need);
}
if (bytes_read != 0)
break;
if (file->f_flags & O_NONBLOCK) {
bytes_read = -EAGAIN;
break;
}
if (signal_pending (current)) {
bytes_read = -ERESTARTSYS;
break;
}
if (current->need_resched)
schedule ();
if(bytes_read == 0) {
if (pport->ieee1284.mode & IEEE1284_ADDR) {
printk (KERN_DEBUG CHRDEV ": pp_read (fct=%d) addr got 0 bytes\n",fct);
} else {
printk (KERN_DEBUG CHRDEV ": pp_read (fct=%d) data got 0 bytes\n",fct);
}
}
}
then parport_pc.c:
#ifdef CONFIG_PARPORT_1284
static size_t parport_pc_epp_read_data (struct parport *port, void *buf,
size_t length, int flags)
{
size_t got = 0;
printk (KERN_DEBUG "parport_pc_epp_read_data(%d) called\n",length);
if (flags & PARPORT_W91284PIC) {
unsigned char status;
size_t left = length;
/* use knowledge about data lines..:
* nFault is 0 if there is at least 1 byte in the Warp's FIFO
* pError is 1 if there are 16 bytes in the Warp's FIFO
*/
status = inb (STATUS (port));
while (!(status & 0x08) && (got < length)) {
if ((left >= 16) && (status & 0x20) && !(status & 0x08)) {
/* can grab 16 bytes from warp fifo */
if (!((long)buf & 0x03)) {
insl (EPPDATA (port), buf, 4);
} else {
insb (EPPDATA (port), buf, 16);
}
buf += 16;
got += 16;
left -= 16;
} else {
/* grab single byte from the warp fifo */
*((char *)buf)++ = inb (EPPDATA (port));
got++;
left--;
}
status = inb (STATUS (port));
if (status & 0x01) {
/* EPP timeout should never occur... */
printk (KERN_DEBUG "%s: EPP timeout occured while talking to "
"w91284pic (should not have done)\n", port->name);
clear_epp_timeout (port);
}
}
printk (KERN_DEBUG "parport_pc_epp_read_data return %d bytes\n",got);
return got;
}
if ((flags & PARPORT_EPP_FAST) && (length > 1)) {
if (!(((long)buf | length) & 0x03)) {
insl (EPPDATA (port), buf, (length >> 2));
} else {
insb (EPPDATA (port), buf, length);
}
if (inb (STATUS (port)) & 0x01) {
clear_epp_timeout (port);
return -EIO;
}
printk (KERN_DEBUG "parport_pc_epp_read_data return %d bytes\n",length);
return length;
}
for (; got < length; got++) {
*((char*)buf)++ = inb (EPPDATA(port));
if (inb (STATUS (port)) & 0x01) {
/* EPP timeout */
clear_epp_timeout (port);
printk (KERN_DEBUG "parport_pc_epp_read_data timeout\n");
break;
}
}
printk (KERN_DEBUG "parport_pc_epp_read_data return %d bytes\n",got);
return got;
}
Regards,
Stef
-- To unsubscribe, send mail to: linux-parport-request@torque.net --
-- with the single word "unsubscribe" in the body of the message. --
This archive was generated by hypermail 2b29 : Mon Oct 28 2002 - 02:12:40 EST