client_put(client);
 }
 
-static int ioctl_send_request(struct client *client, void *buffer)
+static int init_request(struct client *client,
+                       struct fw_cdev_send_request *request,
+                       int destination_id, int speed)
 {
-       struct fw_device *device = client->device;
-       struct fw_cdev_send_request *request = buffer;
        struct outbound_transaction_event *e;
        int ret;
 
                goto failed;
        }
 
-       switch (request->tcode) {
-       case TCODE_WRITE_QUADLET_REQUEST:
-       case TCODE_WRITE_BLOCK_REQUEST:
-       case TCODE_READ_QUADLET_REQUEST:
-       case TCODE_READ_BLOCK_REQUEST:
-       case TCODE_LOCK_MASK_SWAP:
-       case TCODE_LOCK_COMPARE_SWAP:
-       case TCODE_LOCK_FETCH_ADD:
-       case TCODE_LOCK_LITTLE_ADD:
-       case TCODE_LOCK_BOUNDED_ADD:
-       case TCODE_LOCK_WRAP_ADD:
-       case TCODE_LOCK_VENDOR_DEPENDENT:
-               break;
-       default:
-               ret = -EINVAL;
-               goto failed;
-       }
-
        e->r.resource.release = release_transaction;
        ret = add_client_resource(client, &e->r.resource, GFP_KERNEL);
        if (ret < 0)
        /* Get a reference for the transaction callback */
        client_get(client);
 
-       fw_send_request(device->card, &e->r.transaction,
-                       request->tcode & 0x1f,
-                       device->node->node_id,
-                       request->generation,
-                       device->max_speed,
-                       request->offset,
+       fw_send_request(client->device->card, &e->r.transaction,
+                       request->tcode & 0x1f, destination_id,
+                       request->generation, speed, request->offset,
                        e->response.data, request->length,
                        complete_transaction, e);
 
        return ret;
 }
 
+static int ioctl_send_request(struct client *client, void *buffer)
+{
+       struct fw_cdev_send_request *request = buffer;
+
+       switch (request->tcode) {
+       case TCODE_WRITE_QUADLET_REQUEST:
+       case TCODE_WRITE_BLOCK_REQUEST:
+       case TCODE_READ_QUADLET_REQUEST:
+       case TCODE_READ_BLOCK_REQUEST:
+       case TCODE_LOCK_MASK_SWAP:
+       case TCODE_LOCK_COMPARE_SWAP:
+       case TCODE_LOCK_FETCH_ADD:
+       case TCODE_LOCK_LITTLE_ADD:
+       case TCODE_LOCK_BOUNDED_ADD:
+       case TCODE_LOCK_WRAP_ADD:
+       case TCODE_LOCK_VENDOR_DEPENDENT:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return init_request(client, request, client->device->node->node_id,
+                           client->device->max_speed);
+}
+
 static void release_request(struct client *client,
                            struct client_resource *resource)
 {
        return 0;
 }
 
+static int ioctl_send_broadcast_request(struct client *client, void *buffer)
+{
+       struct fw_cdev_send_request *request = buffer;
+
+       switch (request->tcode) {
+       case TCODE_WRITE_QUADLET_REQUEST:
+       case TCODE_WRITE_BLOCK_REQUEST:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return init_request(client, request, LOCAL_BUS | 0x3f, SCODE_100);
+}
+
 static int (* const ioctl_handlers[])(struct client *client, void *buffer) = {
        ioctl_get_info,
        ioctl_send_request,
        ioctl_allocate_iso_resource_once,
        ioctl_deallocate_iso_resource_once,
        ioctl_get_speed,
+       ioctl_send_broadcast_request,
 };
 
 static int dispatch_ioctl(struct client *client,