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 */