• Arnd Bergmann's avatar
    stmmac: avoid ipq806x constant overflow warning · 49e4a229
    Arnd Bergmann authored
    Building dwmac-ipq806x on a 64-bit architecture produces a harmless
    warning from gcc:
    
    stmmac/dwmac-ipq806x.c: In function 'ipq806x_gmac_probe':
    include/linux/bitops.h:6:19: warning: overflow in implicit constant conversion [-Woverflow]
      val = QSGMII_PHY_CDR_EN |
    stmmac/dwmac-ipq806x.c:333:8: note: in expansion of macro 'QSGMII_PHY_CDR_EN'
     #define QSGMII_PHY_CDR_EN   BIT(0)
     #define BIT(nr)   (1UL << (nr))
    
    This is a result of the type conversion rules in C, when we take the
    logical OR of multiple different types. In particular, we have
    and unsigned long
    
    	QSGMII_PHY_CDR_EN == BIT(0) == (1ul << 0) == 0x0000000000000001ul
    
    and a signed int
    
    	0xC << QSGMII_PHY_TX_DRV_AMP_OFFSET == 0xc0000000
    
    which together gives a signed long value
    
    	0xffffffffc0000001l
    
    and when this is passed into a function that takes an unsigned int type,
    gcc warns about the signed overflow and the loss of the upper 32-bits that
    are all ones.
    
    This patch adds 'ul' type modifiers to the literal numbers passed in
    here, so now the expression remains an 'unsigned long' with the upper
    bits all zero, and that avoids the signed overflow and the warning.
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Fixes: b1c17215 ("stmmac: add ipq806x glue layer")
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    49e4a229
dwmac-ipq806x.c 10.8 KB