Add Mellanox BlueField Gigabit Ethernet driver
authorDavid Thompson <davthompson@nvidia.com>
Fri, 25 Jun 2021 01:11:46 +0000 (21:11 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 25 Jun 2021 18:20:23 +0000 (11:20 -0700)
commitf92e1869d74e1acc6551256eb084a1c14a054e19
treee978b9338c55ccc16f8389c00958d7e35bebcb7f
parent19938bafa7ae8fc0a4a2c1c1430abb1a04668da1
Add Mellanox BlueField Gigabit Ethernet driver

This patch adds build and driver logic for the "mlxbf_gige"
Ethernet driver from Mellanox Technologies. The second
generation BlueField SoC from Mellanox supports an
out-of-band GigaBit Ethernet management port to the Arm
subsystem.  This driver supports TCP/IP network connectivity
for that port, and provides back-end routines to handle
basic ethtool requests.

The driver interfaces to the Gigabit Ethernet block of
BlueField SoC via MMIO accesses to registers, which contain
control information or pointers describing transmit and
receive resources.  There is a single transmit queue, and
the port supports transmit ring sizes of 4 to 256 entries.
There is a single receive queue, and the port supports
receive ring sizes of 32 to 32K entries. The transmit and
receive rings are allocated from DMA coherent memory. There
is a 16-bit producer and consumer index per ring to denote
software ownership and hardware ownership, respectively.

The main driver logic such as probe(), remove(), and netdev
ops are in "mlxbf_gige_main.c".  Logic in "mlxbf_gige_rx.c"
and "mlxbf_gige_tx.c" handles the packet processing for
receive and transmit respectively.

The logic in "mlxbf_gige_ethtool.c" supports the handling
of some basic ethtool requests: get driver info, get ring
parameters, get registers, and get statistics.

The logic in "mlxbf_gige_mdio.c" is the driver controlling
the Mellanox BlueField hardware that interacts with a PHY
device via MDIO/MDC pins.  This driver does the following:
  - At driver probe time, it configures several BlueField MDIO
    parameters such as sample rate, full drive, voltage and MDC
  - It defines functions to read and write MDIO registers and
    registers the MDIO bus.
  - It defines the phy interrupt handler reporting a
    link up/down status change
  - This driver's probe is invoked from the main driver logic
    while the phy interrupt handler is registered in ndo_open.

Driver limitations
  - Only supports 1Gbps speed
  - Only supports GMII protocol
  - Supports maximum packet size of 2KB
  - Does not support scatter-gather buffering

Testing
  - Successful build of kernel for ARM64, ARM32, X86_64
  - Tested ARM64 build on FastModels & Palladium
  - Tested ARM64 build on several Mellanox boards that are built with
    the BlueField-2 SoC.  The testing includes coverage in the areas
    of networking (e.g. ping, iperf, ifconfig, route), file transfers
    (e.g. SCP), and various ethtool options relevant to this driver.

Signed-off-by: David Thompson <davthompson@nvidia.com>
Signed-off-by: Asmaa Mnebhi <asmaa@nvidia.com>
Reviewed-by: Liming Sun <limings@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
13 files changed:
drivers/net/ethernet/mellanox/Kconfig
drivers/net/ethernet/mellanox/Makefile
drivers/net/ethernet/mellanox/mlxbf_gige/Kconfig [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/Makefile [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige.h [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_ethtool.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_gpio.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_intr.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_regs.h [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_tx.c [new file with mode: 0644]