On Tue, 15 Sep 2009, Wolfgang Denk wrote:

> Fix warning: ide.c:60: warning: dereferencing type-punned pointer will
> break strict-aliasing rules
> 
> Signed-off-by: Wolfgang Denk <w...@denx.de>
> Cc: Guennadi Liakhovetski <l...@denx.de>
> 
> ---
> v2: Better implementation as suggested by Scott Wood in
>     http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/67840/focus=67891
> 
>  board/linkstation/ide.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/board/linkstation/ide.c b/board/linkstation/ide.c
> index 2c89d62..568fdf5 100644
> --- a/board/linkstation/ide.c
> +++ b/board/linkstation/ide.c
> @@ -54,11 +54,13 @@ int ide_preinit (void)
>       if (devbusfn == -1)
>               devbusfn = 
> pci_find_device(PCI_VENDOR_ID_ITE,PCI_DEVICE_ID_ITE_8212,0);
>       if (devbusfn != -1) {
> +             u32 ide_bus_offset32;
> +
>               status = 0;
>  
>               pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_0,
> -                                                        (u32 *) 
> &ide_bus_offset[0]);
> -             ide_bus_offset[0] &= 0xfffffffe;
> +                                                        &ide_bus_offset32);
> +             ide_bus_offset[0] = ide_bus_offset32 & 0xfffffffe;
>               ide_bus_offset[0] = pci_hose_bus_to_phys(&hose,
>                                                        ide_bus_offset[0] & 
> 0xfffffffe,
>                                                        PCI_REGION_IO);

Ok, yes, this looks much better now without casts, but - the double " & 
0xfffffffe" above seems completely redundant to me. I understand, that 
that's not the problem you're fixing with this patch, and I will perfectly 
understand if you refuse to mix these two fixes, but... Another thing - 
why doesn't the compiler complain about exactly identical cast (ok, 
almost) a couple of lines down for ide_bus_offset[1]? So, how about this 
diff instead (only compile-tested) (not for submission yet, so, no Sob's, 
no patch header):

diff --git a/board/linkstation/ide.c b/board/linkstation/ide.c
index 2c89d62..f96af74 100644
--- a/board/linkstation/ide.c
+++ b/board/linkstation/ide.c
@@ -54,20 +54,23 @@ int ide_preinit (void)
        if (devbusfn == -1)
                devbusfn = 
pci_find_device(PCI_VENDOR_ID_ITE,PCI_DEVICE_ID_ITE_8212,0);
        if (devbusfn != -1) {
+               u32 ide_bus_offset32;
+
                status = 0;
 
-               pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_0,
-                                                          (u32 *) 
&ide_bus_offset[0]);
-               ide_bus_offset[0] &= 0xfffffffe;
+               pci_read_config_dword(devbusfn, PCI_BASE_ADDRESS_0,
+                                     &ide_bus_offset32);
+               ide_bus_offset[0] = ide_bus_offset32 & 0xfffffffe;
                ide_bus_offset[0] = pci_hose_bus_to_phys(&hose,
-                                                        ide_bus_offset[0] & 
0xfffffffe,
-                                                        PCI_REGION_IO);
-               pci_read_config_dword(devbusfn, PCI_BASE_ADDRESS_2,
-                                     (u32 *) &ide_bus_offset[1]);
-               ide_bus_offset[1] &= 0xfffffffe;
-               ide_bus_offset[1] = pci_hose_bus_to_phys(&hose,
-                                                        ide_bus_offset[1] & 
0xfffffffe,
-                                                        PCI_REGION_IO);
+                                       ide_bus_offset[0], PCI_REGION_IO);
+
+               if (CONFIG_SYS_IDE_MAXBUS > 1) {
+                       pci_read_config_dword(devbusfn, PCI_BASE_ADDRESS_2,
+                                             &ide_bus_offset32);
+                       ide_bus_offset[1] = ide_bus_offset32 & 0xfffffffe;
+                       ide_bus_offset[1] = pci_hose_bus_to_phys(&hose,
+                                       ide_bus_offset[1], PCI_REGION_IO);
+               }
        }
 
        if (pci_find_device (PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8212, 0) != 
-1) {

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to