IB/rdmavt: Add support for query_port, modify_port and get_port_immutable
rvt_query_port calls into the driver through a call back function query_port_state to populate the rest of ib_port_attr elements. rvt_modify_port calls into the driver if needed through a call back function shut_down_port() Signed-off-by: Harish Chegondi <harish.chegondi@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
1f024992ef
commit
61a650c14d
|
@ -128,14 +128,27 @@ static int rvt_modify_device(struct ib_device *device,
|
||||||
static int rvt_query_port(struct ib_device *ibdev, u8 port_num,
|
static int rvt_query_port(struct ib_device *ibdev, u8 port_num,
|
||||||
struct ib_port_attr *props)
|
struct ib_port_attr *props)
|
||||||
{
|
{
|
||||||
if (ibport_num_to_idx(ibdev, port_num) < 0)
|
struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
|
||||||
|
struct rvt_ibport *rvp;
|
||||||
|
int port_index = ibport_num_to_idx(ibdev, port_num);
|
||||||
|
|
||||||
|
if (port_index < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
rvp = rdi->ports[port_index];
|
||||||
* VT-DRIVER-API: query_port_state()
|
memset(props, 0, sizeof(*props));
|
||||||
* driver returns pretty much everything in ib_port_attr
|
props->sm_lid = rvp->sm_lid;
|
||||||
*/
|
props->sm_sl = rvp->sm_sl;
|
||||||
return -EOPNOTSUPP;
|
props->port_cap_flags = rvp->port_cap_flags;
|
||||||
|
props->max_msg_sz = 0x80000000;
|
||||||
|
props->pkey_tbl_len = rvt_get_npkeys(rdi);
|
||||||
|
props->bad_pkey_cntr = rvp->pkey_violations;
|
||||||
|
props->qkey_viol_cntr = rvp->qkey_violations;
|
||||||
|
props->subnet_timeout = rvp->subnet_timeout;
|
||||||
|
props->init_type_reply = 0;
|
||||||
|
|
||||||
|
/* Populate the remaining ib_port_attr elements */
|
||||||
|
return rdi->driver_f.query_port_state(rdi, port_num, props);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -150,23 +163,26 @@ static int rvt_query_port(struct ib_device *ibdev, u8 port_num,
|
||||||
static int rvt_modify_port(struct ib_device *ibdev, u8 port_num,
|
static int rvt_modify_port(struct ib_device *ibdev, u8 port_num,
|
||||||
int port_modify_mask, struct ib_port_modify *props)
|
int port_modify_mask, struct ib_port_modify *props)
|
||||||
{
|
{
|
||||||
/*
|
struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
|
||||||
* VT-DRIVER-API: set_link_state()
|
struct rvt_ibport *rvp;
|
||||||
* driver will set the link state using the IB enumeration
|
int ret = 0;
|
||||||
*
|
int port_index = ibport_num_to_idx(ibdev, port_num);
|
||||||
* VT-DRIVER-API: clear_qkey_violations()
|
|
||||||
* clears driver private qkey counter
|
if (port_index < 0)
|
||||||
*
|
|
||||||
* VT-DRIVER-API: get_lid()
|
|
||||||
* driver needs to return the LID
|
|
||||||
*
|
|
||||||
* TBD: send_trap() and post_mad_send() need examined to see where they
|
|
||||||
* fit in.
|
|
||||||
*/
|
|
||||||
if (ibport_num_to_idx(ibdev, port_num) < 0)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return -EOPNOTSUPP;
|
rvp = rdi->ports[port_index];
|
||||||
|
rvp->port_cap_flags |= props->set_port_cap_mask;
|
||||||
|
rvp->port_cap_flags &= ~props->clr_port_cap_mask;
|
||||||
|
|
||||||
|
if (props->set_port_cap_mask || props->clr_port_cap_mask)
|
||||||
|
rdi->driver_f.cap_mask_chg(rdi, port_num);
|
||||||
|
if (port_modify_mask & IB_PORT_SHUTDOWN)
|
||||||
|
ret = rdi->driver_f.shut_down_port(rdi, port_num);
|
||||||
|
if (port_modify_mask & IB_PORT_RESET_QKEY_CNTR)
|
||||||
|
rvp->qkey_violations = 0;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -273,7 +289,24 @@ static int rvt_dealloc_ucontext(struct ib_ucontext *context)
|
||||||
static int rvt_get_port_immutable(struct ib_device *ibdev, u8 port_num,
|
static int rvt_get_port_immutable(struct ib_device *ibdev, u8 port_num,
|
||||||
struct ib_port_immutable *immutable)
|
struct ib_port_immutable *immutable)
|
||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
|
||||||
|
struct ib_port_attr attr;
|
||||||
|
int err, port_index;
|
||||||
|
|
||||||
|
port_index = ibport_num_to_idx(ibdev, port_num);
|
||||||
|
if (port_index < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
err = rvt_query_port(ibdev, port_num, &attr);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
immutable->pkey_tbl_len = attr.pkey_tbl_len;
|
||||||
|
immutable->gid_tbl_len = attr.gid_tbl_len;
|
||||||
|
immutable->core_cap_flags = rdi->dparms.core_cap_flags;
|
||||||
|
immutable->max_mad_size = rdi->dparms.max_mad_size;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -200,6 +200,8 @@ struct rvt_driver_params {
|
||||||
int psn_mask;
|
int psn_mask;
|
||||||
int psn_shift;
|
int psn_shift;
|
||||||
int psn_modify_mask;
|
int psn_modify_mask;
|
||||||
|
u32 core_cap_flags;
|
||||||
|
u32 max_mad_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Protection domain */
|
/* Protection domain */
|
||||||
|
@ -250,6 +252,10 @@ struct rvt_driver_provided {
|
||||||
int (*mtu_to_path_mtu)(u32 mtu);
|
int (*mtu_to_path_mtu)(u32 mtu);
|
||||||
int (*get_guid_be)(struct rvt_dev_info *rdi, struct rvt_ibport *rvp,
|
int (*get_guid_be)(struct rvt_dev_info *rdi, struct rvt_ibport *rvp,
|
||||||
int guid_index, __be64 *guid);
|
int guid_index, __be64 *guid);
|
||||||
|
int (*query_port_state)(struct rvt_dev_info *rdi, u8 port_num,
|
||||||
|
struct ib_port_attr *props);
|
||||||
|
int (*shut_down_port)(struct rvt_dev_info *rdi, u8 port_num);
|
||||||
|
void (*cap_mask_chg)(struct rvt_dev_info *rdi, u8 port_num);
|
||||||
|
|
||||||
/*--------------------*/
|
/*--------------------*/
|
||||||
/* Optional functions */
|
/* Optional functions */
|
||||||
|
|
Loading…
Reference in New Issue