Return to BSD News archive
Newsgroups: comp.unix.bsd Path: sserve!manuel!munnari.oz.au!mips!mips!darwin.sura.net!Sirius.dfn.de!math.fu-berlin.de!news.th-darmstadt.de!news.uni-mainz.de!wilbur!grefen From: grefen@wilbur.uni-mainz.de (Stefan Grefen) Subject: Re: SCSI driver bug when accessing DOS partition Message-ID: <8675IUH@minnie.zdv.uni-mainz.de> Sender: grefen@wilbur (Stefan Grefen) Nntp-Posting-Host: wilbur Organization: Johannes Gutenberg Universitaet Mainz References: <1992Aug19.020535.2080@noose.ecn.purdue.edu> Date: Wed, 19 Aug 1992 07:54:47 GMT Lines: 150 In article <1992Aug19.020535.2080@noose.ecn.purdue.edu>, tgt@neon.ecn.purdue.edu (Conan the Librarian) writes: |> I ran across the following Adaptec driver bug when attempting to configure |> mtools to read an 80 Mb DOS partition d:, which is on a SCSI disk. The |> problem: the SCSI driver routine asstart (in the file /sys/i386/isa/as.c) |> fails with the message "out of range, cannot happen?" (due to |> nscatter==NSCATTER, which means nothing to me!!). This subsequently |> causes the disk_read() routine of mtools (in the file buf_read()) to fail, |> printing the message "disk_read: read: Device not configured" |> [stuff deleted] |> Thanks very much. |> |> -tom I may have a patch for this I hacked as.c to do Scatter/Gather only if needed. Diffs to as.c follows (usual disclaimer...if it breaks you are lost). Hope this helps. Good Luck Stefan ----------------------------------------------------------------- *** as.c.org Thu Aug 6 05:23:58 1992 --- as.c Thu Aug 6 08:10:24 1992 *************** *** 782,788 **** { struct buf *bp; int blknum; ! unsigned int physaddr; struct ccb *ccb; unsigned char *cdb; int target; --- 782,788 ---- { struct buf *bp; int blknum; ! unsigned int physaddr,nphysaddr,ophysaddr; struct ccb *ccb; unsigned char *cdb; int target; *************** *** 790,796 **** int n; char *sp; int nscatter; ! int thistime; int nbytes; struct partition *part; int blkno; --- 790,796 ---- int n; char *sp; int nscatter; ! int thistime,thistotal; int nbytes; struct partition *part; int blkno; *************** *** 870,876 **** nblocks = 255; total = nblocks * bs; if(asverbose) ! printf("total %d nblocks %d ", total, nblocks); /*bp->b_bcount = total; /* XXX partial tape block read - wrong */ } else { #ifdef nomore --- 870,876 ---- nblocks = 255; total = nblocks * bs; if(asverbose) ! printf("total %d nblocks %d ", total, nblocks); /*bp->b_bcount = total; /* XXX partial tape block read - wrong */ } else { #ifdef nomore *************** *** 890,895 **** --- 890,897 ---- n = 0; sp = as->scatter_list; nscatter = 0; + ophysaddr=nphysaddr=vtophys (p); + thistotal=0; while (n < total && nscatter < NSCATTER) { thistime = page_size - ((vm_offset_t)p - trunc_page (p)); *************** *** 899,918 **** physaddr = vtophys (p); if (asverbose) ! printf ("%d bytes to %x (%x)\n", ! thistime, p, physaddr); ! sp[0] = thistime >> 16; ! sp[1] = thistime >> 8; ! sp[2] = thistime; ! sp[3] = physaddr >> 16; ! sp[4] = physaddr >> 8; ! sp[5] = physaddr; ! p += thistime; n += thistime; ! sp += 6; ! nscatter++; } if (nscatter == NSCATTER) { printf("out of range, cannot happen?"); --- 901,938 ---- physaddr = vtophys (p); if (asverbose) ! printf ("%d(%d) bytes to %x (%x,%x)\n", ! thistime,thistotal, p, physaddr,nphysaddr); ! if(physaddr!=nphysaddr) { ! sp[0] = thistotal >> 16; ! sp[1] = thistotal >> 8; ! sp[2] = thistotal; ! sp[3] = ophysaddr >> 16; ! sp[4] = ophysaddr >> 8; ! sp[5] = ophysaddr; ! ! thistotal=thistime; ! ophysaddr=physaddr; ! ! nscatter++; ! sp += 6; ! } else { ! thistotal+=thistime; ! } p += thistime; n += thistime; ! nphysaddr=physaddr+thistime; } + if(thistotal) { + sp[0] = thistotal >> 16; + sp[1] = thistotal >> 8; + sp[2] = thistotal; + sp[3] = ophysaddr >> 16; + sp[4] = ophysaddr >> 8; + sp[5] = ophysaddr; + nscatter++; + sp += 6; + } if (nscatter == NSCATTER) { printf("out of range, cannot happen?"); -- Stefan Grefen --- Johannes Gutenberg University Mainz --- Germany Email: grefen@goofy.zdv.uni-mainz.de --- Phone: 06131/392415