home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!ferkel.ucsb.edu!taco!lll-winken!sol.ctr.columbia.edu!usc!sdd.hp.com!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)
- Newsgroups: comp.unix.bsd
- Subject: Re: SCSI driver bug when accessing DOS partition
- Message-ID: <8675IUH@minnie.zdv.uni-mainz.de>
- Date: 19 Aug 92 07:54:47 GMT
- References: <1992Aug19.020535.2080@noose.ecn.purdue.edu>
- Sender: grefen@wilbur (Stefan Grefen)
- Organization: Johannes Gutenberg Universitaet Mainz
- Lines: 149
- Nntp-Posting-Host: wilbur
-
- 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
-