| 1 | --- a/drivers/net/phy/phy_device.c |
| 2 | +++ b/drivers/net/phy/phy_device.c |
| 3 | @@ -149,6 +149,18 @@ int phy_scan_fixups(struct phy_device *p |
| 4 | } |
| 5 | EXPORT_SYMBOL(phy_scan_fixups); |
| 6 | |
| 7 | +static int generic_receive_skb(struct sk_buff *skb) |
| 8 | +{ |
| 9 | + skb->protocol = eth_type_trans(skb, skb->dev); |
| 10 | + return netif_receive_skb(skb); |
| 11 | +} |
| 12 | + |
| 13 | +static int generic_rx(struct sk_buff *skb) |
| 14 | +{ |
| 15 | + skb->protocol = eth_type_trans(skb, skb->dev); |
| 16 | + return netif_rx(skb); |
| 17 | +} |
| 18 | + |
| 19 | static struct phy_device* phy_device_create(struct mii_bus *bus, |
| 20 | int addr, int phy_id) |
| 21 | { |
| 22 | @@ -180,6 +192,8 @@ static struct phy_device* phy_device_cre |
| 23 | dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr); |
| 24 | |
| 25 | dev->state = PHY_DOWN; |
| 26 | + dev->netif_receive_skb = &generic_receive_skb; |
| 27 | + dev->netif_rx = &generic_rx; |
| 28 | |
| 29 | mutex_init(&dev->lock); |
| 30 | INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); |
| 31 | --- a/include/linux/phy.h |
| 32 | +++ b/include/linux/phy.h |
| 33 | @@ -334,6 +334,20 @@ struct phy_device { |
| 34 | void (*adjust_link)(struct net_device *dev); |
| 35 | |
| 36 | void (*adjust_state)(struct net_device *dev); |
| 37 | + |
| 38 | + /* |
| 39 | + * By default these point to the original functions |
| 40 | + * with the same name. adding them to the phy_device |
| 41 | + * allows the phy driver to override them for packet |
| 42 | + * mangling if the ethernet driver supports it |
| 43 | + * This is required to support some really horrible |
| 44 | + * switches such as the Marvell 88E6060 |
| 45 | + */ |
| 46 | + int (*netif_receive_skb)(struct sk_buff *skb); |
| 47 | + int (*netif_rx)(struct sk_buff *skb); |
| 48 | + |
| 49 | + /* alignment offset for packets */ |
| 50 | + int pkt_align; |
| 51 | }; |
| 52 | #define to_phy_device(d) container_of(d, struct phy_device, dev) |
| 53 | |
| 54 | --- a/include/linux/netdevice.h |
| 55 | +++ b/include/linux/netdevice.h |
| 56 | @@ -1158,6 +1158,7 @@ struct net_device { |
| 57 | void *ax25_ptr; /* AX.25 specific data */ |
| 58 | struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, |
| 59 | assign before registering */ |
| 60 | + void *phy_ptr; /* PHY device specific data */ |
| 61 | |
| 62 | /* |
| 63 | * Cache lines mostly used on receive path (including eth_type_trans()) |
| 64 | |