|
@@ -668,50 +668,50 @@ struct oz_port *oz_hcd_pd_arrived(void *hpd)
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|