[SCSI] pm80xx: IButton security feature support for motherboard controllers.
authorAnand Kumar Santhanam <AnandKumar.Santhanam@pmcs.com>
Tue, 17 Sep 2013 09:02:20 +0000 (14:32 +0530)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 25 Oct 2013 08:58:15 +0000 (09:58 +0100)
Signed-off-by: Anandkumar.Santhanam@pmcs.com
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/pm8001/pm80xx_hwi.c

index 0a2dc56ed9f6e950824133923f52b2c40ad4de83..c8a4465b74a58f0c0301acd356115e35d2c985c5 100644 (file)
@@ -967,6 +967,7 @@ pm80xx_chip_soft_rst(struct pm8001_hba_info *pm8001_ha)
 {
        u32 regval;
        u32 bootloader_state;
+       u32 ibutton0, ibutton1;
 
        /* Check if MPI is in ready state to reset */
        if (mpi_uninit_check(pm8001_ha) != 0) {
@@ -1025,7 +1026,27 @@ pm80xx_chip_soft_rst(struct pm8001_hba_info *pm8001_ha)
        if (-1 == check_fw_ready(pm8001_ha)) {
                PM8001_FAIL_DBG(pm8001_ha,
                        pm8001_printk("Firmware is not ready!\n"));
-               return -EBUSY;
+               /* check iButton feature support for motherboard controller */
+               if (pm8001_ha->pdev->subsystem_vendor !=
+                       PCI_VENDOR_ID_ADAPTEC2 &&
+                       pm8001_ha->pdev->subsystem_vendor != 0) {
+                       ibutton0 = pm8001_cr32(pm8001_ha, 0,
+                                       MSGU_HOST_SCRATCH_PAD_6);
+                       ibutton1 = pm8001_cr32(pm8001_ha, 0,
+                                       MSGU_HOST_SCRATCH_PAD_7);
+                       if (!ibutton0 && !ibutton1) {
+                               PM8001_FAIL_DBG(pm8001_ha,
+                                       pm8001_printk("iButton Feature is"
+                                       " not Available!!!\n"));
+                               return -EBUSY;
+                       }
+                       if (ibutton0 == 0xdeadbeef && ibutton1 == 0xdeadbeef) {
+                               PM8001_FAIL_DBG(pm8001_ha,
+                                       pm8001_printk("CRC Check for iButton"
+                                       " Feature Failed!!!\n"));
+                               return -EBUSY;
+                       }
+               }
        }
        PM8001_INIT_DBG(pm8001_ha,
                pm8001_printk("SPCv soft reset Complete\n"));