f91fca5ba7
Chelsio NICs are a bit unique compared to some other NICs in that they expose different functionality on different physical functions. In particular, PF4 is used to manage the NIC interfaces ('t4nex' and 't5nex'). However, PF4 is not able to create VF devices. Instead, VFs are only supported by physical functions 0 through 3. This commit adds 't4iov' and 't5iov' drivers that attach to PF0-3. One extra wrinkle is that the iov devices cannot enable SR-IOV until the firwmare has been initialized by the main PF4 driver. To handle this case, a new t4_if kobj interface has been added to permit cross-calls between the PF drivers. The PF4 driver notifies sibling drivers when it is fully attached. It also requests sibling drivers to detach before it detaches. Sibling drivers query the PF4 driver during their attach routine to see if it is attached. If not, the sibling drivers defer their attach actions until the PF4 driver informs them it is attached. VF devices are associated with a single port on the NIC. VF devices created from PF0 are associated with the first port on the NIC, VFs from PF1 are associated with the second port, etc. VF devices can only be created from a PF device that has an associated port. Thus, on a 2-port card, VFs are only supported on PF0 and PF1. Reviewed by: np (earlier versions) MFC after: 1 month Sponsored by: Chelsio Communications
66 lines
2.4 KiB
Objective-C
66 lines
2.4 KiB
Objective-C
#-
|
|
# Copyright (c) 2015-2016 Chelsio Communications, Inc.
|
|
# All rights reserved.
|
|
# Written by: John Baldwin <jhb@FreeBSD.org>
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
# SUCH DAMAGE.
|
|
#
|
|
# $FreeBSD$
|
|
#
|
|
|
|
#include <sys/bus.h>
|
|
|
|
INTERFACE t4;
|
|
|
|
# The "main" device of a T4/T5 NIC is the PF4 device. Drivers for other
|
|
# functions on the NIC need to wait for the main device to be initialized
|
|
# before finishing attach. These routines allow drivers for other devices
|
|
# to coordinate with the main driver for the PF4.
|
|
|
|
# Called by a driver during attach to determine if the PF4 driver is
|
|
# initialized. If the main driver is not ready, the driver should defer
|
|
# further initialization until 'attach_child'.
|
|
METHOD int is_main_ready {
|
|
device_t dev;
|
|
};
|
|
|
|
# Called by the PF4 driver on each sibling device when the PF4 driver is
|
|
# initialized.
|
|
METHOD int attach_child {
|
|
device_t dev;
|
|
};
|
|
|
|
# Called by the PF4 driver on each sibling device when the PF4 driver is
|
|
# preparing to detach.
|
|
METHOD int detach_child {
|
|
device_t dev;
|
|
};
|
|
|
|
# Called by a driver to query the PF4 driver for the unit number to use
|
|
# for a given port. If the port is not enabled on the adapter, this
|
|
# will fail.
|
|
METHOD int read_port_unit {
|
|
device_t dev;
|
|
int port;
|
|
int *unit;
|
|
};
|