This is a note to let you know that I've just added the patch titled

    [SCSI] mpt2sas: Fixed Big Indian Issues on 32 bit PPC

to the 3.0-stable tree which can be found at:
    
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mpt2sas-fixed-big-indian-issues-on-32-bit-ppc.patch
and it can be found in the queue-3.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <sta...@kernel.org> know about it.


>From c97951ec46d4b076c2236b77db34eeed6dddb8eb Mon Sep 17 00:00:00 2001
From: "Kashyap, Desai" <kashyap.de...@lsi.com>
Date: Tue, 14 Jun 2011 10:54:56 +0530
Subject: [SCSI] mpt2sas: Fixed Big Indian Issues on 32 bit PPC

From: "Kashyap, Desai" <kashyap.de...@lsi.com>

commit c97951ec46d4b076c2236b77db34eeed6dddb8eb upstream.

This patch addresses many endian issues solved by runing sparse with the
option __CHECK_ENDIAN__ turned on.

Signed-off-by: Kashyap Desai <kashyap.de...@lsi.com>
Signed-off-by: James Bottomley <jbottom...@parallels.com>
Cc: David Miller <da...@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gre...@suse.de>

---
 drivers/scsi/mpt2sas/mpt2sas_base.c      |   65 +++++++++++--------------------
 drivers/scsi/mpt2sas/mpt2sas_base.h      |   53 +++++++++++++++++++++++--
 drivers/scsi/mpt2sas/mpt2sas_ctl.c       |   10 ++--
 drivers/scsi/mpt2sas/mpt2sas_debug.h     |    2 
 drivers/scsi/mpt2sas/mpt2sas_scsih.c     |   12 ++---
 drivers/scsi/mpt2sas/mpt2sas_transport.c |   24 ++++-------
 6 files changed, 96 insertions(+), 70 deletions(-)

--- a/drivers/scsi/mpt2sas/mpt2sas_base.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
@@ -94,7 +94,7 @@ module_param(diag_buffer_enable, int, 0)
 MODULE_PARM_DESC(diag_buffer_enable, " post diag buffers "
     "(TRACE=1/SNAPSHOT=2/EXTENDED=4/default=0)");
 
-int mpt2sas_fwfault_debug;
+static int mpt2sas_fwfault_debug;
 MODULE_PARM_DESC(mpt2sas_fwfault_debug, " enable detection of firmware fault "
     "and halt firmware - (default=0)");
 
@@ -857,7 +857,7 @@ _base_interrupt(int irq, void *bus_id)
        completed_cmds = 0;
        cb_idx = 0xFF;
        do {
-               rd.word = rpf->Words;
+               rd.word = le64_to_cpu(rpf->Words);
                if (rd.u.low == UINT_MAX || rd.u.high == UINT_MAX)
                        goto out;
                reply = 0;
@@ -906,7 +906,7 @@ _base_interrupt(int irq, void *bus_id)
 
  next:
 
-               rpf->Words = ULLONG_MAX;
+               rpf->Words = cpu_to_le64(ULLONG_MAX);
                ioc->reply_post_host_index = (ioc->reply_post_host_index ==
                    (ioc->reply_post_queue_depth - 1)) ? 0 :
                    ioc->reply_post_host_index + 1;
@@ -1817,7 +1817,9 @@ _base_display_ioc_capabilities(struct MP
        char desc[16];
        u8 revision;
        u32 iounit_pg1_flags;
+       u32 bios_version;
 
+       bios_version = le32_to_cpu(ioc->bios_pg3.BiosVersion);
        pci_read_config_byte(ioc->pdev, PCI_CLASS_REVISION, &revision);
        strncpy(desc, ioc->manu_pg0.ChipName, 16);
        printk(MPT2SAS_INFO_FMT "%s: FWVersion(%02d.%02d.%02d.%02d), "
@@ -1828,10 +1830,10 @@ _base_display_ioc_capabilities(struct MP
           (ioc->facts.FWVersion.Word & 0x0000FF00) >> 8,
           ioc->facts.FWVersion.Word & 0x000000FF,
           revision,
-          (ioc->bios_pg3.BiosVersion & 0xFF000000) >> 24,
-          (ioc->bios_pg3.BiosVersion & 0x00FF0000) >> 16,
-          (ioc->bios_pg3.BiosVersion & 0x0000FF00) >> 8,
-           ioc->bios_pg3.BiosVersion & 0x000000FF);
+          (bios_version & 0xFF000000) >> 24,
+          (bios_version & 0x00FF0000) >> 16,
+          (bios_version & 0x0000FF00) >> 8,
+           bios_version & 0x000000FF);
 
        _base_display_dell_branding(ioc);
        _base_display_intel_branding(ioc);
@@ -2150,7 +2152,7 @@ _base_release_memory_pools(struct MPT2SA
 static int
 _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc,  int sleep_flag)
 {
-       Mpi2IOCFactsReply_t *facts;
+       struct mpt2sas_facts *facts;
        u32 queue_size, queue_diff;
        u16 max_sge_elements;
        u16 num_of_reply_frames;
@@ -2783,7 +2785,7 @@ _base_handshake_req_reply_wait(struct MP
        int i;
        u8 failed;
        u16 dummy;
-       u32 *mfp;
+       __le32 *mfp;
 
        /* make sure doorbell is not in use */
        if ((readl(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
@@ -2871,7 +2873,7 @@ _base_handshake_req_reply_wait(struct MP
        writel(0, &ioc->chip->HostInterruptStatus);
 
        if (ioc->logging_level & MPT_DEBUG_INIT) {
-               mfp = (u32 *)reply;
+               mfp = (__le32 *)reply;
                printk(KERN_INFO "\toffset:data\n");
                for (i = 0; i < reply_bytes/4; i++)
                        printk(KERN_INFO "\t[0x%02x]:%08x\n", i*4,
@@ -3097,7 +3099,8 @@ static int
 _base_get_port_facts(struct MPT2SAS_ADAPTER *ioc, int port, int sleep_flag)
 {
        Mpi2PortFactsRequest_t mpi_request;
-       Mpi2PortFactsReply_t mpi_reply, *pfacts;
+       Mpi2PortFactsReply_t mpi_reply;
+       struct mpt2sas_port_facts *pfacts;
        int mpi_reply_sz, mpi_request_sz, r;
 
        dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
@@ -3139,7 +3142,8 @@ static int
 _base_get_ioc_facts(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
 {
        Mpi2IOCFactsRequest_t mpi_request;
-       Mpi2IOCFactsReply_t mpi_reply, *facts;
+       Mpi2IOCFactsReply_t mpi_reply;
+       struct mpt2sas_facts *facts;
        int mpi_reply_sz, mpi_request_sz, r;
 
        dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
@@ -3225,17 +3229,6 @@ _base_send_ioc_init(struct MPT2SAS_ADAPT
        mpi_request.MsgVersion = cpu_to_le16(MPI2_VERSION);
        mpi_request.HeaderVersion = cpu_to_le16(MPI2_HEADER_VERSION);
 
-       /* In MPI Revision I (0xA), the SystemReplyFrameSize(offset 0x18) was
-        * removed and made reserved.  For those with older firmware will need
-        * this fix. It was decided that the Reply and Request frame sizes are
-        * the same.
-        */
-       if ((ioc->facts.HeaderVersion >> 8) < 0xA) {
-               mpi_request.Reserved7 = cpu_to_le16(ioc->reply_sz);
-/*             mpi_request.SystemReplyFrameSize =
- *              cpu_to_le16(ioc->reply_sz);
- */
-       }
 
        mpi_request.SystemRequestFrameSize = cpu_to_le16(ioc->request_sz/4);
        mpi_request.ReplyDescriptorPostQueueDepth =
@@ -3243,25 +3236,17 @@ _base_send_ioc_init(struct MPT2SAS_ADAPT
        mpi_request.ReplyFreeQueueDepth =
            cpu_to_le16(ioc->reply_free_queue_depth);
 
-#if BITS_PER_LONG > 32
        mpi_request.SenseBufferAddressHigh =
-           cpu_to_le32(ioc->sense_dma >> 32);
+           cpu_to_le32((u64)ioc->sense_dma >> 32);
        mpi_request.SystemReplyAddressHigh =
-           cpu_to_le32(ioc->reply_dma >> 32);
+           cpu_to_le32((u64)ioc->reply_dma >> 32);
        mpi_request.SystemRequestFrameBaseAddress =
-           cpu_to_le64(ioc->request_dma);
+           cpu_to_le64((u64)ioc->request_dma);
        mpi_request.ReplyFreeQueueAddress =
-           cpu_to_le64(ioc->reply_free_dma);
+           cpu_to_le64((u64)ioc->reply_free_dma);
        mpi_request.ReplyDescriptorPostQueueAddress =
-           cpu_to_le64(ioc->reply_post_free_dma);
-#else
-       mpi_request.SystemRequestFrameBaseAddress =
-           cpu_to_le32(ioc->request_dma);
-       mpi_request.ReplyFreeQueueAddress =
-           cpu_to_le32(ioc->reply_free_dma);
-       mpi_request.ReplyDescriptorPostQueueAddress =
-           cpu_to_le32(ioc->reply_post_free_dma);
-#endif
+           cpu_to_le64((u64)ioc->reply_post_free_dma);
+
 
        /* This time stamp specifies number of milliseconds
         * since epoch ~ midnight January 1, 1970.
@@ -3271,10 +3256,10 @@ _base_send_ioc_init(struct MPT2SAS_ADAPT
            (current_time.tv_usec / 1000));
 
        if (ioc->logging_level & MPT_DEBUG_INIT) {
-               u32 *mfp;
+               __le32 *mfp;
                int i;
 
-               mfp = (u32 *)&mpi_request;
+               mfp = (__le32 *)&mpi_request;
                printk(KERN_INFO "\toffset:data\n");
                for (i = 0; i < sizeof(Mpi2IOCInitRequest_t)/4; i++)
                        printk(KERN_INFO "\t[0x%02x]:%08x\n", i*4,
@@ -3759,7 +3744,7 @@ _base_make_ioc_operational(struct MPT2SA
 
        /* initialize Reply Post Free Queue */
        for (i = 0; i < ioc->reply_post_queue_depth; i++)
-               ioc->reply_post_free[i].Words = ULLONG_MAX;
+               ioc->reply_post_free[i].Words = cpu_to_le64(ULLONG_MAX);
 
        r = _base_send_ioc_init(ioc, sleep_flag);
        if (r)
--- a/drivers/scsi/mpt2sas/mpt2sas_base.h
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.h
@@ -541,6 +541,53 @@ struct _tr_list {
 
 typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t 
dma_addr);
 
+/* IOC Facts and Port Facts converted from little endian to cpu */
+union mpi2_version_union {
+       MPI2_VERSION_STRUCT             Struct;
+       u32                             Word;
+};
+
+struct mpt2sas_facts {
+       u16                     MsgVersion;
+       u16                     HeaderVersion;
+       u8                      IOCNumber;
+       u8                      VP_ID;
+       u8                      VF_ID;
+       u16                     IOCExceptions;
+       u16                     IOCStatus;
+       u32                     IOCLogInfo;
+       u8                      MaxChainDepth;
+       u8                      WhoInit;
+       u8                      NumberOfPorts;
+       u8                      MaxMSIxVectors;
+       u16                     RequestCredit;
+       u16                     ProductID;
+       u32                     IOCCapabilities;
+       union mpi2_version_union        FWVersion;
+       u16                     IOCRequestFrameSize;
+       u16                     Reserved3;
+       u16                     MaxInitiators;
+       u16                     MaxTargets;
+       u16                     MaxSasExpanders;
+       u16                     MaxEnclosures;
+       u16                     ProtocolFlags;
+       u16                     HighPriorityCredit;
+       u16                     MaxReplyDescriptorPostQueueDepth;
+       u8                      ReplyFrameSize;
+       u8                      MaxVolumes;
+       u16                     MaxDevHandle;
+       u16                     MaxPersistentEntries;
+       u16                     MinDevHandle;
+};
+
+struct mpt2sas_port_facts {
+       u8                      PortNumber;
+       u8                      VP_ID;
+       u8                      VF_ID;
+       u8                      PortType;
+       u16                     MaxPostedCmdBuffers;
+};
+
 /**
  * struct MPT2SAS_ADAPTER - per adapter struct
  * @list: ioc_list
@@ -749,8 +796,8 @@ struct MPT2SAS_ADAPTER {
        u32             event_masks[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
 
        /* static config pages */
-       Mpi2IOCFactsReply_t facts;
-       Mpi2PortFactsReply_t *pfacts;
+       struct mpt2sas_facts facts;
+       struct mpt2sas_port_facts *pfacts;
        Mpi2ManufacturingPage0_t manu_pg0;
        Mpi2BiosPage2_t bios_pg2;
        Mpi2BiosPage3_t bios_pg3;
@@ -840,7 +887,7 @@ struct MPT2SAS_ADAPTER {
 
        /* reply free queue */
        u16             reply_free_queue_depth;
-       u32             *reply_free;
+       __le32          *reply_free;
        dma_addr_t      reply_free_dma;
        struct dma_pool *reply_free_dma_pool;
        u32             reply_free_host_index;
--- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c
@@ -2706,13 +2706,13 @@ static DEVICE_ATTR(ioc_reset_count, S_IR
     _ctl_ioc_reset_count_show, NULL);
 
 struct DIAG_BUFFER_START {
-       u32 Size;
-       u32 DiagVersion;
+       __le32 Size;
+       __le32 DiagVersion;
        u8 BufferType;
        u8 Reserved[3];
-       u32 Reserved1;
-       u32 Reserved2;
-       u32 Reserved3;
+       __le32 Reserved1;
+       __le32 Reserved2;
+       __le32 Reserved3;
 };
 /**
  * _ctl_host_trace_buffer_size_show - host buffer size (trace only)
--- a/drivers/scsi/mpt2sas/mpt2sas_debug.h
+++ b/drivers/scsi/mpt2sas/mpt2sas_debug.h
@@ -164,7 +164,7 @@ static inline void
 _debug_dump_mf(void *mpi_request, int sz)
 {
        int i;
-       u32 *mfp = (u32 *)mpi_request;
+       __le32 *mfp = (__le32 *)mpi_request;
 
        printk(KERN_INFO "mf:\n\t");
        for (i = 0; i < sz; i++) {
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -1956,7 +1956,7 @@ _scsih_slave_configure(struct scsi_devic
                case MPI2_RAID_VOL_TYPE_RAID1E:
                        qdepth = MPT2SAS_RAID_QUEUE_DEPTH;
                        if (ioc->manu_pg10.OEMIdentifier &&
-                           (ioc->manu_pg10.GenericFlags0 &
+                           (le32_to_cpu(ioc->manu_pg10.GenericFlags0) &
                            MFG10_GF0_R10_DISPLAY) &&
                            !(raid_device->num_pds % 2))
                                r_level = "RAID10";
@@ -4598,7 +4598,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPT
        Mpi2SasEnclosurePage0_t enclosure_pg0;
        u32 ioc_status;
        u16 parent_handle;
-       __le64 sas_address, sas_address_parent = 0;
+       u64 sas_address, sas_address_parent = 0;
        int i;
        unsigned long flags;
        struct _sas_port *mpt2sas_port = NULL;
@@ -5404,7 +5404,7 @@ _scsih_sas_device_status_change_event(st
 {
        struct MPT2SAS_TARGET *target_priv_data;
        struct _sas_device *sas_device;
-       __le64 sas_address;
+       u64 sas_address;
        unsigned long flags;
        Mpi2EventDataSasDeviceStatusChange_t *event_data =
            fw_event->event_data;
@@ -6566,7 +6566,7 @@ _scsih_search_responding_expanders(struc
        Mpi2ExpanderPage0_t expander_pg0;
        Mpi2ConfigReply_t mpi_reply;
        u16 ioc_status;
-       __le64 sas_address;
+       u64 sas_address;
        u16 handle;
 
        printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, __func__);
@@ -7505,7 +7505,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
        struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
-       u32 device_state;
+       pci_power_t device_state;
 
        mpt2sas_base_stop_watchdog(ioc);
        scsi_block_requests(shost);
@@ -7532,7 +7532,7 @@ _scsih_resume(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
        struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
-       u32 device_state = pdev->current_state;
+       pci_power_t device_state = pdev->current_state;
        int r;
 
        printk(MPT2SAS_INFO_FMT "pdev=0x%p, slot=%s, previous "
--- a/drivers/scsi/mpt2sas/mpt2sas_transport.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c
@@ -299,7 +299,6 @@ _transport_expander_report_manufacture(s
        void *data_out = NULL;
        dma_addr_t data_out_dma;
        u32 sz;
-       u64 *sas_address_le;
        u16 wait_state_count;
 
        if (ioc->shost_recovery || ioc->pci_error_recovery) {
@@ -372,8 +371,7 @@ _transport_expander_report_manufacture(s
        mpi_request->PhysicalPort = 0xFF;
        mpi_request->VF_ID = 0; /* TODO */
        mpi_request->VP_ID = 0;
-       sas_address_le = (u64 *)&mpi_request->SASAddress;
-       *sas_address_le = cpu_to_le64(sas_address);
+       mpi_request->SASAddress = cpu_to_le64(sas_address);
        mpi_request->RequestDataLength =
            cpu_to_le16(sizeof(struct rep_manu_request));
        psge = &mpi_request->SGL;
@@ -1049,14 +1047,14 @@ struct phy_error_log_reply{
        u8 function; /* 0x11 */
        u8 function_result;
        u8 response_length;
-       u16 expander_change_count;
+       __be16 expander_change_count;
        u8 reserved_1[3];
        u8 phy_identifier;
        u8 reserved_2[2];
-       u32 invalid_dword;
-       u32 running_disparity_error;
-       u32 loss_of_dword_sync;
-       u32 phy_reset_problem;
+       __be32 invalid_dword;
+       __be32 running_disparity_error;
+       __be32 loss_of_dword_sync;
+       __be32 phy_reset_problem;
 };
 
 /**
@@ -1085,7 +1083,6 @@ _transport_get_expander_phy_error_log(st
        void *data_out = NULL;
        dma_addr_t data_out_dma;
        u32 sz;
-       u64 *sas_address_le;
        u16 wait_state_count;
 
        if (ioc->shost_recovery || ioc->pci_error_recovery) {
@@ -1160,8 +1157,7 @@ _transport_get_expander_phy_error_log(st
        mpi_request->PhysicalPort = 0xFF;
        mpi_request->VF_ID = 0; /* TODO */
        mpi_request->VP_ID = 0;
-       sas_address_le = (u64 *)&mpi_request->SASAddress;
-       *sas_address_le = cpu_to_le64(phy->identify.sas_address);
+       mpi_request->SASAddress = cpu_to_le64(phy->identify.sas_address);
        mpi_request->RequestDataLength =
            cpu_to_le16(sizeof(struct phy_error_log_request));
        psge = &mpi_request->SGL;
@@ -1406,7 +1402,6 @@ _transport_expander_phy_control(struct M
        void *data_out = NULL;
        dma_addr_t data_out_dma;
        u32 sz;
-       u64 *sas_address_le;
        u16 wait_state_count;
 
        if (ioc->shost_recovery) {
@@ -1486,8 +1481,7 @@ _transport_expander_phy_control(struct M
        mpi_request->PhysicalPort = 0xFF;
        mpi_request->VF_ID = 0; /* TODO */
        mpi_request->VP_ID = 0;
-       sas_address_le = (u64 *)&mpi_request->SASAddress;
-       *sas_address_le = cpu_to_le64(phy->identify.sas_address);
+       mpi_request->SASAddress = cpu_to_le64(phy->identify.sas_address);
        mpi_request->RequestDataLength =
            cpu_to_le16(sizeof(struct phy_error_log_request));
        psge = &mpi_request->SGL;
@@ -1914,7 +1908,7 @@ _transport_smp_handler(struct Scsi_Host
        mpi_request->PhysicalPort = 0xFF;
        mpi_request->VF_ID = 0; /* TODO */
        mpi_request->VP_ID = 0;
-       *((u64 *)&mpi_request->SASAddress) = (rphy) ?
+       mpi_request->SASAddress = (rphy) ?
            cpu_to_le64(rphy->identify.sas_address) :
            cpu_to_le64(ioc->sas_hba.sas_address);
        mpi_request->RequestDataLength = cpu_to_le16(blk_rq_bytes(req) - 4);


Patches currently in stable-queue which might be from kashyap.de...@lsi.com are

queue-3.0/mpt2sas-fixed-big-indian-issues-on-32-bit-ppc.patch

_______________________________________________
stable mailing list
stable@linux.kernel.org
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to