From mboxrd@z Thu Jan 1 00:00:00 1970 From: dykmanj@linux.vnet.ibm.com Subject: [PATCH v4 02/27] HFI: Add HFI adapter control structure Date: Mon, 25 Apr 2011 17:23:42 -0400 Message-ID: <1303766647-30156-3-git-send-email-dykmanj@linux.vnet.ibm.com> References: <1303766647-30156-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" To: netdev@vger.kernel.org Return-path: Received: from e38.co.us.ibm.com ([32.97.110.159]:41190 "EHLO e38.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754200Ab1DYVYT (ORCPT ); Mon, 25 Apr 2011 17:24:19 -0400 Received: from d03relay05.boulder.ibm.com (d03relay05.boulder.ibm.com [9.17.195.107]) by e38.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id p3PDcV0L005957 for ; Mon, 25 Apr 2011 07:38:31 -0600 Received: from d03av05.boulder.ibm.com (d03av05.boulder.ibm.com [9.17.195.85]) by d03relay05.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p3PLOExS333268 for ; Mon, 25 Apr 2011 15:24:14 -0600 Received: from d03av05.boulder.ibm.com (loopback [127.0.0.1]) by d03av05.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p3PLOEkS032153 for ; Mon, 25 Apr 2011 15:24:14 -0600 In-Reply-To: <1303766647-30156-1-git-send-email-dykmanj@linux.vnet.ibm.com> Sender: netdev-owner@vger.kernel.org List-ID: From: Jim Dykman Alloc/free of hfidd_acs to track the state of each HFI 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/Makefile | 3 +- drivers/net/hfi/core/hfidd_adpt.c | 58 ++++++++++++++++++++++++++++++++++++ drivers/net/hfi/core/hfidd_init.c | 55 ++++++++++++++++++++++++++++++++++ drivers/net/hfi/core/hfidd_proto.h | 39 ++++++++++++++++++++++++ include/linux/hfi/hfidd_adpt.h | 45 ++++++++++++++++++++++++++++ include/linux/hfi/hfidd_internal.h | 14 ++++++++ 6 files changed, 213 insertions(+), 1 deletions(-) create mode 100644 drivers/net/hfi/core/hfidd_adpt.c create mode 100644 drivers/net/hfi/core/hfidd_proto.h create mode 100644 include/linux/hfi/hfidd_adpt.h diff --git a/drivers/net/hfi/core/Makefile b/drivers/net/hfi/core/Makefile index 80790c6..6fe4e60 100644 --- a/drivers/net/hfi/core/Makefile +++ b/drivers/net/hfi/core/Makefile @@ -1,5 +1,6 @@ # # Makefile for the HFI device driver for IBM eServer System p # -hfi_core-objs:= hfidd_init.o +hfi_core-objs:= hfidd_adpt.o \ + hfidd_init.o obj-$(CONFIG_HFI) += hfi_core.o diff --git a/drivers/net/hfi/core/hfidd_adpt.c b/drivers/net/hfi/core/hfidd_adpt.c new file mode 100644 index 0000000..ec6a053 --- /dev/null +++ b/drivers/net/hfi/core/hfidd_adpt.c @@ -0,0 +1,58 @@ +/* + * hfidd_adpt.c + * + * HFI device driver for IBM System p + * + * Authors: + * Fu-Chung Chang + * William S. Cadden + * Wen C. Chen + * Scot Sakolish + * Jian Xiao + * Carol L. Soto + * Sarah J. Sheppard + * + * (C) Copyright IBM Corp. 2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include "hfidd_proto.h" + +int hfidd_alloc_adapter(struct hfidd_acs **adpt, dev_t devno, void *uiop) +{ + + struct hfidd_acs *p_acs = NULL; + + p_acs = kzalloc(sizeof(*p_acs), GFP_KERNEL); + if (p_acs == NULL) + return -ENOMEM; + + p_acs->dev_num = devno; + p_acs->index = MINOR(devno); + p_acs->state = HFI_INVALID; + snprintf(p_acs->name, HFI_DEVICE_NAME_MAX, + "%s%d", HFIDD_DEV_NAME, p_acs->index); + + *adpt = p_acs; + return 0; +} + +void hfidd_free_adapter(struct hfidd_acs *p_acs) +{ + kfree(p_acs); +} diff --git a/drivers/net/hfi/core/hfidd_init.c b/drivers/net/hfi/core/hfidd_init.c index 9498faf..61ed559 100644 --- a/drivers/net/hfi/core/hfidd_init.c +++ b/drivers/net/hfi/core/hfidd_init.c @@ -35,6 +35,7 @@ #include #include +#include "hfidd_proto.h" MODULE_VERSION("1.0"); MODULE_DESCRIPTION("Device Driver for IBM eServer HFI for IBM System p"); @@ -117,10 +118,52 @@ hfidd_create_class_error1: return rc; } +/* Free adapter resources and the devicese */ +static void hfidd_destroy_devices(void) +{ + int i; + + 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--; + } +} + +/* + * Create the adapter structure, allocate resources and create + * the hfi devices + */ +static int hfidd_create_devices(void) +{ + int i, j; + int rc = 0; + + for (i = 0; i < MAX_HFIS; i++) { + rc = hfidd_alloc_adapter(&(hfidd_global.p_acs[i]), + MKDEV(MAJOR(hfidd_dev), i), NULL); + if (rc) { + printk(KERN_ERR "%s: hfidd_create_devices: " + "hfidd_alloc_adapter fail rc = %d\n", + HFIDD_DEV_NAME, rc); + for (j = 0; j < i; j++) { + hfidd_free_adapter(hfidd_global.p_acs[j]); + hfidd_global.p_acs[j] = NULL; + hfidd_global.acs_cnt--; + } + return rc; + } + hfidd_global.acs_cnt++; + } + return rc; +} + static int __init hfidd_mod_init(void) { int rc = 0; + hfidd_global.acs_cnt = 0; + rc = hfidd_create_class(); if (rc < 0) { printk(KERN_ERR "%s: hfidd_mod_init: hfidd_create_class failed" @@ -128,12 +171,24 @@ static int __init hfidd_mod_init(void) return rc; } + rc = hfidd_create_devices(); + if (rc < 0) { + printk(KERN_ERR "%s: hfidd_mod_init: hfidd_create_devices" + " failed rc = %d\n", HFIDD_DEV_NAME, rc); + goto error1; + } + printk(KERN_INFO "IBM hfi device driver loaded sucessfully\n"); return 0; + +error1: + hfidd_destroy_class(); + return rc; } static void __exit hfidd_mod_exit(void) { + hfidd_destroy_devices(); hfidd_destroy_class(); } diff --git a/drivers/net/hfi/core/hfidd_proto.h b/drivers/net/hfi/core/hfidd_proto.h new file mode 100644 index 0000000..01a5ba2 --- /dev/null +++ b/drivers/net/hfi/core/hfidd_proto.h @@ -0,0 +1,39 @@ +/* + * hfidd_proto.h + * + * HFI device driver for IBM System p + * + * Authors: + * Fu-Chung Chang + * William S. Cadden + * Wen C. Chen + * Scot Sakolish + * Jian Xiao + * Carol L. Soto + * Sarah J. Sheppard + * William S. Cadden + * Wen C. Chen + * Scot Sakolish + * Jian Xiao + * Carol L. Soto + * Sarah J. Sheppard + * + * (C) Copyright IBM Corp. 2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _HFIDD_ADPT_H_ +#define _HFIDD_ADPT_H_ + +#include + + +/* Adpt state */ +#define HFI_INVALID 0 +#define HFI_AVAIL 1 +#define HFI_GOING_UNAVAIL 2 +#define HFI_UNAVAIL 3 + +#endif /* _HFIDD_ADPT_H_ */ diff --git a/include/linux/hfi/hfidd_internal.h b/include/linux/hfi/hfidd_internal.h index f5de1bb..66765a5 100644 --- a/include/linux/hfi/hfidd_internal.h +++ b/include/linux/hfi/hfidd_internal.h @@ -38,16 +38,30 @@ #include #include #include +#include #include +#include #define HFIDD_DEV_NAME "hfi" #define HFIDD_CLASS_NAME "hfi" +#define HFI_DEVICE_NAME_MAX 8 +/* hfi global */ +struct hfidd_acs { + dev_t dev_num; + char name[HFI_DEVICE_NAME_MAX]; + unsigned int index; + unsigned int acs_cnt; + unsigned int state; +}; + /* DD global */ struct hfidd_global { struct cdev cdev; struct class *class; + int acs_cnt; + struct hfidd_acs *p_acs[MAX_HFIS]; }; #endif -- 1.7.3.5