Date: Thu, 02 Jul 1998 20:09:55 -0700 From: Mike Smith <mike@smith.net.au> To: brian@worldcontrol.com Cc: Ian Freislich <iang@iafrica.com>, freebsd-current@FreeBSD.ORG Subject: Re: SCSI problems on aic7880 Message-ID: <199807030309.UAA03446@antipodes.cdrom.com> In-Reply-To: Your message of "Thu, 02 Jul 1998 14:15:21 PDT." <19980702141521.A4466@top.worldcontrol.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multipart MIME message. --==_Exmh_5545622880 Content-Type: text/plain; charset=us-ascii > On %M 0, Ian Freislich <iang@iafrica.com> wrote: > > Hi > > > > After a while (3 mins from boot to a day or so) I start getting > > the following messages on my console: > > (this sequence repeats infinitely so I'm not sure if the SCSI > > problem causes the pager problem or the other way around) > > I have repeatable problems with the aic7880. The same problems do > not appear on the aic7870. I suggest you find a aic7870 based board. > > CAM may solve the problem, however, I am unable to use it due to a > lack of CD burning facility. Please find attached patches for cdrecord 1.6a12. These have already been submitted to the CAM people and Joerg Schilling, but it sounds like the urgency level is rising. You need to set the following environment variables before building: COPTX= -DBSD_CAM LDOPTX= -lcam (Note that the patch was cleaned slightly by hand, as I just realised it was full of junk. It should still work though.) --==_Exmh_5545622880 Content-Type: text/plain; name="camdiff"; charset=us-ascii Content-Description: camdiff Content-Disposition: attachment; filename="camdiff" diff -ru cdrecord-1.6.orig/cdrecord/cdrecord.c cdrecord-1.6/cdrecord/cdrecord.c --- cdrecord-1.6.orig/cdrecord/cdrecord.c Thu Mar 12 14:42:11 1998 +++ cdrecord-1.6/cdrecord/cdrecord.c Mon Jun 29 16:37:12 1998 @@ -1709,6 +1709,13 @@ { struct sched_param scp; + /* + * Verify that scheduling is available + */ + if (sysconf(_SC_PRIORITY_SCHEDULING) == -1) { + errmsg("WARNING: RR-scheduler not available, disabling.\n"); + return(0); + } fillbytes(&scp, sizeof(scp), '\0'); scp.sched_priority = sched_get_priority_max(SCHED_RR) - pri; if (sched_setscheduler(0, SCHED_RR, &scp) < 0) { diff -ru cdrecord-1.6.orig/cdrecord/scsi-bsd.c cdrecord-1.6/cdrecord/scsi-bsd.c --- cdrecord-1.6.orig/cdrecord/scsi-bsd.c Sun Aug 31 15:25:17 1997 +++ cdrecord-1.6/cdrecord/scsi-bsd.c Tue Jun 2 15:27:20 1998 @@ -30,6 +30,8 @@ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef BSD_CAM + #undef sense #include <sys/scsiio.h> @@ -283,3 +285,194 @@ return (ret); } #define sense u_sense.Sense + +#else /* BSD_CAM */ +/* + * Interface for the FreeBSD CAM passthrough device. + * + * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#undef sense +#define scsi_sense CAM_scsi_sense +#define scsi_inquiry CAM_scsi_inquiry +#include <cam/cam.h> +#include <cam/cam_ccb.h> +#include <cam/scsi/scsi_message.h> +#include <cam/scsi/scsi_pass.h> +#include <camlib.h> + +#define CAM_MAXDEVS 128 +struct cam_device *cam_devices[CAM_MAXDEVS + 1]; + +/* + * Build a list of everything we can find. + */ +EXPORT +int scsi_open() +{ + struct cam_device *dev; + char name[16]; + int unit; + + bzero(cam_devices, sizeof(cam_devices)); + + for (unit = 0; unit < CAM_MAXDEVS; unit++) { + sprintf(name, "pass%d", unit); + cam_devices[unit] = cam_open_device(name, O_RDWR); + } + return(unit); +} + +LOCAL +long scsi_maxdma() +{ + return (MAXPHYS); +} + +EXPORT void * +scsi_getbuf(amt) + long amt; +{ + void *ret; + + if (scg_maxdma == 0) + scg_maxdma = MAXPHYS; + + if (amt <= 0 || amt > scg_maxdma) + return ((void *)0); + if (debug) + printf("scsi_getbuf: %ld bytes\n", amt); + ret = valloc((size_t)(amt)); + return (ret); +} + +EXPORT +BOOL scsi_havebus(int busno) +{ + int unit; + + for (unit = 0; cam_devices[unit] != NULL; unit++) + if (cam_devices[unit]->path_id == busno) + return(1); + return(0); +} + +EXPORT +int scsi_fileno(bus, unit, lun) +{ + int i; + + for (i = 0; cam_devices[i] != NULL; i++) + if ((cam_devices[i]->path_id == bus) && + (cam_devices[i]->target_id == unit) && + (cam_devices[i]->target_lun == lun)) + return(i); + + fprintf(stderr, "lookup for %d,%d,%d failed\n", bus, unit, lun); + return(-1); +} + +EXPORT +int scsireset() +{ + /* XXX synchronous reset command - is this wise? */ +} + +LOCAL int +scsi_send(int unit, struct scg_cmd *sp) +{ + struct cam_device *dev; + union ccb *ccb; + int rv, result; + u_int32_t ccb_flags; + + if (unit < 0) { + fprintf(stderr, "attempt to reference invalid unit %d\n", unit); + sp->error = SCG_FATAL; + return (0); + } + + dev = cam_devices[unit]; + ccb = cam_getccb(dev); + + /* Build the CCB */ + bzero(&ccb->csio, sizeof(struct ccb_scsiio)); + bcopy(sp->cdb.cmd_cdb, &ccb->csio.cdb_io.cdb_bytes, sp->cdb_len); + + /* Request simple error recovery */ + ccb_flags = CAM_PASS_ERR_RECOVER; + if (sp->size != 0) { + ccb_flags |= (sp->flags & SCG_RECV_DATA) ? CAM_DIR_IN : CAM_DIR_OUT; + } + cam_fill_csio(&ccb->csio, + /* retries */ 1, + /* cbfncp */ NULL, + /* flags */ ccb_flags, + /* tag_action */ MSG_SIMPLE_Q_TAG, + /* data_ptr */ (u_int8_t *)sp->addr, + /* dxfer_len */ sp->size, + /* sense_len */ SSD_FULL_SIZE, + /* cdb_len */ sp->cdb_len, + /* timeout */ sp->timeout * 1000); + + /* Run the command */ + errno = 0; + if ((rv = cam_send_ccb(dev, ccb)) != 0) { + errmsg("CAM INTERFACE ERROR"); + result = SCG_FATAL; + sp->ux_errno = errno; + } else { + /* + * Check for command status; failure to complete a command is fatal, + * but anything else will be handled at a higher level. + */ + if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + scsi_sense_print(dev, &ccb->csio, stderr); + result = SCG_FATAL; + } else { + result = SCG_NO_ERROR; + } + } + + /* Pass the result back up */ + bzero(&sp->scb, sizeof(sp->scb)); + bzero(&sp->u_sense.cmd_sense, sizeof(sp->u_sense.cmd_sense)); + sp->resid = ccb->csio.resid; + sp->sense_count = SSD_FULL_SIZE - ccb->csio.sense_resid; + if (sp->sense_count > SCG_MAX_SENSE) + sp->sense_count = SCG_MAX_SENSE; + sp->u_scb.cmd_scb[0] = ccb->csio.scsi_status; + + cam_freeccb(ccb); + return(result); +} + +#undef scsi_sense +#undef scsi_inquiry +#define sense u_sense.Sense + +#endif /* BSD_CAM */ diff -ru cdrecord-1.6.orig/lib/libschily.mk cdrecord-1.6/lib/libschily.mk --- cdrecord-1.6.orig/lib/libschily.mk Sun Nov 9 09:58:01 1997 +++ cdrecord-1.6/lib/libschily.mk Thu Apr 16 10:37:23 1998 @@ -63,8 +63,8 @@ ########################################################################### $(ARCHDIRX)align_test$(DEP_SUFFIX): $(ARCHDIR) -include $(ARCHDIRX)avoffset$(DEP_SUFFIX) -include $(ARCHDIRX)align_test$(DEP_SUFFIX) +#include $(ARCHDIRX)avoffset$(DEP_SUFFIX) +#include $(ARCHDIRX)align_test$(DEP_SUFFIX) CLEAN_FILEX= $(ARCHDIR)/align_test.o $(ARCHDIR)/align_test CLEAN_FILEX += $(ARCHDIR)/avoffset.o $(ARCHDIR)/avoffset --==_Exmh_5545622880 Content-Type: text/plain; charset=us-ascii \\ Sometimes you're ahead, \\ Mike Smith \\ sometimes you're behind. \\ mike@smith.net.au \\ The race is long, and in the \\ msmith@freebsd.org \\ end it's only with yourself. \\ msmith@cdrom.com --==_Exmh_5545622880-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199807030309.UAA03446>