linux/drivers/firewire/core-transaction.c
<<
>>
Prefs
   1/*
   2 * Core IEEE1394 transaction logic
   3 *
   4 * Copyright (C) 2004-2006 Kristian Hoegsberg <krh@bitplanet.net>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software Foundation,
  18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  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 * Only valid for transactions that are potentially pending (ie have
 102 * been sent).
 103 */
 104int fw_cancel_transaction(struct fw_card *card,
 105                          struct fw_transaction *transaction)
 106{
 107        /*
 108         * Cancel the packet transmission if it's still queued.  That
 109         * will call the packet transmission callback which cancels
 110         * the transaction.
 111         */
 112
 113        if (card->driver->cancel_packet(card, &transaction->packet) == 0)
 114                return 0;
 115
 116        /*
 117         * If the request packet has already been sent, we need to see
 118         * if the transaction is still pending and remove it in that case.
 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         * At this point cancel_packet will never call the transaction
 144         * callback, since we just took the transaction out of the list.
 145         * So do it here.
 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                 * In this case the ack is really a juju specific
 177                 * rcode, so just forward that to the callback.
 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 * This function provides low-level access to the IEEE1394 transaction
 277 * logic.  Most C programs would use either fw_read(), fw_write() or
 278 * fw_lock() instead - those function are convenience wrappers for
 279 * this function.  The fw_send_request() function is primarily
 280 * provided as a flexible, one-stop entry point for languages bindings
 281 * and protocol bindings.
 282 *
 283 * FIXME: Document this function further, in particular the possible
 284 * values for rcode in the callback.  In short, we map ACK_COMPLETE to
 285 * RCODE_COMPLETE, internal errors set errno and set rcode to
 286 * RCODE_SEND_ERROR (which is out of range for standard ieee1394
 287 * rcodes).  All other rcodes are forwarded unchanged.  For all
 288 * errors, payload is NULL, length is 0.
 289 *
 290 * Can not expect the callback to be called before the function
 291 * returns, though this does happen in some cases (ACK_COMPLETE and
 292 * errors).
 293 *
 294 * The payload is only used for write requests and must not be freed
 295 * until the callback has been called.
 296 *
 297 * @param card the card from which to send the request
 298 * @param tcode the tcode for this transaction.  Do not use
 299 *   TCODE_LOCK_REQUEST directly, instead use TCODE_LOCK_MASK_SWAP
 300 *   etc. to specify tcode and ext_tcode.
 301 * @param node_id the destination node ID (bus ID and PHY ID concatenated)
 302 * @param generation the generation for which node_id is valid
 303 * @param speed the speed to use for sending the request
 304 * @param offset the 48 bit offset on the destination node
 305 * @param payload the data payload for the request subaction
 306 * @param length the length in bytes of the data to read
 307 * @param callback function to be called when the transaction is completed
 308 * @param callback_data pointer to arbitrary data, which will be
 309 *   passed to the callback
 310 *
 311 * In case of asynchronous stream packets i.e. TCODE_STREAM_DATA, the caller
 312 * needs to synthesize @destination_id with fw_stream_packet_destination_id().
 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         * Allocate tlabel from the bitmap and put the transaction on
 324         * the list while holding the card spinlock.
 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        /* FIXME: start this timer later, relative to t->timestamp */
 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 * fw_run_transaction - send request and sleep until transaction is completed
 378 *
 379 * Returns the RCODE.
 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  /*  0  */
 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 * fw_core_add_address_handler - register for incoming requests
 498 * @handler: callback
 499 * @region: region in the IEEE 1212 node space address range
 500 *
 501 * region->start, ->end, and handler->length have to be quadlet-aligned.
 502 *
 503 * When a request is received that falls within the specified address range,
 504 * the specified callback is invoked.  The parameters passed to the callback
 505 * give the details of the particular request.
 506 *
 507 * Return value:  0 on success, non-zero otherwise.
 508 *
 509 * The start offset of the handler's address region is determined by
 510 * fw_core_add_address_handler() and is returned in handler->offset.
 511 *
 512 * Address allocations are exclusive, except for the FCP registers.
 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 * fw_core_remove_address_handler - unregister an address handler
 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        /* unified transaction or broadcast transaction: don't respond */
 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         * FIXME: lookup the fw_node corresponding to the sender of
 745         * this request and pass that to the address handler instead
 746         * of the node ID.  We may also want to move the address
 747         * allocations to fw_node so we only do this callback if the
 748         * upper layers registered it for this node.
 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                /* FIXME: send statically allocated busy packet. */
 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         * FIXME: sanity check packet, is length correct, does tcodes
 861         * and addresses match.
 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                /* Should never happen, this is just to shut up gcc. */
 883                data = NULL;
 884                data_length = 0;
 885                break;
 886        }
 887
 888        del_timer_sync(&t->split_timeout_timer);
 889
 890        /*
 891         * The response handler may be executed while the request handler
 892         * is still pending.  Cancel the request handler.
 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                 * FIXME: these are handled by the OHCI hardware and
 970                 * the stack never sees these request. If we add
 971                 * support for a new type of controller that doesn't
 972                 * handle this in hardware we need to deal with these
 973                 * transactions.
 974                 */
 975                BUG();
 976                break;
 977
 978        case CSR_BUSY_TIMEOUT:
 979                /* FIXME: Implement this. */
 980
 981        case CSR_BUS_TIME:
 982                /* Useless without initialization by the bus manager. */
 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        /* textual descriptor leaf () */
1003        0x00060000,
1004        0x00000000,
1005        0x00000000,
1006        0x4c696e75,             /* L i n u */
1007        0x78204669,             /* x   F i */
1008        0x72657769,             /* r e w i */
1009        0x72650000,             /* r e     */
1010};
1011
1012static const u32 model_textual_descriptor[] = {
1013        /* model descriptor leaf () */
1014        0x00030000,
1015        0x00000000,
1016        0x00000000,
1017        0x4a756a75,             /* J u j u */
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(&registers, &registers_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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.