Commit d1ef4da8 authored by Raghava Aditya Renukunta's avatar Raghava Aditya Renukunta Committed by Martin K. Petersen

scsi: aacraid: added support for init_struct_8

This  patch lays the groundwork for supporting the new HBA-1000 controller
family.A new INIT structure INIT_STRUCT_8 has been added which allows for a
variable size for MSI-x vectors among other things,  and is used for both
Series-8, HBA-1000 and SmartIOC-2000.
Signed-off-by: default avatarRaghava Aditya Renukunta <raghavaaditya.renukunta@microsemi.com>
Signed-off-by: default avatarDave Carroll <David.Carroll@microsemi.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 24b043cb
...@@ -1144,7 +1144,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3 ...@@ -1144,7 +1144,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
long ret; long ret;
aac_fib_init(fib); aac_fib_init(fib);
if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) { if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 ||
dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) &&
!dev->sync_mode) {
struct aac_raw_io2 *readcmd2; struct aac_raw_io2 *readcmd2;
readcmd2 = (struct aac_raw_io2 *) fib_data(fib); readcmd2 = (struct aac_raw_io2 *) fib_data(fib);
memset(readcmd2, 0, sizeof(struct aac_raw_io2)); memset(readcmd2, 0, sizeof(struct aac_raw_io2));
...@@ -1270,7 +1272,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u ...@@ -1270,7 +1272,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
long ret; long ret;
aac_fib_init(fib); aac_fib_init(fib);
if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) { if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 ||
dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) &&
!dev->sync_mode) {
struct aac_raw_io2 *writecmd2; struct aac_raw_io2 *writecmd2;
writecmd2 = (struct aac_raw_io2 *) fib_data(fib); writecmd2 = (struct aac_raw_io2 *) fib_data(fib);
memset(writecmd2, 0, sizeof(struct aac_raw_io2)); memset(writecmd2, 0, sizeof(struct aac_raw_io2));
......
...@@ -81,6 +81,11 @@ enum { ...@@ -81,6 +81,11 @@ enum {
#define AAC_DEBUG_INSTRUMENT_AIF_DELETE #define AAC_DEBUG_INSTRUMENT_AIF_DELETE
/*
* Interrupts
*/
#define AAC_MAX_HRRQ 64
/* /*
* These macros convert from physical channels to virtual channels * These macros convert from physical channels to virtual channels
*/ */
...@@ -491,41 +496,64 @@ enum fib_xfer_state { ...@@ -491,41 +496,64 @@ enum fib_xfer_state {
#define ADAPTER_INIT_STRUCT_REVISION_4 4 // rocket science #define ADAPTER_INIT_STRUCT_REVISION_4 4 // rocket science
#define ADAPTER_INIT_STRUCT_REVISION_6 6 /* PMC src */ #define ADAPTER_INIT_STRUCT_REVISION_6 6 /* PMC src */
#define ADAPTER_INIT_STRUCT_REVISION_7 7 /* Denali */ #define ADAPTER_INIT_STRUCT_REVISION_7 7 /* Denali */
#define ADAPTER_INIT_STRUCT_REVISION_8 8 // Thor
struct aac_init union aac_init
{ {
__le32 InitStructRevision; struct _r7 {
__le32 Sa_MSIXVectors; __le32 init_struct_revision;
__le32 fsrev; __le32 no_of_msix_vectors;
__le32 CommHeaderAddress; __le32 fsrev;
__le32 FastIoCommAreaAddress; __le32 comm_header_address;
__le32 AdapterFibsPhysicalAddress; __le32 fast_io_comm_area_address;
__le32 AdapterFibsVirtualAddress; __le32 adapter_fibs_physical_address;
__le32 AdapterFibsSize; __le32 adapter_fibs_virtual_address;
__le32 AdapterFibAlign; __le32 adapter_fibs_size;
__le32 printfbuf; __le32 adapter_fib_align;
__le32 printfbufsiz; __le32 printfbuf;
__le32 HostPhysMemPages; /* number of 4k pages of host __le32 printfbufsiz;
physical memory */ /* number of 4k pages of host phys. mem. */
__le32 HostElapsedSeconds; /* number of seconds since 1970. */ __le32 host_phys_mem_pages;
/* /* number of seconds since 1970. */
* ADAPTER_INIT_STRUCT_REVISION_4 begins here __le32 host_elapsed_seconds;
*/ /* ADAPTER_INIT_STRUCT_REVISION_4 begins here */
__le32 InitFlags; /* flags for supported features */ __le32 init_flags; /* flags for supported features */
#define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001 #define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001
#define INITFLAGS_DRIVER_USES_UTC_TIME 0x00000010 #define INITFLAGS_DRIVER_USES_UTC_TIME 0x00000010
#define INITFLAGS_DRIVER_SUPPORTS_PM 0x00000020 #define INITFLAGS_DRIVER_SUPPORTS_PM 0x00000020
#define INITFLAGS_NEW_COMM_TYPE1_SUPPORTED 0x00000040 #define INITFLAGS_NEW_COMM_TYPE1_SUPPORTED 0x00000040
#define INITFLAGS_FAST_JBOD_SUPPORTED 0x00000080 #define INITFLAGS_FAST_JBOD_SUPPORTED 0x00000080
#define INITFLAGS_NEW_COMM_TYPE2_SUPPORTED 0x00000100 #define INITFLAGS_NEW_COMM_TYPE2_SUPPORTED 0x00000100
__le32 MaxIoCommands; /* max outstanding commands */ #define INITFLAGS_DRIVER_SUPPORTS_HBA_MODE 0x00000400
__le32 MaxIoSize; /* largest I/O command */ __le32 max_io_commands; /* max outstanding commands */
__le32 MaxFibSize; /* largest FIB to adapter */ __le32 max_io_size; /* largest I/O command */
/* ADAPTER_INIT_STRUCT_REVISION_5 begins here */ __le32 max_fib_size; /* largest FIB to adapter */
__le32 MaxNumAif; /* max number of aif */ /* ADAPTER_INIT_STRUCT_REVISION_5 begins here */
/* ADAPTER_INIT_STRUCT_REVISION_6 begins here */ __le32 max_num_aif; /* max number of aif */
__le32 HostRRQ_AddrLow; /* ADAPTER_INIT_STRUCT_REVISION_6 begins here */
__le32 HostRRQ_AddrHigh; /* Host RRQ (response queue) for SRC */ /* Host RRQ (response queue) for SRC */
__le32 host_rrq_addr_low;
__le32 host_rrq_addr_high;
} r7;
struct _r8 {
/* ADAPTER_INIT_STRUCT_REVISION_8 */
__le32 init_struct_revision;
__le32 rr_queue_count;
__le32 host_elapsed_seconds; /* number of secs since 1970. */
__le32 init_flags;
__le32 max_io_size; /* largest I/O command */
__le32 max_num_aif; /* max number of aif */
__le32 reserved1;
__le32 reserved2;
struct _rrq {
__le32 host_addr_low;
__le32 host_addr_high;
__le16 msix_id;
__le16 element_count;
__le16 comp_thresh;
__le16 unused;
} rrq[1]; /* up to 64 RRQ addresses */
} r8;
}; };
enum aac_log_level { enum aac_log_level {
...@@ -729,6 +757,7 @@ struct sa_registers { ...@@ -729,6 +757,7 @@ struct sa_registers {
#define SA_INIT_NUM_MSIXVECTORS 1 #define SA_INIT_NUM_MSIXVECTORS 1
#define SA_MINIPORT_REVISION SA_INIT_NUM_MSIXVECTORS
#define sa_readw(AEP, CSR) readl(&((AEP)->regs.sa->CSR)) #define sa_readw(AEP, CSR) readl(&((AEP)->regs.sa->CSR))
#define sa_readl(AEP, CSR) readl(&((AEP)->regs.sa->CSR)) #define sa_readl(AEP, CSR) readl(&((AEP)->regs.sa->CSR))
...@@ -1106,6 +1135,12 @@ struct aac_bus_info_response { ...@@ -1106,6 +1135,12 @@ struct aac_bus_info_response {
#define AAC_OPT_NEW_COMM_TYPE3 cpu_to_le32(1<<30) #define AAC_OPT_NEW_COMM_TYPE3 cpu_to_le32(1<<30)
#define AAC_OPT_NEW_COMM_TYPE4 cpu_to_le32(1<<31) #define AAC_OPT_NEW_COMM_TYPE4 cpu_to_le32(1<<31)
#define AAC_COMM_PRODUCER 0
#define AAC_COMM_MESSAGE 1
#define AAC_COMM_MESSAGE_TYPE1 3
#define AAC_COMM_MESSAGE_TYPE2 4
#define AAC_COMM_MESSAGE_TYPE3 5
/* MSIX context */ /* MSIX context */
struct aac_msix_ctx { struct aac_msix_ctx {
int vector_no; int vector_no;
...@@ -1159,8 +1194,11 @@ struct aac_dev ...@@ -1159,8 +1194,11 @@ struct aac_dev
resource_size_t base_size, dbg_size; /* Size of resource_size_t base_size, dbg_size; /* Size of
* mapped in region */ * mapped in region */
/*
struct aac_init *init; /* Holds initialization info to communicate with adapter */ * Holds initialization info
* to communicate with adapter
*/
union aac_init *init;
dma_addr_t init_pa; /* Holds physical address of the init struct */ dma_addr_t init_pa; /* Holds physical address of the init struct */
u32 *host_rrq; /* response queue u32 *host_rrq; /* response queue
...@@ -1229,10 +1267,6 @@ struct aac_dev ...@@ -1229,10 +1267,6 @@ struct aac_dev
u8 needs_dac; u8 needs_dac;
u8 raid_scsi_mode; u8 raid_scsi_mode;
u8 comm_interface; u8 comm_interface;
# define AAC_COMM_PRODUCER 0
# define AAC_COMM_MESSAGE 1
# define AAC_COMM_MESSAGE_TYPE1 3
# define AAC_COMM_MESSAGE_TYPE2 4
u8 raw_io_interface; u8 raw_io_interface;
u8 raw_io_64; u8 raw_io_64;
u8 printf_enabled; u8 printf_enabled;
......
This diff is collapsed.
...@@ -129,11 +129,14 @@ int aac_fib_setup(struct aac_dev * dev) ...@@ -129,11 +129,14 @@ int aac_fib_setup(struct aac_dev * dev)
struct hw_fib *hw_fib; struct hw_fib *hw_fib;
dma_addr_t hw_fib_pa; dma_addr_t hw_fib_pa;
int i; int i;
u32 max_cmds;
while (((i = fib_map_alloc(dev)) == -ENOMEM) while (((i = fib_map_alloc(dev)) == -ENOMEM)
&& (dev->scsi_host_ptr->can_queue > (64 - AAC_NUM_MGT_FIB))) { && (dev->scsi_host_ptr->can_queue > (64 - AAC_NUM_MGT_FIB))) {
dev->init->MaxIoCommands = cpu_to_le32((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) >> 1); max_cmds = (dev->scsi_host_ptr->can_queue+AAC_NUM_MGT_FIB) >> 1;
dev->scsi_host_ptr->can_queue = le32_to_cpu(dev->init->MaxIoCommands) - AAC_NUM_MGT_FIB; dev->scsi_host_ptr->can_queue = max_cmds - AAC_NUM_MGT_FIB;
if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3)
dev->init->r7.max_io_commands = cpu_to_le32(max_cmds);
} }
if (i<0) if (i<0)
return -ENOMEM; return -ENOMEM;
...@@ -761,7 +764,8 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) ...@@ -761,7 +764,8 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
unsigned long qflags; unsigned long qflags;
if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 || if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 ||
dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 ||
dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) {
kfree(hw_fib); kfree(hw_fib);
return 0; return 0;
} }
...@@ -1817,7 +1821,8 @@ int aac_command_thread(void *data) ...@@ -1817,7 +1821,8 @@ int aac_command_thread(void *data)
* and pre-allocate a set of fibs outside the * and pre-allocate a set of fibs outside the
* lock. * lock.
*/ */
num = le32_to_cpu(dev->init->AdapterFibsSize) num = le32_to_cpu(dev->init->
r7.adapter_fibs_size)
/ sizeof(struct hw_fib); /* some extra */ / sizeof(struct hw_fib); /* some extra */
spin_lock_irqsave(&dev->fib_lock, flagv); spin_lock_irqsave(&dev->fib_lock, flagv);
entry = dev->fib_list.next; entry = dev->fib_list.next;
......
...@@ -1368,7 +1368,7 @@ static int aac_acquire_resources(struct aac_dev *dev) ...@@ -1368,7 +1368,7 @@ static int aac_acquire_resources(struct aac_dev *dev)
/* After EEH recovery or suspend resume, max_msix count /* After EEH recovery or suspend resume, max_msix count
* may change, therfore updating in init as well. * may change, therfore updating in init as well.
*/ */
dev->init->Sa_MSIXVectors = cpu_to_le32(dev->max_msix); dev->init->r7.no_of_msix_vectors = cpu_to_le32(dev->max_msix);
aac_adapter_start(dev); aac_adapter_start(dev);
} }
return 0; return 0;
......
...@@ -60,7 +60,7 @@ static int aac_rkt_select_comm(struct aac_dev *dev, int comm) ...@@ -60,7 +60,7 @@ static int aac_rkt_select_comm(struct aac_dev *dev, int comm)
* case warrants this half baked, but convenient, check here. * case warrants this half baked, but convenient, check here.
*/ */
if (dev->scsi_host_ptr->can_queue > AAC_NUM_IO_FIB_RKT) { if (dev->scsi_host_ptr->can_queue > AAC_NUM_IO_FIB_RKT) {
dev->init->MaxIoCommands = dev->init->r7.max_io_commands =
cpu_to_le32(AAC_NUM_IO_FIB_RKT + AAC_NUM_MGT_FIB); cpu_to_le32(AAC_NUM_IO_FIB_RKT + AAC_NUM_MGT_FIB);
dev->scsi_host_ptr->can_queue = AAC_NUM_IO_FIB_RKT; dev->scsi_host_ptr->can_queue = AAC_NUM_IO_FIB_RKT;
} }
......
...@@ -315,10 +315,10 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event) ...@@ -315,10 +315,10 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event)
static void aac_rx_start_adapter(struct aac_dev *dev) static void aac_rx_start_adapter(struct aac_dev *dev)
{ {
struct aac_init *init; union aac_init *init;
init = dev->init; init = dev->init;
init->HostElapsedSeconds = cpu_to_le32(get_seconds()); init->r7.host_elapsed_seconds = cpu_to_le32(get_seconds());
// We can only use a 32 bit address here // We can only use a 32 bit address here
rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL); 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
......
...@@ -245,12 +245,12 @@ static void aac_sa_interrupt_adapter (struct aac_dev *dev) ...@@ -245,12 +245,12 @@ static void aac_sa_interrupt_adapter (struct aac_dev *dev)
static void aac_sa_start_adapter(struct aac_dev *dev) static void aac_sa_start_adapter(struct aac_dev *dev)
{ {
struct aac_init *init; union aac_init *init;
/* /*
* Fill in the remaining pieces of the init. * Fill in the remaining pieces of the init.
*/ */
init = dev->init; init = dev->init;
init->HostElapsedSeconds = cpu_to_le32(get_seconds()); init->r7.host_elapsed_seconds = cpu_to_le32(get_seconds());
/* We can only use a 32 bit address here */ /* We can only use a 32 bit address here */
sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS,
(u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0, (u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0,
......
...@@ -384,7 +384,7 @@ static void aac_src_notify_adapter(struct aac_dev *dev, u32 event) ...@@ -384,7 +384,7 @@ static void aac_src_notify_adapter(struct aac_dev *dev, u32 event)
static void aac_src_start_adapter(struct aac_dev *dev) static void aac_src_start_adapter(struct aac_dev *dev)
{ {
struct aac_init *init; union aac_init *init;
int i; int i;
/* reset host_rrq_idx first */ /* reset host_rrq_idx first */
...@@ -395,11 +395,22 @@ static void aac_src_start_adapter(struct aac_dev *dev) ...@@ -395,11 +395,22 @@ static void aac_src_start_adapter(struct aac_dev *dev)
dev->fibs_pushed_no = 0; dev->fibs_pushed_no = 0;
init = dev->init; init = dev->init;
init->HostElapsedSeconds = cpu_to_le32(get_seconds()); if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) {
init->r8.host_elapsed_seconds = cpu_to_le32(get_seconds());
src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS,
(u32)(ulong)dev->init_pa,
(u32)((ulong)dev->init_pa>>32),
sizeof(struct _r8) +
(AAC_MAX_HRRQ - 1) * sizeof(struct _rrq),
0, 0, 0, NULL, NULL, NULL, NULL, NULL);
} else {
init->r7.host_elapsed_seconds = cpu_to_le32(get_seconds());
// We can only use a 32 bit address here
src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS,
(u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0,
NULL, NULL, NULL, NULL, NULL);
}
/* We can only use a 32 bit address here */
src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
} }
/** /**
...@@ -467,7 +478,8 @@ static int aac_src_deliver_message(struct fib *fib) ...@@ -467,7 +478,8 @@ static int aac_src_deliver_message(struct fib *fib)
atomic_inc(&dev->rrq_outstanding[vector_no]); atomic_inc(&dev->rrq_outstanding[vector_no]);
if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) ||
(dev->comm_interface == AAC_COMM_MESSAGE_TYPE3)) {
/* Calculate the amount to the fibsize bits */ /* Calculate the amount to the fibsize bits */
fibsize = (hdr_size + 127) / 128 - 1; fibsize = (hdr_size + 127) / 128 - 1;
if (fibsize > (ALIGN32 - 1)) if (fibsize > (ALIGN32 - 1))
...@@ -897,7 +909,8 @@ int aac_srcv_init(struct aac_dev *dev) ...@@ -897,7 +909,8 @@ int aac_srcv_init(struct aac_dev *dev)
if (aac_init_adapter(dev) == NULL) if (aac_init_adapter(dev) == NULL)
goto error_iounmap; goto error_iounmap;
if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE2) if ((dev->comm_interface != AAC_COMM_MESSAGE_TYPE2) &&
(dev->comm_interface != AAC_COMM_MESSAGE_TYPE3))
goto error_iounmap; goto error_iounmap;
if (dev->msi_enabled) if (dev->msi_enabled)
aac_src_access_devreg(dev, AAC_ENABLE_MSIX); aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment