WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH v2] net: xen-netback: convert to hw_features

To: netdev@xxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH v2] net: xen-netback: convert to hw_features
From: Michał Mirosław <mirq-linux@xxxxxxxxxxxx>
Date: Tue, 19 Apr 2011 15:35:06 +0200 (CEST)
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Tue, 19 Apr 2011 06:36:21 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20110419115612.C4ACA13909@xxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20110419115612.C4ACA13909@xxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Signed-off-by: Michał Mirosław <mirq-linux@xxxxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

---
v2: fix xenvif_fix_features() arguments

 drivers/net/xen-netback/common.h    |    3 -
 drivers/net/xen-netback/interface.c |   84 ++++++----------------------------
 2 files changed, 15 insertions(+), 72 deletions(-)

diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index 5d7bbf2..8753e6d 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -73,9 +73,6 @@ struct xenvif {
        struct vm_struct *tx_comms_area;
        struct vm_struct *rx_comms_area;
 
-       /* Flags that must not be set in dev->features */
-       u32 features_disabled;
-
        /* Frontend feature information. */
        u8 can_sg:1;
        u8 gso:1;
diff --git a/drivers/net/xen-netback/interface.c 
b/drivers/net/xen-netback/interface.c
index de569cc..0ca86f9 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -165,69 +165,18 @@ static int xenvif_change_mtu(struct net_device *dev, int 
mtu)
        return 0;
 }
 
-static void xenvif_set_features(struct xenvif *vif)
-{
-       struct net_device *dev = vif->dev;
-       u32 features = dev->features;
-
-       if (vif->can_sg)
-               features |= NETIF_F_SG;
-       if (vif->gso || vif->gso_prefix)
-               features |= NETIF_F_TSO;
-       if (vif->csum)
-               features |= NETIF_F_IP_CSUM;
-
-       features &= ~(vif->features_disabled);
-
-       if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN)
-               dev->mtu = ETH_DATA_LEN;
-
-       dev->features = features;
-}
-
-static int xenvif_set_tx_csum(struct net_device *dev, u32 data)
+static u32 xenvif_fix_features(struct net_device *dev, u32 features)
 {
        struct xenvif *vif = netdev_priv(dev);
-       if (data) {
-               if (!vif->csum)
-                       return -EOPNOTSUPP;
-               vif->features_disabled &= ~NETIF_F_IP_CSUM;
-       } else {
-               vif->features_disabled |= NETIF_F_IP_CSUM;
-       }
-
-       xenvif_set_features(vif);
-       return 0;
-}
 
-static int xenvif_set_sg(struct net_device *dev, u32 data)
-{
-       struct xenvif *vif = netdev_priv(dev);
-       if (data) {
-               if (!vif->can_sg)
-                       return -EOPNOTSUPP;
-               vif->features_disabled &= ~NETIF_F_SG;
-       } else {
-               vif->features_disabled |= NETIF_F_SG;
-       }
-
-       xenvif_set_features(vif);
-       return 0;
-}
-
-static int xenvif_set_tso(struct net_device *dev, u32 data)
-{
-       struct xenvif *vif = netdev_priv(dev);
-       if (data) {
-               if (!vif->gso && !vif->gso_prefix)
-                       return -EOPNOTSUPP;
-               vif->features_disabled &= ~NETIF_F_TSO;
-       } else {
-               vif->features_disabled |= NETIF_F_TSO;
-       }
+       if (!vif->can_sg)
+               features &= ~NETIF_F_SG;
+       if (!vif->gso && !vif->gso_prefix)
+               features &= ~NETIF_F_TSO;
+       if (!vif->csum)
+               features &= ~NETIF_F_IP_CSUM;
 
-       xenvif_set_features(vif);
-       return 0;
+       return features;
 }
 
 static const struct xenvif_stat {
@@ -274,12 +223,6 @@ static void xenvif_get_strings(struct net_device *dev, u32 
stringset, u8 * data)
 }
 
 static struct ethtool_ops xenvif_ethtool_ops = {
-       .get_tx_csum    = ethtool_op_get_tx_csum,
-       .set_tx_csum    = xenvif_set_tx_csum,
-       .get_sg         = ethtool_op_get_sg,
-       .set_sg         = xenvif_set_sg,
-       .get_tso        = ethtool_op_get_tso,
-       .set_tso        = xenvif_set_tso,
        .get_link       = ethtool_op_get_link,
 
        .get_sset_count = xenvif_get_sset_count,
@@ -293,6 +236,7 @@ static struct net_device_ops xenvif_netdev_ops = {
        .ndo_open       = xenvif_open,
        .ndo_stop       = xenvif_close,
        .ndo_change_mtu = xenvif_change_mtu,
+       .ndo_fix_features = xenvif_fix_features,
 };
 
 struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
@@ -331,7 +275,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t 
domid,
        vif->credit_timeout.expires = jiffies;
 
        dev->netdev_ops = &xenvif_netdev_ops;
-       xenvif_set_features(vif);
+       dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
+       dev->features = dev->hw_features;
        SET_ETHTOOL_OPS(dev, &xenvif_ethtool_ops);
 
        dev->tx_queue_len = XENVIF_QUEUE_LENGTH;
@@ -367,8 +312,6 @@ int xenvif_connect(struct xenvif *vif, unsigned long 
tx_ring_ref,
        if (vif->irq)
                return 0;
 
-       xenvif_set_features(vif);
-
        err = xen_netbk_map_frontend_rings(vif, tx_ring_ref, rx_ring_ref);
        if (err < 0)
                goto err;
@@ -384,9 +327,12 @@ int xenvif_connect(struct xenvif *vif, unsigned long 
tx_ring_ref,
        xenvif_get(vif);
 
        rtnl_lock();
-       netif_carrier_on(vif->dev);
        if (netif_running(vif->dev))
                xenvif_up(vif);
+       if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN)
+               dev_set_mtu(vif->dev, ETH_DATA_LEN);
+       netdev_update_features(vif->dev);
+       netif_carrier_on(vif->dev);
        rtnl_unlock();
 
        return 0;
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel