[1408] in linux-scsi channel archive
SCSI with Iomega ZIP driver
daemon@ATHENA.MIT.EDU (campbell@tirian.che.curtin.edu.au)
Mon Feb 10 16:52:37 1997
From: campbell@tirian.che.curtin.edu.au
To: linux-scsi@vger.rutgers.edu, linux-parport@torque.net
Date: Mon, 10 Feb 1997 07:39:31 +0000
I have two problems:
1) scsi_module.c does not release low level drivers (some
circumstances) with linux 2.0.17
2) modified ppa driver (Iomega ZIP drive) when using EPP uses
>50% CPU time when writing but <10% reading. Exactly same transfer
rate of approx 30 Mb/min.
Problem 1:
It has been noted that if a low level scsi module is loaded and fails
to detect the device (this happens when the cable on the ZIP drive is
not screwed down tight) the low level driver is not released thus
requiring a reboot. I have a patch for this but the question is this
a SCSI problem or should this be handled by the module group.
Problem 2:
To understand this problem a few details about EPP would not hurt.
EPP is the "Enhanced Parallel Port" protocol which is used by
external HDD, CDROMs and network adapters. When you write a byte to
the EPP port (located at <base>+4) the IO chipset HALTs the CPU and
performs the necessary handshaking (or timeouts if the device does
not respond in 10 microseconds).
The ppa driver during block reads till the device is read and then
reads the buffer in a burst. But during writes it is hypothesised
that the buffer is full and the device "goes slow" to allow the drive
to process the write requests. Unfortunately this slows down the
machine to a crawl during big transfers.
Question: Is there a way to determine if the drive buffer is empty?
David Campbell
PS: Here is the module patch
*** scsi_module.c.old Wed Jan 8 18:55:25 1997
--- scsi_module.c Wed Jan 8 19:03:18 1997
***************
*** 34,39 ****
--- 34,41 ----
int init_module(void) {
driver_template.usage_count = &mod_use_count_;
scsi_register_module(MODULE_SCSI_HA, &driver_template);
+ if (driver_template.present == 0)
+ scsi_unregister_module(MODULE_SCSI_HA, &driver_template);
return (driver_template.present == 0);
}