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

Commit 0f248d9c authored by Hoang-Nam Nguyen's avatar Hoang-Nam Nguyen Committed by Roland Dreier
Browse files

IB/ehca: Fix device registration



Move the call to ib_register_device() later, since a device should not
be registered until it is completely read to be used.  This fixes
crashes that occur if an upper-layer driver such as IPoIB is loaded
before the ehca module.

Signed-off-by: default avatarHoang-Nam Nguyen <hnguyen@de.ibm.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 13b18c86
Loading
Loading
Loading
Loading
+19 −17
Original line number Original line Diff line number Diff line
@@ -49,7 +49,7 @@
MODULE_LICENSE("Dual BSD/GPL");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
MODULE_VERSION("SVNEHCA_0016");
MODULE_VERSION("SVNEHCA_0017");


int ehca_open_aqp1     = 0;
int ehca_open_aqp1     = 0;
int ehca_debug_level   = 0;
int ehca_debug_level   = 0;
@@ -239,7 +239,7 @@ static int init_node_guid(struct ehca_shca *shca)
	return ret;
	return ret;
}
}


int ehca_register_device(struct ehca_shca *shca)
int ehca_init_device(struct ehca_shca *shca)
{
{
	int ret;
	int ret;


@@ -317,11 +317,6 @@ int ehca_register_device(struct ehca_shca *shca)
	/* shca->ib_device.process_mad	    = ehca_process_mad;	    */
	/* shca->ib_device.process_mad	    = ehca_process_mad;	    */
	shca->ib_device.mmap		    = ehca_mmap;
	shca->ib_device.mmap		    = ehca_mmap;


	ret = ib_register_device(&shca->ib_device);
	if (ret)
		ehca_err(&shca->ib_device,
			 "ib_register_device() failed ret=%x", ret);

	return ret;
	return ret;
}
}


@@ -561,9 +556,9 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,
		goto probe1;
		goto probe1;
	}
	}


	ret = ehca_register_device(shca);
	ret = ehca_init_device(shca);
	if (ret) {
	if (ret) {
		ehca_gen_err("Cannot register Infiniband device");
		ehca_gen_err("Cannot init ehca  device struct");
		goto probe1;
		goto probe1;
	}
	}


@@ -571,7 +566,7 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,
	ret = ehca_create_eq(shca, &shca->eq, EHCA_EQ, 2048);
	ret = ehca_create_eq(shca, &shca->eq, EHCA_EQ, 2048);
	if (ret) {
	if (ret) {
		ehca_err(&shca->ib_device, "Cannot create EQ.");
		ehca_err(&shca->ib_device, "Cannot create EQ.");
		goto probe2;
		goto probe1;
	}
	}


	ret = ehca_create_eq(shca, &shca->neq, EHCA_NEQ, 513);
	ret = ehca_create_eq(shca, &shca->neq, EHCA_NEQ, 513);
@@ -600,6 +595,13 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,
		goto probe5;
		goto probe5;
	}
	}


	ret = ib_register_device(&shca->ib_device);
	if (ret) {
		ehca_err(&shca->ib_device,
			 "ib_register_device() failed ret=%x", ret);
		goto probe6;
	}

	/* create AQP1 for port 1 */
	/* create AQP1 for port 1 */
	if (ehca_open_aqp1 == 1) {
	if (ehca_open_aqp1 == 1) {
		shca->sport[0].port_state = IB_PORT_DOWN;
		shca->sport[0].port_state = IB_PORT_DOWN;
@@ -607,7 +609,7 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,
		if (ret) {
		if (ret) {
			ehca_err(&shca->ib_device,
			ehca_err(&shca->ib_device,
				 "Cannot create AQP1 for port 1.");
				 "Cannot create AQP1 for port 1.");
			goto probe6;
			goto probe7;
		}
		}
	}
	}


@@ -618,7 +620,7 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,
		if (ret) {
		if (ret) {
			ehca_err(&shca->ib_device,
			ehca_err(&shca->ib_device,
				 "Cannot create AQP1 for port 2.");
				 "Cannot create AQP1 for port 2.");
			goto probe7;
			goto probe8;
		}
		}
	}
	}


@@ -630,12 +632,15 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,


	return 0;
	return 0;


probe7:
probe8:
	ret = ehca_destroy_aqp1(&shca->sport[0]);
	ret = ehca_destroy_aqp1(&shca->sport[0]);
	if (ret)
	if (ret)
		ehca_err(&shca->ib_device,
		ehca_err(&shca->ib_device,
			 "Cannot destroy AQP1 for port 1. ret=%x", ret);
			 "Cannot destroy AQP1 for port 1. ret=%x", ret);


probe7:
	ib_unregister_device(&shca->ib_device);

probe6:
probe6:
	ret = ehca_dereg_internal_maxmr(shca);
	ret = ehca_dereg_internal_maxmr(shca);
	if (ret)
	if (ret)
@@ -660,9 +665,6 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,
		ehca_err(&shca->ib_device,
		ehca_err(&shca->ib_device,
			 "Cannot destroy EQ. ret=%x", ret);
			 "Cannot destroy EQ. ret=%x", ret);


probe2:
	ib_unregister_device(&shca->ib_device);

probe1:
probe1:
	ib_dealloc_device(&shca->ib_device);
	ib_dealloc_device(&shca->ib_device);


@@ -750,7 +752,7 @@ int __init ehca_module_init(void)
	int ret;
	int ret;


	printk(KERN_INFO "eHCA Infiniband Device Driver "
	printk(KERN_INFO "eHCA Infiniband Device Driver "
	                 "(Rel.: SVNEHCA_0016)\n");
	                 "(Rel.: SVNEHCA_0017)\n");
	idr_init(&ehca_qp_idr);
	idr_init(&ehca_qp_idr);
	idr_init(&ehca_cq_idr);
	idr_init(&ehca_cq_idr);
	spin_lock_init(&ehca_qp_idr_lock);
	spin_lock_init(&ehca_qp_idr_lock);