Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ece236ce authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (26 commits)
  IB/qib: Defer HCA error events to tasklet
  mlx4_core: Bump the driver version to 1.0
  RDMA/cxgb4: Use printk_ratelimited() instead of printk_ratelimit()
  IB/mlx4: Support PMA counters for IBoE
  IB/mlx4: Use flow counters on IBoE ports
  IB/pma: Add include file for IBA performance counters definitions
  mlx4_core: Add network flow counters
  mlx4_core: Fix location of counter index in QP context struct
  mlx4_core: Read extended capabilities into the flags field
  mlx4_core: Extend capability flags to 64 bits
  IB/mlx4: Generate GID change events in IBoE code
  IB/core: Add GID change event
  RDMA/cma: Don't allow IPoIB port space for IBoE
  RDMA: Allow for NULL .modify_device() and .modify_port() methods
  IB/qib: Update active link width
  IB/qib: Fix potential deadlock with link down interrupt
  IB/qib: Add sysfs interface to read free contexts
  IB/mthca: Remove unnecessary read of PCI_CAP_ID_EXP
  IB/qib: Remove double define
  IB/qib: Remove unnecessary read of PCI_CAP_ID_EXP
  ...
parents 441c196e 44602075
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -3426,10 +3426,9 @@ S: Maintained
F:	drivers/net/ipg.*
F:	drivers/net/ipg.*


IPATH DRIVER
IPATH DRIVER
M:	Ralph Campbell <infinipath@qlogic.com>
M:	Mike Marciniszyn <infinipath@qlogic.com>
L:	linux-rdma@vger.kernel.org
L:	linux-rdma@vger.kernel.org
T:	git git://git.qlogic.com/ipath-linux-2.6
S:	Maintained
S:	Supported
F:	drivers/infiniband/hw/ipath/
F:	drivers/infiniband/hw/ipath/


IPMI SUBSYSTEM
IPMI SUBSYSTEM
@@ -5152,6 +5151,12 @@ M: Robert Jarzmik <robert.jarzmik@free.fr>
L:	rtc-linux@googlegroups.com
L:	rtc-linux@googlegroups.com
S:	Maintained
S:	Maintained


QIB DRIVER
M:	Mike Marciniszyn <infinipath@qlogic.com>
L:	linux-rdma@vger.kernel.org
S:	Supported
F:	drivers/infiniband/hw/qib/

QLOGIC QLA1280 SCSI DRIVER
QLOGIC QLA1280 SCSI DRIVER
M:	Michael Reed <mdr@sgi.com>
M:	Michael Reed <mdr@sgi.com>
L:	linux-scsi@vger.kernel.org
L:	linux-scsi@vger.kernel.org
+2 −1
Original line number Original line Diff line number Diff line
@@ -302,7 +302,8 @@ static void ib_cache_event(struct ib_event_handler *handler,
	    event->event == IB_EVENT_LID_CHANGE  ||
	    event->event == IB_EVENT_LID_CHANGE  ||
	    event->event == IB_EVENT_PKEY_CHANGE ||
	    event->event == IB_EVENT_PKEY_CHANGE ||
	    event->event == IB_EVENT_SM_CHANGE   ||
	    event->event == IB_EVENT_SM_CHANGE   ||
	    event->event == IB_EVENT_CLIENT_REREGISTER) {
	    event->event == IB_EVENT_CLIENT_REREGISTER ||
	    event->event == IB_EVENT_GID_CHANGE) {
		work = kmalloc(sizeof *work, GFP_ATOMIC);
		work = kmalloc(sizeof *work, GFP_ATOMIC);
		if (work) {
		if (work) {
			INIT_WORK(&work->work, ib_cache_task);
			INIT_WORK(&work->work, ib_cache_task);
+44 −40
Original line number Original line Diff line number Diff line
@@ -359,6 +359,10 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv)
	enum rdma_link_layer dev_ll = dev_addr->dev_type == ARPHRD_INFINIBAND ?
	enum rdma_link_layer dev_ll = dev_addr->dev_type == ARPHRD_INFINIBAND ?
		IB_LINK_LAYER_INFINIBAND : IB_LINK_LAYER_ETHERNET;
		IB_LINK_LAYER_INFINIBAND : IB_LINK_LAYER_ETHERNET;


	if (dev_ll != IB_LINK_LAYER_INFINIBAND &&
	    id_priv->id.ps == RDMA_PS_IPOIB)
		return -EINVAL;

	mutex_lock(&lock);
	mutex_lock(&lock);
	iboe_addr_get_sgid(dev_addr, &iboe_gid);
	iboe_addr_get_sgid(dev_addr, &iboe_gid);
	memcpy(&gid, dev_addr->src_dev_addr +
	memcpy(&gid, dev_addr->src_dev_addr +
@@ -406,11 +410,6 @@ static int cma_disable_callback(struct rdma_id_private *id_priv,
	return 0;
	return 0;
}
}


static int cma_has_cm_dev(struct rdma_id_private *id_priv)
{
	return (id_priv->id.device && id_priv->cm_id.ib);
}

struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler,
struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler,
				  void *context, enum rdma_port_space ps,
				  void *context, enum rdma_port_space ps,
				  enum ib_qp_type qp_type)
				  enum ib_qp_type qp_type)
@@ -920,11 +919,11 @@ void rdma_destroy_id(struct rdma_cm_id *id)
	if (id_priv->cma_dev) {
	if (id_priv->cma_dev) {
		switch (rdma_node_get_transport(id_priv->id.device->node_type)) {
		switch (rdma_node_get_transport(id_priv->id.device->node_type)) {
		case RDMA_TRANSPORT_IB:
		case RDMA_TRANSPORT_IB:
			if (id_priv->cm_id.ib && !IS_ERR(id_priv->cm_id.ib))
			if (id_priv->cm_id.ib)
				ib_destroy_cm_id(id_priv->cm_id.ib);
				ib_destroy_cm_id(id_priv->cm_id.ib);
			break;
			break;
		case RDMA_TRANSPORT_IWARP:
		case RDMA_TRANSPORT_IWARP:
			if (id_priv->cm_id.iw && !IS_ERR(id_priv->cm_id.iw))
			if (id_priv->cm_id.iw)
				iw_destroy_cm_id(id_priv->cm_id.iw);
				iw_destroy_cm_id(id_priv->cm_id.iw);
			break;
			break;
		default:
		default:
@@ -1085,12 +1084,12 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,


	if (cma_get_net_info(ib_event->private_data, listen_id->ps,
	if (cma_get_net_info(ib_event->private_data, listen_id->ps,
			     &ip_ver, &port, &src, &dst))
			     &ip_ver, &port, &src, &dst))
		goto err;
		return NULL;


	id = rdma_create_id(listen_id->event_handler, listen_id->context,
	id = rdma_create_id(listen_id->event_handler, listen_id->context,
			    listen_id->ps, ib_event->param.req_rcvd.qp_type);
			    listen_id->ps, ib_event->param.req_rcvd.qp_type);
	if (IS_ERR(id))
	if (IS_ERR(id))
		goto err;
		return NULL;


	cma_save_net_info(&id->route.addr, &listen_id->route.addr,
	cma_save_net_info(&id->route.addr, &listen_id->route.addr,
			  ip_ver, port, src, dst);
			  ip_ver, port, src, dst);
@@ -1100,7 +1099,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
	rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths,
	rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths,
			       GFP_KERNEL);
			       GFP_KERNEL);
	if (!rt->path_rec)
	if (!rt->path_rec)
		goto destroy_id;
		goto err;


	rt->path_rec[0] = *ib_event->param.req_rcvd.primary_path;
	rt->path_rec[0] = *ib_event->param.req_rcvd.primary_path;
	if (rt->num_paths == 2)
	if (rt->num_paths == 2)
@@ -1114,7 +1113,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
		ret = rdma_translate_ip((struct sockaddr *) &rt->addr.src_addr,
		ret = rdma_translate_ip((struct sockaddr *) &rt->addr.src_addr,
					&rt->addr.dev_addr);
					&rt->addr.dev_addr);
		if (ret)
		if (ret)
			goto destroy_id;
			goto err;
	}
	}
	rdma_addr_set_dgid(&rt->addr.dev_addr, &rt->path_rec[0].dgid);
	rdma_addr_set_dgid(&rt->addr.dev_addr, &rt->path_rec[0].dgid);


@@ -1122,9 +1121,8 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
	id_priv->state = RDMA_CM_CONNECT;
	id_priv->state = RDMA_CM_CONNECT;
	return id_priv;
	return id_priv;


destroy_id:
	rdma_destroy_id(id);
err:
err:
	rdma_destroy_id(id);
	return NULL;
	return NULL;
}
}


@@ -1468,13 +1466,15 @@ static int cma_ib_listen(struct rdma_id_private *id_priv)
{
{
	struct ib_cm_compare_data compare_data;
	struct ib_cm_compare_data compare_data;
	struct sockaddr *addr;
	struct sockaddr *addr;
	struct ib_cm_id	*id;
	__be64 svc_id;
	__be64 svc_id;
	int ret;
	int ret;


	id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device, cma_req_handler,
	id = ib_create_cm_id(id_priv->id.device, cma_req_handler, id_priv);
					    id_priv);
	if (IS_ERR(id))
	if (IS_ERR(id_priv->cm_id.ib))
		return PTR_ERR(id);
		return PTR_ERR(id_priv->cm_id.ib);

	id_priv->cm_id.ib = id;


	addr = (struct sockaddr *) &id_priv->id.route.addr.src_addr;
	addr = (struct sockaddr *) &id_priv->id.route.addr.src_addr;
	svc_id = cma_get_service_id(id_priv->id.ps, addr);
	svc_id = cma_get_service_id(id_priv->id.ps, addr);
@@ -1497,12 +1497,15 @@ static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog)
{
{
	int ret;
	int ret;
	struct sockaddr_in *sin;
	struct sockaddr_in *sin;
	struct iw_cm_id	*id;


	id_priv->cm_id.iw = iw_create_cm_id(id_priv->id.device,
	id = iw_create_cm_id(id_priv->id.device,
			     iw_conn_req_handler,
			     iw_conn_req_handler,
			     id_priv);
			     id_priv);
	if (IS_ERR(id_priv->cm_id.iw))
	if (IS_ERR(id))
		return PTR_ERR(id_priv->cm_id.iw);
		return PTR_ERR(id);

	id_priv->cm_id.iw = id;


	sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr;
	sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr;
	id_priv->cm_id.iw->local_addr = *sin;
	id_priv->cm_id.iw->local_addr = *sin;
@@ -2484,6 +2487,7 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
{
{
	struct ib_cm_sidr_req_param req;
	struct ib_cm_sidr_req_param req;
	struct rdma_route *route;
	struct rdma_route *route;
	struct ib_cm_id	*id;
	int ret;
	int ret;


	req.private_data_len = sizeof(struct cma_hdr) +
	req.private_data_len = sizeof(struct cma_hdr) +
@@ -2501,12 +2505,13 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
	if (ret)
	if (ret)
		goto out;
		goto out;


	id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device,
	id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler,
					    cma_sidr_rep_handler, id_priv);
			     id_priv);
	if (IS_ERR(id_priv->cm_id.ib)) {
	if (IS_ERR(id)) {
		ret = PTR_ERR(id_priv->cm_id.ib);
		ret = PTR_ERR(id);
		goto out;
		goto out;
	}
	}
	id_priv->cm_id.ib = id;


	req.path = route->path_rec;
	req.path = route->path_rec;
	req.service_id = cma_get_service_id(id_priv->id.ps,
	req.service_id = cma_get_service_id(id_priv->id.ps,
@@ -2530,6 +2535,7 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
	struct ib_cm_req_param req;
	struct ib_cm_req_param req;
	struct rdma_route *route;
	struct rdma_route *route;
	void *private_data;
	void *private_data;
	struct ib_cm_id	*id;
	int offset, ret;
	int offset, ret;


	memset(&req, 0, sizeof req);
	memset(&req, 0, sizeof req);
@@ -2543,12 +2549,12 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
		memcpy(private_data + offset, conn_param->private_data,
		memcpy(private_data + offset, conn_param->private_data,
		       conn_param->private_data_len);
		       conn_param->private_data_len);


	id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device, cma_ib_handler,
	id = ib_create_cm_id(id_priv->id.device, cma_ib_handler, id_priv);
					    id_priv);
	if (IS_ERR(id)) {
	if (IS_ERR(id_priv->cm_id.ib)) {
		ret = PTR_ERR(id);
		ret = PTR_ERR(id_priv->cm_id.ib);
		goto out;
		goto out;
	}
	}
	id_priv->cm_id.ib = id;


	route = &id_priv->id.route;
	route = &id_priv->id.route;
	ret = cma_format_hdr(private_data, id_priv->id.ps, route);
	ret = cma_format_hdr(private_data, id_priv->id.ps, route);
@@ -2577,8 +2583,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,


	ret = ib_send_cm_req(id_priv->cm_id.ib, &req);
	ret = ib_send_cm_req(id_priv->cm_id.ib, &req);
out:
out:
	if (ret && !IS_ERR(id_priv->cm_id.ib)) {
	if (ret && !IS_ERR(id)) {
		ib_destroy_cm_id(id_priv->cm_id.ib);
		ib_destroy_cm_id(id);
		id_priv->cm_id.ib = NULL;
		id_priv->cm_id.ib = NULL;
	}
	}


@@ -2595,10 +2601,8 @@ static int cma_connect_iw(struct rdma_id_private *id_priv,
	struct iw_cm_conn_param iw_param;
	struct iw_cm_conn_param iw_param;


	cm_id = iw_create_cm_id(id_priv->id.device, cma_iw_handler, id_priv);
	cm_id = iw_create_cm_id(id_priv->id.device, cma_iw_handler, id_priv);
	if (IS_ERR(cm_id)) {
	if (IS_ERR(cm_id))
		ret = PTR_ERR(cm_id);
		return PTR_ERR(cm_id);
		goto out;
	}


	id_priv->cm_id.iw = cm_id;
	id_priv->cm_id.iw = cm_id;


@@ -2622,7 +2626,7 @@ static int cma_connect_iw(struct rdma_id_private *id_priv,
		iw_param.qpn = conn_param->qp_num;
		iw_param.qpn = conn_param->qp_num;
	ret = iw_cm_connect(cm_id, &iw_param);
	ret = iw_cm_connect(cm_id, &iw_param);
out:
out:
	if (ret && !IS_ERR(cm_id)) {
	if (ret) {
		iw_destroy_cm_id(cm_id);
		iw_destroy_cm_id(cm_id);
		id_priv->cm_id.iw = NULL;
		id_priv->cm_id.iw = NULL;
	}
	}
@@ -2795,7 +2799,7 @@ int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
	int ret;
	int ret;


	id_priv = container_of(id, struct rdma_id_private, id);
	id_priv = container_of(id, struct rdma_id_private, id);
	if (!cma_has_cm_dev(id_priv))
	if (!id_priv->cm_id.ib)
		return -EINVAL;
		return -EINVAL;


	switch (id->device->node_type) {
	switch (id->device->node_type) {
@@ -2817,7 +2821,7 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data,
	int ret;
	int ret;


	id_priv = container_of(id, struct rdma_id_private, id);
	id_priv = container_of(id, struct rdma_id_private, id);
	if (!cma_has_cm_dev(id_priv))
	if (!id_priv->cm_id.ib)
		return -EINVAL;
		return -EINVAL;


	switch (rdma_node_get_transport(id->device->node_type)) {
	switch (rdma_node_get_transport(id->device->node_type)) {
@@ -2848,7 +2852,7 @@ int rdma_disconnect(struct rdma_cm_id *id)
	int ret;
	int ret;


	id_priv = container_of(id, struct rdma_id_private, id);
	id_priv = container_of(id, struct rdma_id_private, id);
	if (!cma_has_cm_dev(id_priv))
	if (!id_priv->cm_id.ib)
		return -EINVAL;
		return -EINVAL;


	switch (rdma_node_get_transport(id->device->node_type)) {
	switch (rdma_node_get_transport(id->device->node_type)) {
+6 −0
Original line number Original line Diff line number Diff line
@@ -627,6 +627,9 @@ int ib_modify_device(struct ib_device *device,
		     int device_modify_mask,
		     int device_modify_mask,
		     struct ib_device_modify *device_modify)
		     struct ib_device_modify *device_modify)
{
{
	if (!device->modify_device)
		return -ENOSYS;

	return device->modify_device(device, device_modify_mask,
	return device->modify_device(device, device_modify_mask,
				     device_modify);
				     device_modify);
}
}
@@ -647,6 +650,9 @@ int ib_modify_port(struct ib_device *device,
		   u8 port_num, int port_modify_mask,
		   u8 port_num, int port_modify_mask,
		   struct ib_port_modify *port_modify)
		   struct ib_port_modify *port_modify)
{
{
	if (!device->modify_port)
		return -ENOSYS;

	if (port_num < start_port(device) || port_num > end_port(device))
	if (port_num < start_port(device) || port_num > end_port(device))
		return -EINVAL;
		return -EINVAL;


+0 −9
Original line number Original line Diff line number Diff line
@@ -99,14 +99,6 @@ static int c2_query_port(struct ib_device *ibdev,
	return 0;
	return 0;
}
}


static int c2_modify_port(struct ib_device *ibdev,
			  u8 port, int port_modify_mask,
			  struct ib_port_modify *props)
{
	pr_debug("%s:%u\n", __func__, __LINE__);
	return 0;
}

static int c2_query_pkey(struct ib_device *ibdev,
static int c2_query_pkey(struct ib_device *ibdev,
			 u8 port, u16 index, u16 * pkey)
			 u8 port, u16 index, u16 * pkey)
{
{
@@ -817,7 +809,6 @@ int c2_register_device(struct c2_dev *dev)
	dev->ibdev.dma_device = &dev->pcidev->dev;
	dev->ibdev.dma_device = &dev->pcidev->dev;
	dev->ibdev.query_device = c2_query_device;
	dev->ibdev.query_device = c2_query_device;
	dev->ibdev.query_port = c2_query_port;
	dev->ibdev.query_port = c2_query_port;
	dev->ibdev.modify_port = c2_modify_port;
	dev->ibdev.query_pkey = c2_query_pkey;
	dev->ibdev.query_pkey = c2_query_pkey;
	dev->ibdev.query_gid = c2_query_gid;
	dev->ibdev.query_gid = c2_query_gid;
	dev->ibdev.alloc_ucontext = c2_alloc_ucontext;
	dev->ibdev.alloc_ucontext = c2_alloc_ucontext;
Loading