]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/8021q/vlan_dev.c
Merge git://people.freedesktop.org/~airlied/linux
[karo-tx-linux.git] / net / 8021q / vlan_dev.c
index 0d441ec8763ec87eec018d2b043b82a5ead50aa0..118956448cf6e4aa9a3609ccf7455a04596e24bf 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/slab.h>
 #include <linux/skbuff.h>
 #include <linux/netdevice.h>
+#include <linux/net_tstamp.h>
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <net/arp.h>
@@ -150,7 +151,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
                u16 vlan_tci;
                vlan_tci = vlan->vlan_id;
                vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);
-               skb = __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);
+               __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);
        }
 
        skb->dev = vlan->real_dev;
@@ -578,11 +579,12 @@ static int vlan_dev_init(struct net_device *dev)
                      (1<<__LINK_STATE_PRESENT);
 
        dev->hw_features = NETIF_F_ALL_CSUM | NETIF_F_SG |
-                          NETIF_F_FRAGLIST | NETIF_F_ALL_TSO |
+                          NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE |
                           NETIF_F_HIGHDMA | NETIF_F_SCTP_CSUM |
                           NETIF_F_ALL_FCOE;
 
-       dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
+       dev->features |= real_dev->vlan_features | NETIF_F_LLTX |
+                        NETIF_F_GSO_SOFTWARE;
        dev->gso_max_size = real_dev->gso_max_size;
        if (dev->features & NETIF_F_VLAN_FEATURES)
                netdev_warn(real_dev, "VLAN features are set incorrectly.  Q-in-Q configurations may not work correctly.\n");
@@ -647,7 +649,7 @@ static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
        features |= NETIF_F_RXCSUM;
        features = netdev_intersect_features(features, real_dev->features);
 
-       features |= old_features & NETIF_F_SOFT_FEATURES;
+       features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE);
        features |= NETIF_F_LLTX;
 
        return features;
@@ -669,6 +671,23 @@ static void vlan_ethtool_get_drvinfo(struct net_device *dev,
        strlcpy(info->fw_version, "N/A", sizeof(info->fw_version));
 }
 
+static int vlan_ethtool_get_ts_info(struct net_device *dev,
+                                   struct ethtool_ts_info *info)
+{
+       const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
+       const struct ethtool_ops *ops = vlan->real_dev->ethtool_ops;
+
+       if (ops->get_ts_info) {
+               return ops->get_ts_info(vlan->real_dev, info);
+       } else {
+               info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
+                       SOF_TIMESTAMPING_SOFTWARE;
+               info->phc_index = -1;
+       }
+
+       return 0;
+}
+
 static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
 {
        struct vlan_pcpu_stats *p;
@@ -752,6 +771,7 @@ static const struct ethtool_ops vlan_ethtool_ops = {
        .get_settings           = vlan_ethtool_get_settings,
        .get_drvinfo            = vlan_ethtool_get_drvinfo,
        .get_link               = ethtool_op_get_link,
+       .get_ts_info            = vlan_ethtool_get_ts_info,
 };
 
 static const struct net_device_ops vlan_netdev_ops = {