fw-device.c 30.7 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/mod_devicetable.h>
30
#include <linux/mutex.h>
31 32
#include <linux/rwsem.h>
#include <linux/semaphore.h>
J
Jay Fenlason 已提交
33
#include <linux/spinlock.h>
34 35 36
#include <linux/string.h>
#include <linux/workqueue.h>

37
#include <asm/system.h>
38

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

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);

61
static int match_unit_directory(u32 *directory, u32 match_flags,
62
				const struct ieee1394_device_id *id)
63 64 65 66 67 68 69
{
	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)) {
70 71 72 73
		if (key == CSR_VENDOR && value == id->vendor_id)
			match |= IEEE1394_MATCH_VENDOR_ID;
		if (key == CSR_MODEL && value == id->model_id)
			match |= IEEE1394_MATCH_MODEL_ID;
74
		if (key == CSR_SPECIFIER_ID && value == id->specifier_id)
75
			match |= IEEE1394_MATCH_SPECIFIER_ID;
76
		if (key == CSR_VERSION && value == id->version)
77
			match |= IEEE1394_MATCH_VERSION;
78 79
	}

80
	return (match & match_flags) == match_flags;
81 82 83 84 85
}

static int fw_unit_match(struct device *dev, struct device_driver *drv)
{
	struct fw_unit *unit = fw_unit(dev);
86 87
	struct fw_device *device;
	const struct ieee1394_device_id *id;
88 89 90 91 92

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

93 94 95 96 97 98 99 100 101 102 103 104
	device = fw_device(unit->device.parent);

	for (id = fw_driver(drv)->id_table; id->match_flags != 0; id++) {
		if (match_unit_directory(unit->directory, id->match_flags, id))
			return 1;

		/* Also check vendor ID in the root directory. */
		if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) &&
		    match_unit_directory(&device->config_rom[5],
				IEEE1394_MATCH_VENDOR_ID, id) &&
		    match_unit_directory(unit->directory, id->match_flags
				& ~IEEE1394_MATCH_VENDOR_ID, id))
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 139 140 141 142 143 144 145 146 147 148 149 150
			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);
}

151
static int fw_unit_uevent(struct device *dev, struct kobj_uevent_env *env)
152 153 154 155
{
	struct fw_unit *unit = fw_unit(dev);
	char modalias[64];

156
	get_modalias(unit, modalias, sizeof(modalias));
157

158
	if (add_uevent_var(env, "MODALIAS=%s", modalias))
159 160 161 162 163 164
		return -ENOMEM;

	return 0;
}

struct bus_type fw_bus_type = {
165
	.name = "firewire",
166 167 168 169 170 171
	.match = fw_unit_match,
};
EXPORT_SYMBOL(fw_bus_type);

int fw_device_enable_phys_dma(struct fw_device *device)
{
172 173 174 175 176
	int generation = device->generation;

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

177 178
	return device->card->driver->enable_phys_dma(device->card,
						     device->node_id,
179
						     generation);
180 181 182
}
EXPORT_SYMBOL(fw_device_enable_phys_dma);

183 184 185 186 187
struct config_rom_attribute {
	struct device_attribute attr;
	u32 key;
};

188 189
static ssize_t show_immediate(struct device *dev,
			      struct device_attribute *dattr, char *buf)
190 191 192 193 194
{
	struct config_rom_attribute *attr =
		container_of(dattr, struct config_rom_attribute, attr);
	struct fw_csr_iterator ci;
	u32 *dir;
195 196 197
	int key, value, ret = -ENOENT;

	down_read(&fw_device_rwsem);
198 199 200 201 202 203 204 205

	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))
206 207 208 209 210 211 212
		if (attr->key == key) {
			ret = snprintf(buf, buf ? PAGE_SIZE : 0,
				       "0x%06x\n", value);
			break;
		}

	up_read(&fw_device_rwsem);
213

214
	return ret;
215 216 217 218 219
}

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

220 221
static ssize_t show_text_leaf(struct device *dev,
			      struct device_attribute *dattr, char *buf)
222 223 224 225 226
{
	struct config_rom_attribute *attr =
		container_of(dattr, struct config_rom_attribute, attr);
	struct fw_csr_iterator ci;
	u32 *dir, *block = NULL, *p, *end;
227
	int length, key, value, last_key = 0, ret = -ENOENT;
228 229
	char *b;

230 231
	down_read(&fw_device_rwsem);

232 233 234 235 236 237 238 239 240 241 242 243 244 245
	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)
246
		goto out;
247 248 249

	length = min(block[0] >> 16, 256U);
	if (length < 3)
250
		goto out;
251 252 253

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

256 257 258 259
	if (buf == NULL) {
		ret = length * 4;
		goto out;
	}
260 261 262 263 264 265 266 267 268

	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");
269 270 271
	ret = b + 2 - buf;
 out:
	up_read(&fw_device_rwsem);
272

273
	return ret;
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
}

#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),
};

290 291 292
static void init_fw_attribute_group(struct device *dev,
				    struct device_attribute *attrs,
				    struct fw_attribute_group *group)
293 294
{
	struct device_attribute *attr;
295 296 297 298
	int i, j;

	for (j = 0; attrs[j].attr.name != NULL; j++)
		group->attrs[j] = &attrs[j].attr;
299 300 301 302 303

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

307
	group->attrs[j] = NULL;
308 309 310 311
	group->groups[0] = &group->group;
	group->groups[1] = NULL;
	group->group.attrs = group->attrs;
	dev->groups = group->groups;
312 313
}

314 315
static ssize_t modalias_show(struct device *dev,
			     struct device_attribute *attr, char *buf)
316 317 318 319 320 321 322 323 324 325
{
	struct fw_unit *unit = fw_unit(dev);
	int length;

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

	return length + 1;
}

326 327
static ssize_t rom_index_show(struct device *dev,
			      struct device_attribute *attr, char *buf)
328
{
329 330
	struct fw_device *device = fw_device(dev->parent);
	struct fw_unit *unit = fw_unit(dev);
331

332 333
	return snprintf(buf, PAGE_SIZE, "%d\n",
			(int)(unit->directory - device->config_rom));
334 335
}

336 337 338 339
static struct device_attribute fw_unit_attributes[] = {
	__ATTR_RO(modalias),
	__ATTR_RO(rom_index),
	__ATTR_NULL,
340 341
};

342 343
static ssize_t config_rom_show(struct device *dev,
			       struct device_attribute *attr, char *buf)
344
{
345
	struct fw_device *device = fw_device(dev);
346
	size_t length;
347

348 349 350 351
	down_read(&fw_device_rwsem);
	length = device->config_rom_length * 4;
	memcpy(buf, device->config_rom, length);
	up_read(&fw_device_rwsem);
352

353
	return length;
354 355
}

356 357
static ssize_t guid_show(struct device *dev,
			 struct device_attribute *attr, char *buf)
358 359
{
	struct fw_device *device = fw_device(dev);
360 361 362 363 364 365
	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);
366

367
	return ret;
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 404 405 406 407 408 409 410 411 412 413 414 415
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;
}

416 417
static struct device_attribute fw_device_attributes[] = {
	__ATTR_RO(config_rom),
418
	__ATTR_RO(guid),
419
	__ATTR_RO(units),
420
	__ATTR_NULL,
421 422
};

423 424
static int read_rom(struct fw_device *device,
		    int generation, int index, u32 *data)
425
{
J
Jay Fenlason 已提交
426
	int rcode;
427 428 429

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

J
Jay Fenlason 已提交
431
	rcode = fw_run_transaction(device->card, TCODE_READ_QUADLET_REQUEST,
432
			device->node_id, generation, device->max_speed,
J
Jay Fenlason 已提交
433 434 435
			(CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4,
			data, 4);
	be32_to_cpus(data);
436

J
Jay Fenlason 已提交
437
	return rcode;
438 439
}

440 441 442
#define READ_BIB_ROM_SIZE	256
#define READ_BIB_STACK_SIZE	16

443 444 445 446 447 448 449 450
/*
 * 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)
451
{
452
	u32 *rom, *stack, *old_rom, *new_rom;
453 454 455 456 457 458 459 460 461
	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];
462

463 464
	device->max_speed = SCODE_100;

465 466
	/* First read the bus info block. */
	for (i = 0; i < 5; i++) {
467
		if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE)
468
			goto out;
469 470
		/*
		 * As per IEEE1212 7.2, during power-up, devices can
471 472 473 474
		 * 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
475 476
		 * retry mechanism will try again later.
		 */
477
		if (i == 0 && rom[i] == 0)
478
			goto out;
479 480
	}

481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
	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) {
502 503
			if (read_rom(device, generation, 0, &dummy) ==
			    RCODE_COMPLETE)
504 505 506 507 508
				break;
			device->max_speed--;
		}
	}

509 510
	/*
	 * Now parse the config rom.  The config rom is a recursive
511 512 513
	 * 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
514 515
	 * start things off.
	 */
516 517 518 519
	length = i;
	sp = 0;
	stack[sp++] = 0xc0000005;
	while (sp > 0) {
520 521
		/*
		 * Pop the next block reference of the stack.  The
522 523
		 * lower 24 bits is the offset into the config rom,
		 * the upper 8 bits are the type of the reference the
524 525
		 * block.
		 */
526 527
		key = stack[--sp];
		i = key & 0xffffff;
528
		if (i >= READ_BIB_ROM_SIZE)
529 530 531 532
			/*
			 * The reference points outside the standard
			 * config rom area, something's fishy.
			 */
533
			goto out;
534 535

		/* Read header quadlet for the block to get the length. */
536
		if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE)
537
			goto out;
538 539
		end = i + (rom[i] >> 16) + 1;
		i++;
540
		if (end > READ_BIB_ROM_SIZE)
541 542
			/*
			 * This block extends outside standard config
543 544
			 * area (and the array we're reading it
			 * into).  That's broken, so ignore this
545 546
			 * device.
			 */
547
			goto out;
548

549 550
		/*
		 * Now read in the block.  If this is a directory
551
		 * block, check the entries as we read them to see if
552 553
		 * it references another block, and push it in that case.
		 */
554
		while (i < end) {
555 556
			if (read_rom(device, generation, i, &rom[i]) !=
			    RCODE_COMPLETE)
557
				goto out;
558
			if ((key >> 30) == 3 && (rom[i] >> 30) > 1 &&
559
			    sp < READ_BIB_STACK_SIZE)
560 561 562 563 564 565 566
				stack[sp++] = i + rom[i];
			i++;
		}
		if (length < i)
			length = i;
	}

567 568 569
	old_rom = device->config_rom;
	new_rom = kmemdup(rom, length * 4, GFP_KERNEL);
	if (new_rom == NULL)
570
		goto out;
571 572 573

	down_write(&fw_device_rwsem);
	device->config_rom = new_rom;
574
	device->config_rom_length = length;
575 576 577
	up_write(&fw_device_rwsem);

	kfree(old_rom);
578
	ret = 0;
579
	device->cmc = rom[2] >> 30 & 1;
580 581
 out:
	kfree(rom);
582

583
	return ret;
584 585 586 587 588 589 590 591 592
}

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

	kfree(unit);
}

593 594 595 596 597
static struct device_type fw_unit_type = {
	.uevent		= fw_unit_uevent,
	.release	= fw_unit_release,
};

598 599
static int is_fw_unit(struct device *dev)
{
600
	return dev->type == &fw_unit_type;
601 602 603 604 605 606 607 608 609 610 611 612 613 614
}

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;

615 616 617 618
		/*
		 * Get the address of the unit directory and try to
		 * match the drivers id_tables against it.
		 */
619
		unit = kzalloc(sizeof(*unit), GFP_KERNEL);
620 621 622 623 624 625 626
		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;
627
		unit->device.type = &fw_unit_type;
628
		unit->device.parent = &device->device;
629
		dev_set_name(&unit->device, "%s.%d", dev_name(&device->device), i++);
630

631 632 633
		BUILD_BUG_ON(ARRAY_SIZE(unit->attribute_group.attrs) <
				ARRAY_SIZE(fw_unit_attributes) +
				ARRAY_SIZE(config_rom_attributes));
634 635 636
		init_fw_attribute_group(&unit->device,
					fw_unit_attributes,
					&unit->attribute_group);
637

638 639 640 641 642 643 644
		if (device_register(&unit->device) < 0)
			goto skip_unit;

		continue;

	skip_unit:
		kfree(unit);
645 646 647 648 649
	}
}

static int shutdown_unit(struct device *device, void *data)
{
650
	device_unregister(device);
651 652 653 654

	return 0;
}

655 656 657 658 659 660 661 662
/*
 * 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);

663
DEFINE_IDR(fw_device_idr);
664 665
int fw_cdev_major;

666
struct fw_device *fw_device_get_by_devt(dev_t devt)
667 668 669
{
	struct fw_device *device;

670
	down_read(&fw_device_rwsem);
671
	device = idr_find(&fw_device_idr, MINOR(devt));
672 673
	if (device)
		fw_device_get(device);
674
	up_read(&fw_device_rwsem);
675 676 677 678

	return device;
}

679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694
/*
 * 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)

695 696 697 698
static void fw_device_shutdown(struct work_struct *work)
{
	struct fw_device *device =
		container_of(work, struct fw_device, work.work);
699 700
	int minor = MINOR(device->device.devt);

701 702
	if (time_is_after_jiffies(device->card->reset_jiffies + SHUTDOWN_DELAY)
	    && !list_empty(&device->card->link)) {
703 704 705 706 707 708 709 710 711
		schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
		return;
	}

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

712
	fw_device_cdev_remove(device);
713 714
	device_for_each_child(&device->device, NULL, shutdown_unit);
	device_unregister(&device->device);
715

716
	down_write(&fw_device_rwsem);
717
	idr_remove(&fw_device_idr, minor);
718
	up_write(&fw_device_rwsem);
719

720
	fw_device_put(device);
721 722
}

723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
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);
}

744
static struct device_type fw_device_type = {
745
	.release = fw_device_release,
746 747
};

748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
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);
}
770

771
/*
772 773 774 775
 * 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.
776
 */
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
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));
805

806 807 808 809 810 811 812 813 814 815 816 817 818 819
		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;
}
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 847 848 849 850 851 852 853 854 855 856 857 858
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);
	}
}

859 860 861 862
static void fw_device_init(struct work_struct *work)
{
	struct fw_device *device =
		container_of(work, struct fw_device, work.work);
863
	struct device *revived_dev;
864
	int minor, ret;
865

866 867
	/*
	 * All failure paths here set node->data to NULL, so that we
868
	 * don't try to do device_for_each_child() on a kfree()'d
869 870
	 * device.
	 */
871

872
	if (read_bus_info_block(device, device->generation) < 0) {
873 874
		if (device->config_rom_retries < MAX_RETRIES &&
		    atomic_read(&device->state) == FW_DEVICE_INITIALIZING) {
875 876 877
			device->config_rom_retries++;
			schedule_delayed_work(&device->work, RETRY_DELAY);
		} else {
878
			fw_notify("giving up on config rom for node id %x\n",
879
				  device->node_id);
880
			if (device->node == device->card->root_node)
881
				fw_schedule_bm_work(device->card, 0);
882 883 884 885 886
			fw_device_release(&device->device);
		}
		return;
	}

887 888 889 890 891 892 893 894 895
	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;
	}

896
	device_initialize(&device->device);
897 898

	fw_device_get(device);
899
	down_write(&fw_device_rwsem);
900
	ret = idr_pre_get(&fw_device_idr, GFP_KERNEL) ?
901 902
	      idr_get_new(&fw_device_idr, device, &minor) :
	      -ENOMEM;
903
	up_write(&fw_device_rwsem);
904

905
	if (ret < 0)
906 907
		goto error;

908
	device->device.bus = &fw_bus_type;
909
	device->device.type = &fw_device_type;
910
	device->device.parent = device->card->device;
911
	device->device.devt = MKDEV(fw_cdev_major, minor);
912
	dev_set_name(&device->device, "fw%d", minor);
913

914 915 916
	BUILD_BUG_ON(ARRAY_SIZE(device->attribute_group.attrs) <
			ARRAY_SIZE(fw_device_attributes) +
			ARRAY_SIZE(config_rom_attributes));
917 918 919
	init_fw_attribute_group(&device->device,
				fw_device_attributes,
				&device->attribute_group);
920

921 922
	if (device_add(&device->device)) {
		fw_error("Failed to add device.\n");
923
		goto error_with_cdev;
924 925 926 927
	}

	create_units(device);

928 929
	/*
	 * Transition the device to running state.  If it got pulled
930 931 932 933 934
	 * 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
935 936
	 * fw_node_event().
	 */
937
	if (atomic_cmpxchg(&device->state,
938 939 940 941
			   FW_DEVICE_INITIALIZING,
			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
		PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
		schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
942 943 944 945
	} else {
		if (device->config_rom_retries)
			fw_notify("created device %s: GUID %08x%08x, S%d00, "
				  "%d config ROM retries\n",
946
				  dev_name(&device->device),
947 948 949 950 951
				  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",
952
				  dev_name(&device->device),
953 954
				  device->config_rom[3], device->config_rom[4],
				  1 << device->max_speed);
955
		device->config_rom_retries = 0;
956 957

		fw_device_set_broadcast_channel(device, device->generation);
958
	}
959

960 961
	/*
	 * Reschedule the IRM work if we just finished reading the
962 963
	 * root node config rom.  If this races with a bus reset we
	 * just end up running the IRM work a couple of extra times -
964 965
	 * pretty harmless.
	 */
966
	if (device->node == device->card->root_node)
967
		fw_schedule_bm_work(device->card, 0);
968 969 970

	return;

971
 error_with_cdev:
972
	down_write(&fw_device_rwsem);
973
	idr_remove(&fw_device_idr, minor);
974
	up_write(&fw_device_rwsem);
S
Stefan Richter 已提交
975
 error:
976 977 978
	fw_device_put(device);		/* fw_device_idr's reference */

	put_device(&device->device);	/* our reference */
979 980
}

981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
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;

1001
		if (q != device->config_rom[i])
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
			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,
1031 1032
				   FW_DEVICE_INITIALIZING,
				   FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
			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);

1062 1063 1064
	/* Userspace may want to re-read attributes. */
	kobject_uevent(&device->device.kobj, KOBJ_CHANGE);

1065
	if (atomic_cmpxchg(&device->state,
1066 1067
			   FW_DEVICE_INITIALIZING,
			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
1068 1069
		goto gone;

1070
	fw_notify("refreshed device %s\n", dev_name(&device->device));
1071 1072 1073 1074
	device->config_rom_retries = 0;
	goto out;

 give_up:
1075
	fw_notify("giving up on refresh of device %s\n", dev_name(&device->device));
1076
 gone:
1077 1078 1079
	atomic_set(&device->state, FW_DEVICE_GONE);
	PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
	schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
1080 1081
 out:
	if (node_id == card->root_node->node_id)
1082
		fw_schedule_bm_work(card, 0);
1083 1084
}

1085 1086 1087 1088 1089 1090 1091 1092 1093
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;
1094
 create:
1095 1096 1097 1098
		device = kzalloc(sizeof(*device), GFP_ATOMIC);
		if (device == NULL)
			break;

1099 1100
		/*
		 * Do minimal intialization of the device here, the
1101 1102 1103 1104 1105 1106 1107
		 * 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.
1108
		 */
1109
		atomic_set(&device->state, FW_DEVICE_INITIALIZING);
1110
		device->card = fw_card_get(card);
1111 1112 1113
		device->node = fw_node_get(node);
		device->node_id = node->node_id;
		device->generation = card->generation;
1114
		device->is_local = node == card->local_node;
1115
		mutex_init(&device->client_list_mutex);
1116
		INIT_LIST_HEAD(&device->client_list);
1117

1118 1119
		/*
		 * Set the node data to point back to this device so
1120
		 * FW_NODE_UPDATED callbacks can update the node_id
1121 1122
		 * and generation for the device.
		 */
1123 1124
		node->data = device;

1125 1126
		/*
		 * Many devices are slow to respond after bus resets,
1127 1128
		 * especially if they are bus powered and go through
		 * power-up after getting plugged in.  We schedule the
1129 1130
		 * first config rom scan half a second after bus reset.
		 */
1131 1132 1133 1134
		INIT_DELAYED_WORK(&device->work, fw_device_init);
		schedule_delayed_work(&device->work, INITIAL_DELAY);
		break;

1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
	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,
1148
				device->is_local ? 0 : INITIAL_DELAY);
1149 1150 1151
		}
		break;

1152 1153 1154 1155 1156 1157
	case FW_NODE_UPDATED:
		if (!node->link_on || node->data == NULL)
			break;

		device = node->data;
		device->node_id = node->node_id;
1158
		smp_wmb();  /* update node_id before generation */
1159
		device->generation = card->generation;
1160 1161 1162 1163
		if (atomic_read(&device->state) == FW_DEVICE_RUNNING) {
			PREPARE_DELAYED_WORK(&device->work, fw_device_update);
			schedule_delayed_work(&device->work, 0);
		}
1164 1165 1166 1167 1168 1169 1170
		break;

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

1171 1172
		/*
		 * Destroy the device associated with the node.  There
1173 1174 1175 1176 1177 1178 1179 1180
		 * 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
1181 1182
		 * to create the device.
		 */
1183
		device = node->data;
1184
		if (atomic_xchg(&device->state,
1185
				FW_DEVICE_GONE) == FW_DEVICE_RUNNING) {
1186
			PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
1187 1188
			schedule_delayed_work(&device->work,
				list_empty(&card->link) ? 0 : SHUTDOWN_DELAY);
1189 1190 1191 1192
		}
		break;
	}
}