nvethernet: Fix IRQ names in multi interface case

Issue: IRQ names not correct when multiple interfaces
probed with nvethernet driver because of static array.

Fix: Move irq names array inside private data structure
so that every interface will have unique name.

Bug 200762612

Change-Id: I9d55b62c345c458fa65e2ad4612ba55473e34752
Signed-off-by: Bhadram Varka <vbhadram@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2588659
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: Narayan Reddy <narayanr@nvidia.com>
Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com>
Reviewed-by: Rakesh Goyal <rgoyal@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Bhadram Varka
2021-09-03 12:23:50 +05:30
committed by Revanth Kumar Uppala
parent 1d0b94cfa9
commit d93210ee62
2 changed files with 13 additions and 10 deletions

View File

@@ -1463,13 +1463,14 @@ static int ether_request_irqs(struct ether_priv_data *pdata)
{ {
struct osi_dma_priv_data *osi_dma = pdata->osi_dma; struct osi_dma_priv_data *osi_dma = pdata->osi_dma;
struct osi_core_priv_data *osi_core = pdata->osi_core; struct osi_core_priv_data *osi_core = pdata->osi_core;
static char irq_names[ETHER_IRQ_MAX_IDX][ETHER_IRQ_NAME_SZ] = {0}; int ret = 0, i, j = 1;
int ret = 0, i, j = 0;
unsigned int chan; unsigned int chan;
snprintf(pdata->irq_names[0], ETHER_IRQ_NAME_SZ, "%s.common_irq",
netdev_name(pdata->ndev));
ret = devm_request_irq(pdata->dev, (unsigned int)pdata->common_irq, ret = devm_request_irq(pdata->dev, (unsigned int)pdata->common_irq,
ether_common_isr, IRQF_SHARED, ether_common_isr, IRQF_SHARED,
"ether_common_irq", pdata); pdata->irq_names[0], pdata);
if (unlikely(ret < 0)) { if (unlikely(ret < 0)) {
dev_err(pdata->dev, "failed to register common interrupt: %d\n", dev_err(pdata->dev, "failed to register common interrupt: %d\n",
pdata->common_irq); pdata->common_irq);
@@ -1480,11 +1481,11 @@ static int ether_request_irqs(struct ether_priv_data *pdata)
if (osi_core->mac_ver > OSI_EQOS_MAC_5_00 || if (osi_core->mac_ver > OSI_EQOS_MAC_5_00 ||
osi_core->mac == OSI_MAC_HW_MGBE) { osi_core->mac == OSI_MAC_HW_MGBE) {
for (i = 0; i < osi_core->num_vm_irqs; i++) { for (i = 0; i < osi_core->num_vm_irqs; i++) {
snprintf(irq_names[j], ETHER_IRQ_NAME_SZ, "%s.vm%d", snprintf(pdata->irq_names[j], ETHER_IRQ_NAME_SZ, "%s.vm%d",
netdev_name(pdata->ndev), i); netdev_name(pdata->ndev), i);
ret = devm_request_irq(pdata->dev, pdata->vm_irqs[i], ret = devm_request_irq(pdata->dev, pdata->vm_irqs[i],
ether_vm_isr, IRQF_TRIGGER_NONE, ether_vm_isr, IRQF_TRIGGER_NONE,
irq_names[j++], pdata->irq_names[j++],
&pdata->vm_irq_data[i]); &pdata->vm_irq_data[i]);
if (unlikely(ret < 0)) { if (unlikely(ret < 0)) {
dev_err(pdata->dev, dev_err(pdata->dev,
@@ -1499,12 +1500,12 @@ static int ether_request_irqs(struct ether_priv_data *pdata)
for (i = 0; i < osi_dma->num_dma_chans; i++) { for (i = 0; i < osi_dma->num_dma_chans; i++) {
chan = osi_dma->dma_chans[i]; chan = osi_dma->dma_chans[i];
snprintf(irq_names[j], ETHER_IRQ_NAME_SZ, "%s.rx%d", snprintf(pdata->irq_names[j], ETHER_IRQ_NAME_SZ, "%s.rx%d",
netdev_name(pdata->ndev), chan); netdev_name(pdata->ndev), chan);
ret = devm_request_irq(pdata->dev, pdata->rx_irqs[i], ret = devm_request_irq(pdata->dev, pdata->rx_irqs[i],
ether_rx_chan_isr, ether_rx_chan_isr,
IRQF_TRIGGER_NONE, IRQF_TRIGGER_NONE,
irq_names[j++], pdata->irq_names[j++],
pdata->rx_napi[chan]); pdata->rx_napi[chan]);
if (unlikely(ret < 0)) { if (unlikely(ret < 0)) {
dev_err(pdata->dev, dev_err(pdata->dev,
@@ -1515,13 +1516,13 @@ static int ether_request_irqs(struct ether_priv_data *pdata)
pdata->rx_irq_alloc_mask |= (OSI_ENABLE << i); pdata->rx_irq_alloc_mask |= (OSI_ENABLE << i);
snprintf(irq_names[j], ETHER_IRQ_NAME_SZ, "%s.tx%d", snprintf(pdata->irq_names[j], ETHER_IRQ_NAME_SZ, "%s.tx%d",
netdev_name(pdata->ndev), chan); netdev_name(pdata->ndev), chan);
ret = devm_request_irq(pdata->dev, ret = devm_request_irq(pdata->dev,
(unsigned int)pdata->tx_irqs[i], (unsigned int)pdata->tx_irqs[i],
ether_tx_chan_isr, ether_tx_chan_isr,
IRQF_TRIGGER_NONE, IRQF_TRIGGER_NONE,
irq_names[j++], pdata->irq_names[j++],
pdata->tx_napi[chan]); pdata->tx_napi[chan]);
if (unlikely(ret < 0)) { if (unlikely(ret < 0)) {
dev_err(pdata->dev, dev_err(pdata->dev,

View File

@@ -78,7 +78,7 @@
/** /**
* @brief Maximum index for IRQ numbers array. * @brief Maximum index for IRQ numbers array.
*/ */
#define ETHER_IRQ_MAX_IDX 8 #define ETHER_IRQ_MAX_IDX 9
/** /**
* @brief Size of Ethernet IRQ name. * @brief Size of Ethernet IRQ name.
*/ */
@@ -455,6 +455,8 @@ struct ether_priv_data {
int rx_irqs[ETHER_MAX_IRQS]; int rx_irqs[ETHER_MAX_IRQS];
/** Array of VM IRQ numbers */ /** Array of VM IRQ numbers */
int vm_irqs[OSI_MAX_VM_IRQS]; int vm_irqs[OSI_MAX_VM_IRQS];
/** IRQ name */
char irq_names[ETHER_IRQ_MAX_IDX][ETHER_IRQ_NAME_SZ];
/** memory allocation mask */ /** memory allocation mask */
unsigned long long dma_mask; unsigned long long dma_mask;
/** Current state of features enabled in HW*/ /** Current state of features enabled in HW*/