diff --git a/sys/scsi/cddefs.h b/sys/scsi/cddefs.h deleted file mode 100644 index 3095ddff4f27..000000000000 --- a/sys/scsi/cddefs.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * $Id: cddefs.h,v 1.4 1994/01/11 17:22:00 mycroft Exp $ - */ - -struct cd_data { - int flags; -#define CDVALID 0x02 /* PARAMS LOADED */ -#define CDINIT 0x04 /* device has been init'd */ -#define CDWAIT 0x08 /* device has someone waiting */ -#define CDHAVELABEL 0x10 /* have read the label */ - struct scsi_switch *sc_sw; /* address of scsi low level switch */ - int ctlr; /* so they know which one we want */ - int targ; /* our scsi target ID */ - int lu; /* out scsi lu */ - int cmdscount; /* cmds allowed outstanding by board*/ - struct cd_parms { - int blksize; - u_long disksize; /* total number sectors */ - } params; - struct disklabel disklabel; - int partflags[MAXPARTITIONS]; /* per partition flags */ -#define CDOPEN 0x01 - int openparts; /* one bit for each open partition */ -}; - -int cdattach(int, struct scsi_switch *, int, int *); -int cdopen(dev_t); -struct scsi_xfer * cd_get_xs(int, int); -void cd_free_xs(int, struct scsi_xfer *, int); -void cdminphys(struct buf *); -void cdstrategy(struct buf *); -void cdstart(int); -int cd_done(int, struct scsi_xfer *); -int cdioctl(dev_t, int, caddr_t, int); -int cdgetdisklabel(int); -int cd_size(int, int); -int cd_req_sense(int, int); -int cd_get_mode(int, struct cd_mode_data *, int); -int cd_set_mode(int, struct cd_mode_data *); -int cd_play(int, int, int); -int cd_play_big(int, int, int); -int cd_play_tracks(int, int, int, int, int); -int cd_pause(int, int); -int cd_reset(int); -int cd_start_unit(int, int, int); -int cd_prevent_unit(int, int, int); -int cd_read_subchannel(int, int, int, int, struct cd_sub_channel_info *, int); -int cd_read_toc(int, int, int, struct cd_toc_entry *, int); -int cd_get_parms(int, int); -int cdclose(dev_t); -int cd_scsi_cmd(int, struct scsi_generic *, int, u_char *, int, int, int); -int cd_interpret_sense(int, struct scsi_xfer *); -int cdsize(dev_t); -int show_mem(unsigned char *, int); diff --git a/sys/scsi/dmabouncebufs b/sys/scsi/dmabouncebufs deleted file mode 100644 index 736887a30d50..000000000000 --- a/sys/scsi/dmabouncebufs +++ /dev/null @@ -1,1008 +0,0 @@ -From agora.rain.com!rgrimes Sat Apr 24 09:38:42 1993 -Received: from agora.rain.com by jules.DIALix.oz.au with UUCP (5.67/25-eef) - id AA00109; Sat, 24 Apr 93 09:29:06 +0800 -Received: from uniwa.uwa.edu.au by perth.dialix.oz.au with SMTP id AA28179 - (5.67a/IDA-1.5 for ); Sat, 24 Apr 1993 09:04:48 +0800 -Received: from agora.rain.com by uniwa.uwa.edu.au with SMTP (5.65c) - id AA23685; Sat, 24 Apr 1993 09:04:26 +0800 -Received: by agora.rain.com (Smail3.1.26.7 #19) - id m0nmYf0-0001bcC; Fri, 23 Apr 93 18:04 PDT -Message-Id: -From: rgrimes@agora.rain.com (Rodney Grimes) -Subject: >16MB ram experimental patch (fwd) -To: julian@jules.dialix.oz.au (Julian Elischer) -Date: Fri, 23 Apr 93 18:04:06 PDT -X-Mailer: ELM [version 2.4beta PL3] -Mime-Version: 1.0 -Content-Type: text/plain; charset=US-ASCII -Content-Length: 27406 -Status: OR - -Julian, -This has been filed in the bugfiler for processing. I am forwarding it -to you for approval. If you approve this I will add it to the patch kit -licity split. If the person is way off base on these changes, or you would -like to clean them up that is fine, just let me know. - -This problem does effect a lot of people (me real soon, as I just came accross -some money and will be going from 16MB to 32MB) - -Forwarded message: -From bsd.coe.montana.edu!owner-bugs Fri Apr 23 15:58:05 1993 -Resent-Date: Sat, 24 Apr 1993 00:55:51 +0200 -Resent-From: -Resent-Message-Id: <9304232257.AA13748@bsd.coe.montana.edu> -Subject: >16MB ram experimental patch -To: 386bsd_bugs@bsd.coe.montana.edu -Resent-To: rgrimes@bsd.coe.montana.edu -Date: Sat, 24 Apr 1993 00:55:51 +0200 -From: Arne Juul -Message-Id: <199304232255.AA00913@skarven.dsl.unit.no> - -Index: sys.386bsd 386BSD-0.1.2.3 -Reference: 386BSD-0.1.2.3/sys.386bsd/2 - -Description: - Disk transfers scribble random things about when you have - more than 16 MB ram -Repeat-By: - Install more than 16MB ram in your 386bsd machine -Fix: - - We have an Everex 486/33 box with ISA bus, Adaptec SCSI card, -and 32MB ram. As most people should be aware of by now, 386bsd -currently does not avoid doing DMA to memory outside the 16MB -boundary. This causes great frustration for everybody with more -than 16MB. Earlier we just patches machdep.c to turn off using -those extra 16MB (too lazy to pick them physically out of the -machine :-). - But the local high guru (tegge@pvv.unitno) has made the following -patches for using bounce-buffers in a couple of night's programming. -This currently works great on our machine, but may have unfortunate -side-effects that we are not aware of. - I hope both the NetBSD people and the patch-kit maintainers will -test this out and try to get it into the patch-kit (it's an option -after all), so people will be able to use their full memory. Feel -free to mail me about it, and I will answer questions as good as -I can. - These patches are against the 0.1 + patchkit 0.2.3, and should -fix both the as driver and Julian's drivers. It also has some extra -debugging stuff (TRYGETSETUP, TRYTARGET) which may or may not be -interesting. Hopefully it will also be applyable on NetBSD as-is. - - If you test this, especially with >16MB ram: -* remember to backup your system first. We crashed (totally!) our - root partition during the development of this. You were forewarned! -* apply patches, add 'option HUGEMEM' to your configuration file, - reconfigure and remake the kernel. - -Happy hacking, - - Arne H. Juul (arnej@lise.unit.no) - - -* EXPERIMENTAL PATCH * EXPERIMENTAL PATCH * EXPERIMENTAL PATCH * - -*** /usr/src/sys.386bsd/i386/isa/aha1542.c.orig Sun Apr 4 09:39:16 1993 ---- /usr/src/sys.386bsd/i386/isa/aha1542.c Mon Apr 5 05:21:11 1993 -*************** -*** 78,84 **** - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -! - #include - #include - ---- 78,85 ---- - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -! #undef TRYGETSETUP -! #undef TRYTARGET - #include - #include - -*************** -*** 128,133 **** ---- 129,143 ---- - #endif __386BSD__ - extern int delaycount; /* from clock setup code */ - -+ #ifdef HUGEMEM -+ #include "malloc.h" -+ struct bouncebuf *freebouncebufs; -+ int hugememflag=0; -+ #define NUM_BOUNCEBUFS 100 /* Should be moved to a header file */ -+ #define MAXDMAADDR 0x1000000 /* Ditto ? */ -+ #endif -+ -+ - /************************** board definitions *******************************/ - /* - * I/O Port Interface -*************** -*** 626,631 **** ---- 636,671 ---- - dev->dev_addr, dev->dev_spl); - #endif __386BSD__ - ahaunit ++; -+ #ifdef HUGEMEM -+ { -+ /* Allocate bounce buffers before all ISA memory is used. */ -+ char *bufs; -+ int i; -+ -+ if (hugememflag) -+ panic("Repeated ahaprobe"); -+ hugememflag=1; -+ bufs=malloc((NUM_BOUNCEBUFS+1)*page_size,M_DEVBUF,M_NOWAIT); -+ bufs = (char *) trunc_page(bufs+page_size); -+ freebouncebufs=malloc(NUM_BOUNCEBUFS*sizeof(struct bouncebuf), -+ M_DEVBUF,M_NOWAIT); -+ if (bufs && freebouncebufs) -+ { -+ for (i=0;iMAXDMAADDR) -+ panic("asprobe: bouncebuf> MAXDMAADDR"); -+ freebouncebufs[i].next= -+ (i < NUM_BOUNCEBUFS-1) ? &freebouncebufs[i+1] : NULL ; -+ bufs+=page_size; -+ } -+ } -+ else -+ freebouncebufs=NULL; -+ } -+ #endif - return(1); - } - -*************** -*** 651,656 **** ---- 691,715 ---- - { - aha_timeout(0); - } -+ #ifdef TRYGETSETUP -+ { -+ int i; -+ static struct aha_setup setup; -+ bzero(&setup,sizeof(setup)); -+ aha_cmd(unit, 1, sizeof(setup), 0,&setup, AHA_SETUP_GET, -+ sizeof(setup)); -+ printf("ahasetup: sync_neg=%d, parity=%d, speed=0x%x\n", -+ setup.sync_neg,setup.parity,setup.speed); -+ printf("ahasetup: bus_on=%d, bus_off=%d, num_mbx=%d\n", -+ setup.bus_on,setup.bus_off,setup.num_mbx); -+ printf("ahasetup: mbx=0x%x\n",(setup.mbx[0] << 16) | -+ (setup.mbx[1] << 8 ) | setup.mbx[2] ); -+ for (i=0;i<8;i++) -+ printf("ahasetup: sync[%d]: offset=%d, period=%d, valid=%d\n",i, -+ setup.sync[i].offset,setup.sync[i].period, -+ setup.sync[i].valid); -+ } -+ #endif - #ifdef __386BSD__ - printf("aha%d",unit); - #endif __386BSD__ -*************** -*** 911,916 **** ---- 970,976 ---- - unsigned char ad[3]; - volatile int i,sts; - struct aha_config conf; -+ - - /***********************************************\ - * reset board, If it doesn't respond, assume * -*************** -*** 1018,1023 **** ---- 1078,1086 ---- - } - - -+ #ifdef TRYTARGET -+ aha_cmd(unit,8, 0, 0, 0, AHA_TARGET_EN,0,0,0,0,0,0,0,0); -+ #endif - /***********************************************\ - * Initialize mail box * - \***********************************************/ -*************** -*** 1172,1177 **** ---- 1235,1244 ---- - * Set up the scatter gather block * - \***********************************************/ - -+ #ifdef HUGEMEM -+ struct bouncebuf *bounced=NULL,*head; -+ int s; -+ #endif - if(scsi_debug & SHOWSCATGATH) - printf("%d @0x%x:- ",xs->datalen,xs->data); - datalen = xs->datalen; -*************** -*** 1182,1188 **** - { - bytes_this_seg = 0; - -! /* put in the base address */ - lto3b(thisphys,&(sg->seg_addr)); - - if(scsi_debug & SHOWSCATGATH) ---- 1249,1293 ---- - { - bytes_this_seg = 0; - -! #ifdef HUGEMEM -! if (thisphys>=MAXDMAADDR) /* If already bounced --> won't hit this code */ -! { -! /* Copy down to DMA-able ram */ -! -! s=splbio(); -! bounced=freebouncebufs; -! if (bounced) -! { -! freebouncebufs=bounced->next; -! splx(s); -! bounced->next=xs->bouncebufs; -! xs->bouncebufs=bounced; -! /* Keep offset on page */ -! thisphys= bounced->physaddr -! +( thisphys & (PAGESIZ-1)); -! bounced->length=0; -! } -! else -! { -! xs->error = XS_DRIVER_STUFFUP; -! printf("aha_scsi_cmd%d: out of bouncebufs\n", -! unit); -! head=xs->bouncebufs; -! xs->bouncebufs=NULL; -! while (head) -! { -! bounced=head; -! head=bounced->next; -! bounced->next=freebouncebufs; -! freebouncebufs=bounced; -! } -! splx(s); -! aha_free_ccb(unit,ccb,flags); -! return(HAD_ERROR); -! } -! } -! #endif -! /* put in the base address */ - lto3b(thisphys,&(sg->seg_addr)); - - if(scsi_debug & SHOWSCATGATH) -*************** -*** 1204,1209 **** ---- 1309,1328 ---- - /**** or the data ****/ - bytes_this_page = min(bytes_this_page - ,datalen); -+ #ifdef HUGEMEM -+ if (bounced) -+ { -+ bounced->vaddr=bounced->s_vaddr + -+ (thisphys & (PAGESIZ-1)); -+ if (!xs->bp || -+ !(xs->bp->b_flags & B_READ)) -+ bcopy(thiskv,bounced->vaddr, -+ bytes_this_page); -+ bounced->length=bytes_this_page; -+ bounced->wanted=thiskv; -+ bounced=NULL; -+ } -+ #endif - bytes_this_seg += bytes_this_page; - datalen -= bytes_this_page; - -*************** -*** 1212,1217 **** ---- 1331,1374 ---- - + PAGESIZ; - if(datalen) - thisphys = KVTOPHYS(thiskv); -+ #ifdef HUGEMEM -+ if (datalen && thisphys>=MAXDMAADDR) -+ { -+ /* Copy down to DMA-able ram */ -+ -+ s=splbio(); -+ bounced=freebouncebufs; -+ if (bounced) -+ { -+ freebouncebufs=bounced->next; -+ splx(s); -+ bounced->next=xs->bouncebufs; -+ xs->bouncebufs=bounced; -+ /* Keep offset on page */ -+ thisphys= bounced->physaddr -+ +( thisphys & (PAGESIZ-1)); -+ bounced->length=0; -+ } -+ else -+ { -+ xs->error = XS_DRIVER_STUFFUP; -+ printf("aha_scsi_cmd%d: out of bouncebufs\n", -+ unit,AHA_NSEG); -+ head=xs->bouncebufs; -+ xs->bouncebufs=NULL; -+ while (head) -+ { -+ bounced=head; -+ head=bounced->next; -+ bounced->next=freebouncebufs; -+ freebouncebufs=bounced; -+ } -+ splx(s); -+ aha_free_ccb(unit,ccb,flags); -+ return(HAD_ERROR); -+ } -+ } -+ #endif - } - /***************************************\ - * next page isn't contiguous, finish the seg* -*** /usr/src/sys.386bsd/i386/isa/as.c.orig Sun Apr 4 09:36:23 1993 ---- /usr/src/sys.386bsd/i386/isa/as.c Mon Apr 5 05:21:12 1993 -*************** -*** 63,68 **** ---- 63,99 ---- - * 27 Feb 93 James da Silva Tapedrive fixes. - */ - -+ /* -+ HUGEMEM Fix (>16M ram). Tries to implement the first of the -+ alternatives listed below. -+ -+ Some alternatives for handling of addresses outside DMA range: -+ -+ - Do all the handling at splbio() level. Allocate bounce buffers -+ in asstart(). Performance problem due bcopy delaying the next disk IO ? -+ -+ - Do first part of handling in asstrategy() before disksort. -+ May cause use of MANY bounce buffers. (Or when running out of -+ them: cause less efficiency from the disksort(). -+ -+ - Do a variant of double buffering. Use an alternative disksort() -+ which handles TWO active entries. (The second entry is active -+ in the sense that it has allocated bounce buffers). Let asstrategy() -+ allocate bounce buffers if its the first or second on the list. -+ Add a mechanism for 'lazy' allocation of bounce buffers when -+ removing the first entry from the active list. (Use spl0 from -+ inside an interrupt handler, or modify the exit part of the -+ assembly part of the interrupt handler, to get an 'at interrupt leave' -+ callback). -+ A lot of rewriting to be done. -+ -+ Some unknowns: -+ -+ - How costly is a 4K bcopy starting on a page boundary ? -+ - How costly are spl0(), splx() and splbio() ? -+ -+ */ -+ - #include "as.h" - #if NAS > 0 - -*************** -*** 81,86 **** ---- 112,118 ---- - #include "syslog.h" - #include "vm/vm.h" - #include "kernel.h" -+ #include - - #include "asreg.h" - -*************** -*** 101,106 **** ---- 133,141 ---- - /* maximum scatter list size for Adaptech controller */ - #define NSCATTER 17 - -+ #define NUM_BOUNCEBUFS 100 /* Should be moved to a header file */ -+ #define MAXDMAADDR 0x1000000 /* Ditto ? */ -+ - /* this array must reside in contiguous physical memory */ - struct asinfo { - dev_t dev; -*************** -*** 138,146 **** ---- 173,197 ---- - int retry_count; - int start_time; - int restart_pending; -+ #ifdef HUGEMEM -+ struct bouncebuf *bouncebufs; -+ #endif - - } asinfo[NTARGETS] = {0}; - -+ -+ #ifdef HUGEMEM -+ struct bouncebuf -+ { -+ struct bouncebuf *next; /* freelist or chain on same request */ -+ caddr_t physaddr; /* a 4K buffer in phys. memory */ -+ caddr_t vaddr; -+ caddr_t wanted; -+ int wantedsize; -+ } *freebouncebufs; -+ int hugememflag=0; -+ #endif -+ - #define dev_part(dev) (minor (dev) & 7) - #define dev_target(dev) ((minor (dev) >> 3) & 7) - #define dev_rewind(dev) ((minor (dev) & 1) == 0) -*************** -*** 169,175 **** - val = inb (as_port + AS_STATUS); - - if (val == (AS_STATUS_INIT | AS_STATUS_IDLE)) -! return (1); - as_port = 0; - return (0); - } ---- 220,257 ---- - val = inb (as_port + AS_STATUS); - - if (val == (AS_STATUS_INIT | AS_STATUS_IDLE)) -! { -! #ifdef HUGEMEM -! /* Allocate bounce buffers before all ISA memory is used. */ -! char *bufs; -! int i; -! -! if (hugememflag) -! panic("Repeated asprobe"); -! hugememflag=1; -! bufs=malloc((NUM_BOUNCEBUFS+1)*page_size,M_DEVBUF,M_NOWAIT); -! bufs = (char *) trunc_page(bufs+page_size); -! freebouncebufs=malloc(NUM_BOUNCEBUFS*sizeof(struct bouncebuf), -! M_DEVBUF,M_NOWAIT); -! if (bufs && freebouncebufs) -! { -! for (i=0;iMAXDMAADDR) -! panic("asprobe: bouncebuf> MAXDMAADDR"); -! freebouncebufs[i].next= -! (i < NUM_BOUNCEBUFS-1) ? &freebouncebufs[i+1] : NULL ; -! bufs+=page_size; -! } -! } -! else -! freebouncebufs=NULL; -! #endif -! -! return(1); -! } - as_port = 0; - return (0); - } -*************** -*** 192,198 **** - - s = splbio (); - if (as_put_byte (AS_CMD_MAILBOX_INIT) < 0 -! || as_put_byte (NTARGETS) < 0 - || as_put_byte (physaddr >> 16) < 0 - || as_put_byte (physaddr >> 8) < 0 - || as_put_byte (physaddr) < 0) { ---- 274,280 ---- - - s = splbio (); - if (as_put_byte (AS_CMD_MAILBOX_INIT) < 0 -! || as_put_byte (NTARGETS) < 0 /* Differs by factor 2 from aha1542.c */ - || as_put_byte (physaddr >> 16) < 0 - || as_put_byte (physaddr >> 8) < 0 - || as_put_byte (physaddr) < 0) { -*************** -*** 737,746 **** - - if (asverbose) - printf ("asstrategy %d %d ", bp->b_blkno, bp->b_bcount); -- s = splbio (); - - as = &asinfo[dev_target (bp->b_dev)]; - - if (as->tape) { - bp->av_forw = NULL; - if (as->requests.b_actf) ---- 819,834 ---- - - if (asverbose) - printf ("asstrategy %d %d ", bp->b_blkno, bp->b_bcount); - - as = &asinfo[dev_target (bp->b_dev)]; -+ -+ /* Moved up to avoid splstuff needlessly */ -+ if (!as->tape && bp != as->scsi_bp -+ && as->have_label == 0 -+ && dev_part (bp->b_dev) != 3) -+ goto bad; - -+ s = splbio (); - if (as->tape) { - bp->av_forw = NULL; - if (as->requests.b_actf) -*************** -*** 749,759 **** - as->requests.b_actf = bp; - as->requests.b_actl = bp; - } else { -- if (bp != as->scsi_bp -- && as->have_label == 0 -- && dev_part (bp->b_dev) != 3) -- goto bad; -- - bp->b_cylin = bp->b_blkno; - disksort (&as->requests, bp); - } ---- 837,842 ---- -*************** -*** 776,781 **** ---- 859,879 ---- - s = splbio (); - as->restart_pending = 0; - as->retry_count++; -+ #ifdef HUGEMEM -+ { -+ /* free bounce buffers. (something has gone wrong) */ -+ struct bouncebuf *tmp,*head; -+ head=as->bouncebufs; -+ as->bouncebufs=NULL; -+ while (head) -+ { -+ tmp=head; -+ head=tmp->next; -+ tmp->next=freebouncebufs; -+ freebouncebufs=tmp; -+ } -+ } -+ #endif - asstart (as); - splx (s); - } -*************** -*** 909,914 **** ---- 1007,1040 ---- - sp[0] = thistime >> 16; - sp[1] = thistime >> 8; - sp[2] = thistime; -+ #ifdef HUGEMEM -+ if (physaddr+thistime > MAXDMAADDR) -+ { -+ struct bouncebuf *tmp; -+ tmp=freebouncebufs; -+ if (tmp) -+ { -+ /* splbio() stuff ==> asintr is no problem here */ -+ freebouncebufs=freebouncebufs->next; -+ tmp->next=as->bouncebufs; -+ as->bouncebufs=tmp; -+ -+ physaddr = tmp->physaddr; -+ tmp->wanted=p; -+ tmp->wantedsize=thistime; -+ /* Ugly. bcopy may take some time. blocks BIO :-( */ -+ if (!(bp->b_flags & B_READ)) -+ bcopy(p,tmp->vaddr,thistime); -+ } -+ else -+ { -+ /* Too few allocated bounce buffers :-( */ -+ printf("need more bounce buffers, cannot happen?"); -+ bp->b_error = ENXIO; -+ goto bad; -+ } -+ } -+ #endif - sp[3] = physaddr >> 16; - sp[4] = physaddr >> 8; - sp[5] = physaddr; -*************** -*** 940,945 **** ---- 1066,1072 ---- - ccb->ccb_addr_and_control |= (bp->b_flags & B_READ) ? 8 : 0x10; - else - ccb->ccb_addr_and_control |= 0x18; -+ /* Note: unit number is in the 3 LSB of ccb_addr_and_control */ - - nbytes = nscatter * 6; - ccb->ccb_data_len_msb = nbytes >> 16; -*************** -*** 1037,1042 **** ---- 1164,1183 ---- - - as->active = 0; - bp = as->requests.b_actf; -+ #ifdef HUGEMEM -+ { -+ /* free bounce buffers. (something has gone wrong) */ -+ struct bouncebuf *tmp,*head=as->bouncebufs; -+ as->bouncebufs=NULL; -+ while (head) -+ { -+ tmp=head; -+ head=tmp->next; -+ tmp->next=freebouncebufs; -+ freebouncebufs=tmp; -+ } -+ } -+ #endif - if (bp) { - bp->b_flags |= B_ERROR; - asdone (as, 1); -*************** -*** 1260,1272 **** - int restart; - { - struct buf *bp; - - bp = as->requests.b_actf; - as->requests.b_actf = bp->av_forw; -! biodone (bp); -! as->retry_count = 0; - if (restart && as->requests.b_actf) - asstart (as); - } - - int ---- 1401,1444 ---- - int restart; - { - struct buf *bp; -+ #ifdef HUGEMEM -+ struct bouncebuf *tmp,*head; -+ int s; -+ -+ head = as->bouncebufs; -+ as->bouncebufs=NULL; -+ #endif - - bp = as->requests.b_actf; - as->requests.b_actf = bp->av_forw; -! as->retry_count = 0; -! /* side effect: done handling cannot get retry cnt. bad ?? */ - if (restart && as->requests.b_actf) - asstart (as); -+ #ifdef HUGEMEM -+ /* free bounce buffers. */ -+ /* s=spl0(); */ -+ while (head) -+ { -+ tmp=head; -+ head=tmp->next; -+ -+ /* Copy up from bounce buffer if read. Blocks BIO :-( */ -+ if ((bp->b_flags & (B_READ|B_ERROR))==B_READ) -+ bcopy(tmp->vaddr,tmp->wanted,tmp->wantedsize); -+ -+ /* splx(s); */ -+ tmp->next=freebouncebufs; -+ freebouncebufs=tmp; -+ /* spl0(); */ -+ } -+ /* splx(s); */ -+ /* -+ * Should prepare new bounce buffers for next request here -+ * - not implemented -+ */ -+ #endif -+ biodone (bp); - } - - int -*** /usr/src/sys.386bsd/scsi/scsiconf.h.orig Sun Apr 4 09:39:40 1993 ---- /usr/src/sys.386bsd/scsi/scsiconf.h Mon Apr 5 05:21:13 1993 -*************** -*** 85,91 **** ---- 85,107 ---- - int error; - struct buf *bp; - struct scsi_sense_data sense; -+ #ifdef HUGEMEM -+ struct bouncebuf *bouncebufs; -+ #endif - }; -+ -+ #ifdef HUGEMEM -+ struct bouncebuf -+ { -+ struct bouncebuf *next; /* freelist or chain on same request */ -+ int physaddr; /* a 4K buffer in phys. memory */ -+ caddr_t vaddr; /* aligned with same offset on page as 'wanted' */ -+ caddr_t s_vaddr; /* aligned on page boundary */ -+ caddr_t wanted; -+ int length; -+ }; -+ #endif -+ - /********************************/ - /* Flag values */ - /********************************/ -*** /usr/src/sys.386bsd/scsi/sd.c.orig Sun Apr 4 09:39:42 1993 ---- /usr/src/sys.386bsd/scsi/sd.c Mon Apr 5 05:21:14 1993 -*************** -*** 46,53 **** - #include - - long int sdstrats,sdqueues; - -- - #include - #if NDDB > 0 - int Debugger(); ---- 46,55 ---- - #include - - long int sdstrats,sdqueues; -+ #ifdef HUGEMEM -+ extern struct bouncebuf *freebouncebufs; -+ #endif - - #include - #if NDDB > 0 - int Debugger(); -*************** -*** 345,350 **** ---- 347,357 ---- - splx(s); - xs->flags = 0; - } -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ panic("sd_get_xs: bouncebufs!=NULL"); -+ -+ #endif - return(xs); - } - -*************** -*** 358,363 **** ---- 365,374 ---- - { - int s; - -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ panic("sd_free_xs: bouncebufs!=NULL"); -+ #endif - if(flags & SCSI_NOMASK) - { - if (sd_xfer_block_wait[unit]) -*************** -*** 611,616 **** ---- 622,662 ---- - sdqueues++; - } - -+ #ifdef HUGEMEM -+ /*******************************************************\ -+ * Frees bouncebuffers. -+ * -+ \*******************************************************/ -+ -+ int scsi_free_bouncebufs(xs,head,docopy) -+ struct scsi_xfer *xs; -+ struct bouncebuf *head; -+ int docopy; -+ { -+ struct bouncebuf *tmp; -+ int s; -+ if (xs) -+ xs->bouncebufs=NULL; -+ if (docopy) -+ for (tmp=head;tmp;tmp=tmp->next) -+ { -+ if (!tmp->length) -+ panic("scsi_free_bouncebufs: length==0"); -+ else -+ bcopy(tmp->vaddr,tmp->wanted,tmp->length); -+ } -+ s=splbio(); -+ while (head) -+ { -+ tmp=head; -+ head=head->next; -+ tmp->next=freebouncebufs; -+ freebouncebufs=tmp; -+ } -+ splx(s); -+ } -+ #endif -+ - /*******************************************************\ - * This routine is called by the scsi interrupt when * - * the transfer is complete. -*************** -*** 657,662 **** ---- 703,712 ---- - { - xs->error = XS_NOERROR; - xs->flags &= ~ITSDONE; -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ scsi_free_bouncebufs(xs,xs->bouncebufs,0); -+ #endif - if ( (*(sd_data[unit].sc_sw->scsi_cmd))(xs) - == SUCCESSFULLY_QUEUED) - { /* don't wake the job, ok? */ -*************** -*** 673,681 **** ---- 723,748 ---- - printf("sd%d: unknown error category from scsi driver\n" - ,unit); - } -+ #ifdef HUGEMEM -+ { -+ struct bouncebuf *head; -+ -+ head=xs->bouncebufs; -+ xs->bouncebufs=NULL; -+ -+ sd_free_xs(unit,xs,0); -+ sdstart(unit); /* If there's anything waiting.. do it */ -+ if (head) -+ scsi_free_bouncebufs(NULL,head, -+ (bp->b_flags & -+ (B_READ|B_ERROR))==B_READ); -+ biodone(bp); -+ } -+ #else - biodone(bp); - sd_free_xs(unit,xs,0); - sdstart(unit); /* If there's anything waiting.. do it */ -+ #endif - } - else /* special has finished */ - { -*************** -*** 1168,1173 **** ---- 1235,1245 ---- - xs->done_arg2 = (int)xs; - retry: xs->error = XS_NOERROR; - xs->bp = 0; -+ #ifdef HUGEMEM -+ /* Clean away bouncebufs */ -+ if (xs->bouncebufs) -+ scsi_free_bouncebufs(xs,xs->bouncebufs,0); -+ #endif - retval = (*(sd->sc_sw->scsi_cmd))(xs); - switch(retval) - { -*************** -*** 1226,1233 **** ---- 1298,1319 ---- - default: - retval = EIO; - } -+ #ifdef HUGEMEM -+ { -+ struct bouncebuf *head; -+ -+ head=xs->bouncebufs; -+ xs->bouncebufs=NULL; -+ -+ sd_free_xs(unit,xs,flags); -+ sdstart(unit); /* check if anything is waiting fr the xs */ -+ if (head) -+ scsi_free_bouncebufs(NULL,head,retval==ESUCCESS); -+ } -+ #else - sd_free_xs(unit,xs,flags); - sdstart(unit); /* check if anything is waiting fr the xs */ -+ #endif - } - else - { -*** /usr/src/sys.386bsd/scsi/st.c.orig Sun Apr 4 09:39:44 1993 ---- /usr/src/sys.386bsd/scsi/st.c Mon Apr 5 05:21:16 1993 -*************** -*** 850,855 **** ---- 850,859 ---- - { - xs->flags &= ~ITSDONE; - xs->error = XS_NOERROR; -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ scsi_free_bouncebufs(xs,xs->bouncebufs,0); -+ #endif - if ( (*(st_data[unit].sc_sw->scsi_cmd))(xs) - == SUCCESSFULLY_QUEUED) - { /* don't wake the job, ok? */ -*************** -*** 868,875 **** ---- 872,887 ---- - ,unit); - } - biodone(bp); -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ scsi_free_bouncebufs(xs,xs->bouncebufs, -+ (bp->b_flags & -+ (B_READ|B_ERROR))==B_READ); -+ -+ #endif - xs->flags = 0; /* no longer in use */ - ststart(unit); /* If there's another waiting.. do it */ -+ #endif - } - else - { -*************** -*** 1380,1385 **** ---- 1392,1401 ---- - xs->flags = INUSE; - if(!(flags & SCSI_NOMASK)) - splx(s); -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ panic("st_scsi_cmd: bouncebufs!=NULL"); -+ #endif - - /*******************************************************\ - * Fill out the scsi_xfer structure * -*************** -*** 1402,1407 **** ---- 1418,1427 ---- - xs->done_arg2 = (int)xs; - retry: xs->error = XS_NOERROR; - xs->bp = 0; -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ scsi_free_bouncebufs(xs,xs->bouncebufs,0); -+ #endif - retval = (*(st->sc_sw->scsi_cmd))(xs); - switch(retval) - { -*************** -*** 1469,1476 **** ---- 1489,1501 ---- - default: - retval = EIO; - } -+ #ifdef HUGEMEM -+ if (xs->bouncebufs) -+ scsi_free_bouncebufs(xs,xs->bouncebufs,retval==ESUCCESS); -+ #else - xs->flags = 0; /* it's free! */ - ststart(unit); -+ #endif - } - else - { -diff -c /usr/src/sys.386bsd/vm/vm_map.h.buggy /usr/src/sys.386bsd/vm/vm_map.h -*** /usr/src/sys.386bsd/vm/vm_map.h.buggy Tue Feb 16 00:29:04 1993 ---- /usr/src/sys.386bsd/vm/vm_map.h Thu Feb 18 23:26:52 1993 -*************** -*** 210,216 **** ---- 210,220 ---- - #ifdef OMIT - #define MAX_KMAPENT 500 - #else /* !OMIT*/ -+ #ifdef HUGEMEM -+ #define MAX_KMAPENT 2048 -+ #else - #define MAX_KMAPENT 1000 /* 15 Aug 92*/ -+ #endif - #endif /* !OMIT*/ - - #endif _VM_MAP_ - - - --- -Rod Grimes rgrimes@agora.rain.com -386BSD patchkit coordinator Wish it paid real money! -Accurate Automation Company All opinions belong to me and my company! - diff --git a/sys/scsi/sddefs.h b/sys/scsi/sddefs.h deleted file mode 100644 index 411a677b2feb..000000000000 --- a/sys/scsi/sddefs.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * $Id: sddefs.h,v 1.5 1994/01/11 17:22:04 mycroft Exp $ - */ - -struct sd_data { - int flags; -#define SDVALID 0x02 /* PARAMS LOADED */ -#define SDINIT 0x04 /* device has been init'd */ -#define SDWAIT 0x08 /* device has someone waiting */ -#define SDHAVELABEL 0x10 /* have read the label */ -#define SDDOSPART 0x20 /* Have read host-dependent partition table */ -#define SDWRITEPROT 0x40 /* Device in readonly mode (S/W)*/ - struct scsi_switch *sc_sw; /* address of scsi low level switch */ - struct scsi_xfer *freexfer; /* chain of free ones */ - struct buf sdbuf; - int formatting; /* format lock */ - int ctlr; /* so they know which one we want */ - int targ; /* our scsi target ID */ - int lu; /* out scsi lu */ - long int ad_info; /* info about the adapter */ - int cmdscount; /* cmds allowed outstanding by board*/ - int wlabel; /* label is writable */ - struct disk_parms { - u_char heads; /* Number of heads */ - u_short cyls; /* Number of cylinders */ - u_char sectors; /* Number of sectors/track */ - u_short secsiz; /* Number of bytes/sector */ - u_long disksize; /* total number sectors */ - } params; - unsigned int sd_start_of_unix; /* unix vs host-dependent partitions */ - struct disklabel disklabel; - struct cpu_disklabel cpudisklabel; - int partflags[MAXPARTITIONS]; /* per partition flags */ -#define SDOPEN 0x01 - int openparts; /* one bit for each open partition */ - int blockwait; -}; - -int sdattach(int, struct scsi_switch *, int, int *); -int sdopen(int); -struct scsi_xfer *sd_get_xs(int, int); -void sd_free_xs(int, struct scsi_xfer *, int); -void sdminphys(struct buf *); -void sdstrategy(struct buf *); -void sdstart(int); -int sd_done(int, struct scsi_xfer *); -int sdioctl(dev_t, int, caddr_t, int); -int sdgetdisklabel(u_char); -int sd_size(int, int); -int sd_test_unit_ready(int, int); -void sd_dump(); -int sdsize(dev_t); -int sd_interpret_sense(int, struct scsi_xfer *); -int sd_scsi_cmd(int, struct scsi_generic *, int, u_char *, int, int, int); -int sd_close(dev_t); -int sd_get_parms(int, int); -int sd_reassign_blocks(int, int); -int sd_start_unit(int, int); -int sd_prevent(int, int, int); diff --git a/sys/scsi/stdefs.h b/sys/scsi/stdefs.h deleted file mode 100644 index 2fcbf3dd6043..000000000000 --- a/sys/scsi/stdefs.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * $Id: stdefs.h,v 1.4 1994/01/11 17:22:08 mycroft Exp $ - */ - -#define STQSIZE 4 -struct st_data { - struct scsi_switch *sc_sw; /* address of scsi low level switch */ - int flags; - int ctlr; /* so they know which one we want */ - int targ; /* our scsi target ID */ - int lu; /* our scsi lu */ - int blkmin; /* min blk size */ - int blkmax; /* max blk size */ - int numblks; /* nominal blocks capacity */ - int blksiz; /* nominal block size */ - int info_valid; /* the info about the device is valid */ - int initialized; - struct buf buf[STQSIZE]; /* buffer for raw io (one per device) */ - struct buf buf_queue; - struct scsi_xfer scsi_xfer; - int blockwait; -}; -#define ST_OPEN 0x01 -#define ST_NOREWIND 0x02 -#define ST_WRITTEN 0x04 -#define ST_FIXEDBLOCKS 0x10 -#define ST_AT_FILEMARK 0x20 -#define ST_AT_EOM 0x40 - -#define ST_PER_ACTION (ST_AT_FILEMARK | ST_AT_EOM) -#define ST_PER_OPEN (ST_OPEN | ST_NOREWIND | ST_WRITTEN | ST_PER_ACTION) -#define ST_PER_MEDIA ST_FIXEDBLOCKS - -int stattach(int, struct scsi_switch *, int, int *); -int stopen(dev_t); -int stclose(dev_t); -void stminphys(struct buf *); -void ststrategy(struct buf *); -int ststart(int); -int st_done(int, struct scsi_xfer *); -int stioctl(dev_t, int, caddr_t, int); -int st_req_sense(int, int); -int st_test_ready(int, int); -int st_rd_blk_lim(int, int); -int st_mode_sense(int, int); -int st_mode_select(int, int, int); -int st_space(int, int, int, int); -int st_write_filemarks(int, int, int); -int st_load(int, int, int); -int st_prevent(int, int, int); -int st_rewind(int, int, int); -int st_scsi_cmd(int, struct scsi_generic *, int, u_char *, int, int, int); -int st_interpret_sense(int, struct scsi_xfer *); -int stsize(dev_t); -int stdump(void); -