Re: [PATCH 3/4] Make Intel e1000 driver legacy I/O port free

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Auke Kok wrote:
Kenji Kaneshige wrote:

This patch makes Intel e1000 driver legacy I/O port free.

Signed-off-by: Kenji Kaneshige <[email protected]>


(adding netdev and the other e1000 maintainers to cc:)

without sending this to any of the listed e1000 maintainers???? *and* not even including netdev???


I'm sorry about that.

I'm going to take a look at it first, and have some other colleagues look at this and the impact, which is unclear to me at the moment.

Thank you for reviewing.
What this patch try to do is not to request/enable I/O port regions
if the device can be handled without using I/O port so that the device
can work even if I/O port resource is not assigned to it on the large
servers. Please see the "[PATCH 2/4] Update Document/pci.txt" about
details.

Thanks,
Kenji Kaneshige



Please don't commit  this like this.

Auke



---
 drivers/net/e1000/e1000.h      |    6 +
drivers/net/e1000/e1000_main.c | 130 ++++++++++++++++++++++-------------------
 2 files changed, 75 insertions(+), 61 deletions(-)

Index: linux-2.6.17-rc6/drivers/net/e1000/e1000.h
===================================================================
--- linux-2.6.17-rc6.orig/drivers/net/e1000/e1000.h 2006-06-06 21:39:11.000000000 +0900 +++ linux-2.6.17-rc6/drivers/net/e1000/e1000.h 2006-06-06 21:56:41.000000000 +0900
@@ -77,8 +77,9 @@
 #define BAR_1        1
 #define BAR_5        5
-#define INTEL_E1000_ETHERNET_DEVICE(device_id) {\
-    PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
+#define E1000_NO_IOPORT    (1 << 0)
+#define INTEL_E1000_ETHERNET_DEVICE(device_id, flags) {\
+    PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id), .driver_data = flags}
struct e1000_adapter; @@ -338,6 +339,7 @@
 #ifdef NETIF_F_TSO
     boolean_t tso_force;
 #endif
+    int bars;    /* BARs to be enabled */
 };
Index: linux-2.6.17-rc6/drivers/net/e1000/e1000_main.c
===================================================================
--- linux-2.6.17-rc6.orig/drivers/net/e1000/e1000_main.c 2006-06-06 21:39:11.000000000 +0900 +++ linux-2.6.17-rc6/drivers/net/e1000/e1000_main.c 2006-06-06 21:56:41.000000000 +0900
@@ -86,54 +86,54 @@
  *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
  */
 static struct pci_device_id e1000_pci_tbl[] = {
-    INTEL_E1000_ETHERNET_DEVICE(0x1000),
-    INTEL_E1000_ETHERNET_DEVICE(0x1001),
-    INTEL_E1000_ETHERNET_DEVICE(0x1004),
-    INTEL_E1000_ETHERNET_DEVICE(0x1008),
-    INTEL_E1000_ETHERNET_DEVICE(0x1009),
-    INTEL_E1000_ETHERNET_DEVICE(0x100C),
-    INTEL_E1000_ETHERNET_DEVICE(0x100D),
-    INTEL_E1000_ETHERNET_DEVICE(0x100E),
-    INTEL_E1000_ETHERNET_DEVICE(0x100F),
-    INTEL_E1000_ETHERNET_DEVICE(0x1010),
-    INTEL_E1000_ETHERNET_DEVICE(0x1011),
-    INTEL_E1000_ETHERNET_DEVICE(0x1012),
-    INTEL_E1000_ETHERNET_DEVICE(0x1013),
-    INTEL_E1000_ETHERNET_DEVICE(0x1014),
-    INTEL_E1000_ETHERNET_DEVICE(0x1015),
-    INTEL_E1000_ETHERNET_DEVICE(0x1016),
-    INTEL_E1000_ETHERNET_DEVICE(0x1017),
-    INTEL_E1000_ETHERNET_DEVICE(0x1018),
-    INTEL_E1000_ETHERNET_DEVICE(0x1019),
-    INTEL_E1000_ETHERNET_DEVICE(0x101A),
-    INTEL_E1000_ETHERNET_DEVICE(0x101D),
-    INTEL_E1000_ETHERNET_DEVICE(0x101E),
-    INTEL_E1000_ETHERNET_DEVICE(0x1026),
-    INTEL_E1000_ETHERNET_DEVICE(0x1027),
-    INTEL_E1000_ETHERNET_DEVICE(0x1028),
-    INTEL_E1000_ETHERNET_DEVICE(0x105E),
-    INTEL_E1000_ETHERNET_DEVICE(0x105F),
-    INTEL_E1000_ETHERNET_DEVICE(0x1060),
-    INTEL_E1000_ETHERNET_DEVICE(0x1075),
-    INTEL_E1000_ETHERNET_DEVICE(0x1076),
-    INTEL_E1000_ETHERNET_DEVICE(0x1077),
-    INTEL_E1000_ETHERNET_DEVICE(0x1078),
-    INTEL_E1000_ETHERNET_DEVICE(0x1079),
-    INTEL_E1000_ETHERNET_DEVICE(0x107A),
-    INTEL_E1000_ETHERNET_DEVICE(0x107B),
-    INTEL_E1000_ETHERNET_DEVICE(0x107C),
-    INTEL_E1000_ETHERNET_DEVICE(0x107D),
-    INTEL_E1000_ETHERNET_DEVICE(0x107E),
-    INTEL_E1000_ETHERNET_DEVICE(0x107F),
-    INTEL_E1000_ETHERNET_DEVICE(0x108A),
-    INTEL_E1000_ETHERNET_DEVICE(0x108B),
-    INTEL_E1000_ETHERNET_DEVICE(0x108C),
-    INTEL_E1000_ETHERNET_DEVICE(0x1096),
-    INTEL_E1000_ETHERNET_DEVICE(0x1098),
-    INTEL_E1000_ETHERNET_DEVICE(0x1099),
-    INTEL_E1000_ETHERNET_DEVICE(0x109A),
-    INTEL_E1000_ETHERNET_DEVICE(0x10B5),
-    INTEL_E1000_ETHERNET_DEVICE(0x10B9),
+    INTEL_E1000_ETHERNET_DEVICE(0x1000, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1001, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1004, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1008, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1009, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x100C, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x100D, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x100E, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x100F, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1010, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1011, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1012, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1013, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1014, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1015, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1016, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1017, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1018, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1019, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x101A, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x101D, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x101E, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1026, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1027, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1028, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x105E, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x105F, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1060, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1075, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1076, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1077, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1078, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1079, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x107A, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x107B, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x107C, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x107D, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x107E, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x107F, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x108A, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x108B, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x108C, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x1096, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1098, 0),
+    INTEL_E1000_ETHERNET_DEVICE(0x1099, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x109A, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x10B5, E1000_NO_IOPORT),
+    INTEL_E1000_ETHERNET_DEVICE(0x10B9, 0),
     /* required last entry */
     {0,}
 };
@@ -621,7 +621,14 @@
     int i, err, pci_using_dac;
     uint16_t eeprom_data;
     uint16_t eeprom_apme_mask = E1000_EEPROM_APME;
-    if ((err = pci_enable_device(pdev)))
+    int bars;
+
+    if (ent->driver_data & E1000_NO_IOPORT)
+        bars = pci_select_bars(pdev, IORESOURCE_MEM);
+    else
+        bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
+
+    if ((err = pci_enable_device_bars(pdev, bars)))
         return err;
if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
@@ -634,7 +641,8 @@
         pci_using_dac = 0;
     }
- if ((err = pci_request_regions(pdev, e1000_driver_name)))
+    err = pci_request_selected_regions(pdev, bars, e1000_driver_name);
+    if (err)
         return err;
pci_set_master(pdev);
@@ -654,6 +662,7 @@
     adapter->pdev = pdev;
     adapter->hw.back = adapter;
     adapter->msg_enable = (1 << debug) - 1;
+    adapter->bars = bars;
mmio_start = pci_resource_start(pdev, BAR_0);
     mmio_len = pci_resource_len(pdev, BAR_0);
@@ -664,12 +673,15 @@
         goto err_ioremap;
     }
- for (i = BAR_1; i <= BAR_5; i++) {
-        if (pci_resource_len(pdev, i) == 0)
-            continue;
-        if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
-            adapter->hw.io_base = pci_resource_start(pdev, i);
-            break;
+    if (!(ent->driver_data & E1000_NO_IOPORT)) {
+        for (i = BAR_1; i <= BAR_5; i++) {
+            if (pci_resource_len(pdev, i) == 0)
+                continue;
+            if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
+                adapter->hw.io_base =
+                    pci_resource_start(pdev, i);
+                break;
+            }
         }
     }
@@ -880,7 +892,7 @@
 err_ioremap:
     free_netdev(netdev);
 err_alloc_etherdev:
-    pci_release_regions(pdev);
+    pci_release_selected_regions(pdev, bars);
     return err;
 }
@@ -935,7 +947,7 @@
 #endif
iounmap(adapter->hw.hw_addr);
-    pci_release_regions(pdev);
+    pci_release_selected_regions(pdev, adapter->bars);
free_netdev(netdev); @@ -4577,7 +4589,7 @@
     if (retval)
         DPRINTK(PROBE, ERR, "Error in setting power state\n");
     e1000_pci_restore_state(adapter);
-    ret_val = pci_enable_device(pdev);
+    ret_val = pci_enable_device_bars(pdev, adapter->bars);
     pci_set_master(pdev);
retval = pci_enable_wake(pdev, PCI_D3hot, 0);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux