Commit 3af2e092 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin Committed by Linus Torvalds

[PATCH] IB/mthca: implement query of device caps

Set device_cap_flags field in mthca's query_device method.
Signed-off-by: default avatarMichael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: default avatarRoland Dreier <roland@topspin.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 1781dd37
...@@ -95,7 +95,21 @@ enum { ...@@ -95,7 +95,21 @@ enum {
}; };
enum { enum {
DEV_LIM_FLAG_SRQ = 1 << 6 DEV_LIM_FLAG_RC = 1 << 0,
DEV_LIM_FLAG_UC = 1 << 1,
DEV_LIM_FLAG_UD = 1 << 2,
DEV_LIM_FLAG_RD = 1 << 3,
DEV_LIM_FLAG_RAW_IPV6 = 1 << 4,
DEV_LIM_FLAG_RAW_ETHER = 1 << 5,
DEV_LIM_FLAG_SRQ = 1 << 6,
DEV_LIM_FLAG_BAD_PKEY_CNTR = 1 << 8,
DEV_LIM_FLAG_BAD_QKEY_CNTR = 1 << 9,
DEV_LIM_FLAG_MW = 1 << 16,
DEV_LIM_FLAG_AUTO_PATH_MIG = 1 << 17,
DEV_LIM_FLAG_ATOMIC = 1 << 18,
DEV_LIM_FLAG_RAW_MULTI = 1 << 19,
DEV_LIM_FLAG_UD_AV_PORT_ENFORCE = 1 << 20,
DEV_LIM_FLAG_UD_MULTI = 1 << 21,
}; };
struct mthca_dev_lim { struct mthca_dev_lim {
......
...@@ -218,6 +218,7 @@ struct mthca_dev { ...@@ -218,6 +218,7 @@ struct mthca_dev {
int hca_type; int hca_type;
unsigned long mthca_flags; unsigned long mthca_flags;
unsigned long device_cap_flags;
u32 rev_id; u32 rev_id;
......
...@@ -171,6 +171,33 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim ...@@ -171,6 +171,33 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim
mdev->limits.reserved_uars = dev_lim->reserved_uars; mdev->limits.reserved_uars = dev_lim->reserved_uars;
mdev->limits.reserved_pds = dev_lim->reserved_pds; mdev->limits.reserved_pds = dev_lim->reserved_pds;
/* IB_DEVICE_RESIZE_MAX_WR not supported by driver.
May be doable since hardware supports it for SRQ.
IB_DEVICE_N_NOTIFY_CQ is supported by hardware but not by driver.
IB_DEVICE_SRQ_RESIZE is supported by hardware but SRQ is not
supported by driver. */
mdev->device_cap_flags = IB_DEVICE_CHANGE_PHY_PORT |
IB_DEVICE_PORT_ACTIVE_EVENT |
IB_DEVICE_SYS_IMAGE_GUID |
IB_DEVICE_RC_RNR_NAK_GEN;
if (dev_lim->flags & DEV_LIM_FLAG_BAD_PKEY_CNTR)
mdev->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR;
if (dev_lim->flags & DEV_LIM_FLAG_BAD_QKEY_CNTR)
mdev->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR;
if (dev_lim->flags & DEV_LIM_FLAG_RAW_MULTI)
mdev->device_cap_flags |= IB_DEVICE_RAW_MULTI;
if (dev_lim->flags & DEV_LIM_FLAG_AUTO_PATH_MIG)
mdev->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG;
if (dev_lim->flags & DEV_LIM_FLAG_UD_AV_PORT_ENFORCE)
mdev->device_cap_flags |= IB_DEVICE_UD_AV_PORT_ENFORCE;
if (dev_lim->flags & DEV_LIM_FLAG_SRQ) if (dev_lim->flags & DEV_LIM_FLAG_SRQ)
mdev->mthca_flags |= MTHCA_FLAG_SRQ; mdev->mthca_flags |= MTHCA_FLAG_SRQ;
......
...@@ -43,6 +43,8 @@ static int mthca_query_device(struct ib_device *ibdev, ...@@ -43,6 +43,8 @@ static int mthca_query_device(struct ib_device *ibdev,
struct ib_smp *in_mad = NULL; struct ib_smp *in_mad = NULL;
struct ib_smp *out_mad = NULL; struct ib_smp *out_mad = NULL;
int err = -ENOMEM; int err = -ENOMEM;
struct mthca_dev* mdev = to_mdev(ibdev);
u8 status; u8 status;
in_mad = kmalloc(sizeof *in_mad, GFP_KERNEL); in_mad = kmalloc(sizeof *in_mad, GFP_KERNEL);
...@@ -50,7 +52,7 @@ static int mthca_query_device(struct ib_device *ibdev, ...@@ -50,7 +52,7 @@ static int mthca_query_device(struct ib_device *ibdev,
if (!in_mad || !out_mad) if (!in_mad || !out_mad)
goto out; goto out;
props->fw_ver = to_mdev(ibdev)->fw_ver; props->fw_ver = mdev->fw_ver;
memset(in_mad, 0, sizeof *in_mad); memset(in_mad, 0, sizeof *in_mad);
in_mad->base_version = 1; in_mad->base_version = 1;
...@@ -59,7 +61,7 @@ static int mthca_query_device(struct ib_device *ibdev, ...@@ -59,7 +61,7 @@ static int mthca_query_device(struct ib_device *ibdev,
in_mad->method = IB_MGMT_METHOD_GET; in_mad->method = IB_MGMT_METHOD_GET;
in_mad->attr_id = IB_SMP_ATTR_NODE_INFO; in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1, err = mthca_MAD_IFC(mdev, 1, 1,
1, NULL, NULL, in_mad, out_mad, 1, NULL, NULL, in_mad, out_mad,
&status); &status);
if (err) if (err)
...@@ -69,10 +71,11 @@ static int mthca_query_device(struct ib_device *ibdev, ...@@ -69,10 +71,11 @@ static int mthca_query_device(struct ib_device *ibdev,
goto out; goto out;
} }
props->vendor_id = be32_to_cpup((u32 *) (out_mad->data + 36)) & props->device_cap_flags = mdev->device_cap_flags;
props->vendor_id = be32_to_cpup((u32 *) (out_mad->data + 36)) &
0xffffff; 0xffffff;
props->vendor_part_id = be16_to_cpup((u16 *) (out_mad->data + 30)); props->vendor_part_id = be16_to_cpup((u16 *) (out_mad->data + 30));
props->hw_ver = be16_to_cpup((u16 *) (out_mad->data + 32)); props->hw_ver = be16_to_cpup((u16 *) (out_mad->data + 32));
memcpy(&props->sys_image_guid, out_mad->data + 4, 8); memcpy(&props->sys_image_guid, out_mad->data + 4, 8);
memcpy(&props->node_guid, out_mad->data + 12, 8); memcpy(&props->node_guid, out_mad->data + 12, 8);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment