Linus,

These are various irda patches (2nd part) to fix various bit of the stack. Please
apply to your latest Linux-2.4.2 code. Changes:

o Fix socket stuck in CONN_PEND
o NSC wakeup fix
o Fix for IrDA stack static init

diff -u -p linux/net/irda/irlmp_event.d7.c linux/net/irda/irlmp_event.c
--- linux/net/irda/irlmp_event.d7.c     Tue Feb 20 14:14:33 2001
+++ linux/net/irda/irlmp_event.c        Tue Feb 20 14:41:31 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,6 +479,8 @@ 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);
                break;
        default:
@@ -562,6 +562,15 @@ static int irlmp_state_connect_pend(stru
        switch (event) {
        case LM_CONNECT_REQUEST:
                /* Keep state */
+               break;
+       case LM_CONNECT_INDICATION:
+               /* Will happen in some rare cases when the socket get stuck,
+                * the other side retries the connect request.
+                * We just unstuck the socket - Jean II */
+               IRDA_DEBUG(0, __FUNCTION__ "(), LM_CONNECT_INDICATION, "
+                          "LSAP stuck in CONNECT_PEND state...\n");
+               /* Keep state */
+               irlmp_do_lap_event(self->lap, LM_LAP_CONNECT_REQUEST, NULL);
                break;
        case LM_CONNECT_RESPONSE:
                IRDA_DEBUG(0, __FUNCTION__ "(), LM_CONNECT_RESPONSE, "

diff -u -p linux/drivers/net/irda/nsc-ircc.j1.c linux/drivers/net/irda/nsc-ircc.c
--- linux/drivers/net/irda/nsc-ircc.j1.c        Fri Feb 23 15:56:05 2001
+++ linux/drivers/net/irda/nsc-ircc.c   Fri Feb 23 16:01:20 2001
@@ -251,9 +251,14 @@ static int nsc_ircc_open(int i, chipio_t
 
        IRDA_DEBUG(2, __FUNCTION__ "()\n");
 
+       MESSAGE("%s, Found chip at base=0x%03x\n", driver_name,
+               info->cfg_base);
+
        if ((nsc_ircc_setup(info)) == -1)
                return -1;
 
+       MESSAGE("%s, driver loaded (Dag Brattli)\n", driver_name);
+
        /* Allocate new instance of the driver */
        self = kmalloc(sizeof(struct nsc_ircc_cb), GFP_KERNEL);
        if (self == NULL) {
@@ -699,8 +704,6 @@ static int nsc_ircc_setup(chipio_t *info
                ERROR("%s, Wrong chip version %02x\n", driver_name, version);
                return -1;
        }
-       MESSAGE("%s, Found chip at base=0x%03x\n", driver_name, 
-               info->cfg_base);
 
        /* Switch to advanced mode */
        switch_bank(iobase, BANK2);
@@ -729,8 +732,6 @@ static int nsc_ircc_setup(chipio_t *info
        outb(0x0d, iobase+2); /* Set SIR pulse width to 1.6us */
        outb(0x2a, iobase+4); /* Set beginning frag, and preamble length */
 
-       MESSAGE("%s, driver loaded (Dag Brattli)\n", driver_name);
-
        /* Enable receive interrupts */
        switch_bank(iobase, BANK0);
        outb(IER_RXHDL_IE, iobase+IER);
@@ -1859,7 +1860,7 @@ static int nsc_ircc_net_open(struct net_
        if (request_dma(self->io.dma, dev->name)) {
                WARNING("%s, unable to allocate dma=%d\n", driver_name, 
                        self->io.dma);
-               free_irq(self->io.irq, self);
+               free_irq(self->io.irq, dev);
                return -EAGAIN;
        }
        
@@ -2011,18 +2012,10 @@ static void nsc_ircc_suspend(struct nsc_
 
 static void nsc_ircc_wakeup(struct nsc_ircc_cb *self)
 {
-       int iobase;
-
        if (!self->io.suspended)
                return;
 
-       iobase = self->io.fir_base;
-
-       /* Switch to advanced mode */
-       switch_bank(iobase, BANK2);
-       outb(ECR1_EXT_SL, iobase+ECR1);
-       switch_bank(iobase, BANK0);
-
+       nsc_ircc_setup(&self->io);
        nsc_ircc_net_open(self->netdev);
        
        MESSAGE("%s, Waking up\n", driver_name);

diff -urpN linux-2.4.1-pre8/init/main.c linux-2.4.1-pre8-irda-patch/init/main.c
--- linux-2.4.1-pre8/init/main.c        Thu Jan  4 05:45:26 2001
+++ linux-2.4.1-pre8-irda-patch/init/main.c     Mon Jan 22 00:53:49 2001
@@ -726,6 +726,7 @@ static void __init do_basic_setup(void)
        filesystem_setup();
 
 #ifdef CONFIG_IRDA
+       irda_proto_init();
        irda_device_init(); /* Must be done after protocol initialization */
 #endif
 #ifdef CONFIG_PCMCIA



----
Dag Brattli     <[EMAIL PROTECTED]>
My homepage     http://www.brattli.net/dag/
Try Linux-IrDA: http://irda.sourceforge.net/
Try Pygmy:      http://pygmy.sourceforge.net/

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to