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: Sivakumar Subramani <sivakumar.subramani@neterion.com> Signed-off-by: Ramkrishna Vepa <ram.vepa@neterion.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
David S. Miller
parent
8abc4d5b84
commit
c77dd43e77
@@ -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);
|
||||||
|
|
||||||
|
@@ -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. */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user