diff mbox

[v3,6/6] qla2xxx: Fix Target mode handling with Multiqueue changes.

Message ID 1480715097-13611-7-git-send-email-himanshu.madhani@cavium.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Madhani, Himanshu Dec. 2, 2016, 9:44 p.m. UTC
From: Quinn Tran <quinn.tran@cavium.com>

- Fix race condition between dpc_thread accessing Multiqueue resources
  and qla2x00_remove_one thread trying to free resource.
- Fix out of order free for Multiqueue resources. Also, Multiqueue
  interrupts needs a workqueue. Interrupt needed to stop before
  the wq can be destroyed.

Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
---
 drivers/scsi/qla2xxx/qla_def.h |  3 ++-
 drivers/scsi/qla2xxx/qla_isr.c | 20 +++++++----------
 drivers/scsi/qla2xxx/qla_mq.c  |  2 +-
 drivers/scsi/qla2xxx/qla_os.c  | 51 +++++++++++++++++++++++++++++++-----------
 4 files changed, 49 insertions(+), 27 deletions(-)

Comments

Hannes Reinecke Dec. 5, 2016, 7:42 a.m. UTC | #1
On 12/02/2016 10:44 PM, Himanshu Madhani wrote:
> From: Quinn Tran <quinn.tran@cavium.com>
> 
> - Fix race condition between dpc_thread accessing Multiqueue resources
>   and qla2x00_remove_one thread trying to free resource.
> - Fix out of order free for Multiqueue resources. Also, Multiqueue
>   interrupts needs a workqueue. Interrupt needed to stop before
>   the wq can be destroyed.
> 
> Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
> Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
> ---
>  drivers/scsi/qla2xxx/qla_def.h |  3 ++-
>  drivers/scsi/qla2xxx/qla_isr.c | 20 +++++++----------
>  drivers/scsi/qla2xxx/qla_mq.c  |  2 +-
>  drivers/scsi/qla2xxx/qla_os.c  | 51 +++++++++++++++++++++++++++++++-----------
>  4 files changed, 49 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
> index 607d539..e613535 100644
> --- a/drivers/scsi/qla2xxx/qla_def.h
> +++ b/drivers/scsi/qla2xxx/qla_def.h
> @@ -2734,7 +2734,8 @@ struct isp_operations {
>  
>  #define QLA_MSIX_DEFAULT		0x00
>  #define QLA_MSIX_RSP_Q			0x01
> -#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q	0x02
> +#define QLA_ATIO_VECTOR		0x02
> +#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q	0x03
>  
>  #define QLA_MIDX_DEFAULT	0
>  #define QLA_MIDX_RSP_Q		1
> diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
> index 14f27a7..03384cf 100644
> --- a/drivers/scsi/qla2xxx/qla_isr.c
> +++ b/drivers/scsi/qla2xxx/qla_isr.c
> @@ -2976,6 +2976,7 @@ struct qla_init_msix_entry {
>  static struct qla_init_msix_entry msix_entries[] = {
>  	{ "qla2xxx (default)", qla24xx_msix_default },
>  	{ "qla2xxx (rsp_q)", qla24xx_msix_rsp_q },
> +	{ "qla2xxx (atio_q)", qla83xx_msix_atio_q },
>  	{ "qla2xxx (qpair_multiq)", qla2xxx_msix_rsp_q },
>  };
>  
> @@ -2984,17 +2985,10 @@ struct qla_init_msix_entry {
>  	{ "qla2xxx (rsp_q)", qla82xx_msix_rsp_q },
>  };
>  
> -static struct qla_init_msix_entry qla83xx_msix_entries[] = {
> -	{ "qla2xxx (default)", qla24xx_msix_default },
> -	{ "qla2xxx (rsp_q)", qla24xx_msix_rsp_q },
> -	{ "qla2xxx (atio_q)", qla83xx_msix_atio_q },
> -};
> -
>  static int
>  qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
>  {
>  #define MIN_MSIX_COUNT	2
> -#define ATIO_VECTOR	2
>  	int i, ret;
>  	struct qla_msix_entry *qentry;
>  	scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
> @@ -3051,7 +3045,7 @@ struct qla_init_msix_entry {
>  	}
>  
>  	/* Enable MSI-X vectors for the base queue */
> -	for (i = 0; i < 2; i++) {
> +	for (i = 0; i < (QLA_MSIX_RSP_Q + 1); i++) {
>  		qentry = &ha->msix_entries[i];
>  		qentry->handle = rsp;
>  		rsp->msix = qentry;
> @@ -3068,6 +3062,7 @@ struct qla_init_msix_entry {
>  		if (ret)
>  			goto msix_register_fail;
>  		qentry->have_irq = 1;
> +		qentry->in_use = 1;
>  
>  		/* Register for CPU affinity notification. */
>  		irq_set_affinity_notifier(qentry->vector, &qentry->irq_notify);
> @@ -3087,14 +3082,15 @@ struct qla_init_msix_entry {
>  	 * queue.
>  	 */
>  	if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) {
> -		qentry = &ha->msix_entries[ATIO_VECTOR];
> +		qentry = &ha->msix_entries[QLA_ATIO_VECTOR];
>  		rsp->msix = qentry;
>  		qentry->handle = rsp;
>  		scnprintf(qentry->name, sizeof(qentry->name),
> -		    qla83xx_msix_entries[ATIO_VECTOR].name);
> +		    msix_entries[QLA_ATIO_VECTOR].name);
> +		qentry->in_use = 1;
>  		ret = request_irq(qentry->vector,
> -			qla83xx_msix_entries[ATIO_VECTOR].handler,
> -			0, qla83xx_msix_entries[ATIO_VECTOR].name, rsp);
> +			msix_entries[QLA_ATIO_VECTOR].handler,
> +			0, msix_entries[QLA_ATIO_VECTOR].name, rsp);
>  		qentry->have_irq = 1;
>  	}
>  
> diff --git a/drivers/scsi/qla2xxx/qla_mq.c b/drivers/scsi/qla2xxx/qla_mq.c
> index a64b7b0..5543b4c 100644
> --- a/drivers/scsi/qla2xxx/qla_mq.c
> +++ b/drivers/scsi/qla2xxx/qla_mq.c
> @@ -118,7 +118,7 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos, int v
>  		qpair->vp_idx = vp_idx;
>  
>  		for (i = 0; i < ha->msix_count; i++) {
> -			msix = &ha->msix_entries[i + 2];
> +			msix = &ha->msix_entries[i];
>  			if (msix->in_use)
>  				continue;
>  			qpair->msix = msix;
> diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
> index 3371b3f..91d8e7a 100644
> --- a/drivers/scsi/qla2xxx/qla_os.c
> +++ b/drivers/scsi/qla2xxx/qla_os.c
> @@ -434,24 +434,41 @@ static void qla2x00_free_queues(struct qla_hw_data *ha)
>  	struct req_que *req;
>  	struct rsp_que *rsp;
>  	int cnt;
> +	unsigned long flags;
>  
> +	spin_lock_irqsave(&ha->hardware_lock, flags);
>  	for (cnt = 0; cnt < ha->max_req_queues; cnt++) {
>  		if (!test_bit(cnt, ha->req_qid_map))
>  			continue;
>  
>  		req = ha->req_q_map[cnt];
> +		clear_bit(cnt, ha->req_qid_map);
> +		ha->req_q_map[cnt] = NULL;
> +
> +		spin_unlock_irqrestore(&ha->hardware_lock, flags);
>  		qla2x00_free_req_que(ha, req);
> +		spin_lock_irqsave(&ha->hardware_lock, flags);
>  	}
> +	spin_unlock_irqrestore(&ha->hardware_lock, flags);
> +
>  	kfree(ha->req_q_map);
>  	ha->req_q_map = NULL;
>  
> +
> +	spin_lock_irqsave(&ha->hardware_lock, flags);
>  	for (cnt = 0; cnt < ha->max_rsp_queues; cnt++) {
>  		if (!test_bit(cnt, ha->rsp_qid_map))
>  			continue;
>  
>  		rsp = ha->rsp_q_map[cnt];
> +		clear_bit(cnt, ha->req_qid_map);
> +		ha->rsp_q_map[cnt] =  NULL;
> +		spin_unlock_irqrestore(&ha->hardware_lock, flags);
>  		qla2x00_free_rsp_que(ha, rsp);
> +		spin_lock_irqsave(&ha->hardware_lock, flags);
>  	}
> +	spin_unlock_irqrestore(&ha->hardware_lock, flags);
> +
>  	kfree(ha->rsp_q_map);
>  	ha->rsp_q_map = NULL;
>  }
> @@ -1729,17 +1746,22 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha)
>  		pci_read_config_word(ha->pdev,
>  		    QLA_83XX_PCI_MSIX_CONTROL, &msix);
>  		ha->msix_count = msix + 1;
> -		/* Max queues are bounded by available msix vectors */
> -		/* queue 0 uses two msix vectors */
> +		/*
> +		 * By default, driver uses at least two msix vectors
> +		 * (default & rspq)
> +		 */
>  		if (ql2xmqsupport) {
>  			/* MB interrupt uses 1 vector */
>  			ha->max_req_queues = ha->msix_count - 1;
>  			ha->max_rsp_queues = ha->max_req_queues;
> +
> +			/* ATIOQ needs 1 vector. That's 1 less QPair */
> +			if (QLA_TGT_MODE_ENABLED())
> +				ha->max_req_queues--;
> +
>  			/* Queue pairs is the max value minus
>  			 * the base queue pair */
>  			ha->max_qpairs = ha->max_req_queues - 1;
> -			ql_dbg_pci(ql_dbg_multiq, ha->pdev, 0xc010,
> -			    "Max no of queues pairs: %d.\n", ha->max_qpairs);
>  			ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0190,
>  			    "Max no of queues pairs: %d.\n", ha->max_qpairs);
>  		}
Just one vector for ATIO? So sad...
Can't we have full multiqueue support for target mode, too?

> @@ -1751,6 +1773,8 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha)
>  
>  mqiobase_exit:
>  	ha->msix_count = ha->max_rsp_queues + 1;
> +	if (QLA_TGT_MODE_ENABLED())
> +		ha->msix_count++;
>  
>  	qlt_83xx_iospace_config(ha);
>  
> @@ -3122,13 +3146,6 @@ static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha)
>  static void
>  qla2x00_destroy_deferred_work(struct qla_hw_data *ha)
>  {
> -	/* Flush the work queue and remove it */
> -	if (ha->wq) {
> -		flush_workqueue(ha->wq);
> -		destroy_workqueue(ha->wq);
> -		ha->wq = NULL;
> -	}
> -
>  	/* Cancel all work and destroy DPC workqueues */
>  	if (ha->dpc_lp_wq) {
>  		cancel_work_sync(&ha->idc_aen);
> @@ -3326,9 +3343,17 @@ static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha)
>  		ha->isp_ops->disable_intrs(ha);
>  	}
>  
> +	qla2x00_free_fcports(vha);
> +
>  	qla2x00_free_irqs(vha);
>  
> -	qla2x00_free_fcports(vha);
> +	/* Flush the work queue and remove it */
> +	if (ha->wq) {
> +		flush_workqueue(ha->wq);
> +		destroy_workqueue(ha->wq);
> +		ha->wq = NULL;
> +	}
> +
>  
>  	qla2x00_mem_free(ha);
>  
> @@ -5048,8 +5073,8 @@ void qla2x00_relogin(struct scsi_qla_host *vha)
>  
>  	base_vha->flags.init_done = 0;
>  	qla25xx_delete_queues(base_vha);
> -	qla2x00_free_irqs(base_vha);
>  	qla2x00_free_fcports(base_vha);
> +	qla2x00_free_irqs(base_vha);
>  	qla2x00_mem_free(ha);
>  	qla82xx_md_free(base_vha);
>  	qla2x00_free_queues(ha);
> 
Also here; please check if the irq affinity layout is correctly
(I suspect not).
You probably need to push another patch after the irq-affinity changes
from Christoph in the tip tree are merged.

But until then:

Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
Madhani, Himanshu Dec. 5, 2016, 9:06 p.m. UTC | #2
DQpPbiAxMi80LzE2LCAxMTo0MiBQTSwgIkhhbm5lcyBSZWluZWNrZSIgPGhhcmVAc3VzZS5kZT4g
d3JvdGU6DQoNCj5PbiAxMi8wMi8yMDE2IDEwOjQ0IFBNLCBIaW1hbnNodSBNYWRoYW5pIHdyb3Rl
Og0KPj4gRnJvbTogUXVpbm4gVHJhbiA8cXVpbm4udHJhbkBjYXZpdW0uY29tPg0KPj4gDQo+PiAt
IEZpeCByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGRwY190aHJlYWQgYWNjZXNzaW5nIE11bHRpcXVl
dWUgcmVzb3VyY2VzDQo+PiAgIGFuZCBxbGEyeDAwX3JlbW92ZV9vbmUgdGhyZWFkIHRyeWluZyB0
byBmcmVlIHJlc291cmNlLg0KPj4gLSBGaXggb3V0IG9mIG9yZGVyIGZyZWUgZm9yIE11bHRpcXVl
dWUgcmVzb3VyY2VzLiBBbHNvLCBNdWx0aXF1ZXVlDQo+PiAgIGludGVycnVwdHMgbmVlZHMgYSB3
b3JrcXVldWUuIEludGVycnVwdCBuZWVkZWQgdG8gc3RvcCBiZWZvcmUNCj4+ICAgdGhlIHdxIGNh
biBiZSBkZXN0cm95ZWQuDQo+PiANCj4+IFNpZ25lZC1vZmYtYnk6IFF1aW5uIFRyYW4gPHF1aW5u
LnRyYW5AY2F2aXVtLmNvbT4NCj4+IFNpZ25lZC1vZmYtYnk6IEhpbWFuc2h1IE1hZGhhbmkgPGhp
bWFuc2h1Lm1hZGhhbmlAY2F2aXVtLmNvbT4NCj4+IC0tLQ0KPj4gIGRyaXZlcnMvc2NzaS9xbGEy
eHh4L3FsYV9kZWYuaCB8ICAzICsrLQ0KPj4gIGRyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3Iu
YyB8IDIwICsrKysrKystLS0tLS0tLS0tDQo+PiAgZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21x
LmMgIHwgIDIgKy0NCj4+ICBkcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyAgfCA1MSArKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0NCj4+ICA0IGZpbGVzIGNoYW5n
ZWQsIDQ5IGluc2VydGlvbnMoKyksIDI3IGRlbGV0aW9ucygtKQ0KPj4gDQo+PiBkaWZmIC0tZ2l0
IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgv
cWxhX2RlZi5oDQo+PiBpbmRleCA2MDdkNTM5Li5lNjEzNTM1IDEwMDY0NA0KPj4gLS0tIGEvZHJp
dmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oDQo+PiArKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4
eC9xbGFfZGVmLmgNCj4+IEBAIC0yNzM0LDcgKzI3MzQsOCBAQCBzdHJ1Y3QgaXNwX29wZXJhdGlv
bnMgew0KPj4gIA0KPj4gICNkZWZpbmUgUUxBX01TSVhfREVGQVVMVAkJMHgwMA0KPj4gICNkZWZp
bmUgUUxBX01TSVhfUlNQX1EJCQkweDAxDQo+PiAtI2RlZmluZSBRTEFfTVNJWF9RUEFJUl9NVUxU
SVFfUlNQX1EJMHgwMg0KPj4gKyNkZWZpbmUgUUxBX0FUSU9fVkVDVE9SCQkweDAyDQo+PiArI2Rl
ZmluZSBRTEFfTVNJWF9RUEFJUl9NVUxUSVFfUlNQX1EJMHgwMw0KPj4gIA0KPj4gICNkZWZpbmUg
UUxBX01JRFhfREVGQVVMVAkwDQo+PiAgI2RlZmluZSBRTEFfTUlEWF9SU1BfUQkJMQ0KPj4gZGlm
ZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9x
bGEyeHh4L3FsYV9pc3IuYw0KPj4gaW5kZXggMTRmMjdhNy4uMDMzODRjZiAxMDA2NDQNCj4+IC0t
LSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYw0KPj4gKysrIGIvZHJpdmVycy9zY3Np
L3FsYTJ4eHgvcWxhX2lzci5jDQo+PiBAQCAtMjk3Niw2ICsyOTc2LDcgQEAgc3RydWN0IHFsYV9p
bml0X21zaXhfZW50cnkgew0KPj4gIHN0YXRpYyBzdHJ1Y3QgcWxhX2luaXRfbXNpeF9lbnRyeSBt
c2l4X2VudHJpZXNbXSA9IHsNCj4+ICAJeyAicWxhMnh4eCAoZGVmYXVsdCkiLCBxbGEyNHh4X21z
aXhfZGVmYXVsdCB9LA0KPj4gIAl7ICJxbGEyeHh4IChyc3BfcSkiLCBxbGEyNHh4X21zaXhfcnNw
X3EgfSwNCj4+ICsJeyAicWxhMnh4eCAoYXRpb19xKSIsIHFsYTgzeHhfbXNpeF9hdGlvX3EgfSwN
Cj4+ICAJeyAicWxhMnh4eCAocXBhaXJfbXVsdGlxKSIsIHFsYTJ4eHhfbXNpeF9yc3BfcSB9LA0K
Pj4gIH07DQo+PiAgDQo+PiBAQCAtMjk4NCwxNyArMjk4NSwxMCBAQCBzdHJ1Y3QgcWxhX2luaXRf
bXNpeF9lbnRyeSB7DQo+PiAgCXsgInFsYTJ4eHggKHJzcF9xKSIsIHFsYTgyeHhfbXNpeF9yc3Bf
cSB9LA0KPj4gIH07DQo+PiAgDQo+PiAtc3RhdGljIHN0cnVjdCBxbGFfaW5pdF9tc2l4X2VudHJ5
IHFsYTgzeHhfbXNpeF9lbnRyaWVzW10gPSB7DQo+PiAtCXsgInFsYTJ4eHggKGRlZmF1bHQpIiwg
cWxhMjR4eF9tc2l4X2RlZmF1bHQgfSwNCj4+IC0JeyAicWxhMnh4eCAocnNwX3EpIiwgcWxhMjR4
eF9tc2l4X3JzcF9xIH0sDQo+PiAtCXsgInFsYTJ4eHggKGF0aW9fcSkiLCBxbGE4M3h4X21zaXhf
YXRpb19xIH0sDQo+PiAtfTsNCj4+IC0NCj4+ICBzdGF0aWMgaW50DQo+PiAgcWxhMjR4eF9lbmFi
bGVfbXNpeChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQ0KPj4g
IHsNCj4+ICAjZGVmaW5lIE1JTl9NU0lYX0NPVU5UCTINCj4+IC0jZGVmaW5lIEFUSU9fVkVDVE9S
CTINCj4+ICAJaW50IGksIHJldDsNCj4+ICAJc3RydWN0IHFsYV9tc2l4X2VudHJ5ICpxZW50cnk7
DQo+PiAgCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsN
Cj4+IEBAIC0zMDUxLDcgKzMwNDUsNyBAQCBzdHJ1Y3QgcWxhX2luaXRfbXNpeF9lbnRyeSB7DQo+
PiAgCX0NCj4+ICANCj4+ICAJLyogRW5hYmxlIE1TSS1YIHZlY3RvcnMgZm9yIHRoZSBiYXNlIHF1
ZXVlICovDQo+PiAtCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsNCj4+ICsJZm9yIChpID0gMDsg
aSA8IChRTEFfTVNJWF9SU1BfUSArIDEpOyBpKyspIHsNCj4+ICAJCXFlbnRyeSA9ICZoYS0+bXNp
eF9lbnRyaWVzW2ldOw0KPj4gIAkJcWVudHJ5LT5oYW5kbGUgPSByc3A7DQo+PiAgCQlyc3AtPm1z
aXggPSBxZW50cnk7DQo+PiBAQCAtMzA2OCw2ICszMDYyLDcgQEAgc3RydWN0IHFsYV9pbml0X21z
aXhfZW50cnkgew0KPj4gIAkJaWYgKHJldCkNCj4+ICAJCQlnb3RvIG1zaXhfcmVnaXN0ZXJfZmFp
bDsNCj4+ICAJCXFlbnRyeS0+aGF2ZV9pcnEgPSAxOw0KPj4gKwkJcWVudHJ5LT5pbl91c2UgPSAx
Ow0KPj4gIA0KPj4gIAkJLyogUmVnaXN0ZXIgZm9yIENQVSBhZmZpbml0eSBub3RpZmljYXRpb24u
ICovDQo+PiAgCQlpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKHFlbnRyeS0+dmVjdG9yLCAmcWVu
dHJ5LT5pcnFfbm90aWZ5KTsNCj4+IEBAIC0zMDg3LDE0ICszMDgyLDE1IEBAIHN0cnVjdCBxbGFf
aW5pdF9tc2l4X2VudHJ5IHsNCj4+ICAJICogcXVldWUuDQo+PiAgCSAqLw0KPj4gIAlpZiAoUUxB
X1RHVF9NT0RFX0VOQUJMRUQoKSAmJiBJU19BVElPX01TSVhfQ0FQQUJMRShoYSkpIHsNCj4+IC0J
CXFlbnRyeSA9ICZoYS0+bXNpeF9lbnRyaWVzW0FUSU9fVkVDVE9SXTsNCj4+ICsJCXFlbnRyeSA9
ICZoYS0+bXNpeF9lbnRyaWVzW1FMQV9BVElPX1ZFQ1RPUl07DQo+PiAgCQlyc3AtPm1zaXggPSBx
ZW50cnk7DQo+PiAgCQlxZW50cnktPmhhbmRsZSA9IHJzcDsNCj4+ICAJCXNjbnByaW50ZihxZW50
cnktPm5hbWUsIHNpemVvZihxZW50cnktPm5hbWUpLA0KPj4gLQkJICAgIHFsYTgzeHhfbXNpeF9l
bnRyaWVzW0FUSU9fVkVDVE9SXS5uYW1lKTsNCj4+ICsJCSAgICBtc2l4X2VudHJpZXNbUUxBX0FU
SU9fVkVDVE9SXS5uYW1lKTsNCj4+ICsJCXFlbnRyeS0+aW5fdXNlID0gMTsNCj4+ICAJCXJldCA9
IHJlcXVlc3RfaXJxKHFlbnRyeS0+dmVjdG9yLA0KPj4gLQkJCXFsYTgzeHhfbXNpeF9lbnRyaWVz
W0FUSU9fVkVDVE9SXS5oYW5kbGVyLA0KPj4gLQkJCTAsIHFsYTgzeHhfbXNpeF9lbnRyaWVzW0FU
SU9fVkVDVE9SXS5uYW1lLCByc3ApOw0KPj4gKwkJCW1zaXhfZW50cmllc1tRTEFfQVRJT19WRUNU
T1JdLmhhbmRsZXIsDQo+PiArCQkJMCwgbXNpeF9lbnRyaWVzW1FMQV9BVElPX1ZFQ1RPUl0ubmFt
ZSwgcnNwKTsNCj4+ICAJCXFlbnRyeS0+aGF2ZV9pcnEgPSAxOw0KPj4gIAl9DQo+PiAgDQo+PiBk
aWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21xLmMgYi9kcml2ZXJzL3Njc2kv
cWxhMnh4eC9xbGFfbXEuYw0KPj4gaW5kZXggYTY0YjdiMC4uNTU0M2I0YyAxMDA2NDQNCj4+IC0t
LSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tcS5jDQo+PiArKysgYi9kcml2ZXJzL3Njc2kv
cWxhMnh4eC9xbGFfbXEuYw0KPj4gQEAgLTExOCw3ICsxMTgsNyBAQCBzdHJ1Y3QgcWxhX3FwYWly
ICpxbGEyeHh4X2NyZWF0ZV9xcGFpcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBpbnQgcW9z
LCBpbnQgdg0KPj4gIAkJcXBhaXItPnZwX2lkeCA9IHZwX2lkeDsNCj4+ICANCj4+ICAJCWZvciAo
aSA9IDA7IGkgPCBoYS0+bXNpeF9jb3VudDsgaSsrKSB7DQo+PiAtCQkJbXNpeCA9ICZoYS0+bXNp
eF9lbnRyaWVzW2kgKyAyXTsNCj4+ICsJCQltc2l4ID0gJmhhLT5tc2l4X2VudHJpZXNbaV07DQo+
PiAgCQkJaWYgKG1zaXgtPmluX3VzZSkNCj4+ICAJCQkJY29udGludWU7DQo+PiAgCQkJcXBhaXIt
Pm1zaXggPSBtc2l4Ow0KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9v
cy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMNCj4+IGluZGV4IDMzNzFiM2YuLjkx
ZDhlN2EgMTAwNjQ0DQo+PiAtLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYw0KPj4g
KysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMNCj4+IEBAIC00MzQsMjQgKzQzNCw0
MSBAQCBzdGF0aWMgdm9pZCBxbGEyeDAwX2ZyZWVfcXVldWVzKHN0cnVjdCBxbGFfaHdfZGF0YSAq
aGEpDQo+PiAgCXN0cnVjdCByZXFfcXVlICpyZXE7DQo+PiAgCXN0cnVjdCByc3BfcXVlICpyc3A7
DQo+PiAgCWludCBjbnQ7DQo+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+PiAgDQo+PiArCXNw
aW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4gIAlmb3IgKGNu
dCA9IDA7IGNudCA8IGhhLT5tYXhfcmVxX3F1ZXVlczsgY250KyspIHsNCj4+ICAJCWlmICghdGVz
dF9iaXQoY250LCBoYS0+cmVxX3FpZF9tYXApKQ0KPj4gIAkJCWNvbnRpbnVlOw0KPj4gIA0KPj4g
IAkJcmVxID0gaGEtPnJlcV9xX21hcFtjbnRdOw0KPj4gKwkJY2xlYXJfYml0KGNudCwgaGEtPnJl
cV9xaWRfbWFwKTsNCj4+ICsJCWhhLT5yZXFfcV9tYXBbY250XSA9IE5VTEw7DQo+PiArDQo+PiAr
CQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4g
IAkJcWxhMngwMF9mcmVlX3JlcV9xdWUoaGEsIHJlcSk7DQo+PiArCQlzcGluX2xvY2tfaXJxc2F2
ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsNCj4+ICAJfQ0KPj4gKwlzcGluX3VubG9ja19p
cnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4gKw0KPj4gIAlrZnJlZSho
YS0+cmVxX3FfbWFwKTsNCj4+ICAJaGEtPnJlcV9xX21hcCA9IE5VTEw7DQo+PiAgDQo+PiArDQo+
PiArCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4gIAlm
b3IgKGNudCA9IDA7IGNudCA8IGhhLT5tYXhfcnNwX3F1ZXVlczsgY250KyspIHsNCj4+ICAJCWlm
ICghdGVzdF9iaXQoY250LCBoYS0+cnNwX3FpZF9tYXApKQ0KPj4gIAkJCWNvbnRpbnVlOw0KPj4g
IA0KPj4gIAkJcnNwID0gaGEtPnJzcF9xX21hcFtjbnRdOw0KPj4gKwkJY2xlYXJfYml0KGNudCwg
aGEtPnJlcV9xaWRfbWFwKTsNCj4+ICsJCWhhLT5yc3BfcV9tYXBbY250XSA9ICBOVUxMOw0KPj4g
KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsNCj4+
ICAJCXFsYTJ4MDBfZnJlZV9yc3BfcXVlKGhhLCByc3ApOw0KPj4gKwkJc3Bpbl9sb2NrX2lycXNh
dmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7DQo+PiAgCX0NCj4+ICsJc3Bpbl91bmxvY2tf
aXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsNCj4+ICsNCj4+ICAJa2ZyZWUo
aGEtPnJzcF9xX21hcCk7DQo+PiAgCWhhLT5yc3BfcV9tYXAgPSBOVUxMOw0KPj4gIH0NCj4+IEBA
IC0xNzI5LDE3ICsxNzQ2LDIyIEBAIHVpbnQzMl90IHFsYTJ4MDBfaXNwX3JlZ19zdGF0KHN0cnVj
dCBxbGFfaHdfZGF0YSAqaGEpDQo+PiAgCQlwY2lfcmVhZF9jb25maWdfd29yZChoYS0+cGRldiwN
Cj4+ICAJCSAgICBRTEFfODNYWF9QQ0lfTVNJWF9DT05UUk9MLCAmbXNpeCk7DQo+PiAgCQloYS0+
bXNpeF9jb3VudCA9IG1zaXggKyAxOw0KPj4gLQkJLyogTWF4IHF1ZXVlcyBhcmUgYm91bmRlZCBi
eSBhdmFpbGFibGUgbXNpeCB2ZWN0b3JzICovDQo+PiAtCQkvKiBxdWV1ZSAwIHVzZXMgdHdvIG1z
aXggdmVjdG9ycyAqLw0KPj4gKwkJLyoNCj4+ICsJCSAqIEJ5IGRlZmF1bHQsIGRyaXZlciB1c2Vz
IGF0IGxlYXN0IHR3byBtc2l4IHZlY3RvcnMNCj4+ICsJCSAqIChkZWZhdWx0ICYgcnNwcSkNCj4+
ICsJCSAqLw0KPj4gIAkJaWYgKHFsMnhtcXN1cHBvcnQpIHsNCj4+ICAJCQkvKiBNQiBpbnRlcnJ1
cHQgdXNlcyAxIHZlY3RvciAqLw0KPj4gIAkJCWhhLT5tYXhfcmVxX3F1ZXVlcyA9IGhhLT5tc2l4
X2NvdW50IC0gMTsNCj4+ICAJCQloYS0+bWF4X3JzcF9xdWV1ZXMgPSBoYS0+bWF4X3JlcV9xdWV1
ZXM7DQo+PiArDQo+PiArCQkJLyogQVRJT1EgbmVlZHMgMSB2ZWN0b3IuIFRoYXQncyAxIGxlc3Mg
UVBhaXIgKi8NCj4+ICsJCQlpZiAoUUxBX1RHVF9NT0RFX0VOQUJMRUQoKSkNCj4+ICsJCQkJaGEt
Pm1heF9yZXFfcXVldWVzLS07DQo+PiArDQo+PiAgCQkJLyogUXVldWUgcGFpcnMgaXMgdGhlIG1h
eCB2YWx1ZSBtaW51cw0KPj4gIAkJCSAqIHRoZSBiYXNlIHF1ZXVlIHBhaXIgKi8NCj4+ICAJCQlo
YS0+bWF4X3FwYWlycyA9IGhhLT5tYXhfcmVxX3F1ZXVlcyAtIDE7DQo+PiAtCQkJcWxfZGJnX3Bj
aShxbF9kYmdfbXVsdGlxLCBoYS0+cGRldiwgMHhjMDEwLA0KPj4gLQkJCSAgICAiTWF4IG5vIG9m
IHF1ZXVlcyBwYWlyczogJWQuXG4iLCBoYS0+bWF4X3FwYWlycyk7DQo+PiAgCQkJcWxfZGJnX3Bj
aShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDE5MCwNCj4+ICAJCQkgICAgIk1heCBubyBvZiBx
dWV1ZXMgcGFpcnM6ICVkLlxuIiwgaGEtPm1heF9xcGFpcnMpOw0KPj4gIAkJfQ0KPkp1c3Qgb25l
IHZlY3RvciBmb3IgQVRJTz8gU28gc2FkLi4uDQo+Q2FuJ3Qgd2UgaGF2ZSBmdWxsIG11bHRpcXVl
dWUgc3VwcG9ydCBmb3IgdGFyZ2V0IG1vZGUsIHRvbz8NCg0KV2Ugd2lsbCBiZSB3b3JraW5nIG9u
IHRoZSB0YXJnZXQgbXVsdGkgcXVldWUgY2hhbmdlcyBzaG9ydGx5LiBPbmNlIHBhdGNoZXMgYXJl
IHJlYWR5IHdl4oCZbGwgcG9zdCBpdCBmb3IgcmV2aWV3LiANCg0KPg0KPj4gQEAgLTE3NTEsNiAr
MTc3Myw4IEBAIHVpbnQzMl90IHFsYTJ4MDBfaXNwX3JlZ19zdGF0KHN0cnVjdCBxbGFfaHdfZGF0
YSAqaGEpDQo+PiAgDQo+PiAgbXFpb2Jhc2VfZXhpdDoNCj4+ICAJaGEtPm1zaXhfY291bnQgPSBo
YS0+bWF4X3JzcF9xdWV1ZXMgKyAxOw0KPj4gKwlpZiAoUUxBX1RHVF9NT0RFX0VOQUJMRUQoKSkN
Cj4+ICsJCWhhLT5tc2l4X2NvdW50Kys7DQo+PiAgDQo+PiAgCXFsdF84M3h4X2lvc3BhY2VfY29u
ZmlnKGhhKTsNCj4+ICANCj4+IEBAIC0zMTIyLDEzICszMTQ2LDYgQEAgc3RhdGljIHZvaWQgcWxh
MngwMF9kZXN0cm95X21ieF93cShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQ0KPj4gIHN0YXRpYyB2
b2lkDQo+PiAgcWxhMngwMF9kZXN0cm95X2RlZmVycmVkX3dvcmsoc3RydWN0IHFsYV9od19kYXRh
ICpoYSkNCj4+ICB7DQo+PiAtCS8qIEZsdXNoIHRoZSB3b3JrIHF1ZXVlIGFuZCByZW1vdmUgaXQg
Ki8NCj4+IC0JaWYgKGhhLT53cSkgew0KPj4gLQkJZmx1c2hfd29ya3F1ZXVlKGhhLT53cSk7DQo+
PiAtCQlkZXN0cm95X3dvcmtxdWV1ZShoYS0+d3EpOw0KPj4gLQkJaGEtPndxID0gTlVMTDsNCj4+
IC0JfQ0KPj4gLQ0KPj4gIAkvKiBDYW5jZWwgYWxsIHdvcmsgYW5kIGRlc3Ryb3kgRFBDIHdvcmtx
dWV1ZXMgKi8NCj4+ICAJaWYgKGhhLT5kcGNfbHBfd3EpIHsNCj4+ICAJCWNhbmNlbF93b3JrX3N5
bmMoJmhhLT5pZGNfYWVuKTsNCj4+IEBAIC0zMzI2LDkgKzMzNDMsMTcgQEAgc3RhdGljIHZvaWQg
cWxhMngwMF9kZXN0cm95X21ieF93cShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQ0KPj4gIAkJaGEt
PmlzcF9vcHMtPmRpc2FibGVfaW50cnMoaGEpOw0KPj4gIAl9DQo+PiAgDQo+PiArCXFsYTJ4MDBf
ZnJlZV9mY3BvcnRzKHZoYSk7DQo+PiArDQo+PiAgCXFsYTJ4MDBfZnJlZV9pcnFzKHZoYSk7DQo+
PiAgDQo+PiAtCXFsYTJ4MDBfZnJlZV9mY3BvcnRzKHZoYSk7DQo+PiArCS8qIEZsdXNoIHRoZSB3
b3JrIHF1ZXVlIGFuZCByZW1vdmUgaXQgKi8NCj4+ICsJaWYgKGhhLT53cSkgew0KPj4gKwkJZmx1
c2hfd29ya3F1ZXVlKGhhLT53cSk7DQo+PiArCQlkZXN0cm95X3dvcmtxdWV1ZShoYS0+d3EpOw0K
Pj4gKwkJaGEtPndxID0gTlVMTDsNCj4+ICsJfQ0KPj4gKw0KPj4gIA0KPj4gIAlxbGEyeDAwX21l
bV9mcmVlKGhhKTsNCj4+ICANCj4+IEBAIC01MDQ4LDggKzUwNzMsOCBAQCB2b2lkIHFsYTJ4MDBf
cmVsb2dpbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQ0KPj4gIA0KPj4gIAliYXNlX3ZoYS0+
ZmxhZ3MuaW5pdF9kb25lID0gMDsNCj4+ICAJcWxhMjV4eF9kZWxldGVfcXVldWVzKGJhc2Vfdmhh
KTsNCj4+IC0JcWxhMngwMF9mcmVlX2lycXMoYmFzZV92aGEpOw0KPj4gIAlxbGEyeDAwX2ZyZWVf
ZmNwb3J0cyhiYXNlX3ZoYSk7DQo+PiArCXFsYTJ4MDBfZnJlZV9pcnFzKGJhc2VfdmhhKTsNCj4+
ICAJcWxhMngwMF9tZW1fZnJlZShoYSk7DQo+PiAgCXFsYTgyeHhfbWRfZnJlZShiYXNlX3ZoYSk7
DQo+PiAgCXFsYTJ4MDBfZnJlZV9xdWV1ZXMoaGEpOw0KPj4gDQo+QWxzbyBoZXJlOyBwbGVhc2Ug
Y2hlY2sgaWYgdGhlIGlycSBhZmZpbml0eSBsYXlvdXQgaXMgY29ycmVjdGx5DQo+KEkgc3VzcGVj
dCBub3QpLg0KPllvdSBwcm9iYWJseSBuZWVkIHRvIHB1c2ggYW5vdGhlciBwYXRjaCBhZnRlciB0
aGUgaXJxLWFmZmluaXR5IGNoYW5nZXMNCj5mcm9tIENocmlzdG9waCBpbiB0aGUgdGlwIHRyZWUg
YXJlIG1lcmdlZC4NCj4NCj5CdXQgdW50aWwgdGhlbjoNCj4NCj5SZXZpZXdlZC1ieTogSGFubmVz
IFJlaW5lY2tlIDxoYXJlQHN1c2UuY29tPg0KDQpUaGFua3MgZm9yIHRoZSByZXZpZXcuIA0KWWVz
LCBXZeKAmWxsIHN1Ym1pdCBjaGFuZ2VzIG9uY2UgQ2hyaXN0b3Bo4oCZcyBwYXRjaCBzZXJpZXMg
aXMgbWVyZ2VkLiANCg0KPg0KPkNoZWVycywNCj4NCj5IYW5uZXMNCj4tLSANCj5Eci4gSGFubmVz
IFJlaW5lY2tlCQkgICBUZWFtbGVhZCBTdG9yYWdlICYgTmV0d29ya2luZw0KPmhhcmVAc3VzZS5k
ZQkJCSAgICAgICAgICAgICAgICs0OSA5MTEgNzQwNTMgNjg4DQo+U1VTRSBMSU5VWCBHbWJILCBN
YXhmZWxkc3RyLiA1LCA5MDQwOSBOw7xybmJlcmcNCj5HRjogRi4gSW1lbmTDtnJmZmVyLCBKLiBT
bWl0aGFyZCwgSi4gR3VpbGQsIEQuIFVwbWFueXUsIEcuIE5vcnRvbg0KPkhSQiAyMTI4NCAoQUcg
TsO8cm5iZXJnKQ0K
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 607d539..e613535 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2734,7 +2734,8 @@  struct isp_operations {
 
 #define QLA_MSIX_DEFAULT		0x00
 #define QLA_MSIX_RSP_Q			0x01
-#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q	0x02
+#define QLA_ATIO_VECTOR		0x02
+#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q	0x03
 
 #define QLA_MIDX_DEFAULT	0
 #define QLA_MIDX_RSP_Q		1
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 14f27a7..03384cf 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -2976,6 +2976,7 @@  struct qla_init_msix_entry {
 static struct qla_init_msix_entry msix_entries[] = {
 	{ "qla2xxx (default)", qla24xx_msix_default },
 	{ "qla2xxx (rsp_q)", qla24xx_msix_rsp_q },
+	{ "qla2xxx (atio_q)", qla83xx_msix_atio_q },
 	{ "qla2xxx (qpair_multiq)", qla2xxx_msix_rsp_q },
 };
 
@@ -2984,17 +2985,10 @@  struct qla_init_msix_entry {
 	{ "qla2xxx (rsp_q)", qla82xx_msix_rsp_q },
 };
 
-static struct qla_init_msix_entry qla83xx_msix_entries[] = {
-	{ "qla2xxx (default)", qla24xx_msix_default },
-	{ "qla2xxx (rsp_q)", qla24xx_msix_rsp_q },
-	{ "qla2xxx (atio_q)", qla83xx_msix_atio_q },
-};
-
 static int
 qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
 {
 #define MIN_MSIX_COUNT	2
-#define ATIO_VECTOR	2
 	int i, ret;
 	struct qla_msix_entry *qentry;
 	scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
@@ -3051,7 +3045,7 @@  struct qla_init_msix_entry {
 	}
 
 	/* Enable MSI-X vectors for the base queue */
-	for (i = 0; i < 2; i++) {
+	for (i = 0; i < (QLA_MSIX_RSP_Q + 1); i++) {
 		qentry = &ha->msix_entries[i];
 		qentry->handle = rsp;
 		rsp->msix = qentry;
@@ -3068,6 +3062,7 @@  struct qla_init_msix_entry {
 		if (ret)
 			goto msix_register_fail;
 		qentry->have_irq = 1;
+		qentry->in_use = 1;
 
 		/* Register for CPU affinity notification. */
 		irq_set_affinity_notifier(qentry->vector, &qentry->irq_notify);
@@ -3087,14 +3082,15 @@  struct qla_init_msix_entry {
 	 * queue.
 	 */
 	if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) {
-		qentry = &ha->msix_entries[ATIO_VECTOR];
+		qentry = &ha->msix_entries[QLA_ATIO_VECTOR];
 		rsp->msix = qentry;
 		qentry->handle = rsp;
 		scnprintf(qentry->name, sizeof(qentry->name),
-		    qla83xx_msix_entries[ATIO_VECTOR].name);
+		    msix_entries[QLA_ATIO_VECTOR].name);
+		qentry->in_use = 1;
 		ret = request_irq(qentry->vector,
-			qla83xx_msix_entries[ATIO_VECTOR].handler,
-			0, qla83xx_msix_entries[ATIO_VECTOR].name, rsp);
+			msix_entries[QLA_ATIO_VECTOR].handler,
+			0, msix_entries[QLA_ATIO_VECTOR].name, rsp);
 		qentry->have_irq = 1;
 	}
 
diff --git a/drivers/scsi/qla2xxx/qla_mq.c b/drivers/scsi/qla2xxx/qla_mq.c
index a64b7b0..5543b4c 100644
--- a/drivers/scsi/qla2xxx/qla_mq.c
+++ b/drivers/scsi/qla2xxx/qla_mq.c
@@ -118,7 +118,7 @@  struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos, int v
 		qpair->vp_idx = vp_idx;
 
 		for (i = 0; i < ha->msix_count; i++) {
-			msix = &ha->msix_entries[i + 2];
+			msix = &ha->msix_entries[i];
 			if (msix->in_use)
 				continue;
 			qpair->msix = msix;
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 3371b3f..91d8e7a 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -434,24 +434,41 @@  static void qla2x00_free_queues(struct qla_hw_data *ha)
 	struct req_que *req;
 	struct rsp_que *rsp;
 	int cnt;
+	unsigned long flags;
 
+	spin_lock_irqsave(&ha->hardware_lock, flags);
 	for (cnt = 0; cnt < ha->max_req_queues; cnt++) {
 		if (!test_bit(cnt, ha->req_qid_map))
 			continue;
 
 		req = ha->req_q_map[cnt];
+		clear_bit(cnt, ha->req_qid_map);
+		ha->req_q_map[cnt] = NULL;
+
+		spin_unlock_irqrestore(&ha->hardware_lock, flags);
 		qla2x00_free_req_que(ha, req);
+		spin_lock_irqsave(&ha->hardware_lock, flags);
 	}
+	spin_unlock_irqrestore(&ha->hardware_lock, flags);
+
 	kfree(ha->req_q_map);
 	ha->req_q_map = NULL;
 
+
+	spin_lock_irqsave(&ha->hardware_lock, flags);
 	for (cnt = 0; cnt < ha->max_rsp_queues; cnt++) {
 		if (!test_bit(cnt, ha->rsp_qid_map))
 			continue;
 
 		rsp = ha->rsp_q_map[cnt];
+		clear_bit(cnt, ha->req_qid_map);
+		ha->rsp_q_map[cnt] =  NULL;
+		spin_unlock_irqrestore(&ha->hardware_lock, flags);
 		qla2x00_free_rsp_que(ha, rsp);
+		spin_lock_irqsave(&ha->hardware_lock, flags);
 	}
+	spin_unlock_irqrestore(&ha->hardware_lock, flags);
+
 	kfree(ha->rsp_q_map);
 	ha->rsp_q_map = NULL;
 }
@@ -1729,17 +1746,22 @@  uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha)
 		pci_read_config_word(ha->pdev,
 		    QLA_83XX_PCI_MSIX_CONTROL, &msix);
 		ha->msix_count = msix + 1;
-		/* Max queues are bounded by available msix vectors */
-		/* queue 0 uses two msix vectors */
+		/*
+		 * By default, driver uses at least two msix vectors
+		 * (default & rspq)
+		 */
 		if (ql2xmqsupport) {
 			/* MB interrupt uses 1 vector */
 			ha->max_req_queues = ha->msix_count - 1;
 			ha->max_rsp_queues = ha->max_req_queues;
+
+			/* ATIOQ needs 1 vector. That's 1 less QPair */
+			if (QLA_TGT_MODE_ENABLED())
+				ha->max_req_queues--;
+
 			/* Queue pairs is the max value minus
 			 * the base queue pair */
 			ha->max_qpairs = ha->max_req_queues - 1;
-			ql_dbg_pci(ql_dbg_multiq, ha->pdev, 0xc010,
-			    "Max no of queues pairs: %d.\n", ha->max_qpairs);
 			ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0190,
 			    "Max no of queues pairs: %d.\n", ha->max_qpairs);
 		}
@@ -1751,6 +1773,8 @@  uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha)
 
 mqiobase_exit:
 	ha->msix_count = ha->max_rsp_queues + 1;
+	if (QLA_TGT_MODE_ENABLED())
+		ha->msix_count++;
 
 	qlt_83xx_iospace_config(ha);
 
@@ -3122,13 +3146,6 @@  static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha)
 static void
 qla2x00_destroy_deferred_work(struct qla_hw_data *ha)
 {
-	/* Flush the work queue and remove it */
-	if (ha->wq) {
-		flush_workqueue(ha->wq);
-		destroy_workqueue(ha->wq);
-		ha->wq = NULL;
-	}
-
 	/* Cancel all work and destroy DPC workqueues */
 	if (ha->dpc_lp_wq) {
 		cancel_work_sync(&ha->idc_aen);
@@ -3326,9 +3343,17 @@  static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha)
 		ha->isp_ops->disable_intrs(ha);
 	}
 
+	qla2x00_free_fcports(vha);
+
 	qla2x00_free_irqs(vha);
 
-	qla2x00_free_fcports(vha);
+	/* Flush the work queue and remove it */
+	if (ha->wq) {
+		flush_workqueue(ha->wq);
+		destroy_workqueue(ha->wq);
+		ha->wq = NULL;
+	}
+
 
 	qla2x00_mem_free(ha);
 
@@ -5048,8 +5073,8 @@  void qla2x00_relogin(struct scsi_qla_host *vha)
 
 	base_vha->flags.init_done = 0;
 	qla25xx_delete_queues(base_vha);
-	qla2x00_free_irqs(base_vha);
 	qla2x00_free_fcports(base_vha);
+	qla2x00_free_irqs(base_vha);
 	qla2x00_mem_free(ha);
 	qla82xx_md_free(base_vha);
 	qla2x00_free_queues(ha);