diff options
| -rw-r--r-- | drivers/infiniband/ulp/iser/iscsi_iser.c | 21 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/iser/iser_memory.c | 62 |
2 files changed, 26 insertions, 57 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index 0af32cdb34a1..6a594aac2290 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | |||
| @@ -97,7 +97,7 @@ module_param_named(pi_enable, iser_pi_enable, bool, 0644); | |||
| 97 | MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)"); | 97 | MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)"); |
| 98 | 98 | ||
| 99 | module_param_named(pi_guard, iser_pi_guard, int, 0644); | 99 | module_param_named(pi_guard, iser_pi_guard, int, 0644); |
| 100 | MODULE_PARM_DESC(pi_guard, "T10-PI guard_type, 0:CRC|1:IP_CSUM (default:IP_CSUM)"); | 100 | MODULE_PARM_DESC(pi_guard, "T10-PI guard_type [deprecated]"); |
| 101 | 101 | ||
| 102 | static struct workqueue_struct *release_wq; | 102 | static struct workqueue_struct *release_wq; |
| 103 | struct iser_global ig; | 103 | struct iser_global ig; |
| @@ -574,12 +574,13 @@ iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session) | |||
| 574 | static inline unsigned int | 574 | static inline unsigned int |
| 575 | iser_dif_prot_caps(int prot_caps) | 575 | iser_dif_prot_caps(int prot_caps) |
| 576 | { | 576 | { |
| 577 | return ((prot_caps & IB_PROT_T10DIF_TYPE_1) ? SHOST_DIF_TYPE1_PROTECTION | | 577 | return ((prot_caps & IB_PROT_T10DIF_TYPE_1) ? |
| 578 | SHOST_DIX_TYPE1_PROTECTION : 0) | | 578 | SHOST_DIF_TYPE1_PROTECTION | SHOST_DIX_TYPE0_PROTECTION | |
| 579 | ((prot_caps & IB_PROT_T10DIF_TYPE_2) ? SHOST_DIF_TYPE2_PROTECTION | | 579 | SHOST_DIX_TYPE1_PROTECTION : 0) | |
| 580 | SHOST_DIX_TYPE2_PROTECTION : 0) | | 580 | ((prot_caps & IB_PROT_T10DIF_TYPE_2) ? |
| 581 | ((prot_caps & IB_PROT_T10DIF_TYPE_3) ? SHOST_DIF_TYPE3_PROTECTION | | 581 | SHOST_DIF_TYPE2_PROTECTION | SHOST_DIX_TYPE2_PROTECTION : 0) | |
| 582 | SHOST_DIX_TYPE3_PROTECTION : 0); | 582 | ((prot_caps & IB_PROT_T10DIF_TYPE_3) ? |
| 583 | SHOST_DIF_TYPE3_PROTECTION | SHOST_DIX_TYPE3_PROTECTION : 0); | ||
| 583 | } | 584 | } |
| 584 | 585 | ||
| 585 | /** | 586 | /** |
| @@ -635,10 +636,8 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep, | |||
| 635 | u32 sig_caps = ib_conn->device->dev_attr.sig_prot_cap; | 636 | u32 sig_caps = ib_conn->device->dev_attr.sig_prot_cap; |
| 636 | 637 | ||
| 637 | scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps)); | 638 | scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps)); |
| 638 | if (iser_pi_guard) | 639 | scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP | |
| 639 | scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP); | 640 | SHOST_DIX_GUARD_CRC); |
| 640 | else | ||
| 641 | scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC); | ||
| 642 | } | 641 | } |
| 643 | 642 | ||
| 644 | if (iscsi_host_add(shost, | 643 | if (iscsi_host_add(shost, |
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index d83270511079..abce9339333f 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c | |||
| @@ -438,13 +438,13 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task, | |||
| 438 | return 0; | 438 | return 0; |
| 439 | } | 439 | } |
| 440 | 440 | ||
| 441 | static inline void | 441 | static void |
| 442 | iser_set_dif_domain(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs, | 442 | iser_set_dif_domain(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs, |
| 443 | struct ib_sig_domain *domain) | 443 | struct ib_sig_domain *domain) |
| 444 | { | 444 | { |
| 445 | domain->sig_type = IB_SIG_TYPE_T10_DIF; | 445 | domain->sig_type = IB_SIG_TYPE_T10_DIF; |
| 446 | domain->sig.dif.pi_interval = sc->device->sector_size; | 446 | domain->sig.dif.pi_interval = scsi_prot_interval(sc); |
| 447 | domain->sig.dif.ref_tag = scsi_get_lba(sc) & 0xffffffff; | 447 | domain->sig.dif.ref_tag = scsi_prot_ref_tag(sc); |
| 448 | /* | 448 | /* |
| 449 | * At the moment we hard code those, but in the future | 449 | * At the moment we hard code those, but in the future |
| 450 | * we will take them from sc. | 450 | * we will take them from sc. |
| @@ -452,8 +452,7 @@ iser_set_dif_domain(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs, | |||
| 452 | domain->sig.dif.apptag_check_mask = 0xffff; | 452 | domain->sig.dif.apptag_check_mask = 0xffff; |
| 453 | domain->sig.dif.app_escape = true; | 453 | domain->sig.dif.app_escape = true; |
| 454 | domain->sig.dif.ref_escape = true; | 454 | domain->sig.dif.ref_escape = true; |
| 455 | if (scsi_get_prot_type(sc) == SCSI_PROT_DIF_TYPE1 || | 455 | if (sc->prot_flags & SCSI_PROT_REF_INCREMENT) |
| 456 | scsi_get_prot_type(sc) == SCSI_PROT_DIF_TYPE2) | ||
| 457 | domain->sig.dif.ref_remap = true; | 456 | domain->sig.dif.ref_remap = true; |
| 458 | }; | 457 | }; |
| 459 | 458 | ||
| @@ -471,26 +470,16 @@ iser_set_sig_attrs(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs) | |||
| 471 | case SCSI_PROT_WRITE_STRIP: | 470 | case SCSI_PROT_WRITE_STRIP: |
| 472 | sig_attrs->wire.sig_type = IB_SIG_TYPE_NONE; | 471 | sig_attrs->wire.sig_type = IB_SIG_TYPE_NONE; |
| 473 | iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem); | 472 | iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem); |
| 474 | /* | 473 | sig_attrs->mem.sig.dif.bg_type = sc->prot_flags & SCSI_PROT_IP_CHECKSUM ? |
| 475 | * At the moment we use this modparam to tell what is | 474 | IB_T10DIF_CSUM : IB_T10DIF_CRC; |
| 476 | * the memory bg_type, in the future we will take it | ||
| 477 | * from sc. | ||
| 478 | */ | ||
| 479 | sig_attrs->mem.sig.dif.bg_type = iser_pi_guard ? IB_T10DIF_CSUM : | ||
| 480 | IB_T10DIF_CRC; | ||
| 481 | break; | 475 | break; |
| 482 | case SCSI_PROT_READ_PASS: | 476 | case SCSI_PROT_READ_PASS: |
| 483 | case SCSI_PROT_WRITE_PASS: | 477 | case SCSI_PROT_WRITE_PASS: |
| 484 | iser_set_dif_domain(sc, sig_attrs, &sig_attrs->wire); | 478 | iser_set_dif_domain(sc, sig_attrs, &sig_attrs->wire); |
| 485 | sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC; | 479 | sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC; |
| 486 | iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem); | 480 | iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem); |
| 487 | /* | 481 | sig_attrs->mem.sig.dif.bg_type = sc->prot_flags & SCSI_PROT_IP_CHECKSUM ? |
| 488 | * At the moment we use this modparam to tell what is | 482 | IB_T10DIF_CSUM : IB_T10DIF_CRC; |
| 489 | * the memory bg_type, in the future we will take it | ||
| 490 | * from sc. | ||
| 491 | */ | ||
| 492 | sig_attrs->mem.sig.dif.bg_type = iser_pi_guard ? IB_T10DIF_CSUM : | ||
| 493 | IB_T10DIF_CRC; | ||
| 494 | break; | 483 | break; |
| 495 | default: | 484 | default: |
| 496 | iser_err("Unsupported PI operation %d\n", | 485 | iser_err("Unsupported PI operation %d\n", |
| @@ -501,26 +490,14 @@ iser_set_sig_attrs(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs) | |||
| 501 | return 0; | 490 | return 0; |
| 502 | } | 491 | } |
| 503 | 492 | ||
| 504 | static int | 493 | static inline void |
| 505 | iser_set_prot_checks(struct scsi_cmnd *sc, u8 *mask) | 494 | iser_set_prot_checks(struct scsi_cmnd *sc, u8 *mask) |
| 506 | { | 495 | { |
| 507 | switch (scsi_get_prot_type(sc)) { | 496 | *mask = 0; |
| 508 | case SCSI_PROT_DIF_TYPE0: | 497 | if (sc->prot_flags & SCSI_PROT_REF_CHECK) |
| 509 | break; | 498 | *mask |= ISER_CHECK_REFTAG; |
| 510 | case SCSI_PROT_DIF_TYPE1: | 499 | if (sc->prot_flags & SCSI_PROT_GUARD_CHECK) |
| 511 | case SCSI_PROT_DIF_TYPE2: | 500 | *mask |= ISER_CHECK_GUARD; |
| 512 | *mask = ISER_CHECK_GUARD | ISER_CHECK_REFTAG; | ||
| 513 | break; | ||
| 514 | case SCSI_PROT_DIF_TYPE3: | ||
| 515 | *mask = ISER_CHECK_GUARD; | ||
| 516 | break; | ||
| 517 | default: | ||
| 518 | iser_err("Unsupported protection type %d\n", | ||
| 519 | scsi_get_prot_type(sc)); | ||
| 520 | return -EINVAL; | ||
| 521 | } | ||
| 522 | |||
| 523 | return 0; | ||
| 524 | } | 501 | } |
| 525 | 502 | ||
| 526 | static void | 503 | static void |
| @@ -554,9 +531,7 @@ iser_reg_sig_mr(struct iscsi_iser_task *iser_task, | |||
| 554 | if (ret) | 531 | if (ret) |
| 555 | goto err; | 532 | goto err; |
| 556 | 533 | ||
| 557 | ret = iser_set_prot_checks(iser_task->sc, &sig_attrs.check_mask); | 534 | iser_set_prot_checks(iser_task->sc, &sig_attrs.check_mask); |
| 558 | if (ret) | ||
| 559 | goto err; | ||
| 560 | 535 | ||
| 561 | if (!(desc->reg_indicators & ISER_SIG_KEY_VALID)) { | 536 | if (!(desc->reg_indicators & ISER_SIG_KEY_VALID)) { |
| 562 | iser_inv_rkey(&inv_wr, pi_ctx->sig_mr); | 537 | iser_inv_rkey(&inv_wr, pi_ctx->sig_mr); |
| @@ -590,12 +565,7 @@ iser_reg_sig_mr(struct iscsi_iser_task *iser_task, | |||
| 590 | 565 | ||
| 591 | sig_sge->lkey = pi_ctx->sig_mr->lkey; | 566 | sig_sge->lkey = pi_ctx->sig_mr->lkey; |
| 592 | sig_sge->addr = 0; | 567 | sig_sge->addr = 0; |
| 593 | sig_sge->length = data_sge->length + prot_sge->length; | 568 | sig_sge->length = scsi_transfer_length(iser_task->sc); |
| 594 | if (scsi_get_prot_op(iser_task->sc) == SCSI_PROT_WRITE_INSERT || | ||
| 595 | scsi_get_prot_op(iser_task->sc) == SCSI_PROT_READ_STRIP) { | ||
| 596 | sig_sge->length += (data_sge->length / | ||
| 597 | iser_task->sc->device->sector_size) * 8; | ||
| 598 | } | ||
| 599 | 569 | ||
| 600 | iser_dbg("sig_sge: addr: 0x%llx length: %u lkey: 0x%x\n", | 570 | iser_dbg("sig_sge: addr: 0x%llx length: %u lkey: 0x%x\n", |
| 601 | sig_sge->addr, sig_sge->length, | 571 | sig_sge->addr, sig_sge->length, |
