On Sun, Jan 03, 2021 at 09:11:21AM -0800, James Smart wrote: > This patch continues the efct driver population. > > This patch adds driver definitions for: > Emulex FC Target driver init, attach and hardware setup routines. > > Co-developed-by: Ram Vegesna <ram.vegesna@xxxxxxxxxxxx> > Signed-off-by: Ram Vegesna <ram.vegesna@xxxxxxxxxxxx> > Signed-off-by: James Smart <jsmart2021@xxxxxxxxx> Reviewed-by: Daniel Wagner <dwagner@xxxxxxx> > --- > drivers/scsi/elx/efct/efct_driver.c | 793 ++++++++++++++++++ > drivers/scsi/elx/efct/efct_driver.h | 109 +++ > drivers/scsi/elx/efct/efct_hw.c | 1158 +++++++++++++++++++++++++++ > drivers/scsi/elx/efct/efct_hw.h | 15 + > drivers/scsi/elx/efct/efct_xport.c | 519 ++++++++++++ > drivers/scsi/elx/efct/efct_xport.h | 186 +++++ > 6 files changed, 2780 insertions(+) > create mode 100644 drivers/scsi/elx/efct/efct_driver.c > create mode 100644 drivers/scsi/elx/efct/efct_driver.h > create mode 100644 drivers/scsi/elx/efct/efct_hw.c > create mode 100644 drivers/scsi/elx/efct/efct_xport.c > create mode 100644 drivers/scsi/elx/efct/efct_xport.h > > diff --git a/drivers/scsi/elx/efct/efct_driver.c b/drivers/scsi/elx/efct/efct_driver.c > new file mode 100644 > index 000000000000..77aeb86f959f > --- /dev/null > +++ b/drivers/scsi/elx/efct/efct_driver.c > @@ -0,0 +1,793 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2021 Broadcom. All Rights Reserved. The term > + * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. > + */ > + > +#include "efct_driver.h" > + > +#include "efct_hw.h" > +#include "efct_unsol.h" > +#include "efct_scsi.h" > + > +LIST_HEAD(efct_devices); > + > +static int logmask; > +module_param(logmask, int, 0444); > +MODULE_PARM_DESC(logmask, "logging bitmask (default 0)"); > + > +static struct libefc_function_template efct_libefc_templ = { > + .issue_mbox_rqst = efct_issue_mbox_rqst, > + .send_els = efct_els_hw_srrs_send, > + .send_bls = efct_efc_bls_send, > + > + .new_nport = efct_scsi_tgt_new_nport, > + .del_nport = efct_scsi_tgt_del_nport, > + .scsi_new_node = efct_scsi_new_initiator, > + .scsi_del_node = efct_scsi_del_initiator, > + .hw_seq_free = efct_efc_hw_sequence_free, > +}; > + > +static int > +efct_device_init(void) > +{ > + int rc; > + > + /* driver-wide init for target-server */ > + rc = efct_scsi_tgt_driver_init(); > + if (rc) { > + pr_err("efct_scsi_tgt_init failed rc=%d\n", > + rc); > + return rc; > + } > + > + rc = efct_scsi_reg_fc_transport(); > + if (rc) { > + pr_err("failed to register to FC host\n"); > + return rc; > + } > + > + return EFC_SUCCESS; > +} > + > +static void > +efct_device_shutdown(void) > +{ > + efct_scsi_release_fc_transport(); > + > + efct_scsi_tgt_driver_exit(); > +} > + > +static void * > +efct_device_alloc(u32 nid) > +{ > + struct efct *efct = NULL; > + > + efct = kzalloc_node(sizeof(*efct), GFP_KERNEL, nid); > + if (!efct) > + return efct; > + > + INIT_LIST_HEAD(&efct->list_entry); > + list_add_tail(&efct->list_entry, &efct_devices); > + > + return efct; > +} > + > +static void > +efct_teardown_msix(struct efct *efct) > +{ > + u32 i; > + > + for (i = 0; i < efct->n_msix_vec; i++) { > + free_irq(pci_irq_vector(efct->pci, i), > + &efct->intr_context[i]); > + } > + > + pci_free_irq_vectors(efct->pci); > +} > + > +static int > +efct_efclib_config(struct efct *efct, struct libefc_function_template *tt) > +{ > + struct efc *efc; > + struct sli4 *sli; > + int rc = EFC_SUCCESS; > + > + efc = kzalloc(sizeof(*efc), GFP_KERNEL); > + if (!efc) > + return EFC_FAIL; > + > + efct->efcport = efc; > + > + memcpy(&efc->tt, tt, sizeof(*tt)); > + efc->base = efct; > + efc->pci = efct->pci; > + > + efc->def_wwnn = efct_get_wwnn(&efct->hw); > + efc->def_wwpn = efct_get_wwpn(&efct->hw); > + efc->enable_tgt = 1; > + efc->log_level = EFC_LOG_LIB; > + > + sli = &efct->hw.sli; > + efc->max_xfer_size = sli->sge_supported_length * > + sli_get_max_sgl(&efct->hw.sli); > + efc->sli = sli; > + efc->fcfi = efct->hw.fcf_indicator; > + > + rc = efcport_init(efc); > + if (rc) > + efc_log_err(efc, "efcport_init failed\n"); > + > + return rc; > +} > + > +static int efct_request_firmware_update(struct efct *efct); > + > +static const char* > +efct_pci_model(u16 device) > +{ > + switch (device) { > + case EFCT_DEVICE_LANCER_G6: return "LPE31004"; > + case EFCT_DEVICE_LANCER_G7: return "LPE36000"; > + default: return "unknown"; > + } > +} > + > +static int > +efct_device_attach(struct efct *efct) > +{ > + u32 rc = 0, i = 0; rc = EFC_SUCCESS There are some more of those in this patch, where 0/-1 is used instead of the EFC_ defines.