mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-26 06:33:19 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (63 commits) IB/qib: clean up properly if pci_set_consistent_dma_mask() fails IB/qib: Allow driver to load if PCIe AER fails IB/qib: Fix uninitialized pointer if CONFIG_PCI_MSI not set IB/qib: Fix extra log level in qib_early_err() RDMA/cxgb4: Remove unnecessary KERN_<level> use RDMA/cxgb3: Remove unnecessary KERN_<level> use IB/core: Add link layer type information to sysfs IB/mlx4: Add VLAN support for IBoE IB/core: Add VLAN support for IBoE IB/mlx4: Add support for IBoE mlx4_en: Change multicast promiscuous mode to support IBoE mlx4_core: Update data structures and constants for IBoE mlx4_core: Allow protocol drivers to find corresponding interfaces IB/uverbs: Return link layer type to userspace for query port operation IB/srp: Sync buffer before posting send IB/srp: Use list_first_entry() IB/srp: Reduce number of BUSY conditions IB/srp: Eliminate two forward declarations IB/mlx4: Signal node desc changes to SM by using FW to generate trap 144 IB: Replace EXTRA_CFLAGS with ccflags-y ...
This commit is contained in:
commit
9e5fca251f
74 changed files with 2671 additions and 726 deletions
|
|
@ -58,6 +58,7 @@ enum {
|
|||
MLX4_CMD_SENSE_PORT = 0x4d,
|
||||
MLX4_CMD_HW_HEALTH_CHECK = 0x50,
|
||||
MLX4_CMD_SET_PORT = 0xc,
|
||||
MLX4_CMD_SET_NODE = 0x5a,
|
||||
MLX4_CMD_ACCESS_DDR = 0x2e,
|
||||
MLX4_CMD_MAP_ICM = 0xffa,
|
||||
MLX4_CMD_UNMAP_ICM = 0xff9,
|
||||
|
|
@ -141,6 +142,7 @@ enum {
|
|||
MLX4_SET_PORT_MAC_TABLE = 0x2,
|
||||
MLX4_SET_PORT_VLAN_TABLE = 0x3,
|
||||
MLX4_SET_PORT_PRIO_MAP = 0x4,
|
||||
MLX4_SET_PORT_GID_TABLE = 0x5,
|
||||
};
|
||||
|
||||
struct mlx4_dev;
|
||||
|
|
|
|||
|
|
@ -67,7 +67,8 @@ enum {
|
|||
MLX4_DEV_CAP_FLAG_ATOMIC = 1 << 18,
|
||||
MLX4_DEV_CAP_FLAG_RAW_MCAST = 1 << 19,
|
||||
MLX4_DEV_CAP_FLAG_UD_AV_PORT = 1 << 20,
|
||||
MLX4_DEV_CAP_FLAG_UD_MCAST = 1 << 21
|
||||
MLX4_DEV_CAP_FLAG_UD_MCAST = 1 << 21,
|
||||
MLX4_DEV_CAP_FLAG_IBOE = 1 << 30
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
@ -171,6 +172,10 @@ enum {
|
|||
MLX4_NUM_FEXCH = 64 * 1024,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX4_MAX_FAST_REG_PAGES = 511,
|
||||
};
|
||||
|
||||
static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor)
|
||||
{
|
||||
return (major << 32) | (minor << 16) | subminor;
|
||||
|
|
@ -379,6 +384,27 @@ struct mlx4_av {
|
|||
u8 dgid[16];
|
||||
};
|
||||
|
||||
struct mlx4_eth_av {
|
||||
__be32 port_pd;
|
||||
u8 reserved1;
|
||||
u8 smac_idx;
|
||||
u16 reserved2;
|
||||
u8 reserved3;
|
||||
u8 gid_index;
|
||||
u8 stat_rate;
|
||||
u8 hop_limit;
|
||||
__be32 sl_tclass_flowlabel;
|
||||
u8 dgid[16];
|
||||
u32 reserved4[2];
|
||||
__be16 vlan;
|
||||
u8 mac[6];
|
||||
};
|
||||
|
||||
union mlx4_ext_av {
|
||||
struct mlx4_av ib;
|
||||
struct mlx4_eth_av eth;
|
||||
};
|
||||
|
||||
struct mlx4_dev {
|
||||
struct pci_dev *pdev;
|
||||
unsigned long flags;
|
||||
|
|
@ -407,6 +433,12 @@ struct mlx4_init_port_param {
|
|||
if (((type) == MLX4_PORT_TYPE_IB ? (dev)->caps.port_mask : \
|
||||
~(dev)->caps.port_mask) & 1 << ((port) - 1))
|
||||
|
||||
#define mlx4_foreach_ib_transport_port(port, dev) \
|
||||
for ((port) = 1; (port) <= (dev)->caps.num_ports; (port)++) \
|
||||
if (((dev)->caps.port_mask & 1 << ((port) - 1)) || \
|
||||
((dev)->caps.flags & MLX4_DEV_CAP_FLAG_IBOE))
|
||||
|
||||
|
||||
int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct,
|
||||
struct mlx4_buf *buf);
|
||||
void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf);
|
||||
|
|
@ -474,6 +506,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]);
|
|||
int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac, int *index);
|
||||
void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int index);
|
||||
|
||||
int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx);
|
||||
int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index);
|
||||
void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index);
|
||||
|
||||
|
|
|
|||
|
|
@ -44,15 +44,24 @@ enum mlx4_dev_event {
|
|||
MLX4_DEV_EVENT_PORT_REINIT,
|
||||
};
|
||||
|
||||
enum mlx4_protocol {
|
||||
MLX4_PROTOCOL_IB,
|
||||
MLX4_PROTOCOL_EN,
|
||||
};
|
||||
|
||||
struct mlx4_interface {
|
||||
void * (*add) (struct mlx4_dev *dev);
|
||||
void (*remove)(struct mlx4_dev *dev, void *context);
|
||||
void (*event) (struct mlx4_dev *dev, void *context,
|
||||
enum mlx4_dev_event event, int port);
|
||||
void * (*get_dev)(struct mlx4_dev *dev, void *context, u8 port);
|
||||
struct list_head list;
|
||||
enum mlx4_protocol protocol;
|
||||
};
|
||||
|
||||
int mlx4_register_interface(struct mlx4_interface *intf);
|
||||
void mlx4_unregister_interface(struct mlx4_interface *intf);
|
||||
|
||||
void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port);
|
||||
|
||||
#endif /* MLX4_DRIVER_H */
|
||||
|
|
|
|||
|
|
@ -109,10 +109,11 @@ struct mlx4_qp_path {
|
|||
__be32 tclass_flowlabel;
|
||||
u8 rgid[16];
|
||||
u8 sched_queue;
|
||||
u8 snooper_flags;
|
||||
u8 vlan_index;
|
||||
u8 reserved3[2];
|
||||
u8 counter_index;
|
||||
u8 reserved4[7];
|
||||
u8 reserved4;
|
||||
u8 dmac[6];
|
||||
};
|
||||
|
||||
struct mlx4_qp_context {
|
||||
|
|
@ -166,6 +167,7 @@ enum {
|
|||
MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5,
|
||||
MLX4_WQE_CTRL_INS_VLAN = 1 << 6,
|
||||
MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7,
|
||||
MLX4_WQE_CTRL_FORCE_LOOPBACK = 1 << 0,
|
||||
};
|
||||
|
||||
struct mlx4_wqe_ctrl_seg {
|
||||
|
|
@ -219,7 +221,8 @@ struct mlx4_wqe_datagram_seg {
|
|||
__be32 av[8];
|
||||
__be32 dqpn;
|
||||
__be32 qkey;
|
||||
__be32 reservd[2];
|
||||
__be16 vlan;
|
||||
u8 mac[6];
|
||||
};
|
||||
|
||||
struct mlx4_wqe_lso_seg {
|
||||
|
|
|
|||
|
|
@ -39,7 +39,9 @@
|
|||
#include <linux/if_arp.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/ib_pack.h>
|
||||
|
||||
struct rdma_addr_client {
|
||||
atomic_t refcount;
|
||||
|
|
@ -63,6 +65,7 @@ struct rdma_dev_addr {
|
|||
unsigned char broadcast[MAX_ADDR_LEN];
|
||||
unsigned short dev_type;
|
||||
int bound_dev_if;
|
||||
enum rdma_transport_type transport;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -127,9 +130,51 @@ static inline int rdma_addr_gid_offset(struct rdma_dev_addr *dev_addr)
|
|||
return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0;
|
||||
}
|
||||
|
||||
static inline void iboe_mac_vlan_to_ll(union ib_gid *gid, u8 *mac, u16 vid)
|
||||
{
|
||||
memset(gid->raw, 0, 16);
|
||||
*((__be32 *) gid->raw) = cpu_to_be32(0xfe800000);
|
||||
if (vid < 0x1000) {
|
||||
gid->raw[12] = vid & 0xff;
|
||||
gid->raw[11] = vid >> 8;
|
||||
} else {
|
||||
gid->raw[12] = 0xfe;
|
||||
gid->raw[11] = 0xff;
|
||||
}
|
||||
memcpy(gid->raw + 13, mac + 3, 3);
|
||||
memcpy(gid->raw + 8, mac, 3);
|
||||
gid->raw[8] ^= 2;
|
||||
}
|
||||
|
||||
static inline u16 rdma_vlan_dev_vlan_id(const struct net_device *dev)
|
||||
{
|
||||
return dev->priv_flags & IFF_802_1Q_VLAN ?
|
||||
vlan_dev_vlan_id(dev) : 0xffff;
|
||||
}
|
||||
|
||||
static inline void iboe_addr_get_sgid(struct rdma_dev_addr *dev_addr,
|
||||
union ib_gid *gid)
|
||||
{
|
||||
struct net_device *dev;
|
||||
u16 vid = 0xffff;
|
||||
|
||||
dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if);
|
||||
if (dev) {
|
||||
vid = rdma_vlan_dev_vlan_id(dev);
|
||||
dev_put(dev);
|
||||
}
|
||||
|
||||
iboe_mac_vlan_to_ll(gid, dev_addr->src_dev_addr, vid);
|
||||
}
|
||||
|
||||
static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid)
|
||||
{
|
||||
memcpy(gid, dev_addr->src_dev_addr + rdma_addr_gid_offset(dev_addr), sizeof *gid);
|
||||
if (dev_addr->transport == RDMA_TRANSPORT_IB &&
|
||||
dev_addr->dev_type != ARPHRD_INFINIBAND)
|
||||
iboe_addr_get_sgid(dev_addr, gid);
|
||||
else
|
||||
memcpy(gid, dev_addr->src_dev_addr +
|
||||
rdma_addr_gid_offset(dev_addr), sizeof *gid);
|
||||
}
|
||||
|
||||
static inline void rdma_addr_set_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid)
|
||||
|
|
@ -147,4 +192,91 @@ static inline void rdma_addr_set_dgid(struct rdma_dev_addr *dev_addr, union ib_g
|
|||
memcpy(dev_addr->dst_dev_addr + rdma_addr_gid_offset(dev_addr), gid, sizeof *gid);
|
||||
}
|
||||
|
||||
static inline enum ib_mtu iboe_get_mtu(int mtu)
|
||||
{
|
||||
/*
|
||||
* reduce IB headers from effective IBoE MTU. 28 stands for
|
||||
* atomic header which is the biggest possible header after BTH
|
||||
*/
|
||||
mtu = mtu - IB_GRH_BYTES - IB_BTH_BYTES - 28;
|
||||
|
||||
if (mtu >= ib_mtu_enum_to_int(IB_MTU_4096))
|
||||
return IB_MTU_4096;
|
||||
else if (mtu >= ib_mtu_enum_to_int(IB_MTU_2048))
|
||||
return IB_MTU_2048;
|
||||
else if (mtu >= ib_mtu_enum_to_int(IB_MTU_1024))
|
||||
return IB_MTU_1024;
|
||||
else if (mtu >= ib_mtu_enum_to_int(IB_MTU_512))
|
||||
return IB_MTU_512;
|
||||
else if (mtu >= ib_mtu_enum_to_int(IB_MTU_256))
|
||||
return IB_MTU_256;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int iboe_get_rate(struct net_device *dev)
|
||||
{
|
||||
struct ethtool_cmd cmd;
|
||||
|
||||
if (!dev->ethtool_ops || !dev->ethtool_ops->get_settings ||
|
||||
dev->ethtool_ops->get_settings(dev, &cmd))
|
||||
return IB_RATE_PORT_CURRENT;
|
||||
|
||||
if (cmd.speed >= 40000)
|
||||
return IB_RATE_40_GBPS;
|
||||
else if (cmd.speed >= 30000)
|
||||
return IB_RATE_30_GBPS;
|
||||
else if (cmd.speed >= 20000)
|
||||
return IB_RATE_20_GBPS;
|
||||
else if (cmd.speed >= 10000)
|
||||
return IB_RATE_10_GBPS;
|
||||
else
|
||||
return IB_RATE_PORT_CURRENT;
|
||||
}
|
||||
|
||||
static inline int rdma_link_local_addr(struct in6_addr *addr)
|
||||
{
|
||||
if (addr->s6_addr32[0] == htonl(0xfe800000) &&
|
||||
addr->s6_addr32[1] == 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void rdma_get_ll_mac(struct in6_addr *addr, u8 *mac)
|
||||
{
|
||||
memcpy(mac, &addr->s6_addr[8], 3);
|
||||
memcpy(mac + 3, &addr->s6_addr[13], 3);
|
||||
mac[0] ^= 2;
|
||||
}
|
||||
|
||||
static inline int rdma_is_multicast_addr(struct in6_addr *addr)
|
||||
{
|
||||
return addr->s6_addr[0] == 0xff;
|
||||
}
|
||||
|
||||
static inline void rdma_get_mcast_mac(struct in6_addr *addr, u8 *mac)
|
||||
{
|
||||
int i;
|
||||
|
||||
mac[0] = 0x33;
|
||||
mac[1] = 0x33;
|
||||
for (i = 2; i < 6; ++i)
|
||||
mac[i] = addr->s6_addr[i + 10];
|
||||
}
|
||||
|
||||
static inline u16 rdma_get_vlan_id(union ib_gid *dgid)
|
||||
{
|
||||
u16 vid;
|
||||
|
||||
vid = dgid->raw[11] << 8 | dgid->raw[12];
|
||||
return vid < 0x1000 ? vid : 0xffff;
|
||||
}
|
||||
|
||||
static inline struct net_device *rdma_vlan_dev_real_dev(const struct net_device *dev)
|
||||
{
|
||||
return dev->priv_flags & IFF_802_1Q_VLAN ?
|
||||
vlan_dev_real_dev(dev) : 0;
|
||||
}
|
||||
|
||||
#endif /* IB_ADDR_H */
|
||||
|
|
|
|||
|
|
@ -37,6 +37,8 @@
|
|||
|
||||
enum {
|
||||
IB_LRH_BYTES = 8,
|
||||
IB_ETH_BYTES = 14,
|
||||
IB_VLAN_BYTES = 4,
|
||||
IB_GRH_BYTES = 40,
|
||||
IB_BTH_BYTES = 12,
|
||||
IB_DETH_BYTES = 8
|
||||
|
|
@ -210,14 +212,32 @@ struct ib_unpacked_deth {
|
|||
__be32 source_qpn;
|
||||
};
|
||||
|
||||
struct ib_unpacked_eth {
|
||||
u8 dmac_h[4];
|
||||
u8 dmac_l[2];
|
||||
u8 smac_h[2];
|
||||
u8 smac_l[4];
|
||||
__be16 type;
|
||||
};
|
||||
|
||||
struct ib_unpacked_vlan {
|
||||
__be16 tag;
|
||||
__be16 type;
|
||||
};
|
||||
|
||||
struct ib_ud_header {
|
||||
int lrh_present;
|
||||
struct ib_unpacked_lrh lrh;
|
||||
int grh_present;
|
||||
struct ib_unpacked_grh grh;
|
||||
struct ib_unpacked_bth bth;
|
||||
int eth_present;
|
||||
struct ib_unpacked_eth eth;
|
||||
int vlan_present;
|
||||
struct ib_unpacked_vlan vlan;
|
||||
int grh_present;
|
||||
struct ib_unpacked_grh grh;
|
||||
struct ib_unpacked_bth bth;
|
||||
struct ib_unpacked_deth deth;
|
||||
int immediate_present;
|
||||
__be32 immediate_data;
|
||||
int immediate_present;
|
||||
__be32 immediate_data;
|
||||
};
|
||||
|
||||
void ib_pack(const struct ib_field *desc,
|
||||
|
|
@ -230,9 +250,12 @@ void ib_unpack(const struct ib_field *desc,
|
|||
void *buf,
|
||||
void *structure);
|
||||
|
||||
void ib_ud_header_init(int payload_bytes,
|
||||
int grh_present,
|
||||
int immediate_present,
|
||||
void ib_ud_header_init(int payload_bytes,
|
||||
int lrh_present,
|
||||
int eth_present,
|
||||
int vlan_present,
|
||||
int grh_present,
|
||||
int immediate_present,
|
||||
struct ib_ud_header *header);
|
||||
|
||||
int ib_ud_header_pack(struct ib_ud_header *header,
|
||||
|
|
|
|||
|
|
@ -205,7 +205,8 @@ struct ib_uverbs_query_port_resp {
|
|||
__u8 active_width;
|
||||
__u8 active_speed;
|
||||
__u8 phys_state;
|
||||
__u8 reserved[3];
|
||||
__u8 link_layer;
|
||||
__u8 reserved[2];
|
||||
};
|
||||
|
||||
struct ib_uverbs_alloc_pd {
|
||||
|
|
|
|||
|
|
@ -75,6 +75,12 @@ enum rdma_transport_type {
|
|||
enum rdma_transport_type
|
||||
rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__;
|
||||
|
||||
enum rdma_link_layer {
|
||||
IB_LINK_LAYER_UNSPECIFIED,
|
||||
IB_LINK_LAYER_INFINIBAND,
|
||||
IB_LINK_LAYER_ETHERNET,
|
||||
};
|
||||
|
||||
enum ib_device_cap_flags {
|
||||
IB_DEVICE_RESIZE_MAX_WR = 1,
|
||||
IB_DEVICE_BAD_PKEY_CNTR = (1<<1),
|
||||
|
|
@ -1010,6 +1016,8 @@ struct ib_device {
|
|||
int (*query_port)(struct ib_device *device,
|
||||
u8 port_num,
|
||||
struct ib_port_attr *port_attr);
|
||||
enum rdma_link_layer (*get_link_layer)(struct ib_device *device,
|
||||
u8 port_num);
|
||||
int (*query_gid)(struct ib_device *device,
|
||||
u8 port_num, int index,
|
||||
union ib_gid *gid);
|
||||
|
|
@ -1222,6 +1230,9 @@ int ib_query_device(struct ib_device *device,
|
|||
int ib_query_port(struct ib_device *device,
|
||||
u8 port_num, struct ib_port_attr *port_attr);
|
||||
|
||||
enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device,
|
||||
u8 port_num);
|
||||
|
||||
int ib_query_gid(struct ib_device *device,
|
||||
u8 port_num, int index, union ib_gid *gid);
|
||||
|
||||
|
|
|
|||
|
|
@ -239,4 +239,42 @@ struct srp_rsp {
|
|||
u8 data[0];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct srp_cred_req {
|
||||
u8 opcode;
|
||||
u8 sol_not;
|
||||
u8 reserved[2];
|
||||
__be32 req_lim_delta;
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
struct srp_cred_rsp {
|
||||
u8 opcode;
|
||||
u8 reserved[7];
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
/*
|
||||
* The SRP spec defines the fixed portion of the AER_REQ structure to be
|
||||
* 36 bytes, so it needs to be packed to avoid having it padded to 40 bytes
|
||||
* on 64-bit architectures.
|
||||
*/
|
||||
struct srp_aer_req {
|
||||
u8 opcode;
|
||||
u8 sol_not;
|
||||
u8 reserved[2];
|
||||
__be32 req_lim_delta;
|
||||
u64 tag;
|
||||
u32 reserved2;
|
||||
__be64 lun;
|
||||
__be32 sense_data_len;
|
||||
u32 reserved3;
|
||||
u8 sense_data[0];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct srp_aer_rsp {
|
||||
u8 opcode;
|
||||
u8 reserved[7];
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
#endif /* SCSI_SRP_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue