diff options
author | James Smart <James.Smart@Emulex.Com> | 2008-08-24 21:49:55 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-10-13 09:28:53 -0400 |
commit | 34b02dcdcf1865405f4762b991965c0c3b8a3ae0 (patch) | |
tree | 00829334c2813d30e574a5f1290fbf7dd210d1cb /drivers/scsi/lpfc | |
parent | 90160e010b6f3a91a9bb044bbe6723731e6f366c (diff) |
[SCSI] lpfc 8.2.8 : Update driver for new SLI-3 features
Update driver for new SLI-3 features:
- interrupt enhancements
- lose adapter doorbell writes
- inlining support for FCP_Ixx cmds
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 22 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_ct.c | 4 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_debugfs.c | 52 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 4 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hw.h | 63 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 28 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_mbox.c | 75 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 163 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 122 |
9 files changed, 314 insertions, 219 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index e0e018d12653..327eeb051087 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -407,10 +407,11 @@ struct lpfc_hba { | |||
407 | struct lpfc_sli sli; | 407 | struct lpfc_sli sli; |
408 | uint32_t sli_rev; /* SLI2 or SLI3 */ | 408 | uint32_t sli_rev; /* SLI2 or SLI3 */ |
409 | uint32_t sli3_options; /* Mask of enabled SLI3 options */ | 409 | uint32_t sli3_options; /* Mask of enabled SLI3 options */ |
410 | #define LPFC_SLI3_ENABLED 0x01 | 410 | #define LPFC_SLI3_HBQ_ENABLED 0x01 |
411 | #define LPFC_SLI3_HBQ_ENABLED 0x02 | 411 | #define LPFC_SLI3_NPIV_ENABLED 0x02 |
412 | #define LPFC_SLI3_NPIV_ENABLED 0x04 | 412 | #define LPFC_SLI3_VPORT_TEARDOWN 0x04 |
413 | #define LPFC_SLI3_VPORT_TEARDOWN 0x08 | 413 | #define LPFC_SLI3_CRP_ENABLED 0x08 |
414 | #define LPFC_SLI3_INB_ENABLED 0x10 | ||
414 | uint32_t iocb_cmd_size; | 415 | uint32_t iocb_cmd_size; |
415 | uint32_t iocb_rsp_size; | 416 | uint32_t iocb_rsp_size; |
416 | 417 | ||
@@ -422,10 +423,16 @@ struct lpfc_hba { | |||
422 | #define LS_NPIV_FAB_SUPPORTED 0x2 /* Fabric supports NPIV */ | 423 | #define LS_NPIV_FAB_SUPPORTED 0x2 /* Fabric supports NPIV */ |
423 | #define LS_IGNORE_ERATT 0x4 /* intr handler should ignore ERATT */ | 424 | #define LS_IGNORE_ERATT 0x4 /* intr handler should ignore ERATT */ |
424 | 425 | ||
425 | struct lpfc_sli2_slim *slim2p; | 426 | struct lpfc_dmabuf slim2p; |
426 | struct lpfc_dmabuf hbqslimp; | 427 | |
428 | MAILBOX_t *mbox; | ||
429 | uint32_t *inb_ha_copy; | ||
430 | uint32_t *inb_counter; | ||
431 | uint32_t inb_last_counter; | ||
432 | struct _PCB *pcb; | ||
433 | struct _IOCB *IOCBs; | ||
427 | 434 | ||
428 | dma_addr_t slim2p_mapping; | 435 | struct lpfc_dmabuf hbqslimp; |
429 | 436 | ||
430 | uint16_t pci_cfg_value; | 437 | uint16_t pci_cfg_value; |
431 | 438 | ||
@@ -514,6 +521,7 @@ struct lpfc_hba { | |||
514 | void __iomem *HCregaddr; /* virtual address for host ctl reg */ | 521 | void __iomem *HCregaddr; /* virtual address for host ctl reg */ |
515 | 522 | ||
516 | struct lpfc_hgp __iomem *host_gp; /* Host side get/put pointers */ | 523 | struct lpfc_hgp __iomem *host_gp; /* Host side get/put pointers */ |
524 | struct lpfc_pgp *port_gp; | ||
517 | uint32_t __iomem *hbq_put; /* Address in SLIM to HBQ put ptrs */ | 525 | uint32_t __iomem *hbq_put; /* Address in SLIM to HBQ put ptrs */ |
518 | uint32_t *hbq_get; /* Host mem address of HBQ get ptrs */ | 526 | uint32_t *hbq_get; /* Host mem address of HBQ get ptrs */ |
519 | 527 | ||
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index 7fc74cf5823b..0f387862cf77 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c | |||
@@ -212,7 +212,7 @@ lpfc_alloc_ct_rsp(struct lpfc_hba *phba, int cmdcode, struct ulp_bde64 *bpl, | |||
212 | else | 212 | else |
213 | list_add_tail(&mp->list, &mlist->list); | 213 | list_add_tail(&mp->list, &mlist->list); |
214 | 214 | ||
215 | bpl->tus.f.bdeFlags = BUFF_USE_RCV; | 215 | bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I; |
216 | /* build buffer ptr list for IOCB */ | 216 | /* build buffer ptr list for IOCB */ |
217 | bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) ); | 217 | bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) ); |
218 | bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) ); | 218 | bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) ); |
@@ -283,7 +283,7 @@ lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp, | |||
283 | icmd->un.genreq64.bdl.ulpIoTag32 = 0; | 283 | icmd->un.genreq64.bdl.ulpIoTag32 = 0; |
284 | icmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys); | 284 | icmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys); |
285 | icmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys); | 285 | icmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys); |
286 | icmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BDL; | 286 | icmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; |
287 | icmd->un.genreq64.bdl.bdeSize = (num_entry * sizeof (struct ulp_bde64)); | 287 | icmd->un.genreq64.bdl.bdeSize = (num_entry * sizeof (struct ulp_bde64)); |
288 | 288 | ||
289 | if (usr_flg) | 289 | if (usr_flg) |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index 2588eadffbb9..2f6d34924b7d 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
@@ -454,7 +454,7 @@ lpfc_debugfs_dumpHostSlim_data(struct lpfc_hba *phba, char *buf, int size) | |||
454 | spin_lock_irq(&phba->hbalock); | 454 | spin_lock_irq(&phba->hbalock); |
455 | 455 | ||
456 | len += snprintf(buf+len, size-len, "SLIM Mailbox\n"); | 456 | len += snprintf(buf+len, size-len, "SLIM Mailbox\n"); |
457 | ptr = (uint32_t *)phba->slim2p; | 457 | ptr = (uint32_t *)phba->slim2p.virt; |
458 | i = sizeof(MAILBOX_t); | 458 | i = sizeof(MAILBOX_t); |
459 | while (i > 0) { | 459 | while (i > 0) { |
460 | len += snprintf(buf+len, size-len, | 460 | len += snprintf(buf+len, size-len, |
@@ -467,7 +467,7 @@ lpfc_debugfs_dumpHostSlim_data(struct lpfc_hba *phba, char *buf, int size) | |||
467 | } | 467 | } |
468 | 468 | ||
469 | len += snprintf(buf+len, size-len, "SLIM PCB\n"); | 469 | len += snprintf(buf+len, size-len, "SLIM PCB\n"); |
470 | ptr = (uint32_t *)&phba->slim2p->pcb; | 470 | ptr = (uint32_t *)phba->pcb; |
471 | i = sizeof(PCB_t); | 471 | i = sizeof(PCB_t); |
472 | while (i > 0) { | 472 | while (i > 0) { |
473 | len += snprintf(buf+len, size-len, | 473 | len += snprintf(buf+len, size-len, |
@@ -479,44 +479,16 @@ lpfc_debugfs_dumpHostSlim_data(struct lpfc_hba *phba, char *buf, int size) | |||
479 | off += (8 * sizeof(uint32_t)); | 479 | off += (8 * sizeof(uint32_t)); |
480 | } | 480 | } |
481 | 481 | ||
482 | pgpp = (struct lpfc_pgp *)&phba->slim2p->mbx.us.s3_pgp.port; | 482 | for (i = 0; i < 4; i++) { |
483 | pring = &psli->ring[0]; | 483 | pgpp = &phba->port_gp[i]; |
484 | len += snprintf(buf+len, size-len, | 484 | pring = &psli->ring[i]; |
485 | "Ring 0: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) " | 485 | len += snprintf(buf+len, size-len, |
486 | "RSP PutInx:%d Max:%d\n", | 486 | "Ring %d: CMD GetInx:%d (Max:%d Next:%d " |
487 | pgpp->cmdGetInx, pring->numCiocb, | 487 | "Local:%d flg:x%x) RSP PutInx:%d Max:%d\n", |
488 | pring->next_cmdidx, pring->local_getidx, pring->flag, | 488 | i, pgpp->cmdGetInx, pring->numCiocb, |
489 | pgpp->rspPutInx, pring->numRiocb); | 489 | pring->next_cmdidx, pring->local_getidx, |
490 | pgpp++; | 490 | pring->flag, pgpp->rspPutInx, pring->numRiocb); |
491 | 491 | } | |
492 | pring = &psli->ring[1]; | ||
493 | len += snprintf(buf+len, size-len, | ||
494 | "Ring 1: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) " | ||
495 | "RSP PutInx:%d Max:%d\n", | ||
496 | pgpp->cmdGetInx, pring->numCiocb, | ||
497 | pring->next_cmdidx, pring->local_getidx, pring->flag, | ||
498 | pgpp->rspPutInx, pring->numRiocb); | ||
499 | pgpp++; | ||
500 | |||
501 | pring = &psli->ring[2]; | ||
502 | len += snprintf(buf+len, size-len, | ||
503 | "Ring 2: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) " | ||
504 | "RSP PutInx:%d Max:%d\n", | ||
505 | pgpp->cmdGetInx, pring->numCiocb, | ||
506 | pring->next_cmdidx, pring->local_getidx, pring->flag, | ||
507 | pgpp->rspPutInx, pring->numRiocb); | ||
508 | pgpp++; | ||
509 | |||
510 | pring = &psli->ring[3]; | ||
511 | len += snprintf(buf+len, size-len, | ||
512 | "Ring 3: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) " | ||
513 | "RSP PutInx:%d Max:%d\n", | ||
514 | pgpp->cmdGetInx, pring->numCiocb, | ||
515 | pring->next_cmdidx, pring->local_getidx, pring->flag, | ||
516 | pgpp->rspPutInx, pring->numRiocb); | ||
517 | |||
518 | |||
519 | ptr = (uint32_t *)&phba->slim2p->mbx.us.s3_pgp.hbq_get; | ||
520 | word0 = readl(phba->HAregaddr); | 492 | word0 = readl(phba->HAregaddr); |
521 | word1 = readl(phba->CAregaddr); | 493 | word1 = readl(phba->CAregaddr); |
522 | word2 = readl(phba->HSregaddr); | 494 | word2 = readl(phba->HSregaddr); |
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 2e24b4fe2be5..89bd9ab46de7 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -200,7 +200,7 @@ lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp, | |||
200 | 200 | ||
201 | icmd->un.elsreq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys); | 201 | icmd->un.elsreq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys); |
202 | icmd->un.elsreq64.bdl.addrLow = putPaddrLow(pbuflist->phys); | 202 | icmd->un.elsreq64.bdl.addrLow = putPaddrLow(pbuflist->phys); |
203 | icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BDL; | 203 | icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; |
204 | icmd->un.elsreq64.remoteID = did; /* DID */ | 204 | icmd->un.elsreq64.remoteID = did; /* DID */ |
205 | if (expectRsp) { | 205 | if (expectRsp) { |
206 | icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64)); | 206 | icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64)); |
@@ -235,7 +235,7 @@ lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp, | |||
235 | bpl->addrLow = le32_to_cpu(putPaddrLow(prsp->phys)); | 235 | bpl->addrLow = le32_to_cpu(putPaddrLow(prsp->phys)); |
236 | bpl->addrHigh = le32_to_cpu(putPaddrHigh(prsp->phys)); | 236 | bpl->addrHigh = le32_to_cpu(putPaddrHigh(prsp->phys)); |
237 | bpl->tus.f.bdeSize = FCELSSIZE; | 237 | bpl->tus.f.bdeSize = FCELSSIZE; |
238 | bpl->tus.f.bdeFlags = BUFF_USE_RCV; | 238 | bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64; |
239 | bpl->tus.w = le32_to_cpu(bpl->tus.w); | 239 | bpl->tus.w = le32_to_cpu(bpl->tus.w); |
240 | } | 240 | } |
241 | 241 | ||
diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index 7773b949aa7c..a986332fecf6 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h | |||
@@ -1474,24 +1474,18 @@ struct ulp_bde64 { /* SLI-2 */ | |||
1474 | uint32_t bdeFlags:8; /* BDE Flags 0 IS A SUPPORTED | 1474 | uint32_t bdeFlags:8; /* BDE Flags 0 IS A SUPPORTED |
1475 | VALUE !! */ | 1475 | VALUE !! */ |
1476 | #endif | 1476 | #endif |
1477 | 1477 | #define BUFF_TYPE_BDE_64 0x00 /* BDE (Host_resident) */ | |
1478 | #define BUFF_USE_RSVD 0x01 /* bdeFlags */ | 1478 | #define BUFF_TYPE_BDE_IMMED 0x01 /* Immediate Data BDE */ |
1479 | #define BUFF_USE_INTRPT 0x02 /* Not Implemented with LP6000 */ | 1479 | #define BUFF_TYPE_BDE_64P 0x02 /* BDE (Port-resident) */ |
1480 | #define BUFF_USE_CMND 0x04 /* Optional, 1=cmd/rsp 0=data buffer */ | 1480 | #define BUFF_TYPE_BDE_64I 0x08 /* Input BDE (Host-resident) */ |
1481 | #define BUFF_USE_RCV 0x08 /* "" "", 1=rcv buffer, 0=xmit | 1481 | #define BUFF_TYPE_BDE_64IP 0x0A /* Input BDE (Port-resident) */ |
1482 | buffer */ | 1482 | #define BUFF_TYPE_BLP_64 0x40 /* BLP (Host-resident) */ |
1483 | #define BUFF_TYPE_32BIT 0x10 /* "" "", 1=32 bit addr 0=64 bit | 1483 | #define BUFF_TYPE_BLP_64P 0x42 /* BLP (Port-resident) */ |
1484 | addr */ | ||
1485 | #define BUFF_TYPE_SPECIAL 0x20 /* Not Implemented with LP6000 */ | ||
1486 | #define BUFF_TYPE_BDL 0x40 /* Optional, may be set in BDL */ | ||
1487 | #define BUFF_TYPE_INVALID 0x80 /* "" "" */ | ||
1488 | } f; | 1484 | } f; |
1489 | } tus; | 1485 | } tus; |
1490 | uint32_t addrLow; | 1486 | uint32_t addrLow; |
1491 | uint32_t addrHigh; | 1487 | uint32_t addrHigh; |
1492 | }; | 1488 | }; |
1493 | #define BDE64_SIZE_WORD 0 | ||
1494 | #define BPL64_SIZE_WORD 0x40 | ||
1495 | 1489 | ||
1496 | typedef struct ULP_BDL { /* SLI-2 */ | 1490 | typedef struct ULP_BDL { /* SLI-2 */ |
1497 | #ifdef __BIG_ENDIAN_BITFIELD | 1491 | #ifdef __BIG_ENDIAN_BITFIELD |
@@ -2715,11 +2709,19 @@ struct sli3_pgp { | |||
2715 | uint32_t hbq_get[16]; | 2709 | uint32_t hbq_get[16]; |
2716 | }; | 2710 | }; |
2717 | 2711 | ||
2718 | typedef union { | 2712 | struct sli3_inb_pgp { |
2719 | struct sli2_desc s2; | 2713 | uint32_t ha_copy; |
2720 | struct sli3_desc s3; | 2714 | uint32_t counter; |
2721 | struct sli3_pgp s3_pgp; | 2715 | struct lpfc_pgp port[MAX_RINGS]; |
2722 | } SLI_VAR; | 2716 | uint32_t hbq_get[16]; |
2717 | }; | ||
2718 | |||
2719 | union sli_var { | ||
2720 | struct sli2_desc s2; | ||
2721 | struct sli3_desc s3; | ||
2722 | struct sli3_pgp s3_pgp; | ||
2723 | struct sli3_inb_pgp s3_inb_pgp; | ||
2724 | }; | ||
2723 | 2725 | ||
2724 | typedef struct { | 2726 | typedef struct { |
2725 | #ifdef __BIG_ENDIAN_BITFIELD | 2727 | #ifdef __BIG_ENDIAN_BITFIELD |
@@ -2737,7 +2739,7 @@ typedef struct { | |||
2737 | #endif | 2739 | #endif |
2738 | 2740 | ||
2739 | MAILVARIANTS un; | 2741 | MAILVARIANTS un; |
2740 | SLI_VAR us; | 2742 | union sli_var us; |
2741 | } MAILBOX_t; | 2743 | } MAILBOX_t; |
2742 | 2744 | ||
2743 | /* | 2745 | /* |
@@ -3105,6 +3107,27 @@ struct que_xri64cx_ext_fields { | |||
3105 | struct lpfc_hbq_entry buff[5]; | 3107 | struct lpfc_hbq_entry buff[5]; |
3106 | }; | 3108 | }; |
3107 | 3109 | ||
3110 | #define LPFC_EXT_DATA_BDE_COUNT 3 | ||
3111 | struct fcp_irw_ext { | ||
3112 | uint32_t io_tag64_low; | ||
3113 | uint32_t io_tag64_high; | ||
3114 | #ifdef __BIG_ENDIAN_BITFIELD | ||
3115 | uint8_t reserved1; | ||
3116 | uint8_t reserved2; | ||
3117 | uint8_t reserved3; | ||
3118 | uint8_t ebde_count; | ||
3119 | #else /* __LITTLE_ENDIAN */ | ||
3120 | uint8_t ebde_count; | ||
3121 | uint8_t reserved3; | ||
3122 | uint8_t reserved2; | ||
3123 | uint8_t reserved1; | ||
3124 | #endif | ||
3125 | uint32_t reserved4; | ||
3126 | struct ulp_bde64 rbde; /* response bde */ | ||
3127 | struct ulp_bde64 dbde[LPFC_EXT_DATA_BDE_COUNT]; /* data BDE or BPL */ | ||
3128 | uint8_t icd[32]; /* immediate command data (32 bytes) */ | ||
3129 | }; | ||
3130 | |||
3108 | typedef struct _IOCB { /* IOCB structure */ | 3131 | typedef struct _IOCB { /* IOCB structure */ |
3109 | union { | 3132 | union { |
3110 | GENERIC_RSP grsp; /* Generic response */ | 3133 | GENERIC_RSP grsp; /* Generic response */ |
@@ -3190,7 +3213,7 @@ typedef struct _IOCB { /* IOCB structure */ | |||
3190 | 3213 | ||
3191 | /* words 8-31 used for que_xri_cx iocb */ | 3214 | /* words 8-31 used for que_xri_cx iocb */ |
3192 | struct que_xri64cx_ext_fields que_xri64cx_ext_words; | 3215 | struct que_xri64cx_ext_fields que_xri64cx_ext_words; |
3193 | 3216 | struct fcp_irw_ext fcp_ext; | |
3194 | uint32_t sli3Words[24]; /* 96 extra bytes for SLI-3 */ | 3217 | uint32_t sli3Words[24]; /* 96 extra bytes for SLI-3 */ |
3195 | } unsli3; | 3218 | } unsli3; |
3196 | 3219 | ||
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 93fd09daca87..6a7a039e8904 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -2312,12 +2312,18 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
2312 | } | 2312 | } |
2313 | 2313 | ||
2314 | /* Allocate memory for SLI-2 structures */ | 2314 | /* Allocate memory for SLI-2 structures */ |
2315 | phba->slim2p = dma_alloc_coherent(&phba->pcidev->dev, SLI2_SLIM_SIZE, | 2315 | phba->slim2p.virt = dma_alloc_coherent(&phba->pcidev->dev, |
2316 | &phba->slim2p_mapping, GFP_KERNEL); | 2316 | SLI2_SLIM_SIZE, |
2317 | if (!phba->slim2p) | 2317 | &phba->slim2p.phys, |
2318 | GFP_KERNEL); | ||
2319 | if (!phba->slim2p.virt) | ||
2318 | goto out_iounmap; | 2320 | goto out_iounmap; |
2319 | 2321 | ||
2320 | memset(phba->slim2p, 0, SLI2_SLIM_SIZE); | 2322 | memset(phba->slim2p.virt, 0, SLI2_SLIM_SIZE); |
2323 | phba->mbox = phba->slim2p.virt; | ||
2324 | phba->pcb = (phba->slim2p.virt + sizeof(MAILBOX_t)); | ||
2325 | phba->IOCBs = (phba->slim2p.virt + sizeof(MAILBOX_t) + | ||
2326 | sizeof(struct _PCB)); | ||
2321 | 2327 | ||
2322 | phba->hbqslimp.virt = dma_alloc_coherent(&phba->pcidev->dev, | 2328 | phba->hbqslimp.virt = dma_alloc_coherent(&phba->pcidev->dev, |
2323 | lpfc_sli_hbq_size(), | 2329 | lpfc_sli_hbq_size(), |
@@ -2513,11 +2519,11 @@ out_free_iocbq: | |||
2513 | } | 2519 | } |
2514 | lpfc_mem_free(phba); | 2520 | lpfc_mem_free(phba); |
2515 | out_free_hbqslimp: | 2521 | out_free_hbqslimp: |
2516 | dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), phba->hbqslimp.virt, | 2522 | dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), |
2517 | phba->hbqslimp.phys); | 2523 | phba->hbqslimp.virt, phba->hbqslimp.phys); |
2518 | out_free_slim: | 2524 | out_free_slim: |
2519 | dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, phba->slim2p, | 2525 | dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, |
2520 | phba->slim2p_mapping); | 2526 | phba->slim2p.virt, phba->slim2p.phys); |
2521 | out_iounmap: | 2527 | out_iounmap: |
2522 | iounmap(phba->ctrl_regs_memmap_p); | 2528 | iounmap(phba->ctrl_regs_memmap_p); |
2523 | out_iounmap_slim: | 2529 | out_iounmap_slim: |
@@ -2599,12 +2605,12 @@ lpfc_pci_remove_one(struct pci_dev *pdev) | |||
2599 | lpfc_scsi_free(phba); | 2605 | lpfc_scsi_free(phba); |
2600 | lpfc_mem_free(phba); | 2606 | lpfc_mem_free(phba); |
2601 | 2607 | ||
2602 | dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), phba->hbqslimp.virt, | 2608 | dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), |
2603 | phba->hbqslimp.phys); | 2609 | phba->hbqslimp.virt, phba->hbqslimp.phys); |
2604 | 2610 | ||
2605 | /* Free resources associated with SLI2 interface */ | 2611 | /* Free resources associated with SLI2 interface */ |
2606 | dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, | 2612 | dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, |
2607 | phba->slim2p, phba->slim2p_mapping); | 2613 | phba->slim2p.virt, phba->slim2p.phys); |
2608 | 2614 | ||
2609 | /* unmap adapter SLIM and Control Registers */ | 2615 | /* unmap adapter SLIM and Control Registers */ |
2610 | iounmap(phba->ctrl_regs_memmap_p); | 2616 | iounmap(phba->ctrl_regs_memmap_p); |
diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c index 7413bfdf89a4..ca358355ec9b 100644 --- a/drivers/scsi/lpfc/lpfc_mbox.c +++ b/drivers/scsi/lpfc/lpfc_mbox.c | |||
@@ -671,7 +671,7 @@ lpfc_config_pcb_setup(struct lpfc_hba * phba) | |||
671 | { | 671 | { |
672 | struct lpfc_sli *psli = &phba->sli; | 672 | struct lpfc_sli *psli = &phba->sli; |
673 | struct lpfc_sli_ring *pring; | 673 | struct lpfc_sli_ring *pring; |
674 | PCB_t *pcbp = &phba->slim2p->pcb; | 674 | PCB_t *pcbp = phba->pcb; |
675 | dma_addr_t pdma_addr; | 675 | dma_addr_t pdma_addr; |
676 | uint32_t offset; | 676 | uint32_t offset; |
677 | uint32_t iocbCnt = 0; | 677 | uint32_t iocbCnt = 0; |
@@ -700,23 +700,23 @@ lpfc_config_pcb_setup(struct lpfc_hba * phba) | |||
700 | continue; | 700 | continue; |
701 | } | 701 | } |
702 | /* Command ring setup for ring */ | 702 | /* Command ring setup for ring */ |
703 | pring->cmdringaddr = (void *) &phba->slim2p->IOCBs[iocbCnt]; | 703 | pring->cmdringaddr = (void *)&phba->IOCBs[iocbCnt]; |
704 | pcbp->rdsc[i].cmdEntries = pring->numCiocb; | 704 | pcbp->rdsc[i].cmdEntries = pring->numCiocb; |
705 | 705 | ||
706 | offset = (uint8_t *) &phba->slim2p->IOCBs[iocbCnt] - | 706 | offset = (uint8_t *) &phba->IOCBs[iocbCnt] - |
707 | (uint8_t *) phba->slim2p; | 707 | (uint8_t *) phba->slim2p.virt; |
708 | pdma_addr = phba->slim2p_mapping + offset; | 708 | pdma_addr = phba->slim2p.phys + offset; |
709 | pcbp->rdsc[i].cmdAddrHigh = putPaddrHigh(pdma_addr); | 709 | pcbp->rdsc[i].cmdAddrHigh = putPaddrHigh(pdma_addr); |
710 | pcbp->rdsc[i].cmdAddrLow = putPaddrLow(pdma_addr); | 710 | pcbp->rdsc[i].cmdAddrLow = putPaddrLow(pdma_addr); |
711 | iocbCnt += pring->numCiocb; | 711 | iocbCnt += pring->numCiocb; |
712 | 712 | ||
713 | /* Response ring setup for ring */ | 713 | /* Response ring setup for ring */ |
714 | pring->rspringaddr = (void *) &phba->slim2p->IOCBs[iocbCnt]; | 714 | pring->rspringaddr = (void *) &phba->IOCBs[iocbCnt]; |
715 | 715 | ||
716 | pcbp->rdsc[i].rspEntries = pring->numRiocb; | 716 | pcbp->rdsc[i].rspEntries = pring->numRiocb; |
717 | offset = (uint8_t *)&phba->slim2p->IOCBs[iocbCnt] - | 717 | offset = (uint8_t *)&phba->IOCBs[iocbCnt] - |
718 | (uint8_t *)phba->slim2p; | 718 | (uint8_t *)phba->slim2p.virt; |
719 | pdma_addr = phba->slim2p_mapping + offset; | 719 | pdma_addr = phba->slim2p.phys + offset; |
720 | pcbp->rdsc[i].rspAddrHigh = putPaddrHigh(pdma_addr); | 720 | pcbp->rdsc[i].rspAddrHigh = putPaddrHigh(pdma_addr); |
721 | pcbp->rdsc[i].rspAddrLow = putPaddrLow(pdma_addr); | 721 | pcbp->rdsc[i].rspAddrLow = putPaddrLow(pdma_addr); |
722 | iocbCnt += pring->numRiocb; | 722 | iocbCnt += pring->numRiocb; |
@@ -977,8 +977,8 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
977 | 977 | ||
978 | mb->un.varCfgPort.pcbLen = sizeof(PCB_t); | 978 | mb->un.varCfgPort.pcbLen = sizeof(PCB_t); |
979 | 979 | ||
980 | offset = (uint8_t *)&phba->slim2p->pcb - (uint8_t *)phba->slim2p; | 980 | offset = (uint8_t *)phba->pcb - (uint8_t *)phba->slim2p.virt; |
981 | pdma_addr = phba->slim2p_mapping + offset; | 981 | pdma_addr = phba->slim2p.phys + offset; |
982 | mb->un.varCfgPort.pcbLow = putPaddrLow(pdma_addr); | 982 | mb->un.varCfgPort.pcbLow = putPaddrLow(pdma_addr); |
983 | mb->un.varCfgPort.pcbHigh = putPaddrHigh(pdma_addr); | 983 | mb->un.varCfgPort.pcbHigh = putPaddrHigh(pdma_addr); |
984 | 984 | ||
@@ -986,12 +986,13 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
986 | 986 | ||
987 | if (phba->sli_rev == 3 && phba->vpd.sli3Feat.cerbm) { | 987 | if (phba->sli_rev == 3 && phba->vpd.sli3Feat.cerbm) { |
988 | mb->un.varCfgPort.cerbm = 1; /* Request HBQs */ | 988 | mb->un.varCfgPort.cerbm = 1; /* Request HBQs */ |
989 | mb->un.varCfgPort.ccrp = 1; /* Command Ring Polling */ | ||
990 | mb->un.varCfgPort.cinb = 1; /* Interrupt Notification Block */ | ||
989 | mb->un.varCfgPort.max_hbq = lpfc_sli_hbq_count(); | 991 | mb->un.varCfgPort.max_hbq = lpfc_sli_hbq_count(); |
990 | if (phba->max_vpi && phba->cfg_enable_npiv && | 992 | if (phba->max_vpi && phba->cfg_enable_npiv && |
991 | phba->vpd.sli3Feat.cmv) { | 993 | phba->vpd.sli3Feat.cmv) { |
992 | mb->un.varCfgPort.max_vpi = phba->max_vpi; | 994 | mb->un.varCfgPort.max_vpi = phba->max_vpi; |
993 | mb->un.varCfgPort.cmv = 1; | 995 | mb->un.varCfgPort.cmv = 1; |
994 | phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED; | ||
995 | } else | 996 | } else |
996 | mb->un.varCfgPort.max_vpi = phba->max_vpi = 0; | 997 | mb->un.varCfgPort.max_vpi = phba->max_vpi = 0; |
997 | } else | 998 | } else |
@@ -999,16 +1000,15 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
999 | mb->un.varCfgPort.sli_mode = phba->sli_rev; | 1000 | mb->un.varCfgPort.sli_mode = phba->sli_rev; |
1000 | 1001 | ||
1001 | /* Now setup pcb */ | 1002 | /* Now setup pcb */ |
1002 | phba->slim2p->pcb.type = TYPE_NATIVE_SLI2; | 1003 | phba->pcb->type = TYPE_NATIVE_SLI2; |
1003 | phba->slim2p->pcb.feature = FEATURE_INITIAL_SLI2; | 1004 | phba->pcb->feature = FEATURE_INITIAL_SLI2; |
1004 | 1005 | ||
1005 | /* Setup Mailbox pointers */ | 1006 | /* Setup Mailbox pointers */ |
1006 | phba->slim2p->pcb.mailBoxSize = offsetof(MAILBOX_t, us) + | 1007 | phba->pcb->mailBoxSize = sizeof(MAILBOX_t); |
1007 | sizeof(struct sli2_desc); | 1008 | offset = (uint8_t *)phba->mbox - (uint8_t *)phba->slim2p.virt; |
1008 | offset = (uint8_t *)&phba->slim2p->mbx - (uint8_t *)phba->slim2p; | 1009 | pdma_addr = phba->slim2p.phys + offset; |
1009 | pdma_addr = phba->slim2p_mapping + offset; | 1010 | phba->pcb->mbAddrHigh = putPaddrHigh(pdma_addr); |
1010 | phba->slim2p->pcb.mbAddrHigh = putPaddrHigh(pdma_addr); | 1011 | phba->pcb->mbAddrLow = putPaddrLow(pdma_addr); |
1011 | phba->slim2p->pcb.mbAddrLow = putPaddrLow(pdma_addr); | ||
1012 | 1012 | ||
1013 | /* | 1013 | /* |
1014 | * Setup Host Group ring pointer. | 1014 | * Setup Host Group ring pointer. |
@@ -1069,13 +1069,13 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
1069 | } | 1069 | } |
1070 | 1070 | ||
1071 | /* mask off BAR0's flag bits 0 - 3 */ | 1071 | /* mask off BAR0's flag bits 0 - 3 */ |
1072 | phba->slim2p->pcb.hgpAddrLow = (bar_low & PCI_BASE_ADDRESS_MEM_MASK) + | 1072 | phba->pcb->hgpAddrLow = (bar_low & PCI_BASE_ADDRESS_MEM_MASK) + |
1073 | (void __iomem *) phba->host_gp - | 1073 | (void __iomem *)phba->host_gp - |
1074 | (void __iomem *)phba->MBslimaddr; | 1074 | (void __iomem *)phba->MBslimaddr; |
1075 | if (bar_low & PCI_BASE_ADDRESS_MEM_TYPE_64) | 1075 | if (bar_low & PCI_BASE_ADDRESS_MEM_TYPE_64) |
1076 | phba->slim2p->pcb.hgpAddrHigh = bar_high; | 1076 | phba->pcb->hgpAddrHigh = bar_high; |
1077 | else | 1077 | else |
1078 | phba->slim2p->pcb.hgpAddrHigh = 0; | 1078 | phba->pcb->hgpAddrHigh = 0; |
1079 | /* write HGP data to SLIM at the required longword offset */ | 1079 | /* write HGP data to SLIM at the required longword offset */ |
1080 | memset(&hgp, 0, sizeof(struct lpfc_hgp)); | 1080 | memset(&hgp, 0, sizeof(struct lpfc_hgp)); |
1081 | 1081 | ||
@@ -1085,17 +1085,19 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
1085 | } | 1085 | } |
1086 | 1086 | ||
1087 | /* Setup Port Group ring pointer */ | 1087 | /* Setup Port Group ring pointer */ |
1088 | if (phba->sli_rev == 3) | 1088 | if (phba->sli3_options & LPFC_SLI3_INB_ENABLED) { |
1089 | pgp_offset = (uint8_t *)&phba->slim2p->mbx.us.s3_pgp.port - | 1089 | pgp_offset = offsetof(struct lpfc_sli2_slim, |
1090 | (uint8_t *)phba->slim2p; | 1090 | mbx.us.s3_inb_pgp.port); |
1091 | else | 1091 | phba->hbq_get = phba->mbox->us.s3_inb_pgp.hbq_get; |
1092 | pgp_offset = (uint8_t *)&phba->slim2p->mbx.us.s2.port - | 1092 | } else if (phba->sli_rev == 3) { |
1093 | (uint8_t *)phba->slim2p; | 1093 | pgp_offset = offsetof(struct lpfc_sli2_slim, |
1094 | 1094 | mbx.us.s3_pgp.port); | |
1095 | pdma_addr = phba->slim2p_mapping + pgp_offset; | 1095 | phba->hbq_get = phba->mbox->us.s3_pgp.hbq_get; |
1096 | phba->slim2p->pcb.pgpAddrHigh = putPaddrHigh(pdma_addr); | 1096 | } else |
1097 | phba->slim2p->pcb.pgpAddrLow = putPaddrLow(pdma_addr); | 1097 | pgp_offset = offsetof(struct lpfc_sli2_slim, mbx.us.s2.port); |
1098 | phba->hbq_get = &phba->slim2p->mbx.us.s3_pgp.hbq_get[0]; | 1098 | pdma_addr = phba->slim2p.phys + pgp_offset; |
1099 | phba->pcb->pgpAddrHigh = putPaddrHigh(pdma_addr); | ||
1100 | phba->pcb->pgpAddrLow = putPaddrLow(pdma_addr); | ||
1099 | 1101 | ||
1100 | /* Use callback routine to setp rings in the pcb */ | 1102 | /* Use callback routine to setp rings in the pcb */ |
1101 | lpfc_config_pcb_setup(phba); | 1103 | lpfc_config_pcb_setup(phba); |
@@ -1110,8 +1112,7 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
1110 | } | 1112 | } |
1111 | 1113 | ||
1112 | /* Swap PCB if needed */ | 1114 | /* Swap PCB if needed */ |
1113 | lpfc_sli_pcimem_bcopy(&phba->slim2p->pcb, &phba->slim2p->pcb, | 1115 | lpfc_sli_pcimem_bcopy(phba->pcb, phba->pcb, sizeof(PCB_t)); |
1114 | sizeof(PCB_t)); | ||
1115 | } | 1116 | } |
1116 | 1117 | ||
1117 | /** | 1118 | /** |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index a22bdf9548a6..c1bb90cf0d06 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -198,7 +198,9 @@ lpfc_new_scsi_buf(struct lpfc_vport *vport) | |||
198 | struct lpfc_scsi_buf *psb; | 198 | struct lpfc_scsi_buf *psb; |
199 | struct ulp_bde64 *bpl; | 199 | struct ulp_bde64 *bpl; |
200 | IOCB_t *iocb; | 200 | IOCB_t *iocb; |
201 | dma_addr_t pdma_phys; | 201 | dma_addr_t pdma_phys_fcp_cmd; |
202 | dma_addr_t pdma_phys_fcp_rsp; | ||
203 | dma_addr_t pdma_phys_bpl; | ||
202 | uint16_t iotag; | 204 | uint16_t iotag; |
203 | 205 | ||
204 | psb = kzalloc(sizeof(struct lpfc_scsi_buf), GFP_KERNEL); | 206 | psb = kzalloc(sizeof(struct lpfc_scsi_buf), GFP_KERNEL); |
@@ -238,40 +240,60 @@ lpfc_new_scsi_buf(struct lpfc_vport *vport) | |||
238 | 240 | ||
239 | /* Initialize local short-hand pointers. */ | 241 | /* Initialize local short-hand pointers. */ |
240 | bpl = psb->fcp_bpl; | 242 | bpl = psb->fcp_bpl; |
241 | pdma_phys = psb->dma_handle; | 243 | pdma_phys_fcp_cmd = psb->dma_handle; |
244 | pdma_phys_fcp_rsp = psb->dma_handle + sizeof(struct fcp_cmnd); | ||
245 | pdma_phys_bpl = psb->dma_handle + sizeof(struct fcp_cmnd) + | ||
246 | sizeof(struct fcp_rsp); | ||
242 | 247 | ||
243 | /* | 248 | /* |
244 | * The first two bdes are the FCP_CMD and FCP_RSP. The balance are sg | 249 | * The first two bdes are the FCP_CMD and FCP_RSP. The balance are sg |
245 | * list bdes. Initialize the first two and leave the rest for | 250 | * list bdes. Initialize the first two and leave the rest for |
246 | * queuecommand. | 251 | * queuecommand. |
247 | */ | 252 | */ |
248 | bpl->addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys)); | 253 | bpl[0].addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys_fcp_cmd)); |
249 | bpl->addrLow = le32_to_cpu(putPaddrLow(pdma_phys)); | 254 | bpl[0].addrLow = le32_to_cpu(putPaddrLow(pdma_phys_fcp_cmd)); |
250 | bpl->tus.f.bdeSize = sizeof (struct fcp_cmnd); | 255 | bpl[0].tus.f.bdeSize = sizeof(struct fcp_cmnd); |
251 | bpl->tus.f.bdeFlags = BUFF_USE_CMND; | 256 | bpl[0].tus.f.bdeFlags = BUFF_TYPE_BDE_64; |
252 | bpl->tus.w = le32_to_cpu(bpl->tus.w); | 257 | bpl[0].tus.w = le32_to_cpu(bpl->tus.w); |
253 | bpl++; | ||
254 | 258 | ||
255 | /* Setup the physical region for the FCP RSP */ | 259 | /* Setup the physical region for the FCP RSP */ |
256 | pdma_phys += sizeof (struct fcp_cmnd); | 260 | bpl[1].addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys_fcp_rsp)); |
257 | bpl->addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys)); | 261 | bpl[1].addrLow = le32_to_cpu(putPaddrLow(pdma_phys_fcp_rsp)); |
258 | bpl->addrLow = le32_to_cpu(putPaddrLow(pdma_phys)); | 262 | bpl[1].tus.f.bdeSize = sizeof(struct fcp_rsp); |
259 | bpl->tus.f.bdeSize = sizeof (struct fcp_rsp); | 263 | bpl[1].tus.f.bdeFlags = BUFF_TYPE_BDE_64; |
260 | bpl->tus.f.bdeFlags = (BUFF_USE_CMND | BUFF_USE_RCV); | 264 | bpl[1].tus.w = le32_to_cpu(bpl->tus.w); |
261 | bpl->tus.w = le32_to_cpu(bpl->tus.w); | ||
262 | 265 | ||
263 | /* | 266 | /* |
264 | * Since the IOCB for the FCP I/O is built into this lpfc_scsi_buf, | 267 | * Since the IOCB for the FCP I/O is built into this lpfc_scsi_buf, |
265 | * initialize it with all known data now. | 268 | * initialize it with all known data now. |
266 | */ | 269 | */ |
267 | pdma_phys += (sizeof (struct fcp_rsp)); | ||
268 | iocb = &psb->cur_iocbq.iocb; | 270 | iocb = &psb->cur_iocbq.iocb; |
269 | iocb->un.fcpi64.bdl.ulpIoTag32 = 0; | 271 | iocb->un.fcpi64.bdl.ulpIoTag32 = 0; |
270 | iocb->un.fcpi64.bdl.addrHigh = putPaddrHigh(pdma_phys); | 272 | if (phba->sli_rev == 3) { |
271 | iocb->un.fcpi64.bdl.addrLow = putPaddrLow(pdma_phys); | 273 | /* fill in immediate fcp command BDE */ |
272 | iocb->un.fcpi64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64)); | 274 | iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BDE_IMMED; |
273 | iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BDL; | 275 | iocb->un.fcpi64.bdl.bdeSize = sizeof(struct fcp_cmnd); |
274 | iocb->ulpBdeCount = 1; | 276 | iocb->un.fcpi64.bdl.addrLow = offsetof(IOCB_t, |
277 | unsli3.fcp_ext.icd); | ||
278 | iocb->un.fcpi64.bdl.addrHigh = 0; | ||
279 | iocb->ulpBdeCount = 0; | ||
280 | iocb->ulpLe = 0; | ||
281 | /* fill in responce BDE */ | ||
282 | iocb->unsli3.fcp_ext.rbde.tus.f.bdeFlags = BUFF_TYPE_BDE_64; | ||
283 | iocb->unsli3.fcp_ext.rbde.tus.f.bdeSize = | ||
284 | sizeof(struct fcp_rsp); | ||
285 | iocb->unsli3.fcp_ext.rbde.addrLow = | ||
286 | putPaddrLow(pdma_phys_fcp_rsp); | ||
287 | iocb->unsli3.fcp_ext.rbde.addrHigh = | ||
288 | putPaddrHigh(pdma_phys_fcp_rsp); | ||
289 | } else { | ||
290 | iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BLP_64; | ||
291 | iocb->un.fcpi64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64)); | ||
292 | iocb->un.fcpi64.bdl.addrLow = putPaddrLow(pdma_phys_bpl); | ||
293 | iocb->un.fcpi64.bdl.addrHigh = putPaddrHigh(pdma_phys_bpl); | ||
294 | iocb->ulpBdeCount = 1; | ||
295 | iocb->ulpLe = 1; | ||
296 | } | ||
275 | iocb->ulpClass = CLASS3; | 297 | iocb->ulpClass = CLASS3; |
276 | 298 | ||
277 | return psb; | 299 | return psb; |
@@ -313,8 +335,9 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | |||
313 | struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd; | 335 | struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd; |
314 | struct ulp_bde64 *bpl = lpfc_cmd->fcp_bpl; | 336 | struct ulp_bde64 *bpl = lpfc_cmd->fcp_bpl; |
315 | IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb; | 337 | IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb; |
338 | struct ulp_bde64 *data_bde = iocb_cmd->unsli3.fcp_ext.dbde; | ||
316 | dma_addr_t physaddr; | 339 | dma_addr_t physaddr; |
317 | uint32_t i, num_bde = 0; | 340 | uint32_t num_bde = 0; |
318 | int nseg, datadir = scsi_cmnd->sc_data_direction; | 341 | int nseg, datadir = scsi_cmnd->sc_data_direction; |
319 | 342 | ||
320 | /* | 343 | /* |
@@ -352,33 +375,64 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | |||
352 | * during probe that limits the number of sg elements in any | 375 | * during probe that limits the number of sg elements in any |
353 | * single scsi command. Just run through the seg_cnt and format | 376 | * single scsi command. Just run through the seg_cnt and format |
354 | * the bde's. | 377 | * the bde's. |
378 | * When using SLI-3 the driver will try to fit all the BDEs into | ||
379 | * the IOCB. If it can't then the BDEs get added to a BPL as it | ||
380 | * does for SLI-2 mode. | ||
355 | */ | 381 | */ |
356 | scsi_for_each_sg(scsi_cmnd, sgel, nseg, i) { | 382 | scsi_for_each_sg(scsi_cmnd, sgel, nseg, num_bde) { |
357 | physaddr = sg_dma_address(sgel); | 383 | physaddr = sg_dma_address(sgel); |
358 | bpl->addrLow = le32_to_cpu(putPaddrLow(physaddr)); | 384 | if (phba->sli_rev == 3 && |
359 | bpl->addrHigh = le32_to_cpu(putPaddrHigh(physaddr)); | 385 | nseg <= LPFC_EXT_DATA_BDE_COUNT) { |
360 | bpl->tus.f.bdeSize = sg_dma_len(sgel); | 386 | data_bde->tus.f.bdeFlags = BUFF_TYPE_BDE_64; |
361 | if (datadir == DMA_TO_DEVICE) | 387 | data_bde->tus.f.bdeSize = sg_dma_len(sgel); |
362 | bpl->tus.f.bdeFlags = 0; | 388 | data_bde->addrLow = putPaddrLow(physaddr); |
363 | else | 389 | data_bde->addrHigh = putPaddrHigh(physaddr); |
364 | bpl->tus.f.bdeFlags = BUFF_USE_RCV; | 390 | data_bde++; |
365 | bpl->tus.w = le32_to_cpu(bpl->tus.w); | 391 | } else { |
366 | bpl++; | 392 | bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64; |
367 | num_bde++; | 393 | bpl->tus.f.bdeSize = sg_dma_len(sgel); |
394 | bpl->tus.w = le32_to_cpu(bpl->tus.w); | ||
395 | bpl->addrLow = | ||
396 | le32_to_cpu(putPaddrLow(physaddr)); | ||
397 | bpl->addrHigh = | ||
398 | le32_to_cpu(putPaddrHigh(physaddr)); | ||
399 | bpl++; | ||
400 | } | ||
368 | } | 401 | } |
369 | } | 402 | } |
370 | 403 | ||
371 | /* | 404 | /* |
372 | * Finish initializing those IOCB fields that are dependent on the | 405 | * Finish initializing those IOCB fields that are dependent on the |
373 | * scsi_cmnd request_buffer. Note that the bdeSize is explicitly | 406 | * scsi_cmnd request_buffer. Note that for SLI-2 the bdeSize is |
374 | * reinitialized since all iocb memory resources are used many times | 407 | * explicitly reinitialized and for SLI-3 the extended bde count is |
375 | * for transmit, receive, and continuation bpl's. | 408 | * explicitly reinitialized since all iocb memory resources are reused. |
376 | */ | 409 | */ |
377 | iocb_cmd->un.fcpi64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64)); | 410 | if (phba->sli_rev == 3) { |
378 | iocb_cmd->un.fcpi64.bdl.bdeSize += | 411 | if (num_bde > LPFC_EXT_DATA_BDE_COUNT) { |
379 | (num_bde * sizeof (struct ulp_bde64)); | 412 | /* |
380 | iocb_cmd->ulpBdeCount = 1; | 413 | * The extended IOCB format can only fit 3 BDE or a BPL. |
381 | iocb_cmd->ulpLe = 1; | 414 | * This I/O has more than 3 BDE so the 1st data bde will |
415 | * be a BPL that is filled in here. | ||
416 | */ | ||
417 | physaddr = lpfc_cmd->dma_handle; | ||
418 | data_bde->tus.f.bdeFlags = BUFF_TYPE_BLP_64; | ||
419 | data_bde->tus.f.bdeSize = (num_bde * | ||
420 | sizeof(struct ulp_bde64)); | ||
421 | physaddr += (sizeof(struct fcp_cmnd) + | ||
422 | sizeof(struct fcp_rsp) + | ||
423 | (2 * sizeof(struct ulp_bde64))); | ||
424 | data_bde->addrHigh = putPaddrHigh(physaddr); | ||
425 | data_bde->addrLow = putPaddrLow(physaddr); | ||
426 | /* ebde count includes the responce bde and data bpl */ | ||
427 | iocb_cmd->unsli3.fcp_ext.ebde_count = 2; | ||
428 | } else { | ||
429 | /* ebde count includes the responce bde and data bdes */ | ||
430 | iocb_cmd->unsli3.fcp_ext.ebde_count = (num_bde + 1); | ||
431 | } | ||
432 | } else { | ||
433 | iocb_cmd->un.fcpi64.bdl.bdeSize = | ||
434 | ((num_bde + 2) * sizeof(struct ulp_bde64)); | ||
435 | } | ||
382 | fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd)); | 436 | fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd)); |
383 | return 0; | 437 | return 0; |
384 | } | 438 | } |
@@ -692,6 +746,24 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, | |||
692 | lpfc_release_scsi_buf(phba, lpfc_cmd); | 746 | lpfc_release_scsi_buf(phba, lpfc_cmd); |
693 | } | 747 | } |
694 | 748 | ||
749 | /** | ||
750 | * lpfc_fcpcmd_to_iocb - copy the fcp_cmd data into the IOCB. | ||
751 | * @data: A pointer to the immediate command data portion of the IOCB. | ||
752 | * @fcp_cmnd: The FCP Command that is provided by the SCSI layer. | ||
753 | * | ||
754 | * The routine copies the entire FCP command from @fcp_cmnd to @data while | ||
755 | * byte swapping the data to big endian format for transmission on the wire. | ||
756 | **/ | ||
757 | static void | ||
758 | lpfc_fcpcmd_to_iocb(uint8_t *data, struct fcp_cmnd *fcp_cmnd) | ||
759 | { | ||
760 | int i, j; | ||
761 | for (i = 0, j = 0; i < sizeof(struct fcp_cmnd); | ||
762 | i += sizeof(uint32_t), j++) { | ||
763 | ((uint32_t *)data)[j] = cpu_to_be32(((uint32_t *)fcp_cmnd)[j]); | ||
764 | } | ||
765 | } | ||
766 | |||
695 | static void | 767 | static void |
696 | lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, | 768 | lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, |
697 | struct lpfc_nodelist *pnode) | 769 | struct lpfc_nodelist *pnode) |
@@ -758,7 +830,8 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, | |||
758 | fcp_cmnd->fcpCntl3 = 0; | 830 | fcp_cmnd->fcpCntl3 = 0; |
759 | phba->fc4ControlRequests++; | 831 | phba->fc4ControlRequests++; |
760 | } | 832 | } |
761 | 833 | if (phba->sli_rev == 3) | |
834 | lpfc_fcpcmd_to_iocb(iocb_cmd->unsli3.fcp_ext.icd, fcp_cmnd); | ||
762 | /* | 835 | /* |
763 | * Finish initializing those IOCB fields that are independent | 836 | * Finish initializing those IOCB fields that are independent |
764 | * of the scsi_cmnd request_buffer | 837 | * of the scsi_cmnd request_buffer |
@@ -798,11 +871,13 @@ lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_vport *vport, | |||
798 | piocb = &piocbq->iocb; | 871 | piocb = &piocbq->iocb; |
799 | 872 | ||
800 | fcp_cmnd = lpfc_cmd->fcp_cmnd; | 873 | fcp_cmnd = lpfc_cmd->fcp_cmnd; |
801 | int_to_scsilun(lun, &lpfc_cmd->fcp_cmnd->fcp_lun); | 874 | /* Clear out any old data in the FCP command area */ |
875 | memset(fcp_cmnd, 0, sizeof(struct fcp_cmnd)); | ||
876 | int_to_scsilun(lun, &fcp_cmnd->fcp_lun); | ||
802 | fcp_cmnd->fcpCntl2 = task_mgmt_cmd; | 877 | fcp_cmnd->fcpCntl2 = task_mgmt_cmd; |
803 | 878 | if (vport->phba->sli_rev == 3) | |
879 | lpfc_fcpcmd_to_iocb(piocb->unsli3.fcp_ext.icd, fcp_cmnd); | ||
804 | piocb->ulpCommand = CMD_FCP_ICMND64_CR; | 880 | piocb->ulpCommand = CMD_FCP_ICMND64_CR; |
805 | |||
806 | piocb->ulpContext = ndlp->nlp_rpi; | 881 | piocb->ulpContext = ndlp->nlp_rpi; |
807 | if (ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) { | 882 | if (ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) { |
808 | piocb->ulpFCP2Rcvy = 1; | 883 | piocb->ulpFCP2Rcvy = 1; |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 3cf488496d86..77afa2ba6a2b 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -406,11 +406,8 @@ lpfc_sli_ringtx_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | |||
406 | static IOCB_t * | 406 | static IOCB_t * |
407 | lpfc_sli_next_iocb_slot (struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | 407 | lpfc_sli_next_iocb_slot (struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
408 | { | 408 | { |
409 | struct lpfc_pgp *pgp = (phba->sli_rev == 3) ? | 409 | struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno]; |
410 | &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] : | ||
411 | &phba->slim2p->mbx.us.s2.port[pring->ringno]; | ||
412 | uint32_t max_cmd_idx = pring->numCiocb; | 410 | uint32_t max_cmd_idx = pring->numCiocb; |
413 | |||
414 | if ((pring->next_cmdidx == pring->cmdidx) && | 411 | if ((pring->next_cmdidx == pring->cmdidx) && |
415 | (++pring->next_cmdidx >= max_cmd_idx)) | 412 | (++pring->next_cmdidx >= max_cmd_idx)) |
416 | pring->next_cmdidx = 0; | 413 | pring->next_cmdidx = 0; |
@@ -625,9 +622,11 @@ lpfc_sli_update_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | |||
625 | /* | 622 | /* |
626 | * Tell the HBA that there is work to do in this ring. | 623 | * Tell the HBA that there is work to do in this ring. |
627 | */ | 624 | */ |
628 | wmb(); | 625 | if (!(phba->sli3_options & LPFC_SLI3_CRP_ENABLED)) { |
629 | writel(CA_R0ATT << (ringno * 4), phba->CAregaddr); | 626 | wmb(); |
630 | readl(phba->CAregaddr); /* flush */ | 627 | writel(CA_R0ATT << (ringno * 4), phba->CAregaddr); |
628 | readl(phba->CAregaddr); /* flush */ | ||
629 | } | ||
631 | } | 630 | } |
632 | 631 | ||
633 | /** | 632 | /** |
@@ -1654,9 +1653,7 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
1654 | static void | 1653 | static void |
1655 | lpfc_sli_rsp_pointers_error(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | 1654 | lpfc_sli_rsp_pointers_error(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
1656 | { | 1655 | { |
1657 | struct lpfc_pgp *pgp = (phba->sli_rev == 3) ? | 1656 | struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno]; |
1658 | &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] : | ||
1659 | &phba->slim2p->mbx.us.s2.port[pring->ringno]; | ||
1660 | /* | 1657 | /* |
1661 | * Ring <ringno> handler: portRspPut <portRspPut> is bigger then | 1658 | * Ring <ringno> handler: portRspPut <portRspPut> is bigger then |
1662 | * rsp ring <portRspMax> | 1659 | * rsp ring <portRspMax> |
@@ -1704,7 +1701,7 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba *phba) | |||
1704 | IOCB_t *entry = NULL; | 1701 | IOCB_t *entry = NULL; |
1705 | struct lpfc_iocbq *cmdiocbq = NULL; | 1702 | struct lpfc_iocbq *cmdiocbq = NULL; |
1706 | struct lpfc_iocbq rspiocbq; | 1703 | struct lpfc_iocbq rspiocbq; |
1707 | struct lpfc_pgp *pgp; | 1704 | struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno]; |
1708 | uint32_t status; | 1705 | uint32_t status; |
1709 | uint32_t portRspPut, portRspMax; | 1706 | uint32_t portRspPut, portRspMax; |
1710 | int type; | 1707 | int type; |
@@ -1714,11 +1711,6 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba *phba) | |||
1714 | 1711 | ||
1715 | pring->stats.iocb_event++; | 1712 | pring->stats.iocb_event++; |
1716 | 1713 | ||
1717 | pgp = (phba->sli_rev == 3) ? | ||
1718 | &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] : | ||
1719 | &phba->slim2p->mbx.us.s2.port[pring->ringno]; | ||
1720 | |||
1721 | |||
1722 | /* | 1714 | /* |
1723 | * The next available response entry should never exceed the maximum | 1715 | * The next available response entry should never exceed the maximum |
1724 | * entries. If it does, treat it as an adapter hardware error. | 1716 | * entries. If it does, treat it as an adapter hardware error. |
@@ -1870,9 +1862,7 @@ static int | |||
1870 | lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba, | 1862 | lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba, |
1871 | struct lpfc_sli_ring *pring, uint32_t mask) | 1863 | struct lpfc_sli_ring *pring, uint32_t mask) |
1872 | { | 1864 | { |
1873 | struct lpfc_pgp *pgp = (phba->sli_rev == 3) ? | 1865 | struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno]; |
1874 | &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] : | ||
1875 | &phba->slim2p->mbx.us.s2.port[pring->ringno]; | ||
1876 | IOCB_t *irsp = NULL; | 1866 | IOCB_t *irsp = NULL; |
1877 | IOCB_t *entry = NULL; | 1867 | IOCB_t *entry = NULL; |
1878 | struct lpfc_iocbq *cmdiocbq = NULL; | 1868 | struct lpfc_iocbq *cmdiocbq = NULL; |
@@ -2064,9 +2054,7 @@ int | |||
2064 | lpfc_sli_handle_slow_ring_event(struct lpfc_hba *phba, | 2054 | lpfc_sli_handle_slow_ring_event(struct lpfc_hba *phba, |
2065 | struct lpfc_sli_ring *pring, uint32_t mask) | 2055 | struct lpfc_sli_ring *pring, uint32_t mask) |
2066 | { | 2056 | { |
2067 | struct lpfc_pgp *pgp = (phba->sli_rev == 3) ? | 2057 | struct lpfc_pgp *pgp; |
2068 | &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] : | ||
2069 | &phba->slim2p->mbx.us.s2.port[pring->ringno]; | ||
2070 | IOCB_t *entry; | 2058 | IOCB_t *entry; |
2071 | IOCB_t *irsp = NULL; | 2059 | IOCB_t *irsp = NULL; |
2072 | struct lpfc_iocbq *rspiocbp = NULL; | 2060 | struct lpfc_iocbq *rspiocbp = NULL; |
@@ -2080,6 +2068,7 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba *phba, | |||
2080 | int rc = 1; | 2068 | int rc = 1; |
2081 | unsigned long iflag; | 2069 | unsigned long iflag; |
2082 | 2070 | ||
2071 | pgp = &phba->port_gp[pring->ringno]; | ||
2083 | spin_lock_irqsave(&phba->hbalock, iflag); | 2072 | spin_lock_irqsave(&phba->hbalock, iflag); |
2084 | pring->stats.iocb_event++; | 2073 | pring->stats.iocb_event++; |
2085 | 2074 | ||
@@ -2990,13 +2979,15 @@ lpfc_do_config_port(struct lpfc_hba *phba, int sli_mode) | |||
2990 | if (rc == -ERESTART) { | 2979 | if (rc == -ERESTART) { |
2991 | phba->link_state = LPFC_LINK_UNKNOWN; | 2980 | phba->link_state = LPFC_LINK_UNKNOWN; |
2992 | continue; | 2981 | continue; |
2993 | } else if (rc) { | 2982 | } else if (rc) |
2994 | break; | 2983 | break; |
2995 | } | ||
2996 | |||
2997 | phba->link_state = LPFC_INIT_MBX_CMDS; | 2984 | phba->link_state = LPFC_INIT_MBX_CMDS; |
2998 | lpfc_config_port(phba, pmb); | 2985 | lpfc_config_port(phba, pmb); |
2999 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); | 2986 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); |
2987 | phba->sli3_options &= ~(LPFC_SLI3_NPIV_ENABLED | | ||
2988 | LPFC_SLI3_HBQ_ENABLED | | ||
2989 | LPFC_SLI3_CRP_ENABLED | | ||
2990 | LPFC_SLI3_INB_ENABLED); | ||
3000 | if (rc != MBX_SUCCESS) { | 2991 | if (rc != MBX_SUCCESS) { |
3001 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 2992 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
3002 | "0442 Adapter failed to init, mbxCmd x%x " | 2993 | "0442 Adapter failed to init, mbxCmd x%x " |
@@ -3006,25 +2997,44 @@ lpfc_do_config_port(struct lpfc_hba *phba, int sli_mode) | |||
3006 | phba->sli.sli_flag &= ~LPFC_SLI2_ACTIVE; | 2997 | phba->sli.sli_flag &= ~LPFC_SLI2_ACTIVE; |
3007 | spin_unlock_irq(&phba->hbalock); | 2998 | spin_unlock_irq(&phba->hbalock); |
3008 | rc = -ENXIO; | 2999 | rc = -ENXIO; |
3009 | } else { | 3000 | } else |
3010 | done = 1; | 3001 | done = 1; |
3011 | phba->max_vpi = (phba->max_vpi && | ||
3012 | pmb->mb.un.varCfgPort.gmv) != 0 | ||
3013 | ? pmb->mb.un.varCfgPort.max_vpi | ||
3014 | : 0; | ||
3015 | } | ||
3016 | } | 3002 | } |
3017 | |||
3018 | if (!done) { | 3003 | if (!done) { |
3019 | rc = -EINVAL; | 3004 | rc = -EINVAL; |
3020 | goto do_prep_failed; | 3005 | goto do_prep_failed; |
3021 | } | 3006 | } |
3022 | 3007 | if (pmb->mb.un.varCfgPort.sli_mode == 3) { | |
3023 | if ((pmb->mb.un.varCfgPort.sli_mode == 3) && | 3008 | if (!pmb->mb.un.varCfgPort.cMA) { |
3024 | (!pmb->mb.un.varCfgPort.cMA)) { | 3009 | rc = -ENXIO; |
3025 | rc = -ENXIO; | 3010 | goto do_prep_failed; |
3011 | } | ||
3012 | if (phba->max_vpi && pmb->mb.un.varCfgPort.gmv) { | ||
3013 | phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED; | ||
3014 | phba->max_vpi = pmb->mb.un.varCfgPort.max_vpi; | ||
3015 | } else | ||
3016 | phba->max_vpi = 0; | ||
3017 | if (pmb->mb.un.varCfgPort.gerbm) | ||
3018 | phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED; | ||
3019 | if (pmb->mb.un.varCfgPort.gcrp) | ||
3020 | phba->sli3_options |= LPFC_SLI3_CRP_ENABLED; | ||
3021 | if (pmb->mb.un.varCfgPort.ginb) { | ||
3022 | phba->sli3_options |= LPFC_SLI3_INB_ENABLED; | ||
3023 | phba->port_gp = phba->mbox->us.s3_inb_pgp.port; | ||
3024 | phba->inb_ha_copy = &phba->mbox->us.s3_inb_pgp.ha_copy; | ||
3025 | phba->inb_counter = &phba->mbox->us.s3_inb_pgp.counter; | ||
3026 | phba->inb_last_counter = | ||
3027 | phba->mbox->us.s3_inb_pgp.counter; | ||
3028 | } else { | ||
3029 | phba->port_gp = phba->mbox->us.s3_pgp.port; | ||
3030 | phba->inb_ha_copy = NULL; | ||
3031 | phba->inb_counter = NULL; | ||
3032 | } | ||
3033 | } else { | ||
3034 | phba->port_gp = phba->mbox->us.s2.port; | ||
3035 | phba->inb_ha_copy = NULL; | ||
3036 | phba->inb_counter = NULL; | ||
3026 | } | 3037 | } |
3027 | |||
3028 | do_prep_failed: | 3038 | do_prep_failed: |
3029 | mempool_free(pmb, phba->mbox_mem_pool); | 3039 | mempool_free(pmb, phba->mbox_mem_pool); |
3030 | return rc; | 3040 | return rc; |
@@ -3085,9 +3095,6 @@ lpfc_sli_hba_setup(struct lpfc_hba *phba) | |||
3085 | if (phba->sli_rev == 3) { | 3095 | if (phba->sli_rev == 3) { |
3086 | phba->iocb_cmd_size = SLI3_IOCB_CMD_SIZE; | 3096 | phba->iocb_cmd_size = SLI3_IOCB_CMD_SIZE; |
3087 | phba->iocb_rsp_size = SLI3_IOCB_RSP_SIZE; | 3097 | phba->iocb_rsp_size = SLI3_IOCB_RSP_SIZE; |
3088 | phba->sli3_options |= LPFC_SLI3_ENABLED; | ||
3089 | phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED; | ||
3090 | |||
3091 | } else { | 3098 | } else { |
3092 | phba->iocb_cmd_size = SLI2_IOCB_CMD_SIZE; | 3099 | phba->iocb_cmd_size = SLI2_IOCB_CMD_SIZE; |
3093 | phba->iocb_rsp_size = SLI2_IOCB_RSP_SIZE; | 3100 | phba->iocb_rsp_size = SLI2_IOCB_RSP_SIZE; |
@@ -3255,7 +3262,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) | |||
3255 | int i; | 3262 | int i; |
3256 | unsigned long timeout; | 3263 | unsigned long timeout; |
3257 | unsigned long drvr_flag = 0; | 3264 | unsigned long drvr_flag = 0; |
3258 | volatile uint32_t word0, ldata; | 3265 | uint32_t word0, ldata; |
3259 | void __iomem *to_slim; | 3266 | void __iomem *to_slim; |
3260 | int processing_queue = 0; | 3267 | int processing_queue = 0; |
3261 | 3268 | ||
@@ -3415,12 +3422,11 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) | |||
3415 | 3422 | ||
3416 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { | 3423 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { |
3417 | /* First copy command data to host SLIM area */ | 3424 | /* First copy command data to host SLIM area */ |
3418 | lpfc_sli_pcimem_bcopy(mb, &phba->slim2p->mbx, MAILBOX_CMD_SIZE); | 3425 | lpfc_sli_pcimem_bcopy(mb, phba->mbox, MAILBOX_CMD_SIZE); |
3419 | } else { | 3426 | } else { |
3420 | if (mb->mbxCommand == MBX_CONFIG_PORT) { | 3427 | if (mb->mbxCommand == MBX_CONFIG_PORT) { |
3421 | /* copy command data into host mbox for cmpl */ | 3428 | /* copy command data into host mbox for cmpl */ |
3422 | lpfc_sli_pcimem_bcopy(mb, &phba->slim2p->mbx, | 3429 | lpfc_sli_pcimem_bcopy(mb, phba->mbox, MAILBOX_CMD_SIZE); |
3423 | MAILBOX_CMD_SIZE); | ||
3424 | } | 3430 | } |
3425 | 3431 | ||
3426 | /* First copy mbox command data to HBA SLIM, skip past first | 3432 | /* First copy mbox command data to HBA SLIM, skip past first |
@@ -3430,7 +3436,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) | |||
3430 | MAILBOX_CMD_SIZE - sizeof (uint32_t)); | 3436 | MAILBOX_CMD_SIZE - sizeof (uint32_t)); |
3431 | 3437 | ||
3432 | /* Next copy over first word, with mbxOwner set */ | 3438 | /* Next copy over first word, with mbxOwner set */ |
3433 | ldata = *((volatile uint32_t *)mb); | 3439 | ldata = *((uint32_t *)mb); |
3434 | to_slim = phba->MBslimaddr; | 3440 | to_slim = phba->MBslimaddr; |
3435 | writel(ldata, to_slim); | 3441 | writel(ldata, to_slim); |
3436 | readl(to_slim); /* flush */ | 3442 | readl(to_slim); /* flush */ |
@@ -3462,7 +3468,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) | |||
3462 | 3468 | ||
3463 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { | 3469 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { |
3464 | /* First read mbox status word */ | 3470 | /* First read mbox status word */ |
3465 | word0 = *((volatile uint32_t *)&phba->slim2p->mbx); | 3471 | word0 = *((uint32_t *)phba->mbox); |
3466 | word0 = le32_to_cpu(word0); | 3472 | word0 = le32_to_cpu(word0); |
3467 | } else { | 3473 | } else { |
3468 | /* First read mbox status word */ | 3474 | /* First read mbox status word */ |
@@ -3501,12 +3507,11 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) | |||
3501 | 3507 | ||
3502 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { | 3508 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { |
3503 | /* First copy command data */ | 3509 | /* First copy command data */ |
3504 | word0 = *((volatile uint32_t *) | 3510 | word0 = *((uint32_t *)phba->mbox); |
3505 | &phba->slim2p->mbx); | ||
3506 | word0 = le32_to_cpu(word0); | 3511 | word0 = le32_to_cpu(word0); |
3507 | if (mb->mbxCommand == MBX_CONFIG_PORT) { | 3512 | if (mb->mbxCommand == MBX_CONFIG_PORT) { |
3508 | MAILBOX_t *slimmb; | 3513 | MAILBOX_t *slimmb; |
3509 | volatile uint32_t slimword0; | 3514 | uint32_t slimword0; |
3510 | /* Check real SLIM for any errors */ | 3515 | /* Check real SLIM for any errors */ |
3511 | slimword0 = readl(phba->MBslimaddr); | 3516 | slimword0 = readl(phba->MBslimaddr); |
3512 | slimmb = (MAILBOX_t *) & slimword0; | 3517 | slimmb = (MAILBOX_t *) & slimword0; |
@@ -3527,8 +3532,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) | |||
3527 | 3532 | ||
3528 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { | 3533 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { |
3529 | /* copy results back to user */ | 3534 | /* copy results back to user */ |
3530 | lpfc_sli_pcimem_bcopy(&phba->slim2p->mbx, mb, | 3535 | lpfc_sli_pcimem_bcopy(phba->mbox, mb, MAILBOX_CMD_SIZE); |
3531 | MAILBOX_CMD_SIZE); | ||
3532 | } else { | 3536 | } else { |
3533 | /* First copy command data */ | 3537 | /* First copy command data */ |
3534 | lpfc_memcpy_from_slim(mb, phba->MBslimaddr, | 3538 | lpfc_memcpy_from_slim(mb, phba->MBslimaddr, |
@@ -5095,7 +5099,16 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
5095 | * preserve status) and Link Attention | 5099 | * preserve status) and Link Attention |
5096 | */ | 5100 | */ |
5097 | spin_lock(&phba->hbalock); | 5101 | spin_lock(&phba->hbalock); |
5098 | ha_copy = readl(phba->HAregaddr); | 5102 | if (phba->sli3_options & LPFC_SLI3_INB_ENABLED && |
5103 | (phba->inb_last_counter != *phba->inb_counter)) { | ||
5104 | phba->inb_last_counter = *phba->inb_counter; | ||
5105 | ha_copy = le32_to_cpu(*phba->inb_ha_copy); | ||
5106 | } else | ||
5107 | ha_copy = readl(phba->HAregaddr); | ||
5108 | if (unlikely(!ha_copy)) { | ||
5109 | spin_unlock(&phba->hbalock); | ||
5110 | return IRQ_NONE; | ||
5111 | } | ||
5099 | /* If somebody is waiting to handle an eratt don't process it | 5112 | /* If somebody is waiting to handle an eratt don't process it |
5100 | * here. The brdkill function will do this. | 5113 | * here. The brdkill function will do this. |
5101 | */ | 5114 | */ |
@@ -5105,9 +5118,6 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
5105 | readl(phba->HAregaddr); /* flush */ | 5118 | readl(phba->HAregaddr); /* flush */ |
5106 | spin_unlock(&phba->hbalock); | 5119 | spin_unlock(&phba->hbalock); |
5107 | 5120 | ||
5108 | if (unlikely(!ha_copy)) | ||
5109 | return IRQ_NONE; | ||
5110 | |||
5111 | work_ha_copy = ha_copy & phba->work_ha_mask; | 5121 | work_ha_copy = ha_copy & phba->work_ha_mask; |
5112 | 5122 | ||
5113 | if (unlikely(work_ha_copy)) { | 5123 | if (unlikely(work_ha_copy)) { |
@@ -5194,7 +5204,7 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
5194 | (phba->sli.mbox_active)) { | 5204 | (phba->sli.mbox_active)) { |
5195 | pmb = phba->sli.mbox_active; | 5205 | pmb = phba->sli.mbox_active; |
5196 | pmbox = &pmb->mb; | 5206 | pmbox = &pmb->mb; |
5197 | mbox = &phba->slim2p->mbx; | 5207 | mbox = phba->mbox; |
5198 | vport = pmb->vport; | 5208 | vport = pmb->vport; |
5199 | 5209 | ||
5200 | /* First check out the status word */ | 5210 | /* First check out the status word */ |