[SCSI] lpfc 8.3.18: Add new WQE support

- Add new WQE fields as defined by new SLI interface to support new hardware.

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>

authored by James Smart and committed by James Bottomley f0d9bccc 5989b8d4

+198 -208
+6 -3
drivers/scsi/lpfc/lpfc_els.c
··· 177 (elscmd == ELS_CMD_LOGO))) 178 switch (elscmd) { 179 case ELS_CMD_FLOGI: 180 - elsiocb->iocb_flag |= ((ELS_ID_FLOGI << LPFC_FIP_ELS_ID_SHIFT) 181 & LPFC_FIP_ELS_ID_MASK); 182 break; 183 case ELS_CMD_FDISC: 184 - elsiocb->iocb_flag |= ((ELS_ID_FDISC << LPFC_FIP_ELS_ID_SHIFT) 185 & LPFC_FIP_ELS_ID_MASK); 186 break; 187 case ELS_CMD_LOGO: 188 - elsiocb->iocb_flag |= ((ELS_ID_LOGO << LPFC_FIP_ELS_ID_SHIFT) 189 & LPFC_FIP_ELS_ID_MASK); 190 break; 191 }
··· 177 (elscmd == ELS_CMD_LOGO))) 178 switch (elscmd) { 179 case ELS_CMD_FLOGI: 180 + elsiocb->iocb_flag |= 181 + ((LPFC_ELS_ID_FLOGI << LPFC_FIP_ELS_ID_SHIFT) 182 & LPFC_FIP_ELS_ID_MASK); 183 break; 184 case ELS_CMD_FDISC: 185 + elsiocb->iocb_flag |= 186 + ((LPFC_ELS_ID_FDISC << LPFC_FIP_ELS_ID_SHIFT) 187 & LPFC_FIP_ELS_ID_MASK); 188 break; 189 case ELS_CMD_LOGO: 190 + elsiocb->iocb_flag |= 191 + ((LPFC_ELS_ID_LOGO << LPFC_FIP_ELS_ID_SHIFT) 192 & LPFC_FIP_ELS_ID_MASK); 193 break; 194 }
+70 -97
drivers/scsi/lpfc/lpfc_hw4.h
··· 424 #define FCOE_SOFn3 0x36 425 }; 426 427 - struct lpfc_wqe_generic{ 428 - struct ulp_bde64 bde; 429 - uint32_t word3; 430 - uint32_t word4; 431 - uint32_t word5; 432 - uint32_t word6; 433 - #define lpfc_wqe_gen_context_SHIFT 16 434 - #define lpfc_wqe_gen_context_MASK 0x0000FFFF 435 - #define lpfc_wqe_gen_context_WORD word6 436 - #define lpfc_wqe_gen_xri_SHIFT 0 437 - #define lpfc_wqe_gen_xri_MASK 0x0000FFFF 438 - #define lpfc_wqe_gen_xri_WORD word6 439 - uint32_t word7; 440 - #define lpfc_wqe_gen_lnk_SHIFT 23 441 - #define lpfc_wqe_gen_lnk_MASK 0x00000001 442 - #define lpfc_wqe_gen_lnk_WORD word7 443 - #define lpfc_wqe_gen_erp_SHIFT 22 444 - #define lpfc_wqe_gen_erp_MASK 0x00000001 445 - #define lpfc_wqe_gen_erp_WORD word7 446 - #define lpfc_wqe_gen_pu_SHIFT 20 447 - #define lpfc_wqe_gen_pu_MASK 0x00000003 448 - #define lpfc_wqe_gen_pu_WORD word7 449 - #define lpfc_wqe_gen_class_SHIFT 16 450 - #define lpfc_wqe_gen_class_MASK 0x00000007 451 - #define lpfc_wqe_gen_class_WORD word7 452 - #define lpfc_wqe_gen_command_SHIFT 8 453 - #define lpfc_wqe_gen_command_MASK 0x000000FF 454 - #define lpfc_wqe_gen_command_WORD word7 455 - #define lpfc_wqe_gen_status_SHIFT 4 456 - #define lpfc_wqe_gen_status_MASK 0x0000000F 457 - #define lpfc_wqe_gen_status_WORD word7 458 - #define lpfc_wqe_gen_ct_SHIFT 2 459 - #define lpfc_wqe_gen_ct_MASK 0x00000003 460 - #define lpfc_wqe_gen_ct_WORD word7 461 - uint32_t abort_tag; 462 - uint32_t word9; 463 - #define lpfc_wqe_gen_request_tag_SHIFT 0 464 - #define lpfc_wqe_gen_request_tag_MASK 0x0000FFFF 465 - #define lpfc_wqe_gen_request_tag_WORD word9 466 - uint32_t word10; 467 - #define lpfc_wqe_gen_ccp_SHIFT 24 468 - #define lpfc_wqe_gen_ccp_MASK 0x000000FF 469 - #define lpfc_wqe_gen_ccp_WORD word10 470 - #define lpfc_wqe_gen_ccpe_SHIFT 23 471 - #define lpfc_wqe_gen_ccpe_MASK 0x00000001 472 - #define lpfc_wqe_gen_ccpe_WORD word10 473 - #define lpfc_wqe_gen_pv_SHIFT 19 474 - #define lpfc_wqe_gen_pv_MASK 0x00000001 475 - #define lpfc_wqe_gen_pv_WORD word10 476 - #define lpfc_wqe_gen_pri_SHIFT 16 477 - #define lpfc_wqe_gen_pri_MASK 0x00000007 478 - #define lpfc_wqe_gen_pri_WORD word10 479 - uint32_t word11; 480 - #define lpfc_wqe_gen_cq_id_SHIFT 16 481 - #define lpfc_wqe_gen_cq_id_MASK 0x0000FFFF 482 - #define lpfc_wqe_gen_cq_id_WORD word11 483 - #define LPFC_WQE_CQ_ID_DEFAULT 0xffff 484 - #define lpfc_wqe_gen_wqec_SHIFT 7 485 - #define lpfc_wqe_gen_wqec_MASK 0x00000001 486 - #define lpfc_wqe_gen_wqec_WORD word11 487 - #define ELS_ID_FLOGI 3 488 - #define ELS_ID_FDISC 2 489 - #define ELS_ID_LOGO 1 490 - #define ELS_ID_DEFAULT 0 491 - #define lpfc_wqe_gen_els_id_SHIFT 4 492 - #define lpfc_wqe_gen_els_id_MASK 0x00000003 493 - #define lpfc_wqe_gen_els_id_WORD word11 494 - #define lpfc_wqe_gen_cmd_type_SHIFT 0 495 - #define lpfc_wqe_gen_cmd_type_MASK 0x0000000F 496 - #define lpfc_wqe_gen_cmd_type_WORD word11 497 - uint32_t payload[4]; 498 - }; 499 - 500 struct lpfc_rqe { 501 uint32_t address_hi; 502 uint32_t address_lo; ··· 2206 #define wqe_reqtag_MASK 0x0000FFFF 2207 #define wqe_reqtag_WORD word9 2208 #define wqe_rcvoxid_SHIFT 16 2209 - #define wqe_rcvoxid_MASK 0x0000FFFF 2210 - #define wqe_rcvoxid_WORD word9 2211 uint32_t word10; 2212 #define wqe_pri_SHIFT 16 2213 #define wqe_pri_MASK 0x00000007 2214 #define wqe_pri_WORD word10 ··· 2249 #define wqe_ccpe_MASK 0x00000001 2250 #define wqe_ccpe_WORD word10 2251 #define wqe_ccp_SHIFT 24 2252 - #define wqe_ccp_MASK 0x000000ff 2253 - #define wqe_ccp_WORD word10 2254 uint32_t word11; 2255 - #define wqe_cmd_type_SHIFT 0 2256 - #define wqe_cmd_type_MASK 0x0000000f 2257 - #define wqe_cmd_type_WORD word11 2258 - #define wqe_wqec_SHIFT 7 2259 - #define wqe_wqec_MASK 0x00000001 2260 - #define wqe_wqec_WORD word11 2261 - #define wqe_cqid_SHIFT 16 2262 - #define wqe_cqid_MASK 0x0000ffff 2263 - #define wqe_cqid_WORD word11 2264 }; 2265 2266 struct wqe_did { ··· 2285 #define wqe_xmit_bls_xo_SHIFT 31 2286 #define wqe_xmit_bls_xo_MASK 0x00000001 2287 #define wqe_xmit_bls_xo_WORD word5 2288 }; 2289 2290 struct els_request64_wqe { ··· 2327 2328 struct xmit_els_rsp64_wqe { 2329 struct ulp_bde64 bde; 2330 - uint32_t rsvd3; 2331 uint32_t rsvd4; 2332 - struct wqe_did wqe_dest; 2333 struct wqe_common wqe_com; /* words 6-11 */ 2334 uint32_t rsvd_12_15[4]; 2335 }; ··· 2398 2399 struct xmit_seq64_wqe { 2400 struct ulp_bde64 bde; 2401 - uint32_t paylaod_offset; 2402 uint32_t relative_offset; 2403 struct wqe_rctl_dfctl wge_ctl; 2404 struct wqe_common wqe_com; /* words 6-11 */ ··· 2408 }; 2409 struct xmit_bcast64_wqe { 2410 struct ulp_bde64 bde; 2411 - uint32_t paylaod_len; 2412 uint32_t rsvd4; 2413 struct wqe_rctl_dfctl wge_ctl; /* word 5 */ 2414 struct wqe_common wqe_com; /* words 6-11 */ ··· 2417 2418 struct gen_req64_wqe { 2419 struct ulp_bde64 bde; 2420 - uint32_t command_len; 2421 - uint32_t payload_len; 2422 struct wqe_rctl_dfctl wge_ctl; /* word 5 */ 2423 struct wqe_common wqe_com; /* words 6-11 */ 2424 uint32_t rsvd_12_15[4]; ··· 2451 2452 struct fcp_iwrite64_wqe { 2453 struct ulp_bde64 bde; 2454 - uint32_t payload_len; 2455 uint32_t total_xfer_len; 2456 uint32_t initial_xfer_len; 2457 struct wqe_common wqe_com; /* words 6-11 */ ··· 2460 2461 struct fcp_iread64_wqe { 2462 struct ulp_bde64 bde; 2463 - uint32_t payload_len; /* word 3 */ 2464 uint32_t total_xfer_len; /* word 4 */ 2465 uint32_t rsrvd5; /* word 5 */ 2466 struct wqe_common wqe_com; /* words 6-11 */ ··· 2468 }; 2469 2470 struct fcp_icmnd64_wqe { 2471 - struct ulp_bde64 bde; /* words 0-2 */ 2472 - uint32_t rsrvd[3]; /* words 3-5 */ 2473 struct wqe_common wqe_com; /* words 6-11 */ 2474 - uint32_t rsvd_12_15[4]; /* word 12-15 */ 2475 }; 2476 2477
··· 424 #define FCOE_SOFn3 0x36 425 }; 426 427 struct lpfc_rqe { 428 uint32_t address_hi; 429 uint32_t address_lo; ··· 2279 #define wqe_reqtag_MASK 0x0000FFFF 2280 #define wqe_reqtag_WORD word9 2281 #define wqe_rcvoxid_SHIFT 16 2282 + #define wqe_rcvoxid_MASK 0x0000FFFF 2283 + #define wqe_rcvoxid_WORD word9 2284 uint32_t word10; 2285 + #define wqe_ebde_cnt_SHIFT 0 2286 + #define wqe_ebde_cnt_MASK 0x00000007 2287 + #define wqe_ebde_cnt_WORD word10 2288 + #define wqe_lenloc_SHIFT 7 2289 + #define wqe_lenloc_MASK 0x00000003 2290 + #define wqe_lenloc_WORD word10 2291 + #define LPFC_WQE_LENLOC_NONE 0 2292 + #define LPFC_WQE_LENLOC_WORD3 1 2293 + #define LPFC_WQE_LENLOC_WORD12 2 2294 + #define LPFC_WQE_LENLOC_WORD4 3 2295 + #define wqe_qosd_SHIFT 9 2296 + #define wqe_qosd_MASK 0x00000001 2297 + #define wqe_qosd_WORD word10 2298 + #define wqe_xbl_SHIFT 11 2299 + #define wqe_xbl_MASK 0x00000001 2300 + #define wqe_xbl_WORD word10 2301 + #define wqe_iod_SHIFT 13 2302 + #define wqe_iod_MASK 0x00000001 2303 + #define wqe_iod_WORD word10 2304 + #define LPFC_WQE_IOD_WRITE 0 2305 + #define LPFC_WQE_IOD_READ 1 2306 + #define wqe_dbde_SHIFT 14 2307 + #define wqe_dbde_MASK 0x00000001 2308 + #define wqe_dbde_WORD word10 2309 + #define wqe_wqes_SHIFT 15 2310 + #define wqe_wqes_MASK 0x00000001 2311 + #define wqe_wqes_WORD word10 2312 #define wqe_pri_SHIFT 16 2313 #define wqe_pri_MASK 0x00000007 2314 #define wqe_pri_WORD word10 ··· 2295 #define wqe_ccpe_MASK 0x00000001 2296 #define wqe_ccpe_WORD word10 2297 #define wqe_ccp_SHIFT 24 2298 + #define wqe_ccp_MASK 0x000000ff 2299 + #define wqe_ccp_WORD word10 2300 uint32_t word11; 2301 + #define wqe_cmd_type_SHIFT 0 2302 + #define wqe_cmd_type_MASK 0x0000000f 2303 + #define wqe_cmd_type_WORD word11 2304 + #define wqe_els_id_SHIFT 4 2305 + #define wqe_els_id_MASK 0x00000003 2306 + #define wqe_els_id_WORD word11 2307 + #define LPFC_ELS_ID_FLOGI 3 2308 + #define LPFC_ELS_ID_FDISC 2 2309 + #define LPFC_ELS_ID_LOGO 1 2310 + #define LPFC_ELS_ID_DEFAULT 0 2311 + #define wqe_wqec_SHIFT 7 2312 + #define wqe_wqec_MASK 0x00000001 2313 + #define wqe_wqec_WORD word11 2314 + #define wqe_cqid_SHIFT 16 2315 + #define wqe_cqid_MASK 0x0000ffff 2316 + #define wqe_cqid_WORD word11 2317 + #define LPFC_WQE_CQ_ID_DEFAULT 0xffff 2318 }; 2319 2320 struct wqe_did { ··· 2323 #define wqe_xmit_bls_xo_SHIFT 31 2324 #define wqe_xmit_bls_xo_MASK 0x00000001 2325 #define wqe_xmit_bls_xo_WORD word5 2326 + }; 2327 + 2328 + struct lpfc_wqe_generic{ 2329 + struct ulp_bde64 bde; 2330 + uint32_t word3; 2331 + uint32_t word4; 2332 + uint32_t word5; 2333 + struct wqe_common wqe_com; 2334 + uint32_t payload[4]; 2335 }; 2336 2337 struct els_request64_wqe { ··· 2356 2357 struct xmit_els_rsp64_wqe { 2358 struct ulp_bde64 bde; 2359 + uint32_t response_payload_len; 2360 uint32_t rsvd4; 2361 + struct wqe_did wqe_dest; 2362 struct wqe_common wqe_com; /* words 6-11 */ 2363 uint32_t rsvd_12_15[4]; 2364 }; ··· 2427 2428 struct xmit_seq64_wqe { 2429 struct ulp_bde64 bde; 2430 + uint32_t rsvd3; 2431 uint32_t relative_offset; 2432 struct wqe_rctl_dfctl wge_ctl; 2433 struct wqe_common wqe_com; /* words 6-11 */ ··· 2437 }; 2438 struct xmit_bcast64_wqe { 2439 struct ulp_bde64 bde; 2440 + uint32_t seq_payload_len; 2441 uint32_t rsvd4; 2442 struct wqe_rctl_dfctl wge_ctl; /* word 5 */ 2443 struct wqe_common wqe_com; /* words 6-11 */ ··· 2446 2447 struct gen_req64_wqe { 2448 struct ulp_bde64 bde; 2449 + uint32_t request_payload_len; 2450 + uint32_t relative_offset; 2451 struct wqe_rctl_dfctl wge_ctl; /* word 5 */ 2452 struct wqe_common wqe_com; /* words 6-11 */ 2453 uint32_t rsvd_12_15[4]; ··· 2480 2481 struct fcp_iwrite64_wqe { 2482 struct ulp_bde64 bde; 2483 + uint32_t payload_offset_len; 2484 uint32_t total_xfer_len; 2485 uint32_t initial_xfer_len; 2486 struct wqe_common wqe_com; /* words 6-11 */ ··· 2489 2490 struct fcp_iread64_wqe { 2491 struct ulp_bde64 bde; 2492 + uint32_t payload_offset_len; /* word 3 */ 2493 uint32_t total_xfer_len; /* word 4 */ 2494 uint32_t rsrvd5; /* word 5 */ 2495 struct wqe_common wqe_com; /* words 6-11 */ ··· 2497 }; 2498 2499 struct fcp_icmnd64_wqe { 2500 + struct ulp_bde64 bde; /* words 0-2 */ 2501 + uint32_t rsrvd3; /* word 3 */ 2502 + uint32_t rsrvd4; /* word 4 */ 2503 + uint32_t rsrvd5; /* word 5 */ 2504 struct wqe_common wqe_com; /* words 6-11 */ 2505 + uint32_t rsvd_12_15[4]; /* word 12-15 */ 2506 }; 2507 2508
+122 -108
drivers/scsi/lpfc/lpfc_sli.c
··· 95 return -ENOMEM; 96 /* set consumption flag every once in a while */ 97 if (!((q->host_index + 1) % LPFC_RELEASE_NOTIFICATION_INTERVAL)) 98 - bf_set(lpfc_wqe_gen_wqec, &wqe->generic, 1); 99 100 lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size); 101 ··· 5965 uint16_t abrt_iotag; 5966 struct lpfc_iocbq *abrtiocbq; 5967 struct ulp_bde64 *bpl = NULL; 5968 - uint32_t els_id = ELS_ID_DEFAULT; 5969 int numBdes, i; 5970 struct ulp_bde64 bde; 5971 ··· 5982 memcpy(wqe, &iocbq->iocb, sizeof(union lpfc_wqe)); 5983 abort_tag = (uint32_t) iocbq->iotag; 5984 xritag = iocbq->sli4_xritag; 5985 - wqe->words[7] = 0; /* The ct field has moved so reset */ 5986 /* words0-2 bpl convert bde */ 5987 if (iocbq->iocb.un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) { 5988 numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize / ··· 6033 * contains the FCFI and remote N_Port_ID is 6034 * in word 5. 6035 */ 6036 - 6037 ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l); 6038 - bf_set(lpfc_wqe_gen_context, &wqe->generic, 6039 - iocbq->iocb.ulpContext); 6040 - 6041 - bf_set(lpfc_wqe_gen_ct, &wqe->generic, ct); 6042 - bf_set(lpfc_wqe_gen_pu, &wqe->generic, 0); 6043 /* CCP CCPE PV PRI in word10 were set in the memcpy */ 6044 - 6045 if (command_type == ELS_COMMAND_FIP) { 6046 els_id = ((iocbq->iocb_flag & LPFC_FIP_ELS_ID_MASK) 6047 >> LPFC_FIP_ELS_ID_SHIFT); 6048 } 6049 - bf_set(lpfc_wqe_gen_els_id, &wqe->generic, els_id); 6050 - 6051 break; 6052 case CMD_XMIT_SEQUENCE64_CX: 6053 - bf_set(lpfc_wqe_gen_context, &wqe->generic, 6054 - iocbq->iocb.un.ulpWord[3]); 6055 - wqe->generic.word3 = 0; 6056 - bf_set(wqe_rcvoxid, &wqe->generic, iocbq->iocb.ulpContext); 6057 /* The entire sequence is transmitted for this IOCB */ 6058 xmit_len = total_len; 6059 cmnd = CMD_XMIT_SEQUENCE64_CR; 6060 case CMD_XMIT_SEQUENCE64_CR: 6061 - /* word3 iocb=io_tag32 wqe=payload_offset */ 6062 - /* payload offset used for multilpe outstanding 6063 - * sequences on the same exchange 6064 - */ 6065 - wqe->words[3] = 0; 6066 /* word4 relative_offset memcpy */ 6067 /* word5 r_ctl/df_ctl memcpy */ 6068 - bf_set(lpfc_wqe_gen_pu, &wqe->generic, 0); 6069 wqe->xmit_sequence.xmit_len = xmit_len; 6070 command_type = OTHER_COMMAND; 6071 break; 6072 case CMD_XMIT_BCAST64_CN: 6073 - /* word3 iocb=iotag32 wqe=payload_len */ 6074 - wqe->words[3] = 0; /* no definition for this in wqe */ 6075 /* word4 iocb=rsvd wqe=rsvd */ 6076 /* word5 iocb=rctl/type/df_ctl wqe=rctl/type/df_ctl memcpy */ 6077 /* word6 iocb=ctxt_tag/io_tag wqe=ctxt_tag/xri */ 6078 - bf_set(lpfc_wqe_gen_ct, &wqe->generic, 6079 ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l)); 6080 break; 6081 case CMD_FCP_IWRITE64_CR: 6082 command_type = FCP_COMMAND_DATA_OUT; 6083 - /* The struct for wqe fcp_iwrite has 3 fields that are somewhat 6084 - * confusing. 6085 - * word3 is payload_len: byte offset to the sgl entry for the 6086 - * fcp_command. 6087 - * word4 is total xfer len, same as the IOCB->ulpParameter. 6088 - * word5 is initial xfer len 0 = wait for xfer-ready 6089 - */ 6090 - 6091 - /* Always wait for xfer-ready before sending data */ 6092 - wqe->fcp_iwrite.initial_xfer_len = 0; 6093 - /* word 4 (xfer length) should have been set on the memcpy */ 6094 - 6095 - /* allow write to fall through to read */ 6096 - case CMD_FCP_IREAD64_CR: 6097 - /* FCP_CMD is always the 1st sgl entry */ 6098 - wqe->fcp_iread.payload_len = 6099 xmit_len + sizeof(struct fcp_rsp); 6100 - 6101 - /* word 4 (xfer length) should have been set on the memcpy */ 6102 - 6103 - bf_set(lpfc_wqe_gen_erp, &wqe->generic, 6104 - iocbq->iocb.ulpFCP2Rcvy); 6105 - bf_set(lpfc_wqe_gen_lnk, &wqe->generic, iocbq->iocb.ulpXS); 6106 - /* The XC bit and the XS bit are similar. The driver never 6107 - * tracked whether or not the exchange was previouslly open. 6108 - * XC = Exchange create, 0 is create. 1 is already open. 6109 - * XS = link cmd: 1 do not close the exchange after command. 6110 - * XS = 0 close exchange when command completes. 6111 - * The only time we would not set the XC bit is when the XS bit 6112 - * is set and we are sending our 2nd or greater command on 6113 - * this exchange. 6114 - */ 6115 /* Always open the exchange */ 6116 bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0); 6117 - 6118 - wqe->words[10] &= 0xffff0000; /* zero out ebde count */ 6119 - bf_set(lpfc_wqe_gen_pu, &wqe->generic, iocbq->iocb.ulpPU); 6120 - break; 6121 case CMD_FCP_ICMND64_CR: 6122 /* Always open the exchange */ 6123 - bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0); 6124 - 6125 - wqe->words[4] = 0; 6126 - wqe->words[10] &= 0xffff0000; /* zero out ebde count */ 6127 - bf_set(lpfc_wqe_gen_pu, &wqe->generic, 0); 6128 break; 6129 case CMD_GEN_REQUEST64_CR: 6130 - /* word3 command length is described as byte offset to the 6131 - * rsp_data. Would always be 16, sizeof(struct sli4_sge) 6132 - * sgl[0] = cmnd 6133 - * sgl[1] = rsp. 6134 - * 6135 - */ 6136 - wqe->gen_req.command_len = xmit_len; 6137 - /* Word4 parameter copied in the memcpy */ 6138 - /* Word5 [rctl, type, df_ctl, la] copied in memcpy */ 6139 /* word6 context tag copied in memcpy */ 6140 if (iocbq->iocb.ulpCt_h || iocbq->iocb.ulpCt_l) { 6141 ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l); ··· 6152 ct, iocbq->iocb.ulpCommand); 6153 return IOCB_ERROR; 6154 } 6155 - bf_set(lpfc_wqe_gen_ct, &wqe->generic, 0); 6156 - bf_set(wqe_tmo, &wqe->gen_req.wqe_com, 6157 - iocbq->iocb.ulpTimeout); 6158 - 6159 - bf_set(lpfc_wqe_gen_pu, &wqe->generic, iocbq->iocb.ulpPU); 6160 command_type = OTHER_COMMAND; 6161 break; 6162 case CMD_XMIT_ELS_RSP64_CX: 6163 /* words0-2 BDE memcpy */ 6164 - /* word3 iocb=iotag32 wqe=rsvd */ 6165 - wqe->words[3] = 0; 6166 /* word4 iocb=did wge=rsvd. */ 6167 - wqe->words[4] = 0; 6168 /* word5 iocb=rsvd wge=did */ 6169 bf_set(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest, 6170 iocbq->iocb.un.elsreq64.remoteID); 6171 - 6172 - bf_set(lpfc_wqe_gen_ct, &wqe->generic, 6173 - ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l)); 6174 - 6175 - bf_set(lpfc_wqe_gen_pu, &wqe->generic, iocbq->iocb.ulpPU); 6176 - bf_set(wqe_rcvoxid, &wqe->generic, iocbq->iocb.ulpContext); 6177 if (!iocbq->iocb.ulpCt_h && iocbq->iocb.ulpCt_l) 6178 - bf_set(lpfc_wqe_gen_context, &wqe->generic, 6179 iocbq->vport->vpi + phba->vpi_base); 6180 command_type = OTHER_COMMAND; 6181 break; 6182 case CMD_CLOSE_XRI_CN: ··· 6209 else 6210 bf_set(abort_cmd_ia, &wqe->abort_cmd, 0); 6211 bf_set(abort_cmd_criteria, &wqe->abort_cmd, T_XRI_TAG); 6212 - wqe->words[5] = 0; 6213 - bf_set(lpfc_wqe_gen_ct, &wqe->generic, 6214 ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l)); 6215 abort_tag = iocbq->iocb.un.acxri.abortIoTag; 6216 /* 6217 * The abort handler will send us CMD_ABORT_XRI_CN or 6218 * CMD_CLOSE_XRI_CN and the fw only accepts CMD_ABORT_XRI_CX 6219 */ 6220 - bf_set(lpfc_wqe_gen_command, &wqe->generic, CMD_ABORT_XRI_CX); 6221 cmnd = CMD_ABORT_XRI_CX; 6222 command_type = OTHER_COMMAND; 6223 xritag = 0; ··· 6255 bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1); 6256 bf_set(wqe_ctxt_tag, &wqe->xmit_bls_rsp.wqe_com, 6257 iocbq->iocb.ulpContext); 6258 /* Overwrite the pre-set comnd type with OTHER_COMMAND */ 6259 command_type = OTHER_COMMAND; 6260 break; 6261 case CMD_XRI_ABORTED_CX: 6262 case CMD_CREATE_XRI_CR: /* Do we expect to use this? */ 6263 - /* words0-2 are all 0's no bde */ 6264 - /* word3 and word4 are rsvrd */ 6265 - wqe->words[3] = 0; 6266 - wqe->words[4] = 0; 6267 - /* word5 iocb=rsvd wge=did */ 6268 - /* There is no remote port id in the IOCB? */ 6269 - /* Let this fall through and fail */ 6270 case CMD_IOCB_FCP_IBIDIR64_CR: /* bidirectional xfer */ 6271 case CMD_FCP_TSEND64_CX: /* Target mode send xfer-ready */ 6272 case CMD_FCP_TRSP64_CX: /* Target mode rcv */ ··· 6273 iocbq->iocb.ulpCommand); 6274 return IOCB_ERROR; 6275 break; 6276 - 6277 } 6278 - bf_set(lpfc_wqe_gen_xri, &wqe->generic, xritag); 6279 - bf_set(lpfc_wqe_gen_request_tag, &wqe->generic, iocbq->iotag); 6280 - wqe->generic.abort_tag = abort_tag; 6281 - bf_set(lpfc_wqe_gen_cmd_type, &wqe->generic, command_type); 6282 - bf_set(lpfc_wqe_gen_command, &wqe->generic, cmnd); 6283 - bf_set(lpfc_wqe_gen_class, &wqe->generic, iocbq->iocb.ulpClass); 6284 - bf_set(lpfc_wqe_gen_cq_id, &wqe->generic, LPFC_WQE_CQ_ID_DEFAULT); 6285 - 6286 return 0; 6287 } 6288
··· 95 return -ENOMEM; 96 /* set consumption flag every once in a while */ 97 if (!((q->host_index + 1) % LPFC_RELEASE_NOTIFICATION_INTERVAL)) 98 + bf_set(wqe_wqec, &wqe->generic.wqe_com, 1); 99 100 lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size); 101 ··· 5965 uint16_t abrt_iotag; 5966 struct lpfc_iocbq *abrtiocbq; 5967 struct ulp_bde64 *bpl = NULL; 5968 + uint32_t els_id = LPFC_ELS_ID_DEFAULT; 5969 int numBdes, i; 5970 struct ulp_bde64 bde; 5971 ··· 5982 memcpy(wqe, &iocbq->iocb, sizeof(union lpfc_wqe)); 5983 abort_tag = (uint32_t) iocbq->iotag; 5984 xritag = iocbq->sli4_xritag; 5985 + wqe->generic.wqe_com.word7 = 0; /* The ct field has moved so reset */ 5986 /* words0-2 bpl convert bde */ 5987 if (iocbq->iocb.un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) { 5988 numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize / ··· 6033 * contains the FCFI and remote N_Port_ID is 6034 * in word 5. 6035 */ 6036 ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l); 6037 + bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com, 6038 + iocbq->iocb.ulpContext); 6039 + bf_set(wqe_ct, &wqe->els_req.wqe_com, ct); 6040 + bf_set(wqe_pu, &wqe->els_req.wqe_com, 0); 6041 /* CCP CCPE PV PRI in word10 were set in the memcpy */ 6042 if (command_type == ELS_COMMAND_FIP) { 6043 els_id = ((iocbq->iocb_flag & LPFC_FIP_ELS_ID_MASK) 6044 >> LPFC_FIP_ELS_ID_SHIFT); 6045 } 6046 + bf_set(wqe_els_id, &wqe->els_req.wqe_com, els_id); 6047 + bf_set(wqe_dbde, &wqe->els_req.wqe_com, 1); 6048 + bf_set(wqe_iod, &wqe->els_req.wqe_com, LPFC_WQE_IOD_READ); 6049 + bf_set(wqe_qosd, &wqe->els_req.wqe_com, 1); 6050 + bf_set(wqe_lenloc, &wqe->els_req.wqe_com, LPFC_WQE_LENLOC_NONE); 6051 + bf_set(wqe_ebde_cnt, &wqe->els_req.wqe_com, 0); 6052 break; 6053 case CMD_XMIT_SEQUENCE64_CX: 6054 + bf_set(wqe_ctxt_tag, &wqe->xmit_sequence.wqe_com, 6055 + iocbq->iocb.un.ulpWord[3]); 6056 + bf_set(wqe_rcvoxid, &wqe->xmit_sequence.wqe_com, 6057 + iocbq->iocb.ulpContext); 6058 /* The entire sequence is transmitted for this IOCB */ 6059 xmit_len = total_len; 6060 cmnd = CMD_XMIT_SEQUENCE64_CR; 6061 case CMD_XMIT_SEQUENCE64_CR: 6062 + /* word3 iocb=io_tag32 wqe=reserved */ 6063 + wqe->xmit_sequence.rsvd3 = 0; 6064 /* word4 relative_offset memcpy */ 6065 /* word5 r_ctl/df_ctl memcpy */ 6066 + bf_set(wqe_pu, &wqe->xmit_sequence.wqe_com, 0); 6067 + bf_set(wqe_dbde, &wqe->xmit_sequence.wqe_com, 1); 6068 + bf_set(wqe_iod, &wqe->xmit_sequence.wqe_com, 6069 + LPFC_WQE_IOD_WRITE); 6070 + bf_set(wqe_lenloc, &wqe->xmit_sequence.wqe_com, 6071 + LPFC_WQE_LENLOC_WORD12); 6072 + bf_set(wqe_ebde_cnt, &wqe->xmit_sequence.wqe_com, 0); 6073 wqe->xmit_sequence.xmit_len = xmit_len; 6074 command_type = OTHER_COMMAND; 6075 break; 6076 case CMD_XMIT_BCAST64_CN: 6077 + /* word3 iocb=iotag32 wqe=seq_payload_len */ 6078 + wqe->xmit_bcast64.seq_payload_len = xmit_len; 6079 /* word4 iocb=rsvd wqe=rsvd */ 6080 /* word5 iocb=rctl/type/df_ctl wqe=rctl/type/df_ctl memcpy */ 6081 /* word6 iocb=ctxt_tag/io_tag wqe=ctxt_tag/xri */ 6082 + bf_set(wqe_ct, &wqe->xmit_bcast64.wqe_com, 6083 ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l)); 6084 + bf_set(wqe_dbde, &wqe->xmit_bcast64.wqe_com, 1); 6085 + bf_set(wqe_iod, &wqe->xmit_bcast64.wqe_com, LPFC_WQE_IOD_WRITE); 6086 + bf_set(wqe_lenloc, &wqe->xmit_bcast64.wqe_com, 6087 + LPFC_WQE_LENLOC_WORD3); 6088 + bf_set(wqe_ebde_cnt, &wqe->xmit_bcast64.wqe_com, 0); 6089 break; 6090 case CMD_FCP_IWRITE64_CR: 6091 command_type = FCP_COMMAND_DATA_OUT; 6092 + /* word3 iocb=iotag wqe=payload_offset_len */ 6093 + /* Add the FCP_CMD and FCP_RSP sizes to get the offset */ 6094 + wqe->fcp_iwrite.payload_offset_len = 6095 xmit_len + sizeof(struct fcp_rsp); 6096 + /* word4 iocb=parameter wqe=total_xfer_length memcpy */ 6097 + /* word5 iocb=initial_xfer_len wqe=initial_xfer_len memcpy */ 6098 + bf_set(wqe_erp, &wqe->fcp_iwrite.wqe_com, 6099 + iocbq->iocb.ulpFCP2Rcvy); 6100 + bf_set(wqe_lnk, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpXS); 6101 + /* Always open the exchange */ 6102 + bf_set(wqe_xc, &wqe->fcp_iwrite.wqe_com, 0); 6103 + bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 1); 6104 + bf_set(wqe_iod, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_IOD_WRITE); 6105 + bf_set(wqe_lenloc, &wqe->fcp_iwrite.wqe_com, 6106 + LPFC_WQE_LENLOC_WORD4); 6107 + bf_set(wqe_ebde_cnt, &wqe->fcp_iwrite.wqe_com, 0); 6108 + bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpPU); 6109 + break; 6110 + case CMD_FCP_IREAD64_CR: 6111 + /* word3 iocb=iotag wqe=payload_offset_len */ 6112 + /* Add the FCP_CMD and FCP_RSP sizes to get the offset */ 6113 + wqe->fcp_iread.payload_offset_len = 6114 + xmit_len + sizeof(struct fcp_rsp); 6115 + /* word4 iocb=parameter wqe=total_xfer_length memcpy */ 6116 + /* word5 iocb=initial_xfer_len wqe=initial_xfer_len memcpy */ 6117 + bf_set(wqe_erp, &wqe->fcp_iread.wqe_com, 6118 + iocbq->iocb.ulpFCP2Rcvy); 6119 + bf_set(wqe_lnk, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpXS); 6120 /* Always open the exchange */ 6121 bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0); 6122 + bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 1); 6123 + bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, LPFC_WQE_IOD_READ); 6124 + bf_set(wqe_lenloc, &wqe->fcp_iread.wqe_com, 6125 + LPFC_WQE_LENLOC_WORD4); 6126 + bf_set(wqe_ebde_cnt, &wqe->fcp_iread.wqe_com, 0); 6127 + bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpPU); 6128 + break; 6129 case CMD_FCP_ICMND64_CR: 6130 + /* word3 iocb=IO_TAG wqe=reserved */ 6131 + wqe->fcp_icmd.rsrvd3 = 0; 6132 + bf_set(wqe_pu, &wqe->fcp_icmd.wqe_com, 0); 6133 /* Always open the exchange */ 6134 + bf_set(wqe_xc, &wqe->fcp_icmd.wqe_com, 0); 6135 + bf_set(wqe_dbde, &wqe->fcp_icmd.wqe_com, 1); 6136 + bf_set(wqe_iod, &wqe->fcp_icmd.wqe_com, LPFC_WQE_IOD_WRITE); 6137 + bf_set(wqe_qosd, &wqe->fcp_icmd.wqe_com, 1); 6138 + bf_set(wqe_lenloc, &wqe->fcp_icmd.wqe_com, 6139 + LPFC_WQE_LENLOC_NONE); 6140 + bf_set(wqe_ebde_cnt, &wqe->fcp_icmd.wqe_com, 0); 6141 break; 6142 case CMD_GEN_REQUEST64_CR: 6143 + /* word3 iocb=IO_TAG wqe=request_payload_len */ 6144 + wqe->gen_req.request_payload_len = xmit_len; 6145 + /* word4 iocb=parameter wqe=relative_offset memcpy */ 6146 + /* word5 [rctl, type, df_ctl, la] copied in memcpy */ 6147 /* word6 context tag copied in memcpy */ 6148 if (iocbq->iocb.ulpCt_h || iocbq->iocb.ulpCt_l) { 6149 ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l); ··· 6144 ct, iocbq->iocb.ulpCommand); 6145 return IOCB_ERROR; 6146 } 6147 + bf_set(wqe_ct, &wqe->gen_req.wqe_com, 0); 6148 + bf_set(wqe_tmo, &wqe->gen_req.wqe_com, iocbq->iocb.ulpTimeout); 6149 + bf_set(wqe_pu, &wqe->gen_req.wqe_com, iocbq->iocb.ulpPU); 6150 + bf_set(wqe_dbde, &wqe->gen_req.wqe_com, 1); 6151 + bf_set(wqe_iod, &wqe->gen_req.wqe_com, LPFC_WQE_IOD_READ); 6152 + bf_set(wqe_qosd, &wqe->gen_req.wqe_com, 1); 6153 + bf_set(wqe_lenloc, &wqe->gen_req.wqe_com, LPFC_WQE_LENLOC_NONE); 6154 + bf_set(wqe_ebde_cnt, &wqe->gen_req.wqe_com, 0); 6155 command_type = OTHER_COMMAND; 6156 break; 6157 case CMD_XMIT_ELS_RSP64_CX: 6158 /* words0-2 BDE memcpy */ 6159 + /* word3 iocb=iotag32 wqe=response_payload_len */ 6160 + wqe->xmit_els_rsp.response_payload_len = xmit_len; 6161 /* word4 iocb=did wge=rsvd. */ 6162 + wqe->xmit_els_rsp.rsvd4 = 0; 6163 /* word5 iocb=rsvd wge=did */ 6164 bf_set(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest, 6165 iocbq->iocb.un.elsreq64.remoteID); 6166 + bf_set(wqe_ct, &wqe->xmit_els_rsp.wqe_com, 6167 + ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l)); 6168 + bf_set(wqe_pu, &wqe->xmit_els_rsp.wqe_com, iocbq->iocb.ulpPU); 6169 + bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, 6170 + iocbq->iocb.ulpContext); 6171 if (!iocbq->iocb.ulpCt_h && iocbq->iocb.ulpCt_l) 6172 + bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, 6173 iocbq->vport->vpi + phba->vpi_base); 6174 + bf_set(wqe_dbde, &wqe->xmit_els_rsp.wqe_com, 1); 6175 + bf_set(wqe_iod, &wqe->xmit_els_rsp.wqe_com, LPFC_WQE_IOD_WRITE); 6176 + bf_set(wqe_qosd, &wqe->xmit_els_rsp.wqe_com, 1); 6177 + bf_set(wqe_lenloc, &wqe->xmit_els_rsp.wqe_com, 6178 + LPFC_WQE_LENLOC_WORD3); 6179 + bf_set(wqe_ebde_cnt, &wqe->xmit_els_rsp.wqe_com, 0); 6180 command_type = OTHER_COMMAND; 6181 break; 6182 case CMD_CLOSE_XRI_CN: ··· 6193 else 6194 bf_set(abort_cmd_ia, &wqe->abort_cmd, 0); 6195 bf_set(abort_cmd_criteria, &wqe->abort_cmd, T_XRI_TAG); 6196 + /* word5 iocb=CONTEXT_TAG|IO_TAG wqe=reserved */ 6197 + wqe->abort_cmd.rsrvd5 = 0; 6198 + bf_set(wqe_ct, &wqe->abort_cmd.wqe_com, 6199 ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l)); 6200 abort_tag = iocbq->iocb.un.acxri.abortIoTag; 6201 /* 6202 * The abort handler will send us CMD_ABORT_XRI_CN or 6203 * CMD_CLOSE_XRI_CN and the fw only accepts CMD_ABORT_XRI_CX 6204 */ 6205 + bf_set(wqe_cmnd, &wqe->abort_cmd.wqe_com, CMD_ABORT_XRI_CX); 6206 + bf_set(wqe_qosd, &wqe->abort_cmd.wqe_com, 1); 6207 + bf_set(wqe_lenloc, &wqe->abort_cmd.wqe_com, 6208 + LPFC_WQE_LENLOC_NONE); 6209 cmnd = CMD_ABORT_XRI_CX; 6210 command_type = OTHER_COMMAND; 6211 xritag = 0; ··· 6235 bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1); 6236 bf_set(wqe_ctxt_tag, &wqe->xmit_bls_rsp.wqe_com, 6237 iocbq->iocb.ulpContext); 6238 + bf_set(wqe_qosd, &wqe->xmit_bls_rsp.wqe_com, 1); 6239 + bf_set(wqe_lenloc, &wqe->xmit_bls_rsp.wqe_com, 6240 + LPFC_WQE_LENLOC_NONE); 6241 /* Overwrite the pre-set comnd type with OTHER_COMMAND */ 6242 command_type = OTHER_COMMAND; 6243 break; 6244 case CMD_XRI_ABORTED_CX: 6245 case CMD_CREATE_XRI_CR: /* Do we expect to use this? */ 6246 case CMD_IOCB_FCP_IBIDIR64_CR: /* bidirectional xfer */ 6247 case CMD_FCP_TSEND64_CX: /* Target mode send xfer-ready */ 6248 case CMD_FCP_TRSP64_CX: /* Target mode rcv */ ··· 6257 iocbq->iocb.ulpCommand); 6258 return IOCB_ERROR; 6259 break; 6260 } 6261 + bf_set(wqe_xri_tag, &wqe->generic.wqe_com, xritag); 6262 + bf_set(wqe_reqtag, &wqe->generic.wqe_com, iocbq->iotag); 6263 + wqe->generic.wqe_com.abort_tag = abort_tag; 6264 + bf_set(wqe_cmd_type, &wqe->generic.wqe_com, command_type); 6265 + bf_set(wqe_cmnd, &wqe->generic.wqe_com, cmnd); 6266 + bf_set(wqe_class, &wqe->generic.wqe_com, iocbq->iocb.ulpClass); 6267 + bf_set(wqe_cqid, &wqe->generic.wqe_com, LPFC_WQE_CQ_ID_DEFAULT); 6268 return 0; 6269 } 6270