{
        struct scsi_device *sdp = sdkp->device;
        u8 type;
-       int ret = 0;
 
        if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0) {
                sdkp->protection_type = 0;
-               return ret;
+               return 0;
        }
 
        type = ((buffer[12] >> 1) & 7) + 1; /* P_TYPE 0 = Type 1 */
 
-       if (type > T10_PI_TYPE3_PROTECTION)
-               ret = -ENODEV;
-       else if (scsi_host_dif_capable(sdp->host, type))
-               ret = 1;
-
-       if (sdkp->first_scan || type != sdkp->protection_type)
-               switch (ret) {
-               case -ENODEV:
-                       sd_printk(KERN_ERR, sdkp, "formatted with unsupported" \
-                                 " protection type %u. Disabling disk!\n",
-                                 type);
-                       break;
-               case 1:
-                       sd_printk(KERN_NOTICE, sdkp,
-                                 "Enabling DIF Type %u protection\n", type);
-                       break;
-               case 0:
-                       sd_printk(KERN_NOTICE, sdkp,
-                                 "Disabling DIF Type %u protection\n", type);
-                       break;
-               }
+       if (type > T10_PI_TYPE3_PROTECTION) {
+               sd_printk(KERN_ERR, sdkp, "formatted with unsupported"  \
+                         " protection type %u. Disabling disk!\n",
+                         type);
+               sdkp->protection_type = 0;
+               return -ENODEV;
+       }
 
        sdkp->protection_type = type;
 
-       return ret;
+       return 0;
+}
+
+static void sd_config_protection(struct scsi_disk *sdkp)
+{
+       struct scsi_device *sdp = sdkp->device;
+
+       if (!sdkp->first_scan)
+               return;
+
+       sd_dif_config_host(sdkp);
+
+       if (!sdkp->protection_type)
+               return;
+
+       if (!scsi_host_dif_capable(sdp->host, sdkp->protection_type)) {
+               sd_printk(KERN_NOTICE, sdkp,
+                         "Disabling DIF Type %u protection\n",
+                         sdkp->protection_type);
+               sdkp->protection_type = 0;
+       }
+
+       sd_printk(KERN_NOTICE, sdkp, "Enabling DIF Type %u protection\n",
+                 sdkp->protection_type);
 }
 
 static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
                sd_read_app_tag_own(sdkp, buffer);
                sd_read_write_same(sdkp, buffer);
                sd_read_security(sdkp, buffer);
+               sd_config_protection(sdkp);
        }
 
        /*
                goto out;
        }
 
-       if (sdkp->capacity)
-               sd_dif_config_host(sdkp);
-
-       sd_revalidate_disk(gd);
-
        if (sdkp->security) {
                sdkp->opal_dev = init_opal_dev(sdkp, &sd_sec_submit);
                if (sdkp->opal_dev)
 
                        bi.profile = &t10_pi_type1_crc;
 
        bi.tuple_size = sizeof(struct t10_pi_tuple);
-       sd_printk(KERN_NOTICE, sdkp,
-                 "Enabling DIX %s protection\n", bi.profile->name);
 
        if (dif && type) {
                bi.flags |= BLK_INTEGRITY_DEVICE_CAPABLE;
                        bi.tag_size = sizeof(u16) + sizeof(u32);
                else
                        bi.tag_size = sizeof(u16);
-
-               sd_printk(KERN_NOTICE, sdkp, "DIF application tag size %u\n",
-                         bi.tag_size);
        }
 
+       sd_printk(KERN_NOTICE, sdkp,
+                 "Enabling DIX %s, application tag size %u bytes\n",
+                 bi.profile->name, bi.tag_size);
 out:
        blk_integrity_register(disk, &bi);
 }