Merge branches 'bart-srp', 'generic-errors', 'ira-cleanups' and 'mwang-v8' into k.o/for-4.2
This commit is contained in:
@@ -263,7 +263,7 @@ struct ib_mad_send_buf {
|
||||
* ib_response_mad - Returns if the specified MAD has been generated in
|
||||
* response to a sent request or trap.
|
||||
*/
|
||||
int ib_response_mad(struct ib_mad *mad);
|
||||
int ib_response_mad(const struct ib_mad_hdr *hdr);
|
||||
|
||||
/**
|
||||
* ib_get_rmpp_resptime - Returns the RMPP response time.
|
||||
@@ -675,6 +675,6 @@ void ib_free_send_mad(struct ib_mad_send_buf *send_buf);
|
||||
* @agent: the agent in question
|
||||
* @return: true if agent is performing rmpp, false otherwise.
|
||||
*/
|
||||
int ib_mad_kernel_rmpp_agent(struct ib_mad_agent *agent);
|
||||
int ib_mad_kernel_rmpp_agent(const struct ib_mad_agent *agent);
|
||||
|
||||
#endif /* IB_MAD_H */
|
||||
|
@@ -81,6 +81,13 @@ enum rdma_transport_type {
|
||||
RDMA_TRANSPORT_USNIC_UDP
|
||||
};
|
||||
|
||||
enum rdma_protocol_type {
|
||||
RDMA_PROTOCOL_IB,
|
||||
RDMA_PROTOCOL_IBOE,
|
||||
RDMA_PROTOCOL_IWARP,
|
||||
RDMA_PROTOCOL_USNIC_UDP
|
||||
};
|
||||
|
||||
__attribute_const__ enum rdma_transport_type
|
||||
rdma_node_get_transport(enum rdma_node_type node_type);
|
||||
|
||||
@@ -346,6 +353,40 @@ union rdma_protocol_stats {
|
||||
struct iw_protocol_stats iw;
|
||||
};
|
||||
|
||||
/* Define bits for the various functionality this port needs to be supported by
|
||||
* the core.
|
||||
*/
|
||||
/* Management 0x00000FFF */
|
||||
#define RDMA_CORE_CAP_IB_MAD 0x00000001
|
||||
#define RDMA_CORE_CAP_IB_SMI 0x00000002
|
||||
#define RDMA_CORE_CAP_IB_CM 0x00000004
|
||||
#define RDMA_CORE_CAP_IW_CM 0x00000008
|
||||
#define RDMA_CORE_CAP_IB_SA 0x00000010
|
||||
|
||||
/* Address format 0x000FF000 */
|
||||
#define RDMA_CORE_CAP_AF_IB 0x00001000
|
||||
#define RDMA_CORE_CAP_ETH_AH 0x00002000
|
||||
|
||||
/* Protocol 0xFFF00000 */
|
||||
#define RDMA_CORE_CAP_PROT_IB 0x00100000
|
||||
#define RDMA_CORE_CAP_PROT_ROCE 0x00200000
|
||||
#define RDMA_CORE_CAP_PROT_IWARP 0x00400000
|
||||
|
||||
#define RDMA_CORE_PORT_IBA_IB (RDMA_CORE_CAP_PROT_IB \
|
||||
| RDMA_CORE_CAP_IB_MAD \
|
||||
| RDMA_CORE_CAP_IB_SMI \
|
||||
| RDMA_CORE_CAP_IB_CM \
|
||||
| RDMA_CORE_CAP_IB_SA \
|
||||
| RDMA_CORE_CAP_AF_IB)
|
||||
#define RDMA_CORE_PORT_IBA_ROCE (RDMA_CORE_CAP_PROT_ROCE \
|
||||
| RDMA_CORE_CAP_IB_MAD \
|
||||
| RDMA_CORE_CAP_IB_CM \
|
||||
| RDMA_CORE_CAP_IB_SA \
|
||||
| RDMA_CORE_CAP_AF_IB \
|
||||
| RDMA_CORE_CAP_ETH_AH)
|
||||
#define RDMA_CORE_PORT_IWARP (RDMA_CORE_CAP_PROT_IWARP \
|
||||
| RDMA_CORE_CAP_IW_CM)
|
||||
|
||||
struct ib_port_attr {
|
||||
enum ib_port_state state;
|
||||
enum ib_mtu max_mtu;
|
||||
@@ -412,6 +453,8 @@ enum ib_event_type {
|
||||
IB_EVENT_GID_CHANGE,
|
||||
};
|
||||
|
||||
__attribute_const__ const char *ib_event_msg(enum ib_event_type event);
|
||||
|
||||
struct ib_event {
|
||||
struct ib_device *device;
|
||||
union {
|
||||
@@ -663,6 +706,8 @@ enum ib_wc_status {
|
||||
IB_WC_GENERAL_ERR
|
||||
};
|
||||
|
||||
__attribute_const__ const char *ib_wc_status_msg(enum ib_wc_status status);
|
||||
|
||||
enum ib_wc_opcode {
|
||||
IB_WC_SEND,
|
||||
IB_WC_RDMA_WRITE,
|
||||
@@ -1474,6 +1519,12 @@ struct ib_dma_mapping_ops {
|
||||
|
||||
struct iw_cm_verbs;
|
||||
|
||||
struct ib_port_immutable {
|
||||
int pkey_tbl_len;
|
||||
int gid_tbl_len;
|
||||
u32 core_cap_flags;
|
||||
};
|
||||
|
||||
struct ib_device {
|
||||
struct device *dma_device;
|
||||
|
||||
@@ -1487,8 +1538,10 @@ struct ib_device {
|
||||
struct list_head client_data_list;
|
||||
|
||||
struct ib_cache cache;
|
||||
int *pkey_tbl_len;
|
||||
int *gid_tbl_len;
|
||||
/**
|
||||
* port_immutable is indexed by port number
|
||||
*/
|
||||
struct ib_port_immutable *port_immutable;
|
||||
|
||||
int num_comp_vectors;
|
||||
|
||||
@@ -1675,6 +1728,14 @@ struct ib_device {
|
||||
u32 local_dma_lkey;
|
||||
u8 node_type;
|
||||
u8 phys_port_cnt;
|
||||
|
||||
/**
|
||||
* The following mandatory functions are used only at device
|
||||
* registration. Keep functions such as these at the end of this
|
||||
* structure to avoid cache line misses when accessing struct ib_device
|
||||
* in fast paths.
|
||||
*/
|
||||
int (*get_port_immutable)(struct ib_device *, u8, struct ib_port_immutable *);
|
||||
};
|
||||
|
||||
struct ib_client {
|
||||
@@ -1743,6 +1804,242 @@ int ib_query_port(struct ib_device *device,
|
||||
enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device,
|
||||
u8 port_num);
|
||||
|
||||
/**
|
||||
* rdma_start_port - Return the first valid port number for the device
|
||||
* specified
|
||||
*
|
||||
* @device: Device to be checked
|
||||
*
|
||||
* Return start port number
|
||||
*/
|
||||
static inline u8 rdma_start_port(const struct ib_device *device)
|
||||
{
|
||||
return (device->node_type == RDMA_NODE_IB_SWITCH) ? 0 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_end_port - Return the last valid port number for the device
|
||||
* specified
|
||||
*
|
||||
* @device: Device to be checked
|
||||
*
|
||||
* Return last port number
|
||||
*/
|
||||
static inline u8 rdma_end_port(const struct ib_device *device)
|
||||
{
|
||||
return (device->node_type == RDMA_NODE_IB_SWITCH) ?
|
||||
0 : device->phys_port_cnt;
|
||||
}
|
||||
|
||||
static inline bool rdma_protocol_ib(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_IB;
|
||||
}
|
||||
|
||||
static inline bool rdma_protocol_roce(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_ROCE;
|
||||
}
|
||||
|
||||
static inline bool rdma_protocol_iwarp(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_IWARP;
|
||||
}
|
||||
|
||||
static inline bool rdma_ib_or_roce(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags &
|
||||
(RDMA_CORE_CAP_PROT_IB | RDMA_CORE_CAP_PROT_ROCE);
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_ib_mad - Check if the port of a device supports Infiniband
|
||||
* Management Datagrams.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* Management Datagrams (MAD) are a required part of the InfiniBand
|
||||
* specification and are supported on all InfiniBand devices. A slightly
|
||||
* extended version are also supported on OPA interfaces.
|
||||
*
|
||||
* Return: true if the port supports sending/receiving of MAD packets.
|
||||
*/
|
||||
static inline bool rdma_cap_ib_mad(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_MAD;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_ib_smi - Check if the port of a device provides an Infiniband
|
||||
* Subnet Management Agent (SMA) on the Subnet Management Interface (SMI).
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* Each InfiniBand node is required to provide a Subnet Management Agent
|
||||
* that the subnet manager can access. Prior to the fabric being fully
|
||||
* configured by the subnet manager, the SMA is accessed via a well known
|
||||
* interface called the Subnet Management Interface (SMI). This interface
|
||||
* uses directed route packets to communicate with the SM to get around the
|
||||
* chicken and egg problem of the SM needing to know what's on the fabric
|
||||
* in order to configure the fabric, and needing to configure the fabric in
|
||||
* order to send packets to the devices on the fabric. These directed
|
||||
* route packets do not need the fabric fully configured in order to reach
|
||||
* their destination. The SMI is the only method allowed to send
|
||||
* directed route packets on an InfiniBand fabric.
|
||||
*
|
||||
* Return: true if the port provides an SMI.
|
||||
*/
|
||||
static inline bool rdma_cap_ib_smi(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_SMI;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_ib_cm - Check if the port of device has the capability Infiniband
|
||||
* Communication Manager.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* The InfiniBand Communication Manager is one of many pre-defined General
|
||||
* Service Agents (GSA) that are accessed via the General Service
|
||||
* Interface (GSI). It's role is to facilitate establishment of connections
|
||||
* between nodes as well as other management related tasks for established
|
||||
* connections.
|
||||
*
|
||||
* Return: true if the port supports an IB CM (this does not guarantee that
|
||||
* a CM is actually running however).
|
||||
*/
|
||||
static inline bool rdma_cap_ib_cm(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_CM;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_iw_cm - Check if the port of device has the capability IWARP
|
||||
* Communication Manager.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* Similar to above, but specific to iWARP connections which have a different
|
||||
* managment protocol than InfiniBand.
|
||||
*
|
||||
* Return: true if the port supports an iWARP CM (this does not guarantee that
|
||||
* a CM is actually running however).
|
||||
*/
|
||||
static inline bool rdma_cap_iw_cm(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IW_CM;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_ib_sa - Check if the port of device has the capability Infiniband
|
||||
* Subnet Administration.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* An InfiniBand Subnet Administration (SA) service is a pre-defined General
|
||||
* Service Agent (GSA) provided by the Subnet Manager (SM). On InfiniBand
|
||||
* fabrics, devices should resolve routes to other hosts by contacting the
|
||||
* SA to query the proper route.
|
||||
*
|
||||
* Return: true if the port should act as a client to the fabric Subnet
|
||||
* Administration interface. This does not imply that the SA service is
|
||||
* running locally.
|
||||
*/
|
||||
static inline bool rdma_cap_ib_sa(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_SA;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_ib_mcast - Check if the port of device has the capability Infiniband
|
||||
* Multicast.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* InfiniBand multicast registration is more complex than normal IPv4 or
|
||||
* IPv6 multicast registration. Each Host Channel Adapter must register
|
||||
* with the Subnet Manager when it wishes to join a multicast group. It
|
||||
* should do so only once regardless of how many queue pairs it subscribes
|
||||
* to this group. And it should leave the group only after all queue pairs
|
||||
* attached to the group have been detached.
|
||||
*
|
||||
* Return: true if the port must undertake the additional adminstrative
|
||||
* overhead of registering/unregistering with the SM and tracking of the
|
||||
* total number of queue pairs attached to the multicast group.
|
||||
*/
|
||||
static inline bool rdma_cap_ib_mcast(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return rdma_cap_ib_sa(device, port_num);
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_af_ib - Check if the port of device has the capability
|
||||
* Native Infiniband Address.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* InfiniBand addressing uses a port's GUID + Subnet Prefix to make a default
|
||||
* GID. RoCE uses a different mechanism, but still generates a GID via
|
||||
* a prescribed mechanism and port specific data.
|
||||
*
|
||||
* Return: true if the port uses a GID address to identify devices on the
|
||||
* network.
|
||||
*/
|
||||
static inline bool rdma_cap_af_ib(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_AF_IB;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_eth_ah - Check if the port of device has the capability
|
||||
* Ethernet Address Handle.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* RoCE is InfiniBand over Ethernet, and it uses a well defined technique
|
||||
* to fabricate GIDs over Ethernet/IP specific addresses native to the
|
||||
* port. Normally, packet headers are generated by the sending host
|
||||
* adapter, but when sending connectionless datagrams, we must manually
|
||||
* inject the proper headers for the fabric we are communicating over.
|
||||
*
|
||||
* Return: true if we are running as a RoCE port and must force the
|
||||
* addition of a Global Route Header built from our Ethernet Address
|
||||
* Handle into our header list for connectionless packets.
|
||||
*/
|
||||
static inline bool rdma_cap_eth_ah(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_ETH_AH;
|
||||
}
|
||||
|
||||
/**
|
||||
* rdma_cap_read_multi_sge - Check if the port of device has the capability
|
||||
* RDMA Read Multiple Scatter-Gather Entries.
|
||||
* @device: Device to check
|
||||
* @port_num: Port number to check
|
||||
*
|
||||
* iWARP has a restriction that RDMA READ requests may only have a single
|
||||
* Scatter/Gather Entry (SGE) in the work request.
|
||||
*
|
||||
* NOTE: although the linux kernel currently assumes all devices are either
|
||||
* single SGE RDMA READ devices or identical SGE maximums for RDMA READs and
|
||||
* WRITEs, according to Tom Talpey, this is not accurate. There are some
|
||||
* devices out there that support more than a single SGE on RDMA READ
|
||||
* requests, but do not support the same number of SGEs as they do on
|
||||
* RDMA WRITE requests. The linux kernel would need rearchitecting to
|
||||
* support these imbalanced READ/WRITE SGEs allowed devices. So, for now,
|
||||
* suffice with either the device supports the same READ/WRITE SGEs, or
|
||||
* it only gets one READ sge.
|
||||
*
|
||||
* Return: true for any device that allows more than one SGE in RDMA READ
|
||||
* requests.
|
||||
*/
|
||||
static inline bool rdma_cap_read_multi_sge(struct ib_device *device,
|
||||
u8 port_num)
|
||||
{
|
||||
return !(device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_IWARP);
|
||||
}
|
||||
|
||||
int ib_query_gid(struct ib_device *device,
|
||||
u8 port_num, int index, union ib_gid *gid);
|
||||
|
||||
|
@@ -62,6 +62,8 @@ enum rdma_cm_event_type {
|
||||
RDMA_CM_EVENT_TIMEWAIT_EXIT
|
||||
};
|
||||
|
||||
__attribute_const__ const char *rdma_event_msg(enum rdma_cm_event_type event);
|
||||
|
||||
enum rdma_port_space {
|
||||
RDMA_PS_SDP = 0x0001,
|
||||
RDMA_PS_IPOIB = 0x0002,
|
||||
|
Reference in New Issue
Block a user