struct oz_endpoint *ep;
 
        ozhcd = oz_hcd_claim();
-       if (ozhcd == NULL)
+       if (!ozhcd)
                return NULL;
        /* Allocate an endpoint object in advance (before holding hcd lock) to
         * use for out endpoint 0.
         */
        ep = oz_ep_alloc(0, GFP_ATOMIC);
+       if (!ep)
+               goto err_put;
+
        spin_lock_bh(&ozhcd->hcd_lock);
-       if (ozhcd->conn_port >= 0) {
-               spin_unlock_bh(&ozhcd->hcd_lock);
-               oz_dbg(ON, "conn_port >= 0\n");
-               goto out;
-       }
+       if (ozhcd->conn_port >= 0)
+               goto err_unlock;
+
        for (i = 0; i < OZ_NB_PORTS; i++) {
                struct oz_port *port = &ozhcd->ports[i];
+
                spin_lock(&port->port_lock);
-               if ((port->flags & OZ_PORT_F_PRESENT) == 0) {
+               if (!(port->flags & OZ_PORT_F_PRESENT)) {
                        oz_acquire_port(port, hpd);
                        spin_unlock(&port->port_lock);
                        break;
                }
                spin_unlock(&port->port_lock);
        }
-       if (i < OZ_NB_PORTS) {
-               oz_dbg(ON, "Setting conn_port = %d\n", i);
-               ozhcd->conn_port = i;
-               /* Attach out endpoint 0.
-                */
-               ozhcd->ports[i].out_ep[0] = ep;
-               ep = NULL;
-               hport = &ozhcd->ports[i];
-               spin_unlock_bh(&ozhcd->hcd_lock);
-               if (ozhcd->flags & OZ_HDC_F_SUSPENDED) {
-                       oz_dbg(ON, "Resuming root hub\n");
-                       usb_hcd_resume_root_hub(ozhcd->hcd);
-               }
-               usb_hcd_poll_rh_status(ozhcd->hcd);
-       } else {
-               spin_unlock_bh(&ozhcd->hcd_lock);
-       }
-out:
-       if (ep) /* ep is non-null if not used. */
-               oz_ep_free(NULL, ep);
+       if (i == OZ_NB_PORTS)
+               goto err_unlock;
+
+       ozhcd->conn_port = i;
+       hport = &ozhcd->ports[i];
+       hport->out_ep[0] = ep;
+       spin_unlock_bh(&ozhcd->hcd_lock);
+       if (ozhcd->flags & OZ_HDC_F_SUSPENDED)
+               usb_hcd_resume_root_hub(ozhcd->hcd);
+       usb_hcd_poll_rh_status(ozhcd->hcd);
        oz_hcd_put(ozhcd);
+
        return hport;
+
+err_unlock:
+       spin_unlock_bh(&ozhcd->hcd_lock);
+       oz_ep_free(NULL, ep);
+err_put:
+       oz_hcd_put(ozhcd);
+       return NULL;
 }
 
 /*------------------------------------------------------------------------------