isdn/gigaset: try USB reset for bas_gigaset error recovery
authorTilman Schmidt <tilman@imap.cc>
Thu, 30 Sep 2010 13:35:21 +0000 (13:35 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Oct 2010 07:33:35 +0000 (00:33 -0700)
In error_reset(), if sending HD_RESET_INTERRUPT_PIPE to the device
fails, try performing an USB reset.
Also correct an error in the leading comment.

Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/isdn/gigaset/bas-gigaset.c

index e865c5dc0282c87e4bc7c0747ed944fc77e20cbc..7520bc6f38716f09e8106d61aba4283bd038763e 100644 (file)
@@ -350,7 +350,7 @@ static inline void error_hangup(struct bc_state *bcs)
  * reset Gigaset device because of an unrecoverable error
  * This function may be called from any context, and takes care of
  * scheduling the necessary actions for execution outside of interrupt context.
- * cs->lock must not be held.
+ * cs->hw.bas->lock must not be held.
  * argument:
  *     controller state structure
  */
@@ -358,7 +358,9 @@ static inline void error_reset(struct cardstate *cs)
 {
        /* reset interrupt pipe to recover (ignore errors) */
        update_basstate(cs->hw.bas, BS_RESETTING, 0);
-       req_submit(cs->bcs, HD_RESET_INTERRUPT_PIPE, 0, BAS_TIMEOUT);
+       if (req_submit(cs->bcs, HD_RESET_INTERRUPT_PIPE, 0, BAS_TIMEOUT))
+               /* submission failed, escalate to USB port reset */
+               usb_queue_reset_device(cs->hw.bas->interface);
 }
 
 /* check_pending