|
@@ -191,6 +191,7 @@ struct fwnet_peer {
|
|
|
struct fwnet_device *dev;
|
|
|
u64 guid;
|
|
|
u64 fifo;
|
|
|
+ __be32 ip;
|
|
|
|
|
|
/* guarded by dev->lock */
|
|
|
struct list_head pd_list; /* received partial datagrams */
|
|
@@ -570,6 +571,8 @@ static int fwnet_finish_incoming_packet(struct net_device *net,
|
|
|
peer->speed = sspd;
|
|
|
if (peer->max_payload > max_payload)
|
|
|
peer->max_payload = max_payload;
|
|
|
+
|
|
|
+ peer->ip = arp1394->sip;
|
|
|
}
|
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
|
|
|
@@ -1470,6 +1473,7 @@ static int fwnet_add_peer(struct fwnet_device *dev,
|
|
|
peer->dev = dev;
|
|
|
peer->guid = (u64)device->config_rom[3] << 32 | device->config_rom[4];
|
|
|
peer->fifo = FWNET_NO_FIFO_ADDR;
|
|
|
+ peer->ip = 0;
|
|
|
INIT_LIST_HEAD(&peer->pd_list);
|
|
|
peer->pdg_size = 0;
|
|
|
peer->datagram_label = 0;
|
|
@@ -1589,10 +1593,13 @@ static int fwnet_remove(struct device *_dev)
|
|
|
|
|
|
mutex_lock(&fwnet_device_mutex);
|
|
|
|
|
|
+ net = dev->netdev;
|
|
|
+ if (net && peer->ip)
|
|
|
+ arp_invalidate(net, peer->ip);
|
|
|
+
|
|
|
fwnet_remove_peer(peer, dev);
|
|
|
|
|
|
if (list_empty(&dev->peer_list)) {
|
|
|
- net = dev->netdev;
|
|
|
unregister_netdev(net);
|
|
|
|
|
|
if (dev->local_fifo != FWNET_NO_FIFO_ADDR)
|