mirror of https://github.com/hak5/openwrt.git
66 lines
1.7 KiB
Diff
66 lines
1.7 KiB
Diff
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,
|