|
@@ -2598,6 +2598,9 @@ static void cleanup_recv_queue(struct ib_mad_qp_info *qp_info)
|
|
|
struct ib_mad_private *recv;
|
|
|
struct ib_mad_list_head *mad_list;
|
|
|
|
|
|
+ if (!qp_info->qp)
|
|
|
+ return;
|
|
|
+
|
|
|
while (!list_empty(&qp_info->recv_queue.list)) {
|
|
|
|
|
|
mad_list = list_entry(qp_info->recv_queue.list.next,
|
|
@@ -2639,6 +2642,9 @@ static int ib_mad_port_start(struct ib_mad_port_private *port_priv)
|
|
|
|
|
|
for (i = 0; i < IB_MAD_QPS_CORE; i++) {
|
|
|
qp = port_priv->qp_info[i].qp;
|
|
|
+ if (!qp)
|
|
|
+ continue;
|
|
|
+
|
|
|
/*
|
|
|
* PKey index for QP1 is irrelevant but
|
|
|
* one is needed for the Reset to Init transition
|
|
@@ -2680,6 +2686,9 @@ static int ib_mad_port_start(struct ib_mad_port_private *port_priv)
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < IB_MAD_QPS_CORE; i++) {
|
|
|
+ if (!port_priv->qp_info[i].qp)
|
|
|
+ continue;
|
|
|
+
|
|
|
ret = ib_mad_post_receive_mads(&port_priv->qp_info[i], NULL);
|
|
|
if (ret) {
|
|
|
printk(KERN_ERR PFX "Couldn't post receive WRs\n");
|
|
@@ -2758,6 +2767,9 @@ error:
|
|
|
|
|
|
static void destroy_mad_qp(struct ib_mad_qp_info *qp_info)
|
|
|
{
|
|
|
+ if (!qp_info->qp)
|
|
|
+ return;
|
|
|
+
|
|
|
ib_destroy_qp(qp_info->qp);
|
|
|
kfree(qp_info->snoop_table);
|
|
|
}
|
|
@@ -2773,6 +2785,7 @@ static int ib_mad_port_open(struct ib_device *device,
|
|
|
struct ib_mad_port_private *port_priv;
|
|
|
unsigned long flags;
|
|
|
char name[sizeof "ib_mad123"];
|
|
|
+ int has_smi;
|
|
|
|
|
|
/* Create new device info */
|
|
|
port_priv = kzalloc(sizeof *port_priv, GFP_KERNEL);
|
|
@@ -2788,7 +2801,11 @@ static int ib_mad_port_open(struct ib_device *device,
|
|
|
init_mad_qp(port_priv, &port_priv->qp_info[0]);
|
|
|
init_mad_qp(port_priv, &port_priv->qp_info[1]);
|
|
|
|
|
|
- cq_size = (mad_sendq_size + mad_recvq_size) * 2;
|
|
|
+ cq_size = mad_sendq_size + mad_recvq_size;
|
|
|
+ has_smi = rdma_port_get_link_layer(device, port_num) == IB_LINK_LAYER_INFINIBAND;
|
|
|
+ if (has_smi)
|
|
|
+ cq_size *= 2;
|
|
|
+
|
|
|
port_priv->cq = ib_create_cq(port_priv->device,
|
|
|
ib_mad_thread_completion_handler,
|
|
|
NULL, port_priv, cq_size, 0);
|
|
@@ -2812,9 +2829,11 @@ static int ib_mad_port_open(struct ib_device *device,
|
|
|
goto error5;
|
|
|
}
|
|
|
|
|
|
- ret = create_mad_qp(&port_priv->qp_info[0], IB_QPT_SMI);
|
|
|
- if (ret)
|
|
|
- goto error6;
|
|
|
+ if (has_smi) {
|
|
|
+ ret = create_mad_qp(&port_priv->qp_info[0], IB_QPT_SMI);
|
|
|
+ if (ret)
|
|
|
+ goto error6;
|
|
|
+ }
|
|
|
ret = create_mad_qp(&port_priv->qp_info[1], IB_QPT_GSI);
|
|
|
if (ret)
|
|
|
goto error7;
|