mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	add a better pci fix for rb532
SVN-Revision: 5861
This commit is contained in:
		
							parent
							
								
									6a5a5e896b
								
							
						
					
					
						commit
						e8258da964
					
				@ -130,13 +130,14 @@ diff -urN linux.old/arch/mips/pci/Makefile linux.dev/arch/mips/pci/Makefile
 | 
			
		||||
diff -urN linux.old/arch/mips/pci/ops-rc32434.c linux.dev/arch/mips/pci/ops-rc32434.c
 | 
			
		||||
--- linux.old/arch/mips/pci/ops-rc32434.c	1970-01-01 01:00:00.000000000 +0100
 | 
			
		||||
+++ linux.dev/arch/mips/pci/ops-rc32434.c	2006-12-14 04:09:50.000000000 +0100
 | 
			
		||||
@@ -0,0 +1,195 @@
 | 
			
		||||
@@ -0,0 +1,218 @@
 | 
			
		||||
+/**************************************************************************
 | 
			
		||||
+ *
 | 
			
		||||
+ *  BRIEF MODULE DESCRIPTION
 | 
			
		||||
+ *     pci_ops for IDT EB434 board
 | 
			
		||||
+ *
 | 
			
		||||
+ *  Copyright 2004 IDT Inc. (rischelp@idt.com)
 | 
			
		||||
+ *  Copyright 2006 Felix Fietkau <nbd@openwrt.org>
 | 
			
		||||
+ *         
 | 
			
		||||
+ *  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
 | 
			
		||||
@ -242,8 +243,30 @@ diff -urN linux.old/arch/mips/pci/ops-rc32434.c linux.dev/arch/mips/pci/ops-rc32
 | 
			
		||||
+                             int where, u32 * val)
 | 
			
		||||
+{
 | 
			
		||||
+	int ret;
 | 
			
		||||
+	int delay = 1;
 | 
			
		||||
+
 | 
			
		||||
+	if (bus->number == 0 && (devfn >> 3) > 21)
 | 
			
		||||
+		return 0;
 | 
			
		||||
+
 | 
			
		||||
+retry:
 | 
			
		||||
+	ret = config_access(PCI_ACCESS_READ, bus, devfn, where, val);
 | 
			
		||||
+	
 | 
			
		||||
+	/* PCI scan: check for invalid values, device may not have
 | 
			
		||||
+	 * finished initializing */
 | 
			
		||||
+
 | 
			
		||||
+	if (where == PCI_VENDOR_ID) {
 | 
			
		||||
+		if (ret == 0xffffffff || ret == 0x00000000 ||
 | 
			
		||||
+			ret == 0x0000ffff || ret == 0xffff0000) {
 | 
			
		||||
+
 | 
			
		||||
+			if (delay > 4)
 | 
			
		||||
+				return 0;
 | 
			
		||||
+
 | 
			
		||||
+			delay *= 2;
 | 
			
		||||
+			msleep(delay);
 | 
			
		||||
+			goto retry;
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+	
 | 
			
		||||
+	return ret;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 | 
			
		||||
@ -1,46 +0,0 @@
 | 
			
		||||
diff -urN linux.old/drivers/pci/probe.c linux.dev/drivers/pci/probe.c
 | 
			
		||||
--- linux.old/drivers/pci/probe.c	2006-06-08 20:21:20.000000000 +0200
 | 
			
		||||
+++ linux.dev/drivers/pci/probe.c	2006-06-08 20:19:40.000000000 +0200
 | 
			
		||||
@@ -760,15 +760,22 @@
 | 
			
		||||
 	u32 l;
 | 
			
		||||
 	u8 hdr_type;
 | 
			
		||||
 	int delay = 1;
 | 
			
		||||
-
 | 
			
		||||
-	if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
 | 
			
		||||
-		return NULL;
 | 
			
		||||
-
 | 
			
		||||
-	/* some broken boards return 0 or ~0 if a slot is empty: */
 | 
			
		||||
-	if (l == 0xffffffff || l == 0x00000000 ||
 | 
			
		||||
-	    l == 0x0000ffff || l == 0xffff0000)
 | 
			
		||||
-		return NULL;
 | 
			
		||||
-
 | 
			
		||||
+	do {
 | 
			
		||||
+		if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
 | 
			
		||||
+			return NULL;
 | 
			
		||||
+		/* some broken boards return 0 or ~0 if a slot is empty: */
 | 
			
		||||
+		if (l == 0xffffffff || l == 0x00000000 ||
 | 
			
		||||
+		    l == 0x0000ffff || l == 0xffff0000){
 | 
			
		||||
+			if (delay > 4)
 | 
			
		||||
+				return NULL;
 | 
			
		||||
+			/* But that could also be the previous dev not settled */
 | 
			
		||||
+			pr_debug("PCI: retrying scan at 0x%x, because config is 0x%x\n",devfn,l);
 | 
			
		||||
+			msleep(delay);
 | 
			
		||||
+			delay *=2;
 | 
			
		||||
+			l=0;
 | 
			
		||||
+		}
 | 
			
		||||
+	}while (l==0);
 | 
			
		||||
+	
 | 
			
		||||
 	/* Configuration request Retry Status */
 | 
			
		||||
 	while (l == 0xffff0001) {
 | 
			
		||||
 		msleep(delay);
 | 
			
		||||
@@ -903,7 +910,10 @@
 | 
			
		||||
 
 | 
			
		||||
 	/* Go find them, Rover! */
 | 
			
		||||
 	for (devfn = 0; devfn < 0x100; devfn += 8)
 | 
			
		||||
+	    {
 | 
			
		||||
+	    if (bus->number == 0 && (devfn >> 3) > 21) break;
 | 
			
		||||
 		pci_scan_slot(bus, devfn);
 | 
			
		||||
+	    }
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * After performing arch-dependent fixup of the bus, look behind
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user