Skip to content

Commit 7b92b4f

Browse files
Alexander Gordeevbjorn-helgaas
authored andcommitted
PCI/MSI: Remove pci_enable_msi_block_auto()
The new pci_msi_vec_count() interface makes pci_enable_msi_block_auto() superfluous. Drivers can use pci_msi_vec_count() to learn the maximum number of MSIs supported by the device, and then call pci_enable_msi_block(). pci_enable_msi_block_auto() was introduced recently, and its only user is the AHCI driver, which is also updated by this change. Signed-off-by: Alexander Gordeev <agordeev@redhat.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Tejun Heo <tj@kernel.org>
1 parent d1ac1d2 commit 7b92b4f

File tree

4 files changed

+41
-86
lines changed

4 files changed

+41
-86
lines changed

Documentation/PCI/MSI-HOWTO.txt

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -127,49 +127,22 @@ on the number of vectors that can be allocated; pci_enable_msi_block()
127127
returns as soon as it finds any constraint that doesn't allow the
128128
call to succeed.
129129

130-
4.2.3 pci_enable_msi_block_auto
131-
132-
int pci_enable_msi_block_auto(struct pci_dev *dev, int *count)
133-
134-
This variation on pci_enable_msi() call allows a device driver to request
135-
the maximum possible number of MSIs. The MSI specification only allows
136-
interrupts to be allocated in powers of two, up to a maximum of 2^5 (32).
137-
138-
If this function returns a positive number, it indicates that it has
139-
succeeded and the returned value is the number of allocated interrupts. In
140-
this case, the function enables MSI on this device and updates dev->irq to
141-
be the lowest of the new interrupts assigned to it. The other interrupts
142-
assigned to the device are in the range dev->irq to dev->irq + returned
143-
value - 1.
144-
145-
If this function returns a negative number, it indicates an error and
146-
the driver should not attempt to request any more MSI interrupts for
147-
this device.
148-
149-
If the device driver needs to know the number of interrupts the device
150-
supports it can pass the pointer count where that number is stored. The
151-
device driver must decide what action to take if pci_enable_msi_block_auto()
152-
succeeds, but returns a value less than the number of interrupts supported.
153-
If the device driver does not need to know the number of interrupts
154-
supported, it can set the pointer count to NULL.
155-
156-
4.2.4 pci_disable_msi
130+
4.2.3 pci_disable_msi
157131

158132
void pci_disable_msi(struct pci_dev *dev)
159133

160134
This function should be used to undo the effect of pci_enable_msi() or
161-
pci_enable_msi_block() or pci_enable_msi_block_auto(). Calling it restores
162-
dev->irq to the pin-based interrupt number and frees the previously
163-
allocated message signaled interrupt(s). The interrupt may subsequently be
164-
assigned to another device, so drivers should not cache the value of
165-
dev->irq.
135+
pci_enable_msi_block(). Calling it restores dev->irq to the pin-based
136+
interrupt number and frees the previously allocated message signaled
137+
interrupt(s). The interrupt may subsequently be assigned to another
138+
device, so drivers should not cache the value of dev->irq.
166139

167140
Before calling this function, a device driver must always call free_irq()
168141
on any interrupt for which it previously called request_irq().
169142
Failure to do so results in a BUG_ON(), leaving the device with
170143
MSI enabled and thus leaking its vector.
171144

172-
4.2.5 pci_msi_vec_count
145+
4.2.4 pci_msi_vec_count
173146

174147
int pci_msi_vec_count(struct pci_dev *dev)
175148

drivers/ata/ahci.c

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,26 +1095,40 @@ static inline void ahci_gtf_filter_workaround(struct ata_host *host)
10951095
{}
10961096
#endif
10971097

1098-
int ahci_init_interrupts(struct pci_dev *pdev, struct ahci_host_priv *hpriv)
1098+
int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports,
1099+
struct ahci_host_priv *hpriv)
10991100
{
1100-
int rc;
1101-
unsigned int maxvec;
1101+
int rc, nvec;
11021102

1103-
if (!(hpriv->flags & AHCI_HFLAG_NO_MSI)) {
1104-
rc = pci_enable_msi_block_auto(pdev, &maxvec);
1105-
if (rc > 0) {
1106-
if ((rc == maxvec) || (rc == 1))
1107-
return rc;
1108-
/*
1109-
* Assume that advantage of multipe MSIs is negated,
1110-
* so fallback to single MSI mode to save resources
1111-
*/
1112-
pci_disable_msi(pdev);
1113-
if (!pci_enable_msi(pdev))
1114-
return 1;
1115-
}
1116-
}
1103+
if (hpriv->flags & AHCI_HFLAG_NO_MSI)
1104+
goto intx;
1105+
1106+
rc = pci_msi_vec_count(pdev);
1107+
if (rc < 0)
1108+
goto intx;
1109+
1110+
/*
1111+
* If number of MSIs is less than number of ports then Sharing Last
1112+
* Message mode could be enforced. In this case assume that advantage
1113+
* of multipe MSIs is negated and use single MSI mode instead.
1114+
*/
1115+
if (rc < n_ports)
1116+
goto single_msi;
1117+
1118+
nvec = rc;
1119+
rc = pci_enable_msi_block(pdev, nvec);
1120+
if (rc)
1121+
goto intx;
11171122

1123+
return nvec;
1124+
1125+
single_msi:
1126+
rc = pci_enable_msi(pdev);
1127+
if (rc)
1128+
goto intx;
1129+
return 1;
1130+
1131+
intx:
11181132
pci_intx(pdev, 1);
11191133
return 0;
11201134
}
@@ -1281,10 +1295,6 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
12811295

12821296
hpriv->mmio = pcim_iomap_table(pdev)[ahci_pci_bar];
12831297

1284-
n_msis = ahci_init_interrupts(pdev, hpriv);
1285-
if (n_msis > 1)
1286-
hpriv->flags |= AHCI_HFLAG_MULTI_MSI;
1287-
12881298
/* save initial config */
12891299
ahci_pci_save_initial_config(pdev, hpriv);
12901300

@@ -1339,6 +1349,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
13391349
*/
13401350
n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
13411351

1352+
n_msis = ahci_init_interrupts(pdev, n_ports, hpriv);
1353+
if (n_msis > 1)
1354+
hpriv->flags |= AHCI_HFLAG_MULTI_MSI;
1355+
13421356
host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
13431357
if (!host)
13441358
return -ENOMEM;

drivers/pci/msi.c

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -911,31 +911,6 @@ int pci_enable_msi_block(struct pci_dev *dev, int nvec)
911911
}
912912
EXPORT_SYMBOL(pci_enable_msi_block);
913913

914-
int pci_enable_msi_block_auto(struct pci_dev *dev, int *maxvec)
915-
{
916-
int ret, nvec;
917-
918-
if (dev->current_state != PCI_D0)
919-
return -EINVAL;
920-
921-
ret = pci_msi_vec_count(dev);
922-
if (ret < 0)
923-
return ret;
924-
925-
if (maxvec)
926-
*maxvec = ret;
927-
928-
do {
929-
nvec = ret;
930-
ret = pci_enable_msi_block(dev, nvec);
931-
} while (ret > 0);
932-
933-
if (ret < 0)
934-
return ret;
935-
return nvec;
936-
}
937-
EXPORT_SYMBOL(pci_enable_msi_block_auto);
938-
939914
void pci_msi_shutdown(struct pci_dev *dev)
940915
{
941916
struct msi_desc *desc;

include/linux/pci.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,12 +1164,6 @@ static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec)
11641164
return -ENOSYS;
11651165
}
11661166

1167-
static inline int
1168-
pci_enable_msi_block_auto(struct pci_dev *dev, int *maxvec)
1169-
{
1170-
return -ENOSYS;
1171-
}
1172-
11731167
static inline void pci_msi_shutdown(struct pci_dev *dev)
11741168
{ }
11751169
static inline void pci_disable_msi(struct pci_dev *dev)
@@ -1202,7 +1196,6 @@ static inline int pci_msi_enabled(void)
12021196
#else
12031197
int pci_msi_vec_count(struct pci_dev *dev);
12041198
int pci_enable_msi_block(struct pci_dev *dev, int nvec);
1205-
int pci_enable_msi_block_auto(struct pci_dev *dev, int *maxvec);
12061199
void pci_msi_shutdown(struct pci_dev *dev);
12071200
void pci_disable_msi(struct pci_dev *dev);
12081201
int pci_msix_table_size(struct pci_dev *dev);

0 commit comments

Comments
 (0)