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