Date: Thu, 20 Jan 2000 21:10:03 -0800 (PST) From: "Kenneth D. Merry" <ken@kdm.org> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/16049: Conner Drive Doesn't like syncronize cache (surprise) Message-ID: <200001210510.VAA12539@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/16049; it has been noted by GNATS.
From: "Kenneth D. Merry" <ken@kdm.org>
To: robert@tabby.kudra.com
Cc: FreeBSD-gnats-submit@FreeBSD.ORG, gibbs@FreeBSD.ORG
Subject: Re: kern/16049: Conner Drive Doesn't like syncronize cache (surprise)
Date: Thu, 20 Jan 2000 21:51:08 -0700
--dDRMvlgZJXvWKvBx
Content-Type: text/plain; charset=us-ascii
On Tue, Jan 11, 2000 at 00:13:53 -0500, robert@tabby.kudra.com wrote:
> >Release: FreeBSD 3.4-RELEASE i386
> >Organization:
> Kudra.Com Web services
> >Environment:
> 3.4 Release
>
> >Description:
>
> When rebooting a 3.4-RELEASE machine with a Conner drive and Adaptec
> Controller, I get the following error message:
>
> (da0:ahc0:0:0:0): SYNCHRONIZE CACHE. CDB: 35 0 0 0 0 0 0 0 0 0
> (da0:ahc0:0:0:0): ILLEGAL REQUEST asc:20,0
> (da0:ahc0:0:0:0): Invalid command operation code
>
> Here are the boot messages pertaining to the disk adapter and drive:
> ahc0: <Adaptec 2940 SCSI adapter> rev 0x03 int a irq 11 on pci0.18.0
> ahc0: aic7870 Single Channel A, SCSI Id=7, 16/255 SCBs
>
> da0: <CONNER CFP1080S 4443> Fixed Direct Access SCSI-2 device
> da0: 10.000MB/s transfers (10.000MHz, offset 15), Tagged Queueing Enabled
> da0: 1030MB (2110812 512 byte sectors: 255H 63S/T 131C)
>
> >How-To-Repeat:
>
> halt/reboot the machine.
Instead of quirking it, can you try the attached patch? Justin and I have
a theory on why these messages might be popping up, but we're not quite
sure.
I've tested this under -current, but the patch is against -stable, which
should apply okay to your 3.4-RELEASE sources. (Obviously, you'll need to
remove or comment out your quirk to test this.)
Anyway, let us know how it works. Make sure to CC your mail to
FreeBSD-gnats-submit@FreeBSD.ORG, so it gets in the log for this PR as
well.
Thanks,
Ken
--
Kenneth Merry
ken@kdm.org
--dDRMvlgZJXvWKvBx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="scsi_da.c.cache_sync.stable.20000120"
==== //depot/FreeBSD-ken-stable/src/sys/cam/scsi/scsi_da.c#1 - /a/ken/perforce/FreeBSD-ken-stable/src/sys/cam/scsi/scsi_da.c ====
*** /tmp/tmp.4027.0 Thu Jan 20 21:47:33 2000
--- /a/ken/perforce/FreeBSD-ken-stable/src/sys/cam/scsi/scsi_da.c Thu Jan 20 21:46:25 2000
***************
*** 263,268 ****
--- 263,269 ----
static SLIST_HEAD(,da_softc) softc_list;
static struct extend_array *daperiphs;
+ static union ccb *da_shutdown_ccb;
static int
daopen(dev_t dev, int flags, int fmt, struct proc *p)
***************
*** 808,814 ****
printf("da: Failed to alloc extend array!\n");
return;
}
!
/*
* Install a global async callback. This callback will
* receive async callbacks like "new device found".
--- 809,826 ----
printf("da: Failed to alloc extend array!\n");
return;
}
!
! da_shutdown_ccb = malloc(sizeof(union ccb), M_DEVBUF, M_NOWAIT);
! if (da_shutdown_ccb == NULL) {
! /*
! * XXX KDM should we worry about a memory leak from
! * daperiphs here?
! */
! printf("da: Failed to alloc shutdown CCB!\n");
! return;
! } else
! bzero(da_shutdown_ccb, sizeof(union ccb));
!
/*
* Install a global async callback. This callback will
* receive async callbacks like "new device found".
***************
*** 1578,1586 ****
for (periph = TAILQ_FIRST(&dadriver.units); periph != NULL;
periph = TAILQ_NEXT(periph, unit_links)) {
! union ccb ccb;
softc = (struct da_softc *)periph->softc;
/*
* We only sync the cache if the drive is still open, and
* if the drive is capable of it..
--- 1590,1600 ----
for (periph = TAILQ_FIRST(&dadriver.units); periph != NULL;
periph = TAILQ_NEXT(periph, unit_links)) {
! union ccb *ccb;
softc = (struct da_softc *)periph->softc;
+ ccb = da_shutdown_ccb;
+
/*
* We only sync the cache if the drive is still open, and
* if the drive is capable of it..
***************
*** 1589,1598 ****
|| (softc->quirks & DA_Q_NO_SYNC_CACHE))
continue;
! xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/1);
! ccb.ccb_h.ccb_state = DA_CCB_DUMP;
! scsi_synchronize_cache(&ccb.csio,
/*retries*/1,
/*cbfcnp*/dadone,
MSG_SIMPLE_Q_TAG,
--- 1603,1612 ----
|| (softc->quirks & DA_Q_NO_SYNC_CACHE))
continue;
! xpt_setup_ccb(&ccb->ccb_h, periph->path, /*priority*/1);
! ccb->ccb_h.ccb_state = DA_CCB_DUMP;
! scsi_synchronize_cache(&ccb->csio,
/*retries*/1,
/*cbfcnp*/dadone,
MSG_SIMPLE_Q_TAG,
***************
*** 1601,1630 ****
SSD_FULL_SIZE,
5 * 60 * 1000);
! xpt_polled_action(&ccb);
! if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
! if (((ccb.ccb_h.status & CAM_STATUS_MASK) ==
CAM_SCSI_STATUS_ERROR)
! && (ccb.csio.scsi_status == SCSI_STATUS_CHECK_COND)){
int error_code, sense_key, asc, ascq;
! scsi_extract_sense(&ccb.csio.sense_data,
&error_code, &sense_key,
&asc, &ascq);
if (sense_key != SSD_KEY_ILLEGAL_REQUEST)
! scsi_sense_print(&ccb.csio);
} else {
xpt_print_path(periph->path);
printf("Synchronize cache failed, status "
"== 0x%x, scsi status == 0x%x\n",
! ccb.ccb_h.status, ccb.csio.scsi_status);
}
}
! if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0)
! cam_release_devq(ccb.ccb_h.path,
/*relsim_flags*/0,
/*reduction*/0,
/*timeout*/0,
--- 1615,1645 ----
SSD_FULL_SIZE,
5 * 60 * 1000);
! xpt_polled_action(ccb);
! if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
! if (((ccb->ccb_h.status & CAM_STATUS_MASK) ==
CAM_SCSI_STATUS_ERROR)
! && (ccb->csio.scsi_status == SCSI_STATUS_CHECK_COND)){
int error_code, sense_key, asc, ascq;
! scsi_extract_sense(&ccb->csio.sense_data,
&error_code, &sense_key,
&asc, &ascq);
if (sense_key != SSD_KEY_ILLEGAL_REQUEST)
! scsi_sense_print(&ccb->csio);
} else {
xpt_print_path(periph->path);
printf("Synchronize cache failed, status "
"== 0x%x, scsi status == 0x%x\n",
! ccb->ccb_h.status,
! ccb->csio.scsi_status);
}
}
! if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0)
! cam_release_devq(ccb->ccb_h.path,
/*relsim_flags*/0,
/*reduction*/0,
/*timeout*/0,
--dDRMvlgZJXvWKvBx--
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200001210510.VAA12539>
