diff options
Diffstat (limited to 'arch/ia64')
| -rw-r--r-- | arch/ia64/Kconfig | 2 | ||||
| -rw-r--r-- | arch/ia64/hp/sim/simserial.c | 16 | ||||
| -rw-r--r-- | arch/ia64/include/asm/futex.h | 5 | ||||
| -rw-r--r-- | arch/ia64/include/asm/hugetlb.h | 1 | ||||
| -rw-r--r-- | arch/ia64/include/asm/mca.h | 1 | ||||
| -rw-r--r-- | arch/ia64/include/asm/numa.h | 5 | ||||
| -rw-r--r-- | arch/ia64/kernel/fsys.S | 49 | ||||
| -rw-r--r-- | arch/ia64/kernel/iosapic.c | 34 | ||||
| -rw-r--r-- | arch/ia64/kernel/irq.c | 8 | ||||
| -rw-r--r-- | arch/ia64/kernel/mca.c | 37 | ||||
| -rw-r--r-- | arch/ia64/kernel/mca_drv.c | 2 | ||||
| -rw-r--r-- | arch/ia64/kvm/vtlb.c | 2 | ||||
| -rw-r--r-- | arch/ia64/mm/contig.c | 2 | ||||
| -rw-r--r-- | arch/ia64/mm/discontig.c | 9 | ||||
| -rw-r--r-- | arch/ia64/mm/init.c | 23 | ||||
| -rw-r--r-- | arch/ia64/mm/ioremap.c | 14 | ||||
| -rw-r--r-- | arch/ia64/mm/numa.c | 20 | ||||
| -rw-r--r-- | arch/ia64/pci/pci.c | 11 | ||||
| -rw-r--r-- | arch/ia64/sn/kernel/tiocx.c | 5 | 
19 files changed, 131 insertions, 115 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 9a02f71c6b1..e7e55a00f94 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -187,7 +187,7 @@ config IA64_DIG  config IA64_DIG_VTD  	bool "DIG+Intel+IOMMU" -	select DMAR +	select INTEL_IOMMU  	select PCI_MSI  config IA64_HP_ZX1 diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index da2f319fb71..e70cadec7ce 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c @@ -142,8 +142,7 @@ static void transmit_chars(struct tty_struct *tty, struct serial_state *info,  		goto out;  	} -	if (info->xmit.head == info->xmit.tail || tty->stopped || -			tty->hw_stopped) { +	if (info->xmit.head == info->xmit.tail || tty->stopped) {  #ifdef SIMSERIAL_DEBUG  		printk("transmit_chars: head=%d, tail=%d, stopped=%d\n",  		       info->xmit.head, info->xmit.tail, tty->stopped); @@ -181,7 +180,7 @@ static void rs_flush_chars(struct tty_struct *tty)  	struct serial_state *info = tty->driver_data;  	if (info->xmit.head == info->xmit.tail || tty->stopped || -			tty->hw_stopped || !info->xmit.buf) +			!info->xmit.buf)  		return;  	transmit_chars(tty, info, NULL); @@ -217,7 +216,7 @@ static int rs_write(struct tty_struct * tty,  	 * Hey, we transmit directly from here in our case  	 */  	if (CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) && -			!tty->stopped && !tty->hw_stopped) +			!tty->stopped)  		transmit_chars(tty, info, NULL);  	return ret; @@ -325,14 +324,6 @@ static int rs_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)  #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) -static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) -{ -	/* Handle turning off CRTSCTS */ -	if ((old_termios->c_cflag & CRTSCTS) && -	    !(tty->termios.c_cflag & CRTSCTS)) { -		tty->hw_stopped = 0; -	} -}  /*   * This routine will shutdown a serial port; interrupts are disabled, and   * DTR is dropped if the hangup on close termio flag is on. @@ -481,7 +472,6 @@ static const struct tty_operations hp_ops = {  	.throttle = rs_throttle,  	.unthrottle = rs_unthrottle,  	.send_xchar = rs_send_xchar, -	.set_termios = rs_set_termios,  	.hangup = rs_hangup,  	.proc_fops = &rs_proc_fops,  }; diff --git a/arch/ia64/include/asm/futex.h b/arch/ia64/include/asm/futex.h index d2bf1fd5e44..76acbcd5c06 100644 --- a/arch/ia64/include/asm/futex.h +++ b/arch/ia64/include/asm/futex.h @@ -106,16 +106,15 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  		return -EFAULT;  	{ -		register unsigned long r8 __asm ("r8"); +		register unsigned long r8 __asm ("r8") = 0;  		unsigned long prev;  		__asm__ __volatile__(  			"	mf;;					\n" -			"	mov %0=r0				\n"  			"	mov ar.ccv=%4;;				\n"  			"[1:]	cmpxchg4.acq %1=[%2],%3,ar.ccv		\n"  			"	.xdata4 \"__ex_table\", 1b-., 2f-.	\n"  			"[2:]" -			: "=r" (r8), "=r" (prev) +			: "+r" (r8), "=&r" (prev)  			: "r" (uaddr), "r" (newval),  			  "rO" ((long) (unsigned) oldval)  			: "memory"); diff --git a/arch/ia64/include/asm/hugetlb.h b/arch/ia64/include/asm/hugetlb.h index 94eaa5bd5d0..aa910054b8e 100644 --- a/arch/ia64/include/asm/hugetlb.h +++ b/arch/ia64/include/asm/hugetlb.h @@ -2,6 +2,7 @@  #define _ASM_IA64_HUGETLB_H  #include <asm/page.h> +#include <asm-generic/hugetlb.h>  void hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr, diff --git a/arch/ia64/include/asm/mca.h b/arch/ia64/include/asm/mca.h index 43f96ab18fa..8c709616871 100644 --- a/arch/ia64/include/asm/mca.h +++ b/arch/ia64/include/asm/mca.h @@ -143,6 +143,7 @@ extern unsigned long __per_cpu_mca[NR_CPUS];  extern int cpe_vector;  extern int ia64_cpe_irq;  extern void ia64_mca_init(void); +extern void ia64_mca_irq_init(void);  extern void ia64_mca_cpu_init(void *);  extern void ia64_os_mca_dispatch(void);  extern void ia64_os_mca_dispatch_end(void); diff --git a/arch/ia64/include/asm/numa.h b/arch/ia64/include/asm/numa.h index 2e27ef17565..2db0a6c6daa 100644 --- a/arch/ia64/include/asm/numa.h +++ b/arch/ia64/include/asm/numa.h @@ -67,14 +67,13 @@ extern int paddr_to_nid(unsigned long paddr);  extern void map_cpu_to_node(int cpu, int nid);  extern void unmap_cpu_from_node(int cpu, int nid); - +extern void numa_clear_node(int cpu);  #else /* !CONFIG_NUMA */  #define map_cpu_to_node(cpu, nid)	do{}while(0)  #define unmap_cpu_from_node(cpu, nid)	do{}while(0) -  #define paddr_to_nid(addr)	0 - +#define numa_clear_node(cpu)	do { } while (0)  #endif /* CONFIG_NUMA */  #endif /* _ASM_IA64_NUMA_H */ diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index c4cd45d9774..abc6dee3799 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S @@ -90,53 +90,6 @@ ENTRY(fsys_getpid)  	FSYS_RETURN  END(fsys_getpid) -ENTRY(fsys_getppid) -	.prologue -	.altrp b6 -	.body -	add r17=IA64_TASK_GROUP_LEADER_OFFSET,r16 -	;; -	ld8 r17=[r17]				// r17 = current->group_leader -	add r9=TI_FLAGS+IA64_TASK_SIZE,r16 -	;; - -	ld4 r9=[r9] -	add r17=IA64_TASK_REAL_PARENT_OFFSET,r17 // r17 = ¤t->group_leader->real_parent -	;; -	and r9=TIF_ALLWORK_MASK,r9 - -1:	ld8 r18=[r17]				// r18 = current->group_leader->real_parent -	;; -	cmp.ne p8,p0=0,r9 -	add r8=IA64_TASK_TGID_OFFSET,r18	// r8 = ¤t->group_leader->real_parent->tgid -	;; - -	/* -	 * The .acq is needed to ensure that the read of tgid has returned its data before -	 * we re-check "real_parent". -	 */ -	ld4.acq r8=[r8]				// r8 = current->group_leader->real_parent->tgid -#ifdef CONFIG_SMP -	/* -	 * Re-read current->group_leader->real_parent. -	 */ -	ld8 r19=[r17]				// r19 = current->group_leader->real_parent -(p8)	br.spnt.many fsys_fallback_syscall -	;; -	cmp.ne p6,p0=r18,r19			// did real_parent change? -	mov r19=0			// i must not leak kernel bits... -(p6)	br.cond.spnt.few 1b			// yes -> redo the read of tgid and the check -	;; -	mov r17=0			// i must not leak kernel bits... -	mov r18=0			// i must not leak kernel bits... -#else -	mov r17=0			// i must not leak kernel bits... -	mov r18=0			// i must not leak kernel bits... -	mov r19=0			// i must not leak kernel bits... -#endif -	FSYS_RETURN -END(fsys_getppid) -  ENTRY(fsys_set_tid_address)  	.prologue  	.altrp b6 @@ -614,7 +567,7 @@ paravirt_fsyscall_table:  	data8 0				// chown  	data8 0				// lseek		// 1040  	data8 fsys_getpid		// getpid -	data8 fsys_getppid		// getppid +	data8 0				// getppid  	data8 0				// mount  	data8 0				// umount  	data8 0				// setuid		// 1045 diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index ee33c3aaa2f..19f107be734 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c @@ -76,7 +76,7 @@   *	PCI pin -> global system interrupt (GSI) -> IA-64 vector <-> IRQ   *   * Note: The term "IRQ" is loosely used everywhere in Linux kernel to - * describeinterrupts.  Now we use "IRQ" only for Linux IRQ's.  ISA IRQ + * describe interrupts.  Now we use "IRQ" only for Linux IRQ's.  ISA IRQ   * (isa_irq) is the only exception in this source code.   */ @@ -1010,6 +1010,26 @@ iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)  	return 0;  } +static int +iosapic_delete_rte(unsigned int irq, unsigned int gsi) +{ +	struct iosapic_rte_info *rte, *temp; + +	list_for_each_entry_safe(rte, temp, &iosapic_intr_info[irq].rtes, +								rte_list) { +		if (rte->iosapic->gsi_base + rte->rte_index == gsi) { +			if (rte->refcnt) +				return -EBUSY; + +			list_del(&rte->rte_list); +			kfree(rte); +			return 0; +		} +	} + +	return -EINVAL; +} +  int iosapic_init(unsigned long phys_addr, unsigned int gsi_base)  {  	int num_rte, err, index; @@ -1069,7 +1089,7 @@ int iosapic_init(unsigned long phys_addr, unsigned int gsi_base)  int iosapic_remove(unsigned int gsi_base)  { -	int index, err = 0; +	int i, irq, index, err = 0;  	unsigned long flags;  	spin_lock_irqsave(&iosapic_lock, flags); @@ -1087,6 +1107,16 @@ int iosapic_remove(unsigned int gsi_base)  		goto out;  	} +	for (i = gsi_base; i < gsi_base + iosapic_lists[index].num_rte; i++) { +		irq = __gsi_to_irq(i); +		if (irq < 0) +			continue; + +		err = iosapic_delete_rte(irq, i); +		if (err) +			goto out; +	} +  	iounmap(iosapic_lists[index].addr);  	iosapic_free(index);   out: diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index ad69606613e..f2c41828113 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c @@ -23,6 +23,8 @@  #include <linux/interrupt.h>  #include <linux/kernel_stat.h> +#include <asm/mca.h> +  /*   * 'what should we do if we get a hw irq event on an illegal vector'.   * each architecture has to answer this themselves. @@ -83,6 +85,12 @@ bool is_affinity_mask_valid(const struct cpumask *cpumask)  #endif /* CONFIG_SMP */ +int __init arch_early_irq_init(void) +{ +	ia64_mca_irq_init(); +	return 0; +} +  #ifdef CONFIG_HOTPLUG_CPU  unsigned int vectors_in_migration[NR_IRQS]; diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 65bf9cd3904..d7396dbb07b 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c @@ -2074,22 +2074,16 @@ ia64_mca_init(void)  	printk(KERN_INFO "MCA related initialization done\n");  } +  /* - * ia64_mca_late_init - * - *	Opportunity to setup things that require initialization later - *	than ia64_mca_init.  Setup a timer to poll for CPEs if the - *	platform doesn't support an interrupt driven mechanism. - * - *  Inputs  :   None - *  Outputs :   Status + * These pieces cannot be done in ia64_mca_init() because it is called before + * early_irq_init() which would wipe out our percpu irq registrations. But we + * cannot leave them until ia64_mca_late_init() because by then all the other + * processors have been brought online and have set their own CMC vectors to + * point at a non-existant action. Called from arch_early_irq_init().   */ -static int __init -ia64_mca_late_init(void) +void __init ia64_mca_irq_init(void)  { -	if (!mca_init) -		return 0; -  	/*  	 *  Configure the CMCI/P vector and handler. Interrupts for CMC are  	 *  per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). @@ -2108,6 +2102,23 @@ ia64_mca_late_init(void)  	/* Setup the CPEI/P handler */  	register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction);  #endif +} + +/* + * ia64_mca_late_init + * + *	Opportunity to setup things that require initialization later + *	than ia64_mca_init.  Setup a timer to poll for CPEs if the + *	platform doesn't support an interrupt driven mechanism. + * + *  Inputs  :   None + *  Outputs :   Status + */ +static int __init +ia64_mca_late_init(void) +{ +	if (!mca_init) +		return 0;  	register_hotcpu_notifier(&mca_cpu_notifier); diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c index 9392e021c93..94f8bf777af 100644 --- a/arch/ia64/kernel/mca_drv.c +++ b/arch/ia64/kernel/mca_drv.c @@ -349,7 +349,7 @@ init_record_index_pools(void)  	/* - 3 - */  	slidx_pool.max_idx = (rec_max_size/sect_min_size) * 2 + 1; -	slidx_pool.buffer = (slidx_list_t *) +	slidx_pool.buffer =  		kmalloc(slidx_pool.max_idx * sizeof(slidx_list_t), GFP_KERNEL);  	return slidx_pool.buffer ? 0 : -ENOMEM; diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c index 4332f7ee520..a7869f8f49a 100644 --- a/arch/ia64/kvm/vtlb.c +++ b/arch/ia64/kvm/vtlb.c @@ -256,7 +256,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)  			"srlz.d;;"  			"ssm psr.i;;"  			"srlz.d;;" -			: "=r"(ret) : "r"(iha), "r"(pte):"memory"); +			: "=&r"(ret) : "r"(iha), "r"(pte) : "memory");  	return ret;  } diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index 80dab509dfb..67c59ebec89 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c @@ -47,6 +47,8 @@ void show_mem(unsigned int filter)  	printk(KERN_INFO "Mem-info:\n");  	show_free_areas(filter);  	printk(KERN_INFO "Node memory in pages:\n"); +	if (filter & SHOW_MEM_FILTER_PAGE_COUNT) +		return;  	for_each_online_pgdat(pgdat) {  		unsigned long present;  		unsigned long flags; diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index c2e955ee79a..ae4db4bd6d9 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c @@ -623,6 +623,8 @@ void show_mem(unsigned int filter)  	printk(KERN_INFO "Mem-info:\n");  	show_free_areas(filter); +	if (filter & SHOW_MEM_FILTER_PAGE_COUNT) +		return;  	printk(KERN_INFO "Node memory in pages:\n");  	for_each_online_pgdat(pgdat) {  		unsigned long present; @@ -817,13 +819,12 @@ void arch_refresh_nodedata(int update_node, pg_data_t *update_pgdat)  #endif  #ifdef CONFIG_SPARSEMEM_VMEMMAP -int __meminit vmemmap_populate(struct page *start_page, -						unsigned long size, int node) +int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)  { -	return vmemmap_populate_basepages(start_page, size, node); +	return vmemmap_populate_basepages(start, end, node);  } -void vmemmap_free(struct page *memmap, unsigned long nr_pages) +void vmemmap_free(unsigned long start, unsigned long end)  {  }  #endif diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 20bc967c720..d1fe4b40260 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c @@ -154,25 +154,14 @@ ia64_init_addr_space (void)  void  free_initmem (void)  { -	unsigned long addr, eaddr; - -	addr = (unsigned long) ia64_imva(__init_begin); -	eaddr = (unsigned long) ia64_imva(__init_end); -	while (addr < eaddr) { -		ClearPageReserved(virt_to_page(addr)); -		init_page_count(virt_to_page(addr)); -		free_page(addr); -		++totalram_pages; -		addr += PAGE_SIZE; -	} -	printk(KERN_INFO "Freeing unused kernel memory: %ldkB freed\n", -	       (__init_end - __init_begin) >> 10); +	free_reserved_area((unsigned long)ia64_imva(__init_begin), +			   (unsigned long)ia64_imva(__init_end), +			   0, "unused kernel");  }  void __init  free_initrd_mem (unsigned long start, unsigned long end)  { -	struct page *page;  	/*  	 * EFI uses 4KB pages while the kernel can use 4KB or bigger.  	 * Thus EFI and the kernel may have different page sizes. It is @@ -213,11 +202,7 @@ free_initrd_mem (unsigned long start, unsigned long end)  	for (; start < end; start += PAGE_SIZE) {  		if (!virt_addr_valid(start))  			continue; -		page = virt_to_page(start); -		ClearPageReserved(page); -		init_page_count(page); -		free_page(start); -		++totalram_pages; +		free_reserved_page(virt_to_page(start));  	}  } diff --git a/arch/ia64/mm/ioremap.c b/arch/ia64/mm/ioremap.c index 3dccdd8eb27..43964cde621 100644 --- a/arch/ia64/mm/ioremap.c +++ b/arch/ia64/mm/ioremap.c @@ -16,7 +16,7 @@  #include <asm/meminit.h>  static inline void __iomem * -__ioremap (unsigned long phys_addr) +__ioremap_uc(unsigned long phys_addr)  {  	return (void __iomem *) (__IA64_UNCACHED_OFFSET | phys_addr);  } @@ -24,7 +24,11 @@ __ioremap (unsigned long phys_addr)  void __iomem *  early_ioremap (unsigned long phys_addr, unsigned long size)  { -	return __ioremap(phys_addr); +	u64 attr; +	attr = kern_mem_attribute(phys_addr, size); +	if (attr & EFI_MEMORY_WB) +		return (void __iomem *) phys_to_virt(phys_addr); +	return __ioremap_uc(phys_addr);  }  void __iomem * @@ -47,7 +51,7 @@ ioremap (unsigned long phys_addr, unsigned long size)  	if (attr & EFI_MEMORY_WB)  		return (void __iomem *) phys_to_virt(phys_addr);  	else if (attr & EFI_MEMORY_UC) -		return __ioremap(phys_addr); +		return __ioremap_uc(phys_addr);  	/*  	 * Some chipsets don't support UC access to memory.  If @@ -93,7 +97,7 @@ ioremap (unsigned long phys_addr, unsigned long size)  		return (void __iomem *) (offset + (char __iomem *)addr);  	} -	return __ioremap(phys_addr); +	return __ioremap_uc(phys_addr);  }  EXPORT_SYMBOL(ioremap); @@ -103,7 +107,7 @@ ioremap_nocache (unsigned long phys_addr, unsigned long size)  	if (kern_mem_attribute(phys_addr, size) & EFI_MEMORY_WB)  		return NULL; -	return __ioremap(phys_addr); +	return __ioremap_uc(phys_addr);  }  EXPORT_SYMBOL(ioremap_nocache); diff --git a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c index 3efea7d0a35..4248492b932 100644 --- a/arch/ia64/mm/numa.c +++ b/arch/ia64/mm/numa.c @@ -61,18 +61,36 @@ paddr_to_nid(unsigned long paddr)  int __meminit __early_pfn_to_nid(unsigned long pfn)  {  	int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec; +	/* +	 * NOTE: The following SMP-unsafe globals are only used early in boot +	 * when the kernel is running single-threaded. +	 */ +	static int __meminitdata last_ssec, last_esec; +	static int __meminitdata last_nid; + +	if (section >= last_ssec && section < last_esec) +		return last_nid;  	for (i = 0; i < num_node_memblks; i++) {  		ssec = node_memblk[i].start_paddr >> PA_SECTION_SHIFT;  		esec = (node_memblk[i].start_paddr + node_memblk[i].size +  			((1L << PA_SECTION_SHIFT) - 1)) >> PA_SECTION_SHIFT; -		if (section >= ssec && section < esec) +		if (section >= ssec && section < esec) { +			last_ssec = ssec; +			last_esec = esec; +			last_nid = node_memblk[i].nid;  			return node_memblk[i].nid; +		}  	}  	return -1;  } +void __cpuinit numa_clear_node(int cpu) +{ +	unmap_cpu_from_node(cpu, NUMA_NO_NODE); +} +  #ifdef CONFIG_MEMORY_HOTPLUG  /*   *  SRAT information is stored in node_memblk[], then we can use SRAT diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 60532ab2734..de1474ff0bc 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c @@ -15,6 +15,7 @@  #include <linux/types.h>  #include <linux/kernel.h>  #include <linux/pci.h> +#include <linux/pci-acpi.h>  #include <linux/init.h>  #include <linux/ioport.h>  #include <linux/slab.h> @@ -458,6 +459,16 @@ void pcibios_fixup_bus(struct pci_bus *b)  	platform_pci_fixup_bus(b);  } +void pcibios_add_bus(struct pci_bus *bus) +{ +	acpi_pci_add_bus(bus); +} + +void pcibios_remove_bus(struct pci_bus *bus) +{ +	acpi_pci_remove_bus(bus); +} +  void pcibios_set_master (struct pci_dev *dev)  {  	/* No special bus mastering setup handling */ diff --git a/arch/ia64/sn/kernel/tiocx.c b/arch/ia64/sn/kernel/tiocx.c index 14c1711238c..e35f6485c1f 100644 --- a/arch/ia64/sn/kernel/tiocx.c +++ b/arch/ia64/sn/kernel/tiocx.c @@ -490,11 +490,14 @@ static int __init tiocx_init(void)  {  	cnodeid_t cnodeid;  	int found_tiocx_device = 0; +	int err;  	if (!ia64_platform_is("sn2"))  		return 0; -	bus_register(&tiocx_bus_type); +	err = bus_register(&tiocx_bus_type); +	if (err) +		return err;  	for (cnodeid = 0; cnodeid < num_cnodes; cnodeid++) {  		nasid_t nasid;  |