|
@@ -4296,7 +4296,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
|
|
"2570 Failed to read FCoE parameters\n");
|
|
|
|
|
|
/* Issue READ_REV to collect vpd and FW information. */
|
|
|
- vpd_size = PAGE_SIZE;
|
|
|
+ vpd_size = SLI4_PAGE_SIZE;
|
|
|
vpd = kzalloc(vpd_size, GFP_KERNEL);
|
|
|
if (!vpd) {
|
|
|
rc = -ENOMEM;
|
|
@@ -7136,13 +7136,11 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|
|
*/
|
|
|
list_del_init(&abort_iocb->list);
|
|
|
pring->txcmplq_cnt--;
|
|
|
- spin_unlock_irq(&phba->hbalock);
|
|
|
|
|
|
/* Firmware could still be in progress of DMAing
|
|
|
* payload, so don't free data buffer till after
|
|
|
* a hbeat.
|
|
|
*/
|
|
|
- spin_lock_irq(&phba->hbalock);
|
|
|
abort_iocb->iocb_flag |= LPFC_DELAY_MEM_FREE;
|
|
|
abort_iocb->iocb_flag &= ~LPFC_DRIVER_ABORTED;
|
|
|
spin_unlock_irq(&phba->hbalock);
|
|
@@ -7150,7 +7148,8 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|
|
abort_iocb->iocb.ulpStatus = IOSTAT_LOCAL_REJECT;
|
|
|
abort_iocb->iocb.un.ulpWord[4] = IOERR_ABORT_REQUESTED;
|
|
|
(abort_iocb->iocb_cmpl)(phba, abort_iocb, abort_iocb);
|
|
|
- }
|
|
|
+ } else
|
|
|
+ spin_unlock_irq(&phba->hbalock);
|
|
|
}
|
|
|
|
|
|
lpfc_sli_release_iocbq(phba, cmdiocb);
|
|
@@ -9544,7 +9543,7 @@ lpfc_sli4_queue_free(struct lpfc_queue *queue)
|
|
|
while (!list_empty(&queue->page_list)) {
|
|
|
list_remove_head(&queue->page_list, dmabuf, struct lpfc_dmabuf,
|
|
|
list);
|
|
|
- dma_free_coherent(&queue->phba->pcidev->dev, PAGE_SIZE,
|
|
|
+ dma_free_coherent(&queue->phba->pcidev->dev, SLI4_PAGE_SIZE,
|
|
|
dmabuf->virt, dmabuf->phys);
|
|
|
kfree(dmabuf);
|
|
|
}
|
|
@@ -9572,7 +9571,6 @@ lpfc_sli4_queue_alloc(struct lpfc_hba *phba, uint32_t entry_size,
|
|
|
void *dma_pointer;
|
|
|
uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
|
|
|
|
|
|
-
|
|
|
if (!phba->sli4_hba.pc_sli4_params.supported)
|
|
|
hw_page_size = SLI4_PAGE_SIZE;
|
|
|
|
|
@@ -9647,6 +9645,10 @@ lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint16_t imax)
|
|
|
uint32_t shdr_status, shdr_add_status;
|
|
|
union lpfc_sli4_cfg_shdr *shdr;
|
|
|
uint16_t dmult;
|
|
|
+ uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
|
|
|
+
|
|
|
+ if (!phba->sli4_hba.pc_sli4_params.supported)
|
|
|
+ hw_page_size = SLI4_PAGE_SIZE;
|
|
|
|
|
|
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
|
|
if (!mbox)
|
|
@@ -9696,6 +9698,7 @@ lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint16_t imax)
|
|
|
break;
|
|
|
}
|
|
|
list_for_each_entry(dmabuf, &eq->page_list, list) {
|
|
|
+ memset(dmabuf->virt, 0, hw_page_size);
|
|
|
eq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
|
|
|
putPaddrLow(dmabuf->phys);
|
|
|
eq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
|
|
@@ -9758,6 +9761,11 @@ lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq,
|
|
|
int rc, length, status = 0;
|
|
|
uint32_t shdr_status, shdr_add_status;
|
|
|
union lpfc_sli4_cfg_shdr *shdr;
|
|
|
+ uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
|
|
|
+
|
|
|
+ if (!phba->sli4_hba.pc_sli4_params.supported)
|
|
|
+ hw_page_size = SLI4_PAGE_SIZE;
|
|
|
+
|
|
|
|
|
|
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
|
|
if (!mbox)
|
|
@@ -9795,6 +9803,7 @@ lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq,
|
|
|
break;
|
|
|
}
|
|
|
list_for_each_entry(dmabuf, &cq->page_list, list) {
|
|
|
+ memset(dmabuf->virt, 0, hw_page_size);
|
|
|
cq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
|
|
|
putPaddrLow(dmabuf->phys);
|
|
|
cq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
|
|
@@ -9924,7 +9933,10 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq,
|
|
|
int rc, length, status = 0;
|
|
|
uint32_t shdr_status, shdr_add_status;
|
|
|
union lpfc_sli4_cfg_shdr *shdr;
|
|
|
+ uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
|
|
|
|
|
|
+ if (!phba->sli4_hba.pc_sli4_params.supported)
|
|
|
+ hw_page_size = SLI4_PAGE_SIZE;
|
|
|
|
|
|
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
|
|
if (!mbox)
|
|
@@ -9973,6 +9985,7 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq,
|
|
|
break;
|
|
|
}
|
|
|
list_for_each_entry(dmabuf, &mq->page_list, list) {
|
|
|
+ memset(dmabuf->virt, 0, hw_page_size);
|
|
|
mq_create_ext->u.request.page[dmabuf->buffer_tag].addr_lo =
|
|
|
putPaddrLow(dmabuf->phys);
|
|
|
mq_create_ext->u.request.page[dmabuf->buffer_tag].addr_hi =
|
|
@@ -10054,6 +10067,10 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
|
|
|
int rc, length, status = 0;
|
|
|
uint32_t shdr_status, shdr_add_status;
|
|
|
union lpfc_sli4_cfg_shdr *shdr;
|
|
|
+ uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
|
|
|
+
|
|
|
+ if (!phba->sli4_hba.pc_sli4_params.supported)
|
|
|
+ hw_page_size = SLI4_PAGE_SIZE;
|
|
|
|
|
|
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
|
|
if (!mbox)
|
|
@@ -10069,6 +10086,7 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
|
|
|
bf_set(lpfc_mbx_wq_create_cq_id, &wq_create->u.request,
|
|
|
cq->queue_id);
|
|
|
list_for_each_entry(dmabuf, &wq->page_list, list) {
|
|
|
+ memset(dmabuf->virt, 0, hw_page_size);
|
|
|
wq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
|
|
|
putPaddrLow(dmabuf->phys);
|
|
|
wq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
|
|
@@ -10137,6 +10155,10 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq,
|
|
|
int rc, length, status = 0;
|
|
|
uint32_t shdr_status, shdr_add_status;
|
|
|
union lpfc_sli4_cfg_shdr *shdr;
|
|
|
+ uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
|
|
|
+
|
|
|
+ if (!phba->sli4_hba.pc_sli4_params.supported)
|
|
|
+ hw_page_size = SLI4_PAGE_SIZE;
|
|
|
|
|
|
if (hrq->entry_count != drq->entry_count)
|
|
|
return -EINVAL;
|
|
@@ -10181,6 +10203,7 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq,
|
|
|
bf_set(lpfc_rq_context_buf_size, &rq_create->u.request.context,
|
|
|
LPFC_HDR_BUF_SIZE);
|
|
|
list_for_each_entry(dmabuf, &hrq->page_list, list) {
|
|
|
+ memset(dmabuf->virt, 0, hw_page_size);
|
|
|
rq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
|
|
|
putPaddrLow(dmabuf->phys);
|
|
|
rq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
|
|
@@ -10753,7 +10776,7 @@ lpfc_sli4_post_sgl_list(struct lpfc_hba *phba)
|
|
|
|
|
|
reqlen = els_xri_cnt * sizeof(struct sgl_page_pairs) +
|
|
|
sizeof(union lpfc_sli4_cfg_shdr) + sizeof(uint32_t);
|
|
|
- if (reqlen > PAGE_SIZE) {
|
|
|
+ if (reqlen > SLI4_PAGE_SIZE) {
|
|
|
lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
|
|
|
"2559 Block sgl registration required DMA "
|
|
|
"size (%d) great than a page\n", reqlen);
|
|
@@ -10859,7 +10882,7 @@ lpfc_sli4_post_scsi_sgl_block(struct lpfc_hba *phba, struct list_head *sblist,
|
|
|
/* Calculate the requested length of the dma memory */
|
|
|
reqlen = cnt * sizeof(struct sgl_page_pairs) +
|
|
|
sizeof(union lpfc_sli4_cfg_shdr) + sizeof(uint32_t);
|
|
|
- if (reqlen > PAGE_SIZE) {
|
|
|
+ if (reqlen > SLI4_PAGE_SIZE) {
|
|
|
lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
|
|
|
"0217 Block sgl registration required DMA "
|
|
|
"size (%d) great than a page\n", reqlen);
|
|
@@ -11695,8 +11718,8 @@ lpfc_sli4_handle_received_buffer(struct lpfc_hba *phba,
|
|
|
*
|
|
|
* This routine is invoked to post rpi header templates to the
|
|
|
* HBA consistent with the SLI-4 interface spec. This routine
|
|
|
- * posts a PAGE_SIZE memory region to the port to hold up to
|
|
|
- * PAGE_SIZE modulo 64 rpi context headers.
|
|
|
+ * posts a SLI4_PAGE_SIZE memory region to the port to hold up to
|
|
|
+ * SLI4_PAGE_SIZE modulo 64 rpi context headers.
|
|
|
*
|
|
|
* This routine does not require any locks. It's usage is expected
|
|
|
* to be driver load or reset recovery when the driver is
|
|
@@ -11799,8 +11822,8 @@ lpfc_sli4_post_rpi_hdr(struct lpfc_hba *phba, struct lpfc_rpi_hdr *rpi_page)
|
|
|
*
|
|
|
* This routine is invoked to post rpi header templates to the
|
|
|
* HBA consistent with the SLI-4 interface spec. This routine
|
|
|
- * posts a PAGE_SIZE memory region to the port to hold up to
|
|
|
- * PAGE_SIZE modulo 64 rpi context headers.
|
|
|
+ * posts a SLI4_PAGE_SIZE memory region to the port to hold up to
|
|
|
+ * SLI4_PAGE_SIZE modulo 64 rpi context headers.
|
|
|
*
|
|
|
* Returns
|
|
|
* A nonzero rpi defined as rpi_base <= rpi < max_rpi if successful
|