[atl1e] Fix compilation on gcc-4.4.1-2.fc11.i586.
authorJoshua Oreman <oremanj@rwcr.net>
Fri, 23 Oct 2009 15:04:38 +0000 (17:04 +0200)
committerMichael Brown <mcb30@etherboot.org>
Sat, 24 Oct 2009 18:10:15 +0000 (19:10 +0100)
Error message was:

[BUILD] bin/atl1e.oncc1: warnings being treated as errors
drivers/net/atl1e.c: In function 'atl1e_get_permanent_address':
drivers/net/atl1e.c:1326: error: dereferencing type-punned pointer will break strict-aliasing rules
make: *** [bin/atl1e.o] Error 1

Reported-by: Giandomenico De Tullio <ghisha@email.it>
Signed-off-by: Michael Brown <mcb30@etherboot.org>
Modified-by: Michael Brown <mcb30@etherboot.org>
src/drivers/net/atl1e.c

index 664eba0..6c0b050 100644 (file)
@@ -1296,14 +1296,14 @@ void atl1e_hw_set_mac_addr(struct atl1e_hw *hw)
  */
 static int atl1e_get_permanent_address(struct atl1e_hw *hw)
 {
-       u32 addr[2];
+       union {
+               u32 dword[2];
+               u8 byte[8];
+       } hw_addr;
        u32 i;
        u32 twsi_ctrl_data;
        u8  eth_addr[ETH_ALEN];
 
-       /* init */
-       addr[0] = addr[1] = 0;
-
        if (!atl1e_check_eeprom_exist(hw)) {
                /* eeprom exist */
                twsi_ctrl_data = AT_READ_REG(hw, REG_TWSI_CTRL);
@@ -1320,10 +1320,11 @@ static int atl1e_get_permanent_address(struct atl1e_hw *hw)
        }
 
        /* maybe MAC-address is from BIOS */
-       addr[0] = AT_READ_REG(hw, REG_MAC_STA_ADDR);
-       addr[1] = AT_READ_REG(hw, REG_MAC_STA_ADDR + 4);
-       *(u32 *) &eth_addr[2] = swap32(addr[0]);
-       *(u16 *) &eth_addr[0] = swap16(*(u16 *)&addr[1]);
+       hw_addr.dword[0] = AT_READ_REG(hw, REG_MAC_STA_ADDR);
+       hw_addr.dword[1] = AT_READ_REG(hw, REG_MAC_STA_ADDR + 4);
+       for (i = 0; i < ETH_ALEN; i++) {
+               eth_addr[ETH_ALEN - i - 1] = hw_addr.byte[i];
+       }
 
        memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
        return 0;