]> xenbits.xen.org Git - xenclient/kernel.git/commitdiff
Add second location for acceleration config option for XenServer solarflare-sfc
authort_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:05:59 +0000 (12:05 +0000)
committert_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:05:59 +0000 (12:05 +0000)
drivers/xen/netback/accel.c
drivers/xen/sfc_netback/accel_xenbus.c

index 181c3632503a756736465e5d57918d0d8cea0e38..bb78c66b68ba7a75501bb6d974d549775b307c8b 100644 (file)
@@ -64,16 +64,32 @@ static int match_accelerator(struct xenbus_device *xendev,
        char *eth_name = xenbus_read(XBT_NIL, xendev->nodename, "accel", NULL);
        
        if (IS_ERR(eth_name)) {
-               /* Probably means not present */
-               DPRINTK("%s: no match due to xenbus_read accel error %d\n", 
-                       __FUNCTION__, PTR_ERR(eth_name));
-               return 0;
-       } else {
-               if (!strcmp(eth_name, accelerator->eth_name))
-                       rc = 1;
-               kfree(eth_name);
-               return rc;
+               int dom, vif;
+               char *nodename;
+
+               /* Try alternate configuration location */
+               sscanf(xendev->nodename, "backend/vif/%d/%d", &dom, &vif);
+               nodename = kasprintf(GFP_NOIO | __GFP_HIGH, 
+                                    "/local/domain/%d/vm-data/device/vif/%d", 
+                                    dom, vif);
+               if (!nodename)
+                       return 0;
+
+               eth_name = xenbus_read(XBT_NIL, nodename, "accel", NULL);
+
+               kfree(nodename);
+
+               if (IS_ERR(eth_name)) {
+                       /* Probably means not present */
+                       DPRINTK("%s: no match due to xenbus_read accel err %d\n",
+                               __FUNCTION__, PTR_ERR(eth_name));
+                       return 0;
+               }
        }
+       if (!strcmp(eth_name, accelerator->eth_name))
+               rc = 1;
+       kfree(eth_name);
+       return rc;
 }
 
 
index 07f40a74687c8348794c3f32b71fc33c4685cfb0..27f629ce32cdaaef3ddb83a4354e263564e43174 100644 (file)
@@ -332,8 +332,22 @@ static int read_nicname(struct xenbus_device *dev, struct netback_accel *bend)
 
        /* nic name used to select interface used for acceleration */
        bend->nicname = xenbus_read(XBT_NIL, dev->nodename, "accel", &len);
-       if (IS_ERR(bend->nicname))
-               return PTR_ERR(bend->nicname);
+       if (IS_ERR(bend->nicname)) {
+               /* Try looking in the XenServer5 place */
+               char *nodename = 
+                       kasprintf(GFP_NOIO | __GFP_HIGH, 
+                                 "/local/domain/%d/vm-data/device/vif/%d", 
+                                 bend->far_end, bend->vif_num);
+
+               if (!nodename)
+                       return -ENOMEM;
+
+               bend->nicname = xenbus_read(XBT_NIL, nodename, "accel", &len);
+               kfree(nodename);
+
+               if (IS_ERR(bend->nicname))
+                       return PTR_ERR(bend->nicname);
+       }
 
        return 0;
 }