[comp.unix.xenix] Xenix device-drivers/DMA problem

motti@ocsmd.ocs.com (Motti Bazar) (03/20/89)

Hi there, its Motti again (with my driver problems again).
I'm still fighting with Xenix and developing a driver for our
CD-ROM controller.
The new problem I encountered is as follows:
First, the driver is called via the character interface (read) that
calls physio (that calls my strategy). The kernel somehow decides
to cut my request to multiple 1Kb and 3Kb requests to my strategy.
Does somebody know how to tell physio not to cut it ???
It looks like I can't (this is an answer from SCO).

Second and more problematic, I can leave with multiple calls (it will
be slower). Then What I'm doing is buffering things in a buffer that I
allocated in the driver. The problem is that when I go and call the DMA
setup routine (dma_param(....)) and then go to sleep (sleep(....)) I see
the operation (drive busy light goes on) but then I get a nice panic
message telling me about a parity error and the machine is dead with
the hard-disk busy light on forever. Somebody have any idea ?????

Its a real pain !!!!! its a lot more easier doing it under SunOS.
One of the big problems is that there is no demo source available
to show how you really develop a device driver under Xenix (yes its
easy to give a terminal driver or alike but what about real hardware
access with interrupts and DMA ?????).

It looks like that when I'll finish I'll publish an article or post at
least something how to do all of these things (It will have to be 
authorized by the comapany but I do not see problems).

I'll appreciate any help and let you know how it goes.
Thanks in advance ... Motti

davidsen@steinmetz.ge.com (Wm. E. Davidsen Jr) (03/25/89)

In article <649@ocsmd.ocs.com> motti@ocsmd.ocs.com (Motti Bazar) writes:

| Second and more problematic, I can leave with multiple calls (it will
| be slower). Then What I'm doing is buffering things in a buffer that I
| allocated in the driver. The problem is that when I go and call the DMA
| setup routine (dma_param(....)) and then go to sleep (sleep(....)) I see
| the operation (drive busy light goes on) but then I get a nice panic
| message telling me about a parity error and the machine is dead with
| the hard-disk busy light on forever. Somebody have any idea ?????

  I have seen this on a number of machines when I was evaluating 386's.
I'm sorry to say that it usually comes when the following occur:
	hard disk i/o
	DMA to floppy/tape/whatever
	CPU in 32 bit mode

  The last is important. IBM diagnostics and MS-DOS just don't cause the
problem. My *guess* is that the memory is on the ragged edge and loses a
refresh causing a parity error. My *experience* tells me that changing
the memory to faster memory (or just other memory) frequently helps,
slowing the CPU sometimes helps.

  I don't know what your machine is, but a lot of clones seem to be
running on the edge of memory spec for 32 bit. Dell redesigned their
motherboard between the 310 and 325 series, and replaced a MB for us,
due to just this type of problem. They admitted and fixed the problem, a
lot of vendors call it software because their diagnostics run just fine.
-- 
	bill davidsen		(wedu@crd.GE.COM)
  {uunet | philabs}!steinmetz!crdos1!davidsen
"Stupidity, like virtue, is its own reward" -me