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 <dag@brattli.net> 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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Wed Feb 28 2001 - 21:00:15 EST