On 11/18/2009 06:15 PM, Larry Finger wrote:
> On 11/18/2009 08:34 AM, Oncaphillis wrote:
>
>> The first ioread16 actually succeeds, only the second one fails.
>> My lspci -vnn tells me that the memory is:
>>
>> Memory at 57100000 (64-bit, non-prefetchable) [size=16K]
>>
>> Could it be that one has to make a ioread32 here since the
>> memory is 64-bit ? I remember very very remotely that
>> in older days it was impossible or even forbidden to read
>> data from addresses which are not a multiple of 2/4/8 what
>> so ever. But that was pre-PCI.
>>
> As long as a 16-bit read is aligned on an even address, it should be OK;
> however, to check completely, please try this patch:
>
> Index: wireless-testing/drivers/ssb/pci.c
> ===================================================================
> --- wireless-testing.orig/drivers/ssb/pci.c
> +++ wireless-testing/drivers/ssb/pci.c
> @@ -251,10 +251,16 @@ static int sprom_check_crc(const u16 *sp
> static int sprom_do_read(struct ssb_bus *bus, u16 *sprom)
> {
> int i;
> + u32 buf;
>
> - for (i = 0; i< bus->sprom_size; i++)
> - sprom[i] = ioread16(bus->mmio + SSB_SPROM_BASE + (i * 2));
> -
> + printk(KERN_INFO "ssb: Entering %s\n", __func__);
> + for (i = 0; i< bus->sprom_size; i = i + 2) {
> + buf = ioread32(bus->mmio + SSB_SPROM_BASE + (i * 2));
> + printk(KERN_INFO "ssb: Read 0x%.8X from SPROM\n", buf);
> + sprom[i] = buf& 0x0000FFFF;
> + sprom[i+1] = (buf>> 16)& 0x0000FFFF;
> + }
> + printk(KERN_INFO "ssb: Leaving %s\n", __func__);
> return 0;
> }
>
>
>
I already tried something similar. Unfortunately I can not report in detail
right now since I've once again killed my kernel and my acer stands at
home.
I'll give more details in a couple of hours -- but the punch line is:
(1) if I transform the series of ioread16 into a series of ioread32
the loop
runs through giving me a CRC error afterwards.
(2) I tried to compensate for different endianess by doing this:
u32 *my_buff = (u32 *)spromm;
u32 dw;
for (i = 0; i< bus->sprom_size/2; i = i++) {
dw = ioread32(bus->mmio + SSB_SPROM_BASE + (i * 4));
my_buff[i] = (dw<< 16) | (dw>> 16);
}
Is there something fishy in that approach ? I'm really not a
hardware hacker. Still get a CRC error.
(3) My next approach was to do a initial ioread16 on the index 0. And
do the given loop afterwards including an output of read double words.
But it seems under these conditions the ioread32 fails too, since I
can't reach my laptop anymore.
Sebastian
> Larry
>
>
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev