|
@@ -769,7 +769,7 @@ static irqreturn_t be_isr_mcc(int irq, void *dev_id)
|
|
|
resource_id) / 32] &
|
|
|
EQE_RESID_MASK) >> 16) == mcc->id) {
|
|
|
spin_lock_irqsave(&phba->isr_lock, flags);
|
|
|
- phba->todo_mcc_cq = 1;
|
|
|
+ pbe_eq->todo_mcc_cq = true;
|
|
|
spin_unlock_irqrestore(&phba->isr_lock, flags);
|
|
|
}
|
|
|
AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
|
|
@@ -777,8 +777,8 @@ static irqreturn_t be_isr_mcc(int irq, void *dev_id)
|
|
|
eqe = queue_tail_node(eq);
|
|
|
num_eq_processed++;
|
|
|
}
|
|
|
- if (phba->todo_mcc_cq)
|
|
|
- queue_work(phba->wq, &phba->work_cqs);
|
|
|
+ if (pbe_eq->todo_mcc_cq)
|
|
|
+ queue_work(phba->wq, &pbe_eq->work_cqs);
|
|
|
if (num_eq_processed)
|
|
|
hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 1, 1);
|
|
|
|
|
@@ -818,29 +818,26 @@ static irqreturn_t be_isr_msix(int irq, void *dev_id)
|
|
|
eqe = queue_tail_node(eq);
|
|
|
num_eq_processed++;
|
|
|
}
|
|
|
- if (num_eq_processed)
|
|
|
- hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 0, 1);
|
|
|
-
|
|
|
- return IRQ_HANDLED;
|
|
|
} else {
|
|
|
while (eqe->dw[offsetof(struct amap_eq_entry, valid) / 32]
|
|
|
& EQE_VALID_MASK) {
|
|
|
spin_lock_irqsave(&phba->isr_lock, flags);
|
|
|
- phba->todo_cq = 1;
|
|
|
+ pbe_eq->todo_cq = true;
|
|
|
spin_unlock_irqrestore(&phba->isr_lock, flags);
|
|
|
AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
|
|
|
queue_tail_inc(eq);
|
|
|
eqe = queue_tail_node(eq);
|
|
|
num_eq_processed++;
|
|
|
}
|
|
|
- if (phba->todo_cq)
|
|
|
- queue_work(phba->wq, &phba->work_cqs);
|
|
|
-
|
|
|
- if (num_eq_processed)
|
|
|
- hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 1, 1);
|
|
|
|
|
|
- return IRQ_HANDLED;
|
|
|
+ if (pbe_eq->todo_cq)
|
|
|
+ queue_work(phba->wq, &pbe_eq->work_cqs);
|
|
|
}
|
|
|
+
|
|
|
+ if (num_eq_processed)
|
|
|
+ hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 0, 1);
|
|
|
+
|
|
|
+ return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -888,7 +885,7 @@ static irqreturn_t be_isr(int irq, void *dev_id)
|
|
|
resource_id) / 32] &
|
|
|
EQE_RESID_MASK) >> 16) == mcc->id) {
|
|
|
spin_lock_irqsave(&phba->isr_lock, flags);
|
|
|
- phba->todo_mcc_cq = 1;
|
|
|
+ pbe_eq->todo_mcc_cq = true;
|
|
|
spin_unlock_irqrestore(&phba->isr_lock, flags);
|
|
|
num_mcceq_processed++;
|
|
|
} else {
|
|
@@ -901,8 +898,8 @@ static irqreturn_t be_isr(int irq, void *dev_id)
|
|
|
eqe = queue_tail_node(eq);
|
|
|
}
|
|
|
if (num_ioeq_processed || num_mcceq_processed) {
|
|
|
- if (phba->todo_mcc_cq)
|
|
|
- queue_work(phba->wq, &phba->work_cqs);
|
|
|
+ if (pbe_eq->todo_mcc_cq)
|
|
|
+ queue_work(phba->wq, &pbe_eq->work_cqs);
|
|
|
|
|
|
if ((num_mcceq_processed) && (!num_ioeq_processed))
|
|
|
hwi_ring_eq_db(phba, eq->id, 0,
|
|
@@ -925,11 +922,11 @@ static irqreturn_t be_isr(int irq, void *dev_id)
|
|
|
resource_id) / 32] &
|
|
|
EQE_RESID_MASK) >> 16) != cq->id) {
|
|
|
spin_lock_irqsave(&phba->isr_lock, flags);
|
|
|
- phba->todo_mcc_cq = 1;
|
|
|
+ pbe_eq->todo_mcc_cq = true;
|
|
|
spin_unlock_irqrestore(&phba->isr_lock, flags);
|
|
|
} else {
|
|
|
spin_lock_irqsave(&phba->isr_lock, flags);
|
|
|
- phba->todo_cq = 1;
|
|
|
+ pbe_eq->todo_cq = true;
|
|
|
spin_unlock_irqrestore(&phba->isr_lock, flags);
|
|
|
}
|
|
|
AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
|
|
@@ -937,8 +934,8 @@ static irqreturn_t be_isr(int irq, void *dev_id)
|
|
|
eqe = queue_tail_node(eq);
|
|
|
num_ioeq_processed++;
|
|
|
}
|
|
|
- if (phba->todo_cq || phba->todo_mcc_cq)
|
|
|
- queue_work(phba->wq, &phba->work_cqs);
|
|
|
+ if (pbe_eq->todo_cq || pbe_eq->todo_mcc_cq)
|
|
|
+ queue_work(phba->wq, &pbe_eq->work_cqs);
|
|
|
|
|
|
if (num_ioeq_processed) {
|
|
|
hwi_ring_eq_db(phba, eq->id, 0,
|
|
@@ -2108,30 +2105,30 @@ void beiscsi_process_all_cqs(struct work_struct *work)
|
|
|
unsigned long flags;
|
|
|
struct hwi_controller *phwi_ctrlr;
|
|
|
struct hwi_context_memory *phwi_context;
|
|
|
- struct be_eq_obj *pbe_eq;
|
|
|
- struct beiscsi_hba *phba =
|
|
|
- container_of(work, struct beiscsi_hba, work_cqs);
|
|
|
+ struct beiscsi_hba *phba;
|
|
|
+ struct be_eq_obj *pbe_eq =
|
|
|
+ container_of(work, struct be_eq_obj, work_cqs);
|
|
|
|
|
|
+ phba = pbe_eq->phba;
|
|
|
phwi_ctrlr = phba->phwi_ctrlr;
|
|
|
phwi_context = phwi_ctrlr->phwi_ctxt;
|
|
|
- if (phba->msix_enabled)
|
|
|
- pbe_eq = &phwi_context->be_eq[phba->num_cpus];
|
|
|
- else
|
|
|
- pbe_eq = &phwi_context->be_eq[0];
|
|
|
|
|
|
- if (phba->todo_mcc_cq) {
|
|
|
+ if (pbe_eq->todo_mcc_cq) {
|
|
|
spin_lock_irqsave(&phba->isr_lock, flags);
|
|
|
- phba->todo_mcc_cq = 0;
|
|
|
+ pbe_eq->todo_mcc_cq = false;
|
|
|
spin_unlock_irqrestore(&phba->isr_lock, flags);
|
|
|
beiscsi_process_mcc_isr(phba);
|
|
|
}
|
|
|
|
|
|
- if (phba->todo_cq) {
|
|
|
+ if (pbe_eq->todo_cq) {
|
|
|
spin_lock_irqsave(&phba->isr_lock, flags);
|
|
|
- phba->todo_cq = 0;
|
|
|
+ pbe_eq->todo_cq = false;
|
|
|
spin_unlock_irqrestore(&phba->isr_lock, flags);
|
|
|
beiscsi_process_cq(pbe_eq);
|
|
|
}
|
|
|
+
|
|
|
+ /* rearm EQ for further interrupts */
|
|
|
+ hwi_ring_eq_db(phba, pbe_eq->q.id, 0, 0, 1, 1);
|
|
|
}
|
|
|
|
|
|
static int be_iopoll(struct blk_iopoll *iop, int budget)
|
|
@@ -4642,7 +4639,7 @@ static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev,
|
|
|
|
|
|
phba->ctrl.mcc_alloc_index = phba->ctrl.mcc_free_index = 0;
|
|
|
|
|
|
- snprintf(phba->wq_name, sizeof(phba->wq_name), "beiscsi_q_irq%u",
|
|
|
+ snprintf(phba->wq_name, sizeof(phba->wq_name), "beiscsi_%02x_wq",
|
|
|
phba->shost->host_no);
|
|
|
phba->wq = alloc_workqueue(phba->wq_name, WQ_MEM_RECLAIM, 1);
|
|
|
if (!phba->wq) {
|
|
@@ -4652,10 +4649,10 @@ static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev,
|
|
|
goto free_twq;
|
|
|
}
|
|
|
|
|
|
- INIT_WORK(&phba->work_cqs, beiscsi_process_all_cqs);
|
|
|
|
|
|
phwi_ctrlr = phba->phwi_ctrlr;
|
|
|
phwi_context = phwi_ctrlr->phwi_ctxt;
|
|
|
+
|
|
|
if (blk_iopoll_enabled) {
|
|
|
for (i = 0; i < phba->num_cpus; i++) {
|
|
|
pbe_eq = &phwi_context->be_eq[i];
|
|
@@ -4663,7 +4660,25 @@ static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev,
|
|
|
be_iopoll);
|
|
|
blk_iopoll_enable(&pbe_eq->iopoll);
|
|
|
}
|
|
|
+
|
|
|
+ i = (phba->msix_enabled) ? i : 0;
|
|
|
+ /* Work item for MCC handling */
|
|
|
+ pbe_eq = &phwi_context->be_eq[i];
|
|
|
+ INIT_WORK(&pbe_eq->work_cqs, beiscsi_process_all_cqs);
|
|
|
+ } else {
|
|
|
+ if (phba->msix_enabled) {
|
|
|
+ for (i = 0; i <= phba->num_cpus; i++) {
|
|
|
+ pbe_eq = &phwi_context->be_eq[i];
|
|
|
+ INIT_WORK(&pbe_eq->work_cqs,
|
|
|
+ beiscsi_process_all_cqs);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ pbe_eq = &phwi_context->be_eq[0];
|
|
|
+ INIT_WORK(&pbe_eq->work_cqs,
|
|
|
+ beiscsi_process_all_cqs);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
ret = beiscsi_init_irqs(phba);
|
|
|
if (ret < 0) {
|
|
|
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
|