Skip to content

Commit 3e5f0c3

Browse files
committed
net:mana: Create or get interrupt for each EQ when creating vPort
Use gic functions to create a dedicated interrupt context or acquire a shared interrupt context for this EQ.
1 parent deabc0f commit 3e5f0c3

3 files changed

Lines changed: 13 additions & 2 deletions

File tree

drivers/net/ethernet/microsoft/mana/gdma_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,6 @@ static void mana_gd_deregiser_irq(struct gdma_queue *queue)
633633
}
634634
spin_unlock_irqrestore(&gic->lock, flags);
635635

636-
queue->eq.msix_index = INVALID_PCI_MSIX_INDEX;
637636
synchronize_rcu();
638637
}
639638

@@ -747,6 +746,7 @@ static int mana_gd_create_eq(struct gdma_dev *gd,
747746
out:
748747
dev_err(dev, "Failed to create EQ: %d\n", err);
749748
mana_gd_destroy_eq(gc, false, queue);
749+
queue->eq.msix_index = INVALID_PCI_MSIX_INDEX;
750750
return err;
751751
}
752752

drivers/net/ethernet/microsoft/mana/mana_en.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,7 @@ void mana_destroy_eq(struct mana_port_context *apc)
12621262
continue;
12631263

12641264
mana_gd_destroy_queue(gc, eq);
1265+
gdma_put_gic(gc, !gc->msi_sharing, eq->eq.msix_index);
12651266
}
12661267

12671268
kfree(apc->eqs);
@@ -1278,6 +1279,7 @@ static void mana_create_eq_debugfs(struct mana_port_context *apc, int i)
12781279
eq.mana_eq_debugfs = debugfs_create_dir(eqnum, apc->mana_eqs_debugfs);
12791280
debugfs_create_u32("head", 0400, eq.mana_eq_debugfs, &eq.eq->head);
12801281
debugfs_create_u32("tail", 0400, eq.mana_eq_debugfs, &eq.eq->tail);
1282+
debugfs_create_u32("irq", 0400, eq.mana_eq_debugfs, &eq.eq->eq.irq);
12811283
debugfs_create_file("eq_dump", 0400, eq.mana_eq_debugfs, eq.eq, &mana_dbg_q_fops);
12821284
}
12831285

@@ -1288,6 +1290,7 @@ int mana_create_eq(struct mana_port_context *apc)
12881290
struct gdma_queue_spec spec = {};
12891291
int err;
12901292
int i;
1293+
struct gdma_irq_context *gic;
12911294

12921295
WARN_ON(apc->eqs);
12931296
apc->eqs = kcalloc(apc->num_queues, sizeof(struct mana_eq),
@@ -1305,12 +1308,19 @@ int mana_create_eq(struct mana_port_context *apc)
13051308
apc->mana_eqs_debugfs = debugfs_create_dir("EQs", apc->mana_port_debugfs);
13061309

13071310
for (i = 0; i < apc->num_queues; i++) {
1308-
spec.eq.msix_index = (i + 1) % gc->num_msix_usable;
1311+
if (gc->msi_sharing)
1312+
spec.eq.msix_index = (i + 1) % gc->num_msix_usable;
1313+
gic = gdma_get_gic(gc, !gc->msi_sharing, apc->port_idx, i,
1314+
&spec.eq.msix_index);
1315+
if (!gic)
1316+
goto out;
1317+
13091318
err = mana_gd_create_mana_eq(gd, &spec, &apc->eqs[i].eq);
13101319
if (err) {
13111320
dev_err(gc->dev, "Failed to create EQ %d : %d\n", i, err);
13121321
goto out;
13131322
}
1323+
apc->eqs[i].eq->eq.irq = gic->irq;
13141324
mana_create_eq_debugfs(apc, i);
13151325
}
13161326

include/net/mana/gdma.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ struct gdma_queue {
317317
void *context;
318318

319319
unsigned int msix_index;
320+
unsigned int irq;
320321

321322
u32 log2_throttle_limit;
322323
} eq;

0 commit comments

Comments
 (0)