scsi: mpt3sas: Introduce function to clone mpi reply.
If the posted request has an error of any type, the IOC writes a Reply message into a host-based system reply message frame. This functions clone it in the BAR0 mapped region. Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
e574743936
commit
b4472d7180
|
@ -125,6 +125,33 @@ _scsih_set_fwfault_debug(const char *val, const struct kernel_param *kp)
|
||||||
module_param_call(mpt3sas_fwfault_debug, _scsih_set_fwfault_debug,
|
module_param_call(mpt3sas_fwfault_debug, _scsih_set_fwfault_debug,
|
||||||
param_get_int, &mpt3sas_fwfault_debug, 0644);
|
param_get_int, &mpt3sas_fwfault_debug, 0644);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _base_clone_reply_to_sys_mem - copies reply to reply free iomem
|
||||||
|
* in BAR0 space.
|
||||||
|
*
|
||||||
|
* @ioc: per adapter object
|
||||||
|
* @reply: reply message frame(lower 32bit addr)
|
||||||
|
* @index: System request message index.
|
||||||
|
*
|
||||||
|
* @Returns - Nothing
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
_base_clone_reply_to_sys_mem(struct MPT3SAS_ADAPTER *ioc, u32 reply,
|
||||||
|
u32 index)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 256 is offset within sys register.
|
||||||
|
* 256 offset MPI frame starts. Max MPI frame supported is 32.
|
||||||
|
* 32 * 128 = 4K. From here, Clone of reply free for mcpu starts
|
||||||
|
*/
|
||||||
|
u16 cmd_credit = ioc->facts.RequestCredit + 1;
|
||||||
|
void __iomem *reply_free_iomem = (void __iomem *)ioc->chip +
|
||||||
|
MPI_FRAME_START_OFFSET +
|
||||||
|
(cmd_credit * ioc->request_sz) + (index * sizeof(u32));
|
||||||
|
|
||||||
|
writel(reply, reply_free_iomem);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _base_clone_mpi_to_sys_mem - Writes/copies MPI frames
|
* _base_clone_mpi_to_sys_mem - Writes/copies MPI frames
|
||||||
* to system/BAR0 region.
|
* to system/BAR0 region.
|
||||||
|
@ -1400,6 +1427,10 @@ _base_interrupt(int irq, void *bus_id)
|
||||||
0 : ioc->reply_free_host_index + 1;
|
0 : ioc->reply_free_host_index + 1;
|
||||||
ioc->reply_free[ioc->reply_free_host_index] =
|
ioc->reply_free[ioc->reply_free_host_index] =
|
||||||
cpu_to_le32(reply);
|
cpu_to_le32(reply);
|
||||||
|
if (ioc->is_mcpu_endpoint)
|
||||||
|
_base_clone_reply_to_sys_mem(ioc,
|
||||||
|
cpu_to_le32(reply),
|
||||||
|
ioc->reply_free_host_index);
|
||||||
writel(ioc->reply_free_host_index,
|
writel(ioc->reply_free_host_index,
|
||||||
&ioc->chip->ReplyFreeHostIndex);
|
&ioc->chip->ReplyFreeHostIndex);
|
||||||
}
|
}
|
||||||
|
@ -6242,8 +6273,12 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc)
|
||||||
/* initialize Reply Free Queue */
|
/* initialize Reply Free Queue */
|
||||||
for (i = 0, reply_address = (u32)ioc->reply_dma ;
|
for (i = 0, reply_address = (u32)ioc->reply_dma ;
|
||||||
i < ioc->reply_free_queue_depth ; i++, reply_address +=
|
i < ioc->reply_free_queue_depth ; i++, reply_address +=
|
||||||
ioc->reply_sz)
|
ioc->reply_sz) {
|
||||||
ioc->reply_free[i] = cpu_to_le32(reply_address);
|
ioc->reply_free[i] = cpu_to_le32(reply_address);
|
||||||
|
if (ioc->is_mcpu_endpoint)
|
||||||
|
_base_clone_reply_to_sys_mem(ioc,
|
||||||
|
(__le32)reply_address, i);
|
||||||
|
}
|
||||||
|
|
||||||
/* initialize reply queues */
|
/* initialize reply queues */
|
||||||
if (ioc->is_driver_loading)
|
if (ioc->is_driver_loading)
|
||||||
|
|
Loading…
Reference in New Issue