Hello, everyone. I recently updated the embedded computers we use to a 3.16 kernel. I first applied the patch from Henry Bausely (http://comments.gmane.org/gmane.network.etherlab.devel/345) for kernel 3.8.13, but that left a little work to do. I’m no expert on Linux drivers, so I made notes of my changes instead of creating a patch in hopes someone might catch any errors I made. Other than that, if you need to run the e1000e driver on a 3.16 kernel, 15 minutes with a text editor should get you going.
When configuring, use the flags: --enable-e1000e --with-e1000e-kernel=3.8 These changes will break the driver for kernels older than 3.16. First, apply Mr. Bausley's patch, downloading it from the link above. It downloads as a .bin file; I simply renamed it. # cd ethercat-1.5.2 # patch -p1 < /path/to/patch/e1001_3.8.patch After that, navigate to ethercat-1.5.2/devices/e1000e and make the following changes. File Line Description =========== --------- ethtool-3.8-ethercat.c 2101 --------- The driver makes a deprecated call to SET_ETHTOOL_OPS Replace: SET_ETHTOOL_OPS( netdev, &e1000_ethtool_ops) With: netdev->ethtool_ops = &e1000_ethtool_ops; --------- netdev-3.8-ethercat.c THROUGHOUT --------- Replace: NETIF_F_HW_VLAN_RX With: NETIF_F_HW_VLAN_CTAG_RX Replace: NETIF_F_HW_VLAN_TX With: NETIF_F_HW_VLAN_CTAG_TX Replace: NETIF_F_HW_VLAN_FILTER With: NETIF_F_HW_VLAN_CTAG_FILTER --------- netdev-3.8-ethercat.c 507 --------- The API changed for __vlan_hwaccel_put_tag There is now an extra argument. 6 static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, 357 __be16 vlan_proto, 358 u16 vlan_tci) 359 { 360 skb->vlan_proto = vlan_proto; 361 skb->vlan_tci = VLAN_TAG_PRESENT | vlan_tci; 362 return skb; 363 } What we’re missing is the protocol, which appears to be retrieved a few lines above: skb->protocol = eth_type_trans( skb, netdev ) So, change the line: __vlan_hwaccel_put_tag( skb, tag ); With: __vlan_hwaccel_put_tag( skb, skb->protocol, tag ); --------- netdev-3.8-ethercat.c 837 --------- struct sk_buff has not member named ‘rxhash’ The field name was changed simply to “hash” Change the line: skb->rxhash = … To: skb->hash = … --------- netdev-3.8-ethercat.c 6146 (Change occurs on line 2679) --------- Initialization from incompatible pointer type. .ndo_vlan_rx_add_vid = e1000_vlan_rx_add_vid The function pointer is currently: int (*ndo_vlan_rx_add_vid)(struct net_device *dev, __be16 proto, u16t vid); 841 * If device support VLAN filtering this function is called when a 842 * VLAN id is registered. The implementation is missing the __be16 proto argument. On line 2679, change parameter list to: static int e1000_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16t vid) The function body doesn’t seem to care about the protocol argument, so I didn’t implement any changes to the function. But the calls to the function need to be updated in the subsequent steps. Note that I didn’t make any effort to capture the actual protocol; the function doesn’t use the new argument. If it becomes necessary in the future, there is an example on getting the protocol around line 507 of this file. --------- 2810 --------- Change: e1000_vlan_rx_add_vid( netdev, vid ); To: e1000_vlan_rx_add_vid( netdev, (__be16)0, vid ); ———— 2822 ———— Change: e1000_vlan_rx_add_vid( adapter->netdev, vid ); To: e1000_vlan_rx_add_vid( adapter->netdev, (__be16)0, vid ); --------- 2825 --------- Change: e1000_vlan_rx_add_vid( adapter->netdev, 0 ); To: e1000_vlan_rx_add_vid( adapter->netdev, (__be16)0, 0 ); --------- netdev-3.8-ethercat.c 6147 (Change occurs on line 2704) --------- Initialization from incompatible pointer type. int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid); 845 * If device support VLAN filtering this function is called when a 846 * VLAN id is unregistered. At line 2704, the vid argument is of u16 type, but now it should be of unsigned short. Which is the same type, but I changed it so long as I was editing the code. Once again, we’re missing the __be16 proto argument e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) becomes e1000_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, unsigned short vid) And once again we have to correct calls to the function later. --------- 2748 --------- e1000_vlan_rx_kill_vid( netdev, adapter->mng_vlan_id ) to e1000_vlan_rx_kill_vid( netdev, (__be16)0, adapter->mng_vlan_id ) ———— 2816 ———— e1000_vlan_rx_kill_vid( netdev, old_vid ) to e1000_vlan_rx_kill_vid( netdev, (__be16)0, old_vid ) --------- 4120 --------- e1000_vlan_rx_kill_vid( netdev, adapter->mng_vlan_id ) to e1000_vlan_rx_kill_vid( netdev, (__be16)0, adapter->mng_vlan_id ) _______________________________________________ etherlab-dev mailing list etherlab-dev@etherlab.org http://lists.etherlab.org/mailman/listinfo/etherlab-dev