Skip to content

Commit

Permalink
Sun GEM ethernet: enable and map PCI ROM properly
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Linus Torvalds committed Sep 11, 2005
1 parent 9ec4ff4 commit 4120b02
Showing 1 changed file with 14 additions and 22 deletions.
36 changes: 14 additions & 22 deletions drivers/net/sungem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2817,7 +2817,7 @@ static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)

#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;

Expand All @@ -2838,35 +2838,27 @@ static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char

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;
}
size_t size;
void __iomem *p = pci_map_rom(pdev, &size);

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);
if (p) {
int found;

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 != 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;
Expand Down

0 comments on commit 4120b02

Please sign in to comment.