0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/bug.h>
0009 #include <linux/completion.h>
0010 #include <linux/device.h>
0011 #include <linux/errno.h>
0012 #include <linux/firewire.h>
0013 #include <linux/firewire-constants.h>
0014 #include <linux/fs.h>
0015 #include <linux/init.h>
0016 #include <linux/idr.h>
0017 #include <linux/jiffies.h>
0018 #include <linux/kernel.h>
0019 #include <linux/list.h>
0020 #include <linux/module.h>
0021 #include <linux/rculist.h>
0022 #include <linux/slab.h>
0023 #include <linux/spinlock.h>
0024 #include <linux/string.h>
0025 #include <linux/timer.h>
0026 #include <linux/types.h>
0027 #include <linux/workqueue.h>
0028
0029 #include <asm/byteorder.h>
0030
0031 #include "core.h"
0032
0033 #define HEADER_PRI(pri) ((pri) << 0)
0034 #define HEADER_TCODE(tcode) ((tcode) << 4)
0035 #define HEADER_RETRY(retry) ((retry) << 8)
0036 #define HEADER_TLABEL(tlabel) ((tlabel) << 10)
0037 #define HEADER_DESTINATION(destination) ((destination) << 16)
0038 #define HEADER_SOURCE(source) ((source) << 16)
0039 #define HEADER_RCODE(rcode) ((rcode) << 12)
0040 #define HEADER_OFFSET_HIGH(offset_high) ((offset_high) << 0)
0041 #define HEADER_DATA_LENGTH(length) ((length) << 16)
0042 #define HEADER_EXTENDED_TCODE(tcode) ((tcode) << 0)
0043
0044 #define HEADER_GET_TCODE(q) (((q) >> 4) & 0x0f)
0045 #define HEADER_GET_TLABEL(q) (((q) >> 10) & 0x3f)
0046 #define HEADER_GET_RCODE(q) (((q) >> 12) & 0x0f)
0047 #define HEADER_GET_DESTINATION(q) (((q) >> 16) & 0xffff)
0048 #define HEADER_GET_SOURCE(q) (((q) >> 16) & 0xffff)
0049 #define HEADER_GET_OFFSET_HIGH(q) (((q) >> 0) & 0xffff)
0050 #define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff)
0051 #define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff)
0052
0053 #define HEADER_DESTINATION_IS_BROADCAST(q) \
0054 (((q) & HEADER_DESTINATION(0x3f)) == HEADER_DESTINATION(0x3f))
0055
0056 #define PHY_PACKET_CONFIG 0x0
0057 #define PHY_PACKET_LINK_ON 0x1
0058 #define PHY_PACKET_SELF_ID 0x2
0059
0060 #define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22))
0061 #define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23))
0062 #define PHY_IDENTIFIER(id) ((id) << 30)
0063
0064
0065 static int try_cancel_split_timeout(struct fw_transaction *t)
0066 {
0067 if (t->is_split_transaction)
0068 return del_timer(&t->split_timeout_timer);
0069 else
0070 return 1;
0071 }
0072
0073 static int close_transaction(struct fw_transaction *transaction,
0074 struct fw_card *card, int rcode)
0075 {
0076 struct fw_transaction *t = NULL, *iter;
0077 unsigned long flags;
0078
0079 spin_lock_irqsave(&card->lock, flags);
0080 list_for_each_entry(iter, &card->transaction_list, link) {
0081 if (iter == transaction) {
0082 if (!try_cancel_split_timeout(iter)) {
0083 spin_unlock_irqrestore(&card->lock, flags);
0084 goto timed_out;
0085 }
0086 list_del_init(&iter->link);
0087 card->tlabel_mask &= ~(1ULL << iter->tlabel);
0088 t = iter;
0089 break;
0090 }
0091 }
0092 spin_unlock_irqrestore(&card->lock, flags);
0093
0094 if (t) {
0095 t->callback(card, rcode, NULL, 0, t->callback_data);
0096 return 0;
0097 }
0098
0099 timed_out:
0100 return -ENOENT;
0101 }
0102
0103
0104
0105
0106
0107 int fw_cancel_transaction(struct fw_card *card,
0108 struct fw_transaction *transaction)
0109 {
0110
0111
0112
0113
0114
0115
0116 if (card->driver->cancel_packet(card, &transaction->packet) == 0)
0117 return 0;
0118
0119
0120
0121
0122
0123
0124 return close_transaction(transaction, card, RCODE_CANCELLED);
0125 }
0126 EXPORT_SYMBOL(fw_cancel_transaction);
0127
0128 static void split_transaction_timeout_callback(struct timer_list *timer)
0129 {
0130 struct fw_transaction *t = from_timer(t, timer, split_timeout_timer);
0131 struct fw_card *card = t->card;
0132 unsigned long flags;
0133
0134 spin_lock_irqsave(&card->lock, flags);
0135 if (list_empty(&t->link)) {
0136 spin_unlock_irqrestore(&card->lock, flags);
0137 return;
0138 }
0139 list_del(&t->link);
0140 card->tlabel_mask &= ~(1ULL << t->tlabel);
0141 spin_unlock_irqrestore(&card->lock, flags);
0142
0143 t->callback(card, RCODE_CANCELLED, NULL, 0, t->callback_data);
0144 }
0145
0146 static void start_split_transaction_timeout(struct fw_transaction *t,
0147 struct fw_card *card)
0148 {
0149 unsigned long flags;
0150
0151 spin_lock_irqsave(&card->lock, flags);
0152
0153 if (list_empty(&t->link) || WARN_ON(t->is_split_transaction)) {
0154 spin_unlock_irqrestore(&card->lock, flags);
0155 return;
0156 }
0157
0158 t->is_split_transaction = true;
0159 mod_timer(&t->split_timeout_timer,
0160 jiffies + card->split_timeout_jiffies);
0161
0162 spin_unlock_irqrestore(&card->lock, flags);
0163 }
0164
0165 static void transmit_complete_callback(struct fw_packet *packet,
0166 struct fw_card *card, int status)
0167 {
0168 struct fw_transaction *t =
0169 container_of(packet, struct fw_transaction, packet);
0170
0171 switch (status) {
0172 case ACK_COMPLETE:
0173 close_transaction(t, card, RCODE_COMPLETE);
0174 break;
0175 case ACK_PENDING:
0176 start_split_transaction_timeout(t, card);
0177 break;
0178 case ACK_BUSY_X:
0179 case ACK_BUSY_A:
0180 case ACK_BUSY_B:
0181 close_transaction(t, card, RCODE_BUSY);
0182 break;
0183 case ACK_DATA_ERROR:
0184 close_transaction(t, card, RCODE_DATA_ERROR);
0185 break;
0186 case ACK_TYPE_ERROR:
0187 close_transaction(t, card, RCODE_TYPE_ERROR);
0188 break;
0189 default:
0190
0191
0192
0193
0194 close_transaction(t, card, status);
0195 break;
0196 }
0197 }
0198
0199 static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
0200 int destination_id, int source_id, int generation, int speed,
0201 unsigned long long offset, void *payload, size_t length)
0202 {
0203 int ext_tcode;
0204
0205 if (tcode == TCODE_STREAM_DATA) {
0206 packet->header[0] =
0207 HEADER_DATA_LENGTH(length) |
0208 destination_id |
0209 HEADER_TCODE(TCODE_STREAM_DATA);
0210 packet->header_length = 4;
0211 packet->payload = payload;
0212 packet->payload_length = length;
0213
0214 goto common;
0215 }
0216
0217 if (tcode > 0x10) {
0218 ext_tcode = tcode & ~0x10;
0219 tcode = TCODE_LOCK_REQUEST;
0220 } else
0221 ext_tcode = 0;
0222
0223 packet->header[0] =
0224 HEADER_RETRY(RETRY_X) |
0225 HEADER_TLABEL(tlabel) |
0226 HEADER_TCODE(tcode) |
0227 HEADER_DESTINATION(destination_id);
0228 packet->header[1] =
0229 HEADER_OFFSET_HIGH(offset >> 32) | HEADER_SOURCE(source_id);
0230 packet->header[2] =
0231 offset;
0232
0233 switch (tcode) {
0234 case TCODE_WRITE_QUADLET_REQUEST:
0235 packet->header[3] = *(u32 *)payload;
0236 packet->header_length = 16;
0237 packet->payload_length = 0;
0238 break;
0239
0240 case TCODE_LOCK_REQUEST:
0241 case TCODE_WRITE_BLOCK_REQUEST:
0242 packet->header[3] =
0243 HEADER_DATA_LENGTH(length) |
0244 HEADER_EXTENDED_TCODE(ext_tcode);
0245 packet->header_length = 16;
0246 packet->payload = payload;
0247 packet->payload_length = length;
0248 break;
0249
0250 case TCODE_READ_QUADLET_REQUEST:
0251 packet->header_length = 12;
0252 packet->payload_length = 0;
0253 break;
0254
0255 case TCODE_READ_BLOCK_REQUEST:
0256 packet->header[3] =
0257 HEADER_DATA_LENGTH(length) |
0258 HEADER_EXTENDED_TCODE(ext_tcode);
0259 packet->header_length = 16;
0260 packet->payload_length = 0;
0261 break;
0262
0263 default:
0264 WARN(1, "wrong tcode %d\n", tcode);
0265 }
0266 common:
0267 packet->speed = speed;
0268 packet->generation = generation;
0269 packet->ack = 0;
0270 packet->payload_mapped = false;
0271 }
0272
0273 static int allocate_tlabel(struct fw_card *card)
0274 {
0275 int tlabel;
0276
0277 tlabel = card->current_tlabel;
0278 while (card->tlabel_mask & (1ULL << tlabel)) {
0279 tlabel = (tlabel + 1) & 0x3f;
0280 if (tlabel == card->current_tlabel)
0281 return -EBUSY;
0282 }
0283
0284 card->current_tlabel = (tlabel + 1) & 0x3f;
0285 card->tlabel_mask |= 1ULL << tlabel;
0286
0287 return tlabel;
0288 }
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338 void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
0339 int destination_id, int generation, int speed,
0340 unsigned long long offset, void *payload, size_t length,
0341 fw_transaction_callback_t callback, void *callback_data)
0342 {
0343 unsigned long flags;
0344 int tlabel;
0345
0346
0347
0348
0349
0350
0351 spin_lock_irqsave(&card->lock, flags);
0352
0353 tlabel = allocate_tlabel(card);
0354 if (tlabel < 0) {
0355 spin_unlock_irqrestore(&card->lock, flags);
0356 callback(card, RCODE_SEND_ERROR, NULL, 0, callback_data);
0357 return;
0358 }
0359
0360 t->node_id = destination_id;
0361 t->tlabel = tlabel;
0362 t->card = card;
0363 t->is_split_transaction = false;
0364 timer_setup(&t->split_timeout_timer,
0365 split_transaction_timeout_callback, 0);
0366 t->callback = callback;
0367 t->callback_data = callback_data;
0368
0369 fw_fill_request(&t->packet, tcode, t->tlabel,
0370 destination_id, card->node_id, generation,
0371 speed, offset, payload, length);
0372 t->packet.callback = transmit_complete_callback;
0373
0374 list_add_tail(&t->link, &card->transaction_list);
0375
0376 spin_unlock_irqrestore(&card->lock, flags);
0377
0378 card->driver->send_request(card, &t->packet);
0379 }
0380 EXPORT_SYMBOL(fw_send_request);
0381
0382 struct transaction_callback_data {
0383 struct completion done;
0384 void *payload;
0385 int rcode;
0386 };
0387
0388 static void transaction_callback(struct fw_card *card, int rcode,
0389 void *payload, size_t length, void *data)
0390 {
0391 struct transaction_callback_data *d = data;
0392
0393 if (rcode == RCODE_COMPLETE)
0394 memcpy(d->payload, payload, length);
0395 d->rcode = rcode;
0396 complete(&d->done);
0397 }
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415 int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
0416 int generation, int speed, unsigned long long offset,
0417 void *payload, size_t length)
0418 {
0419 struct transaction_callback_data d;
0420 struct fw_transaction t;
0421
0422 timer_setup_on_stack(&t.split_timeout_timer, NULL, 0);
0423 init_completion(&d.done);
0424 d.payload = payload;
0425 fw_send_request(card, &t, tcode, destination_id, generation, speed,
0426 offset, payload, length, transaction_callback, &d);
0427 wait_for_completion(&d.done);
0428 destroy_timer_on_stack(&t.split_timeout_timer);
0429
0430 return d.rcode;
0431 }
0432 EXPORT_SYMBOL(fw_run_transaction);
0433
0434 static DEFINE_MUTEX(phy_config_mutex);
0435 static DECLARE_COMPLETION(phy_config_done);
0436
0437 static void transmit_phy_packet_callback(struct fw_packet *packet,
0438 struct fw_card *card, int status)
0439 {
0440 complete(&phy_config_done);
0441 }
0442
0443 static struct fw_packet phy_config_packet = {
0444 .header_length = 12,
0445 .header[0] = TCODE_LINK_INTERNAL << 4,
0446 .payload_length = 0,
0447 .speed = SCODE_100,
0448 .callback = transmit_phy_packet_callback,
0449 };
0450
0451 void fw_send_phy_config(struct fw_card *card,
0452 int node_id, int generation, int gap_count)
0453 {
0454 long timeout = DIV_ROUND_UP(HZ, 10);
0455 u32 data = PHY_IDENTIFIER(PHY_PACKET_CONFIG);
0456
0457 if (node_id != FW_PHY_CONFIG_NO_NODE_ID)
0458 data |= PHY_CONFIG_ROOT_ID(node_id);
0459
0460 if (gap_count == FW_PHY_CONFIG_CURRENT_GAP_COUNT) {
0461 gap_count = card->driver->read_phy_reg(card, 1);
0462 if (gap_count < 0)
0463 return;
0464
0465 gap_count &= 63;
0466 if (gap_count == 63)
0467 return;
0468 }
0469 data |= PHY_CONFIG_GAP_COUNT(gap_count);
0470
0471 mutex_lock(&phy_config_mutex);
0472
0473 phy_config_packet.header[1] = data;
0474 phy_config_packet.header[2] = ~data;
0475 phy_config_packet.generation = generation;
0476 reinit_completion(&phy_config_done);
0477
0478 card->driver->send_request(card, &phy_config_packet);
0479 wait_for_completion_timeout(&phy_config_done, timeout);
0480
0481 mutex_unlock(&phy_config_mutex);
0482 }
0483
0484 static struct fw_address_handler *lookup_overlapping_address_handler(
0485 struct list_head *list, unsigned long long offset, size_t length)
0486 {
0487 struct fw_address_handler *handler;
0488
0489 list_for_each_entry_rcu(handler, list, link) {
0490 if (handler->offset < offset + length &&
0491 offset < handler->offset + handler->length)
0492 return handler;
0493 }
0494
0495 return NULL;
0496 }
0497
0498 static bool is_enclosing_handler(struct fw_address_handler *handler,
0499 unsigned long long offset, size_t length)
0500 {
0501 return handler->offset <= offset &&
0502 offset + length <= handler->offset + handler->length;
0503 }
0504
0505 static struct fw_address_handler *lookup_enclosing_address_handler(
0506 struct list_head *list, unsigned long long offset, size_t length)
0507 {
0508 struct fw_address_handler *handler;
0509
0510 list_for_each_entry_rcu(handler, list, link) {
0511 if (is_enclosing_handler(handler, offset, length))
0512 return handler;
0513 }
0514
0515 return NULL;
0516 }
0517
0518 static DEFINE_SPINLOCK(address_handler_list_lock);
0519 static LIST_HEAD(address_handler_list);
0520
0521 const struct fw_address_region fw_high_memory_region =
0522 { .start = FW_MAX_PHYSICAL_RANGE, .end = 0xffffe0000000ULL, };
0523 EXPORT_SYMBOL(fw_high_memory_region);
0524
0525 static const struct fw_address_region low_memory_region =
0526 { .start = 0x000000000000ULL, .end = FW_MAX_PHYSICAL_RANGE, };
0527
0528 #if 0
0529 const struct fw_address_region fw_private_region =
0530 { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, };
0531 const struct fw_address_region fw_csr_region =
0532 { .start = CSR_REGISTER_BASE,
0533 .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM_END, };
0534 const struct fw_address_region fw_unit_space_region =
0535 { .start = 0xfffff0000900ULL, .end = 0x1000000000000ULL, };
0536 #endif
0537
0538 static bool is_in_fcp_region(u64 offset, size_t length)
0539 {
0540 return offset >= (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
0541 offset + length <= (CSR_REGISTER_BASE | CSR_FCP_END);
0542 }
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563 int fw_core_add_address_handler(struct fw_address_handler *handler,
0564 const struct fw_address_region *region)
0565 {
0566 struct fw_address_handler *other;
0567 int ret = -EBUSY;
0568
0569 if (region->start & 0xffff000000000003ULL ||
0570 region->start >= region->end ||
0571 region->end > 0x0001000000000000ULL ||
0572 handler->length & 3 ||
0573 handler->length == 0)
0574 return -EINVAL;
0575
0576 spin_lock(&address_handler_list_lock);
0577
0578 handler->offset = region->start;
0579 while (handler->offset + handler->length <= region->end) {
0580 if (is_in_fcp_region(handler->offset, handler->length))
0581 other = NULL;
0582 else
0583 other = lookup_overlapping_address_handler
0584 (&address_handler_list,
0585 handler->offset, handler->length);
0586 if (other != NULL) {
0587 handler->offset += other->length;
0588 } else {
0589 list_add_tail_rcu(&handler->link, &address_handler_list);
0590 ret = 0;
0591 break;
0592 }
0593 }
0594
0595 spin_unlock(&address_handler_list_lock);
0596
0597 return ret;
0598 }
0599 EXPORT_SYMBOL(fw_core_add_address_handler);
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610 void fw_core_remove_address_handler(struct fw_address_handler *handler)
0611 {
0612 spin_lock(&address_handler_list_lock);
0613 list_del_rcu(&handler->link);
0614 spin_unlock(&address_handler_list_lock);
0615 synchronize_rcu();
0616 }
0617 EXPORT_SYMBOL(fw_core_remove_address_handler);
0618
0619 struct fw_request {
0620 struct fw_packet response;
0621 u32 request_header[4];
0622 int ack;
0623 u32 timestamp;
0624 u32 length;
0625 u32 data[];
0626 };
0627
0628 static void free_response_callback(struct fw_packet *packet,
0629 struct fw_card *card, int status)
0630 {
0631 struct fw_request *request;
0632
0633 request = container_of(packet, struct fw_request, response);
0634 kfree(request);
0635 }
0636
0637 int fw_get_response_length(struct fw_request *r)
0638 {
0639 int tcode, ext_tcode, data_length;
0640
0641 tcode = HEADER_GET_TCODE(r->request_header[0]);
0642
0643 switch (tcode) {
0644 case TCODE_WRITE_QUADLET_REQUEST:
0645 case TCODE_WRITE_BLOCK_REQUEST:
0646 return 0;
0647
0648 case TCODE_READ_QUADLET_REQUEST:
0649 return 4;
0650
0651 case TCODE_READ_BLOCK_REQUEST:
0652 data_length = HEADER_GET_DATA_LENGTH(r->request_header[3]);
0653 return data_length;
0654
0655 case TCODE_LOCK_REQUEST:
0656 ext_tcode = HEADER_GET_EXTENDED_TCODE(r->request_header[3]);
0657 data_length = HEADER_GET_DATA_LENGTH(r->request_header[3]);
0658 switch (ext_tcode) {
0659 case EXTCODE_FETCH_ADD:
0660 case EXTCODE_LITTLE_ADD:
0661 return data_length;
0662 default:
0663 return data_length / 2;
0664 }
0665
0666 default:
0667 WARN(1, "wrong tcode %d\n", tcode);
0668 return 0;
0669 }
0670 }
0671
0672 void fw_fill_response(struct fw_packet *response, u32 *request_header,
0673 int rcode, void *payload, size_t length)
0674 {
0675 int tcode, tlabel, extended_tcode, source, destination;
0676
0677 tcode = HEADER_GET_TCODE(request_header[0]);
0678 tlabel = HEADER_GET_TLABEL(request_header[0]);
0679 source = HEADER_GET_DESTINATION(request_header[0]);
0680 destination = HEADER_GET_SOURCE(request_header[1]);
0681 extended_tcode = HEADER_GET_EXTENDED_TCODE(request_header[3]);
0682
0683 response->header[0] =
0684 HEADER_RETRY(RETRY_1) |
0685 HEADER_TLABEL(tlabel) |
0686 HEADER_DESTINATION(destination);
0687 response->header[1] =
0688 HEADER_SOURCE(source) |
0689 HEADER_RCODE(rcode);
0690 response->header[2] = 0;
0691
0692 switch (tcode) {
0693 case TCODE_WRITE_QUADLET_REQUEST:
0694 case TCODE_WRITE_BLOCK_REQUEST:
0695 response->header[0] |= HEADER_TCODE(TCODE_WRITE_RESPONSE);
0696 response->header_length = 12;
0697 response->payload_length = 0;
0698 break;
0699
0700 case TCODE_READ_QUADLET_REQUEST:
0701 response->header[0] |=
0702 HEADER_TCODE(TCODE_READ_QUADLET_RESPONSE);
0703 if (payload != NULL)
0704 response->header[3] = *(u32 *)payload;
0705 else
0706 response->header[3] = 0;
0707 response->header_length = 16;
0708 response->payload_length = 0;
0709 break;
0710
0711 case TCODE_READ_BLOCK_REQUEST:
0712 case TCODE_LOCK_REQUEST:
0713 response->header[0] |= HEADER_TCODE(tcode + 2);
0714 response->header[3] =
0715 HEADER_DATA_LENGTH(length) |
0716 HEADER_EXTENDED_TCODE(extended_tcode);
0717 response->header_length = 16;
0718 response->payload = payload;
0719 response->payload_length = length;
0720 break;
0721
0722 default:
0723 WARN(1, "wrong tcode %d\n", tcode);
0724 }
0725
0726 response->payload_mapped = false;
0727 }
0728 EXPORT_SYMBOL(fw_fill_response);
0729
0730 static u32 compute_split_timeout_timestamp(struct fw_card *card,
0731 u32 request_timestamp)
0732 {
0733 unsigned int cycles;
0734 u32 timestamp;
0735
0736 cycles = card->split_timeout_cycles;
0737 cycles += request_timestamp & 0x1fff;
0738
0739 timestamp = request_timestamp & ~0x1fff;
0740 timestamp += (cycles / 8000) << 13;
0741 timestamp |= cycles % 8000;
0742
0743 return timestamp;
0744 }
0745
0746 static struct fw_request *allocate_request(struct fw_card *card,
0747 struct fw_packet *p)
0748 {
0749 struct fw_request *request;
0750 u32 *data, length;
0751 int request_tcode;
0752
0753 request_tcode = HEADER_GET_TCODE(p->header[0]);
0754 switch (request_tcode) {
0755 case TCODE_WRITE_QUADLET_REQUEST:
0756 data = &p->header[3];
0757 length = 4;
0758 break;
0759
0760 case TCODE_WRITE_BLOCK_REQUEST:
0761 case TCODE_LOCK_REQUEST:
0762 data = p->payload;
0763 length = HEADER_GET_DATA_LENGTH(p->header[3]);
0764 break;
0765
0766 case TCODE_READ_QUADLET_REQUEST:
0767 data = NULL;
0768 length = 4;
0769 break;
0770
0771 case TCODE_READ_BLOCK_REQUEST:
0772 data = NULL;
0773 length = HEADER_GET_DATA_LENGTH(p->header[3]);
0774 break;
0775
0776 default:
0777 fw_notice(card, "ERROR - corrupt request received - %08x %08x %08x\n",
0778 p->header[0], p->header[1], p->header[2]);
0779 return NULL;
0780 }
0781
0782 request = kmalloc(sizeof(*request) + length, GFP_ATOMIC);
0783 if (request == NULL)
0784 return NULL;
0785
0786 request->response.speed = p->speed;
0787 request->response.timestamp =
0788 compute_split_timeout_timestamp(card, p->timestamp);
0789 request->response.generation = p->generation;
0790 request->response.ack = 0;
0791 request->response.callback = free_response_callback;
0792 request->ack = p->ack;
0793 request->timestamp = p->timestamp;
0794 request->length = length;
0795 if (data)
0796 memcpy(request->data, data, length);
0797
0798 memcpy(request->request_header, p->header, sizeof(p->header));
0799
0800 return request;
0801 }
0802
0803 void fw_send_response(struct fw_card *card,
0804 struct fw_request *request, int rcode)
0805 {
0806 if (WARN_ONCE(!request, "invalid for FCP address handlers"))
0807 return;
0808
0809
0810 if (request->ack != ACK_PENDING ||
0811 HEADER_DESTINATION_IS_BROADCAST(request->request_header[0])) {
0812 kfree(request);
0813 return;
0814 }
0815
0816 if (rcode == RCODE_COMPLETE)
0817 fw_fill_response(&request->response, request->request_header,
0818 rcode, request->data,
0819 fw_get_response_length(request));
0820 else
0821 fw_fill_response(&request->response, request->request_header,
0822 rcode, NULL, 0);
0823
0824 card->driver->send_response(card, &request->response);
0825 }
0826 EXPORT_SYMBOL(fw_send_response);
0827
0828
0829
0830
0831
0832 int fw_get_request_speed(struct fw_request *request)
0833 {
0834 return request->response.speed;
0835 }
0836 EXPORT_SYMBOL(fw_get_request_speed);
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848 u32 fw_request_get_timestamp(const struct fw_request *request)
0849 {
0850 return request->timestamp;
0851 }
0852 EXPORT_SYMBOL_GPL(fw_request_get_timestamp);
0853
0854 static void handle_exclusive_region_request(struct fw_card *card,
0855 struct fw_packet *p,
0856 struct fw_request *request,
0857 unsigned long long offset)
0858 {
0859 struct fw_address_handler *handler;
0860 int tcode, destination, source;
0861
0862 destination = HEADER_GET_DESTINATION(p->header[0]);
0863 source = HEADER_GET_SOURCE(p->header[1]);
0864 tcode = HEADER_GET_TCODE(p->header[0]);
0865 if (tcode == TCODE_LOCK_REQUEST)
0866 tcode = 0x10 + HEADER_GET_EXTENDED_TCODE(p->header[3]);
0867
0868 rcu_read_lock();
0869 handler = lookup_enclosing_address_handler(&address_handler_list,
0870 offset, request->length);
0871 if (handler)
0872 handler->address_callback(card, request,
0873 tcode, destination, source,
0874 p->generation, offset,
0875 request->data, request->length,
0876 handler->callback_data);
0877 rcu_read_unlock();
0878
0879 if (!handler)
0880 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
0881 }
0882
0883 static void handle_fcp_region_request(struct fw_card *card,
0884 struct fw_packet *p,
0885 struct fw_request *request,
0886 unsigned long long offset)
0887 {
0888 struct fw_address_handler *handler;
0889 int tcode, destination, source;
0890
0891 if ((offset != (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
0892 offset != (CSR_REGISTER_BASE | CSR_FCP_RESPONSE)) ||
0893 request->length > 0x200) {
0894 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
0895
0896 return;
0897 }
0898
0899 tcode = HEADER_GET_TCODE(p->header[0]);
0900 destination = HEADER_GET_DESTINATION(p->header[0]);
0901 source = HEADER_GET_SOURCE(p->header[1]);
0902
0903 if (tcode != TCODE_WRITE_QUADLET_REQUEST &&
0904 tcode != TCODE_WRITE_BLOCK_REQUEST) {
0905 fw_send_response(card, request, RCODE_TYPE_ERROR);
0906
0907 return;
0908 }
0909
0910 rcu_read_lock();
0911 list_for_each_entry_rcu(handler, &address_handler_list, link) {
0912 if (is_enclosing_handler(handler, offset, request->length))
0913 handler->address_callback(card, NULL, tcode,
0914 destination, source,
0915 p->generation, offset,
0916 request->data,
0917 request->length,
0918 handler->callback_data);
0919 }
0920 rcu_read_unlock();
0921
0922 fw_send_response(card, request, RCODE_COMPLETE);
0923 }
0924
0925 void fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
0926 {
0927 struct fw_request *request;
0928 unsigned long long offset;
0929
0930 if (p->ack != ACK_PENDING && p->ack != ACK_COMPLETE)
0931 return;
0932
0933 if (TCODE_IS_LINK_INTERNAL(HEADER_GET_TCODE(p->header[0]))) {
0934 fw_cdev_handle_phy_packet(card, p);
0935 return;
0936 }
0937
0938 request = allocate_request(card, p);
0939 if (request == NULL) {
0940
0941 return;
0942 }
0943
0944 offset = ((u64)HEADER_GET_OFFSET_HIGH(p->header[1]) << 32) |
0945 p->header[2];
0946
0947 if (!is_in_fcp_region(offset, request->length))
0948 handle_exclusive_region_request(card, p, request, offset);
0949 else
0950 handle_fcp_region_request(card, p, request, offset);
0951
0952 }
0953 EXPORT_SYMBOL(fw_core_handle_request);
0954
0955 void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
0956 {
0957 struct fw_transaction *t = NULL, *iter;
0958 unsigned long flags;
0959 u32 *data;
0960 size_t data_length;
0961 int tcode, tlabel, source, rcode;
0962
0963 tcode = HEADER_GET_TCODE(p->header[0]);
0964 tlabel = HEADER_GET_TLABEL(p->header[0]);
0965 source = HEADER_GET_SOURCE(p->header[1]);
0966 rcode = HEADER_GET_RCODE(p->header[1]);
0967
0968 spin_lock_irqsave(&card->lock, flags);
0969 list_for_each_entry(iter, &card->transaction_list, link) {
0970 if (iter->node_id == source && iter->tlabel == tlabel) {
0971 if (!try_cancel_split_timeout(iter)) {
0972 spin_unlock_irqrestore(&card->lock, flags);
0973 goto timed_out;
0974 }
0975 list_del_init(&iter->link);
0976 card->tlabel_mask &= ~(1ULL << iter->tlabel);
0977 t = iter;
0978 break;
0979 }
0980 }
0981 spin_unlock_irqrestore(&card->lock, flags);
0982
0983 if (!t) {
0984 timed_out:
0985 fw_notice(card, "unsolicited response (source %x, tlabel %x)\n",
0986 source, tlabel);
0987 return;
0988 }
0989
0990
0991
0992
0993
0994
0995 switch (tcode) {
0996 case TCODE_READ_QUADLET_RESPONSE:
0997 data = (u32 *) &p->header[3];
0998 data_length = 4;
0999 break;
1000
1001 case TCODE_WRITE_RESPONSE:
1002 data = NULL;
1003 data_length = 0;
1004 break;
1005
1006 case TCODE_READ_BLOCK_RESPONSE:
1007 case TCODE_LOCK_RESPONSE:
1008 data = p->payload;
1009 data_length = HEADER_GET_DATA_LENGTH(p->header[3]);
1010 break;
1011
1012 default:
1013
1014 data = NULL;
1015 data_length = 0;
1016 break;
1017 }
1018
1019
1020
1021
1022
1023 card->driver->cancel_packet(card, &t->packet);
1024
1025 t->callback(card, rcode, data, data_length, t->callback_data);
1026 }
1027 EXPORT_SYMBOL(fw_core_handle_response);
1028
1029
1030
1031
1032
1033 const char *fw_rcode_string(int rcode)
1034 {
1035 static const char *const names[] = {
1036 [RCODE_COMPLETE] = "no error",
1037 [RCODE_CONFLICT_ERROR] = "conflict error",
1038 [RCODE_DATA_ERROR] = "data error",
1039 [RCODE_TYPE_ERROR] = "type error",
1040 [RCODE_ADDRESS_ERROR] = "address error",
1041 [RCODE_SEND_ERROR] = "send error",
1042 [RCODE_CANCELLED] = "timeout",
1043 [RCODE_BUSY] = "busy",
1044 [RCODE_GENERATION] = "bus reset",
1045 [RCODE_NO_ACK] = "no ack",
1046 };
1047
1048 if ((unsigned int)rcode < ARRAY_SIZE(names) && names[rcode])
1049 return names[rcode];
1050 else
1051 return "unknown";
1052 }
1053 EXPORT_SYMBOL(fw_rcode_string);
1054
1055 static const struct fw_address_region topology_map_region =
1056 { .start = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP,
1057 .end = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP_END, };
1058
1059 static void handle_topology_map(struct fw_card *card, struct fw_request *request,
1060 int tcode, int destination, int source, int generation,
1061 unsigned long long offset, void *payload, size_t length,
1062 void *callback_data)
1063 {
1064 int start;
1065
1066 if (!TCODE_IS_READ_REQUEST(tcode)) {
1067 fw_send_response(card, request, RCODE_TYPE_ERROR);
1068 return;
1069 }
1070
1071 if ((offset & 3) > 0 || (length & 3) > 0) {
1072 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
1073 return;
1074 }
1075
1076 start = (offset - topology_map_region.start) / 4;
1077 memcpy(payload, &card->topology_map[start], length);
1078
1079 fw_send_response(card, request, RCODE_COMPLETE);
1080 }
1081
1082 static struct fw_address_handler topology_map = {
1083 .length = 0x400,
1084 .address_callback = handle_topology_map,
1085 };
1086
1087 static const struct fw_address_region registers_region =
1088 { .start = CSR_REGISTER_BASE,
1089 .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM, };
1090
1091 static void update_split_timeout(struct fw_card *card)
1092 {
1093 unsigned int cycles;
1094
1095 cycles = card->split_timeout_hi * 8000 + (card->split_timeout_lo >> 19);
1096
1097
1098 cycles = clamp(cycles, 800u, 3u * 8000u);
1099
1100 card->split_timeout_cycles = cycles;
1101 card->split_timeout_jiffies = DIV_ROUND_UP(cycles * HZ, 8000);
1102 }
1103
1104 static void handle_registers(struct fw_card *card, struct fw_request *request,
1105 int tcode, int destination, int source, int generation,
1106 unsigned long long offset, void *payload, size_t length,
1107 void *callback_data)
1108 {
1109 int reg = offset & ~CSR_REGISTER_BASE;
1110 __be32 *data = payload;
1111 int rcode = RCODE_COMPLETE;
1112 unsigned long flags;
1113
1114 switch (reg) {
1115 case CSR_PRIORITY_BUDGET:
1116 if (!card->priority_budget_implemented) {
1117 rcode = RCODE_ADDRESS_ERROR;
1118 break;
1119 }
1120 fallthrough;
1121
1122 case CSR_NODE_IDS:
1123
1124
1125
1126
1127 fallthrough;
1128
1129 case CSR_STATE_CLEAR:
1130 case CSR_STATE_SET:
1131 case CSR_CYCLE_TIME:
1132 case CSR_BUS_TIME:
1133 case CSR_BUSY_TIMEOUT:
1134 if (tcode == TCODE_READ_QUADLET_REQUEST)
1135 *data = cpu_to_be32(card->driver->read_csr(card, reg));
1136 else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1137 card->driver->write_csr(card, reg, be32_to_cpu(*data));
1138 else
1139 rcode = RCODE_TYPE_ERROR;
1140 break;
1141
1142 case CSR_RESET_START:
1143 if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1144 card->driver->write_csr(card, CSR_STATE_CLEAR,
1145 CSR_STATE_BIT_ABDICATE);
1146 else
1147 rcode = RCODE_TYPE_ERROR;
1148 break;
1149
1150 case CSR_SPLIT_TIMEOUT_HI:
1151 if (tcode == TCODE_READ_QUADLET_REQUEST) {
1152 *data = cpu_to_be32(card->split_timeout_hi);
1153 } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
1154 spin_lock_irqsave(&card->lock, flags);
1155 card->split_timeout_hi = be32_to_cpu(*data) & 7;
1156 update_split_timeout(card);
1157 spin_unlock_irqrestore(&card->lock, flags);
1158 } else {
1159 rcode = RCODE_TYPE_ERROR;
1160 }
1161 break;
1162
1163 case CSR_SPLIT_TIMEOUT_LO:
1164 if (tcode == TCODE_READ_QUADLET_REQUEST) {
1165 *data = cpu_to_be32(card->split_timeout_lo);
1166 } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
1167 spin_lock_irqsave(&card->lock, flags);
1168 card->split_timeout_lo =
1169 be32_to_cpu(*data) & 0xfff80000;
1170 update_split_timeout(card);
1171 spin_unlock_irqrestore(&card->lock, flags);
1172 } else {
1173 rcode = RCODE_TYPE_ERROR;
1174 }
1175 break;
1176
1177 case CSR_MAINT_UTILITY:
1178 if (tcode == TCODE_READ_QUADLET_REQUEST)
1179 *data = card->maint_utility_register;
1180 else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1181 card->maint_utility_register = *data;
1182 else
1183 rcode = RCODE_TYPE_ERROR;
1184 break;
1185
1186 case CSR_BROADCAST_CHANNEL:
1187 if (tcode == TCODE_READ_QUADLET_REQUEST)
1188 *data = cpu_to_be32(card->broadcast_channel);
1189 else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1190 card->broadcast_channel =
1191 (be32_to_cpu(*data) & BROADCAST_CHANNEL_VALID) |
1192 BROADCAST_CHANNEL_INITIAL;
1193 else
1194 rcode = RCODE_TYPE_ERROR;
1195 break;
1196
1197 case CSR_BUS_MANAGER_ID:
1198 case CSR_BANDWIDTH_AVAILABLE:
1199 case CSR_CHANNELS_AVAILABLE_HI:
1200 case CSR_CHANNELS_AVAILABLE_LO:
1201
1202
1203
1204
1205
1206
1207
1208 BUG();
1209 break;
1210
1211 default:
1212 rcode = RCODE_ADDRESS_ERROR;
1213 break;
1214 }
1215
1216 fw_send_response(card, request, rcode);
1217 }
1218
1219 static struct fw_address_handler registers = {
1220 .length = 0x400,
1221 .address_callback = handle_registers,
1222 };
1223
1224 static void handle_low_memory(struct fw_card *card, struct fw_request *request,
1225 int tcode, int destination, int source, int generation,
1226 unsigned long long offset, void *payload, size_t length,
1227 void *callback_data)
1228 {
1229
1230
1231
1232
1233 fw_send_response(card, request, RCODE_TYPE_ERROR);
1234 }
1235
1236 static struct fw_address_handler low_memory = {
1237 .length = FW_MAX_PHYSICAL_RANGE,
1238 .address_callback = handle_low_memory,
1239 };
1240
1241 MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
1242 MODULE_DESCRIPTION("Core IEEE1394 transaction logic");
1243 MODULE_LICENSE("GPL");
1244
1245 static const u32 vendor_textual_descriptor[] = {
1246
1247 0x00060000,
1248 0x00000000,
1249 0x00000000,
1250 0x4c696e75,
1251 0x78204669,
1252 0x72657769,
1253 0x72650000,
1254 };
1255
1256 static const u32 model_textual_descriptor[] = {
1257
1258 0x00030000,
1259 0x00000000,
1260 0x00000000,
1261 0x4a756a75,
1262 };
1263
1264 static struct fw_descriptor vendor_id_descriptor = {
1265 .length = ARRAY_SIZE(vendor_textual_descriptor),
1266 .immediate = 0x03001f11,
1267 .key = 0x81000000,
1268 .data = vendor_textual_descriptor,
1269 };
1270
1271 static struct fw_descriptor model_id_descriptor = {
1272 .length = ARRAY_SIZE(model_textual_descriptor),
1273 .immediate = 0x17023901,
1274 .key = 0x81000000,
1275 .data = model_textual_descriptor,
1276 };
1277
1278 static int __init fw_core_init(void)
1279 {
1280 int ret;
1281
1282 fw_workqueue = alloc_workqueue("firewire", WQ_MEM_RECLAIM, 0);
1283 if (!fw_workqueue)
1284 return -ENOMEM;
1285
1286 ret = bus_register(&fw_bus_type);
1287 if (ret < 0) {
1288 destroy_workqueue(fw_workqueue);
1289 return ret;
1290 }
1291
1292 fw_cdev_major = register_chrdev(0, "firewire", &fw_device_ops);
1293 if (fw_cdev_major < 0) {
1294 bus_unregister(&fw_bus_type);
1295 destroy_workqueue(fw_workqueue);
1296 return fw_cdev_major;
1297 }
1298
1299 fw_core_add_address_handler(&topology_map, &topology_map_region);
1300 fw_core_add_address_handler(®isters, ®isters_region);
1301 fw_core_add_address_handler(&low_memory, &low_memory_region);
1302 fw_core_add_descriptor(&vendor_id_descriptor);
1303 fw_core_add_descriptor(&model_id_descriptor);
1304
1305 return 0;
1306 }
1307
1308 static void __exit fw_core_cleanup(void)
1309 {
1310 unregister_chrdev(fw_cdev_major, "firewire");
1311 bus_unregister(&fw_bus_type);
1312 destroy_workqueue(fw_workqueue);
1313 idr_destroy(&fw_device_idr);
1314 }
1315
1316 module_init(fw_core_init);
1317 module_exit(fw_core_cleanup);