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

Commit c77dd43e authored by Sivakumar Subramani's avatar Sivakumar Subramani Committed by David S. Miller
Browse files

S2IO: Fixes in MSIX related code.



- Calling store_xmsi_data to store the MSI-X datas during initialization
  in s2io-init_nic function
- Disabling NAPI when MSI-X is enabled
- Freeing sp->entries and sp->s2io_entries in s2io_rem_isr

Signed-off-by: default avatarSivakumar Subramani <sivakumar.subramani@neterion.com>
Signed-off-by: default avatarRamkrishna Vepa <ram.vepa@neterion.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 8abc4d5b
Loading
Loading
Loading
Loading
+19 −0
Original line number Original line Diff line number Diff line
@@ -3892,6 +3892,12 @@ static int s2io_open(struct net_device *dev)
		}
		}
	}
	}


	/* NAPI doesn't work well with MSI(X) */
	 if (sp->intr_type != INTA) {
		if(sp->config.napi)
			sp->config.napi = 0;
	}

	/* Initialize H/W and enable interrupts */
	/* Initialize H/W and enable interrupts */
	err = s2io_card_up(sp);
	err = s2io_card_up(sp);
	if (err) {
	if (err) {
@@ -6471,6 +6477,7 @@ static void s2io_rem_isr(struct s2io_nic * sp)
{
{
	int cnt = 0;
	int cnt = 0;
	struct net_device *dev = sp->dev;
	struct net_device *dev = sp->dev;
	struct swStat *stats = &sp->mac_control.stats_info->sw_stat;


	if (sp->intr_type == MSI_X) {
	if (sp->intr_type == MSI_X) {
		int i;
		int i;
@@ -6483,6 +6490,16 @@ static void s2io_rem_isr(struct s2io_nic * sp)


			free_irq(vector, arg);
			free_irq(vector, arg);
		}
		}

		kfree(sp->entries);
		stats->mem_freed +=
			(MAX_REQUESTED_MSI_X * sizeof(struct msix_entry));
		kfree(sp->s2io_entries);
		stats->mem_freed +=
			(MAX_REQUESTED_MSI_X * sizeof(struct s2io_msix_entry));
		sp->entries = NULL;
		sp->s2io_entries = NULL;

		pci_read_config_word(sp->pdev, 0x42, &msi_control);
		pci_read_config_word(sp->pdev, 0x42, &msi_control);
		msi_control &= 0xFFFE; /* Disable MSI */
		msi_control &= 0xFFFE; /* Disable MSI */
		pci_write_config_word(sp->pdev, 0x42, msi_control);
		pci_write_config_word(sp->pdev, 0x42, msi_control);
@@ -7377,6 +7394,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
	dev->addr_len = ETH_ALEN;
	dev->addr_len = ETH_ALEN;
	memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN);
	memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN);


	 /* Store the values of the MSIX table in the s2io_nic structure */
	store_xmsi_data(sp);
	/* reset Nic and bring it to known state */
	/* reset Nic and bring it to known state */
	s2io_reset(sp);
	s2io_reset(sp);


+1 −0
Original line number Original line Diff line number Diff line
@@ -415,6 +415,7 @@ struct config_param {
#define INTA	0
#define INTA	0
#define MSI_X	2
#define MSI_X	2
	u8 intr_type;
	u8 intr_type;
	u8 napi;


	/* Specifies if Tx Intr is UTILZ or PER_LIST type. */
	/* Specifies if Tx Intr is UTILZ or PER_LIST type. */