Merge tag 'parisc-for-7.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux

Pull parisc updates from Helge Deller:

 - fix out-of-bounds read in eisa_enumerator driver

 - drop redundant pte_xxx() macros and use common macros

 - code cleanup in eisa_enumerator driver

 - typo fixes in comments in various header files

* tag 'parisc-for-7.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
  parisc: eisa_enumerator: Code and whitespace cleanups
  parisc: eisa_enumerator: Fix out-of-bounds reads of the EEPROM buffer
  parisc: Drop redundant implementation of ptep_set_wrprotect()
  parisc: Drop redundant implementation of pte_same()
  parisc: Drop own implementations for ptep_get() and ptep_test_and_clear_young()
  parisc: fix typos in comments in parport.c
  parisc: fix typos in comments in sba_iommu.c
  parisc: fix typos in comments in pdc_stable.c
  parisc: fix typos in comments in dino.c
  parisc: fix typos in comments in ccio-dma.c
  parisc: fix typos in comments in memcpy.c
  parisc: fix typos in comments in mman.h
  parisc: fix typos in comments in special_insns.h
  parisc: fix typos in comments in pdcpat.h
diff --git a/arch/parisc/include/asm/pdcpat.h b/arch/parisc/include/asm/pdcpat.h
index ec97eef..6014fa0 100644
--- a/arch/parisc/include/asm/pdcpat.h
+++ b/arch/parisc/include/asm/pdcpat.h
@@ -54,7 +54,7 @@
 #define PAT_GMMIO           2         /* > 4G MMIO Space */
 #define PAT_NPIOP           3         /* Non Postable I/O Port Space */
 #define PAT_PIOP            4         /* Postable I/O Port Space */
-#define PAT_AHPA            5         /* Addional HPA Space */
+#define PAT_AHPA            5         /* Additional HPA Space */
 #define PAT_UFO             6         /* HPA Space (UFO for Mariposa) */
 #define PAT_GNIP            7         /* GNI Reserved Space */
 
@@ -292,7 +292,7 @@ struct pdc_pat_pd_addr_map_entry {
 * ----------------------------------------------------------
 * Bit  0 to 51 - conf_base_addr
 * Bit 52 to 62 - reserved
-* Bit       63 - endianess bit
+* Bit       63 - endianness bit
 ********************************************************************/
 #define PAT_GET_CBA(value) ((value) & 0xfffffffffffff000UL)
 
diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h
index f689937..74104d4e 100644
--- a/arch/parisc/include/asm/pgtable.h
+++ b/arch/parisc/include/asm/pgtable.h
@@ -423,36 +423,9 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)
 	return pte;
 }
 
-static inline pte_t ptep_get(pte_t *ptep)
-{
-	return READ_ONCE(*ptep);
-}
-#define ptep_get ptep_get
-
-static inline bool ptep_test_and_clear_young(struct vm_area_struct *vma,
-		unsigned long addr, pte_t *ptep)
-{
-	pte_t pte;
-
-	pte = ptep_get(ptep);
-	if (!pte_young(pte)) {
-		return false;
-	}
-	set_pte_at(vma->vm_mm, addr, ptep, pte_mkold(pte));
-	return true;
-}
-
 bool ptep_clear_flush_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep);
 pte_t ptep_clear_flush(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep);
 
-struct mm_struct;
-static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-	set_pte_at(mm, addr, ptep, pte_wrprotect(*ptep));
-}
-
-#define pte_same(A,B)	(pte_val(A) == pte_val(B))
-
 #endif /* !__ASSEMBLER__ */
 
 
@@ -482,10 +455,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
 #define HAVE_ARCH_UNMAPPED_AREA
 #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
 
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
 #define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
 #define __HAVE_ARCH_PTEP_CLEAR_FLUSH
-#define __HAVE_ARCH_PTEP_SET_WRPROTECT
-#define __HAVE_ARCH_PTE_SAME
 
 #endif /* _PARISC_PGTABLE_H */
diff --git a/arch/parisc/include/asm/special_insns.h b/arch/parisc/include/asm/special_insns.h
index 1013eeb..9a54df5 100644
--- a/arch/parisc/include/asm/special_insns.h
+++ b/arch/parisc/include/asm/special_insns.h
@@ -34,7 +34,7 @@
 
 /**
  * prober_user() - Probe user read access
- * @sr:		Space regster.
+ * @sr:		Space register.
  * @va:		Virtual address.
  *
  * Return: Non-zero if address is accessible.
diff --git a/arch/parisc/include/uapi/asm/mman.h b/arch/parisc/include/uapi/asm/mman.h
index b6a7095..aca942f 100644
--- a/arch/parisc/include/uapi/asm/mman.h
+++ b/arch/parisc/include/uapi/asm/mman.h
@@ -55,7 +55,7 @@
 #define MADV_HUGEPAGE	14		/* Worth backing with hugepages */
 #define MADV_NOHUGEPAGE 15		/* Not worth backing with hugepages */
 
-#define MADV_DONTDUMP   16		/* Explicity exclude from the core dump,
+#define MADV_DONTDUMP   16		/* Explicitly exclude from the core dump,
 					   overrides the coredump filter bits */
 #define MADV_DODUMP	17		/* Clear the MADV_NODUMP flag */
 
diff --git a/arch/parisc/lib/memcpy.c b/arch/parisc/lib/memcpy.c
index 03165c8..93d4e17 100644
--- a/arch/parisc/lib/memcpy.c
+++ b/arch/parisc/lib/memcpy.c
@@ -47,7 +47,7 @@ unsigned long raw_copy_from_user(void *dst, const void __user *src,
 			break;
 		}
 		start += PAGE_SIZE;
-		/* align to page boundry which may have different permission */
+		/* align to page boundary which may have different permission */
 		start = PAGE_ALIGN_DOWN(start);
 	}
 	return len - newlen + pa_memcpy(dst, (void __force *)src, newlen);
diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
index dc1b6d1..a85efc4 100644
--- a/drivers/parisc/ccio-dma.c
+++ b/drivers/parisc/ccio-dma.c
@@ -415,7 +415,7 @@ ccio_alloc_range(struct ioc *ioc, struct device *dev, size_t size)
  * @pages_mapped: The requested number of pages to be freed from the
  * I/O Pdir.
  *
- * This function frees the resouces allocated for the iova.
+ * This function frees the resources allocated for the iova.
  */
 static void
 ccio_free_range(struct ioc *ioc, dma_addr_t iova, unsigned long pages_mapped)
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c
index 4b96d9f..286f4f7 100644
--- a/drivers/parisc/dino.c
+++ b/drivers/parisc/dino.c
@@ -590,7 +590,7 @@ dino_card_fixup(struct pci_dev *dev)
 	dino_cfg_write(dev->bus, dev->devfn, PCI_INTERRUPT_LINE, 1, dev->irq); 
 }
 
-/* The alignment contraints for PCI bridges under dino */
+/* The alignment constraints for PCI bridges under dino */
 #define DINO_BRIDGE_ALIGN 0x100000
 
 
diff --git a/drivers/parisc/eisa_enumerator.c b/drivers/parisc/eisa_enumerator.c
index e0a5708..2edf107 100644
--- a/drivers/parisc/eisa_enumerator.c
+++ b/drivers/parisc/eisa_enumerator.c
@@ -6,341 +6,299 @@
  */
 
 #include <linux/ioport.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
+#include <linux/io.h>
 #include <linux/slab.h>
-#include <asm/io.h>
-#include <linux/uaccess.h>
-#include <asm/byteorder.h>
+#include <linux/unaligned.h>
 
 #include <asm/eisa_bus.h>
 #include <asm/eisa_eeprom.h>
 
-
 /*
- * Todo:
- * 
- * PORT init with MASK attr and other size than byte
- * MEMORY with other decode than 20 bit
- * CRC stuff
- * FREEFORM stuff
+ * TODO:
+ * - PORT init with MASK attr and other size than byte
+ * - MEMORY with other decode than 20 bit
+ * - CRC stuff
+ * - FREEFORM stuff
  */
 
 #define EPI 0xc80
 #define NUM_SLOT 16
-#define SLOT2PORT(x) (x<<12)
+#define SLOT2PORT(x) (x << 12)
 
-
-/* macros to handle unaligned accesses and 
- * byte swapping. The data in the EEPROM is
- * little-endian on the big-endian PAROSC */
-#define get_8(x) (*(u_int8_t*)(x))
-
-static inline u_int16_t get_16(const unsigned char *x)
-{ 
-	return (x[1] << 8) | x[0];
-}
-
-static inline u_int32_t get_32(const unsigned char *x)
-{
-	return (x[3] << 24) | (x[2] << 16) | (x[1] << 8) | x[0];
-}
-
-static inline u_int32_t get_24(const unsigned char *x)
-{
-	return (x[2] << 24) | (x[1] << 16) | (x[0] << 8);
-}
+/* EEPROM data is little-endian, PA-RISC is big-endian. */
+#define get_8(x)	(*(u_int8_t *)(x))
+#define get_16(x)	get_unaligned_le16(x)
+#define get_32(x)	get_unaligned_le32(x)
+#define get_24(x)	(get_unaligned_le32(x) & 0x00ffffff)
 
 static void print_eisa_id(char *s, u_int32_t id)
 {
 	char vendor[4];
 	int rev;
 	int device;
-	
+
 	rev = id & 0xff;
 	id >>= 8;
 	device = id & 0xff;
 	id >>= 8;
 	vendor[3] = '\0';
 	vendor[2] = '@' + (id & 0x1f);
-	id >>= 5;	
+	id >>= 5;
 	vendor[1] = '@' + (id & 0x1f);
-	id >>= 5;	
+	id >>= 5;
 	vendor[0] = '@' + (id & 0x1f);
-	id >>= 5;	
-	
+	id >>= 5;
+
 	sprintf(s, "%s%02X%02X", vendor, device, rev);
 }
-       
-static int configure_memory(const unsigned char *buf, 
+
+static int configure_memory(const unsigned char *buf,
 		       struct resource *mem_parent,
 		       char *name)
 {
-	int len;
-	u_int8_t c;
-	int i;
-	struct resource *res;
-	
-	len=0;
-	
-	for (i=0;i<HPEE_MEMORY_MAX_ENT;i++) {
-		c = get_8(buf+len);
-		
+	int i, len = 0;
+
+	for (i = 0; i < HPEE_MEMORY_MAX_ENT; i++) {
+		struct resource *res;
+		u_int8_t c = get_8(buf + len);
+
 		if (NULL != (res = kzalloc_obj(struct resource))) {
 			int result;
-			
+
 			res->name = name;
-			res->start = mem_parent->start + get_24(buf+len+2);
-			res->end = res->start + get_16(buf+len+5)*1024;
+			res->start = mem_parent->start + get_24(buf + len + 2);
+			res->end = res->start + get_16(buf + len + 5) * 1024;
 			res->flags = IORESOURCE_MEM;
 			pr_cont("memory %pR ", res);
 			result = request_resource(mem_parent, res);
 			if (result < 0) {
-				printk(KERN_ERR "EISA Enumerator: failed to claim EISA Bus address space!\n");
+				pr_err("EISA Enumerator: failed to claim EISA Bus address space!\n");
 				return result;
 			}
 		}
-		 	
-		len+=7;      
-	
-		if (!(c & HPEE_MEMORY_MORE)) {
+
+		len += 7;
+
+		if (!(c & HPEE_MEMORY_MORE))
 			break;
-		}
 	}
-	
 	return len;
 }
 
 
 static int configure_irq(const unsigned char *buf)
 {
-	int len;
-	u_int8_t c;
-	int i;
-	
-	len=0;
-	
-	for (i=0;i<HPEE_IRQ_MAX_ENT;i++) {
-		c = get_8(buf+len);
-		
+	int i, len = 0;
+
+	for (i = 0; i < HPEE_IRQ_MAX_ENT; i++) {
+		u_int8_t c = get_8(buf + len);
+
 		pr_cont("IRQ %d ", c & HPEE_IRQ_CHANNEL_MASK);
 		if (c & HPEE_IRQ_TRIG_LEVEL) {
 			eisa_make_irq_level(c & HPEE_IRQ_CHANNEL_MASK);
 		} else {
 			eisa_make_irq_edge(c & HPEE_IRQ_CHANNEL_MASK);
 		}
-		
-		len+=2; 
-		/* hpux seems to allow for
-		 * two bytes of irq data but only defines one of
-		 * them, I think */
-		if  (!(c & HPEE_IRQ_MORE)) {
+
+		len += 2;
+		/*
+		 * HP-UX seems to allow for two bytes of irq data but
+		 * only defines one of them, I think
+		 */
+		if  (!(c & HPEE_IRQ_MORE))
 			break;
-		}
 	}
-	
 	return len;
 }
 
 
 static int configure_dma(const unsigned char *buf)
 {
-	int len;
-	u_int8_t c;
-	int i;
-	
-	len=0;
-	
-	for (i=0;i<HPEE_DMA_MAX_ENT;i++) {
-		c = get_8(buf+len);
+	int i, len = 0;
+
+	for (i = 0; i < HPEE_DMA_MAX_ENT; i++) {
+		u_int8_t c = get_8(buf + len);
 		pr_cont("DMA %d ", c&HPEE_DMA_CHANNEL_MASK);
 		/* fixme: maybe initialize the dma channel withthe timing ? */
-		len+=2;      
-		if (!(c & HPEE_DMA_MORE)) {
+		len += 2;
+		if (!(c & HPEE_DMA_MORE))
 			break;
-		}
 	}
-	
 	return len;
 }
 
 static int configure_port(const unsigned char *buf, struct resource *io_parent,
 		     char *board)
 {
-	int len;
-	u_int8_t c;
-	int i;
-	struct resource *res;
-	int result;
-	
-	len=0;
-	
-	for (i=0;i<HPEE_PORT_MAX_ENT;i++) {
-		c = get_8(buf+len);
-		
+	int i, result, len = 0;
+
+	for (i = 0; i < HPEE_PORT_MAX_ENT; i++) {
+		struct resource *res;
+		u_int8_t c = get_8(buf + len);
+
 		if (NULL != (res = kzalloc_obj(struct resource))) {
 			res->name = board;
-			res->start = get_16(buf+len+1);
-			res->end = get_16(buf+len+1)+(c&HPEE_PORT_SIZE_MASK)+1;
+			res->start = get_16(buf + len + 1);
+			res->end = res->start + (c & HPEE_PORT_SIZE_MASK) + 1;
 			res->flags = IORESOURCE_IO;
 			pr_cont("ioports %pR ", res);
 			result = request_resource(io_parent, res);
 			if (result < 0) {
-				printk(KERN_ERR "EISA Enumerator: failed to claim EISA Bus address space!\n");
+				pr_err("EISA Enumerator: failed to claim EISA Bus address space!\n");
 				return result;
 			}
 		}
 
-		len+=3;      
-		if (!(c & HPEE_PORT_MORE)) {
+		len += 3;
+		if (!(c & HPEE_PORT_MORE))
 			break;
-		}
 	}
-	
+
 	return len;
 }
 
 
-/* byte 1 and 2 is the port number to write
- * and at byte 3 the value to write starts.
- * I assume that there are and- and or- masks
- * here when HPEE_PORT_INIT_MASK is set but I have 
- * not yet encountered this. */
+/*
+ * Byte 1 and 2 is the port number to write and at byte 3 the value to write
+ * starts. I assume that there are and- and or- masks here when
+ * HPEE_PORT_INIT_MASK is set but I have not yet encountered this.
+ */
 static int configure_port_init(const unsigned char *buf)
 {
-	int len=0;
-	u_int8_t c;
-	
-	while (len<HPEE_PORT_INIT_MAX_LEN) {
-		int s=0;
-		c = get_8(buf+len);
-		
-		switch (c & HPEE_PORT_INIT_WIDTH_MASK)  {
+	int len = 0;
+
+	while (len < HPEE_PORT_INIT_MAX_LEN) {
+		int s = 0;
+		u_int8_t c = get_8(buf + len);
+
+		switch (c & HPEE_PORT_INIT_WIDTH_MASK)	{
 		 case HPEE_PORT_INIT_WIDTH_BYTE:
-			s=1;
+			s = 1;
 			if (c & HPEE_PORT_INIT_MASK) {
-				printk(KERN_WARNING "port_init: unverified mask attribute\n");
-				outb((inb(get_16(buf+len+1) & 
-					  get_8(buf+len+3)) | 
-				      get_8(buf+len+4)), get_16(buf+len+1));
-				      
+				pr_warn("port_init: unverified mask attribute\n");
+				outb((inb(get_16(buf + len + 1) &
+					  get_8(buf + len + 3)) |
+				      get_8(buf + len + 4)),
+					get_16(buf + len + 1));
 			} else {
-				outb(get_8(buf+len+3), get_16(buf+len+1));
-				      
+				outb(get_8(buf + len + 3),
+					get_16(buf + len + 1));
 			}
 			break;
 		 case HPEE_PORT_INIT_WIDTH_WORD:
-			s=2;
+			s = 2;
 			if (c & HPEE_PORT_INIT_MASK) {
- 				printk(KERN_WARNING "port_init: unverified mask attribute\n");
-				       outw((inw(get_16(buf+len+1)) &
-					     get_16(buf+len+3)) |
-					    get_16(buf+len+5), 
-					    get_16(buf+len+1));
+				pr_warn("port_init: unverified mask attribute\n");
+				       outw((inw(get_16(buf + len + 1)) &
+					     get_16(buf + len + 3)) |
+					    get_16(buf + len + 5),
+					    get_16(buf + len + 1));
 			} else {
-				outw(cpu_to_le16(get_16(buf+len+3)), get_16(buf+len+1));
+				outw(cpu_to_le16(get_16(buf + len + 3)),
+					get_16(buf + len + 1));
 			}
 			break;
 		 case HPEE_PORT_INIT_WIDTH_DWORD:
-			s=4;
+			s = 4;
 			if (c & HPEE_PORT_INIT_MASK) {
- 				printk(KERN_WARNING "port_init: unverified mask attribute\n");
-				outl((inl(get_16(buf+len+1) &
-					  get_32(buf+len+3)) |
-				      get_32(buf+len+7)), get_16(buf+len+1));
+				pr_warn("port_init: unverified mask attribute\n");
+				outl((inl(get_16(buf + len + 1) &
+					  get_32(buf + len + 3)) |
+				      get_32(buf + len + 7)), get_16(buf + len + 1));
 			} else {
-				outl(cpu_to_le32(get_32(buf+len+3)), get_16(buf+len+1));
+				outl(cpu_to_le32(get_32(buf + len + 3)),
+				     get_16(buf + len + 1));
 			}
 
 			break;
 		 default:
-			printk(KERN_ERR "Invalid port init word %02x\n", c);
+			pr_warn("Invalid port init word %02x\n", c);
 			return 0;
 		}
-		
-		if (c & HPEE_PORT_INIT_MASK) {   
-			s*=2;
-		}
-		
-		len+=s+3;
-		if (!(c & HPEE_PORT_INIT_MORE)) {
+
+		if (c & HPEE_PORT_INIT_MASK)
+			s *= 2;
+
+		len += s + 3;
+		if (!(c & HPEE_PORT_INIT_MORE))
 			break;
-		}
 	}
-	
+
 	return len;
 }
 
 static int configure_choise(const unsigned char *buf, u_int8_t *info)
 {
 	int len;
-	
-	/* theis record contain the value of the functions
-	 * configuration choises and an info byte which 
-	 * describes which other records to expect in this 
-	 * function */
+
+	/*
+	 * This record contain the value of the functions configuration
+	 * chooses and an info byte which describes which other records to
+	 * expect in this function.
+	 */
 	len = get_8(buf);
-	*info=get_8(buf+len+1);
-	 
-	return len+2;
+	*info = get_8(buf + len + 1);
+
+	return len + 2;
 }
 
-static int configure_type_string(const unsigned char *buf) 
+static int configure_type_string(const unsigned char *buf)
 {
 	int len;
-	
+
 	/* just skip past the type field */
 	len = get_8(buf);
 	if (len > 80) {
-		printk(KERN_ERR "eisa_enumerator: type info field too long (%d, max is 80)\n", len);
+		pr_err("eisa_enumerator: type info field too long (%d, max is 80)\n", len);
 	}
-	
-	return 1+len;
+
+	return 1 + len;
 }
 
-static int configure_function(const unsigned char *buf, int *more) 
+static int configure_function(const unsigned char *buf, int *more)
 {
 	/* the init field seems to be a two-byte field
 	 * which is non-zero if there are an other function following
-	 * I think it is the length of the function def 
+	 * I think it is the length of the function def
 	 */
 	*more = get_16(buf);
-	
+
 	return 2;
 }
 
 static int parse_slot_config(int slot,
 			     const unsigned char *buf,
-			     struct eeprom_eisa_slot_info *es, 
+			     unsigned int buflen,
+			     struct eeprom_eisa_slot_info *es,
 			     struct resource *io_parent,
 			     struct resource *mem_parent)
 {
-	int res=0;
+	int res = 0;
 	int function_len;
-	unsigned int pos=0;
+	unsigned int pos = 0;
 	unsigned int maxlen;
-	int num_func=0;
+	int num_func = 0;
 	u_int8_t flags;
 	int p0;
-	
+
 	char *board;
-	int id_string_used=0;
-	
+	int id_string_used = 0;
+
 	if (NULL == (board = kmalloc(8, GFP_KERNEL))) {
 		return -1;
 	}
 	print_eisa_id(board, es->eisa_slot_id);
-	printk(KERN_INFO "EISA slot %d: %s %s ", 
+	pr_info("EISA slot %d: %s %s ",
 	       slot, board, es->flags&HPEE_FLAG_BOARD_IS_ISA ? "ISA" : "EISA");
-	
-	maxlen = es->config_data_length < HPEE_MAX_LENGTH ?
-			 es->config_data_length : HPEE_MAX_LENGTH;
+
+	/* never parse beyond the data that is actually in the buffer */
+	maxlen = min_t(unsigned int, es->config_data_length, buflen);
 	while ((pos < maxlen) && (num_func <= es->num_functions)) {
-		pos+=configure_function(buf+pos, &function_len); 
-		
-		if (!function_len) {
+		pos += configure_function(buf + pos, &function_len);
+
+		if (!function_len)
 			break;
-		}
+
 		num_func++;
 		p0 = pos;
 		pos += configure_choise(buf+pos, &flags);
@@ -352,51 +310,49 @@ static int parse_slot_config(int slot,
 		}
 		if (flags & HPEE_FUNCTION_INFO_CFG_FREE_FORM) {
 			/* I have no idea how to handle this */
-			printk("function %d have free-form configuration, skipping ",
+			pr_err("function %d have free-form configuration, skipping ",
 				num_func);
 			pos = p0 + function_len;
 			continue;
 		}
 
-		/* the ordering of the sections need
-		 * more investigation.
-		 * Currently I think that memory comaed before IRQ
-		 * I assume the order is LSB to MSB in the 
-		 * info flags 
-		 * eg type, memory, irq, dma, port, HPEE_PORT_init 
+		/* the ordering of the sections need more investigation.
+		 * Currently I think that memory command before IRQ
+		 * I assume the order is LSB to MSB in the info flags
+		 * eg type, memory, irq, dma, port, HPEE_PORT_init
 		 */
 
 		if (flags & HPEE_FUNCTION_INFO_HAVE_TYPE) {
-			pos += configure_type_string(buf+pos);
+			pos += configure_type_string(buf + pos);
 		}
-		
+
 		if (flags & HPEE_FUNCTION_INFO_HAVE_MEMORY) {
-			id_string_used=1;
-			pos += configure_memory(buf+pos, mem_parent, board);
-		} 
-		
-		if (flags & HPEE_FUNCTION_INFO_HAVE_IRQ) {
-			pos += configure_irq(buf+pos);
-		} 
-		
-		if (flags & HPEE_FUNCTION_INFO_HAVE_DMA) {
-			pos += configure_dma(buf+pos);
-		} 
-		
-		if (flags & HPEE_FUNCTION_INFO_HAVE_PORT) {
-			id_string_used=1;
-			pos += configure_port(buf+pos, io_parent, board);
-		} 
-		
-		if (flags &  HPEE_FUNCTION_INFO_HAVE_PORT_INIT) {
-			pos += configure_port_init(buf+pos);
+			id_string_used = 1;
+			pos += configure_memory(buf + pos, mem_parent, board);
 		}
-		
+
+		if (flags & HPEE_FUNCTION_INFO_HAVE_IRQ) {
+			pos += configure_irq(buf + pos);
+		}
+
+		if (flags & HPEE_FUNCTION_INFO_HAVE_DMA) {
+			pos += configure_dma(buf + pos);
+		}
+
+		if (flags & HPEE_FUNCTION_INFO_HAVE_PORT) {
+			id_string_used = 1;
+			pos += configure_port(buf + pos, io_parent, board);
+		}
+
+		if (flags &  HPEE_FUNCTION_INFO_HAVE_PORT_INIT) {
+			pos += configure_port_init(buf + pos);
+		}
+
 		if (p0 + function_len < pos) {
-			printk(KERN_ERR "eisa_enumerator: function %d length mismatch "
+			pr_err("eisa_enumerator: function %d length mismatch "
 			       "got %d, expected %d\n",
-			       num_func, pos-p0, function_len);
-			res=-1;
+			       num_func, pos - p0, function_len);
+			res = -1;
 			break;
 		}
 		pos = p0 + function_len;
@@ -405,112 +361,107 @@ static int parse_slot_config(int slot,
 	if (!id_string_used) {
 		kfree(board);
 	}
-	
+
 	if (pos != es->config_data_length) {
-		printk(KERN_ERR "eisa_enumerator: config data length mismatch got %d, expected %d\n",
+		pr_err("eisa_enumerator: config data length mismatch got %d, expected %d\n",
 			pos, es->config_data_length);
-		res=-1;
+		res = -1;
 	}
-	
+
 	if (num_func != es->num_functions) {
-		printk(KERN_ERR "eisa_enumerator: number of functions mismatch got %d, expected %d\n",
+		pr_err("eisa_enumerator: number of functions mismatch got %d, expected %d\n",
 			num_func, es->num_functions);
-		res=-2;
+		res = -2;
 	}
-	
+
 	return res;
-	
 }
 
 static int init_slot(int slot, struct eeprom_eisa_slot_info *es)
 {
 	unsigned int id;
-	
-	char id_string[8];
-	
-	if (!(es->slot_info&HPEE_SLOT_INFO_NO_READID)) {
+	char id_string[8], id_string2[8];
+
+	if (!(es->slot_info & HPEE_SLOT_INFO_NO_READID)) {
 		/* try to read the id of the board in the slot */
-		id = le32_to_cpu(inl(SLOT2PORT(slot)+EPI));
-		
+		id = le32_to_cpu(inl(SLOT2PORT(slot) + EPI));
+
 		if (0xffffffff == id) {
 			/* Maybe we didn't expect a card to be here... */
 			if (es->eisa_slot_id == 0xffffffff)
 				return -1;
-			
-			/* this board is not here or it does not 
-			 * support readid 
-			 */
-			printk(KERN_ERR "EISA slot %d a configured board was not detected (", 
-			       slot);
-			
+
+			/* board is not here or it does not support readid */
 			print_eisa_id(id_string, es->eisa_slot_id);
-			printk(" expected %s)\n", id_string);
-		
-			return -1;	
+			pr_err("EISA slot %d a configured board was not detected (expected %s)\n",
+			       slot, id_string);
+			return -1;
 
 		}
 		if (es->eisa_slot_id != id) {
 			print_eisa_id(id_string, id);
-			printk(KERN_ERR "EISA slot %d id mismatch: got %s",
-			       slot, id_string);
-			
-			print_eisa_id(id_string, es->eisa_slot_id);
-			printk(" expected %s\n", id_string);
-		
-			return -1;	
-			
+			print_eisa_id(id_string2, es->eisa_slot_id);
+			pr_err("EISA slot %d id mismatch: got %s expected %s\n",
+			       slot, id_string, id_string2);
+			return -1;
 		}
 	}
-	
-	/* now: we need to enable the board if 
+
+	/* now: we need to enable the board if
 	 * it supports enabling and run through
 	 * the port init sction if present
 	 * and finally record any interrupt polarity
 	 */
 	if (es->slot_features & HPEE_SLOT_FEATURES_ENABLE) {
 		/* enable board */
-		outb(0x01| inb(SLOT2PORT(slot)+EPI+4),
-		     SLOT2PORT(slot)+EPI+4);
+		outb(0x01 | inb(SLOT2PORT(slot) + EPI + 4),
+		     SLOT2PORT(slot) + EPI + 4);
 	}
-	
+
 	return 0;
 }
 
 
 int eisa_enumerator(unsigned long eeprom_addr,
-		    struct resource *io_parent, struct resource *mem_parent) 
+		    struct resource *io_parent, struct resource *mem_parent)
 {
 	int i;
 	struct eeprom_header *eh;
 	static char eeprom_buf[HPEE_MAX_LENGTH];
-	
-	for (i=0; i < HPEE_MAX_LENGTH; i++) {
-		eeprom_buf[i] = gsc_readb(eeprom_addr+i);
-	}
-	
-	printk(KERN_INFO "Enumerating EISA bus\n");
-		    	
+
+	for (i = 0; i < HPEE_MAX_LENGTH; i++)
+		eeprom_buf[i] = gsc_readb(eeprom_addr + i);
+
+	pr_info("Enumerating EISA bus\n");
+
 	eh = (struct eeprom_header*)(eeprom_buf);
-	for (i=0;i<eh->num_slots;i++) {
+	/*
+	 * The EEPROM contents are not to be trusted: clamp the number of
+	 * slots so that all slot records fit into eeprom_buf.
+	 */
+	eh->num_slots = min_t(u8, eh->num_slots,
+				(HPEE_MAX_LENGTH - sizeof(*eh)) /
+				sizeof(struct eeprom_eisa_slot_info));
+	for (i = 0; i < eh->num_slots; i++) {
 		struct eeprom_eisa_slot_info *es;
-		
+
 		es = (struct eeprom_eisa_slot_info*)
 			(&eeprom_buf[HPEE_SLOT_INFO(i)]);
-	        
-		if (-1==init_slot(i+1, es)) {
+
+		if (-1 == init_slot(i + 1, es))
 			continue;
-		}
-		
+
 		if (es->config_data_offset < HPEE_MAX_LENGTH) {
-			if (parse_slot_config(i+1, &eeprom_buf[es->config_data_offset],
-					      es, io_parent, mem_parent)) {
+			if (parse_slot_config(i + 1, &eeprom_buf[es->config_data_offset],
+						HPEE_MAX_LENGTH - es->config_data_offset,
+						es, io_parent, mem_parent)) {
 				return -1;
 			}
 		} else {
-			printk (KERN_WARNING "EISA EEPROM offset 0x%x out of range\n",es->config_data_offset);
+			pr_err("EISA EEPROM offset 0x%x out of range\n",
+				es->config_data_offset);
 			return -1;
 		}
 	}
 	return eh->num_slots;
 }
-
diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c
index 16f4496..6b567a7 100644
--- a/drivers/parisc/pdc_stable.c
+++ b/drivers/parisc/pdc_stable.c
@@ -586,7 +586,7 @@ static ssize_t pdcs_autosearch_read(struct kobject *kobj,
  * @attr: The kobject attributes.
  * @buf: The output buffer to write to.
  *
- * The value of the timer field correponds to a number of seconds in powers of 2.
+ * The value of the timer field corresponds to a number of seconds in powers of 2.
  */
 static ssize_t pdcs_timer_read(struct kobject *kobj,
 			       struct kobj_attribute *attr, char *buf)
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c
index e0a148a..ecc7bb7 100644
--- a/drivers/parisc/sba_iommu.c
+++ b/drivers/parisc/sba_iommu.c
@@ -599,7 +599,7 @@ sba_io_pdir_entry(__le64 *pdir_ptr, space_t sid, phys_addr_t pba,
  * corresponding IO TLB entry. The Ike PCOM (Purge Command Register)
  * is to purge stale entries in the IO TLB when unmapping entries.
  *
- * The PCOM register supports purging of multiple pages, with a minium
+ * The PCOM register supports purging of multiple pages, with a minimum
  * of 1 page and a maximum of 2GB. Hardware requires the address be
  * aligned to the size of the range being purged. The size of the range
  * must be a power of 2. The "Cool perf optimization" in the
diff --git a/drivers/parport/parport_gsc.c b/drivers/parport/parport_gsc.c
index e5e8054..0a9f7fd 100644
--- a/drivers/parport/parport_gsc.c
+++ b/drivers/parport/parport_gsc.c
@@ -348,7 +348,7 @@ static int __init parport_init_chip(struct parisc_device *dev)
 	 */
 	if (boot_cpu_data.cpu_type > pcxt && !pdc_add_valid(port+4)) {
 
-		/* Initialize bidirectional-mode (0x10) & data-tranfer-mode #1 (0x20) */
+		/* Initialize bidirectional-mode (0x10) & data-transfer-mode #1 (0x20) */
 		pr_info("%s: initialize bidirectional-mode\n", __func__);
 		parport_writeb ( (0x10 + 0x20), port + 4);