bip->bip_iter.bi_size = len;
        bip_set_seed(bip, bio->bi_iter.bi_sector);
 
+       if (bi->flags & BLK_INTEGRITY_IP_CHECKSUM)
+               bip->bip_flags |= BIP_IP_CHECKSUM;
+
        /* Map it */
        offset = offset_in_page(buf);
        for (i = 0 ; i < nr_pages ; i++) {
 
                return;
 
        /* Enable DMA of protection information */
-       if (scsi_host_get_guard(sdkp->device->host) & SHOST_DIX_GUARD_IP)
+       if (scsi_host_get_guard(sdkp->device->host) & SHOST_DIX_GUARD_IP) {
                if (type == SD_DIF_TYPE3_PROTECTION)
                        blk_integrity_register(disk, &dif_type3_integrity_ip);
                else
                        blk_integrity_register(disk, &dif_type1_integrity_ip);
-       else
+
+               disk->integrity->flags |= BLK_INTEGRITY_IP_CHECKSUM;
+       } else
                if (type == SD_DIF_TYPE3_PROTECTION)
                        blk_integrity_register(disk, &dif_type3_integrity_crc);
                else
 
        BIP_MAPPED_INTEGRITY    = 1 << 1, /* ref tag has been remapped */
        BIP_CTRL_NOCHECK        = 1 << 2, /* disable HBA integrity checking */
        BIP_DISK_NOCHECK        = 1 << 3, /* disable disk integrity checking */
+       BIP_IP_CHECKSUM         = 1 << 4, /* IP checksum */
 };
 
 static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
 
        BLK_INTEGRITY_VERIFY            = 1 << 0,
        BLK_INTEGRITY_GENERATE          = 1 << 1,
        BLK_INTEGRITY_DEVICE_CAPABLE    = 1 << 2,
+       BLK_INTEGRITY_IP_CHECKSUM       = 1 << 3,
 };
 
 struct blk_integrity_iter {