All of lore.kernel.org
 help / color / mirror / Atom feed
From: scameron@beardog.cce.hp.com
To: Hannes Reinecke <hare@suse.de>
Cc: James Bottomley <jbottomley@parallels.com>,
	linux-scsi@vger.kernel.org, scameron@beardog.cce.hp.com
Subject: Re: [PATCH] hpsa: fixup MSI-X registration
Date: Wed, 15 Jan 2014 15:32:05 -0600	[thread overview]
Message-ID: <20140115213205.GA3776@beardog.cce.hp.com> (raw)
In-Reply-To: <1389789053-95698-1-git-send-email-hare@suse.de>

On Wed, Jan 15, 2014 at 01:30:53PM +0100, Hannes Reinecke wrote:
> Commit 254f796b9f22b1944c64caabc356a56caaa2facd updated
> the driver to use 16 MSI-X vectors, despite the fact that
> older controllers would provide only 4.
> This was causing MSI-X registration to drop down to INTx
> mode. But as the controller support performant mode, the
> initialisation will become confused and cause the machine
> to stall during boot.
> 
> This patch fixes up the MSI-X registration to re-issue
> the pci_enable_msix() call with the correct number of
> MSI-X vectors. With that the hpsa driver continues to
> works on older controllers like the P200.
> 
> Cc: Stephen M. Cameron <scameron@beardog.cce.hp.com>
> Signed-off-by: Hannes Reinecke <hare@suse.de>

Ack.

Looks good to me, thanks.

-- steve

> ---
>  drivers/scsi/hpsa.c | 31 +++++++++++++++++--------------
>  1 file changed, 17 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
> index 868318a..40989ee 100644
> --- a/drivers/scsi/hpsa.c
> +++ b/drivers/scsi/hpsa.c
> @@ -598,7 +598,7 @@ static void set_performant_mode(struct ctlr_info *h, struct CommandList *c)
>  {
>  	if (likely(h->transMethod & CFGTBL_Trans_Performant)) {
>  		c->busaddr |= 1 | (h->blockFetchTable[c->Header.SGList] << 1);
> -		if (likely(h->msix_vector))
> +		if (likely(h->msix_vector > 0))
>  			c->Header.ReplyQueue =
>  				raw_smp_processor_id() % h->nreply_queues;
>  	}
> @@ -4169,21 +4169,24 @@ static void hpsa_interrupt_mode(struct ctlr_info *h)
>  		goto default_int_mode;
>  	if (pci_find_capability(h->pdev, PCI_CAP_ID_MSIX)) {
>  		dev_info(&h->pdev->dev, "MSIX\n");
> +		h->msix_vector = MAX_REPLY_QUEUES;
>  		err = pci_enable_msix(h->pdev, hpsa_msix_entries,
> -						MAX_REPLY_QUEUES);
> -		if (!err) {
> -			for (i = 0; i < MAX_REPLY_QUEUES; i++)
> -				h->intr[i] = hpsa_msix_entries[i].vector;
> -			h->msix_vector = 1;
> -			return;
> -		}
> +				      h->msix_vector);
>  		if (err > 0) {
>  			dev_warn(&h->pdev->dev, "only %d MSI-X vectors "
>  			       "available\n", err);
> -			goto default_int_mode;
> +			h->msix_vector = err;
> +			err = pci_enable_msix(h->pdev, hpsa_msix_entries,
> +					      h->msix_vector);
> +		}
> +		if (!err) {
> +			for (i = 0; i < h->msix_vector; i++)
> +				h->intr[i] = hpsa_msix_entries[i].vector;
> +			return;
>  		} else {
>  			dev_warn(&h->pdev->dev, "MSI-X init failed %d\n",
>  			       err);
> +			h->msix_vector = 0;
>  			goto default_int_mode;
>  		}
>  	}
> @@ -4597,15 +4600,15 @@ static int hpsa_request_irq(struct ctlr_info *h,
>  	for (i = 0; i < MAX_REPLY_QUEUES; i++)
>  		h->q[i] = (u8) i;
>  
> -	if (h->intr_mode == PERF_MODE_INT && h->msix_vector) {
> +	if (h->intr_mode == PERF_MODE_INT && h->msix_vector > 0) {
>  		/* If performant mode and MSI-X, use multiple reply queues */
> -		for (i = 0; i < MAX_REPLY_QUEUES; i++)
> +		for (i = 0; i < h->msix_vector; i++)
>  			rc = request_irq(h->intr[i], msixhandler,
>  					0, h->devname,
>  					&h->q[i]);
>  	} else {
>  		/* Use single reply pool */
> -		if (h->msix_vector || h->msi_vector) {
> +		if (h->msix_vector > 0 || h->msi_vector) {
>  			rc = request_irq(h->intr[h->intr_mode],
>  				msixhandler, 0, h->devname,
>  				&h->q[h->intr_mode]);
> @@ -4658,7 +4661,7 @@ static void free_irqs(struct ctlr_info *h)
>  		return;
>  	}
>  
> -	for (i = 0; i < MAX_REPLY_QUEUES; i++)
> +	for (i = 0; i < h->msix_vector; i++)
>  		free_irq(h->intr[i], &h->q[i]);
>  }
>  
> @@ -5178,7 +5181,7 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h)
>  	if (!(trans_support & PERFORMANT_MODE))
>  		return;
>  
> -	h->nreply_queues = h->msix_vector ? MAX_REPLY_QUEUES : 1;
> +	h->nreply_queues = h->msix_vector > 0 ? h->msix_vector : 1;
>  	hpsa_get_max_perf_mode_cmds(h);
>  	/* Performant mode ring buffer and supporting data structures */
>  	h->reply_pool_size = h->max_commands * sizeof(u64) * h->nreply_queues;
> -- 
> 1.7.12.4

      reply	other threads:[~2014-01-15 20:32 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-15 12:30 [PATCH] hpsa: fixup MSI-X registration Hannes Reinecke
2014-01-15 21:32 ` scameron [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140115213205.GA3776@beardog.cce.hp.com \
    --to=scameron@beardog.cce.hp.com \
    --cc=hare@suse.de \
    --cc=jbottomley@parallels.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.