patch-2.4.0-test11 linux/drivers/net/irda/smc-ircc.c

Next file: linux/drivers/net/irda/toshoboe.c
Previous file: linux/drivers/net/irda/nsc-ircc.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test10/linux/drivers/net/irda/smc-ircc.c linux/drivers/net/irda/smc-ircc.c
@@ -7,7 +7,7 @@
  * Author:        Thomas Davis (tadavis@jps.net)
  * Created at:    
  * Modified at:   Tue Feb 22 10:05:06 2000
- * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * Modified by:   Dag Brattli <dag@brattli.net>
  * 
  *     Copyright (c) 1999-2000 Dag Brattli
  *     Copyright (c) 1998-1999 Thomas Davis, 
@@ -252,6 +252,7 @@
 		IR_115200|IR_576000|IR_1152000|(IR_4000000 << 8);
 
 	irport->qos.min_turn_time.bits = 0x07;
+	irport->qos.window_size.bits = 0x01;
 	irda_qos_bits_to_value(&irport->qos);
 
 	irport->flags = IFF_FIR|IFF_MIR|IFF_SIR|IFF_DMA|IFF_PIO;
@@ -508,6 +509,10 @@
 	outb(0x00, iobase+IRCC_MASTER);
 
 	switch (speed) {
+	default:
+		IRDA_DEBUG(0, __FUNCTION__ "(), unknown baud rate of %d\n", 
+			   speed);
+		/* FALLTHROUGH */
 	case 9600:
 	case 19200:
 	case 38400:
@@ -535,10 +540,6 @@
 		fast = IRCC_LCR_A_FAST;
 		IRDA_DEBUG(0, __FUNCTION__ "(), handling baud of 4000000\n");
 		break;
-	default:
-		IRDA_DEBUG(0, __FUNCTION__ "(), unknown baud rate of %d\n", 
-			   speed);
-		return;
 	}
 	
 	register_bank(iobase, 0);
@@ -589,6 +590,8 @@
 	
 	register_bank(iobase, 0);
 	outb(fast, iobase+IRCC_LCR_A);
+	
+	netif_start_queue(dev);
 }
 
 /*
@@ -612,13 +615,19 @@
 
 	iobase = self->io.fir_base;
 
-	spin_lock_irqsave(&self->lock, flags);
+	netif_stop_queue(dev);
 
 	/* Check if we need to change the speed after this frame */
-	if ((speed = irda_get_speed(skb)) != self->io.speed)
-		self->new_speed = speed;
+	if ((speed = irda_get_speed(skb)) != self->io.speed) {
+		/* Check for empty frame */
+		if (!skb->len) {
+			ircc_change_speed(self, speed); 
+			return 0;
+		} else
+			self->new_speed = speed;
+	}
 	
-	netif_stop_queue(dev);
+	spin_lock_irqsave(&self->lock, flags);
 
 	memcpy(self->tx_buff.head, skb->data, skb->len);
 
@@ -630,7 +639,7 @@
 		int bofs;
 
 		/* 
-		 * Compute who many BOFS (STA or PA's) we need to waste the
+		 * Compute how many BOFs (STA or PA's) we need to waste the
 		 * min turn time given the speed of the link.
 		 */
 		bofs = mtt * (self->io.speed / 1000) / 8000;
@@ -642,7 +651,6 @@
 		/* Transmit frame */
 		ircc_dma_xmit(self, iobase, 0);
 	}
-	
 	spin_unlock_irqrestore(&self->lock, flags);
 	dev_kfree_skb(skb);
 
@@ -759,6 +767,7 @@
 
 	setup_dma(self->io.dma, self->rx_buff.data, self->rx_buff.truesize, 
 		  DMA_RX_MODE);
+
 	/* Set max Rx frame size */
 	register_bank(iobase, 4);
 	outb((2050 >> 8) & 0x0f, iobase+IRCC_RX_SIZE_HI);
@@ -787,7 +796,6 @@
  *
  *    Finished with receiving frames
  *
- *    
  */
 static void ircc_dma_receive_complete(struct ircc_cb *self, int iobase)
 {
@@ -814,7 +822,7 @@
 	else
 		len -= 4;
 
-	if ((len < 2) && (len > 2050)) {
+	if ((len < 2) || (len > 2050)) {
 		WARNING(__FUNCTION__ "(), bogus len=%d\n", len);
 		return;
 	}
@@ -1039,7 +1047,9 @@
 MODULE_AUTHOR("Thomas Davis <tadavis@jps.net>");
 MODULE_DESCRIPTION("SMC IrCC controller driver");
 MODULE_PARM(ircc_dma, "1i");
+MODULE_PARM_DESC(ircc_dma, "DMA channel");
 MODULE_PARM(ircc_irq, "1i");
+MODULE_PARM_DESC(ircc_irq, "IRQ line");
 
 int init_module(void)
 {

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)