summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2019-04-24 18:11:31 +0200
committerMichael Brown2019-04-27 21:26:18 +0200
commit1e0342ebd8590036c7dee8ad9f43a0ed56cded68 (patch)
treeb94f86434f324f9e86cc026d7d67de791efd5254
parent[intelxl] Split out ring creation from context programming (diff)
downloadipxe-1e0342ebd8590036c7dee8ad9f43a0ed56cded68.tar.gz
ipxe-1e0342ebd8590036c7dee8ad9f43a0ed56cded68.tar.xz
ipxe-1e0342ebd8590036c7dee8ad9f43a0ed56cded68.zip
[intelxl] Allow for arbitrary placement of interrupt control register
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/net/intelxl.c15
-rw-r--r--src/drivers/net/intelxl.h8
2 files changed, 11 insertions, 12 deletions
diff --git a/src/drivers/net/intelxl.c b/src/drivers/net/intelxl.c
index 3e6f460a..3a59a746 100644
--- a/src/drivers/net/intelxl.c
+++ b/src/drivers/net/intelxl.c
@@ -1509,9 +1509,9 @@ static void intelxl_poll ( struct net_device *netdev ) {
/* Acknowledge interrupts, if applicable */
if ( netdev_irq_enabled ( netdev ) ) {
- writel ( ( INTELXL_PFINT_DYN_CTL0_CLEARPBA |
- INTELXL_PFINT_DYN_CTL0_INTENA_MASK ),
- intelxl->regs + INTELXL_PFINT_DYN_CTL0 );
+ writel ( ( INTELXL_INT_DYN_CTL_CLEARPBA |
+ INTELXL_INT_DYN_CTL_INTENA_MASK ),
+ ( intelxl->regs + intelxl->intr ) );
}
/* Poll for completed packets */
@@ -1536,12 +1536,8 @@ static void intelxl_poll ( struct net_device *netdev ) {
static void intelxl_irq ( struct net_device *netdev, int enable ) {
struct intelxl_nic *intelxl = netdev->priv;
- if ( enable ) {
- writel ( INTELXL_PFINT_DYN_CTL0_INTENA,
- intelxl->regs + INTELXL_PFINT_DYN_CTL0 );
- } else {
- writel ( 0, intelxl->regs + INTELXL_PFINT_DYN_CTL0 );
- }
+ writel ( ( enable ? INTELXL_INT_DYN_CTL_INTENA : 0 ),
+ ( intelxl->regs + intelxl->intr ) );
}
/** Network device operations */
@@ -1585,6 +1581,7 @@ static int intelxl_probe ( struct pci_device *pci ) {
netdev->dev = &pci->dev;
memset ( intelxl, 0, sizeof ( *intelxl ) );
intelxl->pf = PCI_FUNC ( pci->busdevfn );
+ intelxl->intr = INTELXL_PFINT_DYN_CTL0;
intelxl_init_admin ( &intelxl->command, INTELXL_ADMIN_CMD,
&intelxl_admin_offsets );
intelxl_init_admin ( &intelxl->event, INTELXL_ADMIN_EVT,
diff --git a/src/drivers/net/intelxl.h b/src/drivers/net/intelxl.h
index 7a3f4d7f..8158e072 100644
--- a/src/drivers/net/intelxl.h
+++ b/src/drivers/net/intelxl.h
@@ -735,9 +735,9 @@ intelxl_init_ring ( struct intelxl_ring *ring, unsigned int count, size_t len,
/** PF Interrupt Zero Dynamic Control Register */
#define INTELXL_PFINT_DYN_CTL0 0x038480
-#define INTELXL_PFINT_DYN_CTL0_INTENA 0x00000001UL /**< Enable */
-#define INTELXL_PFINT_DYN_CTL0_CLEARPBA 0x00000002UL /**< Acknowledge */
-#define INTELXL_PFINT_DYN_CTL0_INTENA_MASK 0x80000000UL /**< Ignore enable */
+#define INTELXL_INT_DYN_CTL_INTENA 0x00000001UL /**< Enable */
+#define INTELXL_INT_DYN_CTL_CLEARPBA 0x00000002UL /**< Acknowledge */
+#define INTELXL_INT_DYN_CTL_INTENA_MASK 0x80000000UL /**< Ignore enable */
/** PF Interrupt Zero Linked List Register */
#define INTELXL_PFINT_LNKLST0 0x038500
@@ -835,6 +835,8 @@ struct intelxl_nic {
unsigned int vsi;
/** Queue set handle */
unsigned int qset;
+ /** Interrupt control register */
+ unsigned int intr;
/** Admin command queue */
struct intelxl_admin command;