aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/sungem.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c
index 3f67a42e8503..de399563a9db 100644
--- a/drivers/net/sungem.c
+++ b/drivers/net/sungem.c
@@ -2817,7 +2817,7 @@ static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2817 2817
2818#if (!defined(__sparc__) && !defined(CONFIG_PPC_PMAC)) 2818#if (!defined(__sparc__) && !defined(CONFIG_PPC_PMAC))
2819/* Fetch MAC address from vital product data of PCI ROM. */ 2819/* Fetch MAC address from vital product data of PCI ROM. */
2820static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char *dev_addr) 2820static int find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char *dev_addr)
2821{ 2821{
2822 int this_offset; 2822 int this_offset;
2823 2823
@@ -2838,35 +2838,27 @@ static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char
2838 2838
2839 for (i = 0; i < 6; i++) 2839 for (i = 0; i < 6; i++)
2840 dev_addr[i] = readb(p + i); 2840 dev_addr[i] = readb(p + i);
2841 break; 2841 return 1;
2842 } 2842 }
2843 return 0;
2843} 2844}
2844 2845
2845static void get_gem_mac_nonobp(struct pci_dev *pdev, unsigned char *dev_addr) 2846static void get_gem_mac_nonobp(struct pci_dev *pdev, unsigned char *dev_addr)
2846{ 2847{
2847 u32 rom_reg_orig; 2848 size_t size;
2848 void __iomem *p; 2849 void __iomem *p = pci_map_rom(pdev, &size);
2849
2850 if (pdev->resource[PCI_ROM_RESOURCE].parent == NULL) {
2851 if (pci_assign_resource(pdev, PCI_ROM_RESOURCE) < 0)
2852 goto use_random;
2853 }
2854 2850
2855 pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_reg_orig); 2851 if (p) {
2856 pci_write_config_dword(pdev, pdev->rom_base_reg, 2852 int found;
2857 rom_reg_orig | PCI_ROM_ADDRESS_ENABLE);
2858 2853
2859 p = ioremap(pci_resource_start(pdev, PCI_ROM_RESOURCE), (64 * 1024)); 2854 found = readb(p) == 0x55 &&
2860 if (p != NULL && readb(p) == 0x55 && readb(p + 1) == 0xaa) 2855 readb(p + 1) == 0xaa &&
2861 find_eth_addr_in_vpd(p, (64 * 1024), dev_addr); 2856 find_eth_addr_in_vpd(p, (64 * 1024), dev_addr);
2862 2857 pci_unmap_rom(pdev, p);
2863 if (p != NULL) 2858 if (found)
2864 iounmap(p); 2859 return;
2865 2860 }
2866 pci_write_config_dword(pdev, pdev->rom_base_reg, rom_reg_orig);
2867 return;
2868 2861
2869use_random:
2870 /* Sun MAC prefix then 3 random bytes. */ 2862 /* Sun MAC prefix then 3 random bytes. */
2871 dev_addr[0] = 0x08; 2863 dev_addr[0] = 0x08;
2872 dev_addr[1] = 0x00; 2864 dev_addr[1] = 0x00;