diff options
author | Michael Brown <mcb30@ipxe.org> | 2022-03-09 00:24:22 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2022-08-10 12:29:47 +0100 |
commit | b4216fa5063e464a16361bba247d49e8620a2cf2 (patch) | |
tree | eaace0ba01029bad3d32dbbbcef61e8a10d1aabd /src/drivers/net/intelxl.c | |
parent | 1b61c2118ca54a8d9ad71cc402e7c9f6094f4ec6 (diff) | |
download | ipxe-b4216fa5063e464a16361bba247d49e8620a2cf2.tar.gz |
[intelxl] Use non-zero MSI-X vector for virtual function interrupts
The 100 Gigabit physical function driver requires a virtual function
driver to request that transmit and receive queues are mapped to MSI-X
vector 1 or higher.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net/intelxl.c')
-rw-r--r-- | src/drivers/net/intelxl.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/drivers/net/intelxl.c b/src/drivers/net/intelxl.c index 20db51acf..a7fbd60f9 100644 --- a/src/drivers/net/intelxl.c +++ b/src/drivers/net/intelxl.c @@ -104,10 +104,11 @@ static int intelxl_fetch_mac ( struct intelxl_nic *intelxl, * * @v intelxl Intel device * @v pci PCI device + * @v vector MSI-X vector * @ret rc Return status code */ int intelxl_msix_enable ( struct intelxl_nic *intelxl, - struct pci_device *pci ) { + struct pci_device *pci, unsigned int vector ) { int rc; /* Map dummy target location */ @@ -126,12 +127,12 @@ int intelxl_msix_enable ( struct intelxl_nic *intelxl, goto err_enable; } - /* Configure interrupt zero to write to dummy location */ - pci_msix_map ( &intelxl->msix.cap, 0, + /* Configure interrupt to write to dummy location */ + pci_msix_map ( &intelxl->msix.cap, vector, dma ( &intelxl->msix.map, &intelxl->msix.msg ), 0 ); - /* Enable dummy interrupt zero */ - pci_msix_unmask ( &intelxl->msix.cap, 0 ); + /* Enable dummy interrupt */ + pci_msix_unmask ( &intelxl->msix.cap, vector ); return 0; @@ -147,12 +148,13 @@ int intelxl_msix_enable ( struct intelxl_nic *intelxl, * * @v intelxl Intel device * @v pci PCI device + * @v vector MSI-X vector */ void intelxl_msix_disable ( struct intelxl_nic *intelxl, - struct pci_device *pci ) { + struct pci_device *pci, unsigned int vector ) { - /* Disable dummy interrupt zero */ - pci_msix_mask ( &intelxl->msix.cap, 0 ); + /* Disable dummy interrupts */ + pci_msix_mask ( &intelxl->msix.cap, vector ); /* Disable MSI-X capability */ pci_msix_disable ( pci, &intelxl->msix.cap ); @@ -1707,7 +1709,8 @@ static int intelxl_probe ( struct pci_device *pci ) { goto err_fetch_mac; /* Enable MSI-X dummy interrupt */ - if ( ( rc = intelxl_msix_enable ( intelxl, pci ) ) != 0 ) + if ( ( rc = intelxl_msix_enable ( intelxl, pci, + INTELXL_MSIX_VECTOR ) ) != 0 ) goto err_msix; /* Open admin queues */ @@ -1767,7 +1770,7 @@ static int intelxl_probe ( struct pci_device *pci ) { err_admin_clear_pxe: intelxl_close_admin ( intelxl ); err_open_admin: - intelxl_msix_disable ( intelxl, pci ); + intelxl_msix_disable ( intelxl, pci, INTELXL_MSIX_VECTOR ); err_msix: err_fetch_mac: pci_reset ( pci, intelxl->exp ); @@ -1796,7 +1799,7 @@ static void intelxl_remove ( struct pci_device *pci ) { intelxl_close_admin ( intelxl ); /* Disable MSI-X dummy interrupt */ - intelxl_msix_disable ( intelxl, pci ); + intelxl_msix_disable ( intelxl, pci, INTELXL_MSIX_VECTOR ); /* Reset the NIC */ pci_reset ( pci, intelxl->exp ); |