Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Jul 1998 12:24:05 -0600 (MDT)
From:      "Kenneth D. Merry" <ken@plutotech.com>
To:        rln@ludd.luth.se (Rolf Larsson)
Cc:        gibbs@pluto.plutotech.com, scsi@FreeBSD.ORG
Subject:   Re: Two problems (Ultra2-performance and CD-recording)
Message-ID:  <199807061824.MAA23873@panzer.plutotech.com>
In-Reply-To: <199807061525.RAA18394@father.ludd.luth.se> from Rolf Larsson at "Jul 6, 98 05:25:47 pm"

next in thread | previous in thread | raw e-mail | index | archive | help

--ELM899749445-23828-0_
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Rolf Larsson wrote...
> Kenneth D. Merry said something like this:
> 
> > 	Notice the offset 0.  That isn't good.  We know there are problems
> > with the 7890 and Ultra 2 disks, most likely related to negotiation.
> > Others have reported similar strange behavior.  The problems with the 7890
> > and Ultra 2 drives aren't likely to be fixed until Justin gets an Ultra 2
> > drive to test.  The Atipa folks have agreed to send him one, and it should
> > arrive in a couple of days.  That will hopefully help him find the problem.
> 
> OK. I'll hold my breath for now :-) speed isn't much of a problem anyway,
> with 7 sambausers and an internal webserver it rocks quite good even with
> that performance.
> 
> > 	Well, there isn't a WORM driver in CAM at the moment.  I'm working
> > on it, though.  In the next snapshot, the CDROM driver will attach to your
> > WORM drive.  For now, there are a couple of things you can do.
> 
> > 	- If you just want to see if CAM probed your WORM drive, and don't
> > 	  want to make the above change for some reason, boot with -v, and
> > 	  you'll see all the passthrough driver probe messages.  The
> > 	  passthrough driver attaches to every SCSI device.
> 
> ...except this one (see attached dmesg output). That's odd, I guess.

> found-> vendor=0x9005, dev=0x001f, revid=0x00
>         class=01-00-00, hdrtype=0x00, mfdev=0
>         intpin=a, irq=19
>         map[0]: type 4, range 32, base 0000d000, size  8
>         map[1]: type 1, range 64, base e3000000, size 12
>         map[2]: type 0, range  0, base 00000000, size  0
> ahc0: <Adaptec aic7890/91 Ultra2 SCSI adapter> rev 0x00 int a irq 19 on pci0.6.0
> ahc0: Reading SEEPROM...checksum error
> ahc0: No SEEPROM available
> ahc0: Using left over BIOS settings
> ahc0: aic7890/91 Wide Channel A, SCSI Id=15, 32/255 SCBs
> ahc0: Resetting Channel A
> ahc0: Downloading Sequencer Program... 407 instructions downloaded

	Justin has made some fixes to the Adaptec driver since the last
snapshot that may fix your problem.  Notice that the SCSI ID of your
adapter is 15.  Your WORM drive is almost certainly a narrow device, so it
won't see the controller.  There's a bug in the May 20th version of the
Adaptec driver on Ultra 2 controllers -- it reads the SCSI ID from the
wrong place (when it is looking at "leftover BIOS values" on chips without
a SEEPROM).  The patch fixes that problem.

	The other thing the patch does is that it tries reading the SEEPROM
in several different formats, just in case the one you have is different
from what the driver thinks should be there.

	Anyway, try the patch out, and let me know if it helps things any.
This patch may also be useful to other folks, so I'm CCing it to the scsi
list.

Ken
-- 
Kenneth Merry
ken@plutotech.com

--ELM899749445-23828-0_
Content-Type: text/plain; charset=ISO-8859-1
Content-Disposition: attachment; filename=ahc_pci_diffs
Content-Description: ahc_pci_diffs
Content-Transfer-Encoding: 7bit

*** src/sys/pci/ahc_pci.c.orig
--- src/sys/pci/ahc_pci.c
***************
*** 401,407 ****
  	
  	/* Remeber how the card was setup in case there is no SEEPROM */
  	ahc_outb(ahc, HCNTRL, ahc->pause);
! 	our_id = ahc_inb(ahc, SCSIID) & OID;
  	sxfrctl1 = ahc_inb(ahc, SXFRCTL1) & STPWEN;
  	scsiseq = ahc_inb(ahc, SCSISEQ);
  
--- 401,410 ----
  	
  	/* Remeber how the card was setup in case there is no SEEPROM */
  	ahc_outb(ahc, HCNTRL, ahc->pause);
! 	if ((ahc->features & AHC_ULTRA2) != 0)
! 		our_id = ahc_inb(ahc, SCSIID_ULTRA2) & OID;
! 	else
! 		our_id = ahc_inb(ahc, SCSIID) & OID;
  	sxfrctl1 = ahc_inb(ahc, SXFRCTL1) & STPWEN;
  	scsiseq = ahc_inb(ahc, SCSISEQ);
  
***************
*** 581,590 ****
--- 584,600 ----
  	sd.sd_status_offset = SEECTL;		
  	sd.sd_dataout_offset = SEECTL;		
  
+ 	/*
+ 	 * For some multi-channel devices, the c46 is simply too
+ 	 * small to work.  For the other controller types, we can
+ 	 * get our information from either SEEPROM type.  Set the
+ 	 * type to start our probe with accordingly.
+ 	 */
  	if (ahc->flags & AHC_LARGE_SEEPROM)
  		sd.sd_chip = C56_66;
  	else
  		sd.sd_chip = C46;
+ 
  	sd.sd_MS = SEEMS;
  	sd.sd_RDY = SEERDY;
  	sd.sd_CS = SEECS;
***************
*** 595,624 ****
  	have_seeprom = acquire_seeprom(ahc, &sd);
  
  	if (have_seeprom) {
- 		bus_size_t start_addr;
- 
- 		start_addr = 32 * (ahc->channel - 'A');
  
  		if (bootverbose) 
  			printf("%s: Reading SEEPROM...", ahc_name(ahc));
! 		have_seeprom = read_seeprom(&sd, (u_int16_t *)&sc, start_addr,
! 					    sizeof(sc)/2);
  
! 		if (have_seeprom) {
! 			/* Check checksum */
! 			int i;
! 			int maxaddr = (sizeof(sc)/2) - 1;
! 			u_int16_t *scarray = (u_int16_t *)&sc;
  
! 			for (i = 0; i < maxaddr; i++)
! 				checksum = checksum + scarray[i];
! 			if (checksum != sc.checksum) {
! 				if(bootverbose)
! 					printf ("checksum error\n");
! 				have_seeprom = 0;
! 			} else if (bootverbose) {
! 				printf("done.\n");
  			}
  		}
  	}
  
--- 605,643 ----
  	have_seeprom = acquire_seeprom(ahc, &sd);
  
  	if (have_seeprom) {
  
  		if (bootverbose) 
  			printf("%s: Reading SEEPROM...", ahc_name(ahc));
! 
! 		for (;;) {
! 			bus_size_t start_addr;
! 
! 			start_addr = 32 * (ahc->channel - 'A');
! 
! 			have_seeprom = read_seeprom(&sd, (u_int16_t *)&sc,
! 						    start_addr, sizeof(sc)/2);
  
! 			if (have_seeprom) {
! 				/* Check checksum */
! 				int i;
! 				int maxaddr = (sizeof(sc)/2) - 1;
! 				u_int16_t *scarray = (u_int16_t *)&sc;
  
! 				for (i = 0; i < maxaddr; i++)
! 					checksum = checksum + scarray[i];
! 				if (checksum == 0 || checksum != sc.checksum) {
! 					if (bootverbose && sd.sd_chip == C56_66)
! 						printf ("checksum error\n");
! 					have_seeprom = 0;
! 				} else if (bootverbose) {
! 					printf("done.\n");
! 					break;
! 				}
  			}
+ 
+ 			if (sd.sd_chip == C56_66)
+ 				break;
+ 			sd.sd_chip = C56_66;
  		}
  	}
  

--ELM899749445-23828-0_--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-scsi" in the body of the message



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