Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 38418
b: refs/heads/master
c: 92db6d1
h: refs/heads/master
v: v3
  • Loading branch information
Eric W. Biederman authored and Linus Torvalds committed Oct 4, 2006
1 parent e18a1f7 commit 806fda4
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 96 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 38bc0361303535c86f6b67b151a541728d7bdae6
refs/heads/master: 92db6d10bc1bc43330a4c540fa5b64c83d9d865f
30 changes: 0 additions & 30 deletions trunk/arch/i386/pci/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -1169,33 +1169,3 @@ static int pirq_enable_irq(struct pci_dev *dev)
}
return 0;
}

int pci_vector_resources(int last, int nr_released)
{
int count = nr_released;

int next = last;
int offset = (last % 8);

while (next < FIRST_SYSTEM_VECTOR) {
next += 8;
#ifdef CONFIG_X86_64
if (next == IA32_SYSCALL_VECTOR)
continue;
#else
if (next == SYSCALL_VECTOR)
continue;
#endif
count++;
if (next >= FIRST_SYSTEM_VECTOR) {
if (offset%8) {
next = FIRST_DEVICE_VECTOR + offset;
offset++;
continue;
}
count--;
}
}

return count;
}
9 changes: 0 additions & 9 deletions trunk/arch/ia64/pci/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -810,12 +810,3 @@ pcibios_prep_mwi (struct pci_dev *dev)
}
return rc;
}

int pci_vector_resources(int last, int nr_released)
{
int count = nr_released;

count += (IA64_LAST_DEVICE_VECTOR - last);

return count;
}
53 changes: 8 additions & 45 deletions trunk/drivers/pci/msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ static kmem_cache_t* msi_cachep;
static int pci_msi_enable = 1;
static int last_alloc_vector;
static int nr_released_vectors;
static int nr_reserved_vectors = NR_HP_RESERVED_VECTORS;
static int nr_msix_devices;

#ifndef CONFIG_X86_IO_APIC
int vector_irq[NR_VECTORS] = { [0 ... NR_VECTORS - 1] = -1};
Expand Down Expand Up @@ -534,11 +532,6 @@ void pci_scan_msi_device(struct pci_dev *dev)
{
if (!dev)
return;

if (pci_find_capability(dev, PCI_CAP_ID_MSIX) > 0)
nr_msix_devices++;
else if (pci_find_capability(dev, PCI_CAP_ID_MSI) > 0)
nr_reserved_vectors++;
}

#ifdef CONFIG_PM
Expand Down Expand Up @@ -869,13 +862,19 @@ static int msix_capability_init(struct pci_dev *dev,
attach_msi_entry(entry, vector);
}
if (i != nvec) {
int avail = i - 1;
i--;
for (; i >= 0; i--) {
vector = (entries + i)->vector;
msi_free_vector(dev, vector, 0);
(entries + i)->vector = 0;
}
return -EBUSY;
/* If we had some success report the number of irqs
* we succeeded in setting up.
*/
if (avail <= 0)
avail = -EBUSY;
return avail;
}
/* Set MSI-X enabled bits */
enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
Expand Down Expand Up @@ -954,14 +953,6 @@ int pci_enable_msi(struct pci_dev* dev)
return -EINVAL;
}
status = msi_capability_init(dev);
if (!status) {
if (!pos)
nr_reserved_vectors--; /* Only MSI capable */
else if (nr_msix_devices > 0)
nr_msix_devices--; /* Both MSI and MSI-X capable,
but choose enabling MSI */
}

return status;
}

Expand Down Expand Up @@ -1070,10 +1061,9 @@ static int msi_free_vector(struct pci_dev* dev, int vector, int reassign)
**/
int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
{
int status, pos, nr_entries, free_vectors;
int status, pos, nr_entries;
int i, j, temp;
u16 control;
unsigned long flags;

if (!entries || pci_msi_supported(dev) < 0)
return -EINVAL;
Expand Down Expand Up @@ -1112,34 +1102,7 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
dev->irq = temp;
return -EINVAL;
}

spin_lock_irqsave(&msi_lock, flags);
/*
* msi_lock is provided to ensure that enough vectors resources are
* available before granting.
*/
free_vectors = pci_vector_resources(last_alloc_vector,
nr_released_vectors);
/* Ensure that each MSI/MSI-X device has one vector reserved by
default to avoid any MSI-X driver to take all available
resources */
free_vectors -= nr_reserved_vectors;
/* Find the average of free vectors among MSI-X devices */
if (nr_msix_devices > 0)
free_vectors /= nr_msix_devices;
spin_unlock_irqrestore(&msi_lock, flags);

if (nvec > free_vectors) {
if (free_vectors > 0)
return free_vectors;
else
return -EBUSY;
}

status = msix_capability_init(dev, entries, nvec);
if (!status && nr_msix_devices > 0)
nr_msix_devices--;

return status;
}

Expand Down
11 changes: 0 additions & 11 deletions trunk/drivers/pci/msi.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,8 @@

#include <asm/msi.h>

/*
* Assume the maximum number of hot plug slots supported by the system is about
* ten. The worstcase is that each of these slots is hot-added with a device,
* which has two MSI/MSI-X capable functions. To avoid any MSI-X driver, which
* attempts to request all available vectors, NR_HP_RESERVED_VECTORS is defined
* as below to ensure at least one message is assigned to each detected MSI/
* MSI-X device function.
*/
#define NR_HP_RESERVED_VECTORS 20

extern int vector_irq[NR_VECTORS];
extern void (*interrupt[NR_IRQS])(void);
extern int pci_vector_resources(int last, int nr_released);

/*
* MSI-X Address Register
Expand Down

0 comments on commit 806fda4

Please sign in to comment.