msi_enabled field is used in per Adapter structure (struct aac_dev). If the driver uses MSIx or MSI interrupt mode, this will be set.
Before posting the commands (for each and every command requests) to the Adapter and vector number assignments, this will be checked. Thanks, Mahesh -----Original Message----- From: Johannes Thumshirn [mailto:morbid...@gmail.com] Sent: Friday, March 27, 2015 6:59 PM To: Mahesh Rajashekhara Cc: h...@suse.de; jbottom...@parallels.com; linux-scsi@vger.kernel.org; Achim Leubner Subject: Re: [V2 PATCH 04/11] aacraid: MSI-x support Mahesh Rajashekhara <mahesh.rajashekh...@pmcs.com> writes: > Add MSI-x interrupt mode support. > > Signed-off-by: Mahesh Rajashekhara <mahesh.rajashekh...@pmcs.com> > --- > drivers/scsi/aacraid/aacraid.h | 80 ++++++++- > drivers/scsi/aacraid/comminit.c | 95 +++++++++- > drivers/scsi/aacraid/commsup.c | 20 ++- > drivers/scsi/aacraid/dpcsup.c | 9 +- > drivers/scsi/aacraid/linit.c | 20 ++- > drivers/scsi/aacraid/src.c | 388 > ++++++++++++++++++++++++++++++--------- > 6 files changed, 505 insertions(+), 107 deletions(-) > > diff --git a/drivers/scsi/aacraid/aacraid.h > b/drivers/scsi/aacraid/aacraid.h index 9e38b20..015c341 100644 > --- a/drivers/scsi/aacraid/aacraid.h > +++ b/drivers/scsi/aacraid/aacraid.h > @@ -6,11 +6,61 @@ > #define nblank(x) _nblank(x)[0] > > #include <linux/interrupt.h> > +#include <linux/pci.h> > > > /*------------------------------------------------------------------------------ > * D E F I N E S > > *--------------------------------------------------------------------- > -------*/ > > +#define AAC_MAX_MSIX 32 /* vectors */ > +#define AAC_PCI_MSI_ENABLE 0x8000 > + > +enum { > + AAC_ENABLE_INTERRUPT = 0x0, > + AAC_DISABLE_INTERRUPT, > + AAC_ENABLE_MSIX, > + AAC_DISABLE_MSIX, > + AAC_CLEAR_AIF_BIT, > + AAC_CLEAR_SYNC_BIT, > + AAC_ENABLE_INTX > +}; > + > +#define AAC_INT_MODE_INTX (1<<0) > +#define AAC_INT_MODE_MSI (1<<1) > +#define AAC_INT_MODE_AIF (1<<2) > +#define AAC_INT_MODE_SYNC (1<<3) > + > +#define AAC_INT_ENABLE_TYPE1_INTX 0xfffffffb > +#define AAC_INT_ENABLE_TYPE1_MSIX 0xfffffffa > +#define AAC_INT_DISABLE_ALL 0xffffffff > + > +/* Bit definitions in IOA->Host Interrupt Register */ > +#define PMC_TRANSITION_TO_OPERATIONAL (1<<31) > +#define PMC_IOARCB_TRANSFER_FAILED (1<<28) > +#define PMC_IOA_UNIT_CHECK (1<<27) > +#define PMC_NO_HOST_RRQ_FOR_CMD_RESPONSE (1<<26) > +#define PMC_CRITICAL_IOA_OP_IN_PROGRESS (1<<25) > +#define PMC_IOARRIN_LOST (1<<4) > +#define PMC_SYSTEM_BUS_MMIO_ERROR (1<<3) > +#define PMC_IOA_PROCESSOR_IN_ERROR_STATE (1<<2) > +#define PMC_HOST_RRQ_VALID (1<<1) > +#define PMC_OPERATIONAL_STATUS (1<<31) > +#define PMC_ALLOW_MSIX_VECTOR0 (1<<0) > + > +#define PMC_IOA_ERROR_INTERRUPTS (PMC_IOARCB_TRANSFER_FAILED | \ > + PMC_IOA_UNIT_CHECK | \ > + PMC_NO_HOST_RRQ_FOR_CMD_RESPONSE | \ > + PMC_IOARRIN_LOST | \ > + PMC_SYSTEM_BUS_MMIO_ERROR | \ > + PMC_IOA_PROCESSOR_IN_ERROR_STATE) > + > +#define PMC_ALL_INTERRUPT_BITS (PMC_IOA_ERROR_INTERRUPTS | \ > + PMC_HOST_RRQ_VALID | \ > + PMC_TRANSITION_TO_OPERATIONAL | \ > + PMC_ALLOW_MSIX_VECTOR0) > +#define PMC_GLOBAL_INT_BIT2 0x00000004 > +#define PMC_GLOBAL_INT_BIT0 0x00000001 > + > #ifndef AAC_DRIVER_BUILD > # define AAC_DRIVER_BUILD 30300 > # define AAC_DRIVER_BRANCH "-ms" > @@ -36,6 +86,7 @@ > #define CONTAINER_TO_ID(cont) (cont) > #define CONTAINER_TO_LUN(cont) (0) > > +#define PMC_DEVICE_S6 0x28b > #define PMC_DEVICE_S7 0x28c > #define PMC_DEVICE_S8 0x28d > #define PMC_DEVICE_S9 0x28f > @@ -434,7 +485,7 @@ enum fib_xfer_state { struct aac_init { > __le32 InitStructRevision; > - __le32 MiniPortRevision; > + __le32 Sa_MSIXVectors; > __le32 fsrev; > __le32 CommHeaderAddress; > __le32 FastIoCommAreaAddress; > @@ -755,7 +806,8 @@ struct rkt_registers { > > struct src_mu_registers { > /* PCI*| Name */ > - __le32 reserved0[8]; /* 00h | Reserved */ > + __le32 reserved0[6]; /* 00h | Reserved */ > + __le32 IOAR[2]; /* 18h | IOA->host interrupt register */ > __le32 IDR; /* 20h | Inbound Doorbell Register */ > __le32 IISR; /* 24h | Inbound Int. Status Register */ > __le32 reserved1[3]; /* 28h | Reserved */ > @@ -767,17 +819,18 @@ struct src_mu_registers { > __le32 OMR; /* bch | Outbound Message Register */ > __le32 IQ_L; /* c0h | Inbound Queue (Low address) */ > __le32 IQ_H; /* c4h | Inbound Queue (High address) */ > + __le32 ODR_MSI; /* c8h | MSI register for sync./AIF */ > }; > > struct src_registers { > - struct src_mu_registers MUnit; /* 00h - c7h */ > + struct src_mu_registers MUnit; /* 00h - cbh */ > union { > struct { > - __le32 reserved1[130790]; /* c8h - 7fc5fh */ > + __le32 reserved1[130789]; /* cch - 7fc5fh */ > struct src_inbound IndexRegs; /* 7fc60h */ > } tupelo; > struct { > - __le32 reserved1[974]; /* c8h - fffh */ > + __le32 reserved1[973]; /* cch - fffh */ > struct src_inbound IndexRegs; /* 1000h */ > } denali; > } u; > @@ -1029,6 +1082,11 @@ struct aac_bus_info_response { > #define AAC_OPT_NEW_COMM_TYPE3 cpu_to_le32(1<<30) > #define AAC_OPT_NEW_COMM_TYPE4 cpu_to_le32(1<<31) > > +/* MSIX context */ > +struct aac_msix_ctx { > + int vector_no; > + struct aac_dev *dev; > +}; > > struct aac_dev > { > @@ -1084,8 +1142,10 @@ struct aac_dev > * if AAC_COMM_MESSAGE_TYPE1 */ > > dma_addr_t host_rrq_pa; /* phys. address */ > - u32 host_rrq_idx; /* index into rrq buffer */ > - > + /* index into rrq buffer */ > + u32 host_rrq_idx[AAC_MAX_MSIX]; > + atomic_t rrq_outstanding[AAC_MAX_MSIX]; > + u32 fibs_pushed_no; > struct pci_dev *pdev; /* Our PCI interface */ > void * printfbuf; /* pointer to buffer used for > printf's from the adapter */ > void * comm_addr; /* Base address of Comm area */ > @@ -1154,6 +1214,11 @@ struct aac_dev > int sync_mode; > struct fib *sync_fib; > struct list_head sync_fib_list; > + u32 max_msix; /* max. MSI-X vectors */ > + u32 vector_cap; /* MSI-X vector capab.*/ > + int msi_enabled; /* MSI/MSI-X enabled */ Is there a specific reason why you're not using the msi_enabled / msix_enabled field of struct pci_dev, or even calling pci_dev_msi_enabled() instead of duplicating it here? Thanks, Johannes -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html