Merge tag 'pinctrl-v5.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[linux-2.6-microblaze.git] / drivers / scsi / lpfc / lpfc_init.c
index 9d03e9b..4104bdc 100644 (file)
@@ -4231,6 +4231,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
 {
        struct lpfc_vport *vport;
        struct Scsi_Host  *shost = NULL;
+       struct scsi_host_template *template;
        int error = 0;
        int i;
        uint64_t wwn;
@@ -4259,22 +4260,50 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
                }
        }
 
-       if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) {
-               if (dev != &phba->pcidev->dev) {
-                       shost = scsi_host_alloc(&lpfc_vport_template,
-                                               sizeof(struct lpfc_vport));
+       /* Seed template for SCSI host registration */
+       if (dev == &phba->pcidev->dev) {
+               template = &phba->port_template;
+
+               if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) {
+                       /* Seed physical port template */
+                       memcpy(template, &lpfc_template, sizeof(*template));
+
+                       if (use_no_reset_hba) {
+                               /* template is for a no reset SCSI Host */
+                               template->max_sectors = 0xffff;
+                               template->eh_host_reset_handler = NULL;
+                       }
+
+                       /* Template for all vports this physical port creates */
+                       memcpy(&phba->vport_template, &lpfc_template,
+                              sizeof(*template));
+                       phba->vport_template.max_sectors = 0xffff;
+                       phba->vport_template.shost_attrs = lpfc_vport_attrs;
+                       phba->vport_template.eh_bus_reset_handler = NULL;
+                       phba->vport_template.eh_host_reset_handler = NULL;
+                       phba->vport_template.vendor_id = 0;
+
+                       /* Initialize the host templates with updated value */
+                       if (phba->sli_rev == LPFC_SLI_REV4) {
+                               template->sg_tablesize = phba->cfg_scsi_seg_cnt;
+                               phba->vport_template.sg_tablesize =
+                                       phba->cfg_scsi_seg_cnt;
+                       } else {
+                               template->sg_tablesize = phba->cfg_sg_seg_cnt;
+                               phba->vport_template.sg_tablesize =
+                                       phba->cfg_sg_seg_cnt;
+                       }
+
                } else {
-                       if (!use_no_reset_hba)
-                               shost = scsi_host_alloc(&lpfc_template,
-                                               sizeof(struct lpfc_vport));
-                       else
-                               shost = scsi_host_alloc(&lpfc_template_no_hr,
-                                               sizeof(struct lpfc_vport));
+                       /* NVMET is for physical port only */
+                       memcpy(template, &lpfc_template_nvme,
+                              sizeof(*template));
                }
-       } else if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) {
-               shost = scsi_host_alloc(&lpfc_template_nvme,
-                                       sizeof(struct lpfc_vport));
+       } else {
+               template = &phba->vport_template;
        }
+
+       shost = scsi_host_alloc(template, sizeof(struct lpfc_vport));
        if (!shost)
                goto out;
 
@@ -4329,6 +4358,12 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
                vport->port_type = LPFC_PHYSICAL_PORT;
        }
 
+       lpfc_printf_log(phba, KERN_INFO, LOG_INIT | LOG_FCP,
+                       "9081 CreatePort TMPLATE type %x TBLsize %d "
+                       "SEGcnt %d/%d\n",
+                       vport->port_type, shost->sg_tablesize,
+                       phba->cfg_scsi_seg_cnt, phba->cfg_sg_seg_cnt);
+
        /* Initialize all internally managed lists. */
        INIT_LIST_HEAD(&vport->fc_nodes);
        INIT_LIST_HEAD(&vport->rcv_buffer_list);
@@ -6301,11 +6336,6 @@ lpfc_sli_driver_resource_setup(struct lpfc_hba *phba)
         * used to create the sg_dma_buf_pool must be dynamically calculated.
         */
 
-       /* Initialize the host templates the configured values. */
-       lpfc_vport_template.sg_tablesize = phba->cfg_sg_seg_cnt;
-       lpfc_template_no_hr.sg_tablesize = phba->cfg_sg_seg_cnt;
-       lpfc_template.sg_tablesize = phba->cfg_sg_seg_cnt;
-
        if (phba->sli_rev == LPFC_SLI_REV4)
                entry_sz = sizeof(struct sli4_sge);
        else
@@ -6346,7 +6376,7 @@ lpfc_sli_driver_resource_setup(struct lpfc_hba *phba)
        }
 
        lpfc_printf_log(phba, KERN_INFO, LOG_INIT | LOG_FCP,
-                       "9088 sg_tablesize:%d dmabuf_size:%d total_bde:%d\n",
+                       "9088 INIT sg_tablesize:%d dmabuf_size:%d total_bde:%d\n",
                        phba->cfg_sg_seg_cnt, phba->cfg_sg_dma_buf_size,
                        phba->cfg_total_seg_cnt);
 
@@ -6816,11 +6846,6 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
                        phba->cfg_nvme_seg_cnt = phba->cfg_sg_seg_cnt;
        }
 
-       /* Initialize the host templates with the updated values. */
-       lpfc_vport_template.sg_tablesize = phba->cfg_scsi_seg_cnt;
-       lpfc_template.sg_tablesize = phba->cfg_scsi_seg_cnt;
-       lpfc_template_no_hr.sg_tablesize = phba->cfg_scsi_seg_cnt;
-
        lpfc_printf_log(phba, KERN_INFO, LOG_INIT | LOG_FCP,
                        "9087 sg_seg_cnt:%d dmabuf_size:%d "
                        "total:%d scsi:%d nvme:%d\n",
@@ -6926,6 +6951,17 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
                rc = -ENOMEM;
                goto out_free_hba_cpu_map;
        }
+
+#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+       phba->sli4_hba.c_stat = alloc_percpu(struct lpfc_hdwq_stat);
+       if (!phba->sli4_hba.c_stat) {
+               lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+                               "3332 Failed allocating per cpu hdwq stats\n");
+               rc = -ENOMEM;
+               goto out_free_hba_eq_info;
+       }
+#endif
+
        /*
         * Enable sr-iov virtual functions if supported and configured
         * through the module parameter.
@@ -6945,6 +6981,10 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
 
        return 0;
 
+#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+out_free_hba_eq_info:
+       free_percpu(phba->sli4_hba.eq_info);
+#endif
 out_free_hba_cpu_map:
        kfree(phba->sli4_hba.cpu_map);
 out_free_hba_eq_hdl:
@@ -6983,6 +7023,9 @@ lpfc_sli4_driver_resource_unset(struct lpfc_hba *phba)
        struct lpfc_fcf_conn_entry *conn_entry, *next_conn_entry;
 
        free_percpu(phba->sli4_hba.eq_info);
+#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+       free_percpu(phba->sli4_hba.c_stat);
+#endif
 
        /* Free memory allocated for msi-x interrupt vector to CPU mapping */
        kfree(phba->sli4_hba.cpu_map);
@@ -10823,6 +10866,9 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
 #ifdef CONFIG_X86
        struct cpuinfo_x86 *cpuinfo;
 #endif
+#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+       struct lpfc_hdwq_stat *c_stat;
+#endif
 
        max_phys_id = 0;
        min_phys_id = LPFC_VECTOR_MAP_EMPTY;
@@ -11074,10 +11120,17 @@ found_any:
        idx = 0;
        for_each_possible_cpu(cpu) {
                cpup = &phba->sli4_hba.cpu_map[cpu];
+#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+               c_stat = per_cpu_ptr(phba->sli4_hba.c_stat, cpu);
+               c_stat->hdwq_no = cpup->hdwq;
+#endif
                if (cpup->hdwq != LPFC_VECTOR_MAP_EMPTY)
                        continue;
 
                cpup->hdwq = idx++ % phba->cfg_hdw_queue;
+#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+               c_stat->hdwq_no = cpup->hdwq;
+#endif
                lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
                                "3340 Set Affinity: not present "
                                "CPU %d hdwq %d\n",
@@ -11173,11 +11226,9 @@ static void lpfc_cpuhp_add(struct lpfc_hba *phba)
 
        rcu_read_lock();
 
-       if (!list_empty(&phba->poll_list)) {
-               timer_setup(&phba->cpuhp_poll_timer, lpfc_sli4_poll_hbtimer, 0);
+       if (!list_empty(&phba->poll_list))
                mod_timer(&phba->cpuhp_poll_timer,
                          jiffies + msecs_to_jiffies(LPFC_POLL_HB));
-       }
 
        rcu_read_unlock();
 
@@ -13145,6 +13196,7 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid)
        lpfc_sli4_ras_setup(phba);
 
        INIT_LIST_HEAD(&phba->poll_list);
+       timer_setup(&phba->cpuhp_poll_timer, lpfc_sli4_poll_hbtimer, 0);
        cpuhp_state_add_instance_nocalls(lpfc_cpuhp_state, &phba->cpuhp);
 
        return 0;