From owner-freebsd-current@FreeBSD.ORG Wed Nov 21 16:39:04 2007 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 45D7216A41B for ; Wed, 21 Nov 2007 16:39:04 +0000 (UTC) (envelope-from christoph.hoffmann@biff.ch) Received: from aix.biff.ch (aix.biff.ch [80.238.135.101]) by mx1.freebsd.org (Postfix) with ESMTP id AD7B513C468 for ; Wed, 21 Nov 2007 16:39:02 +0000 (UTC) (envelope-from christoph.hoffmann@biff.ch) Received: from localhost (localhost [127.0.0.1]) by aix.biff.ch (Postfix) with ESMTP id 4D04A11FB9F; Wed, 21 Nov 2007 17:38:10 +0100 (CET) Received: from aix.biff.ch ([127.0.0.1]) by localhost (localhost [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 02212-02; Wed, 21 Nov 2007 17:38:07 +0100 (CET) Received: from [192.168.2.27] (secmac.biff.ch [192.168.2.27]) by aix.biff.ch (Postfix) with ESMTP id 3C3A011FB72; Wed, 21 Nov 2007 17:38:07 +0100 (CET) In-Reply-To: <47445D4D.9060207@delphij.net> References: <47445D4D.9060207@delphij.net> Mime-Version: 1.0 (Apple Message framework v752.2) Message-Id: <764F5A79-B6FA-45E3-988D-B5F965C8BC86@biff.ch> From: Christoph Hoffmann Date: Wed, 21 Nov 2007 17:39:05 +0100 To: d@delphij.net X-Mailer: Apple Mail (2.752.2) X-Virus-Scanned: by amavisd-new at biff.ch Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: FreeBSD Current Subject: Re: ciss driver X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Nov 2007 16:39:04 -0000 Thank You very much indeed for your help. Will you be able to submit this fix into 6 and 7 pool? Regards, Christoph On Nov 21, 2007, at 5:31 PM, Xin LI wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Christoph Hoffmann wrote: >> Hello Everybody, >> >> is there any time plans/time frame to get the latest ciss driver >> >> 8.0-CURRENT >> ciss.c,v 1.85 2007/11/05 13:54:23 iwasaki >> >> (fix the ADAPTER HEARTBEAT FAILED problem) >> >> back-ported to 7.0 and 6? > > Try this patch? (RELENG_7) > > Cheers, > - -- > Xin LI http://www.delphij.net/ > FreeBSD - The Power to Serve! > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.7 (FreeBSD) > > iD8DBQFHRF1NhcUczkLqiksRAsT0AJ0fJE2CpgTf1CPuJ8ac6JDiRl5n0QCfUag4 > 0L76W1H0a//Hg6thVv4+kXg= > =4o/2 > -----END PGP SIGNATURE----- > Index: ciss.c > =================================================================== > RCS file: /home/ncvs/src/sys/dev/ciss/ciss.c,v > retrieving revision 1.81.2.1 > diff -u -p -r1.81.2.1 ciss.c > --- ciss.c 19 Oct 2007 15:19:22 -0000 1.81.2.1 > +++ ciss.c 21 Nov 2007 16:29:35 -0000 > @@ -183,6 +183,8 @@ static int ciss_name_device(struct ciss_ > > /* periodic status monitoring */ > static void ciss_periodic(void *arg); > +static void ciss_nop_complete(struct ciss_request *cr); > +static void ciss_disable_adapter(struct ciss_softc *sc); > static void ciss_notify_event(struct ciss_softc *sc); > static void ciss_notify_complete(struct ciss_request *cr); > static int ciss_notify_abort(struct ciss_softc *sc); > @@ -3068,6 +3070,9 @@ static void > ciss_periodic(void *arg) > { > struct ciss_softc *sc; > + struct ciss_request *cr = NULL; > + struct ciss_command *cc = NULL; > + int error = 0; > > debug_called(1); > > @@ -3082,7 +3087,8 @@ ciss_periodic(void *arg) > sc->ciss_heartbeat, sc->ciss_heart_attack); > if (sc->ciss_heart_attack == 3) { > ciss_printf(sc, "ADAPTER HEARTBEAT FAILED\n"); > - /* XXX should reset adapter here */ > + ciss_disable_adapter(sc); > + return; > } > } else { > sc->ciss_heartbeat = sc->ciss_cfg->heartbeat; > @@ -3091,6 +3097,24 @@ ciss_periodic(void *arg) > } > > /* > + * Send the NOP message and wait for a response. > + */ > + if ((error = ciss_get_request(sc, &cr)) == 0) { > + cc = CISS_FIND_COMMAND(cr); > + cr->cr_complete = ciss_nop_complete; > + cc->cdb.cdb_length = 1; > + cc->cdb.type = CISS_CDB_TYPE_MESSAGE; > + cc->cdb.attribute = CISS_CDB_ATTRIBUTE_SIMPLE; > + cc->cdb.direction = CISS_CDB_DIRECTION_WRITE; > + cc->cdb.timeout = 0; > + cc->cdb.cdb[0] = CISS_OPCODE_MESSAGE_NOP; > + > + if ((error = ciss_start(cr)) != 0) { > + ciss_printf(sc, "SENDING NOP MESSAGE FAILED\n"); > + } > + } > + > + /* > * If the notify event request has died for some reason, or has > * not started yet, restart it. > */ > @@ -3105,6 +3129,74 @@ ciss_periodic(void *arg) > callout_reset(&sc->ciss_periodic, CISS_HEARTBEAT_RATE * hz, > ciss_periodic, sc); > } > > +static void > +ciss_nop_complete(struct ciss_request *cr) > +{ > + struct ciss_softc *sc; > + > + sc = cr->cr_sc; > + if (ciss_report_request(cr, NULL, NULL) != 0) { > + ciss_printf(sc, "SENDING NOP MESSAGE FAILED\n"); > + } > + > + ciss_release_request(cr); > +} > + > +/ > ********************************************************************** > ** > + * Disable the adapter. > + * > + * The all requests in completed queue is failed with hardware error. > + * This will cause failover in a multipath configuration. > + */ > +static void > +ciss_disable_adapter(struct ciss_softc *sc) > +{ > + struct ciss_request *cr; > + struct ciss_command *cc; > + struct ciss_error_info *ce; > + int s; > + > + s = splcam(); > + > + CISS_TL_SIMPLE_DISABLE_INTERRUPTS(sc); > + pci_disable_busmaster(sc->ciss_dev); > + sc->ciss_flags &= ~CISS_FLAG_RUNNING; > + > + for (;;) { > + if ((cr = ciss_dequeue_busy(sc)) == NULL) > + break; > + > + cc = CISS_FIND_COMMAND(cr); > + ce = (struct ciss_error_info *)&(cc->sg[0]); > + ce->command_status = CISS_CMD_STATUS_HARDWARE_ERROR; > + ciss_enqueue_complete(cr); > + } > + > + for (;;) { > + if ((cr = ciss_dequeue_complete(sc)) == NULL) > + break; > + > + /* > + * If the request has a callback, invoke it. > + */ > + if (cr->cr_complete != NULL) { > + cr->cr_complete(cr); > + continue; > + } > + > + /* > + * If someone is sleeping on this request, wake them up. > + */ > + if (cr->cr_flags & CISS_REQ_SLEEP) { > + cr->cr_flags &= ~CISS_REQ_SLEEP; > + wakeup(cr); > + continue; > + } > + } > + > + splx(s); > +} > + > / > ********************************************************************** > ** > * Request a notification response from the adapter. > *