[comp.os.minix] Copy of file ANDY

jnall%FSU.BITNET@cunyvm.cuny.edu (John Nall 904-644-5241) (12/24/88)

FROM:         ANDY TANENBAUM <ASTCS.VU.NL>
SUBJECT:      RE: INITIALIZATION IN FLOPPY.C (IBM/AT MINIX 1.3D)

IN ARTICLE <5994LOUIE.UDEL.EDU> JNALL%FSU.BITNETCUNYVM.CUNY.EDU (JOHN NALL
 904-644-5241) WRITES:
>WITHIN THE LAST FEW WEEKS (OR PERHAPS MONTHS) SOMEONE POSTED A MESSAGE
>WHICH STATED, ESSENTIALLY, THAT THE FLOPPY DISK DRIVER WAS NOT BEING
>INITIALIZED PROPERLY

I DON'T QUITE UNDERSTAND HOW THIS COULD HAPPEN.  THE BOOT BLOCK USES THE
BIOS TO READ IN THE OPERATING SYSTEM.  HAVING READ IN 100K + OF DATA, THE
BIOS HAS USED THE FLOPPY DISK CONTROLLER OVER AND OVER, AND IT CERTAINLY
IS INITIALIZED TO SOMETHING.  IF YOU USE A 360K DISKETTE FOR BOOTING AND
1.2M AFTER THAT, IT SHOULD STILL WORK BECAUSE FLOPPY.C DETECTS THE ERROR
AND TRIES OTHER DENSITIES.  COULD SOMEONE PLEASE EXPLAIN THE PROBLEM MORE
CLEARLY?

ANDY TANENBAUM (ASTCS.VU.NL)
--------------------------------------------------------------

ANDY:
     SORRY I DID NOT EXPLAIN THE PROBLEM MORE CLEARLY.  WHAT I DID WAS TO
EXPLAIN IT AS CLEARLY AS I COULD.  I DID GET HOLD OF THE POSTED FIXES (I
DID NOT KEEP THE CREDIT, ALAS!)  THE ARE SHOWN BELOW.  BEFORE APPLYING THESE
FIXES, MY 1.2M DRIVE ON MY CLONE AT WAS VIRTUALLY UNUSABLE.  NOW IT WORKS WITH
NO PROBLEM.  ALSO, BEFORE THE FIXES I WAS HAVING OCCASIONAL PROBLEMS WITH THE
1.2M DRIVE ON THE ZENITH Z-241 (EARLY MODEL OF AT-COMPATIBLE).  THE PROBLEM
WITH THE Z-241 WAS THAT IT WOULD CLAIM THAT THE DISKS HAD UNRECOVERABLE ERRORS.
THIS USUALLY OCCURED WHEN TRYING TO DO A MKFS ON A NEW DISK.

     SO THE FOLLOWING CODE REALLY DOES FIX A PROBLEM.  I AM TRYING TO KEEP A
STANDARD MINIX 1.3 SYSTEM, WHICH MEANS ONLY PUTTING IN CODE TO THE O/S THAT
HAS YOUR BLESSING.  HOWEVER, I STRONGLY RECOMMEND THAT YOU BLESS THIS CODE.

JOHN NALL

*** FLOPPY.C_ORIG       MON NOV 28 11:58:47 1988
--- FLOPPY.C    MON NOV 28 12:02:13 1988
***************
*** 234,239 ****
--- 234,240 ----
         * MEANS THAT WE ARE TRYING AT THE WRONG DENSITY.  TRY ANOTHER ONE.
         * INCREMENT 'ERRORS' HERE SINCE LOOP IS ABORTED ON ERROR.
         */
+       PORT_OUT(DMA_INIT, 6);  /* RESET THE DMA CONTROLLER */
        ERRORS++;               /* INCREMENT COUNT ONCE PER LOOP CYCLE */
        IF (ERRORS % (MAX_ERRORS/NT) == 0) [
                D = (D + 1) % NT;       /* TRY NEXT DENSITY */
***************
*** 311,316 ****
--- 312,318 ----
    IF (TOP_END != TOP_ADDR) PANIC("TRYING TO DMA ACROSS 64K BOUNDARY", TOP_ADDR

    /* NOW SET UP THE DMA REGISTERS. */
+   PORT_OUT(DMA_INIT, 6);        /* RESET THE DMA CONTROLLER */
    S = LOCK();
    PORT_OUT(DMA_M2, MODE);     /* SET THE DMA MODE */
    PORT_OUT(DMA_M1, MODE);     /* SET IT AGAIN */