Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- linux-2.6.18.x86_64/drivers/xen/netback/common.h.orig 2011-04-15 17:46:12.730677042 -0400
- +++ linux-2.6.18.x86_64/drivers/xen/netback/common.h 2011-04-15 17:57:57.490721792 -0400
- @@ -76,8 +76,13 @@
- struct vm_struct *tx_comms_area;
- struct vm_struct *rx_comms_area;
- - /* Set of features that can be turned on in dev->features. */
- - int features;
- + /* Flags that must not be set in dev->features */
- + int features_disabled;
- +
- + /* Frontend feature information. */
- + u8 can_sg:1;
- + u8 gso:1;
- + u8 csum:1;
- /* Internal feature information. */
- int can_queue:1; /* can queue packets for receiver? */
- @@ -110,6 +115,7 @@
- void netif_disconnect(netif_t *netif);
- +void netif_set_features(netif_t *netif);
- netif_t *netif_alloc(domid_t domid, unsigned int handle);
- int netif_map(netif_t *netif, unsigned long tx_ring_ref,
- unsigned long rx_ring_ref, unsigned int evtchn);
- @@ -142,7 +148,7 @@
- static inline int netbk_can_sg(struct net_device *dev)
- {
- netif_t *netif = netdev_priv(dev);
- - return netif->features & NETIF_F_SG;
- + return netif->can_sg;
- }
- #endif /* __NETIF__BACKEND__COMMON_H__ */
- --- linux-2.6.18.x86_64/drivers/xen/netback/interface.c.orig 2011-04-15 17:46:57.205456542 -0400
- +++ linux-2.6.18.x86_64/drivers/xen/netback/interface.c 2011-04-15 17:50:46.027757042 -0400
- @@ -90,34 +90,75 @@
- return 0;
- }
- -static int netbk_set_sg(struct net_device *dev, u32 data)
- +void netif_set_features(netif_t *netif)
- {
- + struct net_device *dev = netif->dev;
- + int features = dev->features;
- +
- + if (netif->can_sg)
- + features |= NETIF_F_SG;
- + if (netif->gso)
- + features |= NETIF_F_TSO;
- + if (netif->csum)
- + features |= NETIF_F_IP_CSUM;
- +
- + features &= ~(netif->features_disabled);
- +
- + if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN)
- + dev->mtu = ETH_DATA_LEN;
- +
- + dev->features = features;
- +}
- +
- +static int netbk_set_tx_csum(struct net_device *dev, u32 data)
- +{
- + netif_t *netif = netdev_priv(dev);
- if (data) {
- - netif_t *netif = netdev_priv(dev);
- + if (!netif->csum)
- + return -ENOSYS;
- + netif->features_disabled &= ~NETIF_F_IP_CSUM;
- + } else {
- + netif->features_disabled |= NETIF_F_IP_CSUM;
- + }
- - if (!(netif->features & NETIF_F_SG))
- + netif_set_features(netif);
- + return 0;
- +}
- +
- +static int netbk_set_sg(struct net_device *dev, u32 data)
- +{
- + netif_t *netif = netdev_priv(dev);
- + if (data) {
- + if (!netif->can_sg)
- return -ENOSYS;
- + netif->features_disabled &= ~NETIF_F_SG;
- + } else {
- + netif->features_disabled |= NETIF_F_SG;
- }
- - return ethtool_op_set_sg(dev, data);
- + netif_set_features(netif);
- + return 0;
- }
- static int netbk_set_tso(struct net_device *dev, u32 data)
- {
- + netif_t *netif = netdev_priv(dev);
- if (data) {
- - netif_t *netif = netdev_priv(dev);
- -
- - if (!(netif->features & NETIF_F_TSO))
- + if (!netif->gso)
- return -ENOSYS;
- + netif->features_disabled &= ~NETIF_F_TSO;
- + } else {
- + netif->features_disabled |= NETIF_F_TSO;
- }
- - return ethtool_op_set_tso(dev, data);
- + netif_set_features(netif);
- + return 0;
- }
- static struct ethtool_ops network_ethtool_ops =
- {
- .get_tx_csum = ethtool_op_get_tx_csum,
- - .set_tx_csum = ethtool_op_set_tx_csum,
- + .set_tx_csum = netbk_set_tx_csum,
- .get_sg = ethtool_op_get_sg,
- .set_sg = netbk_set_sg,
- .get_tso = ethtool_op_get_tso,
- @@ -145,6 +186,8 @@
- memset(netif, 0, sizeof(*netif));
- netif->domid = domid;
- netif->handle = handle;
- + netif->can_sg = 1;
- + netif->csum = 1;
- atomic_set(&netif->refcnt, 1);
- init_waitqueue_head(&netif->waiting_to_free);
- netif->dev = dev;
- @@ -162,7 +205,8 @@
- dev->open = net_open;
- dev->stop = net_close;
- dev->change_mtu = netbk_change_mtu;
- - dev->features = NETIF_F_IP_CSUM;
- +
- + netif_set_features(netif);
- SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
- --- linux-2.6.18.x86_64/drivers/xen/netback/netback.c.orig 2011-04-15 17:46:58.141515042 -0400
- +++ linux-2.6.18.x86_64/drivers/xen/netback/netback.c 2011-04-15 17:50:46.027757042 -0400
- @@ -215,7 +215,7 @@
- static inline int netbk_max_required_rx_slots(netif_t *netif)
- {
- - if (netif->features & (NETIF_F_SG|NETIF_F_TSO))
- + if (netif->can_sg || netif->gso)
- return MAX_SKB_FRAGS + 2; /* header + extra_info + frags */
- return 1; /* all in one */
- }
- --- linux-2.6.18.x86_64/drivers/xen/netback/xenbus.c.orig 2011-04-15 17:46:59.217582292 -0400
- +++ linux-2.6.18.x86_64/drivers/xen/netback/xenbus.c 2011-04-15 18:13:20.700418792 -0400
- @@ -345,6 +345,7 @@
- static int connect_rings(struct backend_info *be)
- {
- + netif_t *netif = be->netif;
- struct xenbus_device *dev = be->dev;
- unsigned long tx_ring_ref, rx_ring_ref;
- unsigned int evtchn, rx_copy;
- @@ -375,46 +376,40 @@
- dev->otherend);
- return err;
- }
- - be->netif->copying_receiver = !!rx_copy;
- + netif->copying_receiver = !!rx_copy;
- - if (be->netif->dev->tx_queue_len != 0) {
- + if (netif->dev->tx_queue_len != 0) {
- if (xenbus_scanf(XBT_NIL, dev->otherend,
- "feature-rx-notify", "%d", &val) < 0)
- val = 0;
- if (val)
- - be->netif->can_queue = 1;
- + netif->can_queue = 1
- else
- /* Must be non-zero for pfifo_fast to work. */
- - be->netif->dev->tx_queue_len = 1;
- + netif->dev->tx_queue_len = 1;
- }
- if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", "%d", &val) < 0)
- val = 0;
- - if (val) {
- - be->netif->features |= NETIF_F_SG;
- - be->netif->dev->features |= NETIF_F_SG;
- - }
- + netif->can_sg = !!val;
- if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4", "%d",
- &val) < 0)
- val = 0;
- - if (val) {
- - be->netif->features |= NETIF_F_TSO;
- - be->netif->dev->features |= NETIF_F_TSO;
- - }
- + netif->gso = !!val;
- if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload",
- "%d", &val) < 0)
- val = 0;
- - if (val) {
- - be->netif->features &= ~NETIF_F_IP_CSUM;
- - be->netif->dev->features &= ~NETIF_F_IP_CSUM;
- - }
- + netif->csum = !val;
- +
- + /* Set dev->features */
- + netif_set_features(netif);
- netdev_features_change(be->netif->dev);
- /* Map the shared frame, irq etc. */
- - err = netif_map(be->netif, tx_ring_ref, rx_ring_ref, evtchn);
- + err = netif_map(netif, tx_ring_ref, rx_ring_ref, evtchn);
- if (err) {
- xenbus_dev_fatal(dev, err,
- "mapping shared-frames %lu/%lu port %u",
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement