From mboxrd@z Thu Jan 1 00:00:00 1970 From: dykmanj@linux.vnet.ibm.com Subject: [PATCH 03/27] HFI: Add device_create/device_destroy calls for HFI devices. Date: Wed, 2 Mar 2011 16:09:49 -0500 Message-ID: <1299100213-8770-3-git-send-email-dykmanj@linux.vnet.ibm.com> References: <1299100213-8770-1-git-send-email-dykmanj@linux.vnet.ibm.com> Cc: Jim Dykman , Piyush Chaudhary , Fu-Chung Chang , " William S. Cadden" , " Wen C. Chen" , Scot Sakolish , Jian Xiao , " Carol L. Soto" , " Sarah J. Sheppard" Return-path: Received: from e4.ny.us.ibm.com ([32.97.182.144]:42630 "EHLO e4.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756919Ab1CBVKY (ORCPT ); Wed, 2 Mar 2011 16:10:24 -0500 Received: from d01dlp02.pok.ibm.com (d01dlp02.pok.ibm.com [9.56.224.85]) by e4.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p22KpKu2020660 for ; Wed, 2 Mar 2011 15:51:20 -0500 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 1C98C6E803E for ; Wed, 2 Mar 2011 16:10:24 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p22LANri298556 for ; Wed, 2 Mar 2011 16:10:23 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p22LANk6031941 for ; Wed, 2 Mar 2011 16:10:23 -0500 To: netdev@vger.kernel.org In-Reply-To: <1299100213-8770-1-git-send-email-dykmanj@linux.vnet.ibm.com> To: netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org List-ID: From: Jim Dykman Signed-off-by: Piyush Chaudhary Signed-off-by: Jim Dykman Signed-off-by: Fu-Chung Chang Signed-off-by: William S. Cadden Signed-off-by: Wen C. Chen Signed-off-by: Scot Sakolish Signed-off-by: Jian Xiao Signed-off-by: Carol L. Soto Signed-off-by: Sarah J. Sheppard --- drivers/net/hfi/core/hfidd_init.c | 52 ++++++++++++++++++++++++++++++++++++ include/linux/hfi/hfidd_internal.h | 1 + 2 files changed, 53 insertions(+), 0 deletions(-) diff --git a/drivers/net/hfi/core/hfidd_init.c b/drivers/net/hfi/core/hfidd_init.c index 114b772..68d6e65 100644 --- a/drivers/net/hfi/core/hfidd_init.c +++ b/drivers/net/hfi/core/hfidd_init.c @@ -47,6 +47,7 @@ MODULE_LICENSE("GPL v2"); struct hfidd_global hfidd_global; EXPORT_SYMBOL_GPL(hfidd_global); +struct device *hfidd_class_dev[MAX_HFIS + 1]; static dev_t hfidd_dev; #define MAX_HFI_DEVS (MAX_HFIS + 1) @@ -71,6 +72,38 @@ static const struct file_operations hfidd_fops = { .write = hfidd_cmd_write, }; +/* Create the hfi device */ +static int hfidd_mkdev(int ai, struct hfidd_acs *p_acs) +{ + char dname[128]; + int rc = 0; + + sprintf(dname, "%s%d", HFIDD_DEV_NAME, ai); + + hfidd_class_dev[ai] = device_create(hfidd_global.class, + NULL, MKDEV(MAJOR(hfidd_dev), ai), + (void *)p_acs, (char *)dname); + + if (IS_ERR(hfidd_class_dev[ai])) { + rc = PTR_ERR(hfidd_class_dev[ai]); + printk(KERN_ERR "%s: hfidd_mkdev: device_create for ai=%d fail" + " rc = %d\n", dname, ai, rc); + return rc; + } + + if (ai == MAX_HFIS) + return 0; + + p_acs->hfidd_dev = hfidd_class_dev[ai]; + return rc; +} + +/* delete the hfi device, /dev/hfi* files and sysclass files */ +static void hfidd_rmdev(int ai) +{ + device_destroy(hfidd_global.class, MKDEV(MAJOR(hfidd_dev), ai)); +} + /* Destroy the HFI class */ static inline void hfidd_destroy_class(void) { @@ -124,6 +157,8 @@ static void hfidd_destroy_devices(void) { int i; + for (i = 0; i <= MAX_HFIS; i++) + hfidd_rmdev(i); for (i = 0; i < MAX_HFIS; i++) { hfidd_free_adapter(hfidd_global.p_acs[i]); hfidd_global.p_acs[i] = NULL; @@ -156,6 +191,23 @@ static int hfidd_create_devices(void) } hfidd_global.acs_cnt++; } + + for (i = 0; i <= MAX_HFIS; i++) { + rc = hfidd_mkdev(i, hfidd_global.p_acs[i]); + if (rc) { + for (j = 0; j < i; j++) + hfidd_rmdev(j); + goto hfidd_create_devices_error0; + } + } + return 0; + +hfidd_create_devices_error0: + for (i = 0; i < MAX_HFIS; i++) { + hfidd_free_adapter(hfidd_global.p_acs[i]); + hfidd_global.p_acs[i] = NULL; + hfidd_global.acs_cnt--; + } return rc; } diff --git a/include/linux/hfi/hfidd_internal.h b/include/linux/hfi/hfidd_internal.h index 2c58b56..695d7f4 100644 --- a/include/linux/hfi/hfidd_internal.h +++ b/include/linux/hfi/hfidd_internal.h @@ -54,6 +54,7 @@ struct hfidd_acs { unsigned int index; unsigned int acs_cnt; unsigned int state; + struct device *hfidd_dev; }; /* DD global */ -- 1.7.3.1