ar7: add 3.3 support
[openwrt.git] / target / linux / ar7 / patches-3.3 / 973-cpmac_handle_mvswitch.patch
1 --- a/drivers/net/ethernet/ti/cpmac.c
2 +++ b/drivers/net/ethernet/ti/cpmac.c
3 @@ -373,6 +373,7 @@ static struct sk_buff *cpmac_rx_one(stru
4                                     struct cpmac_desc *desc)
5  {
6         struct sk_buff *skb, *result = NULL;
7 +       int offset;
8  
9         if (unlikely(netif_msg_hw(priv)))
10                 cpmac_dump_desc(priv->dev, desc);
11 @@ -384,10 +385,15 @@ static struct sk_buff *cpmac_rx_one(stru
12                 return NULL;
13         }
14  
15 -       skb = netdev_alloc_skb_ip_align(priv->dev, CPMAC_SKB_SIZE);
16 +       skb = netdev_alloc_skb(priv->dev, CPMAC_SKB_SIZE);
17         if (likely(skb)) {
18 +               offset = 2;
19 +               if (priv->phy) {
20 +                       offset += priv->phy->pkt_align;
21 +               }
22 +               skb_reserve(skb, offset);
23 +
24                 skb_put(desc->skb, desc->datalen);
25 -               desc->skb->protocol = eth_type_trans(desc->skb, priv->dev);
26                 skb_checksum_none_assert(desc->skb);
27                 priv->dev->stats.rx_packets++;
28                 priv->dev->stats.rx_bytes += desc->datalen;
29 @@ -459,7 +465,12 @@ static int cpmac_poll(struct napi_struct
30  
31                 skb = cpmac_rx_one(priv, desc);
32                 if (likely(skb)) {
33 -                       netif_receive_skb(skb);
34 +                       if (priv->phy->netif_receive_skb) {
35 +                               priv->phy->netif_receive_skb(skb);
36 +                       } else {
37 +                               skb->protocol = eth_type_trans(skb, priv->dev);
38 +                               netif_receive_skb(skb);
39 +                       }
40                         received++;
41                 }
42                 desc = desc->next;
43 @@ -952,7 +963,7 @@ static void cpmac_adjust_link(struct net
44  
45  static int cpmac_open(struct net_device *dev)
46  {
47 -       int i, size, res;
48 +       int i, size, res, offset;
49         struct cpmac_priv *priv = netdev_priv(dev);
50         struct resource *mem;
51         struct cpmac_desc *desc;
52 @@ -991,11 +1002,17 @@ static int cpmac_open(struct net_device
53  
54         priv->rx_head = &priv->desc_ring[CPMAC_QUEUES];
55         for (i = 0, desc = priv->rx_head; i < priv->ring_size; i++, desc++) {
56 -               skb = netdev_alloc_skb_ip_align(dev, CPMAC_SKB_SIZE);
57 +               skb = netdev_alloc_skb(dev, CPMAC_SKB_SIZE);
58                 if (unlikely(!skb)) {
59                         res = -ENOMEM;
60                         goto fail_desc;
61                 }
62 +               offset = 2;
63 +               if (priv->phy) {
64 +                       offset += priv->phy->pkt_align;
65 +               }
66 +               skb_reserve(skb, offset);
67 +
68                 desc->skb = skb;
69                 desc->data_mapping = dma_map_single(&dev->dev, skb->data,
70                                                     CPMAC_SKB_SIZE,