Skip to content

Commit

Permalink
net: thunderx: Switch to pci_alloc_irq_vectors
Browse files Browse the repository at this point in the history
Remove deprecated pci_enable_msix API in favour of its
successor pci_alloc_irq_vectors.

Signed-off-by: Thanneeru Srinivasulu <tsrinivasulu@cavium.com>
Signed-off-by: Sunil Goutham <sgoutham@cavium.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Thanneeru Srinivasulu authored and David S. Miller committed Apr 11, 2017
1 parent da6f4cf commit ce211b1
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 96 deletions.
2 changes: 0 additions & 2 deletions drivers/net/ethernet/cavium/thunder/nic.h
Original file line number Diff line number Diff line change
Expand Up @@ -319,9 +319,7 @@ struct nicvf {
struct bgx_stats bgx_stats;

/* MSI-X */
bool msix_enabled;
u8 num_vec;
struct msix_entry msix_entries[NIC_VF_MSIX_VECTORS];
char irq_name[NIC_VF_MSIX_VECTORS][IFNAMSIZ + 15];
bool irq_allocated[NIC_VF_MSIX_VECTORS];
cpumask_var_t affinity_mask[NIC_VF_MSIX_VECTORS];
Expand Down
64 changes: 16 additions & 48 deletions drivers/net/ethernet/cavium/thunder/nic_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,7 @@ struct nicpf {
bool mbx_lock[MAX_NUM_VFS_SUPPORTED];

/* MSI-X */
bool msix_enabled;
u8 num_vec;
struct msix_entry *msix_entries;
bool irq_allocated[NIC_PF_MSIX_VECTORS];
char irq_name[NIC_PF_MSIX_VECTORS][20];
};
Expand Down Expand Up @@ -1088,7 +1086,7 @@ static irqreturn_t nic_mbx_intr_handler(int irq, void *nic_irq)
u64 intr;
u8 vf, vf_per_mbx_reg = 64;

if (irq == nic->msix_entries[NIC_PF_INTR_ID_MBOX0].vector)
if (irq == pci_irq_vector(nic->pdev, NIC_PF_INTR_ID_MBOX0))
mbx = 0;
else
mbx = 1;
Expand All @@ -1107,70 +1105,38 @@ static irqreturn_t nic_mbx_intr_handler(int irq, void *nic_irq)
return IRQ_HANDLED;
}

static int nic_enable_msix(struct nicpf *nic)
{
int i, ret;

nic->num_vec = pci_msix_vec_count(nic->pdev);

nic->msix_entries = kmalloc_array(nic->num_vec,
sizeof(struct msix_entry),
GFP_KERNEL);
if (!nic->msix_entries)
return -ENOMEM;

for (i = 0; i < nic->num_vec; i++)
nic->msix_entries[i].entry = i;

ret = pci_enable_msix(nic->pdev, nic->msix_entries, nic->num_vec);
if (ret) {
dev_err(&nic->pdev->dev,
"Request for #%d msix vectors failed, returned %d\n",
nic->num_vec, ret);
kfree(nic->msix_entries);
return ret;
}

nic->msix_enabled = 1;
return 0;
}

static void nic_disable_msix(struct nicpf *nic)
{
if (nic->msix_enabled) {
pci_disable_msix(nic->pdev);
kfree(nic->msix_entries);
nic->msix_enabled = 0;
nic->num_vec = 0;
}
}

static void nic_free_all_interrupts(struct nicpf *nic)
{
int irq;

for (irq = 0; irq < nic->num_vec; irq++) {
if (nic->irq_allocated[irq])
free_irq(nic->msix_entries[irq].vector, nic);
free_irq(pci_irq_vector(nic->pdev, irq), nic);
nic->irq_allocated[irq] = false;
}
}

static int nic_register_interrupts(struct nicpf *nic)
{
int i, ret;
nic->num_vec = pci_msix_vec_count(nic->pdev);

/* Enable MSI-X */
ret = nic_enable_msix(nic);
if (ret)
return ret;
ret = pci_alloc_irq_vectors(nic->pdev, nic->num_vec, nic->num_vec,
PCI_IRQ_MSIX);
if (ret < 0) {
dev_err(&nic->pdev->dev,
"Request for #%d msix vectors failed, returned %d\n",
nic->num_vec, ret);
return 1;
}

/* Register mailbox interrupt handler */
for (i = NIC_PF_INTR_ID_MBOX0; i < nic->num_vec; i++) {
sprintf(nic->irq_name[i],
"NICPF Mbox%d", (i - NIC_PF_INTR_ID_MBOX0));

ret = request_irq(nic->msix_entries[i].vector,
ret = request_irq(pci_irq_vector(nic->pdev, i),
nic_mbx_intr_handler, 0,
nic->irq_name[i], nic);
if (ret)
Expand All @@ -1186,14 +1152,16 @@ static int nic_register_interrupts(struct nicpf *nic)
fail:
dev_err(&nic->pdev->dev, "Request irq failed\n");
nic_free_all_interrupts(nic);
nic_disable_msix(nic);
pci_free_irq_vectors(nic->pdev);
nic->num_vec = 0;
return ret;
}

static void nic_unregister_interrupts(struct nicpf *nic)
{
nic_free_all_interrupts(nic);
nic_disable_msix(nic);
pci_free_irq_vectors(nic->pdev);
nic->num_vec = 0;
}

static int nic_num_sqs_en(struct nicpf *nic, int vf_en)
Expand Down
70 changes: 24 additions & 46 deletions drivers/net/ethernet/cavium/thunder/nicvf_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -882,38 +882,9 @@ static irqreturn_t nicvf_qs_err_intr_handler(int irq, void *nicvf_irq)
return IRQ_HANDLED;
}

static int nicvf_enable_msix(struct nicvf *nic)
{
int ret, vec;

nic->num_vec = NIC_VF_MSIX_VECTORS;

for (vec = 0; vec < nic->num_vec; vec++)
nic->msix_entries[vec].entry = vec;

ret = pci_enable_msix(nic->pdev, nic->msix_entries, nic->num_vec);
if (ret) {
netdev_err(nic->netdev,
"Req for #%d msix vectors failed\n", nic->num_vec);
return 0;
}
nic->msix_enabled = 1;
return 1;
}

static void nicvf_disable_msix(struct nicvf *nic)
{
if (nic->msix_enabled) {
pci_disable_msix(nic->pdev);
nic->msix_enabled = 0;
nic->num_vec = 0;
}
}

static void nicvf_set_irq_affinity(struct nicvf *nic)
{
int vec, cpu;
int irqnum;

for (vec = 0; vec < nic->num_vec; vec++) {
if (!nic->irq_allocated[vec])
Expand All @@ -930,15 +901,14 @@ static void nicvf_set_irq_affinity(struct nicvf *nic)

cpumask_set_cpu(cpumask_local_spread(cpu, nic->node),
nic->affinity_mask[vec]);
irqnum = nic->msix_entries[vec].vector;
irq_set_affinity_hint(irqnum, nic->affinity_mask[vec]);
irq_set_affinity_hint(pci_irq_vector(nic->pdev, vec),
nic->affinity_mask[vec]);
}
}

static int nicvf_register_interrupts(struct nicvf *nic)
{
int irq, ret = 0;
int vector;

for_each_cq_irq(irq)
sprintf(nic->irq_name[irq], "%s-rxtx-%d",
Expand All @@ -957,8 +927,8 @@ static int nicvf_register_interrupts(struct nicvf *nic)

/* Register CQ interrupts */
for (irq = 0; irq < nic->qs->cq_cnt; irq++) {
vector = nic->msix_entries[irq].vector;
ret = request_irq(vector, nicvf_intr_handler,
ret = request_irq(pci_irq_vector(nic->pdev, irq),
nicvf_intr_handler,
0, nic->irq_name[irq], nic->napi[irq]);
if (ret)
goto err;
Expand All @@ -968,8 +938,8 @@ static int nicvf_register_interrupts(struct nicvf *nic)
/* Register RBDR interrupt */
for (irq = NICVF_INTR_ID_RBDR;
irq < (NICVF_INTR_ID_RBDR + nic->qs->rbdr_cnt); irq++) {
vector = nic->msix_entries[irq].vector;
ret = request_irq(vector, nicvf_rbdr_intr_handler,
ret = request_irq(pci_irq_vector(nic->pdev, irq),
nicvf_rbdr_intr_handler,
0, nic->irq_name[irq], nic);
if (ret)
goto err;
Expand All @@ -981,7 +951,7 @@ static int nicvf_register_interrupts(struct nicvf *nic)
nic->pnicvf->netdev->name,
nic->sqs_mode ? (nic->sqs_id + 1) : 0);
irq = NICVF_INTR_ID_QS_ERR;
ret = request_irq(nic->msix_entries[irq].vector,
ret = request_irq(pci_irq_vector(nic->pdev, irq),
nicvf_qs_err_intr_handler,
0, nic->irq_name[irq], nic);
if (ret)
Expand All @@ -1001,26 +971,28 @@ static int nicvf_register_interrupts(struct nicvf *nic)

static void nicvf_unregister_interrupts(struct nicvf *nic)
{
struct pci_dev *pdev = nic->pdev;
int irq;

/* Free registered interrupts */
for (irq = 0; irq < nic->num_vec; irq++) {
if (!nic->irq_allocated[irq])
continue;

irq_set_affinity_hint(nic->msix_entries[irq].vector, NULL);
irq_set_affinity_hint(pci_irq_vector(pdev, irq), NULL);
free_cpumask_var(nic->affinity_mask[irq]);

if (irq < NICVF_INTR_ID_SQ)
free_irq(nic->msix_entries[irq].vector, nic->napi[irq]);
free_irq(pci_irq_vector(pdev, irq), nic->napi[irq]);
else
free_irq(nic->msix_entries[irq].vector, nic);
free_irq(pci_irq_vector(pdev, irq), nic);

nic->irq_allocated[irq] = false;
}

/* Disable MSI-X */
nicvf_disable_msix(nic);
pci_free_irq_vectors(pdev);
nic->num_vec = 0;
}

/* Initialize MSIX vectors and register MISC interrupt.
Expand All @@ -1032,16 +1004,22 @@ static int nicvf_register_misc_interrupt(struct nicvf *nic)
int irq = NICVF_INTR_ID_MISC;

/* Return if mailbox interrupt is already registered */
if (nic->msix_enabled)
if (nic->pdev->msix_enabled)
return 0;

/* Enable MSI-X */
if (!nicvf_enable_msix(nic))
nic->num_vec = pci_msix_vec_count(nic->pdev);
ret = pci_alloc_irq_vectors(nic->pdev, nic->num_vec, nic->num_vec,
PCI_IRQ_MSIX);
if (ret < 0) {
netdev_err(nic->netdev,
"Req for #%d msix vectors failed\n", nic->num_vec);
return 1;
}

sprintf(nic->irq_name[irq], "%s Mbox", "NICVF");
/* Register Misc interrupt */
ret = request_irq(nic->msix_entries[irq].vector,
ret = request_irq(pci_irq_vector(nic->pdev, irq),
nicvf_misc_intr_handler, 0, nic->irq_name[irq], nic);

if (ret)
Expand Down Expand Up @@ -1164,7 +1142,7 @@ int nicvf_stop(struct net_device *netdev)

/* Wait for pending IRQ handlers to finish */
for (irq = 0; irq < nic->num_vec; irq++)
synchronize_irq(nic->msix_entries[irq].vector);
synchronize_irq(pci_irq_vector(nic->pdev, irq));

tasklet_kill(&nic->rbdr_task);
tasklet_kill(&nic->qs_err_task);
Expand Down Expand Up @@ -1365,7 +1343,7 @@ static int nicvf_set_mac_address(struct net_device *netdev, void *p)

memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);

if (nic->msix_enabled) {
if (nic->pdev->msix_enabled) {
if (nicvf_hw_set_mac_addr(nic, netdev))
return -EBUSY;
} else {
Expand Down

0 comments on commit ce211b1

Please sign in to comment.