Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[sfrench/cifs-2.6.git] / drivers / scsi / be2iscsi / be_main.c
index d8bd6f2c9c830a837e76b2dabddb3f915afc4943..be96aa1e507722da1665f967027b0fb5a16e48e4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017 Broadcom. All Rights Reserved.
+ * Copyright 2017 Broadcom. All Rights Reserved.
  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
  *
  * This program is free software; you can redistribute it and/or
@@ -455,14 +455,12 @@ static int beiscsi_map_pci_bars(struct beiscsi_hba *phba,
                return -ENOMEM;
        phba->ctrl.csr = addr;
        phba->csr_va = addr;
-       phba->csr_pa.u.a64.address = pci_resource_start(pcidev, 2);
 
        addr = ioremap_nocache(pci_resource_start(pcidev, 4), 128 * 1024);
        if (addr == NULL)
                goto pci_map_err;
        phba->ctrl.db = addr;
        phba->db_va = addr;
-       phba->db_pa.u.a64.address =  pci_resource_start(pcidev, 4);
 
        if (phba->generation == BE_GEN2)
                pcicfg_reg = 1;
@@ -476,7 +474,6 @@ static int beiscsi_map_pci_bars(struct beiscsi_hba *phba,
                goto pci_map_err;
        phba->ctrl.pcicfg = addr;
        phba->pci_va = addr;
-       phba->pci_pa.u.a64.address = pci_resource_start(pcidev, pcicfg_reg);
        return 0;
 
 pci_map_err:
@@ -790,6 +787,24 @@ static irqreturn_t be_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static void beiscsi_free_irqs(struct beiscsi_hba *phba)
+{
+       struct hwi_context_memory *phwi_context;
+       int i;
+
+       if (!phba->pcidev->msix_enabled) {
+               if (phba->pcidev->irq)
+                       free_irq(phba->pcidev->irq, phba);
+               return;
+       }
+
+       phwi_context = phba->phwi_ctrlr->phwi_ctxt;
+       for (i = 0; i <= phba->num_cpus; i++) {
+               free_irq(pci_irq_vector(phba->pcidev, i),
+                        &phwi_context->be_eq[i]);
+               kfree(phba->msi_name[i]);
+       }
+}
 
 static int beiscsi_init_irqs(struct beiscsi_hba *phba)
 {
@@ -803,15 +818,14 @@ static int beiscsi_init_irqs(struct beiscsi_hba *phba)
 
        if (pcidev->msix_enabled) {
                for (i = 0; i < phba->num_cpus; i++) {
-                       phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME,
-                                                   GFP_KERNEL);
+                       phba->msi_name[i] = kasprintf(GFP_KERNEL,
+                                                     "beiscsi_%02x_%02x",
+                                                     phba->shost->host_no, i);
                        if (!phba->msi_name[i]) {
                                ret = -ENOMEM;
                                goto free_msix_irqs;
                        }
 
-                       sprintf(phba->msi_name[i], "beiscsi_%02x_%02x",
-                               phba->shost->host_no, i);
                        ret = request_irq(pci_irq_vector(pcidev, i),
                                          be_isr_msix, 0, phba->msi_name[i],
                                          &phwi_context->be_eq[i]);
@@ -824,13 +838,12 @@ static int beiscsi_init_irqs(struct beiscsi_hba *phba)
                                goto free_msix_irqs;
                        }
                }
-               phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME, GFP_KERNEL);
+               phba->msi_name[i] = kasprintf(GFP_KERNEL, "beiscsi_mcc_%02x",
+                                             phba->shost->host_no);
                if (!phba->msi_name[i]) {
                        ret = -ENOMEM;
                        goto free_msix_irqs;
                }
-               sprintf(phba->msi_name[i], "beiscsi_mcc_%02x",
-                       phba->shost->host_no);
                ret = request_irq(pci_irq_vector(pcidev, i), be_isr_mcc, 0,
                                  phba->msi_name[i], &phwi_context->be_eq[i]);
                if (ret) {
@@ -924,12 +937,11 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
                 * this can happen if clean_task is called on a task that
                 * failed in xmit_task or alloc_pdu.
                 */
-                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
-                            "BM_%d : Double Free in IO SGL io_sgl_free_index=%d,"
-                            "value there=%p\n", phba->io_sgl_free_index,
-                            phba->io_sgl_hndl_base
-                            [phba->io_sgl_free_index]);
-                spin_unlock_irqrestore(&phba->io_sgl_lock, flags);
+               beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
+                           "BM_%d : Double Free in IO SGL io_sgl_free_index=%d, value there=%p\n",
+                           phba->io_sgl_free_index,
+                           phba->io_sgl_hndl_base[phba->io_sgl_free_index]);
+               spin_unlock_irqrestore(&phba->io_sgl_lock, flags);
                return;
        }
        phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle;
@@ -1864,8 +1876,8 @@ unsigned int beiscsi_process_cq(struct be_eq_obj *pbe_eq, int budget)
 
                be_dws_le_to_cpu(sol, sizeof(struct sol_cqe));
 
-                code = (sol->dw[offsetof(struct amap_sol_cqe, code) /
-                        32] & CQE_CODE_MASK);
+               code = (sol->dw[offsetof(struct amap_sol_cqe, code) / 32] &
+                               CQE_CODE_MASK);
 
                 /* Get the CID */
                if (is_chip_be2_be3r(phba)) {
@@ -3024,7 +3036,7 @@ static int beiscsi_create_eqs(struct beiscsi_hba *phba,
 
                mem->dma = paddr;
                ret = beiscsi_cmd_eq_create(&phba->ctrl, eq,
-                                           phwi_context->cur_eqd);
+                                           BEISCSI_EQ_DELAY_DEF);
                if (ret) {
                        beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
                                    "BM_%d : beiscsi_cmd_eq_create"
@@ -3508,13 +3520,14 @@ static int be_mcc_queues_create(struct beiscsi_hba *phba,
                goto err;
        /* Ask BE to create MCC compl queue; */
        if (phba->pcidev->msix_enabled) {
-               if (beiscsi_cmd_cq_create(ctrl, cq, &phwi_context->be_eq
-                                        [phba->num_cpus].q, false, true, 0))
-               goto mcc_cq_free;
+               if (beiscsi_cmd_cq_create(ctrl, cq,
+                                       &phwi_context->be_eq[phba->num_cpus].q,
+                                       false, true, 0))
+                       goto mcc_cq_free;
        } else {
                if (beiscsi_cmd_cq_create(ctrl, cq, &phwi_context->be_eq[0].q,
                                          false, true, 0))
-               goto mcc_cq_free;
+                       goto mcc_cq_free;
        }
 
        /* Alloc MCC queue */
@@ -3689,9 +3702,6 @@ static int hwi_init_port(struct beiscsi_hba *phba)
 
        phwi_ctrlr = phba->phwi_ctrlr;
        phwi_context = phwi_ctrlr->phwi_ctxt;
-       phwi_context->max_eqd = 128;
-       phwi_context->min_eqd = 0;
-       phwi_context->cur_eqd = 32;
        /* set port optic state to unknown */
        phba->optic_state = 0xff;
 
@@ -4792,10 +4802,10 @@ static int beiscsi_task_xmit(struct iscsi_task *task)
        sg = scsi_sglist(sc);
        if (sc->sc_data_direction == DMA_TO_DEVICE)
                writedir = 1;
-        else
+       else
                writedir = 0;
 
-        return phba->iotask_fn(task, sg, num_sg, xferlen, writedir);
+       return phba->iotask_fn(task, sg, num_sg, xferlen, writedir);
 }
 
 /**
@@ -4917,6 +4927,13 @@ void beiscsi_start_boot_work(struct beiscsi_hba *phba, unsigned int s_handle)
        schedule_work(&phba->boot_work);
 }
 
+/**
+ * Boot flag info for iscsi-utilities
+ * Bit 0 Block valid flag
+ * Bit 1 Firmware booting selected
+ */
+#define BEISCSI_SYSFS_ISCSI_BOOT_FLAGS 3
+
 static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf)
 {
        struct beiscsi_hba *phba = data;
@@ -4972,7 +4989,7 @@ static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf)
                             auth_data.chap.intr_secret);
                break;
        case ISCSI_BOOT_TGT_FLAGS:
-               rc = sprintf(str, "2\n");
+               rc = sprintf(str, "%d\n", BEISCSI_SYSFS_ISCSI_BOOT_FLAGS);
                break;
        case ISCSI_BOOT_TGT_NIC_ASSOC:
                rc = sprintf(str, "0\n");
@@ -5004,7 +5021,7 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf)
 
        switch (type) {
        case ISCSI_BOOT_ETH_FLAGS:
-               rc = sprintf(str, "2\n");
+               rc = sprintf(str, "%d\n", BEISCSI_SYSFS_ISCSI_BOOT_FLAGS);
                break;
        case ISCSI_BOOT_ETH_INDEX:
                rc = sprintf(str, "0\n");
@@ -5209,8 +5226,8 @@ static void beiscsi_eqd_update_work(struct work_struct *work)
 
                if (eqd < 8)
                        eqd = 0;
-               eqd = min_t(u32, eqd, phwi_context->max_eqd);
-               eqd = max_t(u32, eqd, phwi_context->min_eqd);
+               eqd = min_t(u32, eqd, BEISCSI_EQ_DELAY_MAX);
+               eqd = max_t(u32, eqd, BEISCSI_EQ_DELAY_MIN);
 
                aic->jiffies = now;
                aic->eq_prev = pbe_eq->cq_count;
@@ -5298,6 +5315,7 @@ static int beiscsi_enable_port(struct beiscsi_hba *phba)
        be2iscsi_enable_msix(phba);
 
        beiscsi_get_params(phba);
+       beiscsi_set_host_data(phba);
        /* Re-enable UER. If different TPE occurs then it is recoverable. */
        beiscsi_set_uer_feature(phba);
 
@@ -5387,15 +5405,7 @@ static void beiscsi_disable_port(struct beiscsi_hba *phba, int unload)
        phwi_ctrlr = phba->phwi_ctrlr;
        phwi_context = phwi_ctrlr->phwi_ctxt;
        hwi_disable_intr(phba);
-       if (phba->pcidev->msix_enabled) {
-               for (i = 0; i <= phba->num_cpus; i++) {
-                       free_irq(pci_irq_vector(phba->pcidev, i),
-                               &phwi_context->be_eq[i]);
-                       kfree(phba->msi_name[i]);
-               }
-       } else
-               if (phba->pcidev->irq)
-                       free_irq(phba->pcidev->irq, phba);
+       beiscsi_free_irqs(phba);
        pci_free_irq_vectors(phba->pcidev);
 
        for (i = 0; i < phba->num_cpus; i++) {
@@ -5586,12 +5596,12 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
        if (ret) {
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
                            "BM_%d : be_ctrl_init failed\n");
-               goto hba_free;
+               goto free_hba;
        }
 
        ret = beiscsi_init_sliport(phba);
        if (ret)
-               goto hba_free;
+               goto free_hba;
 
        spin_lock_init(&phba->io_sgl_lock);
        spin_lock_init(&phba->mgmt_sgl_lock);
@@ -5604,6 +5614,7 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
        }
        beiscsi_get_port_name(&phba->ctrl, phba);
        beiscsi_get_params(phba);
+       beiscsi_set_host_data(phba);
        beiscsi_set_uer_feature(phba);
 
        be2iscsi_enable_msix(phba);
@@ -5671,13 +5682,13 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
                            "BM_%d : beiscsi_dev_probe-"
                            "Failed to beiscsi_init_irqs\n");
-               goto free_blkenbld;
+               goto disable_iopoll;
        }
        hwi_enable_intr(phba);
 
        ret = iscsi_host_add(phba->shost, &phba->pcidev->dev);
        if (ret)
-               goto free_blkenbld;
+               goto free_irqs;
 
        /* set online bit after port is operational */
        set_bit(BEISCSI_HBA_ONLINE, &phba->state);
@@ -5713,12 +5724,15 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
                    "\n\n\n BM_%d : SUCCESS - DRIVER LOADED\n\n\n");
        return 0;
 
-free_blkenbld:
-       destroy_workqueue(phba->wq);
+free_irqs:
+       hwi_disable_intr(phba);
+       beiscsi_free_irqs(phba);
+disable_iopoll:
        for (i = 0; i < phba->num_cpus; i++) {
                pbe_eq = &phwi_context->be_eq[i];
                irq_poll_disable(&pbe_eq->iopoll);
        }
+       destroy_workqueue(phba->wq);
 free_twq:
        hwi_cleanup_port(phba);
        beiscsi_cleanup_port(phba);
@@ -5727,9 +5741,9 @@ free_port:
        pci_free_consistent(phba->pcidev,
                            phba->ctrl.mbox_mem_alloced.size,
                            phba->ctrl.mbox_mem_alloced.va,
-                          phba->ctrl.mbox_mem_alloced.dma);
+                           phba->ctrl.mbox_mem_alloced.dma);
        beiscsi_unmap_pci_function(phba);
-hba_free:
+free_hba:
        pci_disable_msix(phba->pcidev);
        pci_dev_put(phba->pcidev);
        iscsi_host_free(phba->shost);