From f3e6790b7986a4f9dd4a407901717ef8de3cbbc6 Mon Sep 17 00:00:00 2001 From: Jordan Hargrave Date: Tue, 25 Feb 2014 16:35:40 -0600 Subject: [PATCH] Add port structure to PCI device, handle multiple ports per BDF (Mellanox) --- src/pci.c | 21 +++++++++++++++++++++ src/pci.h | 7 +++++++ 2 files changed, 28 insertions(+) diff --git a/src/pci.c b/src/pci.c index e85cb03..a2d8145 100644 --- a/src/pci.c +++ b/src/pci.c @@ -121,6 +121,25 @@ static int pci_vpd_find_info_subkey(const u8 *buf, unsigned int off, unsigned in return -1; } +/* Add port identifier(s) to PCI device */ +static void add_port(struct pci_device *pdev, int port, int pfi) +{ + struct pci_port *p; + + list_for_each_entry(p, &pdev->ports, node) { + if (p->port == port && p->pfi == pfi) + return; + } + p = malloc(sizeof(*p)); + if (p == NULL) + return; + memset(p, 0, sizeof(*p)); + INIT_LIST_HEAD(&p->node); + p->port = port; + p->pfi = pfi; + list_add_tail(&p->node, &pdev->ports); +} + static int parse_vpd(struct libbiosdevname_state *state, struct pci_device *pdev, int len, unsigned char *vpd) { int i, j, k, isz, jsz, port, func, pfi; @@ -155,6 +174,7 @@ static int parse_vpd(struct libbiosdevname_state *state, struct pci_device *pdev pdev->pci_dev->bus, pdev->pci_dev->dev, func)) != NULL) { + add_port(vf, port, pfi); if (vf->vpd_port == INT_MAX) { vf->vpd_port = port; vf->vpd_pfi = pfi; @@ -597,6 +617,7 @@ static void add_pci_dev(struct libbiosdevname_state *state, INIT_LIST_HEAD(&dev->node); INIT_LIST_HEAD(&dev->vfnode); INIT_LIST_HEAD(&dev->vfs); + INIT_LIST_HEAD(&dev->ports); dev->pci_dev = p; dev->physical_slot = PHYSICAL_SLOT_UNKNOWN; dev->class = pci_read_word(p, PCI_CLASS_DEVICE); diff --git a/src/pci.h b/src/pci.h index 77b4746..eacb539 100644 --- a/src/pci.h +++ b/src/pci.h @@ -20,6 +20,12 @@ struct slotlist int count; }; +struct pci_port { + struct list_head node; + int port; + int pfi; +}; + struct pci_device { struct list_head node; struct pci_dev *pci_dev; @@ -44,6 +50,7 @@ struct pci_device { struct pci_device *pf; struct list_head vfnode; struct list_head vfs; + struct list_head ports; unsigned int is_sriov_physical_function:1; unsigned int is_sriov_virtual_function:1; unsigned int embedded_index_valid:1; -- 1.8.4.2