diff options
Diffstat (limited to 'drivers/firewire/fw-transaction.c')
-rw-r--r-- | drivers/firewire/fw-transaction.c | 42 |
1 files changed, 16 insertions, 26 deletions
diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index e3da5899196..4a9b37461c2 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c | |||
@@ -37,10 +37,6 @@ | |||
37 | #include "fw-topology.h" | 37 | #include "fw-topology.h" |
38 | #include "fw-device.h" | 38 | #include "fw-device.h" |
39 | 39 | ||
40 | #define HEADER_TAG(tag) ((tag) << 14) | ||
41 | #define HEADER_CHANNEL(ch) ((ch) << 8) | ||
42 | #define HEADER_SY(sy) ((sy) << 0) | ||
43 | |||
44 | #define HEADER_PRI(pri) ((pri) << 0) | 40 | #define HEADER_PRI(pri) ((pri) << 0) |
45 | #define HEADER_TCODE(tcode) ((tcode) << 4) | 41 | #define HEADER_TCODE(tcode) ((tcode) << 4) |
46 | #define HEADER_RETRY(retry) ((retry) << 8) | 42 | #define HEADER_RETRY(retry) ((retry) << 8) |
@@ -158,6 +154,18 @@ static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, | |||
158 | { | 154 | { |
159 | int ext_tcode; | 155 | int ext_tcode; |
160 | 156 | ||
157 | if (tcode == TCODE_STREAM_DATA) { | ||
158 | packet->header[0] = | ||
159 | HEADER_DATA_LENGTH(length) | | ||
160 | destination_id | | ||
161 | HEADER_TCODE(TCODE_STREAM_DATA); | ||
162 | packet->header_length = 4; | ||
163 | packet->payload = payload; | ||
164 | packet->payload_length = length; | ||
165 | |||
166 | goto common; | ||
167 | } | ||
168 | |||
161 | if (tcode > 0x10) { | 169 | if (tcode > 0x10) { |
162 | ext_tcode = tcode & ~0x10; | 170 | ext_tcode = tcode & ~0x10; |
163 | tcode = TCODE_LOCK_REQUEST; | 171 | tcode = TCODE_LOCK_REQUEST; |
@@ -204,7 +212,7 @@ static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, | |||
204 | packet->payload_length = 0; | 212 | packet->payload_length = 0; |
205 | break; | 213 | break; |
206 | } | 214 | } |
207 | 215 | common: | |
208 | packet->speed = speed; | 216 | packet->speed = speed; |
209 | packet->generation = generation; | 217 | packet->generation = generation; |
210 | packet->ack = 0; | 218 | packet->ack = 0; |
@@ -246,6 +254,9 @@ static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, | |||
246 | * @param callback function to be called when the transaction is completed | 254 | * @param callback function to be called when the transaction is completed |
247 | * @param callback_data pointer to arbitrary data, which will be | 255 | * @param callback_data pointer to arbitrary data, which will be |
248 | * passed to the callback | 256 | * passed to the callback |
257 | * | ||
258 | * In case of asynchronous stream packets i.e. TCODE_STREAM_DATA, the caller | ||
259 | * needs to synthesize @destination_id with fw_stream_packet_destination_id(). | ||
249 | */ | 260 | */ |
250 | void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode, | 261 | void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode, |
251 | int destination_id, int generation, int speed, | 262 | int destination_id, int generation, int speed, |
@@ -297,27 +308,6 @@ void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode, | |||
297 | } | 308 | } |
298 | EXPORT_SYMBOL(fw_send_request); | 309 | EXPORT_SYMBOL(fw_send_request); |
299 | 310 | ||
300 | void fw_send_stream_packet(struct fw_card *card, struct fw_packet *p, | ||
301 | int generation, int speed, int channel, int sy, int tag, | ||
302 | void *payload, size_t length, fw_packet_callback_t callback) | ||
303 | { | ||
304 | p->callback = callback; | ||
305 | p->header[0] = | ||
306 | HEADER_DATA_LENGTH(length) | ||
307 | | HEADER_TAG(tag) | ||
308 | | HEADER_CHANNEL(channel) | ||
309 | | HEADER_TCODE(TCODE_STREAM_DATA) | ||
310 | | HEADER_SY(sy); | ||
311 | p->header_length = 4; | ||
312 | p->payload = payload; | ||
313 | p->payload_length = length; | ||
314 | p->speed = speed; | ||
315 | p->generation = generation; | ||
316 | p->ack = 0; | ||
317 | |||
318 | card->driver->send_request(card, p); | ||
319 | } | ||
320 | |||
321 | struct transaction_callback_data { | 311 | struct transaction_callback_data { |
322 | struct completion done; | 312 | struct completion done; |
323 | void *payload; | 313 | void *payload; |