Commit 7e56aa25 authored by James Smart's avatar James Smart Committed by James Bottomley

[SCSI] lpfc 8.3.33: Formally separate lpfc_sli_ring SLI-3 and SLI-4 variantions

Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent b9a7c631
...@@ -490,9 +490,11 @@ lpfc_debugfs_dumpHostSlim_data(struct lpfc_hba *phba, char *buf, int size) ...@@ -490,9 +490,11 @@ lpfc_debugfs_dumpHostSlim_data(struct lpfc_hba *phba, char *buf, int size)
len += snprintf(buf+len, size-len, len += snprintf(buf+len, size-len,
"Ring %d: CMD GetInx:%d (Max:%d Next:%d " "Ring %d: CMD GetInx:%d (Max:%d Next:%d "
"Local:%d flg:x%x) RSP PutInx:%d Max:%d\n", "Local:%d flg:x%x) RSP PutInx:%d Max:%d\n",
i, pgpp->cmdGetInx, pring->numCiocb, i, pgpp->cmdGetInx, pring->sli.sli3.numCiocb,
pring->next_cmdidx, pring->local_getidx, pring->sli.sli3.next_cmdidx,
pring->flag, pgpp->rspPutInx, pring->numRiocb); pring->sli.sli3.local_getidx,
pring->flag, pgpp->rspPutInx,
pring->sli.sli3.numRiocb);
} }
if (phba->sli_rev <= LPFC_SLI_REV3) { if (phba->sli_rev <= LPFC_SLI_REV3) {
......
...@@ -480,11 +480,11 @@ lpfc_config_port_post(struct lpfc_hba *phba) ...@@ -480,11 +480,11 @@ lpfc_config_port_post(struct lpfc_hba *phba)
phba->link_state = LPFC_LINK_DOWN; phba->link_state = LPFC_LINK_DOWN;
/* Only process IOCBs on ELS ring till hba_state is READY */ /* Only process IOCBs on ELS ring till hba_state is READY */
if (psli->ring[psli->extra_ring].cmdringaddr) if (psli->ring[psli->extra_ring].sli.sli3.cmdringaddr)
psli->ring[psli->extra_ring].flag |= LPFC_STOP_IOCB_EVENT; psli->ring[psli->extra_ring].flag |= LPFC_STOP_IOCB_EVENT;
if (psli->ring[psli->fcp_ring].cmdringaddr) if (psli->ring[psli->fcp_ring].sli.sli3.cmdringaddr)
psli->ring[psli->fcp_ring].flag |= LPFC_STOP_IOCB_EVENT; psli->ring[psli->fcp_ring].flag |= LPFC_STOP_IOCB_EVENT;
if (psli->ring[psli->next_ring].cmdringaddr) if (psli->ring[psli->next_ring].sli.sli3.cmdringaddr)
psli->ring[psli->next_ring].flag |= LPFC_STOP_IOCB_EVENT; psli->ring[psli->next_ring].flag |= LPFC_STOP_IOCB_EVENT;
/* Post receive buffers for desired rings */ /* Post receive buffers for desired rings */
......
...@@ -950,44 +950,47 @@ lpfc_config_pcb_setup(struct lpfc_hba * phba) ...@@ -950,44 +950,47 @@ lpfc_config_pcb_setup(struct lpfc_hba * phba)
for (i = 0; i < psli->num_rings; i++) { for (i = 0; i < psli->num_rings; i++) {
pring = &psli->ring[i]; pring = &psli->ring[i];
pring->sizeCiocb = phba->sli_rev == 3 ? SLI3_IOCB_CMD_SIZE: pring->sli.sli3.sizeCiocb =
phba->sli_rev == 3 ? SLI3_IOCB_CMD_SIZE :
SLI2_IOCB_CMD_SIZE; SLI2_IOCB_CMD_SIZE;
pring->sizeRiocb = phba->sli_rev == 3 ? SLI3_IOCB_RSP_SIZE: pring->sli.sli3.sizeRiocb =
phba->sli_rev == 3 ? SLI3_IOCB_RSP_SIZE :
SLI2_IOCB_RSP_SIZE; SLI2_IOCB_RSP_SIZE;
/* A ring MUST have both cmd and rsp entries defined to be /* A ring MUST have both cmd and rsp entries defined to be
valid */ valid */
if ((pring->numCiocb == 0) || (pring->numRiocb == 0)) { if ((pring->sli.sli3.numCiocb == 0) ||
(pring->sli.sli3.numRiocb == 0)) {
pcbp->rdsc[i].cmdEntries = 0; pcbp->rdsc[i].cmdEntries = 0;
pcbp->rdsc[i].rspEntries = 0; pcbp->rdsc[i].rspEntries = 0;
pcbp->rdsc[i].cmdAddrHigh = 0; pcbp->rdsc[i].cmdAddrHigh = 0;
pcbp->rdsc[i].rspAddrHigh = 0; pcbp->rdsc[i].rspAddrHigh = 0;
pcbp->rdsc[i].cmdAddrLow = 0; pcbp->rdsc[i].cmdAddrLow = 0;
pcbp->rdsc[i].rspAddrLow = 0; pcbp->rdsc[i].rspAddrLow = 0;
pring->cmdringaddr = NULL; pring->sli.sli3.cmdringaddr = NULL;
pring->rspringaddr = NULL; pring->sli.sli3.rspringaddr = NULL;
continue; continue;
} }
/* Command ring setup for ring */ /* Command ring setup for ring */
pring->cmdringaddr = (void *)&phba->IOCBs[iocbCnt]; pring->sli.sli3.cmdringaddr = (void *)&phba->IOCBs[iocbCnt];
pcbp->rdsc[i].cmdEntries = pring->numCiocb; pcbp->rdsc[i].cmdEntries = pring->sli.sli3.numCiocb;
offset = (uint8_t *) &phba->IOCBs[iocbCnt] - offset = (uint8_t *) &phba->IOCBs[iocbCnt] -
(uint8_t *) phba->slim2p.virt; (uint8_t *) phba->slim2p.virt;
pdma_addr = phba->slim2p.phys + offset; pdma_addr = phba->slim2p.phys + offset;
pcbp->rdsc[i].cmdAddrHigh = putPaddrHigh(pdma_addr); pcbp->rdsc[i].cmdAddrHigh = putPaddrHigh(pdma_addr);
pcbp->rdsc[i].cmdAddrLow = putPaddrLow(pdma_addr); pcbp->rdsc[i].cmdAddrLow = putPaddrLow(pdma_addr);
iocbCnt += pring->numCiocb; iocbCnt += pring->sli.sli3.numCiocb;
/* Response ring setup for ring */ /* Response ring setup for ring */
pring->rspringaddr = (void *) &phba->IOCBs[iocbCnt]; pring->sli.sli3.rspringaddr = (void *) &phba->IOCBs[iocbCnt];
pcbp->rdsc[i].rspEntries = pring->numRiocb; pcbp->rdsc[i].rspEntries = pring->sli.sli3.numRiocb;
offset = (uint8_t *)&phba->IOCBs[iocbCnt] - offset = (uint8_t *)&phba->IOCBs[iocbCnt] -
(uint8_t *)phba->slim2p.virt; (uint8_t *)phba->slim2p.virt;
pdma_addr = phba->slim2p.phys + offset; pdma_addr = phba->slim2p.phys + offset;
pcbp->rdsc[i].rspAddrHigh = putPaddrHigh(pdma_addr); pcbp->rdsc[i].rspAddrHigh = putPaddrHigh(pdma_addr);
pcbp->rdsc[i].rspAddrLow = putPaddrLow(pdma_addr); pcbp->rdsc[i].rspAddrLow = putPaddrLow(pdma_addr);
iocbCnt += pring->numRiocb; iocbCnt += pring->sli.sli3.numRiocb;
} }
} }
......
This diff is collapsed.
...@@ -158,6 +158,24 @@ struct lpfc_sli_ring_stat { ...@@ -158,6 +158,24 @@ struct lpfc_sli_ring_stat {
uint64_t iocb_rsp_full; /* IOCB rsp ring full */ uint64_t iocb_rsp_full; /* IOCB rsp ring full */
}; };
struct lpfc_sli3_ring {
uint32_t local_getidx; /* last available cmd index (from cmdGetInx) */
uint32_t next_cmdidx; /* next_cmd index */
uint32_t rspidx; /* current index in response ring */
uint32_t cmdidx; /* current index in command ring */
uint16_t numCiocb; /* number of command iocb's per ring */
uint16_t numRiocb; /* number of rsp iocb's per ring */
uint16_t sizeCiocb; /* Size of command iocb's in this ring */
uint16_t sizeRiocb; /* Size of response iocb's in this ring */
uint32_t *cmdringaddr; /* virtual address for cmd rings */
uint32_t *rspringaddr; /* virtual address for rsp rings */
};
struct lpfc_sli4_ring {
void *wqp; /* Pointer to associated WQ */
};
/* Structure used to hold SLI ring information */ /* Structure used to hold SLI ring information */
struct lpfc_sli_ring { struct lpfc_sli_ring {
uint16_t flag; /* ring flags */ uint16_t flag; /* ring flags */
...@@ -166,16 +184,10 @@ struct lpfc_sli_ring { ...@@ -166,16 +184,10 @@ struct lpfc_sli_ring {
#define LPFC_STOP_IOCB_EVENT 0x020 /* Stop processing IOCB cmds event */ #define LPFC_STOP_IOCB_EVENT 0x020 /* Stop processing IOCB cmds event */
uint16_t abtsiotag; /* tracks next iotag to use for ABTS */ uint16_t abtsiotag; /* tracks next iotag to use for ABTS */
uint32_t local_getidx; /* last available cmd index (from cmdGetInx) */
uint32_t next_cmdidx; /* next_cmd index */
uint32_t rspidx; /* current index in response ring */
uint32_t cmdidx; /* current index in command ring */
uint8_t rsvd; uint8_t rsvd;
uint8_t ringno; /* ring number */ uint8_t ringno; /* ring number */
uint16_t numCiocb; /* number of command iocb's per ring */
uint16_t numRiocb; /* number of rsp iocb's per ring */ spinlock_t ring_lock; /* lock for issuing commands */
uint16_t sizeCiocb; /* Size of command iocb's in this ring */
uint16_t sizeRiocb; /* Size of response iocb's in this ring */
uint32_t fast_iotag; /* max fastlookup based iotag */ uint32_t fast_iotag; /* max fastlookup based iotag */
uint32_t iotag_ctr; /* keeps track of the next iotag to use */ uint32_t iotag_ctr; /* keeps track of the next iotag to use */
...@@ -186,8 +198,6 @@ struct lpfc_sli_ring { ...@@ -186,8 +198,6 @@ struct lpfc_sli_ring {
struct list_head txcmplq; struct list_head txcmplq;
uint16_t txcmplq_cnt; /* current length of queue */ uint16_t txcmplq_cnt; /* current length of queue */
uint16_t txcmplq_max; /* max length */ uint16_t txcmplq_max; /* max length */
uint32_t *cmdringaddr; /* virtual address for cmd rings */
uint32_t *rspringaddr; /* virtual address for rsp rings */
uint32_t missbufcnt; /* keep track of buffers to post */ uint32_t missbufcnt; /* keep track of buffers to post */
struct list_head postbufq; struct list_head postbufq;
uint16_t postbufq_cnt; /* current length of queue */ uint16_t postbufq_cnt; /* current length of queue */
...@@ -207,6 +217,10 @@ struct lpfc_sli_ring { ...@@ -207,6 +217,10 @@ struct lpfc_sli_ring {
/* cmd ring available */ /* cmd ring available */
void (*lpfc_sli_cmd_available) (struct lpfc_hba *, void (*lpfc_sli_cmd_available) (struct lpfc_hba *,
struct lpfc_sli_ring *); struct lpfc_sli_ring *);
union {
struct lpfc_sli3_ring sli3;
struct lpfc_sli4_ring sli4;
} sli;
}; };
/* Structure used for configuring rings to a specific profile or rctl / type */ /* Structure used for configuring rings to a specific profile or rctl / type */
......
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