Skip to content

Commit 180b0ae

Browse files
Christoph Hellwigaxboe
authored andcommitted
skd: use pci_alloc_irq_vectors
Switch the skd driver to use pci_alloc_irq_vectors. We need to two calls to pci_alloc_irq_vectors as skd only supports multiple MSI-X vectors, but not multiple MSI vectors. Otherwise this cleans up a lot of cruft and allows to a lot more common code. Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent feebd56 commit 180b0ae

File tree

1 file changed

+66
-146
lines changed

1 file changed

+66
-146
lines changed

drivers/block/skd_main.c

Lines changed: 66 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,6 @@ struct skd_device {
270270
resource_size_t mem_phys[SKD_MAX_BARS];
271271
u32 mem_size[SKD_MAX_BARS];
272272

273-
skd_irq_type_t irq_type;
274-
u32 msix_count;
275273
struct skd_msix_entry *msix_entries;
276274

277275
struct pci_dev *pdev;
@@ -3821,10 +3819,6 @@ static irqreturn_t skd_qfull_isr(int irq, void *skd_host_data)
38213819
*/
38223820

38233821
struct skd_msix_entry {
3824-
int have_irq;
3825-
u32 vector;
3826-
u32 entry;
3827-
struct skd_device *rsp;
38283822
char isr_name[30];
38293823
};
38303824

@@ -3853,193 +3847,120 @@ static struct skd_init_msix_entry msix_entries[SKD_MAX_MSIX_COUNT] = {
38533847
{ "(Queue Full 3)", skd_qfull_isr },
38543848
};
38553849

3856-
static void skd_release_msix(struct skd_device *skdev)
3857-
{
3858-
struct skd_msix_entry *qentry;
3859-
int i;
3860-
3861-
if (skdev->msix_entries) {
3862-
for (i = 0; i < skdev->msix_count; i++) {
3863-
qentry = &skdev->msix_entries[i];
3864-
skdev = qentry->rsp;
3865-
3866-
if (qentry->have_irq)
3867-
devm_free_irq(&skdev->pdev->dev,
3868-
qentry->vector, qentry->rsp);
3869-
}
3870-
3871-
kfree(skdev->msix_entries);
3872-
}
3873-
3874-
if (skdev->msix_count)
3875-
pci_disable_msix(skdev->pdev);
3876-
3877-
skdev->msix_count = 0;
3878-
skdev->msix_entries = NULL;
3879-
}
3880-
38813850
static int skd_acquire_msix(struct skd_device *skdev)
38823851
{
38833852
int i, rc;
38843853
struct pci_dev *pdev = skdev->pdev;
3885-
struct msix_entry *entries;
3886-
struct skd_msix_entry *qentry;
3887-
3888-
entries = kzalloc(sizeof(struct msix_entry) * SKD_MAX_MSIX_COUNT,
3889-
GFP_KERNEL);
3890-
if (!entries)
3891-
return -ENOMEM;
38923854

3893-
for (i = 0; i < SKD_MAX_MSIX_COUNT; i++)
3894-
entries[i].entry = i;
3895-
3896-
rc = pci_enable_msix_exact(pdev, entries, SKD_MAX_MSIX_COUNT);
3897-
if (rc) {
3855+
rc = pci_alloc_irq_vectors(pdev, SKD_MAX_MSIX_COUNT, SKD_MAX_MSIX_COUNT,
3856+
PCI_IRQ_MSIX);
3857+
if (rc < 0) {
38983858
pr_err("(%s): failed to enable MSI-X %d\n",
38993859
skd_name(skdev), rc);
39003860
goto msix_out;
39013861
}
39023862

3903-
skdev->msix_count = SKD_MAX_MSIX_COUNT;
3904-
skdev->msix_entries = kzalloc(sizeof(struct skd_msix_entry) *
3905-
skdev->msix_count, GFP_KERNEL);
3863+
skdev->msix_entries = kcalloc(SKD_MAX_MSIX_COUNT,
3864+
sizeof(struct skd_msix_entry), GFP_KERNEL);
39063865
if (!skdev->msix_entries) {
39073866
rc = -ENOMEM;
39083867
pr_err("(%s): msix table allocation error\n",
39093868
skd_name(skdev));
39103869
goto msix_out;
39113870
}
39123871

3913-
for (i = 0; i < skdev->msix_count; i++) {
3914-
qentry = &skdev->msix_entries[i];
3915-
qentry->vector = entries[i].vector;
3916-
qentry->entry = entries[i].entry;
3917-
qentry->rsp = NULL;
3918-
qentry->have_irq = 0;
3919-
pr_debug("%s:%s:%d %s: <%s> msix (%d) vec %d, entry %x\n",
3920-
skdev->name, __func__, __LINE__,
3921-
pci_name(pdev), skdev->name,
3922-
i, qentry->vector, qentry->entry);
3923-
}
3924-
39253872
/* Enable MSI-X vectors for the base queue */
3926-
for (i = 0; i < skdev->msix_count; i++) {
3927-
qentry = &skdev->msix_entries[i];
3873+
for (i = 0; i < SKD_MAX_MSIX_COUNT; i++) {
3874+
struct skd_msix_entry *qentry = &skdev->msix_entries[i];
3875+
39283876
snprintf(qentry->isr_name, sizeof(qentry->isr_name),
39293877
"%s%d-msix %s", DRV_NAME, skdev->devno,
39303878
msix_entries[i].name);
3931-
rc = devm_request_irq(&skdev->pdev->dev, qentry->vector,
3932-
msix_entries[i].handler, 0,
3933-
qentry->isr_name, skdev);
3879+
3880+
rc = devm_request_irq(&skdev->pdev->dev,
3881+
pci_irq_vector(skdev->pdev, i),
3882+
msix_entries[i].handler, 0,
3883+
qentry->isr_name, skdev);
39343884
if (rc) {
39353885
pr_err("(%s): Unable to register(%d) MSI-X "
39363886
"handler %d: %s\n",
39373887
skd_name(skdev), rc, i, qentry->isr_name);
39383888
goto msix_out;
3939-
} else {
3940-
qentry->have_irq = 1;
3941-
qentry->rsp = skdev;
39423889
}
39433890
}
3891+
39443892
pr_debug("%s:%s:%d %s: <%s> msix %d irq(s) enabled\n",
39453893
skdev->name, __func__, __LINE__,
3946-
pci_name(pdev), skdev->name, skdev->msix_count);
3894+
pci_name(pdev), skdev->name, SKD_MAX_MSIX_COUNT);
39473895
return 0;
39483896

39493897
msix_out:
3950-
if (entries)
3951-
kfree(entries);
3952-
skd_release_msix(skdev);
3898+
while (--i >= 0)
3899+
devm_free_irq(&pdev->dev, pci_irq_vector(pdev, i), skdev);
3900+
kfree(skdev->msix_entries);
3901+
skdev->msix_entries = NULL;
39533902
return rc;
39543903
}
39553904

39563905
static int skd_acquire_irq(struct skd_device *skdev)
39573906
{
3907+
struct pci_dev *pdev = skdev->pdev;
3908+
unsigned int irq_flag = PCI_IRQ_LEGACY;
39583909
int rc;
3959-
struct pci_dev *pdev;
39603910

3961-
pdev = skdev->pdev;
3962-
skdev->msix_count = 0;
3963-
3964-
RETRY_IRQ_TYPE:
3965-
switch (skdev->irq_type) {
3966-
case SKD_IRQ_MSIX:
3911+
if (skd_isr_type == SKD_IRQ_MSIX) {
39673912
rc = skd_acquire_msix(skdev);
39683913
if (!rc)
3969-
pr_info("(%s): MSI-X %d irqs enabled\n",
3970-
skd_name(skdev), skdev->msix_count);
3971-
else {
3972-
pr_err(
3973-
"(%s): failed to enable MSI-X, re-trying with MSI %d\n",
3974-
skd_name(skdev), rc);
3975-
skdev->irq_type = SKD_IRQ_MSI;
3976-
goto RETRY_IRQ_TYPE;
3977-
}
3978-
break;
3979-
case SKD_IRQ_MSI:
3980-
snprintf(skdev->isr_name, sizeof(skdev->isr_name), "%s%d-msi",
3981-
DRV_NAME, skdev->devno);
3982-
rc = pci_enable_msi_range(pdev, 1, 1);
3983-
if (rc > 0) {
3984-
rc = devm_request_irq(&pdev->dev, pdev->irq, skd_isr, 0,
3985-
skdev->isr_name, skdev);
3986-
if (rc) {
3987-
pci_disable_msi(pdev);
3988-
pr_err(
3989-
"(%s): failed to allocate the MSI interrupt %d\n",
3990-
skd_name(skdev), rc);
3991-
goto RETRY_IRQ_LEGACY;
3992-
}
3993-
pr_info("(%s): MSI irq %d enabled\n",
3994-
skd_name(skdev), pdev->irq);
3995-
} else {
3996-
RETRY_IRQ_LEGACY:
3997-
pr_err(
3998-
"(%s): failed to enable MSI, re-trying with LEGACY %d\n",
3999-
skd_name(skdev), rc);
4000-
skdev->irq_type = SKD_IRQ_LEGACY;
4001-
goto RETRY_IRQ_TYPE;
4002-
}
4003-
break;
4004-
case SKD_IRQ_LEGACY:
4005-
snprintf(skdev->isr_name, sizeof(skdev->isr_name),
4006-
"%s%d-legacy", DRV_NAME, skdev->devno);
4007-
rc = devm_request_irq(&pdev->dev, pdev->irq, skd_isr,
4008-
IRQF_SHARED, skdev->isr_name, skdev);
4009-
if (!rc)
4010-
pr_info("(%s): LEGACY irq %d enabled\n",
4011-
skd_name(skdev), pdev->irq);
4012-
else
4013-
pr_err("(%s): request LEGACY irq error %d\n",
4014-
skd_name(skdev), rc);
4015-
break;
4016-
default:
4017-
pr_info("(%s): irq_type %d invalid, re-set to %d\n",
4018-
skd_name(skdev), skdev->irq_type, SKD_IRQ_DEFAULT);
4019-
skdev->irq_type = SKD_IRQ_LEGACY;
4020-
goto RETRY_IRQ_TYPE;
3914+
return 0;
3915+
3916+
pr_err("(%s): failed to enable MSI-X, re-trying with MSI %d\n",
3917+
skd_name(skdev), rc);
40213918
}
4022-
return rc;
3919+
3920+
snprintf(skdev->isr_name, sizeof(skdev->isr_name), "%s%d", DRV_NAME,
3921+
skdev->devno);
3922+
3923+
if (skd_isr_type != SKD_IRQ_LEGACY)
3924+
irq_flag |= PCI_IRQ_MSI;
3925+
rc = pci_alloc_irq_vectors(pdev, 1, 1, irq_flag);
3926+
if (rc < 0) {
3927+
pr_err("(%s): failed to allocate the MSI interrupt %d\n",
3928+
skd_name(skdev), rc);
3929+
return rc;
3930+
}
3931+
3932+
rc = devm_request_irq(&pdev->dev, pdev->irq, skd_isr,
3933+
pdev->msi_enabled ? 0 : IRQF_SHARED,
3934+
skdev->isr_name, skdev);
3935+
if (rc) {
3936+
pci_free_irq_vectors(pdev);
3937+
pr_err("(%s): failed to allocate interrupt %d\n",
3938+
skd_name(skdev), rc);
3939+
return rc;
3940+
}
3941+
3942+
return 0;
40233943
}
40243944

40253945
static void skd_release_irq(struct skd_device *skdev)
40263946
{
4027-
switch (skdev->irq_type) {
4028-
case SKD_IRQ_MSIX:
4029-
skd_release_msix(skdev);
4030-
break;
4031-
case SKD_IRQ_MSI:
4032-
devm_free_irq(&skdev->pdev->dev, skdev->pdev->irq, skdev);
4033-
pci_disable_msi(skdev->pdev);
4034-
break;
4035-
case SKD_IRQ_LEGACY:
4036-
devm_free_irq(&skdev->pdev->dev, skdev->pdev->irq, skdev);
4037-
break;
4038-
default:
4039-
pr_err("(%s): wrong irq type %d!",
4040-
skd_name(skdev), skdev->irq_type);
4041-
break;
3947+
struct pci_dev *pdev = skdev->pdev;
3948+
3949+
if (skdev->msix_entries) {
3950+
int i;
3951+
3952+
for (i = 0; i < SKD_MAX_MSIX_COUNT; i++) {
3953+
devm_free_irq(&pdev->dev, pci_irq_vector(pdev, i),
3954+
skdev);
3955+
}
3956+
3957+
kfree(skdev->msix_entries);
3958+
skdev->msix_entries = NULL;
3959+
} else {
3960+
devm_free_irq(&pdev->dev, pdev->irq, skdev);
40423961
}
3962+
3963+
pci_free_irq_vectors(pdev);
40433964
}
40443965

40453966
/*
@@ -4402,7 +4323,6 @@ static struct skd_device *skd_construct(struct pci_dev *pdev)
44024323
skdev->pdev = pdev;
44034324
skdev->devno = skd_next_devno++;
44044325
skdev->major = blk_major;
4405-
skdev->irq_type = skd_isr_type;
44064326
sprintf(skdev->name, DRV_NAME "%d", skdev->devno);
44074327
skdev->dev_max_queue_depth = 0;
44084328

0 commit comments

Comments
 (0)