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 <delphij_at_delphij.net> 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 > _at__at_ -183,6 +183,8 _at__at_ 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); > _at__at_ -3068,6 +3070,9 _at__at_ 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); > > _at__at_ -3082,7 +3087,8 _at__at_ 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; > _at__at_ -3091,6 +3097,24 _at__at_ 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. > */ > _at__at_ -3105,6 +3129,74 _at__at_ 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. > *Received on Wed Nov 21 2007 - 15:39:04 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:22 UTC