ACTION=="remove", GOTO="rdma_hw_modules_end"

SUBSYSTEM!="net", GOTO="rdma_hw_modules_net_end"
# For Ethernet cards with RoCE support
# Automatically load RDMA specific kernel modules when a multi-function device is installed
# These drivers autoload an ethernet driver based on hardware detection and
# need userspace to load the module that has their RDMA component to turn on
# RDMA.

ENV{ID_NET_DRIVER}=="be2net", RUN{builtin}+="kmod load ocrdma"
ENV{ID_NET_DRIVER}=="bnxt_en", RUN{builtin}+="kmod load bnxt_re"
ENV{ID_NET_DRIVER}=="cxgb4", RUN{builtin}+="kmod load iw_cxgb4"
ENV{ID_NET_DRIVER}=="hns", RUN{builtin}+="kmod load hns_roce"
ENV{ID_NET_DRIVER}=="i40e", RUN{builtin}+="kmod load i40iw"
ENV{ID_NET_DRIVER}=="mlx4_en", RUN{builtin}+="kmod load mlx4_ib"
ENV{ID_NET_DRIVER}=="mlx5_core", RUN{builtin}+="kmod load mlx5_ib"
ENV{ID_NET_DRIVER}=="qede", RUN{builtin}+="kmod load qedr"

# The user must explicitly load these modules via /etc/modules-load.d/ or otherwise
# rxe

# enic no longer has a userspace verbs driver, this rule should probably be
# owned by libfabric
ENV{ID_NET_DRIVER}=="enic", RUN{builtin}+="kmod load usnic_verbs"

# These providers are single function and autoload RDMA automatically based on
# PCI probing
# hfi1verbs
# ipathverbs
# mthca
# vmw_pvrdma

LABEL="rdma_hw_modules_net_end"

SUBSYSTEM!="pci", GOTO="rdma_hw_modules_pci_end"
# For InfiniBand cards
# Normally the request_module inside the driver will trigger this, but in case that fails due to
# missing modules in the initrd, trigger it again. HW that doesn't create a netdevice will not
# trigger the net based rules above.

ENV{DRIVER}=="mlx4_core", RUN{builtin}+="kmod load mlx4_ib"
ENV{DRIVER}=="mlx5_core", RUN{builtin}+="kmod load mlx5_ib"

LABEL="rdma_hw_modules_pci_end"

LABEL="rdma_hw_modules_end"
