mirror of
https://github.com/torvalds/linux.git
synced 2024-10-31 17:21:49 +00:00
[PATCH] IB/mthca: Use correct port width capability value
When we call the INIT_IB firmware command to bring up a port, use the actual port width capability returned by the QUERY_DEV_LIM command instead of always trying to enable both 1X and 4X. This fixes breakage seen when the firmware is build to allow 4X only. Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
2aeba9a03b
commit
da6561c285
@ -1282,10 +1282,8 @@ int mthca_INIT_IB(struct mthca_dev *dev,
|
||||
#define INIT_IB_FLAG_SIG (1 << 18)
|
||||
#define INIT_IB_FLAG_NG (1 << 17)
|
||||
#define INIT_IB_FLAG_G0 (1 << 16)
|
||||
#define INIT_IB_FLAG_1X (1 << 8)
|
||||
#define INIT_IB_FLAG_4X (1 << 9)
|
||||
#define INIT_IB_FLAG_12X (1 << 11)
|
||||
#define INIT_IB_VL_SHIFT 4
|
||||
#define INIT_IB_PORT_WIDTH_SHIFT 8
|
||||
#define INIT_IB_MTU_SHIFT 12
|
||||
#define INIT_IB_MAX_GID_OFFSET 0x06
|
||||
#define INIT_IB_MAX_PKEY_OFFSET 0x0a
|
||||
@ -1301,12 +1299,11 @@ int mthca_INIT_IB(struct mthca_dev *dev,
|
||||
memset(inbox, 0, INIT_IB_IN_SIZE);
|
||||
|
||||
flags = 0;
|
||||
flags |= param->enable_1x ? INIT_IB_FLAG_1X : 0;
|
||||
flags |= param->enable_4x ? INIT_IB_FLAG_4X : 0;
|
||||
flags |= param->set_guid0 ? INIT_IB_FLAG_G0 : 0;
|
||||
flags |= param->set_node_guid ? INIT_IB_FLAG_NG : 0;
|
||||
flags |= param->set_si_guid ? INIT_IB_FLAG_SIG : 0;
|
||||
flags |= param->vl_cap << INIT_IB_VL_SHIFT;
|
||||
flags |= param->port_width << INIT_IB_PORT_WIDTH_SHIFT;
|
||||
flags |= param->mtu_cap << INIT_IB_MTU_SHIFT;
|
||||
MTHCA_PUT(inbox, flags, INIT_IB_FLAGS_OFFSET);
|
||||
|
||||
|
@ -220,8 +220,7 @@ struct mthca_init_hca_param {
|
||||
};
|
||||
|
||||
struct mthca_init_ib_param {
|
||||
int enable_1x;
|
||||
int enable_4x;
|
||||
int port_width;
|
||||
int vl_cap;
|
||||
int mtu_cap;
|
||||
u16 gid_cap;
|
||||
|
@ -148,6 +148,7 @@ struct mthca_limits {
|
||||
int reserved_mcgs;
|
||||
int num_pds;
|
||||
int reserved_pds;
|
||||
u8 port_width_cap;
|
||||
};
|
||||
|
||||
struct mthca_alloc {
|
||||
|
@ -171,6 +171,7 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim
|
||||
mdev->limits.reserved_mrws = dev_lim->reserved_mrws;
|
||||
mdev->limits.reserved_uars = dev_lim->reserved_uars;
|
||||
mdev->limits.reserved_pds = dev_lim->reserved_pds;
|
||||
mdev->limits.port_width_cap = dev_lim->max_port_width;
|
||||
|
||||
/* IB_DEVICE_RESIZE_MAX_WR not supported by driver.
|
||||
May be doable since hardware supports it for SRQ.
|
||||
|
@ -575,12 +575,11 @@ static void init_port(struct mthca_dev *dev, int port)
|
||||
|
||||
memset(¶m, 0, sizeof param);
|
||||
|
||||
param.enable_1x = 1;
|
||||
param.enable_4x = 1;
|
||||
param.vl_cap = dev->limits.vl_cap;
|
||||
param.mtu_cap = dev->limits.mtu_cap;
|
||||
param.gid_cap = dev->limits.gid_table_len;
|
||||
param.pkey_cap = dev->limits.pkey_table_len;
|
||||
param.port_width = dev->limits.port_width_cap;
|
||||
param.vl_cap = dev->limits.vl_cap;
|
||||
param.mtu_cap = dev->limits.mtu_cap;
|
||||
param.gid_cap = dev->limits.gid_table_len;
|
||||
param.pkey_cap = dev->limits.pkey_table_len;
|
||||
|
||||
err = mthca_INIT_IB(dev, ¶m, port, &status);
|
||||
if (err)
|
||||
|
Loading…
Reference in New Issue
Block a user