Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branches 'fixes' and 'fwnet' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6

* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
firewire: core: fix unstable I/O with Canon camcorder

* 'fwnet' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
firewire: net: is not experimental anymore
firewire: net: invalidate ARP entries of removed nodes

+19 -7
+2 -4
drivers/firewire/Kconfig
··· 49 49 configuration section. 50 50 51 51 config FIREWIRE_NET 52 - tristate "IP networking over 1394 (EXPERIMENTAL)" 53 - depends on FIREWIRE && INET && EXPERIMENTAL 52 + tristate "IP networking over 1394" 53 + depends on FIREWIRE && INET 54 54 help 55 55 This enables IPv4 over IEEE 1394, providing IP connectivity with 56 56 other implementations of RFC 2734 as found on several operating 57 57 systems. Multicast support is currently limited. 58 - 59 - NOTE, this driver is not stable yet! 60 58 61 59 To compile this driver as a module, say M here: The module will be 62 60 called firewire-net.
+9 -2
drivers/firewire/core-card.c
··· 75 75 #define BIB_IRMC ((1) << 31) 76 76 #define NODE_CAPABILITIES 0x0c0083c0 /* per IEEE 1394 clause 8.3.2.6.5.2 */ 77 77 78 + #define CANON_OUI 0x000085 79 + 78 80 static void generate_config_rom(struct fw_card *card, __be32 *config_rom) 79 81 { 80 82 struct fw_descriptor *desc; ··· 286 284 bool root_device_is_running; 287 285 bool root_device_is_cmc; 288 286 bool irm_is_1394_1995_only; 287 + bool keep_this_irm; 289 288 290 289 spin_lock_irq(&card->lock); 291 290 ··· 307 304 irm_device = card->irm_node->data; 308 305 irm_is_1394_1995_only = irm_device && irm_device->config_rom && 309 306 (irm_device->config_rom[2] & 0x000000f0) == 0; 307 + 308 + /* Canon MV5i works unreliably if it is not root node. */ 309 + keep_this_irm = irm_device && irm_device->config_rom && 310 + irm_device->config_rom[3] >> 8 == CANON_OUI; 310 311 311 312 root_id = root_node->node_id; 312 313 irm_id = card->irm_node->node_id; ··· 340 333 goto pick_me; 341 334 } 342 335 343 - if (irm_is_1394_1995_only) { 336 + if (irm_is_1394_1995_only && !keep_this_irm) { 344 337 new_root_id = local_id; 345 338 fw_notify("%s, making local node (%02x) root.\n", 346 339 "IRM is not 1394a compliant", new_root_id); ··· 389 382 390 383 spin_lock_irq(&card->lock); 391 384 392 - if (rcode != RCODE_COMPLETE) { 385 + if (rcode != RCODE_COMPLETE && !keep_this_irm) { 393 386 /* 394 387 * The lock request failed, maybe the IRM 395 388 * isn't really IRM capable after all. Let's
+8 -1
drivers/firewire/net.c
··· 191 191 struct fwnet_device *dev; 192 192 u64 guid; 193 193 u64 fifo; 194 + __be32 ip; 194 195 195 196 /* guarded by dev->lock */ 196 197 struct list_head pd_list; /* received partial datagrams */ ··· 571 570 peer->speed = sspd; 572 571 if (peer->max_payload > max_payload) 573 572 peer->max_payload = max_payload; 573 + 574 + peer->ip = arp1394->sip; 574 575 } 575 576 spin_unlock_irqrestore(&dev->lock, flags); 576 577 ··· 1473 1470 peer->dev = dev; 1474 1471 peer->guid = (u64)device->config_rom[3] << 32 | device->config_rom[4]; 1475 1472 peer->fifo = FWNET_NO_FIFO_ADDR; 1473 + peer->ip = 0; 1476 1474 INIT_LIST_HEAD(&peer->pd_list); 1477 1475 peer->pdg_size = 0; 1478 1476 peer->datagram_label = 0; ··· 1593 1589 1594 1590 mutex_lock(&fwnet_device_mutex); 1595 1591 1592 + net = dev->netdev; 1593 + if (net && peer->ip) 1594 + arp_invalidate(net, peer->ip); 1595 + 1596 1596 fwnet_remove_peer(peer, dev); 1597 1597 1598 1598 if (list_empty(&dev->peer_list)) { 1599 - net = dev->netdev; 1600 1599 unregister_netdev(net); 1601 1600 1602 1601 if (dev->local_fifo != FWNET_NO_FIFO_ADDR)