1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/bug.h>
22#include <linux/completion.h>
23#include <linux/device.h>
24#include <linux/errno.h>
25#include <linux/firewire.h>
26#include <linux/firewire-constants.h>
27#include <linux/fs.h>
28#include <linux/init.h>
29#include <linux/idr.h>
30#include <linux/jiffies.h>
31#include <linux/kernel.h>
32#include <linux/list.h>
33#include <linux/module.h>
34#include <linux/slab.h>
35#include <linux/spinlock.h>
36#include <linux/string.h>
37#include <linux/timer.h>
38#include <linux/types.h>
39
40#include <asm/byteorder.h>
41
42#include "core.h"
43
44#define HEADER_PRI(pri) ((pri) << 0)
45#define HEADER_TCODE(tcode) ((tcode) << 4)
46#define HEADER_RETRY(retry) ((retry) << 8)
47#define HEADER_TLABEL(tlabel) ((tlabel) << 10)
48#define HEADER_DESTINATION(destination) ((destination) << 16)
49#define HEADER_SOURCE(source) ((source) << 16)
50#define HEADER_RCODE(rcode) ((rcode) << 12)
51#define HEADER_OFFSET_HIGH(offset_high) ((offset_high) << 0)
52#define HEADER_DATA_LENGTH(length) ((length) << 16)
53#define HEADER_EXTENDED_TCODE(tcode) ((tcode) << 0)
54
55#define HEADER_GET_TCODE(q) (((q) >> 4) & 0x0f)
56#define HEADER_GET_TLABEL(q) (((q) >> 10) & 0x3f)
57#define HEADER_GET_RCODE(q) (((q) >> 12) & 0x0f)
58#define HEADER_GET_DESTINATION(q) (((q) >> 16) & 0xffff)
59#define HEADER_GET_SOURCE(q) (((q) >> 16) & 0xffff)
60#define HEADER_GET_OFFSET_HIGH(q) (((q) >> 0) & 0xffff)
61#define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff)
62#define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff)
63
64#define HEADER_DESTINATION_IS_BROADCAST(q) \
65 (((q) & HEADER_DESTINATION(0x3f)) == HEADER_DESTINATION(0x3f))
66
67#define PHY_PACKET_CONFIG 0x0
68#define PHY_PACKET_LINK_ON 0x1
69#define PHY_PACKET_SELF_ID 0x2
70
71#define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22))
72#define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23))
73#define PHY_IDENTIFIER(id) ((id) << 30)
74
75static int close_transaction(struct fw_transaction *transaction,
76 struct fw_card *card, int rcode)
77{
78 struct fw_transaction *t;
79 unsigned long flags;
80
81 spin_lock_irqsave(&card->lock, flags);
82 list_for_each_entry(t, &card->transaction_list, link) {
83 if (t == transaction) {
84 list_del_init(&t->link);
85 card->tlabel_mask &= ~(1ULL << t->tlabel);
86 break;
87 }
88 }
89 spin_unlock_irqrestore(&card->lock, flags);
90
91 if (&t->link != &card->transaction_list) {
92 del_timer_sync(&t->split_timeout_timer);
93 t->callback(card, rcode, NULL, 0, t->callback_data);
94 return 0;
95 }
96
97 return -ENOENT;
98}
99
100
101
102
103
104int fw_cancel_transaction(struct fw_card *card,
105 struct fw_transaction *transaction)
106{
107
108
109
110
111
112
113 if (card->driver->cancel_packet(card, &transaction->packet) == 0)
114 return 0;
115
116
117
118
119
120
121 return close_transaction(transaction, card, RCODE_CANCELLED);
122}
123EXPORT_SYMBOL(fw_cancel_transaction);
124
125static void split_transaction_timeout_callback(unsigned long data)
126{
127 struct fw_transaction *t = (struct fw_transaction *)data;
128 struct fw_card *card = t->card;
129 unsigned long flags;
130
131 spin_lock_irqsave(&card->lock, flags);
132 if (list_empty(&t->link)) {
133 spin_unlock_irqrestore(&card->lock, flags);
134 return;
135 }
136 list_del(&t->link);
137 card->tlabel_mask &= ~(1ULL << t->tlabel);
138 spin_unlock_irqrestore(&card->lock, flags);
139
140 card->driver->cancel_packet(card, &t->packet);
141
142
143
144
145
146
147 t->callback(card, RCODE_CANCELLED, NULL, 0, t->callback_data);
148}
149
150static void transmit_complete_callback(struct fw_packet *packet,
151 struct fw_card *card, int status)
152{
153 struct fw_transaction *t =
154 container_of(packet, struct fw_transaction, packet);
155
156 switch (status) {
157 case ACK_COMPLETE:
158 close_transaction(t, card, RCODE_COMPLETE);
159 break;
160 case ACK_PENDING:
161 t->timestamp = packet->timestamp;
162 break;
163 case ACK_BUSY_X:
164 case ACK_BUSY_A:
165 case ACK_BUSY_B:
166 close_transaction(t, card, RCODE_BUSY);
167 break;
168 case ACK_DATA_ERROR:
169 close_transaction(t, card, RCODE_DATA_ERROR);
170 break;
171 case ACK_TYPE_ERROR:
172 close_transaction(t, card, RCODE_TYPE_ERROR);
173 break;
174 default:
175
176
177
178
179 close_transaction(t, card, status);
180 break;
181 }
182}
183
184static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
185 int destination_id, int source_id, int generation, int speed,
186 unsigned long long offset, void *payload, size_t length)
187{
188 int ext_tcode;
189
190 if (tcode == TCODE_STREAM_DATA) {
191 packet->header[0] =
192 HEADER_DATA_LENGTH(length) |
193 destination_id |
194 HEADER_TCODE(TCODE_STREAM_DATA);
195 packet->header_length = 4;
196 packet->payload = payload;
197 packet->payload_length = length;
198
199 goto common;
200 }
201
202 if (tcode > 0x10) {
203 ext_tcode = tcode & ~0x10;
204 tcode = TCODE_LOCK_REQUEST;
205 } else
206 ext_tcode = 0;
207
208 packet->header[0] =
209 HEADER_RETRY(RETRY_X) |
210 HEADER_TLABEL(tlabel) |
211 HEADER_TCODE(tcode) |
212 HEADER_DESTINATION(destination_id);
213 packet->header[1] =
214 HEADER_OFFSET_HIGH(offset >> 32) | HEADER_SOURCE(source_id);
215 packet->header[2] =
216 offset;
217
218 switch (tcode) {
219 case TCODE_WRITE_QUADLET_REQUEST:
220 packet->header[3] = *(u32 *)payload;
221 packet->header_length = 16;
222 packet->payload_length = 0;
223 break;
224
225 case TCODE_LOCK_REQUEST:
226 case TCODE_WRITE_BLOCK_REQUEST:
227 packet->header[3] =
228 HEADER_DATA_LENGTH(length) |
229 HEADER_EXTENDED_TCODE(ext_tcode);
230 packet->header_length = 16;
231 packet->payload = payload;
232 packet->payload_length = length;
233 break;
234
235 case TCODE_READ_QUADLET_REQUEST:
236 packet->header_length = 12;
237 packet->payload_length = 0;
238 break;
239
240 case TCODE_READ_BLOCK_REQUEST:
241 packet->header[3] =
242 HEADER_DATA_LENGTH(length) |
243 HEADER_EXTENDED_TCODE(ext_tcode);
244 packet->header_length = 16;
245 packet->payload_length = 0;
246 break;
247
248 default:
249 WARN(1, KERN_ERR "wrong tcode %d", tcode);
250 }
251 common:
252 packet->speed = speed;
253 packet->generation = generation;
254 packet->ack = 0;
255 packet->payload_mapped = false;
256}
257
258static int allocate_tlabel(struct fw_card *card)
259{
260 int tlabel;
261
262 tlabel = card->current_tlabel;
263 while (card->tlabel_mask & (1ULL << tlabel)) {
264 tlabel = (tlabel + 1) & 0x3f;
265 if (tlabel == card->current_tlabel)
266 return -EBUSY;
267 }
268
269 card->current_tlabel = (tlabel + 1) & 0x3f;
270 card->tlabel_mask |= 1ULL << tlabel;
271
272 return tlabel;
273}
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
315 int destination_id, int generation, int speed,
316 unsigned long long offset, void *payload, size_t length,
317 fw_transaction_callback_t callback, void *callback_data)
318{
319 unsigned long flags;
320 int tlabel;
321
322
323
324
325
326
327 spin_lock_irqsave(&card->lock, flags);
328
329 tlabel = allocate_tlabel(card);
330 if (tlabel < 0) {
331 spin_unlock_irqrestore(&card->lock, flags);
332 callback(card, RCODE_SEND_ERROR, NULL, 0, callback_data);
333 return;
334 }
335
336 t->node_id = destination_id;
337 t->tlabel = tlabel;
338 t->card = card;
339 setup_timer(&t->split_timeout_timer,
340 split_transaction_timeout_callback, (unsigned long)t);
341
342 mod_timer(&t->split_timeout_timer, jiffies + DIV_ROUND_UP(HZ, 10));
343 t->callback = callback;
344 t->callback_data = callback_data;
345
346 fw_fill_request(&t->packet, tcode, t->tlabel,
347 destination_id, card->node_id, generation,
348 speed, offset, payload, length);
349 t->packet.callback = transmit_complete_callback;
350
351 list_add_tail(&t->link, &card->transaction_list);
352
353 spin_unlock_irqrestore(&card->lock, flags);
354
355 card->driver->send_request(card, &t->packet);
356}
357EXPORT_SYMBOL(fw_send_request);
358
359struct transaction_callback_data {
360 struct completion done;
361 void *payload;
362 int rcode;
363};
364
365static void transaction_callback(struct fw_card *card, int rcode,
366 void *payload, size_t length, void *data)
367{
368 struct transaction_callback_data *d = data;
369
370 if (rcode == RCODE_COMPLETE)
371 memcpy(d->payload, payload, length);
372 d->rcode = rcode;
373 complete(&d->done);
374}
375
376
377
378
379
380
381int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
382 int generation, int speed, unsigned long long offset,
383 void *payload, size_t length)
384{
385 struct transaction_callback_data d;
386 struct fw_transaction t;
387
388 init_timer_on_stack(&t.split_timeout_timer);
389 init_completion(&d.done);
390 d.payload = payload;
391 fw_send_request(card, &t, tcode, destination_id, generation, speed,
392 offset, payload, length, transaction_callback, &d);
393 wait_for_completion(&d.done);
394 destroy_timer_on_stack(&t.split_timeout_timer);
395
396 return d.rcode;
397}
398EXPORT_SYMBOL(fw_run_transaction);
399
400static DEFINE_MUTEX(phy_config_mutex);
401static DECLARE_COMPLETION(phy_config_done);
402
403static void transmit_phy_packet_callback(struct fw_packet *packet,
404 struct fw_card *card, int status)
405{
406 complete(&phy_config_done);
407}
408
409static struct fw_packet phy_config_packet = {
410 .header_length = 8,
411 .payload_length = 0,
412 .speed = SCODE_100,
413 .callback = transmit_phy_packet_callback,
414};
415
416void fw_send_phy_config(struct fw_card *card,
417 int node_id, int generation, int gap_count)
418{
419 long timeout = DIV_ROUND_UP(HZ, 10);
420 u32 data = PHY_IDENTIFIER(PHY_PACKET_CONFIG) |
421 PHY_CONFIG_ROOT_ID(node_id) |
422 PHY_CONFIG_GAP_COUNT(gap_count);
423
424 mutex_lock(&phy_config_mutex);
425
426 phy_config_packet.header[0] = data;
427 phy_config_packet.header[1] = ~data;
428 phy_config_packet.generation = generation;
429 INIT_COMPLETION(phy_config_done);
430
431 card->driver->send_request(card, &phy_config_packet);
432 wait_for_completion_timeout(&phy_config_done, timeout);
433
434 mutex_unlock(&phy_config_mutex);
435}
436
437static struct fw_address_handler *lookup_overlapping_address_handler(
438 struct list_head *list, unsigned long long offset, size_t length)
439{
440 struct fw_address_handler *handler;
441
442 list_for_each_entry(handler, list, link) {
443 if (handler->offset < offset + length &&
444 offset < handler->offset + handler->length)
445 return handler;
446 }
447
448 return NULL;
449}
450
451static bool is_enclosing_handler(struct fw_address_handler *handler,
452 unsigned long long offset, size_t length)
453{
454 return handler->offset <= offset &&
455 offset + length <= handler->offset + handler->length;
456}
457
458static struct fw_address_handler *lookup_enclosing_address_handler(
459 struct list_head *list, unsigned long long offset, size_t length)
460{
461 struct fw_address_handler *handler;
462
463 list_for_each_entry(handler, list, link) {
464 if (is_enclosing_handler(handler, offset, length))
465 return handler;
466 }
467
468 return NULL;
469}
470
471static DEFINE_SPINLOCK(address_handler_lock);
472static LIST_HEAD(address_handler_list);
473
474const struct fw_address_region fw_high_memory_region =
475 { .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, };
476EXPORT_SYMBOL(fw_high_memory_region);
477
478#if 0
479const struct fw_address_region fw_low_memory_region =
480 { .start = 0x000000000000ULL, .end = 0x000100000000ULL, };
481const struct fw_address_region fw_private_region =
482 { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, };
483const struct fw_address_region fw_csr_region =
484 { .start = CSR_REGISTER_BASE,
485 .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM_END, };
486const struct fw_address_region fw_unit_space_region =
487 { .start = 0xfffff0000900ULL, .end = 0x1000000000000ULL, };
488#endif
489
490static bool is_in_fcp_region(u64 offset, size_t length)
491{
492 return offset >= (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
493 offset + length <= (CSR_REGISTER_BASE | CSR_FCP_END);
494}
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514int fw_core_add_address_handler(struct fw_address_handler *handler,
515 const struct fw_address_region *region)
516{
517 struct fw_address_handler *other;
518 unsigned long flags;
519 int ret = -EBUSY;
520
521 if (region->start & 0xffff000000000003ULL ||
522 region->end & 0xffff000000000003ULL ||
523 region->start >= region->end ||
524 handler->length & 3 ||
525 handler->length == 0)
526 return -EINVAL;
527
528 spin_lock_irqsave(&address_handler_lock, flags);
529
530 handler->offset = region->start;
531 while (handler->offset + handler->length <= region->end) {
532 if (is_in_fcp_region(handler->offset, handler->length))
533 other = NULL;
534 else
535 other = lookup_overlapping_address_handler
536 (&address_handler_list,
537 handler->offset, handler->length);
538 if (other != NULL) {
539 handler->offset += other->length;
540 } else {
541 list_add_tail(&handler->link, &address_handler_list);
542 ret = 0;
543 break;
544 }
545 }
546
547 spin_unlock_irqrestore(&address_handler_lock, flags);
548
549 return ret;
550}
551EXPORT_SYMBOL(fw_core_add_address_handler);
552
553
554
555
556void fw_core_remove_address_handler(struct fw_address_handler *handler)
557{
558 unsigned long flags;
559
560 spin_lock_irqsave(&address_handler_lock, flags);
561 list_del(&handler->link);
562 spin_unlock_irqrestore(&address_handler_lock, flags);
563}
564EXPORT_SYMBOL(fw_core_remove_address_handler);
565
566struct fw_request {
567 struct fw_packet response;
568 u32 request_header[4];
569 int ack;
570 u32 length;
571 u32 data[0];
572};
573
574static void free_response_callback(struct fw_packet *packet,
575 struct fw_card *card, int status)
576{
577 struct fw_request *request;
578
579 request = container_of(packet, struct fw_request, response);
580 kfree(request);
581}
582
583void fw_fill_response(struct fw_packet *response, u32 *request_header,
584 int rcode, void *payload, size_t length)
585{
586 int tcode, tlabel, extended_tcode, source, destination;
587
588 tcode = HEADER_GET_TCODE(request_header[0]);
589 tlabel = HEADER_GET_TLABEL(request_header[0]);
590 source = HEADER_GET_DESTINATION(request_header[0]);
591 destination = HEADER_GET_SOURCE(request_header[1]);
592 extended_tcode = HEADER_GET_EXTENDED_TCODE(request_header[3]);
593
594 response->header[0] =
595 HEADER_RETRY(RETRY_1) |
596 HEADER_TLABEL(tlabel) |
597 HEADER_DESTINATION(destination);
598 response->header[1] =
599 HEADER_SOURCE(source) |
600 HEADER_RCODE(rcode);
601 response->header[2] = 0;
602
603 switch (tcode) {
604 case TCODE_WRITE_QUADLET_REQUEST:
605 case TCODE_WRITE_BLOCK_REQUEST:
606 response->header[0] |= HEADER_TCODE(TCODE_WRITE_RESPONSE);
607 response->header_length = 12;
608 response->payload_length = 0;
609 break;
610
611 case TCODE_READ_QUADLET_REQUEST:
612 response->header[0] |=
613 HEADER_TCODE(TCODE_READ_QUADLET_RESPONSE);
614 if (payload != NULL)
615 response->header[3] = *(u32 *)payload;
616 else
617 response->header[3] = 0;
618 response->header_length = 16;
619 response->payload_length = 0;
620 break;
621
622 case TCODE_READ_BLOCK_REQUEST:
623 case TCODE_LOCK_REQUEST:
624 response->header[0] |= HEADER_TCODE(tcode + 2);
625 response->header[3] =
626 HEADER_DATA_LENGTH(length) |
627 HEADER_EXTENDED_TCODE(extended_tcode);
628 response->header_length = 16;
629 response->payload = payload;
630 response->payload_length = length;
631 break;
632
633 default:
634 WARN(1, KERN_ERR "wrong tcode %d", tcode);
635 }
636
637 response->payload_mapped = false;
638}
639EXPORT_SYMBOL(fw_fill_response);
640
641static struct fw_request *allocate_request(struct fw_packet *p)
642{
643 struct fw_request *request;
644 u32 *data, length;
645 int request_tcode, t;
646
647 request_tcode = HEADER_GET_TCODE(p->header[0]);
648 switch (request_tcode) {
649 case TCODE_WRITE_QUADLET_REQUEST:
650 data = &p->header[3];
651 length = 4;
652 break;
653
654 case TCODE_WRITE_BLOCK_REQUEST:
655 case TCODE_LOCK_REQUEST:
656 data = p->payload;
657 length = HEADER_GET_DATA_LENGTH(p->header[3]);
658 break;
659
660 case TCODE_READ_QUADLET_REQUEST:
661 data = NULL;
662 length = 4;
663 break;
664
665 case TCODE_READ_BLOCK_REQUEST:
666 data = NULL;
667 length = HEADER_GET_DATA_LENGTH(p->header[3]);
668 break;
669
670 default:
671 fw_error("ERROR - corrupt request received - %08x %08x %08x\n",
672 p->header[0], p->header[1], p->header[2]);
673 return NULL;
674 }
675
676 request = kmalloc(sizeof(*request) + length, GFP_ATOMIC);
677 if (request == NULL)
678 return NULL;
679
680 t = (p->timestamp & 0x1fff) + 4000;
681 if (t >= 8000)
682 t = (p->timestamp & ~0x1fff) + 0x2000 + t - 8000;
683 else
684 t = (p->timestamp & ~0x1fff) + t;
685
686 request->response.speed = p->speed;
687 request->response.timestamp = t;
688 request->response.generation = p->generation;
689 request->response.ack = 0;
690 request->response.callback = free_response_callback;
691 request->ack = p->ack;
692 request->length = length;
693 if (data)
694 memcpy(request->data, data, length);
695
696 memcpy(request->request_header, p->header, sizeof(p->header));
697
698 return request;
699}
700
701void fw_send_response(struct fw_card *card,
702 struct fw_request *request, int rcode)
703{
704 if (WARN_ONCE(!request, "invalid for FCP address handlers"))
705 return;
706
707
708 if (request->ack != ACK_PENDING ||
709 HEADER_DESTINATION_IS_BROADCAST(request->request_header[0])) {
710 kfree(request);
711 return;
712 }
713
714 if (rcode == RCODE_COMPLETE)
715 fw_fill_response(&request->response, request->request_header,
716 rcode, request->data, request->length);
717 else
718 fw_fill_response(&request->response, request->request_header,
719 rcode, NULL, 0);
720
721 card->driver->send_response(card, &request->response);
722}
723EXPORT_SYMBOL(fw_send_response);
724
725static void handle_exclusive_region_request(struct fw_card *card,
726 struct fw_packet *p,
727 struct fw_request *request,
728 unsigned long long offset)
729{
730 struct fw_address_handler *handler;
731 unsigned long flags;
732 int tcode, destination, source;
733
734 tcode = HEADER_GET_TCODE(p->header[0]);
735 destination = HEADER_GET_DESTINATION(p->header[0]);
736 source = HEADER_GET_SOURCE(p->header[1]);
737
738 spin_lock_irqsave(&address_handler_lock, flags);
739 handler = lookup_enclosing_address_handler(&address_handler_list,
740 offset, request->length);
741 spin_unlock_irqrestore(&address_handler_lock, flags);
742
743
744
745
746
747
748
749
750
751 if (handler == NULL)
752 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
753 else
754 handler->address_callback(card, request,
755 tcode, destination, source,
756 p->generation, p->speed, offset,
757 request->data, request->length,
758 handler->callback_data);
759}
760
761static void handle_fcp_region_request(struct fw_card *card,
762 struct fw_packet *p,
763 struct fw_request *request,
764 unsigned long long offset)
765{
766 struct fw_address_handler *handler;
767 unsigned long flags;
768 int tcode, destination, source;
769
770 if ((offset != (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
771 offset != (CSR_REGISTER_BASE | CSR_FCP_RESPONSE)) ||
772 request->length > 0x200) {
773 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
774
775 return;
776 }
777
778 tcode = HEADER_GET_TCODE(p->header[0]);
779 destination = HEADER_GET_DESTINATION(p->header[0]);
780 source = HEADER_GET_SOURCE(p->header[1]);
781
782 if (tcode != TCODE_WRITE_QUADLET_REQUEST &&
783 tcode != TCODE_WRITE_BLOCK_REQUEST) {
784 fw_send_response(card, request, RCODE_TYPE_ERROR);
785
786 return;
787 }
788
789 spin_lock_irqsave(&address_handler_lock, flags);
790 list_for_each_entry(handler, &address_handler_list, link) {
791 if (is_enclosing_handler(handler, offset, request->length))
792 handler->address_callback(card, NULL, tcode,
793 destination, source,
794 p->generation, p->speed,
795 offset, request->data,
796 request->length,
797 handler->callback_data);
798 }
799 spin_unlock_irqrestore(&address_handler_lock, flags);
800
801 fw_send_response(card, request, RCODE_COMPLETE);
802}
803
804void fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
805{
806 struct fw_request *request;
807 unsigned long long offset;
808
809 if (p->ack != ACK_PENDING && p->ack != ACK_COMPLETE)
810 return;
811
812 request = allocate_request(p);
813 if (request == NULL) {
814
815 return;
816 }
817
818 offset = ((u64)HEADER_GET_OFFSET_HIGH(p->header[1]) << 32) |
819 p->header[2];
820
821 if (!is_in_fcp_region(offset, request->length))
822 handle_exclusive_region_request(card, p, request, offset);
823 else
824 handle_fcp_region_request(card, p, request, offset);
825
826}
827EXPORT_SYMBOL(fw_core_handle_request);
828
829void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
830{
831 struct fw_transaction *t;
832 unsigned long flags;
833 u32 *data;
834 size_t data_length;
835 int tcode, tlabel, destination, source, rcode;
836
837 tcode = HEADER_GET_TCODE(p->header[0]);
838 tlabel = HEADER_GET_TLABEL(p->header[0]);
839 destination = HEADER_GET_DESTINATION(p->header[0]);
840 source = HEADER_GET_SOURCE(p->header[1]);
841 rcode = HEADER_GET_RCODE(p->header[1]);
842
843 spin_lock_irqsave(&card->lock, flags);
844 list_for_each_entry(t, &card->transaction_list, link) {
845 if (t->node_id == source && t->tlabel == tlabel) {
846 list_del_init(&t->link);
847 card->tlabel_mask &= ~(1ULL << t->tlabel);
848 break;
849 }
850 }
851 spin_unlock_irqrestore(&card->lock, flags);
852
853 if (&t->link == &card->transaction_list) {
854 fw_notify("Unsolicited response (source %x, tlabel %x)\n",
855 source, tlabel);
856 return;
857 }
858
859
860
861
862
863
864 switch (tcode) {
865 case TCODE_READ_QUADLET_RESPONSE:
866 data = (u32 *) &p->header[3];
867 data_length = 4;
868 break;
869
870 case TCODE_WRITE_RESPONSE:
871 data = NULL;
872 data_length = 0;
873 break;
874
875 case TCODE_READ_BLOCK_RESPONSE:
876 case TCODE_LOCK_RESPONSE:
877 data = p->payload;
878 data_length = HEADER_GET_DATA_LENGTH(p->header[3]);
879 break;
880
881 default:
882
883 data = NULL;
884 data_length = 0;
885 break;
886 }
887
888 del_timer_sync(&t->split_timeout_timer);
889
890
891
892
893
894 card->driver->cancel_packet(card, &t->packet);
895
896 t->callback(card, rcode, data, data_length, t->callback_data);
897}
898EXPORT_SYMBOL(fw_core_handle_response);
899
900static const struct fw_address_region topology_map_region =
901 { .start = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP,
902 .end = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP_END, };
903
904static void handle_topology_map(struct fw_card *card, struct fw_request *request,
905 int tcode, int destination, int source, int generation,
906 int speed, unsigned long long offset,
907 void *payload, size_t length, void *callback_data)
908{
909 int start;
910
911 if (!TCODE_IS_READ_REQUEST(tcode)) {
912 fw_send_response(card, request, RCODE_TYPE_ERROR);
913 return;
914 }
915
916 if ((offset & 3) > 0 || (length & 3) > 0) {
917 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
918 return;
919 }
920
921 start = (offset - topology_map_region.start) / 4;
922 memcpy(payload, &card->topology_map[start], length);
923
924 fw_send_response(card, request, RCODE_COMPLETE);
925}
926
927static struct fw_address_handler topology_map = {
928 .length = 0x400,
929 .address_callback = handle_topology_map,
930};
931
932static const struct fw_address_region registers_region =
933 { .start = CSR_REGISTER_BASE,
934 .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM, };
935
936static void handle_registers(struct fw_card *card, struct fw_request *request,
937 int tcode, int destination, int source, int generation,
938 int speed, unsigned long long offset,
939 void *payload, size_t length, void *callback_data)
940{
941 int reg = offset & ~CSR_REGISTER_BASE;
942 __be32 *data = payload;
943 int rcode = RCODE_COMPLETE;
944
945 switch (reg) {
946 case CSR_CYCLE_TIME:
947 if (TCODE_IS_READ_REQUEST(tcode) && length == 4)
948 *data = cpu_to_be32(card->driver->get_cycle_time(card));
949 else
950 rcode = RCODE_TYPE_ERROR;
951 break;
952
953 case CSR_BROADCAST_CHANNEL:
954 if (tcode == TCODE_READ_QUADLET_REQUEST)
955 *data = cpu_to_be32(card->broadcast_channel);
956 else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
957 card->broadcast_channel =
958 (be32_to_cpu(*data) & BROADCAST_CHANNEL_VALID) |
959 BROADCAST_CHANNEL_INITIAL;
960 else
961 rcode = RCODE_TYPE_ERROR;
962 break;
963
964 case CSR_BUS_MANAGER_ID:
965 case CSR_BANDWIDTH_AVAILABLE:
966 case CSR_CHANNELS_AVAILABLE_HI:
967 case CSR_CHANNELS_AVAILABLE_LO:
968
969
970
971
972
973
974
975 BUG();
976 break;
977
978 case CSR_BUSY_TIMEOUT:
979
980
981 case CSR_BUS_TIME:
982
983
984 default:
985 rcode = RCODE_ADDRESS_ERROR;
986 break;
987 }
988
989 fw_send_response(card, request, rcode);
990}
991
992static struct fw_address_handler registers = {
993 .length = 0x400,
994 .address_callback = handle_registers,
995};
996
997MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
998MODULE_DESCRIPTION("Core IEEE1394 transaction logic");
999MODULE_LICENSE("GPL");
1000
1001static const u32 vendor_textual_descriptor[] = {
1002
1003 0x00060000,
1004 0x00000000,
1005 0x00000000,
1006 0x4c696e75,
1007 0x78204669,
1008 0x72657769,
1009 0x72650000,
1010};
1011
1012static const u32 model_textual_descriptor[] = {
1013
1014 0x00030000,
1015 0x00000000,
1016 0x00000000,
1017 0x4a756a75,
1018};
1019
1020static struct fw_descriptor vendor_id_descriptor = {
1021 .length = ARRAY_SIZE(vendor_textual_descriptor),
1022 .immediate = 0x03d00d1e,
1023 .key = 0x81000000,
1024 .data = vendor_textual_descriptor,
1025};
1026
1027static struct fw_descriptor model_id_descriptor = {
1028 .length = ARRAY_SIZE(model_textual_descriptor),
1029 .immediate = 0x17000001,
1030 .key = 0x81000000,
1031 .data = model_textual_descriptor,
1032};
1033
1034static int __init fw_core_init(void)
1035{
1036 int ret;
1037
1038 ret = bus_register(&fw_bus_type);
1039 if (ret < 0)
1040 return ret;
1041
1042 fw_cdev_major = register_chrdev(0, "firewire", &fw_device_ops);
1043 if (fw_cdev_major < 0) {
1044 bus_unregister(&fw_bus_type);
1045 return fw_cdev_major;
1046 }
1047
1048 fw_core_add_address_handler(&topology_map, &topology_map_region);
1049 fw_core_add_address_handler(®isters, ®isters_region);
1050 fw_core_add_descriptor(&vendor_id_descriptor);
1051 fw_core_add_descriptor(&model_id_descriptor);
1052
1053 return 0;
1054}
1055
1056static void __exit fw_core_cleanup(void)
1057{
1058 unregister_chrdev(fw_cdev_major, "firewire");
1059 bus_unregister(&fw_bus_type);
1060 idr_destroy(&fw_device_idr);
1061}
1062
1063module_init(fw_core_init);
1064module_exit(fw_core_cleanup);
1065