Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 May 1995 00:06:04 -0700
From:      David Greenman <davidg>
To:        CVS-commiters, cvs-sys
Subject:   cvs commit: src/sys/i386/scsi aic7xxx.c aic7xxx.h
Message-ID:  <199505170706.AAA24949@freefall.cdrom.com>

next in thread | raw e-mail | index | archive | help
davidg      95/05/17 00:06:03

  Modified:    sys/dev/aic7xxx  aic7xxx.seq
               sys/i386/scsi  aic7xxx.c aic7xxx.h
  Log:
  Fixes to the aic7xxx sequencer code and device driver from Justin Gibbs:
  
  1) If a target initiated a sync negotiation with us and happened to chose a
  value above 15, the old code inadvertantly truncated it with an "& 0x0f".
  If the periferal picked something really bad like 0x32, you'd end up with
  an offset of 2 which would hang the drive since it didn't expect to ever
  get something so low.  We now do a MIN(maxoffset, given_offset).
  
  2) In the case of Wide cards, we were turning on sync transfers after a
  sucessfull wide negotiation.  Now we leave the offset alone in the per
  target scratch space (which implies asyncronous transfers since we initialize
  it that way) until a syncronous negotation occurs.
  
  3) We were advertizing a max offset of 15 instead of 8 for wide devices.
  
  4) If the upper level SCSI code sent down a "SCSI_RESET", it would hang the
  system because we would end up sending a null command to the sequencer.  Now
  we handle SCSI_RESET correctly by having the sequencer interrupt us when it
  is about to fill the message buffer so that we can fill it in ourselves.
  The sequencer will also "simulate" a command complete for these "message only"
  SCBs so that the kernel driver can finish up properly.  The cdplay utility
  will send a "SCSI_REST" to the cdplayer if you use the reset command.
  
  5) The code that handles SCSIINTs was broken in that if more than one type
  of error was true at once, we'd do outbs without the card being paused.
  The else clause after the busfree case was also an accident waiting to
  happen.  I've now turned this into an if, else if, else type of thing, since
  in most cases when we handle one type of error, it should be okay to ignore
  the rest (ie if we have a SELTO, who cares if there was a parity error on
  the transaction?), but the section should really be rewritten after 2.0.5.
  This fix was the least obtrusive way to patch the problem.
  
  6) Only tag either SDTR or WDTR negotiation on an SCB.  The real problem is
  that I don't account for the case when an SCB that is tagged to do a particular
  type of negotiation completes or SELTOs (selection timeout) without the
  negotiation taking place, so the accounting of sdtrpending and wdtrpending
  gets screwed up.  In the wide case, if we tag it to do both wdtr and sdtr,
  it only performs wdtr (since wdtr must occur first and we spread out the
  negotiation over two commands) so we always have sdtrpending set for that
  target and we never do a real SDTR.  I fill properly fix the accounting
  after 2.0.5 goes out the door, but this works (as confirmed by Dan) on
  wide targets.
  
  Other stuff that is also included:
  
  1) Don't do a bzero when recycling SCBs.  The only thing that must explicitly
  be set to zero is the scb control byte which is done in ahc_get_scb.  We also
  need to set the SG_list_pointer and SG_list_count to 0 for commands that do
  not transfer data.
  
  2) Mask the interrupt type printout for the aic7870 case.  The bit we were
  using to determine interrupt type is only valid for the aic7770.
  
  Submitted by:	Justin Gibbs



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199505170706.AAA24949>