Merge git://oss.sgi.com:8090/xfs/xfs-2.6
[linux-drm-fsl-dcu.git] / drivers / message / fusion / mptbase.c
index a07f0f81f96bd49ffb0615f3f66f97500fcc1103..083acfd91d8bff0dad61188a8195c7b8aa1893e2 100644 (file)
@@ -6,7 +6,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -177,11 +177,14 @@ static void       mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc);
 
 //int          mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag);
 static int     ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply, int *evHandlers);
-static void    mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf);
+#ifdef MPT_DEBUG_REPLY
+static void    mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf);
+#endif
 static void    mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static int     mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);
+static void    mpt_inactive_raid_list_free(MPT_ADAPTER *ioc);
 
 /* module entry point */
 static int  __init    fusion_init  (void);
@@ -323,13 +326,11 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)
                else if (ioc->bus_type == SAS)
                        mpt_sas_log_info(ioc, log_info);
        }
-       if (ioc_stat & MPI_IOCSTATUS_MASK) {
-               if (ioc->bus_type == SPI &&
-                   cb_idx != mpt_stm_index &&
-                   cb_idx != mpt_lan_index)
-                       mpt_sp_ioc_info(ioc, (u32)ioc_stat, mf);
-       }
 
+#ifdef MPT_DEBUG_REPLY
+       if (ioc_stat & MPI_IOCSTATUS_MASK)
+               mpt_iocstatus_info(ioc, (u32)ioc_stat, mf);
+#endif
 
        /*  Check for (valid) IO callback!  */
        if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
@@ -915,7 +916,7 @@ mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr)
 int
 mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)
 {
-       int              r = 0;
+       int     r = 0;
        u8      *req_as_bytes;
        int      ii;
 
@@ -1815,6 +1816,13 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
         *      and we try GetLanConfigPages again...
         */
        if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) {
+
+               /*
+                * Initalize link list for inactive raid volumes.
+                */
+               init_MUTEX(&ioc->raid_data.inactive_list_mutex);
+               INIT_LIST_HEAD(&ioc->raid_data.inactive_list);
+
                if (ioc->bus_type == SAS) {
 
                        /* clear persistency table */
@@ -2021,6 +2029,8 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
        }
 
        kfree(ioc->spi_data.nvram);
+       mpt_inactive_raid_list_free(ioc);
+       kfree(ioc->raid_data.pIocPg2);
        kfree(ioc->raid_data.pIocPg3);
        ioc->spi_data.nvram = NULL;
        ioc->raid_data.pIocPg3 = NULL;
@@ -2417,6 +2427,9 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)
                        facts->FWVersion.Word = le32_to_cpu(facts->FWVersion.Word);
 
                facts->ProductID = le16_to_cpu(facts->ProductID);
+               if ((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK)
+                   > MPI_FW_HEADER_PID_PROD_TARGET_SCSI)
+                       ioc->ir_firmware = 1;
                facts->CurrentHostMfaHighAddr =
                                le32_to_cpu(facts->CurrentHostMfaHighAddr);
                facts->GlobalCredits = le16_to_cpu(facts->GlobalCredits);
@@ -2735,9 +2748,7 @@ SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
 
        /* RAID FW may take a long time to enable
         */
-       if (((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK)
-           > MPI_FW_HEADER_PID_PROD_TARGET_SCSI) ||
-           (ioc->bus_type == SAS)) {
+       if (ioc->ir_firmware || ioc->bus_type == SAS) {
                rc = mpt_handshake_req_reply_wait(ioc, req_sz,
                (u32*)&port_enable, reply_sz, (u16*)&reply_buf,
                300 /*seconds*/, sleepFlag);
@@ -3208,6 +3219,9 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
        u32 diag1val = 0;
 #endif
 
+       /* Clear any existing interrupts */
+       CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
+
        if (ioc->pcidev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) {
                drsprintk((MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset "
                        "address=%p\n",  ioc->name, __FUNCTION__,
@@ -3227,7 +3241,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                                " count=%d\n",
                                ioc->name, doorbell, count));
                        if (doorbell == MPI_IOC_STATE_READY) {
-                               return 0;
+                               return 1;
                        }
 
                        /* wait 1 sec */
@@ -3239,9 +3253,6 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                return -1;
        }
 
-       /* Clear any existing interrupts */
-       CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
-
        /* Use "Diagnostic reset" method! (only thing available!) */
        diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
 
@@ -3957,7 +3968,7 @@ WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
                }
        } else {
                while (--cntdn) {
-                       mdelay (1);
+                       udelay (1000);
                        intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
                        if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS))
                                break;
@@ -4009,7 +4020,7 @@ WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
                        intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
                        if (intstat & MPI_HIS_DOORBELL_INTERRUPT)
                                break;
-                       mdelay(1);
+                       udelay (1000);
                        count++;
                }
        }
@@ -4325,8 +4336,8 @@ mptbase_raid_process_event_data(MPT_ADAPTER *ioc,
        if ((reason >= MPI_EVENT_RAID_RC_PHYSDISK_CREATED &&
             reason <= MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED) ||
            (reason == MPI_EVENT_RAID_RC_SMART_DATA)) {
-               printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for PhysDisk %d\n",
-                       ioc->name, disk);
+               printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for PhysDisk %d id=%d\n",
+                       ioc->name, disk, volume);
        } else {
                printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for VolumeID %d\n",
                        ioc->name, volume);
@@ -4727,7 +4738,187 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
        return 0;
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ * mpt_inactive_raid_list_free
+ *
+ * This clears this link list.
+ *
+ * @ioc - pointer to per adapter structure
+ *
+ **/
+static void
+mpt_inactive_raid_list_free(MPT_ADAPTER *ioc)
+{
+       struct inactive_raid_component_info *component_info, *pNext;
+
+       if (list_empty(&ioc->raid_data.inactive_list))
+               return;
+
+       down(&ioc->raid_data.inactive_list_mutex);
+       list_for_each_entry_safe(component_info, pNext,
+           &ioc->raid_data.inactive_list, list) {
+               list_del(&component_info->list);
+               kfree(component_info);
+       }
+       up(&ioc->raid_data.inactive_list_mutex);
+}
+
+/**
+ * mpt_inactive_raid_volumes
+ *
+ * This sets up link list of phy_disk_nums for devices belonging in an inactive volume
+ *
+ * @ioc - pointer to per adapter structure
+ * @channel - volume channel
+ * @id - volume target id
+ *
+ *
+ **/
+static void
+mpt_inactive_raid_volumes(MPT_ADAPTER *ioc, u8 channel, u8 id)
+{
+       CONFIGPARMS                     cfg;
+       ConfigPageHeader_t              hdr;
+       dma_addr_t                      dma_handle;
+       pRaidVolumePage0_t              buffer = NULL;
+       int                             i;
+       RaidPhysDiskPage0_t             phys_disk;
+       struct inactive_raid_component_info *component_info;
+       int                             handle_inactive_volumes;
+
+       memset(&cfg, 0 , sizeof(CONFIGPARMS));
+       memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
+       hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
+       cfg.pageAddr = (channel << 8) + id;
+       cfg.cfghdr.hdr = &hdr;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
+
+       if (mpt_config(ioc, &cfg) != 0)
+               goto out;
+
+       if (!hdr.PageLength)
+               goto out;
+
+       buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
+           &dma_handle);
+
+       if (!buffer)
+               goto out;
+
+       cfg.physAddr = dma_handle;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
+
+       if (mpt_config(ioc, &cfg) != 0)
+               goto out;
+
+       if (!buffer->NumPhysDisks)
+               goto out;
+
+       handle_inactive_volumes =
+          (buffer->VolumeStatus.Flags & MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE ||
+          (buffer->VolumeStatus.Flags & MPI_RAIDVOL0_STATUS_FLAG_ENABLED) == 0 ||
+           buffer->VolumeStatus.State == MPI_RAIDVOL0_STATUS_STATE_FAILED ||
+           buffer->VolumeStatus.State == MPI_RAIDVOL0_STATUS_STATE_MISSING) ? 1 : 0;
+
+       if (!handle_inactive_volumes)
+               goto out;
+
+       down(&ioc->raid_data.inactive_list_mutex);
+       for (i = 0; i < buffer->NumPhysDisks; i++) {
+               if(mpt_raid_phys_disk_pg0(ioc,
+                   buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
+                       continue;
+
+               if ((component_info = kmalloc(sizeof (*component_info),
+                GFP_KERNEL)) == NULL)
+                       continue;
+
+               component_info->volumeID = id;
+               component_info->volumeBus = channel;
+               component_info->d.PhysDiskNum = phys_disk.PhysDiskNum;
+               component_info->d.PhysDiskBus = phys_disk.PhysDiskBus;
+               component_info->d.PhysDiskID = phys_disk.PhysDiskID;
+               component_info->d.PhysDiskIOC = phys_disk.PhysDiskIOC;
+
+               list_add_tail(&component_info->list,
+                   &ioc->raid_data.inactive_list);
+       }
+       up(&ioc->raid_data.inactive_list_mutex);
+
+ out:
+       if (buffer)
+               pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
+                   dma_handle);
+}
+
+/**
+ *     mpt_raid_phys_disk_pg0 - returns phys disk page zero
+ *     @ioc: Pointer to a Adapter Structure
+ *     @phys_disk_num: io unit unique phys disk num generated by the ioc
+ *     @phys_disk: requested payload data returned
+ *
+ *     Return:
+ *     0 on success
+ *     -EFAULT if read of config page header fails or data pointer not NULL
+ *     -ENOMEM if pci_alloc failed
+ **/
+int
+mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage0_t phys_disk)
+{
+       CONFIGPARMS                     cfg;
+       ConfigPageHeader_t              hdr;
+       dma_addr_t                      dma_handle;
+       pRaidPhysDiskPage0_t            buffer = NULL;
+       int                             rc;
+
+       memset(&cfg, 0 , sizeof(CONFIGPARMS));
+       memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
+
+       hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_PHYSDISK;
+       cfg.cfghdr.hdr = &hdr;
+       cfg.physAddr = -1;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
+
+       if (mpt_config(ioc, &cfg) != 0) {
+               rc = -EFAULT;
+               goto out;
+       }
+
+       if (!hdr.PageLength) {
+               rc = -EFAULT;
+               goto out;
+       }
+
+       buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
+           &dma_handle);
+
+       if (!buffer) {
+               rc = -ENOMEM;
+               goto out;
+       }
+
+       cfg.physAddr = dma_handle;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
+       cfg.pageAddr = phys_disk_num;
+
+       if (mpt_config(ioc, &cfg) != 0) {
+               rc = -EFAULT;
+               goto out;
+       }
+
+       rc = 0;
+       memcpy(phys_disk, buffer, sizeof(*buffer));
+       phys_disk->MaxLBA = le32_to_cpu(buffer->MaxLBA);
+
+ out:
+
+       if (buffer)
+               pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
+                   dma_handle);
+
+       return rc;
+}
+
 /**
  *     mpt_findImVolumes - Identify IDs of hidden disks and RAID Volumes
  *     @ioc: Pointer to a Adapter Strucutre
@@ -4737,21 +4928,27 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
  *     0 on success
  *     -EFAULT if read of config page header fails or data pointer not NULL
  *     -ENOMEM if pci_alloc failed
- */
+ **/
 int
 mpt_findImVolumes(MPT_ADAPTER *ioc)
 {
        IOCPage2_t              *pIoc2;
        u8                      *mem;
-       ConfigPageIoc2RaidVol_t *pIocRv;
        dma_addr_t               ioc2_dma;
        CONFIGPARMS              cfg;
        ConfigPageHeader_t       header;
-       int                      jj;
        int                      rc = 0;
        int                      iocpage2sz;
-       u8                       nVols, nPhys;
-       u8                       vid, vbus, vioc;
+       int                      i;
+
+       if (!ioc->ir_firmware)
+               return 0;
+
+       /* Free the old page
+        */
+       kfree(ioc->raid_data.pIocPg2);
+       ioc->raid_data.pIocPg2 = NULL;
+       mpt_inactive_raid_list_free(ioc);
 
        /* Read IOCP2 header then the page.
         */
@@ -4779,55 +4976,23 @@ mpt_findImVolumes(MPT_ADAPTER *ioc)
        cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
        cfg.physAddr = ioc2_dma;
        if (mpt_config(ioc, &cfg) != 0)
-               goto done_and_free;
+               goto out;
+
+       mem = kmalloc(iocpage2sz, GFP_KERNEL);
+       if (!mem)
+               goto out;
 
-       if ( (mem = (u8 *)ioc->raid_data.pIocPg2) == NULL ) {
-               mem = kmalloc(iocpage2sz, GFP_ATOMIC);
-               if (mem) {
-                       ioc->raid_data.pIocPg2 = (IOCPage2_t *) mem;
-               } else {
-                       goto done_and_free;
-               }
-       }
        memcpy(mem, (u8 *)pIoc2, iocpage2sz);
+       ioc->raid_data.pIocPg2 = (IOCPage2_t *) mem;
 
-       /* Identify RAID Volume Id's */
-       nVols = pIoc2->NumActiveVolumes;
-       if ( nVols == 0) {
-               /* No RAID Volume.
-                */
-               goto done_and_free;
-       } else {
-               /* At least 1 RAID Volume
-                */
-               pIocRv = pIoc2->RaidVolume;
-               ioc->raid_data.isRaid = 0;
-               for (jj = 0; jj < nVols; jj++, pIocRv++) {
-                       vid = pIocRv->VolumeID;
-                       vbus = pIocRv->VolumeBus;
-                       vioc = pIocRv->VolumeIOC;
-
-                       /* find the match
-                        */
-                       if (vbus == 0) {
-                               ioc->raid_data.isRaid |= (1 << vid);
-                       } else {
-                               /* Error! Always bus 0
-                                */
-                       }
-               }
-       }
+       mpt_read_ioc_pg_3(ioc);
 
-       /* Identify Hidden Physical Disk Id's */
-       nPhys = pIoc2->NumActivePhysDisks;
-       if (nPhys == 0) {
-               /* No physical disks.
-                */
-       } else {
-               mpt_read_ioc_pg_3(ioc);
-       }
+       for (i = 0; i < pIoc2->NumActiveVolumes ; i++)
+               mpt_inactive_raid_volumes(ioc,
+                   pIoc2->RaidVolume[i].VolumeBus,
+                   pIoc2->RaidVolume[i].VolumeID);
 
-done_and_free:
+ out:
        pci_free_consistent(ioc->pcidev, iocpage2sz, pIoc2, ioc2_dma);
 
        return rc;
@@ -4880,7 +5045,7 @@ mpt_read_ioc_pg_3(MPT_ADAPTER *ioc)
        cfg.physAddr = ioc3_dma;
        cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
        if (mpt_config(ioc, &cfg) == 0) {
-               mem = kmalloc(iocpage3sz, GFP_ATOMIC);
+               mem = kmalloc(iocpage3sz, GFP_KERNEL);
                if (mem) {
                        memcpy(mem, (u8 *)pIoc3, iocpage3sz);
                        ioc->raid_data.pIocPg3 = (IOCPage3_t *) mem;
@@ -5694,8 +5859,6 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
        return rc;
 }
 
-# define EVENT_DESCR_STR_SZ            100
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 static void
 EventDescriptionStr(u8 event, u32 evData0, char *evStr)
@@ -5723,9 +5886,6 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
                break;
        case MPI_EVENT_RESCAN:
                ds = "Bus Rescan Event";
-               /* Ok, do we need to do anything here? As far as
-                  I can tell, this is when a new device gets added
-                  to the loop. */
                break;
        case MPI_EVENT_LINK_STATUS_CHANGE:
                if (evData0 == MPI_EVENT_LINK_STATUS_FAILURE)
@@ -5802,48 +5962,63 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
        case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
        {
                u8 id = (u8)(evData0);
+               u8 channel = (u8)(evData0 >> 8);
                u8 ReasonCode = (u8)(evData0 >> 16);
                switch (ReasonCode) {
                case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Added: id=%d", id);
+                           "SAS Device Status Change: Added: "
+                           "id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Deleted: id=%d", id);
+                           "SAS Device Status Change: Deleted: "
+                           "id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: SMART Data: id=%d",
-                           id);
+                           "SAS Device Status Change: SMART Data: "
+                           "id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: No Persistancy: id=%d", id);
+                           "SAS Device Status Change: No Persistancy: "
+                           "id=%d channel=%d", id, channel);
+                       break;
+               case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS Device Status Change: Unsupported Device "
+                           "Discovered : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Device Reset : id=%d", id);
+                           "SAS Device Status Change: Internal Device "
+                           "Reset : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Task Abort : id=%d", id);
+                           "SAS Device Status Change: Internal Task "
+                           "Abort : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Abort Task Set : id=%d", id);
+                           "SAS Device Status Change: Internal Abort "
+                           "Task Set : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Clear Task Set : id=%d", id);
+                           "SAS Device Status Change: Internal Clear "
+                           "Task Set : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Query Task : id=%d", id);
+                           "SAS Device Status Change: Internal Query "
+                           "Task : id=%d channel=%d", id, channel);
                        break;
                default:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Unknown: id=%d", id);
+                           "SAS Device Status Change: Unknown: "
+                           "id=%d channel=%d", id, channel);
                        break;
                }
                break;
@@ -5852,8 +6027,16 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
                ds = "Bus Timer Expired";
                break;
        case MPI_EVENT_QUEUE_FULL:
-               ds = "Queue Full";
+       {
+               u16 curr_depth = (u16)(evData0 >> 16);
+               u8 channel = (u8)(evData0 >> 8);
+               u8 id = (u8)(evData0);
+
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                  "Queue Full: channel=%d id=%d depth=%d",
+                  channel, id, curr_depth);
                break;
+       }
        case MPI_EVENT_SAS_SES:
                ds = "SAS SES Event";
                break;
@@ -5957,6 +6140,76 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
                ds = "SAS Log Entry Added";
                break;
 
+       case MPI_EVENT_SAS_BROADCAST_PRIMITIVE:
+       {
+               u8 phy_num = (u8)(evData0);
+               u8 port_num = (u8)(evData0 >> 8);
+               u8 port_width = (u8)(evData0 >> 16);
+               u8 primative = (u8)(evData0 >> 24);
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                   "SAS Broadcase Primative: phy=%d port=%d "
+                   "width=%d primative=0x%02x",
+                   phy_num, port_num, port_width, primative);
+               break;
+       }
+
+       case MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE:
+       {
+               u8 reason = (u8)(evData0);
+               u8 port_num = (u8)(evData0 >> 8);
+               u16 handle = le16_to_cpu(evData0 >> 16);
+
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                   "SAS Initiator Device Status Change: reason=0x%02x "
+                   "port=%d handle=0x%04x",
+                   reason, port_num, handle);
+               break;
+       }
+
+       case MPI_EVENT_SAS_INIT_TABLE_OVERFLOW:
+       {
+               u8 max_init = (u8)(evData0);
+               u8 current_init = (u8)(evData0 >> 8);
+
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                   "SAS Initiator Device Table Overflow: max initiators=%02d "
+                   "current initators=%02d",
+                   max_init, current_init);
+               break;
+       }
+       case MPI_EVENT_SAS_SMP_ERROR:
+       {
+               u8 status = (u8)(evData0);
+               u8 port_num = (u8)(evData0 >> 8);
+               u8 result = (u8)(evData0 >> 16);
+
+               if (status == MPI_EVENT_SAS_SMP_FUNCTION_RESULT_VALID)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d result=0x%02x",
+                           port_num, result);
+               else if (status == MPI_EVENT_SAS_SMP_CRC_ERROR)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : CRC Error",
+                           port_num);
+               else if (status == MPI_EVENT_SAS_SMP_TIMEOUT)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : Timeout",
+                           port_num);
+               else if (status == MPI_EVENT_SAS_SMP_NO_DESTINATION)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : No Destination",
+                           port_num);
+               else if (status == MPI_EVENT_SAS_SMP_BAD_DESTINATION)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : Bad Destination",
+                           port_num);
+               else
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : status=0x%02x",
+                           port_num, status);
+               break;
+       }
+
        /*
         *  MPT base "custom" events may be added here...
         */
@@ -6220,10 +6473,11 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
                "Abort",                                        /* 12h */
                "IO Not Yet Executed",                          /* 13h */
                "IO Executed",                                  /* 14h */
-               "Persistent Reservation Out Not Affiliation Owner", /* 15h */
+               "Persistent Reservation Out Not Affiliation "
+                   "Owner",                                    /* 15h */
                "Open Transmit DMA Abort",                      /* 16h */
                "IO Device Missing Delay Retry",                /* 17h */
-               NULL,                                           /* 18h */
+               "IO Cancelled Due to Recieve Error",            /* 18h */
                NULL,                                           /* 19h */
                NULL,                                           /* 1Ah */
                NULL,                                           /* 1Bh */
@@ -6233,6 +6487,96 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
                NULL,                                           /* 1Fh */
                "Enclosure Management"                          /* 20h */
        };
+       static char *ir_code_str[] = {
+               "Raid Action Error",                            /* 00h */
+               NULL,                                           /* 00h */
+               NULL,                                           /* 01h */
+               NULL,                                           /* 02h */
+               NULL,                                           /* 03h */
+               NULL,                                           /* 04h */
+               NULL,                                           /* 05h */
+               NULL,                                           /* 06h */
+               NULL                                            /* 07h */
+       };
+       static char *raid_sub_code_str[] = {
+               NULL,                                           /* 00h */
+               "Volume Creation Failed: Data Passed too "
+                   "Large",                                    /* 01h */
+               "Volume Creation Failed: Duplicate Volumes "
+                   "Attempted",                                /* 02h */
+               "Volume Creation Failed: Max Number "
+                   "Supported Volumes Exceeded",               /* 03h */
+               "Volume Creation Failed: DMA Error",            /* 04h */
+               "Volume Creation Failed: Invalid Volume Type",  /* 05h */
+               "Volume Creation Failed: Error Reading "
+                   "MFG Page 4",                               /* 06h */
+               "Volume Creation Failed: Creating Internal "
+                   "Structures",                               /* 07h */
+               NULL,                                           /* 08h */
+               NULL,                                           /* 09h */
+               NULL,                                           /* 0Ah */
+               NULL,                                           /* 0Bh */
+               NULL,                                           /* 0Ch */
+               NULL,                                           /* 0Dh */
+               NULL,                                           /* 0Eh */
+               NULL,                                           /* 0Fh */
+               "Activation failed: Already Active Volume",     /* 10h */
+               "Activation failed: Unsupported Volume Type",   /* 11h */
+               "Activation failed: Too Many Active Volumes",   /* 12h */
+               "Activation failed: Volume ID in Use",          /* 13h */
+               "Activation failed: Reported Failure",          /* 14h */
+               "Activation failed: Importing a Volume",        /* 15h */
+               NULL,                                           /* 16h */
+               NULL,                                           /* 17h */
+               NULL,                                           /* 18h */
+               NULL,                                           /* 19h */
+               NULL,                                           /* 1Ah */
+               NULL,                                           /* 1Bh */
+               NULL,                                           /* 1Ch */
+               NULL,                                           /* 1Dh */
+               NULL,                                           /* 1Eh */
+               NULL,                                           /* 1Fh */
+               "Phys Disk failed: Too Many Phys Disks",        /* 20h */
+               "Phys Disk failed: Data Passed too Large",      /* 21h */
+               "Phys Disk failed: DMA Error",                  /* 22h */
+               "Phys Disk failed: Invalid <channel:id>",       /* 23h */
+               "Phys Disk failed: Creating Phys Disk Config "
+                   "Page",                                     /* 24h */
+               NULL,                                           /* 25h */
+               NULL,                                           /* 26h */
+               NULL,                                           /* 27h */
+               NULL,                                           /* 28h */
+               NULL,                                           /* 29h */
+               NULL,                                           /* 2Ah */
+               NULL,                                           /* 2Bh */
+               NULL,                                           /* 2Ch */
+               NULL,                                           /* 2Dh */
+               NULL,                                           /* 2Eh */
+               NULL,                                           /* 2Fh */
+               "Compatibility Error: IR Disabled",             /* 30h */
+               "Compatibility Error: Inquiry Comand Failed",   /* 31h */
+               "Compatibility Error: Device not Direct Access "
+                   "Device ",                                  /* 32h */
+               "Compatibility Error: Removable Device Found",  /* 33h */
+               "Compatibility Error: Device SCSI Version not "
+                   "2 or Higher",                              /* 34h */
+               "Compatibility Error: SATA Device, 48 BIT LBA "
+                   "not Supported",                            /* 35h */
+               "Compatibility Error: Device doesn't have "
+                   "512 Byte Block Sizes",                     /* 36h */
+               "Compatibility Error: Volume Type Check Failed", /* 37h */
+               "Compatibility Error: Volume Type is "
+                   "Unsupported by FW",                        /* 38h */
+               "Compatibility Error: Disk Drive too Small for "
+                   "use in Volume",                            /* 39h */
+               "Compatibility Error: Phys Disk for Create "
+                   "Volume not Found",                         /* 3Ah */
+               "Compatibility Error: Too Many or too Few "
+                   "Disks for Volume Type",                    /* 3Bh */
+               "Compatibility Error: Disk stripe Sizes "
+                   "Must be 64KB",                             /* 3Ch */
+               "Compatibility Error: IME Size Limited to < 2TB", /* 3Dh */
+       };
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
@@ -6241,7 +6585,7 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
  *     @log_info: U32 LogInfo reply word from the IOC
  *
  *     Refer to lsi/mpi_log_sas.h.
- */
+ **/
 static void
 mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info)
 {
@@ -6255,56 +6599,165 @@ union loginfo_type {
        }dw;
 };
        union loginfo_type sas_loginfo;
+       char *originator_desc = NULL;
        char *code_desc = NULL;
+       char *sub_code_desc = NULL;
 
        sas_loginfo.loginfo = log_info;
        if ((sas_loginfo.dw.bus_type != 3 /*SAS*/) &&
            (sas_loginfo.dw.originator < sizeof(originator_str)/sizeof(char*)))
                return;
-       if ((sas_loginfo.dw.originator == 0 /*IOP*/) &&
-           (sas_loginfo.dw.code < sizeof(iop_code_str)/sizeof(char*))) {
-               code_desc = iop_code_str[sas_loginfo.dw.code];
-       }else if ((sas_loginfo.dw.originator == 1 /*PL*/) &&
-           (sas_loginfo.dw.code < sizeof(pl_code_str)/sizeof(char*) )) {
-               code_desc = pl_code_str[sas_loginfo.dw.code];
+
+       originator_desc = originator_str[sas_loginfo.dw.originator];
+
+       switch (sas_loginfo.dw.originator) {
+
+               case 0:  /* IOP */
+                       if (sas_loginfo.dw.code <
+                           sizeof(iop_code_str)/sizeof(char*))
+                               code_desc = iop_code_str[sas_loginfo.dw.code];
+                       break;
+               case 1:  /* PL */
+                       if (sas_loginfo.dw.code <
+                           sizeof(pl_code_str)/sizeof(char*))
+                               code_desc = pl_code_str[sas_loginfo.dw.code];
+                       break;
+               case 2:  /* IR */
+                       if (sas_loginfo.dw.code >=
+                           sizeof(ir_code_str)/sizeof(char*))
+                               break;
+                       code_desc = ir_code_str[sas_loginfo.dw.code];
+                       if (sas_loginfo.dw.subcode >=
+                           sizeof(raid_sub_code_str)/sizeof(char*))
+                       break;
+                       if (sas_loginfo.dw.code == 0)
+                               sub_code_desc =
+                                   raid_sub_code_str[sas_loginfo.dw.subcode];
+                       break;
+               default:
+                       return;
        }
 
-       if (code_desc != NULL)
+       if (sub_code_desc != NULL)
+               printk(MYIOC_s_INFO_FMT
+                       "LogInfo(0x%08x): Originator={%s}, Code={%s},"
+                       " SubCode={%s}\n",
+                       ioc->name, log_info, originator_desc, code_desc,
+                       sub_code_desc);
+       else if (code_desc != NULL)
                printk(MYIOC_s_INFO_FMT
                        "LogInfo(0x%08x): Originator={%s}, Code={%s},"
                        " SubCode(0x%04x)\n",
-                       ioc->name,
-                       log_info,
-                       originator_str[sas_loginfo.dw.originator],
-                       code_desc,
+                       ioc->name, log_info, originator_desc, code_desc,
                        sas_loginfo.dw.subcode);
        else
                printk(MYIOC_s_INFO_FMT
                        "LogInfo(0x%08x): Originator={%s}, Code=(0x%02x),"
                        " SubCode(0x%04x)\n",
-                       ioc->name,
-                       log_info,
-                       originator_str[sas_loginfo.dw.originator],
-                       sas_loginfo.dw.code,
-                       sas_loginfo.dw.subcode);
+                       ioc->name, log_info, originator_desc,
+                       sas_loginfo.dw.code, sas_loginfo.dw.subcode);
 }
 
+#ifdef MPT_DEBUG_REPLY
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
- *     mpt_sp_ioc_info - IOC information returned from SCSI Parallel IOC.
+ *     mpt_iocstatus_info_config - IOCSTATUS information for config pages
+ *     @ioc: Pointer to MPT_ADAPTER structure
+ *     ioc_status: U32 IOCStatus word from IOC
+ *     @mf: Pointer to MPT request frame
+ *
+ *     Refer to lsi/mpi.h.
+ **/
+static void
+mpt_iocstatus_info_config(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
+{
+       Config_t *pReq = (Config_t *)mf;
+       char extend_desc[EVENT_DESCR_STR_SZ];
+       char *desc = NULL;
+       u32 form;
+       u8 page_type;
+
+       if (pReq->Header.PageType == MPI_CONFIG_PAGETYPE_EXTENDED)
+               page_type = pReq->ExtPageType;
+       else
+               page_type = pReq->Header.PageType;
+
+       /*
+        * ignore invalid page messages for GET_NEXT_HANDLE
+        */
+       form = le32_to_cpu(pReq->PageAddress);
+       if (ioc_status == MPI_IOCSTATUS_CONFIG_INVALID_PAGE) {
+               if (page_type == MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE ||
+                   page_type == MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER ||
+                   page_type == MPI_CONFIG_EXTPAGETYPE_ENCLOSURE) {
+                       if ((form >> MPI_SAS_DEVICE_PGAD_FORM_SHIFT) ==
+                               MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE)
+                               return;
+               }
+               if (page_type == MPI_CONFIG_PAGETYPE_FC_DEVICE)
+                       if ((form & MPI_FC_DEVICE_PGAD_FORM_MASK) ==
+                               MPI_FC_DEVICE_PGAD_FORM_NEXT_DID)
+                               return;
+       }
+
+       snprintf(extend_desc, EVENT_DESCR_STR_SZ,
+           "type=%02Xh, page=%02Xh, action=%02Xh, form=%08Xh",
+           page_type, pReq->Header.PageNumber, pReq->Action, form);
+
+       switch (ioc_status) {
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_ACTION: /* 0x0020 */
+               desc = "Config Page Invalid Action";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_TYPE:   /* 0x0021 */
+               desc = "Config Page Invalid Type";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_PAGE:   /* 0x0022 */
+               desc = "Config Page Invalid Page";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_DATA:   /* 0x0023 */
+               desc = "Config Page Invalid Data";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_NO_DEFAULTS:    /* 0x0024 */
+               desc = "Config Page No Defaults";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_CANT_COMMIT:    /* 0x0025 */
+               desc = "Config Page Can't Commit";
+               break;
+       }
+
+       if (!desc)
+               return;
+
+       printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s: %s\n",
+           ioc->name, ioc_status, desc, extend_desc);
+}
+
+/**
+ *     mpt_iocstatus_info - IOCSTATUS information returned from IOC.
  *     @ioc: Pointer to MPT_ADAPTER structure
  *     @ioc_status: U32 IOCStatus word from IOC
  *     @mf: Pointer to MPT request frame
  *
  *     Refer to lsi/mpi.h.
- */
+ **/
 static void
-mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
+mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
 {
        u32 status = ioc_status & MPI_IOCSTATUS_MASK;
        char *desc = NULL;
 
        switch (status) {
+
+/****************************************************************************/
+/*  Common IOCStatus values for all replies                                 */
+/****************************************************************************/
+
        case MPI_IOCSTATUS_INVALID_FUNCTION: /* 0x0001 */
                desc = "Invalid Function";
                break;
@@ -6337,84 +6790,180 @@ mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
                desc = "Invalid State";
                break;
 
+/****************************************************************************/
+/*  Config IOCStatus values                                                 */
+/****************************************************************************/
+
        case MPI_IOCSTATUS_CONFIG_INVALID_ACTION: /* 0x0020 */
        case MPI_IOCSTATUS_CONFIG_INVALID_TYPE:   /* 0x0021 */
        case MPI_IOCSTATUS_CONFIG_INVALID_PAGE:   /* 0x0022 */
        case MPI_IOCSTATUS_CONFIG_INVALID_DATA:   /* 0x0023 */
        case MPI_IOCSTATUS_CONFIG_NO_DEFAULTS:    /* 0x0024 */
        case MPI_IOCSTATUS_CONFIG_CANT_COMMIT:    /* 0x0025 */
-               /* No message for Config IOCStatus values */
+               mpt_iocstatus_info_config(ioc, status, mf);
                break;
 
+/****************************************************************************/
+/*  SCSIIO Reply (SPI, FCP, SAS) initiator values                           */
+/*                                                                          */
+/*  Look at mptscsih_iocstatus_info_scsiio in mptscsih.c */
+/*                                                                          */
+/****************************************************************************/
+
        case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR: /* 0x0040 */
-               /* No message for recovered error
-               desc = "SCSI Recovered Error";
-               */
+       case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN: /* 0x0045 */
+       case MPI_IOCSTATUS_SCSI_INVALID_BUS: /* 0x0041 */
+       case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: /* 0x0042 */
+       case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */
+       case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */
+       case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
+       case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */
+       case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
+       case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */
+       case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: /* 0x004A */
+       case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */
+       case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
                break;
 
-       case MPI_IOCSTATUS_SCSI_INVALID_BUS: /* 0x0041 */
-               desc = "SCSI Invalid Bus";
+/****************************************************************************/
+/*  SCSI Target values                                                      */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_TARGET_PRIORITY_IO: /* 0x0060 */
+               desc = "Target: Priority IO";
                break;
 
-       case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: /* 0x0042 */
-               desc = "SCSI Invalid TargetID";
+       case MPI_IOCSTATUS_TARGET_INVALID_PORT: /* 0x0061 */
+               desc = "Target: Invalid Port";
                break;
 
-       case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */
-         {
-               SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
-               U8 cdb = pScsiReq->CDB[0];
-               if (cdb != 0x12) { /* Inquiry is issued for device scanning */
-                       desc = "SCSI Device Not There";
-               }
+       case MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX: /* 0x0062 */
+               desc = "Target Invalid IO Index:";
                break;
-         }
 
-       case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */
-               desc = "SCSI Data Overrun";
+       case MPI_IOCSTATUS_TARGET_ABORTED: /* 0x0063 */
+               desc = "Target: Aborted";
                break;
 
-       case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN: /* 0x0045 */
-               /* This error is checked in scsi_io_done(). Skip.
-               desc = "SCSI Data Underrun";
-               */
+       case MPI_IOCSTATUS_TARGET_NO_CONN_RETRYABLE: /* 0x0064 */
+               desc = "Target: No Conn Retryable";
                break;
 
-       case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
-               desc = "SCSI I/O Data Error";
+       case MPI_IOCSTATUS_TARGET_NO_CONNECTION: /* 0x0065 */
+               desc = "Target: No Connection";
                break;
 
-       case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */
-               desc = "SCSI Protocol Error";
+       case MPI_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH: /* 0x006A */
+               desc = "Target: Transfer Count Mismatch";
                break;
 
-       case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
-               desc = "SCSI Task Terminated";
+       case MPI_IOCSTATUS_TARGET_STS_DATA_NOT_SENT: /* 0x006B */
+               desc = "Target: STS Data not Sent";
                break;
 
-       case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */
-               desc = "SCSI Residual Mismatch";
+       case MPI_IOCSTATUS_TARGET_DATA_OFFSET_ERROR: /* 0x006D */
+               desc = "Target: Data Offset Error";
                break;
 
-       case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: /* 0x004A */
-               desc = "SCSI Task Management Failed";
+       case MPI_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA: /* 0x006E */
+               desc = "Target: Too Much Write Data";
                break;
 
-       case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */
-               desc = "SCSI IOC Terminated";
+       case MPI_IOCSTATUS_TARGET_IU_TOO_SHORT: /* 0x006F */
+               desc = "Target: IU Too Short";
                break;
 
-       case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
-               desc = "SCSI Ext Terminated";
+       case MPI_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT: /* 0x0070 */
+               desc = "Target: ACK NAK Timeout";
+               break;
+
+       case MPI_IOCSTATUS_TARGET_NAK_RECEIVED: /* 0x0071 */
+               desc = "Target: Nak Received";
+               break;
+
+/****************************************************************************/
+/*  Fibre Channel Direct Access values                                      */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_FC_ABORTED: /* 0x0066 */
+               desc = "FC: Aborted";
+               break;
+
+       case MPI_IOCSTATUS_FC_RX_ID_INVALID: /* 0x0067 */
+               desc = "FC: RX ID Invalid";
+               break;
+
+       case MPI_IOCSTATUS_FC_DID_INVALID: /* 0x0068 */
+               desc = "FC: DID Invalid";
+               break;
+
+       case MPI_IOCSTATUS_FC_NODE_LOGGED_OUT: /* 0x0069 */
+               desc = "FC: Node Logged Out";
+               break;
+
+       case MPI_IOCSTATUS_FC_EXCHANGE_CANCELED: /* 0x006C */
+               desc = "FC: Exchange Canceled";
+               break;
+
+/****************************************************************************/
+/*  LAN values                                                              */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_LAN_DEVICE_NOT_FOUND: /* 0x0080 */
+               desc = "LAN: Device not Found";
+               break;
+
+       case MPI_IOCSTATUS_LAN_DEVICE_FAILURE: /* 0x0081 */
+               desc = "LAN: Device Failure";
+               break;
+
+       case MPI_IOCSTATUS_LAN_TRANSMIT_ERROR: /* 0x0082 */
+               desc = "LAN: Transmit Error";
+               break;
+
+       case MPI_IOCSTATUS_LAN_TRANSMIT_ABORTED: /* 0x0083 */
+               desc = "LAN: Transmit Aborted";
+               break;
+
+       case MPI_IOCSTATUS_LAN_RECEIVE_ERROR: /* 0x0084 */
+               desc = "LAN: Receive Error";
+               break;
+
+       case MPI_IOCSTATUS_LAN_RECEIVE_ABORTED: /* 0x0085 */
+               desc = "LAN: Receive Aborted";
+               break;
+
+       case MPI_IOCSTATUS_LAN_PARTIAL_PACKET: /* 0x0086 */
+               desc = "LAN: Partial Packet";
+               break;
+
+       case MPI_IOCSTATUS_LAN_CANCELED: /* 0x0087 */
+               desc = "LAN: Canceled";
+               break;
+
+/****************************************************************************/
+/*  Serial Attached SCSI values                                             */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_SAS_SMP_REQUEST_FAILED: /* 0x0090 */
+               desc = "SAS: SMP Request Failed";
+               break;
+
+       case MPI_IOCSTATUS_SAS_SMP_DATA_OVERRUN: /* 0x0090 */
+               desc = "SAS: SMP Data Overrun";
                break;
 
        default:
                desc = "Others";
                break;
        }
-       if (desc != NULL)
-               printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04x): %s\n", ioc->name, status, desc);
+
+       if (!desc)
+               return;
+
+       printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s\n", ioc->name, status, desc);
 }
+#endif
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 EXPORT_SYMBOL(mpt_attach);
@@ -6449,6 +6998,7 @@ EXPORT_SYMBOL(mpt_findImVolumes);
 EXPORT_SYMBOL(mpt_alloc_fw_memory);
 EXPORT_SYMBOL(mpt_free_fw_memory);
 EXPORT_SYMBOL(mptbase_sas_persist_operation);
+EXPORT_SYMBOL(mpt_raid_phys_disk_pg0);
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**