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/rculist.h>
35#include <linux/slab.h>
36#include <linux/spinlock.h>
37#include <linux/string.h>
38#include <linux/timer.h>
39#include <linux/types.h>
40#include <linux/workqueue.h>
41
42#include <asm/byteorder.h>
43
44#include "core.h"
45
46#define HEADER_PRI(pri) ((pri) << 0)
47#define HEADER_TCODE(tcode) ((tcode) << 4)
48#define HEADER_RETRY(retry) ((retry) << 8)
49#define HEADER_TLABEL(tlabel) ((tlabel) << 10)
50#define HEADER_DESTINATION(destination) ((destination) << 16)
51#define HEADER_SOURCE(source) ((source) << 16)
52#define HEADER_RCODE(rcode) ((rcode) << 12)
53#define HEADER_OFFSET_HIGH(offset_high) ((offset_high) << 0)
54#define HEADER_DATA_LENGTH(length) ((length) << 16)
55#define HEADER_EXTENDED_TCODE(tcode) ((tcode) << 0)
56
57#define HEADER_GET_TCODE(q) (((q) >> 4) & 0x0f)
58#define HEADER_GET_TLABEL(q) (((q) >> 10) & 0x3f)
59#define HEADER_GET_RCODE(q) (((q) >> 12) & 0x0f)
60#define HEADER_GET_DESTINATION(q) (((q) >> 16) & 0xffff)
61#define HEADER_GET_SOURCE(q) (((q) >> 16) & 0xffff)
62#define HEADER_GET_OFFSET_HIGH(q) (((q) >> 0) & 0xffff)
63#define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff)
64#define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff)
65
66#define HEADER_DESTINATION_IS_BROADCAST(q) \
67 (((q) & HEADER_DESTINATION(0x3f)) == HEADER_DESTINATION(0x3f))
68
69#define PHY_PACKET_CONFIG 0x0
70#define PHY_PACKET_LINK_ON 0x1
71#define PHY_PACKET_SELF_ID 0x2
72
73#define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22))
74#define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23))
75#define PHY_IDENTIFIER(id) ((id) << 30)
76
77
78static int try_cancel_split_timeout(struct fw_transaction *t)
79{
80 if (t->is_split_transaction)
81 return del_timer(&t->split_timeout_timer);
82 else
83 return 1;
84}
85
86static int close_transaction(struct fw_transaction *transaction,
87 struct fw_card *card, int rcode)
88{
89 struct fw_transaction *t;
90 unsigned long flags;
91
92 spin_lock_irqsave(&card->lock, flags);
93 list_for_each_entry(t, &card->transaction_list, link) {
94 if (t == transaction) {
95 if (!try_cancel_split_timeout(t)) {
96 spin_unlock_irqrestore(&card->lock, flags);
97 goto timed_out;
98 }
99 list_del_init(&t->link);
100 card->tlabel_mask &= ~(1ULL << t->tlabel);
101 break;
102 }
103 }
104 spin_unlock_irqrestore(&card->lock, flags);
105
106 if (&t->link != &card->transaction_list) {
107 t->callback(card, rcode, NULL, 0, t->callback_data);
108 return 0;
109 }
110
111 timed_out:
112 return -ENOENT;
113}
114
115
116
117
118
119int fw_cancel_transaction(struct fw_card *card,
120 struct fw_transaction *transaction)
121{
122
123
124
125
126
127
128 if (card->driver->cancel_packet(card, &transaction->packet) == 0)
129 return 0;
130
131
132
133
134
135
136 return close_transaction(transaction, card, RCODE_CANCELLED);
137}
138EXPORT_SYMBOL(fw_cancel_transaction);
139
140static void split_transaction_timeout_callback(struct timer_list *timer)
141{
142 struct fw_transaction *t = from_timer(t, timer, split_timeout_timer);
143 struct fw_card *card = t->card;
144 unsigned long flags;
145
146 spin_lock_irqsave(&card->lock, flags);
147 if (list_empty(&t->link)) {
148 spin_unlock_irqrestore(&card->lock, flags);
149 return;
150 }
151 list_del(&t->link);
152 card->tlabel_mask &= ~(1ULL << t->tlabel);
153 spin_unlock_irqrestore(&card->lock, flags);
154
155 t->callback(card, RCODE_CANCELLED, NULL, 0, t->callback_data);
156}
157
158static void start_split_transaction_timeout(struct fw_transaction *t,
159 struct fw_card *card)
160{
161 unsigned long flags;
162
163 spin_lock_irqsave(&card->lock, flags);
164
165 if (list_empty(&t->link) || WARN_ON(t->is_split_transaction)) {
166 spin_unlock_irqrestore(&card->lock, flags);
167 return;
168 }
169
170 t->is_split_transaction = true;
171 mod_timer(&t->split_timeout_timer,
172 jiffies + card->split_timeout_jiffies);
173
174 spin_unlock_irqrestore(&card->lock, flags);
175}
176
177static void transmit_complete_callback(struct fw_packet *packet,
178 struct fw_card *card, int status)
179{
180 struct fw_transaction *t =
181 container_of(packet, struct fw_transaction, packet);
182
183 switch (status) {
184 case ACK_COMPLETE:
185 close_transaction(t, card, RCODE_COMPLETE);
186 break;
187 case ACK_PENDING:
188 start_split_transaction_timeout(t, card);
189 break;
190 case ACK_BUSY_X:
191 case ACK_BUSY_A:
192 case ACK_BUSY_B:
193 close_transaction(t, card, RCODE_BUSY);
194 break;
195 case ACK_DATA_ERROR:
196 close_transaction(t, card, RCODE_DATA_ERROR);
197 break;
198 case ACK_TYPE_ERROR:
199 close_transaction(t, card, RCODE_TYPE_ERROR);
200 break;
201 default:
202
203
204
205
206 close_transaction(t, card, status);
207 break;
208 }
209}
210
211static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
212 int destination_id, int source_id, int generation, int speed,
213 unsigned long long offset, void *payload, size_t length)
214{
215 int ext_tcode;
216
217 if (tcode == TCODE_STREAM_DATA) {
218 packet->header[0] =
219 HEADER_DATA_LENGTH(length) |
220 destination_id |
221 HEADER_TCODE(TCODE_STREAM_DATA);
222 packet->header_length = 4;
223 packet->payload = payload;
224 packet->payload_length = length;
225
226 goto common;
227 }
228
229 if (tcode > 0x10) {
230 ext_tcode = tcode & ~0x10;
231 tcode = TCODE_LOCK_REQUEST;
232 } else
233 ext_tcode = 0;
234
235 packet->header[0] =
236 HEADER_RETRY(RETRY_X) |
237 HEADER_TLABEL(tlabel) |
238 HEADER_TCODE(tcode) |
239 HEADER_DESTINATION(destination_id);
240 packet->header[1] =
241 HEADER_OFFSET_HIGH(offset >> 32) | HEADER_SOURCE(source_id);
242 packet->header[2] =
243 offset;
244
245 switch (tcode) {
246 case TCODE_WRITE_QUADLET_REQUEST:
247 packet->header[3] = *(u32 *)payload;
248 packet->header_length = 16;
249 packet->payload_length = 0;
250 break;
251
252 case TCODE_LOCK_REQUEST:
253 case TCODE_WRITE_BLOCK_REQUEST:
254 packet->header[3] =
255 HEADER_DATA_LENGTH(length) |
256 HEADER_EXTENDED_TCODE(ext_tcode);
257 packet->header_length = 16;
258 packet->payload = payload;
259 packet->payload_length = length;
260 break;
261
262 case TCODE_READ_QUADLET_REQUEST:
263 packet->header_length = 12;
264 packet->payload_length = 0;
265 break;
266
267 case TCODE_READ_BLOCK_REQUEST:
268 packet->header[3] =
269 HEADER_DATA_LENGTH(length) |
270 HEADER_EXTENDED_TCODE(ext_tcode);
271 packet->header_length = 16;
272 packet->payload_length = 0;
273 break;
274
275 default:
276 WARN(1, "wrong tcode %d\n", tcode);
277 }
278 common:
279 packet->speed = speed;
280 packet->generation = generation;
281 packet->ack = 0;
282 packet->payload_mapped = false;
283}
284
285static int allocate_tlabel(struct fw_card *card)
286{
287 int tlabel;
288
289 tlabel = card->current_tlabel;
290 while (card->tlabel_mask & (1ULL << tlabel)) {
291 tlabel = (tlabel + 1) & 0x3f;
292 if (tlabel == card->current_tlabel)
293 return -EBUSY;
294 }
295
296 card->current_tlabel = (tlabel + 1) & 0x3f;
297 card->tlabel_mask |= 1ULL << tlabel;
298
299 return tlabel;
300}
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
351 int destination_id, int generation, int speed,
352 unsigned long long offset, void *payload, size_t length,
353 fw_transaction_callback_t callback, void *callback_data)
354{
355 unsigned long flags;
356 int tlabel;
357
358
359
360
361
362
363 spin_lock_irqsave(&card->lock, flags);
364
365 tlabel = allocate_tlabel(card);
366 if (tlabel < 0) {
367 spin_unlock_irqrestore(&card->lock, flags);
368 callback(card, RCODE_SEND_ERROR, NULL, 0, callback_data);
369 return;
370 }
371
372 t->node_id = destination_id;
373 t->tlabel = tlabel;
374 t->card = card;
375 t->is_split_transaction = false;
376 timer_setup(&t->split_timeout_timer,
377 split_transaction_timeout_callback, 0);
378 t->callback = callback;
379 t->callback_data = callback_data;
380
381 fw_fill_request(&t->packet, tcode, t->tlabel,
382 destination_id, card->node_id, generation,
383 speed, offset, payload, length);
384 t->packet.callback = transmit_complete_callback;
385
386 list_add_tail(&t->link, &card->transaction_list);
387
388 spin_unlock_irqrestore(&card->lock, flags);
389
390 card->driver->send_request(card, &t->packet);
391}
392EXPORT_SYMBOL(fw_send_request);
393
394struct transaction_callback_data {
395 struct completion done;
396 void *payload;
397 int rcode;
398};
399
400static void transaction_callback(struct fw_card *card, int rcode,
401 void *payload, size_t length, void *data)
402{
403 struct transaction_callback_data *d = data;
404
405 if (rcode == RCODE_COMPLETE)
406 memcpy(d->payload, payload, length);
407 d->rcode = rcode;
408 complete(&d->done);
409}
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
428 int generation, int speed, unsigned long long offset,
429 void *payload, size_t length)
430{
431 struct transaction_callback_data d;
432 struct fw_transaction t;
433
434 timer_setup_on_stack(&t.split_timeout_timer, NULL, 0);
435 init_completion(&d.done);
436 d.payload = payload;
437 fw_send_request(card, &t, tcode, destination_id, generation, speed,
438 offset, payload, length, transaction_callback, &d);
439 wait_for_completion(&d.done);
440 destroy_timer_on_stack(&t.split_timeout_timer);
441
442 return d.rcode;
443}
444EXPORT_SYMBOL(fw_run_transaction);
445
446static DEFINE_MUTEX(phy_config_mutex);
447static DECLARE_COMPLETION(phy_config_done);
448
449static void transmit_phy_packet_callback(struct fw_packet *packet,
450 struct fw_card *card, int status)
451{
452 complete(&phy_config_done);
453}
454
455static struct fw_packet phy_config_packet = {
456 .header_length = 12,
457 .header[0] = TCODE_LINK_INTERNAL << 4,
458 .payload_length = 0,
459 .speed = SCODE_100,
460 .callback = transmit_phy_packet_callback,
461};
462
463void fw_send_phy_config(struct fw_card *card,
464 int node_id, int generation, int gap_count)
465{
466 long timeout = DIV_ROUND_UP(HZ, 10);
467 u32 data = PHY_IDENTIFIER(PHY_PACKET_CONFIG);
468
469 if (node_id != FW_PHY_CONFIG_NO_NODE_ID)
470 data |= PHY_CONFIG_ROOT_ID(node_id);
471
472 if (gap_count == FW_PHY_CONFIG_CURRENT_GAP_COUNT) {
473 gap_count = card->driver->read_phy_reg(card, 1);
474 if (gap_count < 0)
475 return;
476
477 gap_count &= 63;
478 if (gap_count == 63)
479 return;
480 }
481 data |= PHY_CONFIG_GAP_COUNT(gap_count);
482
483 mutex_lock(&phy_config_mutex);
484
485 phy_config_packet.header[1] = data;
486 phy_config_packet.header[2] = ~data;
487 phy_config_packet.generation = generation;
488 reinit_completion(&phy_config_done);
489
490 card->driver->send_request(card, &phy_config_packet);
491 wait_for_completion_timeout(&phy_config_done, timeout);
492
493 mutex_unlock(&phy_config_mutex);
494}
495
496static struct fw_address_handler *lookup_overlapping_address_handler(
497 struct list_head *list, unsigned long long offset, size_t length)
498{
499 struct fw_address_handler *handler;
500
501 list_for_each_entry_rcu(handler, list, link) {
502 if (handler->offset < offset + length &&
503 offset < handler->offset + handler->length)
504 return handler;
505 }
506
507 return NULL;
508}
509
510static bool is_enclosing_handler(struct fw_address_handler *handler,
511 unsigned long long offset, size_t length)
512{
513 return handler->offset <= offset &&
514 offset + length <= handler->offset + handler->length;
515}
516
517static struct fw_address_handler *lookup_enclosing_address_handler(
518 struct list_head *list, unsigned long long offset, size_t length)
519{
520 struct fw_address_handler *handler;
521
522 list_for_each_entry_rcu(handler, list, link) {
523 if (is_enclosing_handler(handler, offset, length))
524 return handler;
525 }
526
527 return NULL;
528}
529
530static DEFINE_SPINLOCK(address_handler_list_lock);
531static LIST_HEAD(address_handler_list);
532
533const struct fw_address_region fw_high_memory_region =
534 { .start = FW_MAX_PHYSICAL_RANGE, .end = 0xffffe0000000ULL, };
535EXPORT_SYMBOL(fw_high_memory_region);
536
537static const struct fw_address_region low_memory_region =
538 { .start = 0x000000000000ULL, .end = FW_MAX_PHYSICAL_RANGE, };
539
540#if 0
541const struct fw_address_region fw_private_region =
542 { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, };
543const struct fw_address_region fw_csr_region =
544 { .start = CSR_REGISTER_BASE,
545 .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM_END, };
546const struct fw_address_region fw_unit_space_region =
547 { .start = 0xfffff0000900ULL, .end = 0x1000000000000ULL, };
548#endif
549
550static bool is_in_fcp_region(u64 offset, size_t length)
551{
552 return offset >= (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
553 offset + length <= (CSR_REGISTER_BASE | CSR_FCP_END);
554}
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575int fw_core_add_address_handler(struct fw_address_handler *handler,
576 const struct fw_address_region *region)
577{
578 struct fw_address_handler *other;
579 int ret = -EBUSY;
580
581 if (region->start & 0xffff000000000003ULL ||
582 region->start >= region->end ||
583 region->end > 0x0001000000000000ULL ||
584 handler->length & 3 ||
585 handler->length == 0)
586 return -EINVAL;
587
588 spin_lock(&address_handler_list_lock);
589
590 handler->offset = region->start;
591 while (handler->offset + handler->length <= region->end) {
592 if (is_in_fcp_region(handler->offset, handler->length))
593 other = NULL;
594 else
595 other = lookup_overlapping_address_handler
596 (&address_handler_list,
597 handler->offset, handler->length);
598 if (other != NULL) {
599 handler->offset += other->length;
600 } else {
601 list_add_tail_rcu(&handler->link, &address_handler_list);
602 ret = 0;
603 break;
604 }
605 }
606
607 spin_unlock(&address_handler_list_lock);
608
609 return ret;
610}
611EXPORT_SYMBOL(fw_core_add_address_handler);
612
613
614
615
616
617
618
619
620
621
622void fw_core_remove_address_handler(struct fw_address_handler *handler)
623{
624 spin_lock(&address_handler_list_lock);
625 list_del_rcu(&handler->link);
626 spin_unlock(&address_handler_list_lock);
627 synchronize_rcu();
628}
629EXPORT_SYMBOL(fw_core_remove_address_handler);
630
631struct fw_request {
632 struct fw_packet response;
633 u32 request_header[4];
634 int ack;
635 u32 length;
636 u32 data[0];
637};
638
639static void free_response_callback(struct fw_packet *packet,
640 struct fw_card *card, int status)
641{
642 struct fw_request *request;
643
644 request = container_of(packet, struct fw_request, response);
645 kfree(request);
646}
647
648int fw_get_response_length(struct fw_request *r)
649{
650 int tcode, ext_tcode, data_length;
651
652 tcode = HEADER_GET_TCODE(r->request_header[0]);
653
654 switch (tcode) {
655 case TCODE_WRITE_QUADLET_REQUEST:
656 case TCODE_WRITE_BLOCK_REQUEST:
657 return 0;
658
659 case TCODE_READ_QUADLET_REQUEST:
660 return 4;
661
662 case TCODE_READ_BLOCK_REQUEST:
663 data_length = HEADER_GET_DATA_LENGTH(r->request_header[3]);
664 return data_length;
665
666 case TCODE_LOCK_REQUEST:
667 ext_tcode = HEADER_GET_EXTENDED_TCODE(r->request_header[3]);
668 data_length = HEADER_GET_DATA_LENGTH(r->request_header[3]);
669 switch (ext_tcode) {
670 case EXTCODE_FETCH_ADD:
671 case EXTCODE_LITTLE_ADD:
672 return data_length;
673 default:
674 return data_length / 2;
675 }
676
677 default:
678 WARN(1, "wrong tcode %d\n", tcode);
679 return 0;
680 }
681}
682
683void fw_fill_response(struct fw_packet *response, u32 *request_header,
684 int rcode, void *payload, size_t length)
685{
686 int tcode, tlabel, extended_tcode, source, destination;
687
688 tcode = HEADER_GET_TCODE(request_header[0]);
689 tlabel = HEADER_GET_TLABEL(request_header[0]);
690 source = HEADER_GET_DESTINATION(request_header[0]);
691 destination = HEADER_GET_SOURCE(request_header[1]);
692 extended_tcode = HEADER_GET_EXTENDED_TCODE(request_header[3]);
693
694 response->header[0] =
695 HEADER_RETRY(RETRY_1) |
696 HEADER_TLABEL(tlabel) |
697 HEADER_DESTINATION(destination);
698 response->header[1] =
699 HEADER_SOURCE(source) |
700 HEADER_RCODE(rcode);
701 response->header[2] = 0;
702
703 switch (tcode) {
704 case TCODE_WRITE_QUADLET_REQUEST:
705 case TCODE_WRITE_BLOCK_REQUEST:
706 response->header[0] |= HEADER_TCODE(TCODE_WRITE_RESPONSE);
707 response->header_length = 12;
708 response->payload_length = 0;
709 break;
710
711 case TCODE_READ_QUADLET_REQUEST:
712 response->header[0] |=
713 HEADER_TCODE(TCODE_READ_QUADLET_RESPONSE);
714 if (payload != NULL)
715 response->header[3] = *(u32 *)payload;
716 else
717 response->header[3] = 0;
718 response->header_length = 16;
719 response->payload_length = 0;
720 break;
721
722 case TCODE_READ_BLOCK_REQUEST:
723 case TCODE_LOCK_REQUEST:
724 response->header[0] |= HEADER_TCODE(tcode + 2);
725 response->header[3] =
726 HEADER_DATA_LENGTH(length) |
727 HEADER_EXTENDED_TCODE(extended_tcode);
728 response->header_length = 16;
729 response->payload = payload;
730 response->payload_length = length;
731 break;
732
733 default:
734 WARN(1, "wrong tcode %d\n", tcode);
735 }
736
737 response->payload_mapped = false;
738}
739EXPORT_SYMBOL(fw_fill_response);
740
741static u32 compute_split_timeout_timestamp(struct fw_card *card,
742 u32 request_timestamp)
743{
744 unsigned int cycles;
745 u32 timestamp;
746
747 cycles = card->split_timeout_cycles;
748 cycles += request_timestamp & 0x1fff;
749
750 timestamp = request_timestamp & ~0x1fff;
751 timestamp += (cycles / 8000) << 13;
752 timestamp |= cycles % 8000;
753
754 return timestamp;
755}
756
757static struct fw_request *allocate_request(struct fw_card *card,
758 struct fw_packet *p)
759{
760 struct fw_request *request;
761 u32 *data, length;
762 int request_tcode;
763
764 request_tcode = HEADER_GET_TCODE(p->header[0]);
765 switch (request_tcode) {
766 case TCODE_WRITE_QUADLET_REQUEST:
767 data = &p->header[3];
768 length = 4;
769 break;
770
771 case TCODE_WRITE_BLOCK_REQUEST:
772 case TCODE_LOCK_REQUEST:
773 data = p->payload;
774 length = HEADER_GET_DATA_LENGTH(p->header[3]);
775 break;
776
777 case TCODE_READ_QUADLET_REQUEST:
778 data = NULL;
779 length = 4;
780 break;
781
782 case TCODE_READ_BLOCK_REQUEST:
783 data = NULL;
784 length = HEADER_GET_DATA_LENGTH(p->header[3]);
785 break;
786
787 default:
788 fw_notice(card, "ERROR - corrupt request received - %08x %08x %08x\n",
789 p->header[0], p->header[1], p->header[2]);
790 return NULL;
791 }
792
793 request = kmalloc(sizeof(*request) + length, GFP_ATOMIC);
794 if (request == NULL)
795 return NULL;
796
797 request->response.speed = p->speed;
798 request->response.timestamp =
799 compute_split_timeout_timestamp(card, p->timestamp);
800 request->response.generation = p->generation;
801 request->response.ack = 0;
802 request->response.callback = free_response_callback;
803 request->ack = p->ack;
804 request->length = length;
805 if (data)
806 memcpy(request->data, data, length);
807
808 memcpy(request->request_header, p->header, sizeof(p->header));
809
810 return request;
811}
812
813void fw_send_response(struct fw_card *card,
814 struct fw_request *request, int rcode)
815{
816 if (WARN_ONCE(!request, "invalid for FCP address handlers"))
817 return;
818
819
820 if (request->ack != ACK_PENDING ||
821 HEADER_DESTINATION_IS_BROADCAST(request->request_header[0])) {
822 kfree(request);
823 return;
824 }
825
826 if (rcode == RCODE_COMPLETE)
827 fw_fill_response(&request->response, request->request_header,
828 rcode, request->data,
829 fw_get_response_length(request));
830 else
831 fw_fill_response(&request->response, request->request_header,
832 rcode, NULL, 0);
833
834 card->driver->send_response(card, &request->response);
835}
836EXPORT_SYMBOL(fw_send_response);
837
838
839
840
841
842int fw_get_request_speed(struct fw_request *request)
843{
844 return request->response.speed;
845}
846EXPORT_SYMBOL(fw_get_request_speed);
847
848static void handle_exclusive_region_request(struct fw_card *card,
849 struct fw_packet *p,
850 struct fw_request *request,
851 unsigned long long offset)
852{
853 struct fw_address_handler *handler;
854 int tcode, destination, source;
855
856 destination = HEADER_GET_DESTINATION(p->header[0]);
857 source = HEADER_GET_SOURCE(p->header[1]);
858 tcode = HEADER_GET_TCODE(p->header[0]);
859 if (tcode == TCODE_LOCK_REQUEST)
860 tcode = 0x10 + HEADER_GET_EXTENDED_TCODE(p->header[3]);
861
862 rcu_read_lock();
863 handler = lookup_enclosing_address_handler(&address_handler_list,
864 offset, request->length);
865 if (handler)
866 handler->address_callback(card, request,
867 tcode, destination, source,
868 p->generation, offset,
869 request->data, request->length,
870 handler->callback_data);
871 rcu_read_unlock();
872
873 if (!handler)
874 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
875}
876
877static void handle_fcp_region_request(struct fw_card *card,
878 struct fw_packet *p,
879 struct fw_request *request,
880 unsigned long long offset)
881{
882 struct fw_address_handler *handler;
883 int tcode, destination, source;
884
885 if ((offset != (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
886 offset != (CSR_REGISTER_BASE | CSR_FCP_RESPONSE)) ||
887 request->length > 0x200) {
888 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
889
890 return;
891 }
892
893 tcode = HEADER_GET_TCODE(p->header[0]);
894 destination = HEADER_GET_DESTINATION(p->header[0]);
895 source = HEADER_GET_SOURCE(p->header[1]);
896
897 if (tcode != TCODE_WRITE_QUADLET_REQUEST &&
898 tcode != TCODE_WRITE_BLOCK_REQUEST) {
899 fw_send_response(card, request, RCODE_TYPE_ERROR);
900
901 return;
902 }
903
904 rcu_read_lock();
905 list_for_each_entry_rcu(handler, &address_handler_list, link) {
906 if (is_enclosing_handler(handler, offset, request->length))
907 handler->address_callback(card, NULL, tcode,
908 destination, source,
909 p->generation, offset,
910 request->data,
911 request->length,
912 handler->callback_data);
913 }
914 rcu_read_unlock();
915
916 fw_send_response(card, request, RCODE_COMPLETE);
917}
918
919void fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
920{
921 struct fw_request *request;
922 unsigned long long offset;
923
924 if (p->ack != ACK_PENDING && p->ack != ACK_COMPLETE)
925 return;
926
927 if (TCODE_IS_LINK_INTERNAL(HEADER_GET_TCODE(p->header[0]))) {
928 fw_cdev_handle_phy_packet(card, p);
929 return;
930 }
931
932 request = allocate_request(card, p);
933 if (request == NULL) {
934
935 return;
936 }
937
938 offset = ((u64)HEADER_GET_OFFSET_HIGH(p->header[1]) << 32) |
939 p->header[2];
940
941 if (!is_in_fcp_region(offset, request->length))
942 handle_exclusive_region_request(card, p, request, offset);
943 else
944 handle_fcp_region_request(card, p, request, offset);
945
946}
947EXPORT_SYMBOL(fw_core_handle_request);
948
949void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
950{
951 struct fw_transaction *t;
952 unsigned long flags;
953 u32 *data;
954 size_t data_length;
955 int tcode, tlabel, source, rcode;
956
957 tcode = HEADER_GET_TCODE(p->header[0]);
958 tlabel = HEADER_GET_TLABEL(p->header[0]);
959 source = HEADER_GET_SOURCE(p->header[1]);
960 rcode = HEADER_GET_RCODE(p->header[1]);
961
962 spin_lock_irqsave(&card->lock, flags);
963 list_for_each_entry(t, &card->transaction_list, link) {
964 if (t->node_id == source && t->tlabel == tlabel) {
965 if (!try_cancel_split_timeout(t)) {
966 spin_unlock_irqrestore(&card->lock, flags);
967 goto timed_out;
968 }
969 list_del_init(&t->link);
970 card->tlabel_mask &= ~(1ULL << t->tlabel);
971 break;
972 }
973 }
974 spin_unlock_irqrestore(&card->lock, flags);
975
976 if (&t->link == &card->transaction_list) {
977 timed_out:
978 fw_notice(card, "unsolicited response (source %x, tlabel %x)\n",
979 source, tlabel);
980 return;
981 }
982
983
984
985
986
987
988 switch (tcode) {
989 case TCODE_READ_QUADLET_RESPONSE:
990 data = (u32 *) &p->header[3];
991 data_length = 4;
992 break;
993
994 case TCODE_WRITE_RESPONSE:
995 data = NULL;
996 data_length = 0;
997 break;
998
999 case TCODE_READ_BLOCK_RESPONSE:
1000 case TCODE_LOCK_RESPONSE:
1001 data = p->payload;
1002 data_length = HEADER_GET_DATA_LENGTH(p->header[3]);
1003 break;
1004
1005 default:
1006
1007 data = NULL;
1008 data_length = 0;
1009 break;
1010 }
1011
1012
1013
1014
1015
1016 card->driver->cancel_packet(card, &t->packet);
1017
1018 t->callback(card, rcode, data, data_length, t->callback_data);
1019}
1020EXPORT_SYMBOL(fw_core_handle_response);
1021
1022
1023
1024
1025
1026const char *fw_rcode_string(int rcode)
1027{
1028 static const char *const names[] = {
1029 [RCODE_COMPLETE] = "no error",
1030 [RCODE_CONFLICT_ERROR] = "conflict error",
1031 [RCODE_DATA_ERROR] = "data error",
1032 [RCODE_TYPE_ERROR] = "type error",
1033 [RCODE_ADDRESS_ERROR] = "address error",
1034 [RCODE_SEND_ERROR] = "send error",
1035 [RCODE_CANCELLED] = "timeout",
1036 [RCODE_BUSY] = "busy",
1037 [RCODE_GENERATION] = "bus reset",
1038 [RCODE_NO_ACK] = "no ack",
1039 };
1040
1041 if ((unsigned int)rcode < ARRAY_SIZE(names) && names[rcode])
1042 return names[rcode];
1043 else
1044 return "unknown";
1045}
1046EXPORT_SYMBOL(fw_rcode_string);
1047
1048static const struct fw_address_region topology_map_region =
1049 { .start = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP,
1050 .end = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP_END, };
1051
1052static void handle_topology_map(struct fw_card *card, struct fw_request *request,
1053 int tcode, int destination, int source, int generation,
1054 unsigned long long offset, void *payload, size_t length,
1055 void *callback_data)
1056{
1057 int start;
1058
1059 if (!TCODE_IS_READ_REQUEST(tcode)) {
1060 fw_send_response(card, request, RCODE_TYPE_ERROR);
1061 return;
1062 }
1063
1064 if ((offset & 3) > 0 || (length & 3) > 0) {
1065 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
1066 return;
1067 }
1068
1069 start = (offset - topology_map_region.start) / 4;
1070 memcpy(payload, &card->topology_map[start], length);
1071
1072 fw_send_response(card, request, RCODE_COMPLETE);
1073}
1074
1075static struct fw_address_handler topology_map = {
1076 .length = 0x400,
1077 .address_callback = handle_topology_map,
1078};
1079
1080static const struct fw_address_region registers_region =
1081 { .start = CSR_REGISTER_BASE,
1082 .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM, };
1083
1084static void update_split_timeout(struct fw_card *card)
1085{
1086 unsigned int cycles;
1087
1088 cycles = card->split_timeout_hi * 8000 + (card->split_timeout_lo >> 19);
1089
1090
1091 cycles = clamp(cycles, 800u, 3u * 8000u);
1092
1093 card->split_timeout_cycles = cycles;
1094 card->split_timeout_jiffies = DIV_ROUND_UP(cycles * HZ, 8000);
1095}
1096
1097static void handle_registers(struct fw_card *card, struct fw_request *request,
1098 int tcode, int destination, int source, int generation,
1099 unsigned long long offset, void *payload, size_t length,
1100 void *callback_data)
1101{
1102 int reg = offset & ~CSR_REGISTER_BASE;
1103 __be32 *data = payload;
1104 int rcode = RCODE_COMPLETE;
1105 unsigned long flags;
1106
1107 switch (reg) {
1108 case CSR_PRIORITY_BUDGET:
1109 if (!card->priority_budget_implemented) {
1110 rcode = RCODE_ADDRESS_ERROR;
1111 break;
1112 }
1113
1114
1115 case CSR_NODE_IDS:
1116
1117
1118
1119
1120
1121
1122 case CSR_STATE_CLEAR:
1123 case CSR_STATE_SET:
1124 case CSR_CYCLE_TIME:
1125 case CSR_BUS_TIME:
1126 case CSR_BUSY_TIMEOUT:
1127 if (tcode == TCODE_READ_QUADLET_REQUEST)
1128 *data = cpu_to_be32(card->driver->read_csr(card, reg));
1129 else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1130 card->driver->write_csr(card, reg, be32_to_cpu(*data));
1131 else
1132 rcode = RCODE_TYPE_ERROR;
1133 break;
1134
1135 case CSR_RESET_START:
1136 if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1137 card->driver->write_csr(card, CSR_STATE_CLEAR,
1138 CSR_STATE_BIT_ABDICATE);
1139 else
1140 rcode = RCODE_TYPE_ERROR;
1141 break;
1142
1143 case CSR_SPLIT_TIMEOUT_HI:
1144 if (tcode == TCODE_READ_QUADLET_REQUEST) {
1145 *data = cpu_to_be32(card->split_timeout_hi);
1146 } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
1147 spin_lock_irqsave(&card->lock, flags);
1148 card->split_timeout_hi = be32_to_cpu(*data) & 7;
1149 update_split_timeout(card);
1150 spin_unlock_irqrestore(&card->lock, flags);
1151 } else {
1152 rcode = RCODE_TYPE_ERROR;
1153 }
1154 break;
1155
1156 case CSR_SPLIT_TIMEOUT_LO:
1157 if (tcode == TCODE_READ_QUADLET_REQUEST) {
1158 *data = cpu_to_be32(card->split_timeout_lo);
1159 } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
1160 spin_lock_irqsave(&card->lock, flags);
1161 card->split_timeout_lo =
1162 be32_to_cpu(*data) & 0xfff80000;
1163 update_split_timeout(card);
1164 spin_unlock_irqrestore(&card->lock, flags);
1165 } else {
1166 rcode = RCODE_TYPE_ERROR;
1167 }
1168 break;
1169
1170 case CSR_MAINT_UTILITY:
1171 if (tcode == TCODE_READ_QUADLET_REQUEST)
1172 *data = card->maint_utility_register;
1173 else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1174 card->maint_utility_register = *data;
1175 else
1176 rcode = RCODE_TYPE_ERROR;
1177 break;
1178
1179 case CSR_BROADCAST_CHANNEL:
1180 if (tcode == TCODE_READ_QUADLET_REQUEST)
1181 *data = cpu_to_be32(card->broadcast_channel);
1182 else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1183 card->broadcast_channel =
1184 (be32_to_cpu(*data) & BROADCAST_CHANNEL_VALID) |
1185 BROADCAST_CHANNEL_INITIAL;
1186 else
1187 rcode = RCODE_TYPE_ERROR;
1188 break;
1189
1190 case CSR_BUS_MANAGER_ID:
1191 case CSR_BANDWIDTH_AVAILABLE:
1192 case CSR_CHANNELS_AVAILABLE_HI:
1193 case CSR_CHANNELS_AVAILABLE_LO:
1194
1195
1196
1197
1198
1199
1200
1201 BUG();
1202 break;
1203
1204 default:
1205 rcode = RCODE_ADDRESS_ERROR;
1206 break;
1207 }
1208
1209 fw_send_response(card, request, rcode);
1210}
1211
1212static struct fw_address_handler registers = {
1213 .length = 0x400,
1214 .address_callback = handle_registers,
1215};
1216
1217static void handle_low_memory(struct fw_card *card, struct fw_request *request,
1218 int tcode, int destination, int source, int generation,
1219 unsigned long long offset, void *payload, size_t length,
1220 void *callback_data)
1221{
1222
1223
1224
1225
1226 fw_send_response(card, request, RCODE_TYPE_ERROR);
1227}
1228
1229static struct fw_address_handler low_memory = {
1230 .length = FW_MAX_PHYSICAL_RANGE,
1231 .address_callback = handle_low_memory,
1232};
1233
1234MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
1235MODULE_DESCRIPTION("Core IEEE1394 transaction logic");
1236MODULE_LICENSE("GPL");
1237
1238static const u32 vendor_textual_descriptor[] = {
1239
1240 0x00060000,
1241 0x00000000,
1242 0x00000000,
1243 0x4c696e75,
1244 0x78204669,
1245 0x72657769,
1246 0x72650000,
1247};
1248
1249static const u32 model_textual_descriptor[] = {
1250
1251 0x00030000,
1252 0x00000000,
1253 0x00000000,
1254 0x4a756a75,
1255};
1256
1257static struct fw_descriptor vendor_id_descriptor = {
1258 .length = ARRAY_SIZE(vendor_textual_descriptor),
1259 .immediate = 0x03001f11,
1260 .key = 0x81000000,
1261 .data = vendor_textual_descriptor,
1262};
1263
1264static struct fw_descriptor model_id_descriptor = {
1265 .length = ARRAY_SIZE(model_textual_descriptor),
1266 .immediate = 0x17023901,
1267 .key = 0x81000000,
1268 .data = model_textual_descriptor,
1269};
1270
1271static int __init fw_core_init(void)
1272{
1273 int ret;
1274
1275 fw_workqueue = alloc_workqueue("firewire", WQ_MEM_RECLAIM, 0);
1276 if (!fw_workqueue)
1277 return -ENOMEM;
1278
1279 ret = bus_register(&fw_bus_type);
1280 if (ret < 0) {
1281 destroy_workqueue(fw_workqueue);
1282 return ret;
1283 }
1284
1285 fw_cdev_major = register_chrdev(0, "firewire", &fw_device_ops);
1286 if (fw_cdev_major < 0) {
1287 bus_unregister(&fw_bus_type);
1288 destroy_workqueue(fw_workqueue);
1289 return fw_cdev_major;
1290 }
1291
1292 fw_core_add_address_handler(&topology_map, &topology_map_region);
1293 fw_core_add_address_handler(®isters, ®isters_region);
1294 fw_core_add_address_handler(&low_memory, &low_memory_region);
1295 fw_core_add_descriptor(&vendor_id_descriptor);
1296 fw_core_add_descriptor(&model_id_descriptor);
1297
1298 return 0;
1299}
1300
1301static void __exit fw_core_cleanup(void)
1302{
1303 unregister_chrdev(fw_cdev_major, "firewire");
1304 bus_unregister(&fw_bus_type);
1305 destroy_workqueue(fw_workqueue);
1306 idr_destroy(&fw_device_idr);
1307}
1308
1309module_init(fw_core_init);
1310module_exit(fw_core_cleanup);
1311