ciss driver

Christoph Hoffmann christoph.hoffmann at biff.ch
Wed Nov 21 08:39:04 PST 2007


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
> @@ -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.
>   *



More information about the freebsd-current mailing list