scsi: qla2xxx: Add protection mask module parameters
authorMartin K. Petersen <martin.petersen@oracle.com>
Fri, 21 Dec 2018 17:33:44 +0000 (09:33 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 12 Jan 2019 03:03:22 +0000 (22:03 -0500)
Allow user to selectively enable/disable DIF/DIX protection
capabilities mask.

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_os.c

index ea69dafc97749e34be377c658c314cbfdc58bf94..3a4f68f40057007e1fff66befef268e009ff3646 100644 (file)
@@ -285,6 +285,20 @@ MODULE_PARM_DESC(qla2xuseresexchforels,
                 "Reserve 1/2 of emergency exchanges for ELS.\n"
                 " 0 (default): disabled");
 
+int ql2xprotmask;
+module_param(ql2xprotmask, int, 0644);
+MODULE_PARM_DESC(ql2xprotmask,
+                "Override DIF/DIX protection capabilities mask\n"
+                "Default is 0 which sets protection mask based on "
+                "capabilities reported by HBA firmware.\n");
+
+int ql2xprotguard;
+module_param(ql2xprotguard, int, 0644);
+MODULE_PARM_DESC(ql2xprotguard, "Override choice of DIX checksum\n"
+                "  0 -- Let HBA firmware decide\n"
+                "  1 -- Force T10 CRC\n"
+                "  2 -- Force IP checksum\n");
+
 /*
  * SCSI host template entry points
  */
@@ -3342,13 +3356,16 @@ skip_dpc:
                            "Registering for DIF/DIX type 1 and 3 protection.\n");
                        if (ql2xenabledif == 1)
                                prot = SHOST_DIX_TYPE0_PROTECTION;
-                       scsi_host_set_prot(host,
-                           prot | SHOST_DIF_TYPE1_PROTECTION
-                           | SHOST_DIF_TYPE2_PROTECTION
-                           | SHOST_DIF_TYPE3_PROTECTION
-                           | SHOST_DIX_TYPE1_PROTECTION
-                           | SHOST_DIX_TYPE2_PROTECTION
-                           | SHOST_DIX_TYPE3_PROTECTION);
+                       if (ql2xprotmask)
+                               scsi_host_set_prot(host, ql2xprotmask);
+                       else
+                               scsi_host_set_prot(host,
+                                   prot | SHOST_DIF_TYPE1_PROTECTION
+                                   | SHOST_DIF_TYPE2_PROTECTION
+                                   | SHOST_DIF_TYPE3_PROTECTION
+                                   | SHOST_DIX_TYPE1_PROTECTION
+                                   | SHOST_DIX_TYPE2_PROTECTION
+                                   | SHOST_DIX_TYPE3_PROTECTION);
 
                        guard = SHOST_DIX_GUARD_CRC;
 
@@ -3356,7 +3373,10 @@ skip_dpc:
                            (ql2xenabledif > 1 || IS_PI_DIFB_DIX0_CAPABLE(ha)))
                                guard |= SHOST_DIX_GUARD_IP;
 
-                       scsi_host_set_guard(host, guard);
+                       if (ql2xprotguard)
+                               scsi_host_set_guard(host, ql2xprotguard);
+                       else
+                               scsi_host_set_guard(host, guard);
                } else
                        base_vha->flags.difdix_supported = 0;
        }