Skip to content

Commit e753774

Browse files
tlendackybjorn-helgaas
authored andcommitted
amd-xgbe: Update PCI support to use new IRQ functions
Some of the PCI MSI/MSI-X functions have been deprecated and it is recommended to use the new pci_alloc_irq_vectors() function. Convert the code over to use the new function. Also, modify the way in which the IRQs are requested - try for multiple MSI-X/MSI first, then a single MSI/legacy interrupt. Signed-off-by: Tom Lendacky <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]>
1 parent e8e8dd6 commit e753774

File tree

2 files changed

+41
-95
lines changed

2 files changed

+41
-95
lines changed

drivers/net/ethernet/amd/xgbe/xgbe-pci.c

Lines changed: 38 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -122,104 +122,40 @@
122122
#include "xgbe.h"
123123
#include "xgbe-common.h"
124124

125-
static int xgbe_config_msi(struct xgbe_prv_data *pdata)
125+
static int xgbe_config_multi_msi(struct xgbe_prv_data *pdata)
126126
{
127-
unsigned int msi_count;
127+
unsigned int vector_count;
128128
unsigned int i, j;
129129
int ret;
130130

131-
msi_count = XGBE_MSIX_BASE_COUNT;
132-
msi_count += max(pdata->rx_ring_count,
133-
pdata->tx_ring_count);
134-
msi_count = roundup_pow_of_two(msi_count);
131+
vector_count = XGBE_MSI_BASE_COUNT;
132+
vector_count += max(pdata->rx_ring_count,
133+
pdata->tx_ring_count);
135134

136-
ret = pci_enable_msi_exact(pdata->pcidev, msi_count);
135+
ret = pci_alloc_irq_vectors(pdata->pcidev, XGBE_MSI_MIN_COUNT,
136+
vector_count, PCI_IRQ_MSI | PCI_IRQ_MSIX);
137137
if (ret < 0) {
138-
dev_info(pdata->dev, "MSI request for %u interrupts failed\n",
139-
msi_count);
140-
141-
ret = pci_enable_msi(pdata->pcidev);
142-
if (ret < 0) {
143-
dev_info(pdata->dev, "MSI enablement failed\n");
144-
return ret;
145-
}
146-
147-
msi_count = 1;
148-
}
149-
150-
pdata->irq_count = msi_count;
151-
152-
pdata->dev_irq = pdata->pcidev->irq;
153-
154-
if (msi_count > 1) {
155-
pdata->ecc_irq = pdata->pcidev->irq + 1;
156-
pdata->i2c_irq = pdata->pcidev->irq + 2;
157-
pdata->an_irq = pdata->pcidev->irq + 3;
158-
159-
for (i = XGBE_MSIX_BASE_COUNT, j = 0;
160-
(i < msi_count) && (j < XGBE_MAX_DMA_CHANNELS);
161-
i++, j++)
162-
pdata->channel_irq[j] = pdata->pcidev->irq + i;
163-
pdata->channel_irq_count = j;
164-
165-
pdata->per_channel_irq = 1;
166-
pdata->channel_irq_mode = XGBE_IRQ_MODE_LEVEL;
167-
} else {
168-
pdata->ecc_irq = pdata->pcidev->irq;
169-
pdata->i2c_irq = pdata->pcidev->irq;
170-
pdata->an_irq = pdata->pcidev->irq;
171-
}
172-
173-
if (netif_msg_probe(pdata))
174-
dev_dbg(pdata->dev, "MSI interrupts enabled\n");
175-
176-
return 0;
177-
}
178-
179-
static int xgbe_config_msix(struct xgbe_prv_data *pdata)
180-
{
181-
unsigned int msix_count;
182-
unsigned int i, j;
183-
int ret;
184-
185-
msix_count = XGBE_MSIX_BASE_COUNT;
186-
msix_count += max(pdata->rx_ring_count,
187-
pdata->tx_ring_count);
188-
189-
pdata->msix_entries = devm_kcalloc(pdata->dev, msix_count,
190-
sizeof(struct msix_entry),
191-
GFP_KERNEL);
192-
if (!pdata->msix_entries)
193-
return -ENOMEM;
194-
195-
for (i = 0; i < msix_count; i++)
196-
pdata->msix_entries[i].entry = i;
197-
198-
ret = pci_enable_msix_range(pdata->pcidev, pdata->msix_entries,
199-
XGBE_MSIX_MIN_COUNT, msix_count);
200-
if (ret < 0) {
201-
dev_info(pdata->dev, "MSI-X enablement failed\n");
202-
devm_kfree(pdata->dev, pdata->msix_entries);
203-
pdata->msix_entries = NULL;
138+
dev_info(pdata->dev, "multi MSI/MSI-X enablement failed\n");
204139
return ret;
205140
}
206141

207142
pdata->irq_count = ret;
208143

209-
pdata->dev_irq = pdata->msix_entries[0].vector;
210-
pdata->ecc_irq = pdata->msix_entries[1].vector;
211-
pdata->i2c_irq = pdata->msix_entries[2].vector;
212-
pdata->an_irq = pdata->msix_entries[3].vector;
144+
pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
145+
pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 1);
146+
pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 2);
147+
pdata->an_irq = pci_irq_vector(pdata->pcidev, 3);
213148

214-
for (i = XGBE_MSIX_BASE_COUNT, j = 0; i < ret; i++, j++)
215-
pdata->channel_irq[j] = pdata->msix_entries[i].vector;
149+
for (i = XGBE_MSI_BASE_COUNT, j = 0; i < ret; i++, j++)
150+
pdata->channel_irq[j] = pci_irq_vector(pdata->pcidev, i);
216151
pdata->channel_irq_count = j;
217152

218153
pdata->per_channel_irq = 1;
219154
pdata->channel_irq_mode = XGBE_IRQ_MODE_LEVEL;
220155

221156
if (netif_msg_probe(pdata))
222-
dev_dbg(pdata->dev, "MSI-X interrupts enabled\n");
157+
dev_dbg(pdata->dev, "multi %s interrupts enabled\n",
158+
pdata->pcidev->msix_enabled ? "MSI-X" : "MSI");
223159

224160
return 0;
225161
}
@@ -228,21 +164,28 @@ static int xgbe_config_irqs(struct xgbe_prv_data *pdata)
228164
{
229165
int ret;
230166

231-
ret = xgbe_config_msix(pdata);
167+
ret = xgbe_config_multi_msi(pdata);
232168
if (!ret)
233169
goto out;
234170

235-
ret = xgbe_config_msi(pdata);
236-
if (!ret)
237-
goto out;
171+
ret = pci_alloc_irq_vectors(pdata->pcidev, 1, 1,
172+
PCI_IRQ_LEGACY | PCI_IRQ_MSI);
173+
if (ret < 0) {
174+
dev_info(pdata->dev, "single IRQ enablement failed\n");
175+
return ret;
176+
}
238177

239178
pdata->irq_count = 1;
240-
pdata->irq_shared = 1;
179+
pdata->channel_irq_count = 1;
180+
181+
pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
182+
pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 0);
183+
pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 0);
184+
pdata->an_irq = pci_irq_vector(pdata->pcidev, 0);
241185

242-
pdata->dev_irq = pdata->pcidev->irq;
243-
pdata->ecc_irq = pdata->pcidev->irq;
244-
pdata->i2c_irq = pdata->pcidev->irq;
245-
pdata->an_irq = pdata->pcidev->irq;
186+
if (netif_msg_probe(pdata))
187+
dev_dbg(pdata->dev, "single %s interrupt enabled\n",
188+
pdata->pcidev->msi_enabled ? "MSI" : "legacy");
246189

247190
out:
248191
if (netif_msg_probe(pdata)) {
@@ -412,12 +355,15 @@ static int xgbe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
412355
/* Configure the netdev resource */
413356
ret = xgbe_config_netdev(pdata);
414357
if (ret)
415-
goto err_pci_enable;
358+
goto err_irq_vectors;
416359

417360
netdev_notice(pdata->netdev, "net device enabled\n");
418361

419362
return 0;
420363

364+
err_irq_vectors:
365+
pci_free_irq_vectors(pdata->pcidev);
366+
421367
err_pci_enable:
422368
xgbe_free_pdata(pdata);
423369

@@ -433,6 +379,8 @@ static void xgbe_pci_remove(struct pci_dev *pdev)
433379

434380
xgbe_deconfig_netdev(pdata);
435381

382+
pci_free_irq_vectors(pdata->pcidev);
383+
436384
xgbe_free_pdata(pdata);
437385
}
438386

drivers/net/ethernet/amd/xgbe/xgbe.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,9 @@
211211
#define XGBE_MAC_PROP_OFFSET 0x1d000
212212
#define XGBE_I2C_CTRL_OFFSET 0x1e000
213213

214-
/* PCI MSIx support */
215-
#define XGBE_MSIX_BASE_COUNT 4
216-
#define XGBE_MSIX_MIN_COUNT (XGBE_MSIX_BASE_COUNT + 1)
214+
/* PCI MSI/MSIx support */
215+
#define XGBE_MSI_BASE_COUNT 4
216+
#define XGBE_MSI_MIN_COUNT (XGBE_MSI_BASE_COUNT + 1)
217217

218218
/* PCI clock frequencies */
219219
#define XGBE_V2_DMA_CLOCK_FREQ 500000000 /* 500 MHz */
@@ -980,14 +980,12 @@ struct xgbe_prv_data {
980980
unsigned int desc_ded_count;
981981
unsigned int desc_sec_count;
982982

983-
struct msix_entry *msix_entries;
984983
int dev_irq;
985984
int ecc_irq;
986985
int i2c_irq;
987986
int channel_irq[XGBE_MAX_DMA_CHANNELS];
988987

989988
unsigned int per_channel_irq;
990-
unsigned int irq_shared;
991989
unsigned int irq_count;
992990
unsigned int channel_irq_count;
993991
unsigned int channel_irq_mode;

0 commit comments

Comments
 (0)