From e40c9416a7d8b129cb83a42eba503ff7f7595574 Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Mon, 11 Apr 2011 09:57:54 +0200 Subject: [PATCH] --- yaml --- r: 247815 b: refs/heads/master c: da28947e7e3602669e27d5e9ce787436ed662fa4 h: refs/heads/master i: 247813: 77f52f01ac2a6ef742a8765951cf4c834e92b3f0 247811: 650e96b9d1affa4cbbde1267b0cac759e3d12849 247807: 3d0bcdca1244640f3c455c296e8068e97f4e01cd v: v3 --- [refs] | 2 +- trunk/drivers/firewire/ohci.c | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index eb8e2fb290e6..4300b2874451 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ecf8328e59447b83a1f79628487e0e9f8801db84 +refs/heads/master: da28947e7e3602669e27d5e9ce787436ed662fa4 diff --git a/trunk/drivers/firewire/ohci.c b/trunk/drivers/firewire/ohci.c index dfb3cb774a79..435ed800d03f 100644 --- a/trunk/drivers/firewire/ohci.c +++ b/trunk/drivers/firewire/ohci.c @@ -1218,6 +1218,7 @@ static void context_stop(struct context *ctx) } struct driver_data { + u8 inline_data[8]; struct fw_packet *packet; }; @@ -1301,20 +1302,28 @@ static int at_context_queue_packet(struct context *ctx, return -1; } + BUILD_BUG_ON(sizeof(struct driver_data) > sizeof(struct descriptor)); driver_data = (struct driver_data *) &d[3]; driver_data->packet = packet; packet->driver_data = driver_data; if (packet->payload_length > 0) { - payload_bus = - dma_map_single(ohci->card.device, packet->payload, - packet->payload_length, DMA_TO_DEVICE); - if (dma_mapping_error(ohci->card.device, payload_bus)) { - packet->ack = RCODE_SEND_ERROR; - return -1; + if (packet->payload_length > sizeof(driver_data->inline_data)) { + payload_bus = dma_map_single(ohci->card.device, + packet->payload, + packet->payload_length, + DMA_TO_DEVICE); + if (dma_mapping_error(ohci->card.device, payload_bus)) { + packet->ack = RCODE_SEND_ERROR; + return -1; + } + packet->payload_bus = payload_bus; + packet->payload_mapped = true; + } else { + memcpy(driver_data->inline_data, packet->payload, + packet->payload_length); + payload_bus = d_bus + 3 * sizeof(*d); } - packet->payload_bus = payload_bus; - packet->payload_mapped = true; d[2].req_count = cpu_to_le16(packet->payload_length); d[2].data_address = cpu_to_le32(payload_bus);