Re: [PATCH] mpt3sas: Fix for regression caused due to cf6bf9710c patch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Any suggestion/update over my previous mail. I am using 4.13 kernel.

Thanks,
Sreekanth

On Sat, Jun 30, 2018 at 12:34 AM, Sreekanth Reddy
<sreekanth.reddy@xxxxxxxxxxxx> wrote:
> Hi All,
>
> Here is the issue which we are observing when driver don't use
> le16_to_cpu() in below code snippet on Sparc64 machine when driver is
> reading 2 bytes of data which is posted by HBA firmware,
>
>         u32 reply1;
>         reply1 = readl(&ioc->chip->Doorbell);
>         reply[1] = (reply1 & MPI2_DOORBELL_DATA_MASK);
>
>         printk("LSI debug.. 0x%x, 0x%x, 0x%x \n", reply1, reply[1]);
>         writel(0, &ioc->chip->HostInterruptStatus);
>
>         printk("LSI MsgLength :%d\n", default_reply->MsgLength);
>
> When I execute above code I got below output on Sparc64 machine,
>
> LSI debug.. 0x1c000311, 0x311
> LSI MsgLength :3
>
> When I execute same code in x86 machine then I got below output,
>
> LSI debug.. 0x1c000311, 0x311
> LSI MsgLength :17
>
> Correct message (Here I am referring IOCFacts message) Length is 17
> words. But on Sparc64 machine we got message length as 3 words which
> is wrong.
>
> Here is data structure of default reply message,
>
> typedef struct _MPI2_DEFAULT_REPLY {
>         U16 FunctionDependent1; /*0x00 */
>         U8 MsgLength;           /*0x02 */
>         U8 Function;            /*0x03 */
>         U16 FunctionDependent2; /*0x04 */
>         U8 FunctionDependent3;  /*0x06 */
>         U8 MsgFlags;            /*0x07 */
>         U8 VP_ID;               /*0x08 */
>         U8 VF_ID;               /*0x09 */
>         U16 Reserved1;          /*0x0A */
>         U16 FunctionDependent5; /*0x0C */
>         U16 IOCStatus;          /*0x0E */
>         U32 IOCLogInfo;         /*0x10 */
> } MPI2_DEFAULT_REPLY, *PTR_MPI2_DEFAULT_REPLY,
>         MPI2DefaultReply_t, *pMPI2DefaultReply_t;
>
> Until host reads correct number of reply words, IOC won't clear
> Doorbel Used bit and hence we see below error message while loading
> the driver and IOC initialization fails.
>
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: _base_get_ioc_facts
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: _base_wait_for_iocstate
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: doorbell is in use (line=5241)
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: _base_get_ioc_facts:
> handshake failed (r=-14)
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: mpt3sas_base_free_resources
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: _base_make_ioc_ready
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: mpt3sas_base_unmap_resources
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: _base_release_memory_pools
> Jun 28 02:21:57 localhost kernel: mpt4sas_cm0: failure at
> /home/chaitra/mpt3sas_with_sparse_patch/mpt3sas_scsih.c:10776/_scsih_probe()
>
>
> Thanks,
> Sreekanth
>
> On Sat, Jun 30, 2018 at 12:06 AM, Andy Shevchenko
> <andy.shevchenko@xxxxxxxxx> wrote:
>> On Fri, Jun 29, 2018 at 7:06 PM, James Bottomley
>> <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> wrote:
>>> On Fri, 2018-06-29 at 10:58 -0400, Chaitra P B wrote:
>>>>  "scsi: mpt3sas: Bug fix for big endian systems"
>>>>
>>>> Above patch with commit id "cf6bf9710cabba1fe94a4349f4eb8db623c77ebc"
>>>> was posted to fix sparse warnings. While posting this patch it was
>>>> assumed that readl() & writel() APIs internally calls le32_to_cpu() &
>>>> cpu_to_le32() APIs respectively. Looks like it is not true for all
>>>> architecture
>>>
>>> Just a minute, it damn well should be.  The definition of readl/writel
>>> is barriers and little endian (you can see this in asm-generic/io.h).
>>>
>>> Which architecture is getting this wrong?  Because it sounds like
>>> that's what we need to fix rather than doing something like this in all
>>> drivers.
>>>
>>> Sparc (and parisc) definitely do the little endian thing, so if this
>>> code is what it takes to get them working again, it looks like you're
>>> double swapping somewhere.  I really think cf6bf9710c needs to be
>>> reverted and you should look again at your sparse warnings.  Since the
>>> driver is using the non-raw readX/writeX it should be cpu endian
>>> internally which cf6bf9710c upsets.
>>
>> And we definitely won't see the constructions like
>> writeq(cpu_to_le64()) in the code, because it's weird.
>> If I get it correctly it's equivalent to __raw_writeq().
>>
>> --
>> With Best Regards,
>> Andy Shevchenko



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux