diff options
Diffstat (limited to 'drivers/net/xen-netback')
| -rw-r--r-- | drivers/net/xen-netback/netback.c | 2 | ||||
| -rw-r--r-- | drivers/net/xen-netback/xenbus.c | 34 |
2 files changed, 21 insertions, 15 deletions
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 4de46aa61d95..0d2594395ffb 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -1250,7 +1250,7 @@ static void xenvif_tx_build_gops(struct xenvif_queue *queue, | |||
| 1250 | netdev_err(queue->vif->dev, | 1250 | netdev_err(queue->vif->dev, |
| 1251 | "txreq.offset: %x, size: %u, end: %lu\n", | 1251 | "txreq.offset: %x, size: %u, end: %lu\n", |
| 1252 | txreq.offset, txreq.size, | 1252 | txreq.offset, txreq.size, |
| 1253 | (txreq.offset&~PAGE_MASK) + txreq.size); | 1253 | (unsigned long)(txreq.offset&~PAGE_MASK) + txreq.size); |
| 1254 | xenvif_fatal_tx_err(queue->vif); | 1254 | xenvif_fatal_tx_err(queue->vif); |
| 1255 | break; | 1255 | break; |
| 1256 | } | 1256 | } |
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index 3d8dbf5f2d39..968787abf78d 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c | |||
| @@ -34,6 +34,8 @@ struct backend_info { | |||
| 34 | enum xenbus_state frontend_state; | 34 | enum xenbus_state frontend_state; |
| 35 | struct xenbus_watch hotplug_status_watch; | 35 | struct xenbus_watch hotplug_status_watch; |
| 36 | u8 have_hotplug_status_watch:1; | 36 | u8 have_hotplug_status_watch:1; |
| 37 | |||
| 38 | const char *hotplug_script; | ||
| 37 | }; | 39 | }; |
| 38 | 40 | ||
| 39 | static int connect_rings(struct backend_info *be, struct xenvif_queue *queue); | 41 | static int connect_rings(struct backend_info *be, struct xenvif_queue *queue); |
| @@ -238,6 +240,7 @@ static int netback_remove(struct xenbus_device *dev) | |||
| 238 | xenvif_free(be->vif); | 240 | xenvif_free(be->vif); |
| 239 | be->vif = NULL; | 241 | be->vif = NULL; |
| 240 | } | 242 | } |
| 243 | kfree(be->hotplug_script); | ||
| 241 | kfree(be); | 244 | kfree(be); |
| 242 | dev_set_drvdata(&dev->dev, NULL); | 245 | dev_set_drvdata(&dev->dev, NULL); |
| 243 | return 0; | 246 | return 0; |
| @@ -255,6 +258,7 @@ static int netback_probe(struct xenbus_device *dev, | |||
| 255 | struct xenbus_transaction xbt; | 258 | struct xenbus_transaction xbt; |
| 256 | int err; | 259 | int err; |
| 257 | int sg; | 260 | int sg; |
| 261 | const char *script; | ||
| 258 | struct backend_info *be = kzalloc(sizeof(struct backend_info), | 262 | struct backend_info *be = kzalloc(sizeof(struct backend_info), |
| 259 | GFP_KERNEL); | 263 | GFP_KERNEL); |
| 260 | if (!be) { | 264 | if (!be) { |
| @@ -347,6 +351,15 @@ static int netback_probe(struct xenbus_device *dev, | |||
| 347 | if (err) | 351 | if (err) |
| 348 | pr_debug("Error writing multi-queue-max-queues\n"); | 352 | pr_debug("Error writing multi-queue-max-queues\n"); |
| 349 | 353 | ||
| 354 | script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL); | ||
| 355 | if (IS_ERR(script)) { | ||
| 356 | err = PTR_ERR(script); | ||
| 357 | xenbus_dev_fatal(dev, err, "reading script"); | ||
| 358 | goto fail; | ||
| 359 | } | ||
| 360 | |||
| 361 | be->hotplug_script = script; | ||
| 362 | |||
| 350 | err = xenbus_switch_state(dev, XenbusStateInitWait); | 363 | err = xenbus_switch_state(dev, XenbusStateInitWait); |
| 351 | if (err) | 364 | if (err) |
| 352 | goto fail; | 365 | goto fail; |
| @@ -379,22 +392,14 @@ static int netback_uevent(struct xenbus_device *xdev, | |||
| 379 | struct kobj_uevent_env *env) | 392 | struct kobj_uevent_env *env) |
| 380 | { | 393 | { |
| 381 | struct backend_info *be = dev_get_drvdata(&xdev->dev); | 394 | struct backend_info *be = dev_get_drvdata(&xdev->dev); |
| 382 | char *val; | ||
| 383 | 395 | ||
| 384 | val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL); | 396 | if (!be) |
| 385 | if (IS_ERR(val)) { | 397 | return 0; |
| 386 | int err = PTR_ERR(val); | ||
| 387 | xenbus_dev_fatal(xdev, err, "reading script"); | ||
| 388 | return err; | ||
| 389 | } else { | ||
| 390 | if (add_uevent_var(env, "script=%s", val)) { | ||
| 391 | kfree(val); | ||
| 392 | return -ENOMEM; | ||
| 393 | } | ||
| 394 | kfree(val); | ||
| 395 | } | ||
| 396 | 398 | ||
| 397 | if (!be || !be->vif) | 399 | if (add_uevent_var(env, "script=%s", be->hotplug_script)) |
| 400 | return -ENOMEM; | ||
| 401 | |||
| 402 | if (!be->vif) | ||
| 398 | return 0; | 403 | return 0; |
| 399 | 404 | ||
| 400 | return add_uevent_var(env, "vif=%s", be->vif->dev->name); | 405 | return add_uevent_var(env, "vif=%s", be->vif->dev->name); |
| @@ -793,6 +798,7 @@ static void connect(struct backend_info *be) | |||
| 793 | goto err; | 798 | goto err; |
| 794 | } | 799 | } |
| 795 | 800 | ||
| 801 | queue->credit_bytes = credit_bytes; | ||
| 796 | queue->remaining_credit = credit_bytes; | 802 | queue->remaining_credit = credit_bytes; |
| 797 | queue->credit_usec = credit_usec; | 803 | queue->credit_usec = credit_usec; |
| 798 | 804 | ||
