};
 
 static struct ic_device *ic_first_dev __initdata;      /* List of open device */
-static struct net_device *ic_dev __initdata;           /* Selected device */
+static struct ic_device *ic_dev __initdata;            /* Selected device */
 
 static bool __init ic_is_init_dev(struct net_device *dev)
 {
        while ((d = next)) {
                next = d->next;
                dev = d->dev;
-               if (dev != ic_dev && !netdev_uses_dsa(dev)) {
+               if (dev != ic_dev->dev && !netdev_uses_dsa(dev)) {
                        pr_debug("IP-Config: Downing %s\n", dev->name);
                        dev_change_flags(dev, d->flags);
                }
        int err;
 
        memset(&ir, 0, sizeof(ir));
-       strcpy(ir.ifr_ifrn.ifrn_name, ic_dev->name);
+       strcpy(ir.ifr_ifrn.ifrn_name, ic_dev->dev->name);
        set_sockaddr(sin, ic_myaddr, 0);
        if ((err = ic_devinet_ioctl(SIOCSIFADDR, &ir)) < 0) {
                pr_err("IP-Config: Unable to set interface address (%d)\n",
         * out, we'll try to muddle along.
         */
        if (ic_dev_mtu != 0) {
-               strcpy(ir.ifr_name, ic_dev->name);
+               strcpy(ir.ifr_name, ic_dev->dev->name);
                ir.ifr_mtu = ic_dev_mtu;
                if ((err = ic_dev_ioctl(SIOCSIFMTU, &ir)) < 0)
                        pr_err("IP-Config: Unable to set interface mtu to %d (%d)\n",
                goto drop_unlock;
 
        /* We have a winner! */
-       ic_dev = dev;
+       ic_dev = d;
        if (ic_myaddr == NONE)
                ic_myaddr = tip;
        ic_servaddr = sip;
        .func = ic_bootp_recv,
 };
 
-static __be32 ic_dev_xid;              /* Device under configuration */
-
 /*
  *  Initialize DHCP/BOOTP extension fields in the request.
  */
                goto drop_unlock;
        }
 
-       /* Is it a reply for the device we are configuring? */
-       if (b->xid != ic_dev_xid) {
-               net_err_ratelimited("DHCP/BOOTP: Ignoring delayed packet\n");
-               goto drop_unlock;
-       }
-
        /* Parse extensions */
        if (ext_len >= 4 &&
            !memcmp(b->exten, ic_bootp_cookie, 4)) { /* Check magic cookie */
        }
 
        /* We have a winner! */
-       ic_dev = dev;
+       ic_dev = d;
        ic_myaddr = b->your_ip;
        ic_servaddr = b->server_ip;
        ic_addrservaddr = b->iph.saddr;
        timeout = CONF_BASE_TIMEOUT + (timeout % (unsigned int) CONF_TIMEOUT_RANDOM);
        for (;;) {
 #ifdef IPCONFIG_BOOTP
-               /* Track the device we are configuring */
-               ic_dev_xid = d->xid;
-
                if (do_bootp && (d->able & IC_BOOTP))
                        ic_bootp_send_if(d, jiffies - start_jiffies);
 #endif
                    (ic_proto_enabled & IC_USE_DHCP) &&
                    ic_dhcp_msgtype != DHCPACK) {
                        ic_got_reply = 0;
+                       /* continue on device that got the reply */
+                       d = ic_dev;
                        pr_cont(",");
                        continue;
                }
 #endif /* IPCONFIG_DYNAMIC */
        } else {
                /* Device selected manually or only one device -> use it */
-               ic_dev = ic_first_dev->dev;
+               ic_dev = ic_first_dev;
        }
 
        addr = root_nfs_parse_addr(root_server_path);
        pr_info("IP-Config: Complete:\n");
 
        pr_info("     device=%s, hwaddr=%*phC, ipaddr=%pI4, mask=%pI4, gw=%pI4\n",
-               ic_dev->name, ic_dev->addr_len, ic_dev->dev_addr,
+               ic_dev->dev->name, ic_dev->dev->addr_len, ic_dev->dev->dev_addr,
                &ic_myaddr, &ic_netmask, &ic_gateway);
        pr_info("     host=%s, domain=%s, nis-domain=%s\n",
                utsname()->nodename, ic_domain, utsname()->domainname);