[PATCH v3 00/31] [NEW] efct: Broadcom (Emulex) FC Target driver

James Smart
2020-04-12T03:33:13Z

This patch set is a request to incorporate the new Broadcom
(Emulex) FC target driver, efct, into the kernel source tree.

The driver source has been Announced a couple of times, the last
version on 12/20/2019. The driver has been hosted on gitlab for
review has had contributions from the community.
gitlab (git@gitlab.com:jsmart/efct-Emulex_FC_Target.git)

The driver integrates into the source tree at the (new) drivers/scsi/elx
subdirectory.

The driver consists of the following components:
- A libefc_sli subdirectory: This subdirectory contains a library that
encapsulates common definitions and routines for an Emulex SLI-4
adapter.
- A libefc subdirectory: This subdirectory contains a library of
common routines. Of major import is a number of routines that
implement a FC Discovery engine for target mode.
- An efct subdirectory: This subdirectory contains the efct target
mode device driver. The driver utilizes the above librarys and
plugs into the SCSI LIO interfaces. The driver is SCSI only at
this time.

The patches populate the libraries and device driver and can only
be compiled as a complete set.

This driver is completely independent from the lpfc device driver
and there is no overlap on PCI ID's.

The patches have been cut against the 5.7/scsi-queue branch.

Thank you to those that have contributed to the driver in the past.

Review comments welcome!

-- james

V2 modifications:

Contains the following modifications based on prior review comments:
Indentation/Alignment/Spacing changes
Comments: format cleanup; removed obvious or unnecessary comments;
Added comments for clarity.
Headers use #ifndef comparing for prior inclusion
Cleanup structure names (remove _s suffix)
Encapsulate use of macro arguments
Refactor to remove static function declarations for static local routines
Removed unused variables
Fix SLI4_INTF_VALID_MASK for 32bits
Ensure no BIT() use
Use __ffs() in page count macro
Reorg to move field defines out of structure definition
Commonize command building routines to reduce duplication
LIO interface:
Removed scsi initiator includes
Cleaned up interface defines
Removed lio WWN version attribute.
Expanded macros within logging macros
Cleaned up lio state setting macro
Remove __force use
Modularized session debugfs code so can be easily replaced.
Cleaned up abort task handling. Return after initiating.
Modularized where possible to reduce duplication
Convert from kthread to workqueue use
Remove unused macros
Add missing TARGET_CORE build attribute
Fix kbuild test robot warnings

Comments not addressed:
Use of __packed: not believed necessary
Session debugfs code remains. There is not yet a common lio
mechanism to replace with.

V3 modifications:
Changed anonymous enums to named enums
Split gaint enums into multiple enums
Use defines to spell out _MASK values directly
Changed multiple #defines to named enums and a few vice versa cases
for consistency
Added Link Speed support for up to 128G
Removed efc_assert define. Replaced with WARN_ON.
Returned defined return values EFC_SUCCESS & EFC_FAIL
Added return values for routines returning more than those 2 values
Reduction of calling arguments in various routines.
Expanded dump type and status handling
Fixed locking in discovery handling routines.
Fixed line formatting length and indentation issues.
Removed code that was not used.
Removed Sparse Vector APIs and structures. Use xarray api instead.
Changed node pool creation. Use mempool and allocate dma memory when
required
Bug Fix: Send LS_RJT for non FCP PRLIs
Removed Queue topology string and parsing routines and rework queue
creation. Adapter configuration is implicitly known by the driver
Used request_threaded_irq instead of using our thread
Reworked efct_device_attach function to use if statements and gotos
Changed efct_fw_reset, removed accessing other port
Convert to used pci_alloc_irq_vectors api
Removed proc interface.
Changed assertion log messages.
Unified log message using cmd_name
Removed DIF related code which is not used
Removed SCSI get property
Incorporated LIO interface review comments
Reworked xxx_reg_vpi/vfi routines
Use SPDX license in elx/Makefile
Many more small changes.

James Smart (31):
elx: libefc_sli: SLI-4 register offsets and field definitions
elx: libefc_sli: SLI Descriptors and Queue entries
elx: libefc_sli: Data structures and defines for mbox commands
elx: libefc_sli: queue create/destroy/parse routines
elx: libefc_sli: Populate and post different WQEs
elx: libefc_sli: bmbx routines and SLI config commands
elx: libefc_sli: APIs to setup SLI library
elx: libefc: Generic state machine framework
elx: libefc: Emulex FC discovery library APIs and definitions
elx: libefc: FC Domain state machine interfaces
elx: libefc: SLI and FC PORT state machine interfaces
elx: libefc: Remote node state machine interfaces
elx: libefc: Fabric node state machine interfaces
elx: libefc: FC node ELS and state handling
elx: efct: Data structures and defines for hw operations
elx: efct: Driver initialization routines
elx: efct: Hardware queues creation and deletion
elx: efct: RQ buffer, memory pool allocation and deallocation APIs
elx: efct: Hardware IO and SGL initialization
elx: efct: Hardware queues processing
elx: efct: Unsolicited FC frame processing routines
elx: efct: Extended link Service IO handling
elx: efct: SCSI IO handling routines
elx: efct: LIO backend interface routines
elx: efct: Hardware IO submission routines
elx: efct: link statistics and SFP data
elx: efct: xport and hardware teardown routines
elx: efct: Firmware update, async link processing
elx: efct: scsi_transport_fc host interface support
elx: efct: Add Makefile and Kconfig for efct driver
elx: efct: Tie into kernel Kconfig and build process

MAINTAINERS | 8 +
drivers/scsi/Kconfig | 2 +
drivers/scsi/Makefile | 1 +
drivers/scsi/elx/Kconfig | 9 +
drivers/scsi/elx/Makefile | 18 +
drivers/scsi/elx/efct/efct_driver.c | 856 +++++
drivers/scsi/elx/efct/efct_driver.h | 142 +
drivers/scsi/elx/efct/efct_els.c | 1928 +++++++++++
drivers/scsi/elx/efct/efct_els.h | 133 +
drivers/scsi/elx/efct/efct_hw.c | 5347 +++++++++++++++++++++++++++++++
drivers/scsi/elx/efct/efct_hw.h | 864 +++++
drivers/scsi/elx/efct/efct_hw_queues.c | 765 +++++
drivers/scsi/elx/efct/efct_io.c | 198 ++
drivers/scsi/elx/efct/efct_io.h | 191 ++
drivers/scsi/elx/efct/efct_lio.c | 1840 +++++++++++
drivers/scsi/elx/efct/efct_lio.h | 178 +
drivers/scsi/elx/efct/efct_scsi.c | 1192 +++++++
drivers/scsi/elx/efct/efct_scsi.h | 235 ++
drivers/scsi/elx/efct/efct_unsol.c | 813 +++++
drivers/scsi/elx/efct/efct_unsol.h | 49 +
drivers/scsi/elx/efct/efct_xport.c | 1310 ++++++++
drivers/scsi/elx/efct/efct_xport.h | 201 ++
drivers/scsi/elx/include/efc_common.h | 43 +
drivers/scsi/elx/libefc/efc.h | 72 +
drivers/scsi/elx/libefc/efc_device.c | 1672 ++++++++++
drivers/scsi/elx/libefc/efc_device.h | 72 +
drivers/scsi/elx/libefc/efc_domain.c | 1109 +++++++
drivers/scsi/elx/libefc/efc_domain.h | 52 +
drivers/scsi/elx/libefc/efc_fabric.c | 1759 ++++++++++
drivers/scsi/elx/libefc/efc_fabric.h | 116 +
drivers/scsi/elx/libefc/efc_lib.c | 41 +
drivers/scsi/elx/libefc/efc_node.c | 1196 +++++++
drivers/scsi/elx/libefc/efc_node.h | 183 ++
drivers/scsi/elx/libefc/efc_sm.c | 61 +
drivers/scsi/elx/libefc/efc_sm.h | 209 ++
drivers/scsi/elx/libefc/efc_sport.c | 846 +++++
drivers/scsi/elx/libefc/efc_sport.h | 52 +
drivers/scsi/elx/libefc/efclib.h | 640 ++++
drivers/scsi/elx/libefc_sli/sli4.c | 5523 ++++++++++++++++++++++++++++++++
drivers/scsi/elx/libefc_sli/sli4.h | 4133 ++++++++++++++++++++++++
40 files changed, 34059 insertions(+)
create mode 100644 drivers/scsi/elx/Kconfig
create mode 100644 drivers/scsi/elx/Makefile
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_els.c
create mode 100644 drivers/scsi/elx/efct/efct_els.h
create mode 100644 drivers/scsi/elx/efct/efct_hw.c
create mode 100644 drivers/scsi/elx/efct/efct_hw.h
create mode 100644 drivers/scsi/elx/efct/efct_hw_queues.c
create mode 100644 drivers/scsi/elx/efct/efct_io.c
create mode 100644 drivers/scsi/elx/efct/efct_io.h
create mode 100644 drivers/scsi/elx/efct/efct_lio.c
create mode 100644 drivers/scsi/elx/efct/efct_lio.h
create mode 100644 drivers/scsi/elx/efct/efct_scsi.c
create mode 100644 drivers/scsi/elx/efct/efct_scsi.h
create mode 100644 drivers/scsi/elx/efct/efct_unsol.c
create mode 100644 drivers/scsi/elx/efct/efct_unsol.h
create mode 100644 drivers/scsi/elx/efct/efct_xport.c
create mode 100644 drivers/scsi/elx/efct/efct_xport.h
create mode 100644 drivers/scsi/elx/include/efc_common.h
create mode 100644 drivers/scsi/elx/libefc/efc.h
create mode 100644 drivers/scsi/elx/libefc/efc_device.c
create mode 100644 drivers/scsi/elx/libefc/efc_device.h
create mode 100644 drivers/scsi/elx/libefc/efc_domain.c
create mode 100644 drivers/scsi/elx/libefc/efc_domain.h
create mode 100644 drivers/scsi/elx/libefc/efc_fabric.c
create mode 100644 drivers/scsi/elx/libefc/efc_fabric.h
create mode 100644 drivers/scsi/elx/libefc/efc_lib.c
create mode 100644 drivers/scsi/elx/libefc/efc_node.c
create mode 100644 drivers/scsi/elx/libefc/efc_node.h
create mode 100644 drivers/scsi/elx/libefc/efc_sm.c
create mode 100644 drivers/scsi/elx/libefc/efc_sm.h
create mode 100644 drivers/scsi/elx/libefc/efc_sport.c
create mode 100644 drivers/scsi/elx/libefc/efc_sport.h
create mode 100644 drivers/scsi/elx/libefc/efclib.h
create mode 100644 drivers/scsi/elx/libefc_sli/sli4.c
create mode 100644 drivers/scsi/elx/libefc_sli/sli4.h

--
2.16.4