int rc;
        unsigned long flags;
 
-       if (!try_module_get(THIS_MODULE))
-               return -EBUSY;
-
        DBGINFO(("%s hdlcdev_open\n", dev->name));
 
-       /* generic HDLC layer open processing */
-       rc = hdlc_open(dev);
-       if (rc)
-               return rc;
-
        /* arbitrate between network and tty opens */
        spin_lock_irqsave(&info->netlock, flags);
        if (info->port.count != 0 || info->netcount != 0) {
                return rc;
        }
 
+       /* generic HDLC layer open processing */
+       rc = hdlc_open(dev);
+       if (rc) {
+               shutdown(info);
+               spin_lock_irqsave(&info->netlock, flags);
+               info->netcount = 0;
+               spin_unlock_irqrestore(&info->netlock, flags);
+               return rc;
+       }
+
        /* assert RTS and DTR, apply hardware settings */
        info->signals |= SerialSignal_RTS | SerialSignal_DTR;
        program_hw(info);
        info->netcount=0;
        spin_unlock_irqrestore(&info->netlock, flags);
 
-       module_put(THIS_MODULE);
        return 0;
 }