diff options
Diffstat (limited to 'drivers/infiniband/core')
| -rw-r--r-- | drivers/infiniband/core/mad.c | 8 | ||||
| -rw-r--r-- | drivers/infiniband/core/sysfs.c | 9 | 
2 files changed, 10 insertions, 7 deletions
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index 426bb7617ec..b0d0bc8a6fb 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c @@ -1854,6 +1854,8 @@ static bool generate_unmatched_resp(struct ib_mad_private *recv,  		response->mad.mad.mad_hdr.method = IB_MGMT_METHOD_GET_RESP;  		response->mad.mad.mad_hdr.status =  			cpu_to_be16(IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB); +		if (recv->mad.mad.mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) +			response->mad.mad.mad_hdr.status |= IB_SMP_DIRECTION;  		return true;  	} else { @@ -1869,6 +1871,7 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,  	struct ib_mad_list_head *mad_list;  	struct ib_mad_agent_private *mad_agent;  	int port_num; +	int ret = IB_MAD_RESULT_SUCCESS;  	mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;  	qp_info = mad_list->mad_queue->qp_info; @@ -1952,8 +1955,6 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,  local:  	/* Give driver "right of first refusal" on incoming MAD */  	if (port_priv->device->process_mad) { -		int ret; -  		ret = port_priv->device->process_mad(port_priv->device, 0,  						     port_priv->port_num,  						     wc, &recv->grh, @@ -1981,7 +1982,8 @@ local:  		 * or via recv_handler in ib_mad_complete_recv()  		 */  		recv = NULL; -	} else if (generate_unmatched_resp(recv, response)) { +	} else if ((ret & IB_MAD_RESULT_SUCCESS) && +		   generate_unmatched_resp(recv, response)) {  		agent_send_response(&response->mad.mad, &recv->grh, wc,  				    port_priv->device, port_num, qp_info->qp->qp_num);  	} diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c index 83b720ef6c3..246fdc15165 100644 --- a/drivers/infiniband/core/sysfs.c +++ b/drivers/infiniband/core/sysfs.c @@ -179,7 +179,7 @@ static ssize_t rate_show(struct ib_port *p, struct port_attribute *unused,  {  	struct ib_port_attr attr;  	char *speed = ""; -	int rate = -1;		/* in deci-Gb/sec */ +	int rate;		/* in deci-Gb/sec */  	ssize_t ret;  	ret = ib_query_port(p->ibdev, p->port_num, &attr); @@ -187,9 +187,6 @@ static ssize_t rate_show(struct ib_port *p, struct port_attribute *unused,  		return ret;  	switch (attr.active_speed) { -	case IB_SPEED_SDR: -		rate = 25; -		break;  	case IB_SPEED_DDR:  		speed = " DDR";  		rate = 50; @@ -210,6 +207,10 @@ static ssize_t rate_show(struct ib_port *p, struct port_attribute *unused,  		speed = " EDR";  		rate = 250;  		break; +	case IB_SPEED_SDR: +	default:		/* default to SDR for invalid rates */ +		rate = 25; +		break;  	}  	rate *= ib_width_enum_to_int(attr.active_width);  |