gianfar: Make FCB access endian safe
authorClaudiu Manoil <claudiu.manoil@freescale.com>
Fri, 13 Mar 2015 08:36:29 +0000 (10:36 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 15 Mar 2015 23:56:47 +0000 (19:56 -0400)
Use conversion macros to correctly access the BE
fields of the Rx and Tx Frame Control Block on LE CPUs.

Signed-off-by: Claudiu Manoil <claudiu.manoil@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/gianfar.c
drivers/net/ethernet/freescale/gianfar.h

index af063d89b75e46cd683aafa94849a1b0a4bcfc09..5d6883dd01efd1cd0367d9698ff91b30de71da2c 100644 (file)
@@ -2169,16 +2169,16 @@ static inline void gfar_tx_checksum(struct sk_buff *skb, struct txfcb *fcb,
         */
        if (ip_hdr(skb)->protocol == IPPROTO_UDP) {
                flags |= TXFCB_UDP;
-               fcb->phcs = udp_hdr(skb)->check;
+               fcb->phcs = (__force __be16)(udp_hdr(skb)->check);
        } else
-               fcb->phcs = tcp_hdr(skb)->check;
+               fcb->phcs = (__force __be16)(tcp_hdr(skb)->check);
 
        /* l3os is the distance between the start of the
         * frame (skb->data) and the start of the IP hdr.
         * l4os is the distance between the start of the
         * l3 hdr and the l4 hdr
         */
-       fcb->l3os = (u16)(skb_network_offset(skb) - fcb_length);
+       fcb->l3os = (u8)(skb_network_offset(skb) - fcb_length);
        fcb->l4os = skb_network_header_len(skb);
 
        fcb->flags = flags;
@@ -2187,7 +2187,7 @@ static inline void gfar_tx_checksum(struct sk_buff *skb, struct txfcb *fcb,
 void inline gfar_tx_vlan(struct sk_buff *skb, struct txfcb *fcb)
 {
        fcb->flags |= TXFCB_VLN;
-       fcb->vlctl = skb_vlan_tag_get(skb);
+       fcb->vlctl = cpu_to_be16(skb_vlan_tag_get(skb));
 }
 
 static inline struct txbd8 *skip_txbd(struct txbd8 *bdp, int stride,
@@ -2812,13 +2812,13 @@ static inline void gfar_rx_checksum(struct sk_buff *skb, struct rxfcb *fcb)
         * were verified, then we tell the kernel that no
         * checksumming is necessary.  Otherwise, it is [FIXME]
         */
-       if ((fcb->flags & RXFCB_CSUM_MASK) == (RXFCB_CIP | RXFCB_CTU))
+       if ((be16_to_cpu(fcb->flags) & RXFCB_CSUM_MASK) ==
+           (RXFCB_CIP | RXFCB_CTU))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
        else
                skb_checksum_none_assert(skb);
 }
 
-
 /* gfar_process_frame() -- handle one incoming packet if skb isn't NULL. */
 static void gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
                               int amount_pull, struct napi_struct *napi)
@@ -2860,8 +2860,9 @@ static void gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
         * RXFCB_VLN is pseudo randomly set.
         */
        if (dev->features & NETIF_F_HW_VLAN_CTAG_RX &&
-           fcb->flags & RXFCB_VLN)
-               __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), fcb->vlctl);
+           be16_to_cpu(fcb->flags) & RXFCB_VLN)
+               __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
+                                      be16_to_cpu(fcb->vlctl));
 
        /* Send the packet up the stack */
        napi_gro_receive(napi, skb);
index f792c7952f323d7aa826ee4edc0b7b48ee21f70c..daa1d37de6427b93a756843074c5d2e5c1961467 100644 (file)
@@ -557,8 +557,8 @@ struct txfcb {
        u8      ptp;    /* Flag to enable tx timestamping */
        u8      l4os;   /* Level 4 Header Offset */
        u8      l3os;   /* Level 3 Header Offset */
-       u16     phcs;   /* Pseudo-header Checksum */
-       u16     vlctl;  /* VLAN control word */
+       __be16  phcs;   /* Pseudo-header Checksum */
+       __be16  vlctl;  /* VLAN control word */
 };
 
 struct rxbd8
@@ -574,11 +574,11 @@ struct rxbd8
 };
 
 struct rxfcb {
-       u16     flags;
+       __be16  flags;
        u8      rq;     /* Receive Queue index */
        u8      pro;    /* Layer 4 Protocol */
        u16     reserved;
-       u16     vlctl;  /* VLAN control word */
+       __be16  vlctl;  /* VLAN control word */
 };
 
 struct gianfar_skb_cb {