core-transaction.c 34.2 KB
Newer Older
1 2
/*
 * Core IEEE1394 transaction logic
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * Copyright (C) 2004-2006 Kristian Hoegsberg <krh@bitplanet.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

S
Stefan Richter 已提交
21
#include <linux/bug.h>
22
#include <linux/completion.h>
S
Stefan Richter 已提交
23 24
#include <linux/device.h>
#include <linux/errno.h>
25
#include <linux/firewire.h>
S
Stefan Richter 已提交
26 27 28
#include <linux/firewire-constants.h>
#include <linux/fs.h>
#include <linux/init.h>
29
#include <linux/idr.h>
S
Stefan Richter 已提交
30
#include <linux/jiffies.h>
31 32
#include <linux/kernel.h>
#include <linux/list.h>
S
Stefan Richter 已提交
33 34 35 36 37 38
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/types.h>
39
#include <linux/workqueue.h>
S
Stefan Richter 已提交
40 41

#include <asm/byteorder.h>
42

43
#include "core.h"
44

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
#define HEADER_PRI(pri)			((pri) << 0)
#define HEADER_TCODE(tcode)		((tcode) << 4)
#define HEADER_RETRY(retry)		((retry) << 8)
#define HEADER_TLABEL(tlabel)		((tlabel) << 10)
#define HEADER_DESTINATION(destination)	((destination) << 16)
#define HEADER_SOURCE(source)		((source) << 16)
#define HEADER_RCODE(rcode)		((rcode) << 12)
#define HEADER_OFFSET_HIGH(offset_high)	((offset_high) << 0)
#define HEADER_DATA_LENGTH(length)	((length) << 16)
#define HEADER_EXTENDED_TCODE(tcode)	((tcode) << 0)

#define HEADER_GET_TCODE(q)		(((q) >> 4) & 0x0f)
#define HEADER_GET_TLABEL(q)		(((q) >> 10) & 0x3f)
#define HEADER_GET_RCODE(q)		(((q) >> 12) & 0x0f)
#define HEADER_GET_DESTINATION(q)	(((q) >> 16) & 0xffff)
#define HEADER_GET_SOURCE(q)		(((q) >> 16) & 0xffff)
#define HEADER_GET_OFFSET_HIGH(q)	(((q) >> 0) & 0xffff)
#define HEADER_GET_DATA_LENGTH(q)	(((q) >> 16) & 0xffff)
#define HEADER_GET_EXTENDED_TCODE(q)	(((q) >> 0) & 0xffff)

65 66 67
#define HEADER_DESTINATION_IS_BROADCAST(q) \
	(((q) & HEADER_DESTINATION(0x3f)) == HEADER_DESTINATION(0x3f))

68 69 70 71
#define PHY_PACKET_CONFIG	0x0
#define PHY_PACKET_LINK_ON	0x1
#define PHY_PACKET_SELF_ID	0x2

72 73 74
#define PHY_CONFIG_GAP_COUNT(gap_count)	(((gap_count) << 16) | (1 << 22))
#define PHY_CONFIG_ROOT_ID(node_id)	((((node_id) & 0x3f) << 24) | (1 << 23))
#define PHY_IDENTIFIER(id)		((id) << 30)
75

76 77 78 79 80 81 82 83 84
/* returns 0 if the split timeout handler is already running */
static int try_cancel_split_timeout(struct fw_transaction *t)
{
	if (t->is_split_transaction)
		return del_timer(&t->split_timeout_timer);
	else
		return 1;
}

85
static int close_transaction(struct fw_transaction *transaction,
86
			     struct fw_card *card, int rcode)
87
{
88
	struct fw_transaction *t;
89 90 91
	unsigned long flags;

	spin_lock_irqsave(&card->lock, flags);
92 93
	list_for_each_entry(t, &card->transaction_list, link) {
		if (t == transaction) {
94
			if (!try_cancel_split_timeout(t)) {
95 96 97
				spin_unlock_irqrestore(&card->lock, flags);
				goto timed_out;
			}
98
			list_del_init(&t->link);
99
			card->tlabel_mask &= ~(1ULL << t->tlabel);
100 101 102
			break;
		}
	}
103 104
	spin_unlock_irqrestore(&card->lock, flags);

105
	if (&t->link != &card->transaction_list) {
106
		t->callback(card, rcode, NULL, 0, t->callback_data);
107 108 109
		return 0;
	}

110
 timed_out:
111
	return -ENOENT;
112 113
}

114 115 116 117
/*
 * Only valid for transactions that are potentially pending (ie have
 * been sent).
 */
118 119
int fw_cancel_transaction(struct fw_card *card,
			  struct fw_transaction *transaction)
120
{
121 122
	/*
	 * Cancel the packet transmission if it's still queued.  That
123
	 * will call the packet transmission callback which cancels
124 125
	 * the transaction.
	 */
126 127 128 129

	if (card->driver->cancel_packet(card, &transaction->packet) == 0)
		return 0;

130 131 132 133
	/*
	 * If the request packet has already been sent, we need to see
	 * if the transaction is still pending and remove it in that case.
	 */
134

135
	return close_transaction(transaction, card, RCODE_CANCELLED);
136 137 138
}
EXPORT_SYMBOL(fw_cancel_transaction);

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
static void split_transaction_timeout_callback(unsigned long data)
{
	struct fw_transaction *t = (struct fw_transaction *)data;
	struct fw_card *card = t->card;
	unsigned long flags;

	spin_lock_irqsave(&card->lock, flags);
	if (list_empty(&t->link)) {
		spin_unlock_irqrestore(&card->lock, flags);
		return;
	}
	list_del(&t->link);
	card->tlabel_mask &= ~(1ULL << t->tlabel);
	spin_unlock_irqrestore(&card->lock, flags);

	t->callback(card, RCODE_CANCELLED, NULL, 0, t->callback_data);
}

157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
static void start_split_transaction_timeout(struct fw_transaction *t,
					    struct fw_card *card)
{
	unsigned long flags;

	spin_lock_irqsave(&card->lock, flags);

	if (list_empty(&t->link) || WARN_ON(t->is_split_transaction)) {
		spin_unlock_irqrestore(&card->lock, flags);
		return;
	}

	t->is_split_transaction = true;
	mod_timer(&t->split_timeout_timer,
		  jiffies + card->split_timeout_jiffies);

	spin_unlock_irqrestore(&card->lock, flags);
}

176 177
static void transmit_complete_callback(struct fw_packet *packet,
				       struct fw_card *card, int status)
178 179 180 181 182 183
{
	struct fw_transaction *t =
	    container_of(packet, struct fw_transaction, packet);

	switch (status) {
	case ACK_COMPLETE:
184
		close_transaction(t, card, RCODE_COMPLETE);
185 186
		break;
	case ACK_PENDING:
187
		start_split_transaction_timeout(t, card);
188 189 190 191
		break;
	case ACK_BUSY_X:
	case ACK_BUSY_A:
	case ACK_BUSY_B:
192
		close_transaction(t, card, RCODE_BUSY);
193 194
		break;
	case ACK_DATA_ERROR:
195
		close_transaction(t, card, RCODE_DATA_ERROR);
196
		break;
197
	case ACK_TYPE_ERROR:
198
		close_transaction(t, card, RCODE_TYPE_ERROR);
199 200
		break;
	default:
201 202 203 204
		/*
		 * In this case the ack is really a juju specific
		 * rcode, so just forward that to the callback.
		 */
205
		close_transaction(t, card, status);
206 207 208 209
		break;
	}
}

210
static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
211
		int destination_id, int source_id, int generation, int speed,
212
		unsigned long long offset, void *payload, size_t length)
213 214 215
{
	int ext_tcode;

216 217 218 219 220 221 222 223 224 225 226 227
	if (tcode == TCODE_STREAM_DATA) {
		packet->header[0] =
			HEADER_DATA_LENGTH(length) |
			destination_id |
			HEADER_TCODE(TCODE_STREAM_DATA);
		packet->header_length = 4;
		packet->payload = payload;
		packet->payload_length = length;

		goto common;
	}

228
	if (tcode > 0x10) {
229
		ext_tcode = tcode & ~0x10;
230 231 232 233 234
		tcode = TCODE_LOCK_REQUEST;
	} else
		ext_tcode = 0;

	packet->header[0] =
235 236 237
		HEADER_RETRY(RETRY_X) |
		HEADER_TLABEL(tlabel) |
		HEADER_TCODE(tcode) |
238
		HEADER_DESTINATION(destination_id);
239
	packet->header[1] =
240
		HEADER_OFFSET_HIGH(offset >> 32) | HEADER_SOURCE(source_id);
241 242 243 244 245 246 247 248 249 250 251 252 253
	packet->header[2] =
		offset;

	switch (tcode) {
	case TCODE_WRITE_QUADLET_REQUEST:
		packet->header[3] = *(u32 *)payload;
		packet->header_length = 16;
		packet->payload_length = 0;
		break;

	case TCODE_LOCK_REQUEST:
	case TCODE_WRITE_BLOCK_REQUEST:
		packet->header[3] =
254 255
			HEADER_DATA_LENGTH(length) |
			HEADER_EXTENDED_TCODE(ext_tcode);
256 257 258 259 260 261 262 263 264 265 266 267
		packet->header_length = 16;
		packet->payload = payload;
		packet->payload_length = length;
		break;

	case TCODE_READ_QUADLET_REQUEST:
		packet->header_length = 12;
		packet->payload_length = 0;
		break;

	case TCODE_READ_BLOCK_REQUEST:
		packet->header[3] =
268 269
			HEADER_DATA_LENGTH(length) |
			HEADER_EXTENDED_TCODE(ext_tcode);
270 271 272
		packet->header_length = 16;
		packet->payload_length = 0;
		break;
273 274

	default:
J
Joe Perches 已提交
275
		WARN(1, "wrong tcode %d\n", tcode);
276
	}
277
 common:
278 279
	packet->speed = speed;
	packet->generation = generation;
280
	packet->ack = 0;
281
	packet->payload_mapped = false;
282 283
}

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
static int allocate_tlabel(struct fw_card *card)
{
	int tlabel;

	tlabel = card->current_tlabel;
	while (card->tlabel_mask & (1ULL << tlabel)) {
		tlabel = (tlabel + 1) & 0x3f;
		if (tlabel == card->current_tlabel)
			return -EBUSY;
	}

	card->current_tlabel = (tlabel + 1) & 0x3f;
	card->tlabel_mask |= 1ULL << tlabel;

	return tlabel;
}

301
/**
302 303 304 305 306 307 308 309 310 311 312 313
 * fw_send_request() - submit a request packet for transmission
 * @card:		interface to send the request at
 * @t:			transaction instance to which the request belongs
 * @tcode:		transaction code
 * @destination_id:	destination node ID, consisting of bus_ID and phy_ID
 * @generation:		bus generation in which request and response are valid
 * @speed:		transmission speed
 * @offset:		48bit wide offset into destination's address space
 * @payload:		data payload for the request subaction
 * @length:		length of the payload, in bytes
 * @callback:		function to be called when the transaction is completed
 * @callback_data:	data to be passed to the transaction completion callback
314
 *
315 316 317
 * Submit a request packet into the asynchronous request transmission queue.
 * Can be called from atomic context.  If you prefer a blocking API, use
 * fw_run_transaction() in a context that can sleep.
318
 *
319 320
 * In case of lock requests, specify one of the firewire-core specific %TCODE_
 * constants instead of %TCODE_LOCK_REQUEST in @tcode.
321
 *
322 323
 * Make sure that the value in @destination_id is not older than the one in
 * @generation.  Otherwise the request is in danger to be sent to a wrong node.
324
 *
325
 * In case of asynchronous stream packets i.e. %TCODE_STREAM_DATA, the caller
326
 * needs to synthesize @destination_id with fw_stream_packet_destination_id().
327 328 329
 * It will contain tag, channel, and sy data instead of a node ID then.
 *
 * The payload buffer at @data is going to be DMA-mapped except in case of
330 331
 * @length <= 8 or of local (loopback) requests.  Hence make sure that the
 * buffer complies with the restrictions of the streaming DMA mapping API.
332 333 334 335 336 337 338
 * @payload must not be freed before the @callback is called.
 *
 * In case of request types without payload, @data is NULL and @length is 0.
 *
 * After the transaction is completed successfully or unsuccessfully, the
 * @callback will be called.  Among its parameters is the response code which
 * is either one of the rcodes per IEEE 1394 or, in case of internal errors,
339 340 341 342
 * the firewire-core specific %RCODE_SEND_ERROR.  The other firewire-core
 * specific rcodes (%RCODE_CANCELLED, %RCODE_BUSY, %RCODE_GENERATION,
 * %RCODE_NO_ACK) denote transaction timeout, busy responder, stale request
 * generation, or missing ACK respectively.
343 344 345 346 347
 *
 * Note some timing corner cases:  fw_send_request() may complete much earlier
 * than when the request packet actually hits the wire.  On the other hand,
 * transaction completion and hence execution of @callback may happen even
 * before fw_send_request() returns.
348
 */
349 350 351 352
void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
		     int destination_id, int generation, int speed,
		     unsigned long long offset, void *payload, size_t length,
		     fw_transaction_callback_t callback, void *callback_data)
353 354
{
	unsigned long flags;
355
	int tlabel;
356

357 358 359 360
	/*
	 * Allocate tlabel from the bitmap and put the transaction on
	 * the list while holding the card spinlock.
	 */
361 362 363

	spin_lock_irqsave(&card->lock, flags);

364 365
	tlabel = allocate_tlabel(card);
	if (tlabel < 0) {
366 367 368 369 370
		spin_unlock_irqrestore(&card->lock, flags);
		callback(card, RCODE_SEND_ERROR, NULL, 0, callback_data);
		return;
	}

J
Jay Fenlason 已提交
371
	t->node_id = destination_id;
372
	t->tlabel = tlabel;
373
	t->card = card;
374
	t->is_split_transaction = false;
375 376
	setup_timer(&t->split_timeout_timer,
		    split_transaction_timeout_callback, (unsigned long)t);
377 378 379
	t->callback = callback;
	t->callback_data = callback_data;

J
Jay Fenlason 已提交
380 381 382
	fw_fill_request(&t->packet, tcode, t->tlabel,
			destination_id, card->node_id, generation,
			speed, offset, payload, length);
383 384
	t->packet.callback = transmit_complete_callback;

385 386 387 388
	list_add_tail(&t->link, &card->transaction_list);

	spin_unlock_irqrestore(&card->lock, flags);

389 390 391 392
	card->driver->send_request(card, &t->packet);
}
EXPORT_SYMBOL(fw_send_request);

J
Jay Fenlason 已提交
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
struct transaction_callback_data {
	struct completion done;
	void *payload;
	int rcode;
};

static void transaction_callback(struct fw_card *card, int rcode,
				 void *payload, size_t length, void *data)
{
	struct transaction_callback_data *d = data;

	if (rcode == RCODE_COMPLETE)
		memcpy(d->payload, payload, length);
	d->rcode = rcode;
	complete(&d->done);
}

/**
411
 * fw_run_transaction() - send request and sleep until transaction is completed
J
Jay Fenlason 已提交
412
 *
413 414
 * Returns the RCODE.  See fw_send_request() for parameter documentation.
 * Unlike fw_send_request(), @data points to the payload of the request or/and
415 416
 * to the payload of the response.  DMA mapping restrictions apply to outbound
 * request payloads of >= 8 bytes but not to inbound response payloads.
J
Jay Fenlason 已提交
417 418
 */
int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
419
		       int generation, int speed, unsigned long long offset,
420
		       void *payload, size_t length)
J
Jay Fenlason 已提交
421 422 423 424
{
	struct transaction_callback_data d;
	struct fw_transaction t;

425
	init_timer_on_stack(&t.split_timeout_timer);
J
Jay Fenlason 已提交
426
	init_completion(&d.done);
427
	d.payload = payload;
J
Jay Fenlason 已提交
428
	fw_send_request(card, &t, tcode, destination_id, generation, speed,
429
			offset, payload, length, transaction_callback, &d);
J
Jay Fenlason 已提交
430
	wait_for_completion(&d.done);
431
	destroy_timer_on_stack(&t.split_timeout_timer);
J
Jay Fenlason 已提交
432 433 434 435 436

	return d.rcode;
}
EXPORT_SYMBOL(fw_run_transaction);

437 438
static DEFINE_MUTEX(phy_config_mutex);
static DECLARE_COMPLETION(phy_config_done);
439 440 441

static void transmit_phy_packet_callback(struct fw_packet *packet,
					 struct fw_card *card, int status)
442
{
443
	complete(&phy_config_done);
444 445
}

446
static struct fw_packet phy_config_packet = {
447 448
	.header_length	= 12,
	.header[0]	= TCODE_LINK_INTERNAL << 4,
449 450 451 452 453
	.payload_length	= 0,
	.speed		= SCODE_100,
	.callback	= transmit_phy_packet_callback,
};

454 455
void fw_send_phy_config(struct fw_card *card,
			int node_id, int generation, int gap_count)
456
{
457
	long timeout = DIV_ROUND_UP(HZ, 10);
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
	u32 data = PHY_IDENTIFIER(PHY_PACKET_CONFIG);

	if (node_id != FW_PHY_CONFIG_NO_NODE_ID)
		data |= PHY_CONFIG_ROOT_ID(node_id);

	if (gap_count == FW_PHY_CONFIG_CURRENT_GAP_COUNT) {
		gap_count = card->driver->read_phy_reg(card, 1);
		if (gap_count < 0)
			return;

		gap_count &= 63;
		if (gap_count == 63)
			return;
	}
	data |= PHY_CONFIG_GAP_COUNT(gap_count);
473

474 475
	mutex_lock(&phy_config_mutex);

476 477
	phy_config_packet.header[1] = data;
	phy_config_packet.header[2] = ~data;
478 479 480 481 482
	phy_config_packet.generation = generation;
	INIT_COMPLETION(phy_config_done);

	card->driver->send_request(card, &phy_config_packet);
	wait_for_completion_timeout(&phy_config_done, timeout);
483

484
	mutex_unlock(&phy_config_mutex);
485 486
}

487 488
static struct fw_address_handler *lookup_overlapping_address_handler(
	struct list_head *list, unsigned long long offset, size_t length)
489 490 491 492 493 494 495 496 497 498 499 500
{
	struct fw_address_handler *handler;

	list_for_each_entry(handler, list, link) {
		if (handler->offset < offset + length &&
		    offset < handler->offset + handler->length)
			return handler;
	}

	return NULL;
}

501 502 503 504 505 506 507
static bool is_enclosing_handler(struct fw_address_handler *handler,
				 unsigned long long offset, size_t length)
{
	return handler->offset <= offset &&
		offset + length <= handler->offset + handler->length;
}

508 509
static struct fw_address_handler *lookup_enclosing_address_handler(
	struct list_head *list, unsigned long long offset, size_t length)
510 511 512 513
{
	struct fw_address_handler *handler;

	list_for_each_entry(handler, list, link) {
514
		if (is_enclosing_handler(handler, offset, length))
515 516 517 518 519 520 521 522 523
			return handler;
	}

	return NULL;
}

static DEFINE_SPINLOCK(address_handler_lock);
static LIST_HEAD(address_handler_list);

524
const struct fw_address_region fw_high_memory_region =
525
	{ .start = 0x000100000000ULL, .end = 0xffffe0000000ULL,  };
A
Adrian Bunk 已提交
526 527 528 529 530
EXPORT_SYMBOL(fw_high_memory_region);

#if 0
const struct fw_address_region fw_low_memory_region =
	{ .start = 0x000000000000ULL, .end = 0x000100000000ULL,  };
531
const struct fw_address_region fw_private_region =
532
	{ .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL,  };
533
const struct fw_address_region fw_csr_region =
534 535
	{ .start = CSR_REGISTER_BASE,
	  .end   = CSR_REGISTER_BASE | CSR_CONFIG_ROM_END,  };
536
const struct fw_address_region fw_unit_space_region =
537
	{ .start = 0xfffff0000900ULL, .end = 0x1000000000000ULL, };
A
Adrian Bunk 已提交
538
#endif  /*  0  */
539

540 541 542 543 544 545
static bool is_in_fcp_region(u64 offset, size_t length)
{
	return offset >= (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
		offset + length <= (CSR_REGISTER_BASE | CSR_FCP_END);
}

546
/**
547 548 549
 * fw_core_add_address_handler() - register for incoming requests
 * @handler:	callback
 * @region:	region in the IEEE 1212 node space address range
550 551 552 553 554 555
 *
 * region->start, ->end, and handler->length have to be quadlet-aligned.
 *
 * When a request is received that falls within the specified address range,
 * the specified callback is invoked.  The parameters passed to the callback
 * give the details of the particular request.
556 557
 *
 * Return value:  0 on success, non-zero otherwise.
558
 *
559 560
 * The start offset of the handler's address region is determined by
 * fw_core_add_address_handler() and is returned in handler->offset.
561 562
 *
 * Address allocations are exclusive, except for the FCP registers.
563
 */
564 565
int fw_core_add_address_handler(struct fw_address_handler *handler,
				const struct fw_address_region *region)
566 567 568 569 570
{
	struct fw_address_handler *other;
	unsigned long flags;
	int ret = -EBUSY;

571 572
	if (region->start & 0xffff000000000003ULL ||
	    region->start >= region->end ||
573
	    region->end   > 0x0001000000000000ULL ||
574 575 576 577
	    handler->length & 3 ||
	    handler->length == 0)
		return -EINVAL;

578 579
	spin_lock_irqsave(&address_handler_lock, flags);

580
	handler->offset = region->start;
581
	while (handler->offset + handler->length <= region->end) {
582 583 584 585 586 587
		if (is_in_fcp_region(handler->offset, handler->length))
			other = NULL;
		else
			other = lookup_overlapping_address_handler
					(&address_handler_list,
					 handler->offset, handler->length);
588
		if (other != NULL) {
589
			handler->offset += other->length;
590 591 592 593 594 595 596 597 598 599 600 601 602 603
		} else {
			list_add_tail(&handler->link, &address_handler_list);
			ret = 0;
			break;
		}
	}

	spin_unlock_irqrestore(&address_handler_lock, flags);

	return ret;
}
EXPORT_SYMBOL(fw_core_add_address_handler);

/**
604
 * fw_core_remove_address_handler() - unregister an address handler
605 606 607 608 609 610 611 612 613 614 615 616 617
 */
void fw_core_remove_address_handler(struct fw_address_handler *handler)
{
	unsigned long flags;

	spin_lock_irqsave(&address_handler_lock, flags);
	list_del(&handler->link);
	spin_unlock_irqrestore(&address_handler_lock, flags);
}
EXPORT_SYMBOL(fw_core_remove_address_handler);

struct fw_request {
	struct fw_packet response;
618
	u32 request_header[4];
619 620 621 622 623
	int ack;
	u32 length;
	u32 data[0];
};

624 625
static void free_response_callback(struct fw_packet *packet,
				   struct fw_card *card, int status)
626 627 628 629 630 631 632
{
	struct fw_request *request;

	request = container_of(packet, struct fw_request, response);
	kfree(request);
}

633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
int fw_get_response_length(struct fw_request *r)
{
	int tcode, ext_tcode, data_length;

	tcode = HEADER_GET_TCODE(r->request_header[0]);

	switch (tcode) {
	case TCODE_WRITE_QUADLET_REQUEST:
	case TCODE_WRITE_BLOCK_REQUEST:
		return 0;

	case TCODE_READ_QUADLET_REQUEST:
		return 4;

	case TCODE_READ_BLOCK_REQUEST:
		data_length = HEADER_GET_DATA_LENGTH(r->request_header[3]);
		return data_length;

	case TCODE_LOCK_REQUEST:
		ext_tcode = HEADER_GET_EXTENDED_TCODE(r->request_header[3]);
		data_length = HEADER_GET_DATA_LENGTH(r->request_header[3]);
		switch (ext_tcode) {
		case EXTCODE_FETCH_ADD:
		case EXTCODE_LITTLE_ADD:
			return data_length;
		default:
			return data_length / 2;
		}

	default:
J
Joe Perches 已提交
663
		WARN(1, "wrong tcode %d\n", tcode);
664 665 666 667
		return 0;
	}
}

668 669
void fw_fill_response(struct fw_packet *response, u32 *request_header,
		      int rcode, void *payload, size_t length)
670 671 672
{
	int tcode, tlabel, extended_tcode, source, destination;

673 674 675 676 677
	tcode          = HEADER_GET_TCODE(request_header[0]);
	tlabel         = HEADER_GET_TLABEL(request_header[0]);
	source         = HEADER_GET_DESTINATION(request_header[0]);
	destination    = HEADER_GET_SOURCE(request_header[1]);
	extended_tcode = HEADER_GET_EXTENDED_TCODE(request_header[3]);
678 679

	response->header[0] =
680 681 682
		HEADER_RETRY(RETRY_1) |
		HEADER_TLABEL(tlabel) |
		HEADER_DESTINATION(destination);
683
	response->header[1] =
684 685
		HEADER_SOURCE(source) |
		HEADER_RCODE(rcode);
686 687 688 689 690
	response->header[2] = 0;

	switch (tcode) {
	case TCODE_WRITE_QUADLET_REQUEST:
	case TCODE_WRITE_BLOCK_REQUEST:
691
		response->header[0] |= HEADER_TCODE(TCODE_WRITE_RESPONSE);
692 693 694 695 696 697
		response->header_length = 12;
		response->payload_length = 0;
		break;

	case TCODE_READ_QUADLET_REQUEST:
		response->header[0] |=
698
			HEADER_TCODE(TCODE_READ_QUADLET_RESPONSE);
699 700 701 702
		if (payload != NULL)
			response->header[3] = *(u32 *)payload;
		else
			response->header[3] = 0;
703 704 705 706 707 708
		response->header_length = 16;
		response->payload_length = 0;
		break;

	case TCODE_READ_BLOCK_REQUEST:
	case TCODE_LOCK_REQUEST:
709
		response->header[0] |= HEADER_TCODE(tcode + 2);
710
		response->header[3] =
711 712
			HEADER_DATA_LENGTH(length) |
			HEADER_EXTENDED_TCODE(extended_tcode);
713
		response->header_length = 16;
714 715
		response->payload = payload;
		response->payload_length = length;
716 717 718
		break;

	default:
J
Joe Perches 已提交
719
		WARN(1, "wrong tcode %d\n", tcode);
720
	}
721

722
	response->payload_mapped = false;
723
}
724
EXPORT_SYMBOL(fw_fill_response);
725

726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
static u32 compute_split_timeout_timestamp(struct fw_card *card,
					   u32 request_timestamp)
{
	unsigned int cycles;
	u32 timestamp;

	cycles = card->split_timeout_cycles;
	cycles += request_timestamp & 0x1fff;

	timestamp = request_timestamp & ~0x1fff;
	timestamp += (cycles / 8000) << 13;
	timestamp |= cycles % 8000;

	return timestamp;
}

static struct fw_request *allocate_request(struct fw_card *card,
					   struct fw_packet *p)
744 745 746
{
	struct fw_request *request;
	u32 *data, length;
747
	int request_tcode;
748

749
	request_tcode = HEADER_GET_TCODE(p->header[0]);
750 751
	switch (request_tcode) {
	case TCODE_WRITE_QUADLET_REQUEST:
752
		data = &p->header[3];
753 754 755 756 757
		length = 4;
		break;

	case TCODE_WRITE_BLOCK_REQUEST:
	case TCODE_LOCK_REQUEST:
758
		data = p->payload;
759
		length = HEADER_GET_DATA_LENGTH(p->header[3]);
760 761 762 763 764 765 766 767 768
		break;

	case TCODE_READ_QUADLET_REQUEST:
		data = NULL;
		length = 4;
		break;

	case TCODE_READ_BLOCK_REQUEST:
		data = NULL;
769
		length = HEADER_GET_DATA_LENGTH(p->header[3]);
770 771 772
		break;

	default:
773 774
		fw_error("ERROR - corrupt request received - %08x %08x %08x\n",
			 p->header[0], p->header[1], p->header[2]);
775 776 777
		return NULL;
	}

778
	request = kmalloc(sizeof(*request) + length, GFP_ATOMIC);
779 780 781
	if (request == NULL)
		return NULL;

782
	request->response.speed = p->speed;
783 784
	request->response.timestamp =
			compute_split_timeout_timestamp(card, p->timestamp);
785
	request->response.generation = p->generation;
786
	request->response.ack = 0;
787
	request->response.callback = free_response_callback;
788
	request->ack = p->ack;
789
	request->length = length;
790
	if (data)
791
		memcpy(request->data, data, length);
792

793
	memcpy(request->request_header, p->header, sizeof(p->header));
794 795 796 797

	return request;
}

798 799
void fw_send_response(struct fw_card *card,
		      struct fw_request *request, int rcode)
800
{
801 802 803
	if (WARN_ONCE(!request, "invalid for FCP address handlers"))
		return;

804 805 806
	/* unified transaction or broadcast transaction: don't respond */
	if (request->ack != ACK_PENDING ||
	    HEADER_DESTINATION_IS_BROADCAST(request->request_header[0])) {
807
		kfree(request);
808
		return;
809
	}
810

811 812
	if (rcode == RCODE_COMPLETE)
		fw_fill_response(&request->response, request->request_header,
813 814
				 rcode, request->data,
				 fw_get_response_length(request));
815 816 817
	else
		fw_fill_response(&request->response, request->request_header,
				 rcode, NULL, 0);
818 819 820 821 822

	card->driver->send_response(card, &request->response);
}
EXPORT_SYMBOL(fw_send_response);

823 824 825 826
static void handle_exclusive_region_request(struct fw_card *card,
					    struct fw_packet *p,
					    struct fw_request *request,
					    unsigned long long offset)
827 828 829
{
	struct fw_address_handler *handler;
	unsigned long flags;
830
	int tcode, destination, source;
831

832
	destination = HEADER_GET_DESTINATION(p->header[0]);
833
	source      = HEADER_GET_SOURCE(p->header[1]);
834 835 836
	tcode       = HEADER_GET_TCODE(p->header[0]);
	if (tcode == TCODE_LOCK_REQUEST)
		tcode = 0x10 + HEADER_GET_EXTENDED_TCODE(p->header[3]);
837 838 839 840 841 842

	spin_lock_irqsave(&address_handler_lock, flags);
	handler = lookup_enclosing_address_handler(&address_handler_list,
						   offset, request->length);
	spin_unlock_irqrestore(&address_handler_lock, flags);

843 844
	/*
	 * FIXME: lookup the fw_node corresponding to the sender of
845 846 847
	 * this request and pass that to the address handler instead
	 * of the node ID.  We may also want to move the address
	 * allocations to fw_node so we only do this callback if the
848 849
	 * upper layers registered it for this node.
	 */
850 851 852 853 854 855

	if (handler == NULL)
		fw_send_response(card, request, RCODE_ADDRESS_ERROR);
	else
		handler->address_callback(card, request,
					  tcode, destination, source,
856
					  p->generation, offset,
857 858 859
					  request->data, request->length,
					  handler->callback_data);
}
860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893

static void handle_fcp_region_request(struct fw_card *card,
				      struct fw_packet *p,
				      struct fw_request *request,
				      unsigned long long offset)
{
	struct fw_address_handler *handler;
	unsigned long flags;
	int tcode, destination, source;

	if ((offset != (CSR_REGISTER_BASE | CSR_FCP_COMMAND) &&
	     offset != (CSR_REGISTER_BASE | CSR_FCP_RESPONSE)) ||
	    request->length > 0x200) {
		fw_send_response(card, request, RCODE_ADDRESS_ERROR);

		return;
	}

	tcode       = HEADER_GET_TCODE(p->header[0]);
	destination = HEADER_GET_DESTINATION(p->header[0]);
	source      = HEADER_GET_SOURCE(p->header[1]);

	if (tcode != TCODE_WRITE_QUADLET_REQUEST &&
	    tcode != TCODE_WRITE_BLOCK_REQUEST) {
		fw_send_response(card, request, RCODE_TYPE_ERROR);

		return;
	}

	spin_lock_irqsave(&address_handler_lock, flags);
	list_for_each_entry(handler, &address_handler_list, link) {
		if (is_enclosing_handler(handler, offset, request->length))
			handler->address_callback(card, NULL, tcode,
						  destination, source,
894 895
						  p->generation, offset,
						  request->data,
896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911
						  request->length,
						  handler->callback_data);
	}
	spin_unlock_irqrestore(&address_handler_lock, flags);

	fw_send_response(card, request, RCODE_COMPLETE);
}

void fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
{
	struct fw_request *request;
	unsigned long long offset;

	if (p->ack != ACK_PENDING && p->ack != ACK_COMPLETE)
		return;

912 913 914 915 916
	if (TCODE_IS_LINK_INTERNAL(HEADER_GET_TCODE(p->header[0]))) {
		fw_cdev_handle_phy_packet(card, p);
		return;
	}

917
	request = allocate_request(card, p);
918 919 920 921 922 923 924 925 926 927 928 929 930 931
	if (request == NULL) {
		/* FIXME: send statically allocated busy packet. */
		return;
	}

	offset = ((u64)HEADER_GET_OFFSET_HIGH(p->header[1]) << 32) |
		p->header[2];

	if (!is_in_fcp_region(offset, request->length))
		handle_exclusive_region_request(card, p, request, offset);
	else
		handle_fcp_region_request(card, p, request, offset);

}
932 933
EXPORT_SYMBOL(fw_core_handle_request);

934
void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
935 936 937 938 939
{
	struct fw_transaction *t;
	unsigned long flags;
	u32 *data;
	size_t data_length;
940
	int tcode, tlabel, source, rcode;
941

942 943 944 945
	tcode	= HEADER_GET_TCODE(p->header[0]);
	tlabel	= HEADER_GET_TLABEL(p->header[0]);
	source	= HEADER_GET_SOURCE(p->header[1]);
	rcode	= HEADER_GET_RCODE(p->header[1]);
946 947 948 949

	spin_lock_irqsave(&card->lock, flags);
	list_for_each_entry(t, &card->transaction_list, link) {
		if (t->node_id == source && t->tlabel == tlabel) {
950
			if (!try_cancel_split_timeout(t)) {
951 952 953
				spin_unlock_irqrestore(&card->lock, flags);
				goto timed_out;
			}
954
			list_del_init(&t->link);
955
			card->tlabel_mask &= ~(1ULL << t->tlabel);
956 957 958 959 960 961
			break;
		}
	}
	spin_unlock_irqrestore(&card->lock, flags);

	if (&t->link == &card->transaction_list) {
962
 timed_out:
963 964
		fw_notify("Unsolicited response (source %x, tlabel %x)\n",
			  source, tlabel);
965 966 967
		return;
	}

968 969 970 971
	/*
	 * FIXME: sanity check packet, is length correct, does tcodes
	 * and addresses match.
	 */
972 973 974

	switch (tcode) {
	case TCODE_READ_QUADLET_RESPONSE:
975
		data = (u32 *) &p->header[3];
976 977 978 979 980 981 982 983 984 985
		data_length = 4;
		break;

	case TCODE_WRITE_RESPONSE:
		data = NULL;
		data_length = 0;
		break;

	case TCODE_READ_BLOCK_RESPONSE:
	case TCODE_LOCK_RESPONSE:
986
		data = p->payload;
987
		data_length = HEADER_GET_DATA_LENGTH(p->header[3]);
988 989 990 991 992 993 994 995 996
		break;

	default:
		/* Should never happen, this is just to shut up gcc. */
		data = NULL;
		data_length = 0;
		break;
	}

997 998 999 1000 1001 1002
	/*
	 * The response handler may be executed while the request handler
	 * is still pending.  Cancel the request handler.
	 */
	card->driver->cancel_packet(card, &t->packet);

1003 1004 1005 1006
	t->callback(card, rcode, data, data_length, t->callback_data);
}
EXPORT_SYMBOL(fw_core_handle_response);

1007
static const struct fw_address_region topology_map_region =
1008 1009
	{ .start = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP,
	  .end   = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP_END, };
1010

1011 1012
static void handle_topology_map(struct fw_card *card, struct fw_request *request,
		int tcode, int destination, int source, int generation,
1013 1014
		unsigned long long offset, void *payload, size_t length,
		void *callback_data)
1015
{
1016
	int start;
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028

	if (!TCODE_IS_READ_REQUEST(tcode)) {
		fw_send_response(card, request, RCODE_TYPE_ERROR);
		return;
	}

	if ((offset & 3) > 0 || (length & 3) > 0) {
		fw_send_response(card, request, RCODE_ADDRESS_ERROR);
		return;
	}

	start = (offset - topology_map_region.start) / 4;
1029
	memcpy(payload, &card->topology_map[start], length);
1030 1031 1032 1033 1034

	fw_send_response(card, request, RCODE_COMPLETE);
}

static struct fw_address_handler topology_map = {
1035
	.length			= 0x400,
1036 1037 1038
	.address_callback	= handle_topology_map,
};

1039
static const struct fw_address_region registers_region =
1040 1041
	{ .start = CSR_REGISTER_BASE,
	  .end   = CSR_REGISTER_BASE | CSR_CONFIG_ROM, };
1042

1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
static void update_split_timeout(struct fw_card *card)
{
	unsigned int cycles;

	cycles = card->split_timeout_hi * 8000 + (card->split_timeout_lo >> 19);

	cycles = max(cycles, 800u); /* minimum as per the spec */
	cycles = min(cycles, 3u * 8000u); /* maximum OHCI timeout */

	card->split_timeout_cycles = cycles;
	card->split_timeout_jiffies = DIV_ROUND_UP(cycles * HZ, 8000);
}

1056 1057
static void handle_registers(struct fw_card *card, struct fw_request *request,
		int tcode, int destination, int source, int generation,
1058 1059
		unsigned long long offset, void *payload, size_t length,
		void *callback_data)
1060
{
1061
	int reg = offset & ~CSR_REGISTER_BASE;
1062
	__be32 *data = payload;
1063
	int rcode = RCODE_COMPLETE;
1064
	unsigned long flags;
1065 1066

	switch (reg) {
1067 1068 1069 1070 1071 1072
	case CSR_PRIORITY_BUDGET:
		if (!card->priority_budget_implemented) {
			rcode = RCODE_ADDRESS_ERROR;
			break;
		}
		/* else fall through */
1073

1074
	case CSR_NODE_IDS:
1075 1076 1077 1078
		/*
		 * per IEEE 1394-2008 8.3.22.3, not IEEE 1394.1-2004 3.2.8
		 * and 9.6, but interoperable with IEEE 1394.1-2004 bridges
		 */
1079 1080 1081 1082 1083 1084 1085
		/* fall through */

	case CSR_STATE_CLEAR:
	case CSR_STATE_SET:
	case CSR_CYCLE_TIME:
	case CSR_BUS_TIME:
	case CSR_BUSY_TIMEOUT:
1086
		if (tcode == TCODE_READ_QUADLET_REQUEST)
1087
			*data = cpu_to_be32(card->driver->read_csr(card, reg));
1088
		else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1089
			card->driver->write_csr(card, reg, be32_to_cpu(*data));
1090 1091 1092 1093
		else
			rcode = RCODE_TYPE_ERROR;
		break;

1094
	case CSR_RESET_START:
1095
		if (tcode == TCODE_WRITE_QUADLET_REQUEST)
1096 1097
			card->driver->write_csr(card, CSR_STATE_CLEAR,
						CSR_STATE_BIT_ABDICATE);
1098
		else
1099 1100 1101
			rcode = RCODE_TYPE_ERROR;
		break;

1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128
	case CSR_SPLIT_TIMEOUT_HI:
		if (tcode == TCODE_READ_QUADLET_REQUEST) {
			*data = cpu_to_be32(card->split_timeout_hi);
		} else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
			spin_lock_irqsave(&card->lock, flags);
			card->split_timeout_hi = be32_to_cpu(*data) & 7;
			update_split_timeout(card);
			spin_unlock_irqrestore(&card->lock, flags);
		} else {
			rcode = RCODE_TYPE_ERROR;
		}
		break;

	case CSR_SPLIT_TIMEOUT_LO:
		if (tcode == TCODE_READ_QUADLET_REQUEST) {
			*data = cpu_to_be32(card->split_timeout_lo);
		} else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
			spin_lock_irqsave(&card->lock, flags);
			card->split_timeout_lo =
					be32_to_cpu(*data) & 0xfff80000;
			update_split_timeout(card);
			spin_unlock_irqrestore(&card->lock, flags);
		} else {
			rcode = RCODE_TYPE_ERROR;
		}
		break;

1129 1130 1131 1132 1133 1134 1135 1136 1137
	case CSR_MAINT_UTILITY:
		if (tcode == TCODE_READ_QUADLET_REQUEST)
			*data = card->maint_utility_register;
		else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
			card->maint_utility_register = *data;
		else
			rcode = RCODE_TYPE_ERROR;
		break;

1138 1139 1140 1141 1142 1143 1144 1145 1146
	case CSR_BROADCAST_CHANNEL:
		if (tcode == TCODE_READ_QUADLET_REQUEST)
			*data = cpu_to_be32(card->broadcast_channel);
		else if (tcode == TCODE_WRITE_QUADLET_REQUEST)
			card->broadcast_channel =
			    (be32_to_cpu(*data) & BROADCAST_CHANNEL_VALID) |
			    BROADCAST_CHANNEL_INITIAL;
		else
			rcode = RCODE_TYPE_ERROR;
1147 1148 1149 1150 1151 1152
		break;

	case CSR_BUS_MANAGER_ID:
	case CSR_BANDWIDTH_AVAILABLE:
	case CSR_CHANNELS_AVAILABLE_HI:
	case CSR_CHANNELS_AVAILABLE_LO:
1153 1154
		/*
		 * FIXME: these are handled by the OHCI hardware and
1155 1156 1157
		 * the stack never sees these request. If we add
		 * support for a new type of controller that doesn't
		 * handle this in hardware we need to deal with these
1158 1159
		 * transactions.
		 */
1160 1161 1162 1163
		BUG();
		break;

	default:
1164
		rcode = RCODE_ADDRESS_ERROR;
1165 1166
		break;
	}
1167 1168

	fw_send_response(card, request, rcode);
1169 1170 1171 1172 1173 1174 1175
}

static struct fw_address_handler registers = {
	.length			= 0x400,
	.address_callback	= handle_registers,
};

1176 1177 1178 1179
MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
MODULE_DESCRIPTION("Core IEEE1394 transaction logic");
MODULE_LICENSE("GPL");

1180
static const u32 vendor_textual_descriptor[] = {
1181
	/* textual descriptor leaf () */
1182
	0x00060000,
1183 1184 1185 1186 1187
	0x00000000,
	0x00000000,
	0x4c696e75,		/* L i n u */
	0x78204669,		/* x   F i */
	0x72657769,		/* r e w i */
1188
	0x72650000,		/* r e     */
1189 1190
};

1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
static const u32 model_textual_descriptor[] = {
	/* model descriptor leaf () */
	0x00030000,
	0x00000000,
	0x00000000,
	0x4a756a75,		/* J u j u */
};

static struct fw_descriptor vendor_id_descriptor = {
	.length = ARRAY_SIZE(vendor_textual_descriptor),
	.immediate = 0x03d00d1e,
1202
	.key = 0x81000000,
1203 1204 1205 1206 1207 1208 1209 1210
	.data = vendor_textual_descriptor,
};

static struct fw_descriptor model_id_descriptor = {
	.length = ARRAY_SIZE(model_textual_descriptor),
	.immediate = 0x17000001,
	.key = 0x81000000,
	.data = model_textual_descriptor,
1211 1212 1213 1214
};

static int __init fw_core_init(void)
{
1215
	int ret;
1216

1217 1218 1219
	fw_workqueue = alloc_workqueue("firewire",
				       WQ_NON_REENTRANT | WQ_MEM_RECLAIM, 0);
	if (!fw_workqueue)
1220 1221
		return -ENOMEM;

1222
	ret = bus_register(&fw_bus_type);
1223
	if (ret < 0) {
1224
		destroy_workqueue(fw_workqueue);
1225
		return ret;
1226
	}
1227

1228 1229 1230
	fw_cdev_major = register_chrdev(0, "firewire", &fw_device_ops);
	if (fw_cdev_major < 0) {
		bus_unregister(&fw_bus_type);
1231
		destroy_workqueue(fw_workqueue);
1232 1233 1234
		return fw_cdev_major;
	}

1235 1236 1237 1238
	fw_core_add_address_handler(&topology_map, &topology_map_region);
	fw_core_add_address_handler(&registers, &registers_region);
	fw_core_add_descriptor(&vendor_id_descriptor);
	fw_core_add_descriptor(&model_id_descriptor);
1239 1240 1241 1242 1243 1244

	return 0;
}

static void __exit fw_core_cleanup(void)
{
1245
	unregister_chrdev(fw_cdev_major, "firewire");
1246
	bus_unregister(&fw_bus_type);
1247
	destroy_workqueue(fw_workqueue);
1248
	idr_destroy(&fw_device_idr);
1249 1250 1251 1252
}

module_init(fw_core_init);
module_exit(fw_core_cleanup);