e1000: Fix for 32 bits platforms with 64 bits resources
Subsystems (2)
PATCH 1/1 e1000: Fix for 32 bits platforms with 64 bits resources
The e1000 driver stores the content of the PCI resources into unsigned long's before ioremapping. This breaks on 32 bits platforms that support 64 bits MMIO resources such as ppc 44x.
This fixes it by removing those temporary variables and passing directly the result of pci_resource_start/len to ioremap.
The side effect is that I removed the assignments to the netdev fields mem_start, mem_end and base_addr, which are totally useless for PCI devices.
--
drivers/net/e1000/e1000_main.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)
drivers/net/e1000/e1000_main.c +5 -13
@@ -861,8 +861,6 @@ e1000_probe(struct pci_dev *pdev, {struct net_device *netdev;struct e1000_adapter *adapter; -unsigned long mmio_start, mmio_len; -unsigned long flash_start, flash_len;static int cards_found =0 ;static int global_quad_port_a =0 ;/* global ksp3 port a indication */
@@ -905,11 +903,9 @@ e1000_probe(struct pci_dev *pdev, adapter->hw.back = adapter; adapter->msg_enable = (1 << debug) -1 ; - mmio_start =pci_resource_start (pdev,BAR_0 ); - mmio_len =pci_resource_len (pdev,BAR_0 ); - err = -EIO ; - adapter->hw.hw_addr =ioremap (mmio_start, mmio_len); + adapter->hw.hw_addr =ioremap (pci_resource_start (pdev,BAR_0 ), +pci_resource_len (pdev,BAR_0 ));if (!adapter->hw.hw_addr) goto err_ioremap;
@@ -944,10 +940,6 @@ e1000_probe(struct pci_dev *pdev,#endif strncpy (netdev->name,pci_name (pdev),sizeof (netdev->name) -1 ); - netdev->mem_start = mmio_start; - netdev->mem_end = mmio_start + mmio_len; - netdev->base_addr = adapter->hw.io_base; - adapter->bd_number = cards_found;/* setup the private structure */
@@ -960,9 +952,9 @@ e1000_probe(struct pci_dev *pdev,* because it depends on mac_type */ if ((adapter->hw.mac_type == e1000_ich8lan) && (pci_resource_flags (pdev,1 ) &IORESOURCE_MEM )) { - flash_start =pci_resource_start (pdev,1 ); - flash_len =pci_resource_len (pdev,1 ); - adapter->hw.flash_address =ioremap (flash_start, flash_len); + adapter->hw.flash_address = +ioremap (pci_resource_start (pdev,1 ), +pci_resource_len (pdev,1 ));if (!adapter->hw.flash_address) goto err_flashmap; }
Quoted 11 lines · Benjamin Herrenschmidt
The e1000 driver stores the content of the PCI resources into unsigned long's before ioremapping. This breaks on 32 bits platforms that support 64 bits MMIO resources such as ppc 44x.
This fixes it by removing those temporary variables and passing directly the result of pci_resource_start/len to ioremap.
The side effect is that I removed the assignments to the netdev fields
mem_start,mem_endandbase_addr, which are totally useless for PCI devices.
Quoted 5 lines
Signed-off-by Benjamin Herrenschmidt <[email protected]>--
drivers/net/e1000/e1000_main.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)
Looks good to me. auke?
Kok, Auke
Acked-byQuoted 12 lines · Jeff Garzik
Quoted 11 lines · Benjamin Herrenschmidt
The e1000 driver stores the content of the PCI resources into unsigned long's before ioremapping. This breaks on 32 bits platforms that support 64 bits MMIO resources such as ppc 44x.
This fixes it by removing those temporary variables and passing directly the result of pci_resource_start/len to ioremap.
The side effect is that I removed the assignments to the netdev fields
mem_start,mem_endandbase_addr, which are totally useless for PCI devices.
Quoted 7 lines
Quoted 5 lines
Signed-off-by Benjamin Herrenschmidt <[email protected]>Signature · 2 lines
drivers/net/e1000/e1000_main.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)Looks good to me. auke?
yes, please apply.
Auke
Quoted 6 lines · Benjamin Herrenschmidt
The e1000 driver stores the content of the PCI resources into unsigned long's before ioremapping. This breaks on 32 bits platforms that support 64 bits MMIO resources such as ppc 44x.
This fixes it by removing those temporary variables and passing directly the result of pci_resource_start/len to ioremap.
the patch is mostly fine, but looking through the tree, doesn't every driver that has 64 bit capable resources have this problem?
in fact, skeleton module has this problem, if I'm not mistaken. e1000 isn't the only one. :-)
Quoted 3 lines
The side effect is that I removed the assignments to the netdev fields
mem_start,mem_endandbase_addr, which are totally useless for PCI devices.
also, concerning this, ifconfig shows the output of these variables, I don't think we want to blatantly remove them, as it is actually removing information that is, if not used, at least displayed to user space.
eth6 Link encap:Ethernet HWaddr 00:0E:01:0C:02:03
inet addr:134.134.3.121 Bcast:134.134.3.255
Mask:255.255.255.0
inet6 addr: fe80::20e:1ff:fe0c:203/64 Scope:Link
UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9022519 errors:0 dropped:0 overruns:0 frame:0
TX packets:1303701 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4044613454 (3857.2 Mb) TX bytes:118365109 (112.8 Mb)
Base address:0xf000 Memory:feac0000-feae0000
^^^^^^^^^^^^^^^^^Quoted 8 lines · Jesse
Quoted 4 lines
The side effect is that I removed the assignments to the netdev fields
mem_start,mem_endandbase_addr, which are totally useless for PCI devices.also, concerning this, ifconfig shows the output of these variables, I don't think we want to blatantly remove them, as it is actually removing information that is, if not used, at least displayed to user space.
It's not the right place to have that information and there is no room in the user space field to fit more than 32 bits on 32 bits platforms so I'd rather remove it. It's really only for ISA drivers that have user configurable addresses.
Ben.
Jeff Garzik
AppliedQuoted 11 lines · Benjamin Herrenschmidt
The e1000 driver stores the content of the PCI resources into unsigned long's before ioremapping. This breaks on 32 bits platforms that support 64 bits MMIO resources such as ppc 44x.
This fixes it by removing those temporary variables and passing directly the result of pci_resource_start/len to ioremap.
The side effect is that I removed the assignments to the netdev fields
mem_start,mem_endandbase_addr, which are totally useless for PCI devices.
Quoted 5 lines
Signed-off-by Benjamin Herrenschmidt <[email protected]>--
drivers/net/e1000/e1000_main.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)
applied