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", 

Reply via email to