Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81250297 authored by Taku Izumi's avatar Taku Izumi Committed by Jeff Garzik
Browse files

e1000: make ioport free



This patch makes e1000 driver ioport-free.
This corrects behavior in probe function so as not to request ioport
resources as long as they are not really needed.  This is based on the
ioport-free patch of e1000 driver from Auke Kok and Tomohiro Kusumi.

Signed-off-by: default avatarTomohiro Kusumi <kusumi.tomohiro@jp.fujitsu.com>
Signed-off-by: default avatarAuke Kok <auke-jan.h.kok@intel.com>
Signed-off-by: default avatarTaku Izumi <izumi.taku@jp.fujitsu.com>
Signed-off-by: default avatarJeff <Kirsher&lt;jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent c3570acb
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -340,6 +340,10 @@ struct e1000_adapter {
	bool quad_port_a;
	bool quad_port_a;
	unsigned long flags;
	unsigned long flags;
	u32 eeprom_wol;
	u32 eeprom_wol;

	/* for ioport free */
	int bars;
	int need_ioport;
};
};


enum e1000_state_t {
enum e1000_state_t {
+70 −13
Original line number Original line Diff line number Diff line
@@ -858,6 +858,42 @@ static void e1000_dump_eeprom(struct e1000_adapter *adapter)
	kfree(data);
	kfree(data);
}
}


/**
 * e1000_is_need_ioport - determine if an adapter needs ioport resources or not
 * @pdev: PCI device information struct
 *
 * Return true if an adapter needs ioport resources
 **/
static int e1000_is_need_ioport(struct pci_dev *pdev)
{
	switch (pdev->device) {
	case E1000_DEV_ID_82540EM:
	case E1000_DEV_ID_82540EM_LOM:
	case E1000_DEV_ID_82540EP:
	case E1000_DEV_ID_82540EP_LOM:
	case E1000_DEV_ID_82540EP_LP:
	case E1000_DEV_ID_82541EI:
	case E1000_DEV_ID_82541EI_MOBILE:
	case E1000_DEV_ID_82541ER:
	case E1000_DEV_ID_82541ER_LOM:
	case E1000_DEV_ID_82541GI:
	case E1000_DEV_ID_82541GI_LF:
	case E1000_DEV_ID_82541GI_MOBILE:
	case E1000_DEV_ID_82544EI_COPPER:
	case E1000_DEV_ID_82544EI_FIBER:
	case E1000_DEV_ID_82544GC_COPPER:
	case E1000_DEV_ID_82544GC_LOM:
	case E1000_DEV_ID_82545EM_COPPER:
	case E1000_DEV_ID_82545EM_FIBER:
	case E1000_DEV_ID_82546EB_COPPER:
	case E1000_DEV_ID_82546EB_FIBER:
	case E1000_DEV_ID_82546EB_QUAD_COPPER:
		return true;
	default:
		return false;
	}
}

/**
/**
 * e1000_probe - Device Initialization Routine
 * e1000_probe - Device Initialization Routine
 * @pdev: PCI device information struct
 * @pdev: PCI device information struct
@@ -869,7 +905,6 @@ static void e1000_dump_eeprom(struct e1000_adapter *adapter)
 * The OS initialization, configuring of the adapter private structure,
 * The OS initialization, configuring of the adapter private structure,
 * and a hardware reset occur.
 * and a hardware reset occur.
 **/
 **/

static int __devinit e1000_probe(struct pci_dev *pdev,
static int __devinit e1000_probe(struct pci_dev *pdev,
				 const struct pci_device_id *ent)
				 const struct pci_device_id *ent)
{
{
@@ -882,9 +917,18 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
	int i, err, pci_using_dac;
	int i, err, pci_using_dac;
	u16 eeprom_data = 0;
	u16 eeprom_data = 0;
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
	int bars, need_ioport;
	DECLARE_MAC_BUF(mac);
	DECLARE_MAC_BUF(mac);


	/* do not allocate ioport bars when not needed */
	need_ioport = e1000_is_need_ioport(pdev);
	if (need_ioport) {
		bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
		err = pci_enable_device(pdev);
	} else {
		bars = pci_select_bars(pdev, IORESOURCE_MEM);
		err = pci_enable_device(pdev);
		err = pci_enable_device(pdev);
	}
	if (err)
	if (err)
		return err;
		return err;


@@ -904,7 +948,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
		pci_using_dac = 0;
		pci_using_dac = 0;
	}
	}


	err = pci_request_regions(pdev, e1000_driver_name);
	err = pci_request_selected_regions(pdev, bars, e1000_driver_name);
	if (err)
	if (err)
		goto err_pci_reg;
		goto err_pci_reg;


@@ -922,6 +966,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
	adapter->netdev = netdev;
	adapter->netdev = netdev;
	adapter->pdev = pdev;
	adapter->pdev = pdev;
	adapter->msg_enable = (1 << debug) - 1;
	adapter->msg_enable = (1 << debug) - 1;
	adapter->bars = bars;
	adapter->need_ioport = need_ioport;


	hw = &adapter->hw;
	hw = &adapter->hw;
	hw->back = adapter;
	hw->back = adapter;
@@ -932,6 +978,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
	if (!hw->hw_addr)
	if (!hw->hw_addr)
		goto err_ioremap;
		goto err_ioremap;


	if (adapter->need_ioport) {
		for (i = BAR_1; i <= BAR_5; i++) {
		for (i = BAR_1; i <= BAR_5; i++) {
			if (pci_resource_len(pdev, i) == 0)
			if (pci_resource_len(pdev, i) == 0)
				continue;
				continue;
@@ -940,6 +987,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
				break;
				break;
			}
			}
		}
		}
	}


	netdev->open = &e1000_open;
	netdev->open = &e1000_open;
	netdev->stop = &e1000_close;
	netdev->stop = &e1000_close;
@@ -1202,7 +1250,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
err_ioremap:
err_ioremap:
	free_netdev(netdev);
	free_netdev(netdev);
err_alloc_etherdev:
err_alloc_etherdev:
	pci_release_regions(pdev);
	pci_release_selected_regions(pdev, bars);
err_pci_reg:
err_pci_reg:
err_dma:
err_dma:
	pci_disable_device(pdev);
	pci_disable_device(pdev);
@@ -1249,7 +1297,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
	iounmap(hw->hw_addr);
	iounmap(hw->hw_addr);
	if (hw->flash_address)
	if (hw->flash_address)
		iounmap(hw->flash_address);
		iounmap(hw->flash_address);
	pci_release_regions(pdev);
	pci_release_selected_regions(pdev, adapter->bars);


	free_netdev(netdev);
	free_netdev(netdev);


@@ -5040,7 +5088,11 @@ static int e1000_resume(struct pci_dev *pdev)


	pci_set_power_state(pdev, PCI_D0);
	pci_set_power_state(pdev, PCI_D0);
	pci_restore_state(pdev);
	pci_restore_state(pdev);

	if (adapter->need_ioport)
		err = pci_enable_device(pdev);
		err = pci_enable_device(pdev);
	else
		err = pci_enable_device_mem(pdev);
	if (err) {
	if (err) {
		printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n");
		printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n");
		return err;
		return err;
@@ -5136,8 +5188,13 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
	struct net_device *netdev = pci_get_drvdata(pdev);
	struct net_device *netdev = pci_get_drvdata(pdev);
	struct e1000_adapter *adapter = netdev->priv;
	struct e1000_adapter *adapter = netdev->priv;
	struct e1000_hw *hw = &adapter->hw;
	struct e1000_hw *hw = &adapter->hw;
	int err;


	if (pci_enable_device(pdev)) {
	if (adapter->need_ioport)
		err = pci_enable_device(pdev);
	else
		err = pci_enable_device_mem(pdev);
	if (err) {
		printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n");
		printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n");
		return PCI_ERS_RESULT_DISCONNECT;
		return PCI_ERS_RESULT_DISCONNECT;
	}
	}