static int most_nd_open(struct net_device *dev)
 {
        struct net_dev_context *nd = dev->ml_priv;
-       long wait_res;
+       long ret;
 
        netdev_info(dev, "open net device\n");
 
                return -EBUSY;
        }
 
-       nd->channels_opened = true;
-       netif_wake_queue(dev);
-
-       if (is_valid_ether_addr(dev->dev_addr))
-               return 0;
-
-       nd->iface->request_netinfo(nd->iface, nd->tx.ch_id);
-       wait_res = wait_for_completion_interruptible_timeout(
-                          &nd->mac_compl, msecs_to_jiffies(5000));
-       if (!wait_res) {
-               netdev_err(dev, "mac timeout\n");
-               return -EBUSY;
-       }
+       if (!is_valid_ether_addr(dev->dev_addr)) {
+               nd->iface->request_netinfo(nd->iface, nd->tx.ch_id);
+               ret = wait_for_completion_interruptible_timeout(
+                             &nd->mac_compl, msecs_to_jiffies(5000));
+               if (!ret) {
+                       netdev_err(dev, "mac timeout\n");
+                       ret = -EBUSY;
+                       goto err;
+               }
 
-       if (wait_res < 0) {
-               netdev_warn(dev, "mac waiting interrupted\n");
-               return wait_res;
+               if (ret < 0) {
+                       netdev_warn(dev, "mac waiting interrupted\n");
+                       goto err;
+               }
        }
 
+       nd->channels_opened = true;
+       netif_wake_queue(dev);
        return 0;
+
+err:
+       most_stop_channel(nd->iface, nd->tx.ch_id, &aim);
+       most_stop_channel(nd->iface, nd->rx.ch_id, &aim);
+       return ret;
 }
 
 static int most_nd_stop(struct net_device *dev)