fw-device.c 30.2 KB
Newer Older
1 2
/*
 * Device probing and sysfs code.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * Copyright (C) 2005-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.
 */

21
#include <linux/ctype.h>
22
#include <linux/delay.h>
23 24
#include <linux/device.h>
#include <linux/errno.h>
25
#include <linux/idr.h>
26
#include <linux/jiffies.h>
27 28
#include <linux/kobject.h>
#include <linux/list.h>
29
#include <linux/mutex.h>
30 31
#include <linux/rwsem.h>
#include <linux/semaphore.h>
J
Jay Fenlason 已提交
32
#include <linux/spinlock.h>
33 34 35
#include <linux/string.h>
#include <linux/workqueue.h>

36
#include <asm/system.h>
37

38
#include "fw-device.h"
39 40
#include "fw-topology.h"
#include "fw-transaction.h"
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 * p)
{
	ci->p = p + 1;
	ci->end = ci->p + (p[0] >> 16);
}
EXPORT_SYMBOL(fw_csr_iterator_init);

int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value)
{
	*key = *ci->p >> 24;
	*value = *ci->p & 0xffffff;

	return ci->p++ < ci->end;
}
EXPORT_SYMBOL(fw_csr_iterator_next);

static int is_fw_unit(struct device *dev);

60
static int match_unit_directory(u32 * directory, const struct fw_device_id *id)
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
{
	struct fw_csr_iterator ci;
	int key, value, match;

	match = 0;
	fw_csr_iterator_init(&ci, directory);
	while (fw_csr_iterator_next(&ci, &key, &value)) {
		if (key == CSR_VENDOR && value == id->vendor)
			match |= FW_MATCH_VENDOR;
		if (key == CSR_MODEL && value == id->model)
			match |= FW_MATCH_MODEL;
		if (key == CSR_SPECIFIER_ID && value == id->specifier_id)
			match |= FW_MATCH_SPECIFIER_ID;
		if (key == CSR_VERSION && value == id->version)
			match |= FW_MATCH_VERSION;
	}

	return (match & id->match_flags) == id->match_flags;
}

static int fw_unit_match(struct device *dev, struct device_driver *drv)
{
	struct fw_unit *unit = fw_unit(dev);
	struct fw_driver *driver = fw_driver(drv);
	int i;

	/* We only allow binding to fw_units. */
	if (!is_fw_unit(dev))
		return 0;

	for (i = 0; driver->id_table[i].match_flags != 0; i++) {
		if (match_unit_directory(unit->directory, &driver->id_table[i]))
			return 1;
	}

	return 0;
}

static int get_modalias(struct fw_unit *unit, char *buffer, size_t buffer_size)
{
	struct fw_device *device = fw_device(unit->device.parent);
	struct fw_csr_iterator ci;

	int key, value;
	int vendor = 0;
	int model = 0;
	int specifier_id = 0;
	int version = 0;

	fw_csr_iterator_init(&ci, &device->config_rom[5]);
	while (fw_csr_iterator_next(&ci, &key, &value)) {
		switch (key) {
		case CSR_VENDOR:
			vendor = value;
			break;
		case CSR_MODEL:
			model = value;
			break;
		}
	}

	fw_csr_iterator_init(&ci, unit->directory);
	while (fw_csr_iterator_next(&ci, &key, &value)) {
		switch (key) {
		case CSR_SPECIFIER_ID:
			specifier_id = value;
			break;
		case CSR_VERSION:
			version = value;
			break;
		}
	}

	return snprintf(buffer, buffer_size,
			"ieee1394:ven%08Xmo%08Xsp%08Xver%08X",
			vendor, model, specifier_id, version);
}

139
static int fw_unit_uevent(struct device *dev, struct kobj_uevent_env *env)
140 141 142 143
{
	struct fw_unit *unit = fw_unit(dev);
	char modalias[64];

144
	get_modalias(unit, modalias, sizeof(modalias));
145

146
	if (add_uevent_var(env, "MODALIAS=%s", modalias))
147 148 149 150 151 152
		return -ENOMEM;

	return 0;
}

struct bus_type fw_bus_type = {
153
	.name = "firewire",
154 155 156 157 158 159
	.match = fw_unit_match,
};
EXPORT_SYMBOL(fw_bus_type);

int fw_device_enable_phys_dma(struct fw_device *device)
{
160 161 162 163 164
	int generation = device->generation;

	/* device->node_id, accessed below, must not be older than generation */
	smp_rmb();

165 166
	return device->card->driver->enable_phys_dma(device->card,
						     device->node_id,
167
						     generation);
168 169 170
}
EXPORT_SYMBOL(fw_device_enable_phys_dma);

171 172 173 174 175
struct config_rom_attribute {
	struct device_attribute attr;
	u32 key;
};

176 177
static ssize_t show_immediate(struct device *dev,
			      struct device_attribute *dattr, char *buf)
178 179 180 181 182
{
	struct config_rom_attribute *attr =
		container_of(dattr, struct config_rom_attribute, attr);
	struct fw_csr_iterator ci;
	u32 *dir;
183 184 185
	int key, value, ret = -ENOENT;

	down_read(&fw_device_rwsem);
186 187 188 189 190 191 192 193

	if (is_fw_unit(dev))
		dir = fw_unit(dev)->directory;
	else
		dir = fw_device(dev)->config_rom + 5;

	fw_csr_iterator_init(&ci, dir);
	while (fw_csr_iterator_next(&ci, &key, &value))
194 195 196 197 198 199 200
		if (attr->key == key) {
			ret = snprintf(buf, buf ? PAGE_SIZE : 0,
				       "0x%06x\n", value);
			break;
		}

	up_read(&fw_device_rwsem);
201

202
	return ret;
203 204 205 206 207
}

#define IMMEDIATE_ATTR(name, key)				\
	{ __ATTR(name, S_IRUGO, show_immediate, NULL), key }

208 209
static ssize_t show_text_leaf(struct device *dev,
			      struct device_attribute *dattr, char *buf)
210 211 212 213 214
{
	struct config_rom_attribute *attr =
		container_of(dattr, struct config_rom_attribute, attr);
	struct fw_csr_iterator ci;
	u32 *dir, *block = NULL, *p, *end;
215
	int length, key, value, last_key = 0, ret = -ENOENT;
216 217
	char *b;

218 219
	down_read(&fw_device_rwsem);

220 221 222 223 224 225 226 227 228 229 230 231 232 233
	if (is_fw_unit(dev))
		dir = fw_unit(dev)->directory;
	else
		dir = fw_device(dev)->config_rom + 5;

	fw_csr_iterator_init(&ci, dir);
	while (fw_csr_iterator_next(&ci, &key, &value)) {
		if (attr->key == last_key &&
		    key == (CSR_DESCRIPTOR | CSR_LEAF))
			block = ci.p - 1 + value;
		last_key = key;
	}

	if (block == NULL)
234
		goto out;
235 236 237

	length = min(block[0] >> 16, 256U);
	if (length < 3)
238
		goto out;
239 240 241

	if (block[1] != 0 || block[2] != 0)
		/* Unknown encoding. */
242
		goto out;
243

244 245 246 247
	if (buf == NULL) {
		ret = length * 4;
		goto out;
	}
248 249 250 251 252 253 254 255 256

	b = buf;
	end = &block[length + 1];
	for (p = &block[3]; p < end; p++, b += 4)
		* (u32 *) b = (__force u32) __cpu_to_be32(*p);

	/* Strip trailing whitespace and add newline. */
	while (b--, (isspace(*b) || *b == '\0') && b > buf);
	strcpy(b + 1, "\n");
257 258 259
	ret = b + 2 - buf;
 out:
	up_read(&fw_device_rwsem);
260

261
	return ret;
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
}

#define TEXT_LEAF_ATTR(name, key)				\
	{ __ATTR(name, S_IRUGO, show_text_leaf, NULL), key }

static struct config_rom_attribute config_rom_attributes[] = {
	IMMEDIATE_ATTR(vendor, CSR_VENDOR),
	IMMEDIATE_ATTR(hardware_version, CSR_HARDWARE_VERSION),
	IMMEDIATE_ATTR(specifier_id, CSR_SPECIFIER_ID),
	IMMEDIATE_ATTR(version, CSR_VERSION),
	IMMEDIATE_ATTR(model, CSR_MODEL),
	TEXT_LEAF_ATTR(vendor_name, CSR_VENDOR),
	TEXT_LEAF_ATTR(model_name, CSR_MODEL),
	TEXT_LEAF_ATTR(hardware_version_name, CSR_HARDWARE_VERSION),
};

278 279 280
static void init_fw_attribute_group(struct device *dev,
				    struct device_attribute *attrs,
				    struct fw_attribute_group *group)
281 282
{
	struct device_attribute *attr;
283 284 285 286
	int i, j;

	for (j = 0; attrs[j].attr.name != NULL; j++)
		group->attrs[j] = &attrs[j].attr;
287 288 289 290 291

	for (i = 0; i < ARRAY_SIZE(config_rom_attributes); i++) {
		attr = &config_rom_attributes[i].attr;
		if (attr->show(dev, attr, NULL) < 0)
			continue;
292
		group->attrs[j++] = &attr->attr;
293 294
	}

295
	group->attrs[j] = NULL;
296 297 298 299
	group->groups[0] = &group->group;
	group->groups[1] = NULL;
	group->group.attrs = group->attrs;
	dev->groups = group->groups;
300 301
}

302 303
static ssize_t modalias_show(struct device *dev,
			     struct device_attribute *attr, char *buf)
304 305 306 307 308 309 310 311 312 313
{
	struct fw_unit *unit = fw_unit(dev);
	int length;

	length = get_modalias(unit, buf, PAGE_SIZE);
	strcpy(buf + length, "\n");

	return length + 1;
}

314 315
static ssize_t rom_index_show(struct device *dev,
			      struct device_attribute *attr, char *buf)
316
{
317 318
	struct fw_device *device = fw_device(dev->parent);
	struct fw_unit *unit = fw_unit(dev);
319

320 321
	return snprintf(buf, PAGE_SIZE, "%d\n",
			(int)(unit->directory - device->config_rom));
322 323
}

324 325 326 327
static struct device_attribute fw_unit_attributes[] = {
	__ATTR_RO(modalias),
	__ATTR_RO(rom_index),
	__ATTR_NULL,
328 329
};

330 331
static ssize_t config_rom_show(struct device *dev,
			       struct device_attribute *attr, char *buf)
332
{
333
	struct fw_device *device = fw_device(dev);
334
	size_t length;
335

336 337 338 339
	down_read(&fw_device_rwsem);
	length = device->config_rom_length * 4;
	memcpy(buf, device->config_rom, length);
	up_read(&fw_device_rwsem);
340

341
	return length;
342 343
}

344 345
static ssize_t guid_show(struct device *dev,
			 struct device_attribute *attr, char *buf)
346 347
{
	struct fw_device *device = fw_device(dev);
348 349 350 351 352 353
	int ret;

	down_read(&fw_device_rwsem);
	ret = snprintf(buf, PAGE_SIZE, "0x%08x%08x\n",
		       device->config_rom[3], device->config_rom[4]);
	up_read(&fw_device_rwsem);
354

355
	return ret;
356 357
}

358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
static int units_sprintf(char *buf, u32 *directory)
{
	struct fw_csr_iterator ci;
	int key, value;
	int specifier_id = 0;
	int version = 0;

	fw_csr_iterator_init(&ci, directory);
	while (fw_csr_iterator_next(&ci, &key, &value)) {
		switch (key) {
		case CSR_SPECIFIER_ID:
			specifier_id = value;
			break;
		case CSR_VERSION:
			version = value;
			break;
		}
	}

	return sprintf(buf, "0x%06x:0x%06x ", specifier_id, version);
}

static ssize_t units_show(struct device *dev,
			  struct device_attribute *attr, char *buf)
{
	struct fw_device *device = fw_device(dev);
	struct fw_csr_iterator ci;
	int key, value, i = 0;

	down_read(&fw_device_rwsem);
	fw_csr_iterator_init(&ci, &device->config_rom[5]);
	while (fw_csr_iterator_next(&ci, &key, &value)) {
		if (key != (CSR_UNIT | CSR_DIRECTORY))
			continue;
		i += units_sprintf(&buf[i], ci.p + value - 1);
		if (i >= PAGE_SIZE - (8 + 1 + 8 + 1))
			break;
	}
	up_read(&fw_device_rwsem);

	if (i)
		buf[i - 1] = '\n';

	return i;
}

404 405
static struct device_attribute fw_device_attributes[] = {
	__ATTR_RO(config_rom),
406
	__ATTR_RO(guid),
407
	__ATTR_RO(units),
408
	__ATTR_NULL,
409 410
};

411 412
static int read_rom(struct fw_device *device,
		    int generation, int index, u32 *data)
413
{
J
Jay Fenlason 已提交
414
	int rcode;
415 416 417

	/* device->node_id, accessed below, must not be older than generation */
	smp_rmb();
418

J
Jay Fenlason 已提交
419
	rcode = fw_run_transaction(device->card, TCODE_READ_QUADLET_REQUEST,
420
			device->node_id, generation, device->max_speed,
J
Jay Fenlason 已提交
421 422 423
			(CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4,
			data, 4);
	be32_to_cpus(data);
424

J
Jay Fenlason 已提交
425
	return rcode;
426 427
}

428 429 430
#define READ_BIB_ROM_SIZE	256
#define READ_BIB_STACK_SIZE	16

431 432 433 434 435 436 437 438
/*
 * Read the bus info block, perform a speed probe, and read all of the rest of
 * the config ROM.  We do all this with a cached bus generation.  If the bus
 * generation changes under us, read_bus_info_block will fail and get retried.
 * It's better to start all over in this case because the node from which we
 * are reading the ROM may have changed the ROM during the reset.
 */
static int read_bus_info_block(struct fw_device *device, int generation)
439
{
440
	u32 *rom, *stack, *old_rom, *new_rom;
441 442 443 444 445 446 447 448 449
	u32 sp, key;
	int i, end, length, ret = -1;

	rom = kmalloc(sizeof(*rom) * READ_BIB_ROM_SIZE +
		      sizeof(*stack) * READ_BIB_STACK_SIZE, GFP_KERNEL);
	if (rom == NULL)
		return -ENOMEM;

	stack = &rom[READ_BIB_ROM_SIZE];
450

451 452
	device->max_speed = SCODE_100;

453 454
	/* First read the bus info block. */
	for (i = 0; i < 5; i++) {
455
		if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE)
456
			goto out;
457 458
		/*
		 * As per IEEE1212 7.2, during power-up, devices can
459 460 461 462
		 * reply with a 0 for the first quadlet of the config
		 * rom to indicate that they are booting (for example,
		 * if the firmware is on the disk of a external
		 * harddisk).  In that case we just fail, and the
463 464
		 * retry mechanism will try again later.
		 */
465
		if (i == 0 && rom[i] == 0)
466
			goto out;
467 468
	}

469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
	device->max_speed = device->node->max_speed;

	/*
	 * Determine the speed of
	 *   - devices with link speed less than PHY speed,
	 *   - devices with 1394b PHY (unless only connected to 1394a PHYs),
	 *   - all devices if there are 1394b repeaters.
	 * Note, we cannot use the bus info block's link_spd as starting point
	 * because some buggy firmwares set it lower than necessary and because
	 * 1394-1995 nodes do not have the field.
	 */
	if ((rom[2] & 0x7) < device->max_speed ||
	    device->max_speed == SCODE_BETA ||
	    device->card->beta_repeaters_present) {
		u32 dummy;

		/* for S1600 and S3200 */
		if (device->max_speed == SCODE_BETA)
			device->max_speed = device->card->link_speed;

		while (device->max_speed > SCODE_100) {
490 491
			if (read_rom(device, generation, 0, &dummy) ==
			    RCODE_COMPLETE)
492 493 494 495 496
				break;
			device->max_speed--;
		}
	}

497 498
	/*
	 * Now parse the config rom.  The config rom is a recursive
499 500 501
	 * directory structure so we parse it using a stack of
	 * references to the blocks that make up the structure.  We
	 * push a reference to the root directory on the stack to
502 503
	 * start things off.
	 */
504 505 506 507
	length = i;
	sp = 0;
	stack[sp++] = 0xc0000005;
	while (sp > 0) {
508 509
		/*
		 * Pop the next block reference of the stack.  The
510 511
		 * lower 24 bits is the offset into the config rom,
		 * the upper 8 bits are the type of the reference the
512 513
		 * block.
		 */
514 515
		key = stack[--sp];
		i = key & 0xffffff;
516
		if (i >= READ_BIB_ROM_SIZE)
517 518 519 520
			/*
			 * The reference points outside the standard
			 * config rom area, something's fishy.
			 */
521
			goto out;
522 523

		/* Read header quadlet for the block to get the length. */
524
		if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE)
525
			goto out;
526 527
		end = i + (rom[i] >> 16) + 1;
		i++;
528
		if (end > READ_BIB_ROM_SIZE)
529 530
			/*
			 * This block extends outside standard config
531 532
			 * area (and the array we're reading it
			 * into).  That's broken, so ignore this
533 534
			 * device.
			 */
535
			goto out;
536

537 538
		/*
		 * Now read in the block.  If this is a directory
539
		 * block, check the entries as we read them to see if
540 541
		 * it references another block, and push it in that case.
		 */
542
		while (i < end) {
543 544
			if (read_rom(device, generation, i, &rom[i]) !=
			    RCODE_COMPLETE)
545
				goto out;
546
			if ((key >> 30) == 3 && (rom[i] >> 30) > 1 &&
547
			    sp < READ_BIB_STACK_SIZE)
548 549 550 551 552 553 554
				stack[sp++] = i + rom[i];
			i++;
		}
		if (length < i)
			length = i;
	}

555 556 557
	old_rom = device->config_rom;
	new_rom = kmemdup(rom, length * 4, GFP_KERNEL);
	if (new_rom == NULL)
558
		goto out;
559 560 561

	down_write(&fw_device_rwsem);
	device->config_rom = new_rom;
562
	device->config_rom_length = length;
563 564 565
	up_write(&fw_device_rwsem);

	kfree(old_rom);
566
	ret = 0;
567
	device->cmc = rom[2] >> 30 & 1;
568 569
 out:
	kfree(rom);
570

571
	return ret;
572 573 574 575 576 577 578 579 580
}

static void fw_unit_release(struct device *dev)
{
	struct fw_unit *unit = fw_unit(dev);

	kfree(unit);
}

581 582 583 584 585
static struct device_type fw_unit_type = {
	.uevent		= fw_unit_uevent,
	.release	= fw_unit_release,
};

586 587
static int is_fw_unit(struct device *dev)
{
588
	return dev->type == &fw_unit_type;
589 590 591 592 593 594 595 596 597 598 599 600 601 602
}

static void create_units(struct fw_device *device)
{
	struct fw_csr_iterator ci;
	struct fw_unit *unit;
	int key, value, i;

	i = 0;
	fw_csr_iterator_init(&ci, &device->config_rom[5]);
	while (fw_csr_iterator_next(&ci, &key, &value)) {
		if (key != (CSR_UNIT | CSR_DIRECTORY))
			continue;

603 604 605 606
		/*
		 * Get the address of the unit directory and try to
		 * match the drivers id_tables against it.
		 */
607
		unit = kzalloc(sizeof(*unit), GFP_KERNEL);
608 609 610 611 612 613 614
		if (unit == NULL) {
			fw_error("failed to allocate memory for unit\n");
			continue;
		}

		unit->directory = ci.p + value - 1;
		unit->device.bus = &fw_bus_type;
615
		unit->device.type = &fw_unit_type;
616
		unit->device.parent = &device->device;
617
		dev_set_name(&unit->device, "%s.%d", dev_name(&device->device), i++);
618

619 620 621
		BUILD_BUG_ON(ARRAY_SIZE(unit->attribute_group.attrs) <
				ARRAY_SIZE(fw_unit_attributes) +
				ARRAY_SIZE(config_rom_attributes));
622 623 624
		init_fw_attribute_group(&unit->device,
					fw_unit_attributes,
					&unit->attribute_group);
625

626 627 628 629 630 631 632
		if (device_register(&unit->device) < 0)
			goto skip_unit;

		continue;

	skip_unit:
		kfree(unit);
633 634 635 636 637
	}
}

static int shutdown_unit(struct device *device, void *data)
{
638
	device_unregister(device);
639 640 641 642

	return 0;
}

643 644 645 646 647 648 649 650
/*
 * fw_device_rwsem acts as dual purpose mutex:
 *   - serializes accesses to fw_device_idr,
 *   - serializes accesses to fw_device.config_rom/.config_rom_length and
 *     fw_unit.directory, unless those accesses happen at safe occasions
 */
DECLARE_RWSEM(fw_device_rwsem);

651
DEFINE_IDR(fw_device_idr);
652 653
int fw_cdev_major;

654
struct fw_device *fw_device_get_by_devt(dev_t devt)
655 656 657
{
	struct fw_device *device;

658
	down_read(&fw_device_rwsem);
659
	device = idr_find(&fw_device_idr, MINOR(devt));
660 661
	if (device)
		fw_device_get(device);
662
	up_read(&fw_device_rwsem);
663 664 665 666

	return device;
}

667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
/*
 * These defines control the retry behavior for reading the config
 * rom.  It shouldn't be necessary to tweak these; if the device
 * doesn't respond to a config rom read within 10 seconds, it's not
 * going to respond at all.  As for the initial delay, a lot of
 * devices will be able to respond within half a second after bus
 * reset.  On the other hand, it's not really worth being more
 * aggressive than that, since it scales pretty well; if 10 devices
 * are plugged in, they're all getting read within one second.
 */

#define MAX_RETRIES	10
#define RETRY_DELAY	(3 * HZ)
#define INITIAL_DELAY	(HZ / 2)
#define SHUTDOWN_DELAY	(2 * HZ)

683 684 685 686
static void fw_device_shutdown(struct work_struct *work)
{
	struct fw_device *device =
		container_of(work, struct fw_device, work.work);
687 688
	int minor = MINOR(device->device.devt);

689 690
	if (time_is_after_jiffies(device->card->reset_jiffies + SHUTDOWN_DELAY)
	    && !list_empty(&device->card->link)) {
691 692 693 694 695 696 697 698 699
		schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
		return;
	}

	if (atomic_cmpxchg(&device->state,
			   FW_DEVICE_GONE,
			   FW_DEVICE_SHUTDOWN) != FW_DEVICE_GONE)
		return;

700
	fw_device_cdev_remove(device);
701 702
	device_for_each_child(&device->device, NULL, shutdown_unit);
	device_unregister(&device->device);
703

704
	down_write(&fw_device_rwsem);
705
	idr_remove(&fw_device_idr, minor);
706
	up_write(&fw_device_rwsem);
707

708
	fw_device_put(device);
709 710
}

711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
static void fw_device_release(struct device *dev)
{
	struct fw_device *device = fw_device(dev);
	struct fw_card *card = device->card;
	unsigned long flags;

	/*
	 * Take the card lock so we don't set this to NULL while a
	 * FW_NODE_UPDATED callback is being handled or while the
	 * bus manager work looks at this node.
	 */
	spin_lock_irqsave(&card->lock, flags);
	device->node->data = NULL;
	spin_unlock_irqrestore(&card->lock, flags);

	fw_node_put(device->node);
	kfree(device->config_rom);
	kfree(device);
	fw_card_put(card);
}

732
static struct device_type fw_device_type = {
733
	.release = fw_device_release,
734 735
};

736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757
static int update_unit(struct device *dev, void *data)
{
	struct fw_unit *unit = fw_unit(dev);
	struct fw_driver *driver = (struct fw_driver *)dev->driver;

	if (is_fw_unit(dev) && driver != NULL && driver->update != NULL) {
		down(&dev->sem);
		driver->update(unit);
		up(&dev->sem);
	}

	return 0;
}

static void fw_device_update(struct work_struct *work)
{
	struct fw_device *device =
		container_of(work, struct fw_device, work.work);

	fw_device_cdev_update(device);
	device_for_each_child(&device->device, NULL, update_unit);
}
758

759
/*
760 761 762 763
 * If a device was pending for deletion because its node went away but its
 * bus info block and root directory header matches that of a newly discovered
 * device, revive the existing fw_device.
 * The newly allocated fw_device becomes obsolete instead.
764
 */
765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792
static int lookup_existing_device(struct device *dev, void *data)
{
	struct fw_device *old = fw_device(dev);
	struct fw_device *new = data;
	struct fw_card *card = new->card;
	int match = 0;

	down_read(&fw_device_rwsem); /* serialize config_rom access */
	spin_lock_irq(&card->lock);  /* serialize node access */

	if (memcmp(old->config_rom, new->config_rom, 6 * 4) == 0 &&
	    atomic_cmpxchg(&old->state,
			   FW_DEVICE_GONE,
			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
		struct fw_node *current_node = new->node;
		struct fw_node *obsolete_node = old->node;

		new->node = obsolete_node;
		new->node->data = new;
		old->node = current_node;
		old->node->data = old;

		old->max_speed = new->max_speed;
		old->node_id = current_node->node_id;
		smp_wmb();  /* update node_id before generation */
		old->generation = card->generation;
		old->config_rom_retries = 0;
		fw_notify("rediscovered device %s\n", dev_name(dev));
793

794 795 796 797 798 799 800 801 802 803 804 805 806 807
		PREPARE_DELAYED_WORK(&old->work, fw_device_update);
		schedule_delayed_work(&old->work, 0);

		if (current_node == card->root_node)
			fw_schedule_bm_work(card, 0);

		match = 1;
	}

	spin_unlock_irq(&card->lock);
	up_read(&fw_device_rwsem);

	return match;
}
808

809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846
enum { BC_UNKNOWN = 0, BC_UNIMPLEMENTED, BC_IMPLEMENTED, };

void fw_device_set_broadcast_channel(struct fw_device *device, int generation)
{
	struct fw_card *card = device->card;
	__be32 data;
	int rcode;

	if (!card->broadcast_channel_allocated)
		return;

	if (device->bc_implemented == BC_UNKNOWN) {
		rcode = fw_run_transaction(card, TCODE_READ_QUADLET_REQUEST,
				device->node_id, generation, device->max_speed,
				CSR_REGISTER_BASE + CSR_BROADCAST_CHANNEL,
				&data, 4);
		switch (rcode) {
		case RCODE_COMPLETE:
			if (data & cpu_to_be32(1 << 31)) {
				device->bc_implemented = BC_IMPLEMENTED;
				break;
			}
			/* else fall through to case address error */
		case RCODE_ADDRESS_ERROR:
			device->bc_implemented = BC_UNIMPLEMENTED;
		}
	}

	if (device->bc_implemented == BC_IMPLEMENTED) {
		data = cpu_to_be32(BROADCAST_CHANNEL_INITIAL |
				   BROADCAST_CHANNEL_VALID);
		fw_run_transaction(card, TCODE_WRITE_QUADLET_REQUEST,
				device->node_id, generation, device->max_speed,
				CSR_REGISTER_BASE + CSR_BROADCAST_CHANNEL,
				&data, 4);
	}
}

847 848 849 850
static void fw_device_init(struct work_struct *work)
{
	struct fw_device *device =
		container_of(work, struct fw_device, work.work);
851
	struct device *revived_dev;
852
	int minor, ret;
853

854 855
	/*
	 * All failure paths here set node->data to NULL, so that we
856
	 * don't try to do device_for_each_child() on a kfree()'d
857 858
	 * device.
	 */
859

860
	if (read_bus_info_block(device, device->generation) < 0) {
861 862
		if (device->config_rom_retries < MAX_RETRIES &&
		    atomic_read(&device->state) == FW_DEVICE_INITIALIZING) {
863 864 865
			device->config_rom_retries++;
			schedule_delayed_work(&device->work, RETRY_DELAY);
		} else {
866
			fw_notify("giving up on config rom for node id %x\n",
867
				  device->node_id);
868
			if (device->node == device->card->root_node)
869
				fw_schedule_bm_work(device->card, 0);
870 871 872 873 874
			fw_device_release(&device->device);
		}
		return;
	}

875 876 877 878 879 880 881 882 883
	revived_dev = device_find_child(device->card->device,
					device, lookup_existing_device);
	if (revived_dev) {
		put_device(revived_dev);
		fw_device_release(&device->device);

		return;
	}

884
	device_initialize(&device->device);
885 886

	fw_device_get(device);
887
	down_write(&fw_device_rwsem);
888
	ret = idr_pre_get(&fw_device_idr, GFP_KERNEL) ?
889 890
	      idr_get_new(&fw_device_idr, device, &minor) :
	      -ENOMEM;
891
	up_write(&fw_device_rwsem);
892

893
	if (ret < 0)
894 895
		goto error;

896
	device->device.bus = &fw_bus_type;
897
	device->device.type = &fw_device_type;
898
	device->device.parent = device->card->device;
899
	device->device.devt = MKDEV(fw_cdev_major, minor);
900
	dev_set_name(&device->device, "fw%d", minor);
901

902 903 904
	BUILD_BUG_ON(ARRAY_SIZE(device->attribute_group.attrs) <
			ARRAY_SIZE(fw_device_attributes) +
			ARRAY_SIZE(config_rom_attributes));
905 906 907
	init_fw_attribute_group(&device->device,
				fw_device_attributes,
				&device->attribute_group);
908

909 910
	if (device_add(&device->device)) {
		fw_error("Failed to add device.\n");
911
		goto error_with_cdev;
912 913 914 915
	}

	create_units(device);

916 917
	/*
	 * Transition the device to running state.  If it got pulled
918 919 920 921 922
	 * out from under us while we did the intialization work, we
	 * have to shut down the device again here.  Normally, though,
	 * fw_node_event will be responsible for shutting it down when
	 * necessary.  We have to use the atomic cmpxchg here to avoid
	 * racing with the FW_NODE_DESTROYED case in
923 924
	 * fw_node_event().
	 */
925
	if (atomic_cmpxchg(&device->state,
926 927 928 929
			   FW_DEVICE_INITIALIZING,
			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
		PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
		schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
930 931 932 933
	} else {
		if (device->config_rom_retries)
			fw_notify("created device %s: GUID %08x%08x, S%d00, "
				  "%d config ROM retries\n",
934
				  dev_name(&device->device),
935 936 937 938 939
				  device->config_rom[3], device->config_rom[4],
				  1 << device->max_speed,
				  device->config_rom_retries);
		else
			fw_notify("created device %s: GUID %08x%08x, S%d00\n",
940
				  dev_name(&device->device),
941 942
				  device->config_rom[3], device->config_rom[4],
				  1 << device->max_speed);
943
		device->config_rom_retries = 0;
944 945

		fw_device_set_broadcast_channel(device, device->generation);
946
	}
947

948 949
	/*
	 * Reschedule the IRM work if we just finished reading the
950 951
	 * root node config rom.  If this races with a bus reset we
	 * just end up running the IRM work a couple of extra times -
952 953
	 * pretty harmless.
	 */
954
	if (device->node == device->card->root_node)
955
		fw_schedule_bm_work(device->card, 0);
956 957 958

	return;

959
 error_with_cdev:
960
	down_write(&fw_device_rwsem);
961
	idr_remove(&fw_device_idr, minor);
962
	up_write(&fw_device_rwsem);
S
Stefan Richter 已提交
963
 error:
964 965 966
	fw_device_put(device);		/* fw_device_idr's reference */

	put_device(&device->device);	/* our reference */
967 968
}

969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988
enum {
	REREAD_BIB_ERROR,
	REREAD_BIB_GONE,
	REREAD_BIB_UNCHANGED,
	REREAD_BIB_CHANGED,
};

/* Reread and compare bus info block and header of root directory */
static int reread_bus_info_block(struct fw_device *device, int generation)
{
	u32 q;
	int i;

	for (i = 0; i < 6; i++) {
		if (read_rom(device, generation, i, &q) != RCODE_COMPLETE)
			return REREAD_BIB_ERROR;

		if (i == 0 && q == 0)
			return REREAD_BIB_GONE;

989
		if (q != device->config_rom[i])
990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
			return REREAD_BIB_CHANGED;
	}

	return REREAD_BIB_UNCHANGED;
}

static void fw_device_refresh(struct work_struct *work)
{
	struct fw_device *device =
		container_of(work, struct fw_device, work.work);
	struct fw_card *card = device->card;
	int node_id = device->node_id;

	switch (reread_bus_info_block(device, device->generation)) {
	case REREAD_BIB_ERROR:
		if (device->config_rom_retries < MAX_RETRIES / 2 &&
		    atomic_read(&device->state) == FW_DEVICE_INITIALIZING) {
			device->config_rom_retries++;
			schedule_delayed_work(&device->work, RETRY_DELAY / 2);

			return;
		}
		goto give_up;

	case REREAD_BIB_GONE:
		goto gone;

	case REREAD_BIB_UNCHANGED:
		if (atomic_cmpxchg(&device->state,
1019 1020
				   FW_DEVICE_INITIALIZING,
				   FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
			goto gone;

		fw_device_update(work);
		device->config_rom_retries = 0;
		goto out;

	case REREAD_BIB_CHANGED:
		break;
	}

	/*
	 * Something changed.  We keep things simple and don't investigate
	 * further.  We just destroy all previous units and create new ones.
	 */
	device_for_each_child(&device->device, NULL, shutdown_unit);

	if (read_bus_info_block(device, device->generation) < 0) {
		if (device->config_rom_retries < MAX_RETRIES &&
		    atomic_read(&device->state) == FW_DEVICE_INITIALIZING) {
			device->config_rom_retries++;
			schedule_delayed_work(&device->work, RETRY_DELAY);

			return;
		}
		goto give_up;
	}

	create_units(device);

1050 1051 1052
	/* Userspace may want to re-read attributes. */
	kobject_uevent(&device->device.kobj, KOBJ_CHANGE);

1053
	if (atomic_cmpxchg(&device->state,
1054 1055
			   FW_DEVICE_INITIALIZING,
			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
1056 1057
		goto gone;

1058
	fw_notify("refreshed device %s\n", dev_name(&device->device));
1059 1060 1061 1062
	device->config_rom_retries = 0;
	goto out;

 give_up:
1063
	fw_notify("giving up on refresh of device %s\n", dev_name(&device->device));
1064
 gone:
1065 1066 1067
	atomic_set(&device->state, FW_DEVICE_GONE);
	PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
	schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
1068 1069
 out:
	if (node_id == card->root_node->node_id)
1070
		fw_schedule_bm_work(card, 0);
1071 1072
}

1073 1074 1075 1076 1077 1078 1079 1080 1081
void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
{
	struct fw_device *device;

	switch (event) {
	case FW_NODE_CREATED:
	case FW_NODE_LINK_ON:
		if (!node->link_on)
			break;
1082
 create:
1083 1084 1085 1086
		device = kzalloc(sizeof(*device), GFP_ATOMIC);
		if (device == NULL)
			break;

1087 1088
		/*
		 * Do minimal intialization of the device here, the
1089 1090 1091 1092 1093 1094 1095
		 * rest will happen in fw_device_init().
		 *
		 * Attention:  A lot of things, even fw_device_get(),
		 * cannot be done before fw_device_init() finished!
		 * You can basically just check device->state and
		 * schedule work until then, but only while holding
		 * card->lock.
1096
		 */
1097
		atomic_set(&device->state, FW_DEVICE_INITIALIZING);
1098
		device->card = fw_card_get(card);
1099 1100 1101
		device->node = fw_node_get(node);
		device->node_id = node->node_id;
		device->generation = card->generation;
1102
		device->is_local = node == card->local_node;
1103
		mutex_init(&device->client_list_mutex);
1104
		INIT_LIST_HEAD(&device->client_list);
1105

1106 1107
		/*
		 * Set the node data to point back to this device so
1108
		 * FW_NODE_UPDATED callbacks can update the node_id
1109 1110
		 * and generation for the device.
		 */
1111 1112
		node->data = device;

1113 1114
		/*
		 * Many devices are slow to respond after bus resets,
1115 1116
		 * especially if they are bus powered and go through
		 * power-up after getting plugged in.  We schedule the
1117 1118
		 * first config rom scan half a second after bus reset.
		 */
1119 1120 1121 1122
		INIT_DELAYED_WORK(&device->work, fw_device_init);
		schedule_delayed_work(&device->work, INITIAL_DELAY);
		break;

1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
	case FW_NODE_INITIATED_RESET:
		device = node->data;
		if (device == NULL)
			goto create;

		device->node_id = node->node_id;
		smp_wmb();  /* update node_id before generation */
		device->generation = card->generation;
		if (atomic_cmpxchg(&device->state,
			    FW_DEVICE_RUNNING,
			    FW_DEVICE_INITIALIZING) == FW_DEVICE_RUNNING) {
			PREPARE_DELAYED_WORK(&device->work, fw_device_refresh);
			schedule_delayed_work(&device->work,
1136
				device->is_local ? 0 : INITIAL_DELAY);
1137 1138 1139
		}
		break;

1140 1141 1142 1143 1144 1145
	case FW_NODE_UPDATED:
		if (!node->link_on || node->data == NULL)
			break;

		device = node->data;
		device->node_id = node->node_id;
1146
		smp_wmb();  /* update node_id before generation */
1147
		device->generation = card->generation;
1148 1149 1150 1151
		if (atomic_read(&device->state) == FW_DEVICE_RUNNING) {
			PREPARE_DELAYED_WORK(&device->work, fw_device_update);
			schedule_delayed_work(&device->work, 0);
		}
1152 1153 1154 1155 1156 1157 1158
		break;

	case FW_NODE_DESTROYED:
	case FW_NODE_LINK_OFF:
		if (!node->data)
			break;

1159 1160
		/*
		 * Destroy the device associated with the node.  There
1161 1162 1163 1164 1165 1166 1167 1168
		 * are two cases here: either the device is fully
		 * initialized (FW_DEVICE_RUNNING) or we're in the
		 * process of reading its config rom
		 * (FW_DEVICE_INITIALIZING).  If it is fully
		 * initialized we can reuse device->work to schedule a
		 * full fw_device_shutdown().  If not, there's work
		 * scheduled to read it's config rom, and we just put
		 * the device in shutdown state to have that code fail
1169 1170
		 * to create the device.
		 */
1171
		device = node->data;
1172
		if (atomic_xchg(&device->state,
1173
				FW_DEVICE_GONE) == FW_DEVICE_RUNNING) {
1174
			PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
1175 1176
			schedule_delayed_work(&device->work,
				list_empty(&card->link) ? 0 : SHUTDOWN_DELAY);
1177 1178 1179 1180
		}
		break;
	}
}