diff options
author | Florian Fainelli <florian@openwrt.org> | 2010-11-25 11:58:02 +0000 |
---|---|---|
committer | Florian Fainelli <florian@openwrt.org> | 2010-11-25 11:58:02 +0000 |
commit | 4f1f8daf3db38562ddcc985072e6afa92f3b6fc3 (patch) | |
tree | fa9e6a8f27b0ffd9c5c2d1e691c3906a3c26990a /target/linux/ar7/patches-2.6.32/973-cpmac_handle_mvswitch.c | |
parent | 59f852dc1a6b55b2dfc85e1ee8ae59d757310972 (diff) | |
download | master-187ad058-4f1f8daf3db38562ddcc985072e6afa92f3b6fc3.tar.gz master-187ad058-4f1f8daf3db38562ddcc985072e6afa92f3b6fc3.tar.bz2 master-187ad058-4f1f8daf3db38562ddcc985072e6afa92f3b6fc3.zip |
[ar7] handle mvswitch in cpmac, rework MII probing logic, patch from sn9 and Wipster
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@24140 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/ar7/patches-2.6.32/973-cpmac_handle_mvswitch.c')
-rw-r--r-- | target/linux/ar7/patches-2.6.32/973-cpmac_handle_mvswitch.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/target/linux/ar7/patches-2.6.32/973-cpmac_handle_mvswitch.c b/target/linux/ar7/patches-2.6.32/973-cpmac_handle_mvswitch.c new file mode 100644 index 0000000000..23c66aa5b6 --- /dev/null +++ b/target/linux/ar7/patches-2.6.32/973-cpmac_handle_mvswitch.c @@ -0,0 +1,65 @@ +Index: linux-2.6.32.25/drivers/net/cpmac.c +=================================================================== +--- linux-2.6.32.25.orig/drivers/net/cpmac.c 2010-11-24 12:16:56.067517245 -0800 ++++ linux-2.6.32.25/drivers/net/cpmac.c 2010-11-24 12:17:56.279985384 -0800 +@@ -387,6 +387,7 @@ + struct cpmac_desc *desc) + { + struct sk_buff *skb, *result = NULL; ++ int offset; + + if (unlikely(netif_msg_hw(priv))) + cpmac_dump_desc(priv->dev, desc); +@@ -400,9 +401,13 @@ + + skb = netdev_alloc_skb(priv->dev, CPMAC_SKB_SIZE); + if (likely(skb)) { +- skb_reserve(skb, 2); ++ offset = 2; ++ if (priv->phy) { ++ offset += priv->phy->pkt_align; ++ } ++ skb_reserve(skb, offset); ++ + skb_put(desc->skb, desc->datalen); +- desc->skb->protocol = eth_type_trans(desc->skb, priv->dev); + desc->skb->ip_summed = CHECKSUM_NONE; + priv->dev->stats.rx_packets++; + priv->dev->stats.rx_bytes += desc->datalen; +@@ -474,7 +479,12 @@ + + skb = cpmac_rx_one(priv, desc); + if (likely(skb)) { +- netif_receive_skb(skb); ++ if (priv->phy->netif_receive_skb) { ++ priv->phy->netif_receive_skb(skb); ++ } else { ++ skb->protocol = eth_type_trans(skb, priv->dev); ++ netif_receive_skb(skb); ++ } + received++; + } + desc = desc->next; +@@ -970,7 +980,7 @@ + + static int cpmac_open(struct net_device *dev) + { +- int i, size, res; ++ int i, size, res, offset; + struct cpmac_priv *priv = netdev_priv(dev); + struct resource *mem; + struct cpmac_desc *desc; +@@ -1014,7 +1024,12 @@ + res = -ENOMEM; + goto fail_desc; + } +- skb_reserve(skb, 2); ++ offset = 2; ++ if (priv->phy) { ++ offset += priv->phy->pkt_align; ++ } ++ skb_reserve(skb, offset); ++ + desc->skb = skb; + desc->data_mapping = dma_map_single(&dev->dev, skb->data, + CPMAC_SKB_SIZE, |