Commit c74ce03d authored by Roland Dreier's avatar Roland Dreier Committed by Linus Torvalds

[PATCH] InfiniBand/core: add more parameters to process_mad

Add parameters to process_mad device method to support full Mellanox firmware
capabilities (pass sufficient information for baseboard management trap
generation, etc).
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 26fbc1be
...@@ -617,6 +617,23 @@ static void snoop_recv(struct ib_mad_qp_info *qp_info, ...@@ -617,6 +617,23 @@ static void snoop_recv(struct ib_mad_qp_info *qp_info,
spin_unlock_irqrestore(&qp_info->snoop_lock, flags); spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
} }
static void build_smp_wc(u64 wr_id, u16 slid, u16 pkey_index, u8 port_num,
struct ib_wc *wc)
{
memset(wc, 0, sizeof *wc);
wc->wr_id = wr_id;
wc->status = IB_WC_SUCCESS;
wc->opcode = IB_WC_RECV;
wc->pkey_index = pkey_index;
wc->byte_len = sizeof(struct ib_mad) + sizeof(struct ib_grh);
wc->src_qp = IB_QP0;
wc->qp_num = IB_QP0;
wc->slid = slid;
wc->sl = 0;
wc->dlid_path_bits = 0;
wc->port_num = port_num;
}
/* /*
* Return 0 if SMP is to be sent * Return 0 if SMP is to be sent
* Return 1 if SMP was consumed locally (whether or not solicited) * Return 1 if SMP was consumed locally (whether or not solicited)
...@@ -634,6 +651,7 @@ static int handle_outgoing_smp(struct ib_mad_agent_private *mad_agent_priv, ...@@ -634,6 +651,7 @@ static int handle_outgoing_smp(struct ib_mad_agent_private *mad_agent_priv,
struct ib_mad_agent_private *recv_mad_agent = NULL; struct ib_mad_agent_private *recv_mad_agent = NULL;
struct ib_device *device = mad_agent_priv->agent.device; struct ib_device *device = mad_agent_priv->agent.device;
u8 port_num = mad_agent_priv->agent.port_num; u8 port_num = mad_agent_priv->agent.port_num;
struct ib_wc mad_wc;
if (!smi_handle_dr_smp_send(smp, device->node_type, port_num)) { if (!smi_handle_dr_smp_send(smp, device->node_type, port_num)) {
ret = -EINVAL; ret = -EINVAL;
...@@ -664,7 +682,12 @@ static int handle_outgoing_smp(struct ib_mad_agent_private *mad_agent_priv, ...@@ -664,7 +682,12 @@ static int handle_outgoing_smp(struct ib_mad_agent_private *mad_agent_priv,
kfree(local); kfree(local);
goto out; goto out;
} }
ret = device->process_mad(device, 0, port_num, smp->dr_slid,
build_smp_wc(send_wr->wr_id, smp->dr_slid, send_wr->wr.ud.pkey_index,
send_wr->wr.ud.port_num, &mad_wc);
/* No GRH for DR SMP */
ret = device->process_mad(device, 0, port_num, &mad_wc, NULL,
(struct ib_mad *)smp, (struct ib_mad *)smp,
(struct ib_mad *)&mad_priv->mad); (struct ib_mad *)&mad_priv->mad);
switch (ret) switch (ret)
...@@ -1621,7 +1644,7 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv, ...@@ -1621,7 +1644,7 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
ret = port_priv->device->process_mad(port_priv->device, 0, ret = port_priv->device->process_mad(port_priv->device, 0,
port_priv->port_num, port_priv->port_num,
wc->slid, wc, &recv->grh,
&recv->mad.mad, &recv->mad.mad,
&response->mad.mad); &response->mad.mad);
if (ret & IB_MAD_RESULT_SUCCESS) { if (ret & IB_MAD_RESULT_SUCCESS) {
...@@ -2049,19 +2072,10 @@ static void local_completions(void *data) ...@@ -2049,19 +2072,10 @@ static void local_completions(void *data)
* Defined behavior is to complete response * Defined behavior is to complete response
* before request * before request
*/ */
wc.wr_id = local->wr_id; build_smp_wc(local->wr_id, IB_LID_PERMISSIVE,
wc.status = IB_WC_SUCCESS; 0 /* pkey index */,
wc.opcode = IB_WC_RECV; recv_mad_agent->agent.port_num, &wc);
wc.vendor_err = 0;
wc.byte_len = sizeof(struct ib_mad) +
sizeof(struct ib_grh);
wc.src_qp = IB_QP0;
wc.wc_flags = 0; /* No GRH */
wc.pkey_index = 0;
wc.slid = IB_LID_PERMISSIVE;
wc.sl = 0;
wc.dlid_path_bits = 0;
wc.qp_num = IB_QP0;
local->mad_priv->header.recv_wc.wc = &wc; local->mad_priv->header.recv_wc.wc = &wc;
local->mad_priv->header.recv_wc.mad_len = local->mad_priv->header.recv_wc.mad_len =
sizeof(struct ib_mad); sizeof(struct ib_mad);
......
...@@ -315,8 +315,8 @@ static ssize_t show_pma_counter(struct ib_port *p, struct port_attribute *attr, ...@@ -315,8 +315,8 @@ static ssize_t show_pma_counter(struct ib_port *p, struct port_attribute *attr,
in_mad->data[41] = p->port_num; /* PortSelect field */ in_mad->data[41] = p->port_num; /* PortSelect field */
if ((p->ibdev->process_mad(p->ibdev, IB_MAD_IGNORE_MKEY, p->port_num, 0xffff, if ((p->ibdev->process_mad(p->ibdev, IB_MAD_IGNORE_MKEY,
in_mad, out_mad) & p->port_num, NULL, NULL, in_mad, out_mad) &
(IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) != (IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) !=
(IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) { (IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) {
ret = -EINVAL; ret = -EINVAL;
......
...@@ -381,7 +381,8 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); ...@@ -381,7 +381,8 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid);
int mthca_process_mad(struct ib_device *ibdev, int mthca_process_mad(struct ib_device *ibdev,
int mad_flags, int mad_flags,
u8 port_num, u8 port_num,
u16 slid, struct ib_wc *in_wc,
struct ib_grh *in_grh,
struct ib_mad *in_mad, struct ib_mad *in_mad,
struct ib_mad *out_mad); struct ib_mad *out_mad);
int mthca_create_agents(struct mthca_dev *dev); int mthca_create_agents(struct mthca_dev *dev);
......
...@@ -185,12 +185,14 @@ static void forward_trap(struct mthca_dev *dev, ...@@ -185,12 +185,14 @@ static void forward_trap(struct mthca_dev *dev,
int mthca_process_mad(struct ib_device *ibdev, int mthca_process_mad(struct ib_device *ibdev,
int mad_flags, int mad_flags,
u8 port_num, u8 port_num,
u16 slid, struct ib_wc *in_wc,
struct ib_grh *in_grh,
struct ib_mad *in_mad, struct ib_mad *in_mad,
struct ib_mad *out_mad) struct ib_mad *out_mad)
{ {
int err; int err;
u8 status; u8 status;
u16 slid = in_wc ? in_wc->slid : IB_LID_PERMISSIVE;
/* Forward locally generated traps to the SM */ /* Forward locally generated traps to the SM */
if (in_mad->mad_hdr.method == IB_MGMT_METHOD_TRAP && if (in_mad->mad_hdr.method == IB_MGMT_METHOD_TRAP &&
......
...@@ -684,9 +684,12 @@ struct ib_fmr { ...@@ -684,9 +684,12 @@ struct ib_fmr {
}; };
struct ib_mad; struct ib_mad;
struct ib_grh;
enum ib_process_mad_flags { enum ib_process_mad_flags {
IB_MAD_IGNORE_MKEY = 1 IB_MAD_IGNORE_MKEY = 1,
IB_MAD_IGNORE_BKEY = 2,
IB_MAD_IGNORE_ALL = IB_MAD_IGNORE_MKEY | IB_MAD_IGNORE_BKEY
}; };
enum ib_mad_result { enum ib_mad_result {
...@@ -812,7 +815,8 @@ struct ib_device { ...@@ -812,7 +815,8 @@ struct ib_device {
int (*process_mad)(struct ib_device *device, int (*process_mad)(struct ib_device *device,
int process_mad_flags, int process_mad_flags,
u8 port_num, u8 port_num,
u16 source_lid, struct ib_wc *in_wc,
struct ib_grh *in_grh,
struct ib_mad *in_mad, struct ib_mad *in_mad,
struct ib_mad *out_mad); struct ib_mad *out_mad);
......
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