OSDN Git Service

can: ti_hecc: fix endianness related sparse warning
authorMarc Kleine-Budde <mkl@pengutronix.de>
Sat, 11 Jan 2014 18:11:24 +0000 (19:11 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sat, 11 Jan 2014 18:43:26 +0000 (19:43 +0100)
This patch fixes the following sparse warning, which occurs in casts when
accessing the data in the CAN frames (struct can_frame) in the RX and TX
routines:

drivers/net/can/ti_hecc.c:521:17: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:521:17: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:521:17: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:521:17: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:521:17: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:521:17: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:524:25: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:524:25: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:524:25: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:524:25: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:524:25: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:524:25: warning: cast to restricted __be32
drivers/net/can/ti_hecc.c:572:28: warning: incorrect type in assignment (different base types)
drivers/net/can/ti_hecc.c:572:28:    expected unsigned int [unsigned] [usertype] <noident>
drivers/net/can/ti_hecc.c:572:28:    got restricted __be32 [usertype] <noident>
drivers/net/can/ti_hecc.c:575:40: warning: incorrect type in assignment (different base types)
drivers/net/can/ti_hecc.c:575:40:    expected unsigned int [unsigned] [usertype] <noident>
drivers/net/can/ti_hecc.c:575:40:    got restricted __be32 [usertype] <noident>

As the data is indeed big endian, use "__be32" instead of "u32", when casting
it.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/ti_hecc.c

index 60d95b4..3e2bd9d 100644 (file)
@@ -518,10 +518,10 @@ static netdev_tx_t ti_hecc_xmit(struct sk_buff *skb, struct net_device *ndev)
                data = (cf->can_id & CAN_SFF_MASK) << 18;
        hecc_write_mbx(priv, mbxno, HECC_CANMID, data);
        hecc_write_mbx(priv, mbxno, HECC_CANMDL,
-               be32_to_cpu(*(u32 *)(cf->data)));
+               be32_to_cpu(*(__be32 *)(cf->data)));
        if (cf->can_dlc > 4)
                hecc_write_mbx(priv, mbxno, HECC_CANMDH,
-                       be32_to_cpu(*(u32 *)(cf->data + 4)));
+                       be32_to_cpu(*(__be32 *)(cf->data + 4)));
        else
                *(u32 *)(cf->data + 4) = 0;
        can_put_echo_skb(skb, ndev, mbxno);
@@ -569,12 +569,10 @@ static int ti_hecc_rx_pkt(struct ti_hecc_priv *priv, int mbxno)
                cf->can_id |= CAN_RTR_FLAG;
        cf->can_dlc = get_can_dlc(data & 0xF);
        data = hecc_read_mbx(priv, mbxno, HECC_CANMDL);
-       *(u32 *)(cf->data) = cpu_to_be32(data);
+       *(__be32 *)(cf->data) = cpu_to_be32(data);
        if (cf->can_dlc > 4) {
                data = hecc_read_mbx(priv, mbxno, HECC_CANMDH);
-               *(u32 *)(cf->data + 4) = cpu_to_be32(data);
-       } else {
-               *(u32 *)(cf->data + 4) = 0;
+               *(__be32 *)(cf->data + 4) = cpu_to_be32(data);
        }
        spin_lock_irqsave(&priv->mbx_lock, flags);
        hecc_clear_bit(priv, HECC_CANME, mbx_mask);