1 Index: linux-2.6.25.4/drivers/net/phy/phy_device.c
2 ===================================================================
3 --- linux-2.6.25.4.orig/drivers/net/phy/phy_device.c
4 +++ linux-2.6.25.4/drivers/net/phy/phy_device.c
5 @@ -53,6 +53,18 @@ static void phy_device_release(struct de
6 phy_device_free(to_phy_device(dev));
9 +static int generic_receive_skb(struct sk_buff *skb)
11 + skb->protocol = eth_type_trans(skb, skb->dev);
12 + return netif_receive_skb(skb);
15 +static int generic_rx(struct sk_buff *skb)
17 + skb->protocol = eth_type_trans(skb, skb->dev);
18 + return netif_rx(skb);
21 struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
23 struct phy_device *dev;
24 @@ -78,6 +90,8 @@ struct phy_device* phy_device_create(str
27 dev->state = PHY_DOWN;
28 + dev->netif_receive_skb = &generic_receive_skb;
29 + dev->netif_rx = &generic_rx;
31 mutex_init(&dev->lock);
33 Index: linux-2.6.25.4/include/linux/phy.h
34 ===================================================================
35 --- linux-2.6.25.4.orig/include/linux/phy.h
36 +++ linux-2.6.25.4/include/linux/phy.h
37 @@ -295,6 +295,17 @@ struct phy_device {
38 void (*adjust_link)(struct net_device *dev);
40 void (*adjust_state)(struct net_device *dev);
43 + * By default these point to the original functions
44 + * with the same name. adding them to the phy_device
45 + * allows the phy driver to override them for packet
46 + * mangling if the ethernet driver supports it
47 + * This is required to support some really horrible
48 + * switches such as the Marvell 88E6060
50 + int (*netif_receive_skb)(struct sk_buff *skb);
51 + int (*netif_rx)(struct sk_buff *skb);
53 #define to_phy_device(d) container_of(d, struct phy_device, dev)
55 Index: linux-2.6.25.4/include/linux/netdevice.h
56 ===================================================================
57 --- linux-2.6.25.4.orig/include/linux/netdevice.h
58 +++ linux-2.6.25.4/include/linux/netdevice.h
59 @@ -595,6 +595,7 @@ struct net_device
60 void *ax25_ptr; /* AX.25 specific data */
61 struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
62 assign before registering */
63 + void *phy_ptr; /* PHY device specific data */
66 * Cache line mostly used on receive path (including eth_type_trans())