diff options
author | James Smart <james.smart@emulex.com> | 2010-04-06 14:49:53 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-04-11 14:45:09 -0400 |
commit | 6c8eea54ec62c1a3fdb21de583639c49dcdc8811 (patch) | |
tree | 81d7a9b54705ccd28be792b73c72604573ccfa87 /drivers/scsi | |
parent | 15672319e3da68bb3f710e724185f4524722a6fa (diff) |
[SCSI] lpfc 8.3.12: T10-PI/DIF changes
Update driver for change in T10-PI interface on adapter
- Remove Profiles.
- Add new SLI Opcodes.
- Add new PDE structures used for BlockGuard.
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hw.h | 167 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 149 |
2 files changed, 177 insertions, 139 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index 6ba1f307ccc..0cf9a2bd346 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h | |||
@@ -1500,7 +1500,6 @@ typedef struct { /* FireFly BIU registers */ | |||
1500 | #define MBXERR_BAD_RCV_LENGTH 14 | 1500 | #define MBXERR_BAD_RCV_LENGTH 14 |
1501 | #define MBXERR_DMA_ERROR 15 | 1501 | #define MBXERR_DMA_ERROR 15 |
1502 | #define MBXERR_ERROR 16 | 1502 | #define MBXERR_ERROR 16 |
1503 | #define MBXERR_UNKNOWN_CMD 18 | ||
1504 | #define MBXERR_LINK_DOWN 0x33 | 1503 | #define MBXERR_LINK_DOWN 0x33 |
1505 | #define MBX_NOT_FINISHED 255 | 1504 | #define MBX_NOT_FINISHED 255 |
1506 | 1505 | ||
@@ -1566,95 +1565,83 @@ enum lpfc_protgrp_type { | |||
1566 | }; | 1565 | }; |
1567 | 1566 | ||
1568 | /* PDE Descriptors */ | 1567 | /* PDE Descriptors */ |
1569 | #define LPFC_PDE1_DESCRIPTOR 0x81 | 1568 | #define LPFC_PDE5_DESCRIPTOR 0x85 |
1570 | #define LPFC_PDE2_DESCRIPTOR 0x82 | 1569 | #define LPFC_PDE6_DESCRIPTOR 0x86 |
1571 | #define LPFC_PDE3_DESCRIPTOR 0x83 | 1570 | #define LPFC_PDE7_DESCRIPTOR 0x87 |
1572 | 1571 | ||
1573 | /* BlockGuard Profiles */ | 1572 | /* BlockGuard Opcodes */ |
1574 | enum lpfc_bg_prof_codes { | 1573 | #define BG_OP_IN_NODIF_OUT_CRC 0x0 |
1575 | LPFC_PROF_INVALID, | 1574 | #define BG_OP_IN_CRC_OUT_NODIF 0x1 |
1576 | LPFC_PROF_A1 = 128, /* Full Protection */ | 1575 | #define BG_OP_IN_NODIF_OUT_CSUM 0x2 |
1577 | LPFC_PROF_A2, /* Disabled Protection Checks:A2~A4 */ | 1576 | #define BG_OP_IN_CSUM_OUT_NODIF 0x3 |
1578 | LPFC_PROF_A3, | 1577 | #define BG_OP_IN_CRC_OUT_CRC 0x4 |
1579 | LPFC_PROF_A4, | 1578 | #define BG_OP_IN_CSUM_OUT_CSUM 0x5 |
1580 | LPFC_PROF_B1, /* Embedded DIFs: B1~B3 */ | 1579 | #define BG_OP_IN_CRC_OUT_CSUM 0x6 |
1581 | LPFC_PROF_B2, | 1580 | #define BG_OP_IN_CSUM_OUT_CRC 0x7 |
1582 | LPFC_PROF_B3, | 1581 | |
1583 | LPFC_PROF_C1, /* Separate DIFs: C1~C3 */ | 1582 | struct lpfc_pde5 { |
1584 | LPFC_PROF_C2, | 1583 | uint32_t word0; |
1585 | LPFC_PROF_C3, | 1584 | #define pde5_type_SHIFT 24 |
1586 | LPFC_PROF_D1, /* Full Protection */ | 1585 | #define pde5_type_MASK 0x000000ff |
1587 | LPFC_PROF_D2, /* Partial Protection & Check Disabling */ | 1586 | #define pde5_type_WORD word0 |
1588 | LPFC_PROF_D3, | 1587 | #define pde5_rsvd0_SHIFT 0 |
1589 | LPFC_PROF_E1, /* E1~E4:out - check-only, in - update apptag */ | 1588 | #define pde5_rsvd0_MASK 0x00ffffff |
1590 | LPFC_PROF_E2, | 1589 | #define pde5_rsvd0_WORD word0 |
1591 | LPFC_PROF_E3, | 1590 | uint32_t reftag; /* Reference Tag Value */ |
1592 | LPFC_PROF_E4, | 1591 | uint32_t reftagtr; /* Reference Tag Translation Value */ |
1593 | LPFC_PROF_F1, /* Full Translation - F1 Prot Descriptor */ | ||
1594 | /* F1 Translation BDE */ | ||
1595 | LPFC_PROF_ANT1, /* TCP checksum, DIF inline with data buffers */ | ||
1596 | LPFC_PROF_AST1, /* TCP checksum, DIF split from data buffer */ | ||
1597 | LPFC_PROF_ANT2, | ||
1598 | LPFC_PROF_AST2 | ||
1599 | }; | 1592 | }; |
1600 | 1593 | ||
1601 | /* BlockGuard error-control defines */ | 1594 | struct lpfc_pde6 { |
1602 | #define BG_EC_STOP_ERR 0x00 | 1595 | uint32_t word0; |
1603 | #define BG_EC_CONT_ERR 0x01 | 1596 | #define pde6_type_SHIFT 24 |
1604 | #define BG_EC_IGN_UNINIT_STOP_ERR 0x10 | 1597 | #define pde6_type_MASK 0x000000ff |
1605 | #define BG_EC_IGN_UNINIT_CONT_ERR 0x11 | 1598 | #define pde6_type_WORD word0 |
1606 | 1599 | #define pde6_rsvd0_SHIFT 0 | |
1607 | /* PDE (Protection Descriptor Entry) word 0 bit masks and shifts */ | 1600 | #define pde6_rsvd0_MASK 0x00ffffff |
1608 | #define PDE_DESC_TYPE_MASK 0xff000000 | 1601 | #define pde6_rsvd0_WORD word0 |
1609 | #define PDE_DESC_TYPE_SHIFT 24 | 1602 | uint32_t word1; |
1610 | #define PDE_BG_PROFILE_MASK 0x00ff0000 | 1603 | #define pde6_rsvd1_SHIFT 26 |
1611 | #define PDE_BG_PROFILE_SHIFT 16 | 1604 | #define pde6_rsvd1_MASK 0x0000003f |
1612 | #define PDE_BLOCK_LEN_MASK 0x0000fffc | 1605 | #define pde6_rsvd1_WORD word1 |
1613 | #define PDE_BLOCK_LEN_SHIFT 2 | 1606 | #define pde6_na_SHIFT 25 |
1614 | #define PDE_ERR_CTRL_MASK 0x00000003 | 1607 | #define pde6_na_MASK 0x00000001 |
1615 | #define PDE_ERR_CTRL_SHIFT 0 | 1608 | #define pde6_na_WORD word1 |
1616 | /* PDE word 1 bit masks and shifts */ | 1609 | #define pde6_rsvd2_SHIFT 16 |
1617 | #define PDE_APPTAG_MASK_MASK 0xffff0000 | 1610 | #define pde6_rsvd2_MASK 0x000001FF |
1618 | #define PDE_APPTAG_MASK_SHIFT 16 | 1611 | #define pde6_rsvd2_WORD word1 |
1619 | #define PDE_APPTAG_VAL_MASK 0x0000ffff | 1612 | #define pde6_apptagtr_SHIFT 0 |
1620 | #define PDE_APPTAG_VAL_SHIFT 0 | 1613 | #define pde6_apptagtr_MASK 0x0000ffff |
1621 | struct lpfc_pde { | 1614 | #define pde6_apptagtr_WORD word1 |
1622 | uint32_t parms; /* bitfields of descriptor, prof, len, and ec */ | 1615 | uint32_t word2; |
1623 | uint32_t apptag; /* bitfields of app tag maskand app tag value */ | 1616 | #define pde6_optx_SHIFT 28 |
1624 | uint32_t reftag; /* reference tag occupying all 32 bits */ | 1617 | #define pde6_optx_MASK 0x0000000f |
1618 | #define pde6_optx_WORD word2 | ||
1619 | #define pde6_oprx_SHIFT 24 | ||
1620 | #define pde6_oprx_MASK 0x0000000f | ||
1621 | #define pde6_oprx_WORD word2 | ||
1622 | #define pde6_nr_SHIFT 23 | ||
1623 | #define pde6_nr_MASK 0x00000001 | ||
1624 | #define pde6_nr_WORD word2 | ||
1625 | #define pde6_ce_SHIFT 22 | ||
1626 | #define pde6_ce_MASK 0x00000001 | ||
1627 | #define pde6_ce_WORD word2 | ||
1628 | #define pde6_re_SHIFT 21 | ||
1629 | #define pde6_re_MASK 0x00000001 | ||
1630 | #define pde6_re_WORD word2 | ||
1631 | #define pde6_ae_SHIFT 20 | ||
1632 | #define pde6_ae_MASK 0x00000001 | ||
1633 | #define pde6_ae_WORD word2 | ||
1634 | #define pde6_ai_SHIFT 19 | ||
1635 | #define pde6_ai_MASK 0x00000001 | ||
1636 | #define pde6_ai_WORD word2 | ||
1637 | #define pde6_bs_SHIFT 16 | ||
1638 | #define pde6_bs_MASK 0x00000007 | ||
1639 | #define pde6_bs_WORD word2 | ||
1640 | #define pde6_apptagval_SHIFT 0 | ||
1641 | #define pde6_apptagval_MASK 0x0000ffff | ||
1642 | #define pde6_apptagval_WORD word2 | ||
1625 | }; | 1643 | }; |
1626 | 1644 | ||
1627 | /* inline function to set fields in parms of PDE */ | ||
1628 | static inline void | ||
1629 | lpfc_pde_set_bg_parms(struct lpfc_pde *p, u8 desc, u8 prof, u16 len, u8 ec) | ||
1630 | { | ||
1631 | uint32_t *wp = &p->parms; | ||
1632 | |||
1633 | /* spec indicates that adapter appends two 0's to length field */ | ||
1634 | len = len >> 2; | ||
1635 | |||
1636 | *wp &= 0; | ||
1637 | *wp |= ((desc << PDE_DESC_TYPE_SHIFT) & PDE_DESC_TYPE_MASK); | ||
1638 | *wp |= ((prof << PDE_BG_PROFILE_SHIFT) & PDE_BG_PROFILE_MASK); | ||
1639 | *wp |= ((len << PDE_BLOCK_LEN_SHIFT) & PDE_BLOCK_LEN_MASK); | ||
1640 | *wp |= ((ec << PDE_ERR_CTRL_SHIFT) & PDE_ERR_CTRL_MASK); | ||
1641 | *wp = le32_to_cpu(*wp); | ||
1642 | } | ||
1643 | |||
1644 | /* inline function to set apptag and reftag fields of PDE */ | ||
1645 | static inline void | ||
1646 | lpfc_pde_set_dif_parms(struct lpfc_pde *p, u16 apptagmask, u16 apptagval, | ||
1647 | u32 reftag) | ||
1648 | { | ||
1649 | uint32_t *wp = &p->apptag; | ||
1650 | *wp &= 0; | ||
1651 | *wp |= ((apptagmask << PDE_APPTAG_MASK_SHIFT) & PDE_APPTAG_MASK_MASK); | ||
1652 | *wp |= ((apptagval << PDE_APPTAG_VAL_SHIFT) & PDE_APPTAG_VAL_MASK); | ||
1653 | *wp = le32_to_cpu(*wp); | ||
1654 | wp = &p->reftag; | ||
1655 | *wp = le32_to_cpu(reftag); | ||
1656 | } | ||
1657 | |||
1658 | 1645 | ||
1659 | /* Structure for MB Command LOAD_SM and DOWN_LOAD */ | 1646 | /* Structure for MB Command LOAD_SM and DOWN_LOAD */ |
1660 | 1647 | ||
@@ -2488,8 +2475,8 @@ typedef struct { | |||
2488 | #define DMP_VPORT_REGION_SIZE 0x200 | 2475 | #define DMP_VPORT_REGION_SIZE 0x200 |
2489 | #define DMP_MBOX_OFFSET_WORD 0x5 | 2476 | #define DMP_MBOX_OFFSET_WORD 0x5 |
2490 | 2477 | ||
2491 | #define DMP_REGION_23 0x17 /* fcoe param and port state region */ | 2478 | #define DMP_REGION_23 0x17 /* fcoe param and port state region */ |
2492 | #define DMP_RGN23_SIZE 0x400 | 2479 | #define DMP_RGN23_SIZE 0x400 |
2493 | 2480 | ||
2494 | #define WAKE_UP_PARMS_REGION_ID 4 | 2481 | #define WAKE_UP_PARMS_REGION_ID 4 |
2495 | #define WAKE_UP_PARMS_WORD_SIZE 15 | 2482 | #define WAKE_UP_PARMS_WORD_SIZE 15 |
@@ -2504,9 +2491,9 @@ struct vport_rec { | |||
2504 | #define VPORT_INFO_REV 0x1 | 2491 | #define VPORT_INFO_REV 0x1 |
2505 | #define MAX_STATIC_VPORT_COUNT 16 | 2492 | #define MAX_STATIC_VPORT_COUNT 16 |
2506 | struct static_vport_info { | 2493 | struct static_vport_info { |
2507 | uint32_t signature; | 2494 | uint32_t signature; |
2508 | uint32_t rev; | 2495 | uint32_t rev; |
2509 | struct vport_rec vport_list[MAX_STATIC_VPORT_COUNT]; | 2496 | struct vport_rec vport_list[MAX_STATIC_VPORT_COUNT]; |
2510 | uint32_t resvd[66]; | 2497 | uint32_t resvd[66]; |
2511 | }; | 2498 | }; |
2512 | 2499 | ||
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index dccdb822328..f4a3b2e79ee 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -1141,37 +1141,47 @@ lpfc_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | |||
1141 | } | 1141 | } |
1142 | 1142 | ||
1143 | /* | 1143 | /* |
1144 | * Given a scsi cmnd, determine the BlockGuard profile to be used | 1144 | * Given a scsi cmnd, determine the BlockGuard opcodes to be used with it |
1145 | * with the cmd | 1145 | * @sc: The SCSI command to examine |
1146 | * @txopt: (out) BlockGuard operation for transmitted data | ||
1147 | * @rxopt: (out) BlockGuard operation for received data | ||
1148 | * | ||
1149 | * Returns: zero on success; non-zero if tx and/or rx op cannot be determined | ||
1150 | * | ||
1146 | */ | 1151 | */ |
1147 | static int | 1152 | static int |
1148 | lpfc_sc_to_sli_prof(struct lpfc_hba *phba, struct scsi_cmnd *sc) | 1153 | lpfc_sc_to_bg_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc, |
1154 | uint8_t *txop, uint8_t *rxop) | ||
1149 | { | 1155 | { |
1150 | uint8_t guard_type = scsi_host_get_guard(sc->device->host); | 1156 | uint8_t guard_type = scsi_host_get_guard(sc->device->host); |
1151 | uint8_t ret_prof = LPFC_PROF_INVALID; | 1157 | uint8_t ret = 0; |
1152 | 1158 | ||
1153 | if (guard_type == SHOST_DIX_GUARD_IP) { | 1159 | if (guard_type == SHOST_DIX_GUARD_IP) { |
1154 | switch (scsi_get_prot_op(sc)) { | 1160 | switch (scsi_get_prot_op(sc)) { |
1155 | case SCSI_PROT_READ_INSERT: | 1161 | case SCSI_PROT_READ_INSERT: |
1156 | case SCSI_PROT_WRITE_STRIP: | 1162 | case SCSI_PROT_WRITE_STRIP: |
1157 | ret_prof = LPFC_PROF_AST2; | 1163 | *txop = BG_OP_IN_CSUM_OUT_NODIF; |
1164 | *rxop = BG_OP_IN_NODIF_OUT_CSUM; | ||
1158 | break; | 1165 | break; |
1159 | 1166 | ||
1160 | case SCSI_PROT_READ_STRIP: | 1167 | case SCSI_PROT_READ_STRIP: |
1161 | case SCSI_PROT_WRITE_INSERT: | 1168 | case SCSI_PROT_WRITE_INSERT: |
1162 | ret_prof = LPFC_PROF_A1; | 1169 | *txop = BG_OP_IN_NODIF_OUT_CRC; |
1170 | *rxop = BG_OP_IN_CRC_OUT_NODIF; | ||
1163 | break; | 1171 | break; |
1164 | 1172 | ||
1165 | case SCSI_PROT_READ_PASS: | 1173 | case SCSI_PROT_READ_PASS: |
1166 | case SCSI_PROT_WRITE_PASS: | 1174 | case SCSI_PROT_WRITE_PASS: |
1167 | ret_prof = LPFC_PROF_AST1; | 1175 | *txop = BG_OP_IN_CSUM_OUT_CRC; |
1176 | *rxop = BG_OP_IN_CRC_OUT_CSUM; | ||
1168 | break; | 1177 | break; |
1169 | 1178 | ||
1170 | case SCSI_PROT_NORMAL: | 1179 | case SCSI_PROT_NORMAL: |
1171 | default: | 1180 | default: |
1172 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, | 1181 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
1173 | "9063 BLKGRD:Bad op/guard:%d/%d combination\n", | 1182 | "9063 BLKGRD: Bad op/guard:%d/%d combination\n", |
1174 | scsi_get_prot_op(sc), guard_type); | 1183 | scsi_get_prot_op(sc), guard_type); |
1184 | ret = 1; | ||
1175 | break; | 1185 | break; |
1176 | 1186 | ||
1177 | } | 1187 | } |
@@ -1179,12 +1189,14 @@ lpfc_sc_to_sli_prof(struct lpfc_hba *phba, struct scsi_cmnd *sc) | |||
1179 | switch (scsi_get_prot_op(sc)) { | 1189 | switch (scsi_get_prot_op(sc)) { |
1180 | case SCSI_PROT_READ_STRIP: | 1190 | case SCSI_PROT_READ_STRIP: |
1181 | case SCSI_PROT_WRITE_INSERT: | 1191 | case SCSI_PROT_WRITE_INSERT: |
1182 | ret_prof = LPFC_PROF_A1; | 1192 | *txop = BG_OP_IN_NODIF_OUT_CRC; |
1193 | *rxop = BG_OP_IN_CRC_OUT_NODIF; | ||
1183 | break; | 1194 | break; |
1184 | 1195 | ||
1185 | case SCSI_PROT_READ_PASS: | 1196 | case SCSI_PROT_READ_PASS: |
1186 | case SCSI_PROT_WRITE_PASS: | 1197 | case SCSI_PROT_WRITE_PASS: |
1187 | ret_prof = LPFC_PROF_C1; | 1198 | *txop = BG_OP_IN_CRC_OUT_CRC; |
1199 | *rxop = BG_OP_IN_CRC_OUT_CRC; | ||
1188 | break; | 1200 | break; |
1189 | 1201 | ||
1190 | case SCSI_PROT_READ_INSERT: | 1202 | case SCSI_PROT_READ_INSERT: |
@@ -1194,6 +1206,7 @@ lpfc_sc_to_sli_prof(struct lpfc_hba *phba, struct scsi_cmnd *sc) | |||
1194 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, | 1206 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
1195 | "9075 BLKGRD: Bad op/guard:%d/%d combination\n", | 1207 | "9075 BLKGRD: Bad op/guard:%d/%d combination\n", |
1196 | scsi_get_prot_op(sc), guard_type); | 1208 | scsi_get_prot_op(sc), guard_type); |
1209 | ret = 1; | ||
1197 | break; | 1210 | break; |
1198 | } | 1211 | } |
1199 | } else { | 1212 | } else { |
@@ -1201,7 +1214,7 @@ lpfc_sc_to_sli_prof(struct lpfc_hba *phba, struct scsi_cmnd *sc) | |||
1201 | BUG(); | 1214 | BUG(); |
1202 | } | 1215 | } |
1203 | 1216 | ||
1204 | return ret_prof; | 1217 | return ret; |
1205 | } | 1218 | } |
1206 | 1219 | ||
1207 | struct scsi_dif_tuple { | 1220 | struct scsi_dif_tuple { |
@@ -1266,7 +1279,9 @@ lpfc_get_cmd_dif_parms(struct scsi_cmnd *sc, uint16_t *apptagmask, | |||
1266 | * The buffer list consists of just one protection group described | 1279 | * The buffer list consists of just one protection group described |
1267 | * below: | 1280 | * below: |
1268 | * +-------------------------+ | 1281 | * +-------------------------+ |
1269 | * start of prot group --> | PDE_1 | | 1282 | * start of prot group --> | PDE_5 | |
1283 | * +-------------------------+ | ||
1284 | * | PDE_6 | | ||
1270 | * +-------------------------+ | 1285 | * +-------------------------+ |
1271 | * | Data BDE | | 1286 | * | Data BDE | |
1272 | * +-------------------------+ | 1287 | * +-------------------------+ |
@@ -1284,30 +1299,49 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1284 | struct ulp_bde64 *bpl, int datasegcnt) | 1299 | struct ulp_bde64 *bpl, int datasegcnt) |
1285 | { | 1300 | { |
1286 | struct scatterlist *sgde = NULL; /* s/g data entry */ | 1301 | struct scatterlist *sgde = NULL; /* s/g data entry */ |
1287 | struct lpfc_pde *pde1 = NULL; | 1302 | struct lpfc_pde5 *pde5 = NULL; |
1303 | struct lpfc_pde6 *pde6 = NULL; | ||
1288 | dma_addr_t physaddr; | 1304 | dma_addr_t physaddr; |
1289 | int i = 0, num_bde = 0; | 1305 | int i = 0, num_bde = 0, status; |
1290 | int datadir = sc->sc_data_direction; | 1306 | int datadir = sc->sc_data_direction; |
1291 | int prof = LPFC_PROF_INVALID; | ||
1292 | unsigned blksize; | 1307 | unsigned blksize; |
1293 | uint32_t reftag; | 1308 | uint32_t reftag; |
1294 | uint16_t apptagmask, apptagval; | 1309 | uint16_t apptagmask, apptagval; |
1310 | uint8_t txop, rxop; | ||
1295 | 1311 | ||
1296 | pde1 = (struct lpfc_pde *) bpl; | 1312 | status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop); |
1297 | prof = lpfc_sc_to_sli_prof(phba, sc); | 1313 | if (status) |
1298 | |||
1299 | if (prof == LPFC_PROF_INVALID) | ||
1300 | goto out; | 1314 | goto out; |
1301 | 1315 | ||
1302 | /* extract some info from the scsi command for PDE1*/ | 1316 | /* extract some info from the scsi command for pde*/ |
1303 | blksize = lpfc_cmd_blksize(sc); | 1317 | blksize = lpfc_cmd_blksize(sc); |
1304 | lpfc_get_cmd_dif_parms(sc, &apptagmask, &apptagval, &reftag); | 1318 | lpfc_get_cmd_dif_parms(sc, &apptagmask, &apptagval, &reftag); |
1305 | 1319 | ||
1306 | /* setup PDE1 with what we have */ | 1320 | /* setup PDE5 with what we have */ |
1307 | lpfc_pde_set_bg_parms(pde1, LPFC_PDE1_DESCRIPTOR, prof, blksize, | 1321 | pde5 = (struct lpfc_pde5 *) bpl; |
1308 | BG_EC_STOP_ERR); | 1322 | memset(pde5, 0, sizeof(struct lpfc_pde5)); |
1309 | lpfc_pde_set_dif_parms(pde1, apptagmask, apptagval, reftag); | 1323 | bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR); |
1324 | pde5->reftag = reftag; | ||
1310 | 1325 | ||
1326 | /* advance bpl and increment bde count */ | ||
1327 | num_bde++; | ||
1328 | bpl++; | ||
1329 | pde6 = (struct lpfc_pde6 *) bpl; | ||
1330 | |||
1331 | /* setup PDE6 with the rest of the info */ | ||
1332 | memset(pde6, 0, sizeof(struct lpfc_pde6)); | ||
1333 | bf_set(pde6_type, pde6, LPFC_PDE6_DESCRIPTOR); | ||
1334 | bf_set(pde6_optx, pde6, txop); | ||
1335 | bf_set(pde6_oprx, pde6, rxop); | ||
1336 | if (datadir == DMA_FROM_DEVICE) { | ||
1337 | bf_set(pde6_ce, pde6, 1); | ||
1338 | bf_set(pde6_re, pde6, 1); | ||
1339 | bf_set(pde6_ae, pde6, 1); | ||
1340 | } | ||
1341 | bf_set(pde6_ai, pde6, 1); | ||
1342 | bf_set(pde6_apptagval, pde6, apptagval); | ||
1343 | |||
1344 | /* advance bpl and increment bde count */ | ||
1311 | num_bde++; | 1345 | num_bde++; |
1312 | bpl++; | 1346 | bpl++; |
1313 | 1347 | ||
@@ -1342,15 +1376,17 @@ out: | |||
1342 | * The buffer list for this type consists of one or more of the | 1376 | * The buffer list for this type consists of one or more of the |
1343 | * protection groups described below: | 1377 | * protection groups described below: |
1344 | * +-------------------------+ | 1378 | * +-------------------------+ |
1345 | * start of first prot group --> | PDE_1 | | 1379 | * start of first prot group --> | PDE_5 | |
1380 | * +-------------------------+ | ||
1381 | * | PDE_6 | | ||
1346 | * +-------------------------+ | 1382 | * +-------------------------+ |
1347 | * | PDE_3 (Prot BDE) | | 1383 | * | PDE_7 (Prot BDE) | |
1348 | * +-------------------------+ | 1384 | * +-------------------------+ |
1349 | * | Data BDE | | 1385 | * | Data BDE | |
1350 | * +-------------------------+ | 1386 | * +-------------------------+ |
1351 | * |more Data BDE's ... (opt)| | 1387 | * |more Data BDE's ... (opt)| |
1352 | * +-------------------------+ | 1388 | * +-------------------------+ |
1353 | * start of new prot group --> | PDE_1 | | 1389 | * start of new prot group --> | PDE_5 | |
1354 | * +-------------------------+ | 1390 | * +-------------------------+ |
1355 | * | ... | | 1391 | * | ... | |
1356 | * +-------------------------+ | 1392 | * +-------------------------+ |
@@ -1369,19 +1405,21 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1369 | { | 1405 | { |
1370 | struct scatterlist *sgde = NULL; /* s/g data entry */ | 1406 | struct scatterlist *sgde = NULL; /* s/g data entry */ |
1371 | struct scatterlist *sgpe = NULL; /* s/g prot entry */ | 1407 | struct scatterlist *sgpe = NULL; /* s/g prot entry */ |
1372 | struct lpfc_pde *pde1 = NULL; | 1408 | struct lpfc_pde5 *pde5 = NULL; |
1409 | struct lpfc_pde6 *pde6 = NULL; | ||
1373 | struct ulp_bde64 *prot_bde = NULL; | 1410 | struct ulp_bde64 *prot_bde = NULL; |
1374 | dma_addr_t dataphysaddr, protphysaddr; | 1411 | dma_addr_t dataphysaddr, protphysaddr; |
1375 | unsigned short curr_data = 0, curr_prot = 0; | 1412 | unsigned short curr_data = 0, curr_prot = 0; |
1376 | unsigned int split_offset, protgroup_len; | 1413 | unsigned int split_offset, protgroup_len; |
1377 | unsigned int protgrp_blks, protgrp_bytes; | 1414 | unsigned int protgrp_blks, protgrp_bytes; |
1378 | unsigned int remainder, subtotal; | 1415 | unsigned int remainder, subtotal; |
1379 | int prof = LPFC_PROF_INVALID; | 1416 | int status; |
1380 | int datadir = sc->sc_data_direction; | 1417 | int datadir = sc->sc_data_direction; |
1381 | unsigned char pgdone = 0, alldone = 0; | 1418 | unsigned char pgdone = 0, alldone = 0; |
1382 | unsigned blksize; | 1419 | unsigned blksize; |
1383 | uint32_t reftag; | 1420 | uint32_t reftag; |
1384 | uint16_t apptagmask, apptagval; | 1421 | uint16_t apptagmask, apptagval; |
1422 | uint8_t txop, rxop; | ||
1385 | int num_bde = 0; | 1423 | int num_bde = 0; |
1386 | 1424 | ||
1387 | sgpe = scsi_prot_sglist(sc); | 1425 | sgpe = scsi_prot_sglist(sc); |
@@ -1394,31 +1432,47 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1394 | return 0; | 1432 | return 0; |
1395 | } | 1433 | } |
1396 | 1434 | ||
1397 | prof = lpfc_sc_to_sli_prof(phba, sc); | 1435 | status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop); |
1398 | if (prof == LPFC_PROF_INVALID) | 1436 | if (status) |
1399 | goto out; | 1437 | goto out; |
1400 | 1438 | ||
1401 | /* extract some info from the scsi command for PDE1*/ | 1439 | /* extract some info from the scsi command */ |
1402 | blksize = lpfc_cmd_blksize(sc); | 1440 | blksize = lpfc_cmd_blksize(sc); |
1403 | lpfc_get_cmd_dif_parms(sc, &apptagmask, &apptagval, &reftag); | 1441 | lpfc_get_cmd_dif_parms(sc, &apptagmask, &apptagval, &reftag); |
1404 | 1442 | ||
1405 | split_offset = 0; | 1443 | split_offset = 0; |
1406 | do { | 1444 | do { |
1407 | /* setup the first PDE_1 */ | 1445 | /* setup PDE5 with what we have */ |
1408 | pde1 = (struct lpfc_pde *) bpl; | 1446 | pde5 = (struct lpfc_pde5 *) bpl; |
1409 | 1447 | memset(pde5, 0, sizeof(struct lpfc_pde5)); | |
1410 | lpfc_pde_set_bg_parms(pde1, LPFC_PDE1_DESCRIPTOR, prof, blksize, | 1448 | bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR); |
1411 | BG_EC_STOP_ERR); | 1449 | pde5->reftag = reftag; |
1412 | lpfc_pde_set_dif_parms(pde1, apptagmask, apptagval, reftag); | ||
1413 | 1450 | ||
1451 | /* advance bpl and increment bde count */ | ||
1452 | num_bde++; | ||
1453 | bpl++; | ||
1454 | pde6 = (struct lpfc_pde6 *) bpl; | ||
1455 | |||
1456 | /* setup PDE6 with the rest of the info */ | ||
1457 | memset(pde6, 0, sizeof(struct lpfc_pde6)); | ||
1458 | bf_set(pde6_type, pde6, LPFC_PDE6_DESCRIPTOR); | ||
1459 | bf_set(pde6_optx, pde6, txop); | ||
1460 | bf_set(pde6_oprx, pde6, rxop); | ||
1461 | bf_set(pde6_ce, pde6, 1); | ||
1462 | bf_set(pde6_re, pde6, 1); | ||
1463 | bf_set(pde6_ae, pde6, 1); | ||
1464 | bf_set(pde6_ai, pde6, 1); | ||
1465 | bf_set(pde6_apptagval, pde6, apptagval); | ||
1466 | |||
1467 | /* advance bpl and increment bde count */ | ||
1414 | num_bde++; | 1468 | num_bde++; |
1415 | bpl++; | 1469 | bpl++; |
1416 | 1470 | ||
1417 | /* setup the first BDE that points to protection buffer */ | 1471 | /* setup the first BDE that points to protection buffer */ |
1418 | prot_bde = (struct ulp_bde64 *) bpl; | 1472 | prot_bde = (struct ulp_bde64 *) bpl; |
1419 | protphysaddr = sg_dma_address(sgpe); | 1473 | protphysaddr = sg_dma_address(sgpe); |
1420 | prot_bde->addrLow = le32_to_cpu(putPaddrLow(protphysaddr)); | 1474 | prot_bde->addrHigh = le32_to_cpu(putPaddrLow(protphysaddr)); |
1421 | prot_bde->addrHigh = le32_to_cpu(putPaddrHigh(protphysaddr)); | 1475 | prot_bde->addrLow = le32_to_cpu(putPaddrHigh(protphysaddr)); |
1422 | protgroup_len = sg_dma_len(sgpe); | 1476 | protgroup_len = sg_dma_len(sgpe); |
1423 | 1477 | ||
1424 | 1478 | ||
@@ -1429,10 +1483,7 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1429 | protgrp_bytes = protgrp_blks * blksize; | 1483 | protgrp_bytes = protgrp_blks * blksize; |
1430 | 1484 | ||
1431 | prot_bde->tus.f.bdeSize = protgroup_len; | 1485 | prot_bde->tus.f.bdeSize = protgroup_len; |
1432 | if (datadir == DMA_TO_DEVICE) | 1486 | prot_bde->tus.f.bdeFlags = LPFC_PDE7_DESCRIPTOR; |
1433 | prot_bde->tus.f.bdeFlags = BUFF_TYPE_BDE_64; | ||
1434 | else | ||
1435 | prot_bde->tus.f.bdeFlags = BUFF_TYPE_BDE_64I; | ||
1436 | prot_bde->tus.w = le32_to_cpu(bpl->tus.w); | 1487 | prot_bde->tus.w = le32_to_cpu(bpl->tus.w); |
1437 | 1488 | ||
1438 | curr_prot++; | 1489 | curr_prot++; |
@@ -1484,6 +1535,7 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1484 | 1535 | ||
1485 | /* Move to the next s/g segment if possible */ | 1536 | /* Move to the next s/g segment if possible */ |
1486 | sgde = sg_next(sgde); | 1537 | sgde = sg_next(sgde); |
1538 | |||
1487 | } | 1539 | } |
1488 | 1540 | ||
1489 | /* are we done ? */ | 1541 | /* are we done ? */ |
@@ -1506,7 +1558,6 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1506 | 1558 | ||
1507 | out: | 1559 | out: |
1508 | 1560 | ||
1509 | |||
1510 | return num_bde; | 1561 | return num_bde; |
1511 | } | 1562 | } |
1512 | /* | 1563 | /* |
@@ -1828,8 +1879,8 @@ out: | |||
1828 | * field of @lpfc_cmd for device with SLI-4 interface spec. | 1879 | * field of @lpfc_cmd for device with SLI-4 interface spec. |
1829 | * | 1880 | * |
1830 | * Return codes: | 1881 | * Return codes: |
1831 | * 1 - Error | 1882 | * 1 - Error |
1832 | * 0 - Success | 1883 | * 0 - Success |
1833 | **/ | 1884 | **/ |
1834 | static int | 1885 | static int |
1835 | lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | 1886 | lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) |
@@ -1937,8 +1988,8 @@ lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | |||
1937 | * lpfc_hba struct. | 1988 | * lpfc_hba struct. |
1938 | * | 1989 | * |
1939 | * Return codes: | 1990 | * Return codes: |
1940 | * 1 - Error | 1991 | * 1 - Error |
1941 | * 0 - Success | 1992 | * 0 - Success |
1942 | **/ | 1993 | **/ |
1943 | static inline int | 1994 | static inline int |
1944 | lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | 1995 | lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) |