--- /dev/null
+From stable-bounces@linux.kernel.org Sun Sep 11 14:09:08 2005
+Date: Sun, 11 Sep 2005 14:08:59 -0700 (PDT)
+From: Linus Torvalds <torvalds@osdl.org>
+To: stable@kernel.org
+Cc:
+Subject: Sun GEM ethernet: enable and map PCI ROM properly
+
+From: Linus Torvalds <torvalds@g5.osdl.org>
+
+This same patch was reported to fix the MAC address detection on sunhme
+(next patch). Most people seem to be running this on Sparcs or PPC
+machines, where we get the MAC address from their respective firmware
+rather than from the (previously broken) ROM mapping routines.
+
+Signed-off-by: Linus Torvalds <torvalds@osdl.org>
+Signed-off-by: Chris Wright <chrisw@osdl.org>
+ drivers/net/sungem.c | 36 ++++++++++++++----------------------
+ 1 files changed, 14 insertions(+), 22 deletions(-)
+
+Index: linux-2.6.13.y/drivers/net/sungem.c
+===================================================================
+--- linux-2.6.13.y.orig/drivers/net/sungem.c
++++ linux-2.6.13.y/drivers/net/sungem.c
+@@ -2816,7 +2816,7 @@ static int gem_ioctl(struct net_device *
+
+ #if (!defined(__sparc__) && !defined(CONFIG_PPC_PMAC))
+ /* Fetch MAC address from vital product data of PCI ROM. */
+-static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char *dev_addr)
++static int find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char *dev_addr)
+ {
+ int this_offset;
+
+@@ -2837,35 +2837,27 @@ static void find_eth_addr_in_vpd(void __
+
+ for (i = 0; i < 6; i++)
+ dev_addr[i] = readb(p + i);
+- break;
++ return 1;
+ }
++ return 0;
+ }
+
+ static void get_gem_mac_nonobp(struct pci_dev *pdev, unsigned char *dev_addr)
+ {
+- u32 rom_reg_orig;
+- void __iomem *p;
+-
+- if (pdev->resource[PCI_ROM_RESOURCE].parent == NULL) {
+- if (pci_assign_resource(pdev, PCI_ROM_RESOURCE) < 0)
+- goto use_random;
+- }
+-
+- pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_reg_orig);
+- pci_write_config_dword(pdev, pdev->rom_base_reg,
+- rom_reg_orig | PCI_ROM_ADDRESS_ENABLE);
++ size_t size;
++ void __iomem *p = pci_map_rom(pdev, &size);
+
+- p = ioremap(pci_resource_start(pdev, PCI_ROM_RESOURCE), (64 * 1024));
+- if (p != NULL && readb(p) == 0x55 && readb(p + 1) == 0xaa)
+- find_eth_addr_in_vpd(p, (64 * 1024), dev_addr);
++ if (p) {
++ int found;
+
+- if (p != NULL)
+- iounmap(p);
+-
+- pci_write_config_dword(pdev, pdev->rom_base_reg, rom_reg_orig);
+- return;
++ found = readb(p) == 0x55 &&
++ readb(p + 1) == 0xaa &&
++ find_eth_addr_in_vpd(p, (64 * 1024), dev_addr);
++ pci_unmap_rom(pdev, p);
++ if (found)
++ return;
++ }
+
+-use_random:
+ /* Sun MAC prefix then 3 random bytes. */
+ dev_addr[0] = 0x08;
+ dev_addr[1] = 0x00;