mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 17:25:35 +03:00
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:
committed by
Revanth Kumar Uppala
parent
1d0b94cfa9
commit
d93210ee62
@@ -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_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 = 0;
|
||||
int ret = 0, i, j = 1;
|
||||
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,
|
||||
ether_common_isr, IRQF_SHARED,
|
||||
"ether_common_irq", pdata);
|
||||
pdata->irq_names[0], pdata);
|
||||
if (unlikely(ret < 0)) {
|
||||
dev_err(pdata->dev, "failed to register common interrupt: %d\n",
|
||||
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 ||
|
||||
osi_core->mac == OSI_MAC_HW_MGBE) {
|
||||
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);
|
||||
ret = devm_request_irq(pdata->dev, pdata->vm_irqs[i],
|
||||
ether_vm_isr, IRQF_TRIGGER_NONE,
|
||||
irq_names[j++],
|
||||
pdata->irq_names[j++],
|
||||
&pdata->vm_irq_data[i]);
|
||||
if (unlikely(ret < 0)) {
|
||||
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++) {
|
||||
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);
|
||||
ret = devm_request_irq(pdata->dev, pdata->rx_irqs[i],
|
||||
ether_rx_chan_isr,
|
||||
IRQF_TRIGGER_NONE,
|
||||
irq_names[j++],
|
||||
pdata->irq_names[j++],
|
||||
pdata->rx_napi[chan]);
|
||||
if (unlikely(ret < 0)) {
|
||||
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);
|
||||
|
||||
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);
|
||||
ret = devm_request_irq(pdata->dev,
|
||||
(unsigned int)pdata->tx_irqs[i],
|
||||
ether_tx_chan_isr,
|
||||
IRQF_TRIGGER_NONE,
|
||||
irq_names[j++],
|
||||
pdata->irq_names[j++],
|
||||
pdata->tx_napi[chan]);
|
||||
if (unlikely(ret < 0)) {
|
||||
dev_err(pdata->dev,
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
/**
|
||||
* @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.
|
||||
*/
|
||||
@@ -455,6 +455,8 @@ struct ether_priv_data {
|
||||
int rx_irqs[ETHER_MAX_IRQS];
|
||||
/** Array of VM IRQ numbers */
|
||||
int vm_irqs[OSI_MAX_VM_IRQS];
|
||||
/** IRQ name */
|
||||
char irq_names[ETHER_IRQ_MAX_IDX][ETHER_IRQ_NAME_SZ];
|
||||
/** memory allocation mask */
|
||||
unsigned long long dma_mask;
|
||||
/** Current state of features enabled in HW*/
|
||||
|
||||
Reference in New Issue
Block a user