From: Pat Gefre <pfg@sgi.com>

More code clean up - this time ioconfig_bus.c



---

 25-akpm/arch/ia64/sn/io/drivers/ioconfig_bus.c   |  109 +++++++++--------------
 25-akpm/arch/ia64/sn/io/machvec/pci_bus_cvlink.c |    6 -
 2 files changed, 49 insertions(+), 66 deletions(-)

diff -puN arch/ia64/sn/io/drivers/ioconfig_bus.c~sn35 arch/ia64/sn/io/drivers/ioconfig_bus.c
--- 25/arch/ia64/sn/io/drivers/ioconfig_bus.c~sn35	Thu Jan  8 15:25:08 2004
+++ 25-akpm/arch/ia64/sn/io/drivers/ioconfig_bus.c	Thu Jan  8 15:25:08 2004
@@ -33,6 +33,7 @@
  */
 static vertex_hdl_t ioconfig_bus_handle;
 static unsigned long ioconfig_bus_debug;
+static struct ioconfig_parm parm;
 
 #ifdef IOCONFIG_BUS_DEBUG
 #define DBG(x...)	printk(x)
@@ -40,8 +41,6 @@ static unsigned long ioconfig_bus_debug;
 #define DBG(x...)
 #endif
 
-static u64 ioconfig_file;
-static u64 ioconfig_file_size;
 static u64 ioconfig_activated;
 static char ioconfig_kernopts[128];
 
@@ -49,8 +48,6 @@ static char ioconfig_kernopts[128];
  * For debugging purpose .. hardcode a table ..
  */
 struct  ascii_moduleid *ioconfig_bus_table;
-u64 ioconfig_bus_table_size;
-
 
 static int free_entry;
 static int new_entry;
@@ -67,6 +64,8 @@ ioconfig_get_busnum(char *io_moduleid, i
 
 	*bus_num = -1;
 	temp = ioconfig_bus_table;
+	if (!ioconfig_bus_table)
+		return;
 	for (index = 0; index < free_entry; temp++, index++) {
 		if ( (io_moduleid[0] == temp->io_moduleid[0]) &&
 		     (io_moduleid[1] == temp->io_moduleid[1]) &&
@@ -100,6 +99,10 @@ dump_ioconfig_table(void)
 	struct ascii_moduleid *temp;
 
 	temp = ioconfig_bus_table;
+	if (!temp) {
+		DBG("ioconfig_bus_table tabel empty\n");
+		return;
+	}
 	while (index < free_entry) {
 		DBG("ASSCI Module ID %s\n", temp->io_moduleid);
 		temp++;
@@ -144,7 +147,7 @@ int nextline(char *buffer, char **next, 
  *	memory by ioconfig command in EFI and builds the
  *	persistent pci bus naming table.
  */
-void
+int
 build_moduleid_table(char *file_contents, struct ascii_moduleid *table)
 {
 	/*
@@ -159,8 +162,17 @@ build_moduleid_table(char *file_contents
 	struct ascii_moduleid *moduleid;
 
 	line = kmalloc(256, GFP_KERNEL);
-	memset(line, 0,256);
 	name = kmalloc(125, GFP_KERNEL);
+	if (!line || !name) {
+		if (line)
+			kfree(line);
+		if (name)
+			kfree(name);
+		printk("build_moduleid_table(): Unabled to allocate memmory");
+		return -ENOMEM;
+	}
+
+	memset(line, 0,256);
 	memset(name, 0, 125);
 	moduleid = table;
 	curr = file_contents;
@@ -209,46 +221,21 @@ build_moduleid_table(char *file_contents
 	kfree(line);
 	kfree(name);
 
-	return;
+	return 0;
 }
 
-void
+int
 ioconfig_bus_init(void)
 {
 
-	struct ia64_sal_retval ret_stuff;
-	u64	*temp;
-	int	cnode;
-
 	DBG("ioconfig_bus_init called.\n");
 
-        for (cnode = 0; cnode < numnodes; cnode++) {
-		nasid_t nasid;
-		/*
-	 	 * Make SAL call to get the address of the bus configuration table.
-	 	 */
-		ret_stuff.status = (uint64_t)0;
-		ret_stuff.v0 = (uint64_t)0;
-		ret_stuff.v1 = (uint64_t)0;
-		ret_stuff.v2 = (uint64_t)0;
-		nasid = COMPACT_TO_NASID_NODEID(cnode);
-		SAL_CALL(ret_stuff, SN_SAL_BUS_CONFIG, 0, nasid, 0, 0, 0, 0, 0);
-		temp = (u64 *)TO_NODE_CAC(nasid, ret_stuff.v0);
-		ioconfig_file = *temp;
-		DBG("ioconfig_bus_init: Nasid %d ret_stuff.v0 0x%lx\n", nasid,
-			ret_stuff.v0);
-		if (ioconfig_file) {
-			ioconfig_file_size = ret_stuff.v1;
-			ioconfig_file = (ioconfig_file | CACHEABLE_MEM_SPACE);
-			ioconfig_activated = 1;
-			break;
-		}
+	ioconfig_bus_table = kmalloc( 512, GFP_KERNEL );
+	if (!ioconfig_bus_table) {
+		printk("ioconfig_bus_init : cannot allocate memory\n");
+		return -1;
 	}
 
-	DBG("ioconfig_bus_init: ret_stuff.v0 %p ioconfig_file %p %d\n",
-		ret_stuff.v0, (void *)ioconfig_file, (int)ioconfig_file_size);
-
-	ioconfig_bus_table = kmalloc( 512, GFP_KERNEL );
 	memset(ioconfig_bus_table, 0, 512);
 
 	/*
@@ -259,27 +246,17 @@ ioconfig_bus_init(void)
 		 * ioconfig="..." kernel options given.
 		 */
 		DBG("ioconfig_bus_init: Kernel Options given.\n");
-		(void) build_moduleid_table((char *)ioconfig_kernopts, ioconfig_bus_table);
+		if ( build_moduleid_table((char *)ioconfig_kernopts, ioconfig_bus_table) < 0 )
+			return -1;
 		(void) dump_ioconfig_table();
-		return;
 	}
-
-	if (ioconfig_activated) {
-		DBG("ioconfig_bus_init: ioconfig file given.\n");
-		(void) build_moduleid_table((char *)ioconfig_file, ioconfig_bus_table);
-		(void) dump_ioconfig_table();
-	} else {
-		DBG("ioconfig_bus_init: ioconfig command not executed in prom\n");
-	}
-
+	return 0;
 }
 
 void
 ioconfig_bus_new_entries(void)
 {
-
-	
-	int index = 0;
+	int index;
 	struct ascii_moduleid *temp;
 
 	if ((ioconfig_activated) && (free_entry > new_entry)) {
@@ -289,6 +266,10 @@ ioconfig_bus_new_entries(void)
 		return;
 
 	index = new_entry;
+	if (!ioconfig_bus_table) {
+		printk("ioconfig_bus_table table is empty\n");
+		return;
+	}
 	temp = &ioconfig_bus_table[index];
         while (index < free_entry) {
                 printk("%s\n", (char *)temp);
@@ -301,17 +282,21 @@ ioconfig_bus_new_entries(void)
 static int ioconfig_bus_ioctl(struct inode * inode, struct file * file,
         unsigned int cmd, unsigned long arg)
 {
-
-	struct ioconfig_parm parm;
-
 	/*
 	 * Copy in the parameters.
 	 */
-	copy_from_user(&parm, (char *)arg, sizeof(struct ioconfig_parm));
+	if (copy_from_user(&parm, (char *)arg, sizeof(struct ioconfig_parm)))
+		return -EFAULT;
 	parm.number = free_entry - new_entry;
 	parm.ioconfig_activated = ioconfig_activated;
-	copy_to_user((char *)arg, &parm, sizeof(struct ioconfig_parm));
-	copy_to_user((char *)parm.buffer, &ioconfig_bus_table[new_entry], sizeof(struct  ascii_moduleid) * (free_entry - new_entry));
+	if (copy_to_user((char *)arg, &parm, sizeof(struct ioconfig_parm)))
+		return -EFAULT;
+
+	if (!ioconfig_bus_table)
+		return -EFAULT;
+
+	if (copy_to_user((char *)parm.buffer, &ioconfig_bus_table[new_entry], sizeof(struct  ascii_moduleid) * (free_entry - new_entry)))
+		return -EFAULT;
 
 	return 0;
 }
@@ -343,9 +328,9 @@ static int ioconfig_bus_close(struct ino
 }
 
 struct file_operations ioconfig_bus_fops = {
-	.ioctl = ioconfig_bus_ioctl,
-	.open = ioconfig_bus_open,		/* open */
-	.release = ioconfig_bus_close	/* release */
+	.ioctl	= ioconfig_bus_ioctl,
+	.open	= ioconfig_bus_open,	/* open */
+	.release=ioconfig_bus_close	/* release */
 };
 
 
@@ -356,7 +341,6 @@ struct file_operations ioconfig_bus_fops
  */
 int init_ioconfig_bus(void)
 {
-	ioconfig_bus_handle = NULL;
 	ioconfig_bus_handle = hwgraph_register(hwgraph_root, ".ioconfig_bus",
 		        0, 0,
 			0, 0,
@@ -367,8 +351,7 @@ int init_ioconfig_bus(void)
 		panic("Unable to create SGI PERSISTENT BUS NUMBERING Driver.\n");
 	}
 
-	return(0);
-
+	return 0;
 }
 
 static int __init ioconfig_bus_setup (char *str)
diff -puN arch/ia64/sn/io/machvec/pci_bus_cvlink.c~sn35 arch/ia64/sn/io/machvec/pci_bus_cvlink.c
--- 25/arch/ia64/sn/io/machvec/pci_bus_cvlink.c~sn35	Thu Jan  8 15:25:08 2004
+++ 25-akpm/arch/ia64/sn/io/machvec/pci_bus_cvlink.c	Thu Jan  8 15:25:08 2004
@@ -35,11 +35,11 @@ void sn_dma_flush_init(unsigned long sta
  * pci_bus_cvlink_init() - To be called once during initialization before 
  *	SGI IO Infrastructure init is called.
  */
-void
+int
 pci_bus_cvlink_init(void)
 {
 
-	extern void ioconfig_bus_init(void);
+	extern int ioconfig_bus_init(void);
 
 	memset(busnum_to_pcibr_vhdl, 0x0, sizeof(vertex_hdl_t) * MAX_PCI_XWIDGET);
 	memset(busnum_to_nid, 0x0, sizeof(nasid_t) * MAX_PCI_XWIDGET);
@@ -48,7 +48,7 @@ pci_bus_cvlink_init(void)
 
 	num_bridges = 0;
 
-	ioconfig_bus_init();
+	return ioconfig_bus_init();
 }
 
 /*

_