]> err.no Git - linux-2.6/blobdiff - drivers/net/8139too.c
iwlwifi: grap nic access before accessing periphery registers
[linux-2.6] / drivers / net / 8139too.c
index f172b5d822d7b4a2f0f81affffb0e96b9751b1e8..8a5b0d293f7548dbcfaa0e6b9267c21a1d0cf4dc 100644 (file)
@@ -788,6 +788,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev,
        DPRINTK("PIO region size == 0x%02X\n", pio_len);
        DPRINTK("MMIO region size == 0x%02lX\n", mmio_len);
 
+retry:
        if (use_io) {
                /* make sure PCI base addr 0 is PIO */
                if (!(pio_flags & IORESOURCE_IO)) {
@@ -836,9 +837,10 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev,
                /* ioremap MMIO region */
                ioaddr = pci_iomap(pdev, 1, 0);
                if (ioaddr == NULL) {
-                       dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
-                       rc = -EIO;
-                       goto err_out;
+                       dev_err(&pdev->dev, "cannot remap MMIO, trying PIO\n");
+                       pci_release_regions(pdev);
+                       use_io = 1;
+                       goto retry;
                }
                dev->base_addr = (long) ioaddr;
                tp->regs_len = mmio_len;
@@ -949,6 +951,14 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev,
                           "Use the \"8139cp\" driver for improved performance and stability.\n");
        }
 
+       if (pdev->vendor == PCI_VENDOR_ID_REALTEK &&
+           pdev->device == PCI_DEVICE_ID_REALTEK_8139 &&
+           pdev->subsystem_vendor == PCI_VENDOR_ID_ATHEROS &&
+           pdev->subsystem_device == PCI_DEVICE_ID_REALTEK_8139) {
+               printk(KERN_INFO "8139too: OQO Model 2 detected. Forcing PIO\n");
+               use_io = 1;
+       }
+
        i = rtl8139_init_board (pdev, &dev);
        if (i < 0)
                return i;