aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers/net/intelxl.c
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2022-03-09 00:24:22 +0000
committerMichael Brown <mcb30@ipxe.org>2022-08-10 12:29:47 +0100
commitb4216fa5063e464a16361bba247d49e8620a2cf2 (patch)
treeeaace0ba01029bad3d32dbbbcef61e8a10d1aabd /src/drivers/net/intelxl.c
parent1b61c2118ca54a8d9ad71cc402e7c9f6094f4ec6 (diff)
downloadipxe-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.c25
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 );