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_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,
|
||||||
|
|||||||
@@ -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*/
|
||||||
|
|||||||
Reference in New Issue
Block a user