Hi,
I must admit, I got it wrong the first time. The previous fix
didn't do anything. It's only today that I saw this ugly bug poping up
(amongst the other USB bugs), so I fixed it.
So : remove the previous patch...
Enjoy...
Jean
diff -u -p linux/net/irda/irlmp_event.j1.c linux/net/irda/irlmp_event.c
--- linux/net/irda/irlmp_event.j1.c Wed Feb 28 17:33:45 2001
+++ linux/net/irda/irlmp_event.c Fri Mar 2 17:28:36 2001
@@ -472,8 +472,6 @@ static int irlmp_state_disconnected(stru
irlmp_start_watchdog_timer(self, 5*HZ);
break;
case LM_CONNECT_INDICATION:
- irlmp_next_lsap_state(self, LSAP_CONNECT_PEND);
-
if (self->conn_skb) {
WARNING(__FUNCTION__
"(), busy with another request!\n");
@@ -481,7 +479,12 @@ static int irlmp_state_disconnected(stru
}
self->conn_skb = skb;
+ irlmp_next_lsap_state(self, LSAP_CONNECT_PEND);
+
irlmp_do_lap_event(self->lap, LM_LAP_CONNECT_REQUEST, NULL);
+
+ /* Start watchdog timer (5 secs for now) */
+ irlmp_start_watchdog_timer(self, 5*HZ);
break;
default:
IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n",
@@ -533,6 +536,16 @@ static int irlmp_state_connect(struct ls
irlmp_next_lsap_state(self, LSAP_DATA_TRANSFER_READY);
break;
+ case LM_WATCHDOG_TIMEOUT:
+ /* May happen, who knows...
+ * Jean II */
+ IRDA_DEBUG(0, __FUNCTION__ "() WATCHDOG_TIMEOUT!\n");
+
+ /* Here, we should probably disconnect proper */
+ self->dlsap_sel = LSAP_ANY;
+ self->conn_skb = NULL;
+ irlmp_next_lsap_state(self, LSAP_DISCONNECTED);
+ break;
default:
IRDA_DEBUG(0, __FUNCTION__ "(), Unknown event %s\n",
irlmp_event[event]);
@@ -581,6 +594,17 @@ static int irlmp_state_connect_pend(stru
self->conn_skb = NULL;
irlmp_connect_indication(self, skb);
+ break;
+ case LM_WATCHDOG_TIMEOUT:
+ /* Will happen in some rare cases when the socket get stuck,
+ * Don't know why it happens, but we just unstuck the socket
+ * Jean II */
+ IRDA_DEBUG(0, __FUNCTION__ "() WATCHDOG_TIMEOUT!\n");
+
+ /* Go back to disconnected mode, keep the socket waiting */
+ self->dlsap_sel = LSAP_ANY;
+ self->conn_skb = NULL;
+ irlmp_next_lsap_state(self, LSAP_DISCONNECTED);
break;
default:
IRDA_DEBUG(0, __FUNCTION__ "Unknown event %s\n",