lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Sun, 28 Mar 2010 18:26:14 +0300
From:	Olimpiu Pascariu <olimpiu.pascariu@...il.com>
To:	gregkh@...e.de, horms@...ge.net.au, hsweeten@...ionengravers.com,
	ss@....gov.au
Cc:	devel@...verdev.osuosl.org, linux-kernel@...r.kernel.org
Subject: Staging: dt3155: fixed some checkpatch.pl warnings and errors in
 dt3155_drv.c

>>From cebbf20baee8df57b879a2b6dd1b9a04afe3e5e8 Mon Sep 17 00:00:00 2001
From: Olimpiu Pascariu <olimpiu.pascariu@...il.com>
Date: Sun, 28 Mar 2010 18:22:06 +0300
Subject: [PATCH 7/7] Staging: dt3155: fixed some checkpatch.pl warnings and errors in dt3155_drv.c
 This is a patch to the dt3155_drv.c file that fixes up errors and warnings found by the checkpatch.pl tool
 Signed-off-by: Olimpiu Pascariu <olimpiu.pascariu@...il.com>

---
 drivers/staging/dt3155/dt3155_drv.c | 1220 +++++++++++++++++------------------
 1 files changed, 583 insertions(+), 637 deletions(-)

diff --git a/drivers/staging/dt3155/dt3155_drv.c b/drivers/staging/dt3155/dt3155_drv.c
index a67c622..6adbeb2 100644
--- a/drivers/staging/dt3155/dt3155_drv.c
+++ b/drivers/staging/dt3155/dt3155_drv.c
@@ -1,59 +1,57 @@
 /*
-
-Copyright 1996,2002,2005 Gregory D. Hager, Alfred A. Rizzi, Noah J. Cowan,
-                         Jason Lapenta, Scott Smedley, Greg Sharp
-
-This file is part of the DT3155 Device Driver.
-
-The DT3155 Device Driver is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The DT3155 Device Driver is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with the DT3155 Device Driver; if not, write to the Free
-Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-MA 02111-1307 USA
-
--- Changes --
-
-  Date     Programmer	Description of changes made
-  -------------------------------------------------------------------
-  03-Jul-2000 JML       n/a
-  10-Oct-2001 SS        port to 2.4 kernel
-  02-Apr-2002 SS        Mods to use allocator as a standalone module;
-                        Merged John Roll's changes (john@....harvard.edu)
-                        to make work with multiple boards.
-  02-Jul-2002 SS        Merged James Rose's chages (rosejr@...due.edu) to:
-                         * fix successive interrupt-driven captures
-                         * add select/poll support.
-  10-Jul-2002 GCS       Add error check when ndevices > MAXBOARDS.
-  02-Aug-2002 GCS       Fix field mode so that odd (lower) field is stored
-                        in lower half of buffer.
-  05-Aug-2005 SS        port to 2.6 kernel.
-  26-Oct-2009 SS	port to 2.6.30 kernel.
-
--- Notes --
-
-** appended "mem=124" in lilo.conf to allow for 4megs free on my 128meg system.
+ *
+ * Copyright 1996,2002,2005 Gregory D. Hager, Alfred A. Rizzi, Noah J. Cowan,
+ *                          Jason Lapenta, Scott Smedley, Greg Sharp
+ *
+ * This file is part of the DT3155 Device Driver.
+ *
+ * The DT3155 Device Driver is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * The DT3155 Device Driver is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the DT3155 Device Driver; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ * -- Changes --
+ *
+ * Date     Programmer	Description of changes made
+ * -------------------------------------------------------------------
+ * 03-Jul-2000 JML       n/a
+ * 10-Oct-2001 SS        port to 2.4 kernel
+ * 02-Apr-2002 SS        Mods to use allocator as a standalone module;
+ *                       Merged John Roll's changes (john@....harvard.edu)
+ *                       to make work with multiple boards.
+ * 02-Jul-2002 SS        Merged James Rose's chages (rosejr@...due.edu) to:
+ *                        * fix successive interrupt-driven captures
+ *                        * add select/poll support.
+ * 10-Jul-2002 GCS       Add error check when ndevices > MAXBOARDS.
+ * 02-Aug-2002 GCS       Fix field mode so that odd (lower) field is stored
+ *                       in lower half of buffer.
+ * 05-Aug-2005 SS        port to 2.6 kernel.
+ * 26-Oct-2009 SS	port to 2.6.30 kernel.
+ *
+ * -- Notes --
+ *
+ * appended "mem=124" in lilo.conf to allow for 4megs free on my 128meg system.
  * using allocator.c and allocator.h from o'reilly book (alessandro rubini)
-    ftp://ftp.systemy.it/pub/develop (see README.allocator)
-
- + might want to get rid of MAXboards for allocating initial buffer.
-    confusing and not necessary
-
- + in cleanup_module the MOD_IN_USE looks like it is check after it should
-
+ * ftp://ftp.systemy.it/pub/develop (see README.allocator)
+ *
+ * + might want to get rid of MAXboards for allocating initial buffer.
+ * confusing and not necessary
+ * + in cleanup_module the MOD_IN_USE looks like it is check after it should
+ *
  * GFP_DMA should not be set with a PCI system (pg 291)
-
- - NJC why are only two buffers allowed? (see isr, approx line 358)
-
-*/
+ *
+ * - NJC why are only two buffers allowed? (see isr, approx line 358)
+ */
 
 extern void printques(int);
 
@@ -75,8 +73,8 @@ MODULE_LICENSE("GPL");
 #include <linux/poll.h>
 #include <linux/sched.h>
 
-#include <asm/io.h>
-#include <asm/uaccess.h>
+#include <linux/io.h>
+#include <linux/uaccess.h>
 
 #include "dt3155.h"
 #include "dt3155_drv.h"
@@ -96,19 +94,20 @@ int dt3155_errno = 0;
 #define MAXPCI    16
 
 #ifdef DT_DEBUG
-#define DT_3155_DEBUG_MSG(x,y) printk(x,y)
+#define DT_3155_DEBUG_MSG(x, y) printk(x, y)
 #else
-#define DT_3155_DEBUG_MSG(x,y)
+#define DT_3155_DEBUG_MSG(x, y)
 #endif
 
 /* wait queue for interrupts */
-wait_queue_head_t dt3155_read_wait_queue[ MAXBOARDS ];
+wait_queue_head_t dt3155_read_wait_queue[MAXBOARDS];
 
 #define DT_3155_SUCCESS 0
 #define DT_3155_FAILURE -EIO
 
-/* set to dynamicaly allocate, but it is tunable: */
-/* insmod DT_3155 dt3155 dt3155_major=XX */
+/* set to dynamicaly allocate, but it is tunable:
+ * insmod DT_3155 dt3155 dt3155_major=XX
+ */
 int dt3155_major = 0;
 
 /* The minor numbers are 0 and 1 ... they are not tunable.
@@ -119,18 +118,21 @@ int dt3155_major = 0;
 /* Global structures and variables */
 
 /* Status of each device */
-struct dt3155_status_s dt3155_status[ MAXBOARDS ];
+struct dt3155_status_s dt3155_status[MAXBOARDS];
 
 /* kernel logical address of the board */
-u8 *dt3155_lbase[ MAXBOARDS ] = { NULL
+u8 *dt3155_lbase[MAXBOARDS] = { NULL
 #if MAXBOARDS == 2
 				      , NULL
 #endif
 };
-/* DT3155 registers              */
-u8 *dt3155_bbase = NULL;		  /* kernel logical address of the *
-					   * buffer region                 */
-u32  dt3155_dev_open[ MAXBOARDS ] = {0
+/* DT3155 registers
+ * kernel logical address of the
+ * buffer region
+ */
+u8 *dt3155_bbase = NULL;
+
+u32  dt3155_dev_open[MAXBOARDS] = {0
 #if MAXBOARDS == 2
 				       , 0
 #endif
@@ -145,21 +147,21 @@ u32 unique_tag = 0;;
  * to idle.  I don't know why this works and the other way doesn't.
  * (James Rose)
  */
-static void quick_stop (int minor)
+static void quick_stop(int minor)
 {
-  // TODO: scott was here
+  /* TODO: scott was here */
 #if 1
-  ReadMReg((dt3155_lbase[ minor ] + INT_CSR), int_csr_r.reg);
+  ReadMReg((dt3155_lbase[minor] + INT_CSR), int_csr_r.reg);
   /* disable interrupts */
   int_csr_r.fld.FLD_END_EVE_EN = 0;
   int_csr_r.fld.FLD_END_ODD_EN = 0;
-  WriteMReg((dt3155_lbase[ minor ] + INT_CSR), int_csr_r.reg );
+  WriteMReg((dt3155_lbase[minor] + INT_CSR), int_csr_r.reg);
 
-  dt3155_status[ minor ].state &= ~(DT3155_STATE_STOP|0xff);
+  dt3155_status[minor].state &= ~(DT3155_STATE_STOP|0xff);
   /* mark the system stopped: */
-  dt3155_status[ minor ].state |= DT3155_STATE_IDLE;
-  dt3155_fbuffer[ minor ]->stop_acquire = 0;
-  dt3155_fbuffer[ minor ]->even_stopped = 0;
+  dt3155_status[minor].state |= DT3155_STATE_IDLE;
+  dt3155_fbuffer[minor]->stop_acquire = 0;
+  dt3155_fbuffer[minor]->even_stopped = 0;
 #else
   dt3155_status[minor].state |= DT3155_STATE_STOP;
   dt3155_status[minor].fbuffer.stop_acquire = 1;
@@ -168,14 +170,14 @@ static void quick_stop (int minor)
 }
 
 
-/*****************************************************
- *  dt3155_isr() Interrupt service routien
+/*
+ * dt3155_isr() Interrupt service routien
  *
  * - looks like this isr supports IRQ sharing (or could) JML
  * - Assumes irq's are disabled, via SA_INTERRUPT flag
  * being set in request_irq() call from init_module()
- *****************************************************/
-static inline void dt3155_isr( int irq, void *dev_id, struct pt_regs *regs )
+ */
+static inline void dt3155_isr(int irq, void *dev_id, struct pt_regs *regs)
 {
   int    minor = -1;
   int    index;
@@ -183,298 +185,273 @@ static inline void dt3155_isr( int irq, void *dev_id, struct pt_regs *regs )
   u32 buffer_addr;
 
   /* find out who issued the interrupt */
-  for ( index = 0; index < ndevices; index++ ) {
-    if( dev_id == (void*) &dt3155_status[ index ])
-      {
-	minor = index;
-	break;
-      }
+  for (index = 0; index < ndevices; index++) {
+	if (dev_id == (void *) &dt3155_status[index]) {
+		minor = index;
+		break;
+	}
   }
 
   /* hopefully we should not get here */
-  if ( minor < 0 || minor >= MAXBOARDS ) {
-    printk(KERN_ERR "dt3155_isr called with invalid dev_id\n");
-    return;
+  if (minor < 0 || minor >= MAXBOARDS) {
+	printk(KERN_ERR "dt3155_isr called with invalid dev_id\n");
+	return;
   }
 
   /* Check for corruption and set a flag if so */
-  ReadMReg( (dt3155_lbase[ minor ] + CSR1), csr1_r.reg );
-
-  if ( (csr1_r.fld.FLD_CRPT_EVE) || (csr1_r.fld.FLD_CRPT_ODD) )
-    {
-      /* TODO: this should probably stop acquisition */
-      /* and set some flags so that dt3155_read      */
-      /* returns an error next time it is called     */
-      dt3155_errno = DT_ERR_CORRUPT;
-      printk("dt3155:  corrupt field\n");
-      return;
-    }
+  ReadMReg((dt3155_lbase[minor] + CSR1), csr1_r.reg);
+
+  if ((csr1_r.fld.FLD_CRPT_EVE) || (csr1_r.fld.FLD_CRPT_ODD)) {
+	/* TODO: this should probably stop acquisition
+	* and set some flags so that dt3155_read
+	* returns an error next time it is called
+	*/
+	dt3155_errno = DT_ERR_CORRUPT;
+	printk("dt3155:  corrupt field\n");
+	return;
+  }
 
-  ReadMReg((dt3155_lbase[ minor ] + INT_CSR), int_csr_r.reg);
+  ReadMReg((dt3155_lbase[minor] + INT_CSR), int_csr_r.reg);
 
   /* Handle the even field ... */
-  if (int_csr_r.fld.FLD_END_EVE)
-    {
-      if ( (dt3155_status[ minor ].state & DT3155_STATE_MODE) ==
-	   DT3155_STATE_FLD )
-	{
-	  dt3155_fbuffer[ minor ]->frame_count++;
+  if (int_csr_r.fld.FLD_END_EVE) {
+	if ((dt3155_status[minor].state & DT3155_STATE_MODE) ==
+	     DT3155_STATE_FLD)
+		dt3155_fbuffer[minor]->frame_count++;
+
+	ReadI2C(dt3155_lbase[minor], EVEN_CSR, &i2c_even_csr.reg);
+
+	/* Clear the interrupt? */
+	int_csr_r.fld.FLD_END_EVE = 1;
+
+	/* disable the interrupt if last field */
+	if (dt3155_fbuffer[minor]->stop_acquire) {
+		printk("dt3155:  even stopped.\n");
+		dt3155_fbuffer[minor]->even_stopped = 1;
+		if (i2c_even_csr.fld.SNGL_EVE)
+			int_csr_r.fld.FLD_END_EVE_EN = 0;
+		else
+			i2c_even_csr.fld.SNGL_EVE  = 1;
 	}
 
-      ReadI2C(dt3155_lbase[ minor ], EVEN_CSR, &i2c_even_csr.reg);
-
-      /* Clear the interrupt? */
-      int_csr_r.fld.FLD_END_EVE = 1;
-
-      /* disable the interrupt if last field */
-      if (dt3155_fbuffer[ minor ]->stop_acquire)
-	{
-	  printk("dt3155:  even stopped.\n");
-	  dt3155_fbuffer[ minor ]->even_stopped = 1;
-	  if (i2c_even_csr.fld.SNGL_EVE)
-	    {
-	      int_csr_r.fld.FLD_END_EVE_EN = 0;
-	    }
-	  else
-	    {
-	      i2c_even_csr.fld.SNGL_EVE  = 1;
-	    }
-	}
-
-      WriteMReg( (dt3155_lbase[ minor ] + INT_CSR), int_csr_r.reg );
-
-      /* Set up next DMA if we are doing FIELDS */
-      if ( (dt3155_status[ minor ].state & DT3155_STATE_MODE ) ==
-	   DT3155_STATE_FLD)
-	{
-	  /* GCS (Aug 2, 2002) -- In field mode, dma the odd field
-	     into the lower half of the buffer */
-	  const u32 stride =  dt3155_status[ minor ].config.cols;
-	  buffer_addr = dt3155_fbuffer[ minor ]->
-	    frame_info[ dt3155_fbuffer[ minor ]->active_buf ].addr
-	    + (DT3155_MAX_ROWS / 2) * stride;
-	  local_save_flags(flags);
-	  local_irq_disable();
-	  wake_up_interruptible( &dt3155_read_wait_queue[ minor ] );
-
-	  /* Set up the DMA address for the next field */
-	  local_irq_restore(flags);
-	  WriteMReg((dt3155_lbase[ minor ] + ODD_DMA_START), buffer_addr);
+	WriteMReg((dt3155_lbase[minor] + INT_CSR), int_csr_r.reg);
+
+	/* Set up next DMA if we are doing FIELDS */
+	if ((dt3155_status[minor].state & DT3155_STATE_MODE) ==
+	     DT3155_STATE_FLD) {
+		/* GCS (Aug 2, 2002) -- In field mode, dma the odd field
+		 * into the lower half of the buffer
+		 */
+		const u32 stride =  dt3155_status[minor].config.cols;
+		buffer_addr = dt3155_fbuffer[minor]->
+		  frame_info[dt3155_fbuffer[minor]->active_buf].addr
+		  + (DT3155_MAX_ROWS / 2) * stride;
+		local_save_flags(flags);
+		local_irq_disable();
+		wake_up_interruptible(&dt3155_read_wait_queue[minor]);
+
+		/* Set up the DMA address for the next field */
+		local_irq_restore(flags);
+		WriteMReg((dt3155_lbase[minor] + ODD_DMA_START), buffer_addr);
 	}
 
-      /* Check for errors. */
-      i2c_even_csr.fld.DONE_EVE = 1;
-      if ( i2c_even_csr.fld.ERROR_EVE )
-	dt3155_errno = DT_ERR_OVERRUN;
-
-      WriteI2C( dt3155_lbase[ minor ], EVEN_CSR, i2c_even_csr.reg );
-
-      /* Note that we actually saw an even field meaning  */
-      /* that subsequent odd field complete the frame     */
-      dt3155_fbuffer[ minor ]->even_happened = 1;
-
-      /* recording the time that the even field finished, this should be */
-      /* about time in the middle of the frame */
-      do_gettimeofday( &(dt3155_fbuffer[ minor ]->
-			 frame_info[ dt3155_fbuffer[ minor ]->
-				     active_buf ].time) );
-      return;
-    }
+	/* Check for errors. */
+	i2c_even_csr.fld.DONE_EVE = 1;
+	if (i2c_even_csr.fld.ERROR_EVE)
+		dt3155_errno = DT_ERR_OVERRUN;
+
+	WriteI2C(dt3155_lbase[minor], EVEN_CSR, i2c_even_csr.reg);
+
+	/* Note that we actually saw an even field meaning
+	 * that subsequent odd field complete the frame
+	 */
+	dt3155_fbuffer[minor]->even_happened = 1;
+
+	/* recording the time that the even field finished, this should be
+	 * about time in the middle of the frame
+	 */
+	do_gettimeofday(&(dt3155_fbuffer[minor]->
+			  frame_info[dt3155_fbuffer[minor]->
+				     active_buf].time));
+	return;
+  }
 
   /* ... now handle the odd field */
-  if ( int_csr_r.fld.FLD_END_ODD )
-    {
-      ReadI2C( dt3155_lbase[ minor ], ODD_CSR, &i2c_odd_csr.reg );
-
-      /* Clear the interrupt? */
-      int_csr_r.fld.FLD_END_ODD = 1;
-
-      if (dt3155_fbuffer[ minor ]->even_happened ||
-	  (dt3155_status[ minor ].state & DT3155_STATE_MODE) ==
-	  DT3155_STATE_FLD)
-	{
-	  dt3155_fbuffer[ minor ]->frame_count++;
-	}
-
-      if ( dt3155_fbuffer[ minor ]->stop_acquire &&
-	   dt3155_fbuffer[ minor ]->even_stopped )
-	{
-	  printk(KERN_DEBUG "dt3155:  stopping odd..\n");
-	  if ( i2c_odd_csr.fld.SNGL_ODD )
-	    {
-	      /* disable interrupts */
-	      int_csr_r.fld.FLD_END_ODD_EN = 0;
-	      dt3155_status[ minor ].state &= ~(DT3155_STATE_STOP|0xff);
-
-	      /* mark the system stopped: */
-	      dt3155_status[ minor ].state |= DT3155_STATE_IDLE;
-	      dt3155_fbuffer[ minor ]->stop_acquire = 0;
-	      dt3155_fbuffer[ minor ]->even_stopped = 0;
-
-	      printk(KERN_DEBUG "dt3155:  state is now %x\n",
-		     dt3155_status[minor].state);
-	    }
-	  else
-	    {
-	      i2c_odd_csr.fld.SNGL_ODD  = 1;
-	    }
+  if (int_csr_r.fld.FLD_END_ODD) {
+	ReadI2C(dt3155_lbase[minor], ODD_CSR, &i2c_odd_csr.reg);
+
+	/* Clear the interrupt? */
+	int_csr_r.fld.FLD_END_ODD = 1;
+
+	if (dt3155_fbuffer[minor]->even_happened ||
+	   (dt3155_status[minor].state & DT3155_STATE_MODE) ==
+	    DT3155_STATE_FLD)
+		dt3155_fbuffer[minor]->frame_count++;
+
+	if (dt3155_fbuffer[minor]->stop_acquire &&
+	    dt3155_fbuffer[minor]->even_stopped) {
+		printk(KERN_DEBUG "dt3155:  stopping odd..\n");
+		if (i2c_odd_csr.fld.SNGL_ODD) {
+			/* disable interrupts */
+			int_csr_r.fld.FLD_END_ODD_EN = 0;
+			dt3155_status[minor].state &= ~(DT3155_STATE_STOP|0xff);
+
+			/* mark the system stopped: */
+			dt3155_status[minor].state |= DT3155_STATE_IDLE;
+			dt3155_fbuffer[minor]->stop_acquire = 0;
+			dt3155_fbuffer[minor]->even_stopped = 0;
+
+			printk(KERN_DEBUG "dt3155:  state is now %x\n",
+			dt3155_status[minor].state);
+		} else {
+			i2c_odd_csr.fld.SNGL_ODD  = 1;
+		}
 	}
 
-      WriteMReg( (dt3155_lbase[ minor ] + INT_CSR), int_csr_r.reg );
+	WriteMReg((dt3155_lbase[minor] + INT_CSR), int_csr_r.reg);
 
-      /* if the odd field has been acquired, then     */
-      /* change the next dma location for both fields */
-      /* and wake up the process if sleeping          */
-      if ( dt3155_fbuffer[ minor ]->even_happened ||
-	   (dt3155_status[ minor ].state & DT3155_STATE_MODE) ==
-	   DT3155_STATE_FLD )
-	{
+	/* if the odd field has been acquired, then
+	 * change the next dma location for both fields
+	 * and wake up the process if sleeping
+	 */
+	if (dt3155_fbuffer[minor]->even_happened ||
+	   (dt3155_status[minor].state & DT3155_STATE_MODE) ==
+	    DT3155_STATE_FLD) {
 
-	  local_save_flags(flags);
-	  local_irq_disable();
+		local_save_flags(flags);
+		local_irq_disable();
 
 #ifdef DEBUG_QUES_B
-	  printques( minor );
+		printques(minor);
 #endif
-	  if ( dt3155_fbuffer[ minor ]->nbuffers > 2 )
-	    {
-	      if ( !are_empty_buffers( minor ) )
-		{
-		  /* The number of active + locked buffers is
-		   * at most 2, and since there are none empty, there
-		   * must be at least nbuffers-2 ready buffers.
-		   * This is where we 'drop frames', oldest first. */
-		  push_empty( pop_ready( minor ),  minor );
-		}
-
-	      /* The ready_que can't be full, since we know
-	       * there is one active buffer right now, so it's safe
-	       * to push the active buf on the ready_que. */
-	      push_ready( minor, dt3155_fbuffer[ minor ]->active_buf );
-	      /* There's at least 1 empty -- make it active */
-	      dt3155_fbuffer[ minor ]->active_buf = pop_empty( minor );
-	      dt3155_fbuffer[ minor ]->
-		frame_info[ dt3155_fbuffer[ minor ]->
-			    active_buf ].tag = ++unique_tag;
-	    }
-	  else /* nbuffers == 2, special case */
-	    { /* There is 1 active buffer.
-	       * If there is a locked buffer, keep the active buffer
-	       * the same -- that means we drop a frame.
-	       */
-	      if ( dt3155_fbuffer[ minor ]->locked_buf < 0 )
-		{
-		  push_ready( minor,
-			      dt3155_fbuffer[ minor ]->active_buf );
-		  if (are_empty_buffers( minor ) )
-		    {
-		      dt3155_fbuffer[ minor ]->active_buf =
-			pop_empty( minor );
-		    }
-		  else
-		    { /* no empty or locked buffers, so use a readybuf */
-		      dt3155_fbuffer[ minor ]->active_buf =
-			pop_ready( minor );
-		    }
+		if (dt3155_fbuffer[minor]->nbuffers > 2) {
+			if (!are_empty_buffers(minor))
+				/* The number of active + locked buffers is
+				 * at most 2, and since there are none empty,
+				 * there must be at least nbuffers-2 ready
+				 * buffers. This is where we 'drop frames',
+				 * oldest first.
+				 */
+				push_empty(pop_ready(minor), minor);
+
+			/* The ready_que can't be full, since we know
+			 * there is one active buffer right now, so it's safe
+			 * to push the active buf on the ready_que.
+			 */
+			push_ready(minor, dt3155_fbuffer[minor]->active_buf);
+			/* There's at least 1 empty -- make it active */
+			dt3155_fbuffer[minor]->active_buf = pop_empty(minor);
+			dt3155_fbuffer[minor]->
+			  frame_info[dt3155_fbuffer[minor]->
+				     active_buf].tag = ++unique_tag;
+		} else {
+			/* nbuffers == 2, special case
+			 * There is 1 active buffer.
+			 * If there is a locked buffer, keep the active buffer
+			 * the same -- that means we drop a frame.
+			 */
+			if (dt3155_fbuffer[minor]->locked_buf < 0) {
+				push_ready(minor,
+					   dt3155_fbuffer[minor]->active_buf);
+			if (are_empty_buffers(minor))
+				dt3155_fbuffer[minor]->active_buf =
+				  pop_empty(minor);
+			else
+				/* no empty or locked buffers, so use a
+				 * readybuf
+				 */
+				dt3155_fbuffer[minor]->active_buf =
+				  pop_ready(minor);
+			}
 		}
-	    }
 
 #ifdef DEBUG_QUES_B
-	  printques( minor );
+		printques(minor);
 #endif
 
-	  dt3155_fbuffer[ minor ]->even_happened = 0;
+		dt3155_fbuffer[minor]->even_happened = 0;
 
-	  wake_up_interruptible( &dt3155_read_wait_queue[ minor ] );
+		wake_up_interruptible(&dt3155_read_wait_queue[minor]);
 
-	  local_irq_restore(flags);
+		local_irq_restore(flags);
 	}
 
-
-      /* Set up the DMA address for the next frame/field */
-      buffer_addr = dt3155_fbuffer[ minor ]->
-	frame_info[ dt3155_fbuffer[ minor ]->active_buf ].addr;
-      if ( (dt3155_status[ minor ].state & DT3155_STATE_MODE) ==
-	   DT3155_STATE_FLD )
-	{
-	  WriteMReg((dt3155_lbase[ minor ] + EVEN_DMA_START), buffer_addr);
+	/* Set up the DMA address for the next frame/field */
+	buffer_addr = dt3155_fbuffer[minor]->
+	  frame_info[dt3155_fbuffer[minor]->active_buf].addr;
+	if ((dt3155_status[minor].state & DT3155_STATE_MODE) ==
+	     DT3155_STATE_FLD) {
+		WriteMReg((dt3155_lbase[minor] + EVEN_DMA_START), buffer_addr);
+	} else {
+		WriteMReg((dt3155_lbase[minor] + EVEN_DMA_START), buffer_addr);
+		WriteMReg((dt3155_lbase[minor] + ODD_DMA_START), buffer_addr
+			  + dt3155_status[minor].config.cols);
 	}
-      else
-	{
-	  WriteMReg((dt3155_lbase[ minor ] + EVEN_DMA_START), buffer_addr);
 
-	  WriteMReg((dt3155_lbase[ minor ] + ODD_DMA_START), buffer_addr
-		    + dt3155_status[ minor ].config.cols);
-	}
+	/* Do error checking */
+	i2c_odd_csr.fld.DONE_ODD = 1;
+	if (i2c_odd_csr.fld.ERROR_ODD)
+		dt3155_errno = DT_ERR_OVERRUN;
 
-      /* Do error checking */
-      i2c_odd_csr.fld.DONE_ODD = 1;
-      if ( i2c_odd_csr.fld.ERROR_ODD )
-	dt3155_errno = DT_ERR_OVERRUN;
+	WriteI2C(dt3155_lbase[minor], ODD_CSR, i2c_odd_csr.reg);
 
-      WriteI2C(dt3155_lbase[ minor ], ODD_CSR, i2c_odd_csr.reg );
-
-      return;
-    }
+	return;
+  }
   /* If we get here, the Odd Field wasn't it either... */
-  printk( "neither even nor odd.  shared perhaps?\n");
+  printk("neither even nor odd.  shared perhaps?\n");
 }
 
-/*****************************************************
+/*
  * init_isr(int minor)
  *   turns on interupt generation for the card
  *   designated by "minor".
  *   It is called *only* from inside ioctl().
- *****************************************************/
+ */
 static void dt3155_init_isr(int minor)
 {
-  const u32 stride =  dt3155_status[ minor ].config.cols;
-
-  switch (dt3155_status[ minor ].state & DT3155_STATE_MODE)
-    {
-    case DT3155_STATE_FLD:
-      {
-	even_dma_start_r  = dt3155_status[ minor ].
-	  fbuffer.frame_info[ dt3155_status[ minor ].fbuffer.active_buf ].addr;
+  const u32 stride =  dt3155_status[minor].config.cols;
+
+  switch (dt3155_status[minor].state & DT3155_STATE_MODE) {
+  case DT3155_STATE_FLD:
+	even_dma_start_r  = dt3155_status[minor].
+	  fbuffer.frame_info[dt3155_status[minor].fbuffer.active_buf].addr;
 	even_dma_stride_r = 0;
 	odd_dma_stride_r  = 0;
 
-	WriteMReg((dt3155_lbase[ minor ] + EVEN_DMA_START),
+	WriteMReg((dt3155_lbase[minor] + EVEN_DMA_START),
 		  even_dma_start_r);
-	WriteMReg((dt3155_lbase[ minor ] + EVEN_DMA_STRIDE),
+	WriteMReg((dt3155_lbase[minor] + EVEN_DMA_STRIDE),
 		  even_dma_stride_r);
-	WriteMReg((dt3155_lbase[ minor ] + ODD_DMA_STRIDE),
+	WriteMReg((dt3155_lbase[minor] + ODD_DMA_STRIDE),
 		  odd_dma_stride_r);
 	break;
-      }
 
-    case DT3155_STATE_FRAME:
-    default:
-      {
-	even_dma_start_r  = dt3155_status[ minor ].
-	  fbuffer.frame_info[ dt3155_status[ minor ].fbuffer.active_buf ].addr;
+  case DT3155_STATE_FRAME:
+  default:
+	even_dma_start_r  = dt3155_status[minor].
+	  fbuffer.frame_info[dt3155_status[minor].fbuffer.active_buf].addr;
 	odd_dma_start_r   =  even_dma_start_r + stride;
 	even_dma_stride_r =  stride;
 	odd_dma_stride_r  =  stride;
 
-	WriteMReg((dt3155_lbase[ minor ] + EVEN_DMA_START),
+	WriteMReg((dt3155_lbase[minor] + EVEN_DMA_START),
 		  even_dma_start_r);
-	WriteMReg((dt3155_lbase[ minor ] + ODD_DMA_START),
+	WriteMReg((dt3155_lbase[minor] + ODD_DMA_START),
 		  odd_dma_start_r);
-	WriteMReg((dt3155_lbase[ minor ] + EVEN_DMA_STRIDE),
+	WriteMReg((dt3155_lbase[minor] + EVEN_DMA_STRIDE),
 		  even_dma_stride_r);
-	WriteMReg((dt3155_lbase[ minor ] + ODD_DMA_STRIDE),
+	WriteMReg((dt3155_lbase[minor] + ODD_DMA_STRIDE),
 		  odd_dma_stride_r);
 	break;
-      }
-    }
+  }
 
-  /* 50/60 Hz should be set before this point but let's make sure it is */
-  /* right anyway */
+  /* 50/60 Hz should be set before this point but let's make sure it is
+   * right anyway
+   */
 
-  ReadI2C(dt3155_lbase[ minor ], CONFIG, &i2c_csr2.reg);
+  ReadI2C(dt3155_lbase[minor], CONFIG, &i2c_csr2.reg);
   i2c_csr2.fld.HZ50 = FORMAT50HZ;
-  WriteI2C(dt3155_lbase[ minor ], CONFIG, i2c_config.reg);
+  WriteI2C(dt3155_lbase[minor], CONFIG, i2c_config.reg);
 
   /* enable busmaster chip, clear flags */
 
@@ -494,7 +471,7 @@ static void dt3155_init_isr(int minor)
   csr1_r.fld.FLD_CRPT_EVE   = 1; /* writing a 1 clears flags */
   csr1_r.fld.FLD_CRPT_ODD   = 1;
 
-  WriteMReg((dt3155_lbase[ minor ] + CSR1),csr1_r.reg);
+  WriteMReg((dt3155_lbase[minor] + CSR1), csr1_r.reg);
 
   /* Enable interrupts at the end of each field */
 
@@ -503,14 +480,14 @@ static void dt3155_init_isr(int minor)
   int_csr_r.fld.FLD_END_ODD_EN = 1;
   int_csr_r.fld.FLD_START_EN = 0;
 
-  WriteMReg((dt3155_lbase[ minor ] + INT_CSR), int_csr_r.reg);
+  WriteMReg((dt3155_lbase[minor] + INT_CSR), int_csr_r.reg);
 
   /* start internal BUSY bits */
 
-  ReadI2C(dt3155_lbase[ minor ], CSR2, &i2c_csr2.reg);
+  ReadI2C(dt3155_lbase[minor], CSR2, &i2c_csr2.reg);
   i2c_csr2.fld.BUSY_ODD  = 1;
   i2c_csr2.fld.BUSY_EVE  = 1;
-  WriteI2C(dt3155_lbase[ minor ], CSR2, i2c_csr2.reg);
+  WriteI2C(dt3155_lbase[minor], CSR2, i2c_csr2.reg);
 
   /* Now its up to the interrupt routine!! */
 
@@ -518,10 +495,10 @@ static void dt3155_init_isr(int minor)
 }
 
 
-/*****************************************************
+/*
  * ioctl()
  *
- *****************************************************/
+ */
 static int dt3155_ioctl(struct inode *inode,
 			struct file *file,
 			unsigned int cmd,
@@ -529,33 +506,30 @@ static int dt3155_ioctl(struct inode *inode,
 {
   int minor = MINOR(inode->i_rdev); /* What device are we ioctl()'ing? */
 
-  if ( minor >= MAXBOARDS || minor < 0 )
-    return -ENODEV;
+  if (minor >= MAXBOARDS || minor < 0)
+	return -ENODEV;
 
   /* make sure it is valid command */
-  if (_IOC_NR(cmd) > DT3155_IOC_MAXNR)
-    {
-      printk("DT3155: invalid IOCTL(0x%x)\n",cmd);
-      printk("DT3155: Valid commands (0x%x), (0x%x), (0x%x), (0x%x), (0x%x)\n",
-	     (unsigned int)DT3155_GET_CONFIG,
-	     (unsigned int)DT3155_SET_CONFIG,
-	     (unsigned int)DT3155_START,
-	     (unsigned int)DT3155_STOP,
-	     (unsigned int)DT3155_FLUSH);
-      return -EINVAL;
-    }
-
-  switch (cmd)
-    {
-    case DT3155_SET_CONFIG:
-      {
+  if (_IOC_NR(cmd) > DT3155_IOC_MAXNR) {
+	printk("DT3155: invalid IOCTL(0x%x)\n", cmd);
+	printk("DT3155: Valid commands (0x%x), (0x%x), (0x%x), (0x%x), (0x%x)\n",
+		(unsigned int)DT3155_GET_CONFIG,
+		(unsigned int)DT3155_SET_CONFIG,
+		(unsigned int)DT3155_START,
+		(unsigned int)DT3155_STOP,
+		(unsigned int)DT3155_FLUSH);
+	return -EINVAL;
+  }
+
+  switch (cmd) {
+  case DT3155_SET_CONFIG:
 	if (dt3155_status[minor].state != DT3155_STATE_IDLE)
-	  return -EBUSY;
+		return -EBUSY;
 
 	{
 	  struct dt3155_config_s tmp;
 	  if (copy_from_user((void *)&tmp, (void *) arg, sizeof(tmp)))
-	      return -EFAULT;
+		return -EFAULT;
 	  /* check for valid settings */
 	  if (tmp.rows > DT3155_MAX_ROWS ||
 	      tmp.cols > DT3155_MAX_COLS ||
@@ -563,79 +537,62 @@ static int dt3155_ioctl(struct inode *inode,
 	       tmp.acq_mode != DT3155_MODE_FIELD) ||
 	      (tmp.continuous != DT3155_SNAP &&
 	       tmp.continuous != DT3155_ACQ))
-	    {
-	      return -EINVAL;
-	    }
+		return -EINVAL;
 	  dt3155_status[minor].config = tmp;
 	}
 	return 0;
-      }
-    case DT3155_GET_CONFIG:
-      {
+  case DT3155_GET_CONFIG:
 	if (copy_to_user((void *) arg, (void *) &dt3155_status[minor],
-		     sizeof(dt3155_status_t) ))
-	    return -EFAULT;
+		     sizeof(dt3155_status_t)))
+		return -EFAULT;
 	return 0;
-      }
-    case DT3155_FLUSH: /* Flushes the buffers -- ensures fresh data */
-      {
+  case DT3155_FLUSH: /* Flushes the buffers -- ensures fresh data */
 	if (dt3155_status[minor].state != DT3155_STATE_IDLE)
-	  return -EBUSY;
+		return -EBUSY;
 	return dt3155_flush(minor);
-      }
-    case DT3155_STOP:
-      {
+  case DT3155_STOP:
 	if (dt3155_status[minor].state & DT3155_STATE_STOP ||
 	    dt3155_status[minor].fbuffer.stop_acquire)
-	  return -EBUSY;
+		return -EBUSY;
 
 	if (dt3155_status[minor].state == DT3155_STATE_IDLE)
-	  return 0;
+		return 0;
 
 	quick_stop(minor);
 	if (copy_to_user((void *) arg, (void *) &dt3155_status[minor],
 		     sizeof(dt3155_status_t)))
-	    return -EFAULT;
+		return -EFAULT;
 	return 0;
-      }
-    case DT3155_START:
-      {
+  case DT3155_START:
 	if (dt3155_status[minor].state != DT3155_STATE_IDLE)
-	  return -EBUSY;
+		return -EBUSY;
 
 	dt3155_status[minor].fbuffer.stop_acquire = 0;
 	dt3155_status[minor].fbuffer.frame_count = 0;
 
 	/* Set the MODE in the status -- we default to FRAME */
 	if (dt3155_status[minor].config.acq_mode == DT3155_MODE_FIELD)
-	  {
-	    dt3155_status[minor].state = DT3155_STATE_FLD;
-	  }
+		dt3155_status[minor].state = DT3155_STATE_FLD;
 	else
-	  {
-	    dt3155_status[minor].state = DT3155_STATE_FRAME;
-	  }
+		dt3155_status[minor].state = DT3155_STATE_FRAME;
 
 	dt3155_init_isr(minor);
-	if (copy_to_user( (void *) arg, (void *) &dt3155_status[minor],
+	if (copy_to_user((void *) arg, (void *) &dt3155_status[minor],
 		      sizeof(dt3155_status_t)))
-	    return -EFAULT;
+		return -EFAULT;
 	return 0;
-      }
-    default:
-      {
-	printk("DT3155: invalid IOCTL(0x%x)\n",cmd);
-      printk("DT3155: Valid commands (0x%x), (0x%x), (0x%x), (0x%x), (0x%x)\n",
-	     (unsigned int)DT3155_GET_CONFIG,
-	     (unsigned int)DT3155_SET_CONFIG,
-	     DT3155_START, DT3155_STOP, DT3155_FLUSH);
+  default:
+	printk("DT3155: invalid IOCTL(0x%x)\n", cmd);
+	printk("DT3155: Valid commands (0x%x), (0x%x), (0x%x), (0x%x), (0x%x)\n",
+	       (unsigned int)DT3155_GET_CONFIG,
+	       (unsigned int)DT3155_SET_CONFIG,
+	       DT3155_START, DT3155_STOP, DT3155_FLUSH);
 	return -ENOSYS;
-      }
-    }
+  }
   return -ENOSYS;
 }
 
-/*****************************************************
+/*
  * mmap()
  *
  * only allow the user to mmap the registers and buffer
@@ -643,8 +600,8 @@ static int dt3155_ioctl(struct inode *inode,
  * addition of of the capacity for two cards!!!!!!!!
  * It *looks* like it should work but since I'm not
  * sure how to use it, I'm not actually sure. (NJC? ditto by SS)
- *****************************************************/
-static int dt3155_mmap (struct file * file, struct vm_area_struct * vma)
+ */
+static int dt3155_mmap(struct file *file, struct vm_area_struct *vma)
 {
   /* which device are we mmapping? */
   int				minor = MINOR(file->f_dentry->d_inode->i_rdev);
@@ -652,7 +609,7 @@ static int dt3155_mmap (struct file * file, struct vm_area_struct * vma)
   offset = vma->vm_pgoff << PAGE_SHIFT;
 
   if (offset >= __pa(high_memory) || (file->f_flags & O_SYNC))
-    vma->vm_flags |= VM_IO;
+	vma->vm_flags |= VM_IO;
 
   /* Don't try to swap out physical pages.. */
   vma->vm_flags |= VM_RESERVED;
@@ -661,64 +618,60 @@ static int dt3155_mmap (struct file * file, struct vm_area_struct * vma)
   if ((offset == dt3155_status[minor].reg_addr &&
        vma->vm_end - vma->vm_start == PCI_PAGE_SIZE) ||
       (offset == dt3155_status[minor].mem_addr &&
-       vma->vm_end - vma->vm_start == dt3155_status[minor].mem_size))
-    {
-      if (remap_pfn_range(vma,
-			vma->vm_start,
-			offset >> PAGE_SHIFT,
-			vma->vm_end - vma->vm_start,
-			vma->vm_page_prot)) {
-	  printk("DT3155: remap_page_range() failed.\n");
-	  return -EAGAIN;
+       vma->vm_end - vma->vm_start == dt3155_status[minor].mem_size)) {
+	if (remap_pfn_range(vma,
+			    vma->vm_start,
+			    offset >> PAGE_SHIFT,
+			    vma->vm_end - vma->vm_start,
+			    vma->vm_page_prot)) {
+		printk("DT3155: remap_page_range() failed.\n");
+		return -EAGAIN;
 	}
-    }
-  else
-    {
-      printk("DT3155: dt3155_mmap() bad call.\n");
-      return -ENXIO;
-    }
+  } else {
+	printk("DT3155: dt3155_mmap() bad call.\n");
+	return -ENXIO;
+  }
 
   return 0;
 }
 
 
-/*****************************************************
+/*
  * open()
  *
  * Our special open code.
  * MOD_INC_USE_COUNT make sure that the driver memory is not freed
  * while the device is in use.
- *****************************************************/
-static int dt3155_open( struct inode* inode, struct file* filep)
+ */
+static int dt3155_open(struct inode *inode, struct file *filep)
 {
   int minor = MINOR(inode->i_rdev); /* what device are we opening? */
-  if (dt3155_dev_open[ minor ]) {
-    printk ("DT3155:  Already opened by another process.\n");
-    return -EBUSY;
+  if (dt3155_dev_open[minor]) {
+	printk("DT3155:  Already opened by another process.\n");
+	return -EBUSY;
   }
 
-  if (dt3155_status[ minor ].device_installed==0)
-    {
-      printk("DT3155 Open Error: No such device dt3155 minor number %d\n",
-	     minor);
-      return -EIO;
-    }
-
-  if (dt3155_status[ minor ].state != DT3155_STATE_IDLE) {
-    printk ("DT3155:  Not in idle state (state = %x)\n",
-	    dt3155_status[ minor ].state);
-    return -EBUSY;
+  if (dt3155_status[minor].device_installed == 0) {
+	printk("DT3155 Open Error: No such device dt3155 minor number %d\n",
+		minor);
+	return -EIO;
+  }
+
+  if (dt3155_status[minor].state != DT3155_STATE_IDLE) {
+	printk("DT3155:  Not in idle state (state = %x)\n",
+		dt3155_status[minor].state);
+	return -EBUSY;
   }
 
   printk("DT3155: Device opened.\n");
 
-  dt3155_dev_open[ minor ] = 1 ;
+  dt3155_dev_open[minor] = 1 ;
 
-  dt3155_flush( minor );
+  dt3155_flush(minor);
 
   /* Disable ALL interrupts */
   int_csr_r.reg = 0;
-  WriteMReg( (dt3155_lbase[ minor ] + INT_CSR), int_csr_r.reg );
+  WriteMReg((dt3155_lbase[minor] + INT_CSR), int_csr_r.reg);
 
   init_waitqueue_head(&(dt3155_read_wait_queue[minor]));
 
@@ -726,37 +679,32 @@ static int dt3155_open( struct inode* inode, struct file* filep)
 }
 
 
-/*****************************************************
+/*
  * close()
  *
  * Now decrement the use count.
  *
- *****************************************************/
-static int dt3155_close( struct inode *inode, struct file *filep)
+ */
+static int dt3155_close(struct inode *inode, struct file *filep)
 {
   int minor;
 
   minor = MINOR(inode->i_rdev); /* which device are we closing */
-  if (!dt3155_dev_open[ minor ])
-    {
-      printk("DT3155: attempt to CLOSE a not OPEN device\n");
-    }
-  else
-    {
-      dt3155_dev_open[ minor ] = 0;
-
-      if (dt3155_status[ minor ].state != DT3155_STATE_IDLE)
-	{
-	  quick_stop(minor);
-	}
-    }
+  if (!dt3155_dev_open[minor]) {
+	printk("DT3155: attempt to CLOSE a not OPEN device\n");
+  } else {
+	dt3155_dev_open[minor] = 0;
+
+	if (dt3155_status[minor].state != DT3155_STATE_IDLE)
+		quick_stop(minor);
+  }
   return 0;
 }
 
-/*****************************************************
+/*
  * read()
  *
- *****************************************************/
+ */
 static ssize_t dt3155_read(struct file *filep, char __user *buf,
 			   size_t count, loff_t *ppos)
 {
@@ -768,11 +716,10 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf,
 
   /* TODO: this should check the error flag and */
   /*   return an error on hardware failures */
-  if (count != sizeof(dt3155_read_t))
-    {
-      printk("DT3155 ERROR (NJC): count is not right\n");
-      return -EINVAL;
-    }
+  if (count != sizeof(dt3155_read_t)) {
+	printk("DT3155 ERROR (NJC): count is not right\n");
+	return -EINVAL;
+  }
 
 
   /* Hack here -- I'm going to allow reading even when idle.
@@ -780,39 +727,39 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf,
    * been called.  Leaving it here, commented out, as a reminder
    * for a short while to make sure there are no problems.
    * Note that if the driver is not opened in non_blocking mode,
-   * and the device is idle, then it could sit here forever! */
+   * and the device is idle, then it could sit here forever!
+   */
 
-  /*  if (dt3155_status[minor].state == DT3155_STATE_IDLE)*/
-  /*    return -EBUSY;*/
+  /*  if (dt3155_status[minor].state == DT3155_STATE_IDLE)
+   *	return -EBUSY;
+   */
 
   /* non-blocking reads should return if no data */
-  if (filep->f_flags & O_NDELAY)
-    {
-      if ((frame_index = dt3155_get_ready_buffer(minor)) < 0) {
-	/*printk( "dt3155:  no buffers available (?)\n");*/
-	/* 		printques(minor); */
-	return -EAGAIN;
-      }
-    }
-  else
-    {
-      /*
-       * sleep till data arrives , or we get interrupted.
-       * Note that wait_event_interruptible() does not actually
-       * sleep/wait if it's condition evaluates to true upon entry.
-       */
-      wait_event_interruptible(dt3155_read_wait_queue[minor],
-			       (frame_index = dt3155_get_ready_buffer(minor))
-			       >= 0);
-
-      if (frame_index < 0)
-	{
-	  printk ("DT3155: read: interrupted\n");
-	  quick_stop (minor);
-	  printques(minor);
-	  return -EINTR;
+  if (filep->f_flags & O_NDELAY) {
+	frame_index = dt3155_get_ready_buffer(minor);
+	if (frame_index < 0) {
+		/* printk( "dt3155:  no buffers available (?)\n");
+		 * printques(minor);
+		 */
+		return -EAGAIN;
 	}
-    }
+  } else {
+	/*
+	 * sleep till data arrives , or we get interrupted.
+	 * Note that wait_event_interruptible() does not actually
+	 * sleep/wait if it's condition evaluates to true upon entry.
+	 */
+	wait_event_interruptible(dt3155_read_wait_queue[minor],
+				 (frame_index = dt3155_get_ready_buffer(minor))
+				 >= 0);
+
+	if (frame_index < 0) {
+		printk("DT3155: read: interrupted\n");
+		quick_stop(minor);
+		printques(minor);
+		return -EINTR;
+	}
+  }
 
   frame_info_p = &dt3155_status[minor].fbuffer.frame_info[frame_index];
 
@@ -821,50 +768,50 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf,
 
   put_user(offset, (unsigned int *) buf);
   buf += sizeof(u32);
-  put_user( dt3155_status[minor].fbuffer.frame_count, (unsigned int *) buf);
+  put_user(dt3155_status[minor].fbuffer.frame_count, (unsigned int *) buf);
   buf += sizeof(u32);
   put_user(dt3155_status[minor].state, (unsigned int *) buf);
   buf += sizeof(u32);
   if (copy_to_user(buf, frame_info_p, sizeof(frame_info_t)))
-      return -EFAULT;
+	return -EFAULT;
 
   return sizeof(dt3155_read_t);
 }
 
-static unsigned int dt3155_poll (struct file * filp, poll_table *wait)
+static unsigned int dt3155_poll(struct file *filp, poll_table *wait)
 {
   int minor = MINOR(filp->f_dentry->d_inode->i_rdev);
 
   if (!is_ready_buf_empty(minor))
-    return POLLIN | POLLRDNORM;
+	return POLLIN | POLLRDNORM;
 
-  poll_wait (filp, &dt3155_read_wait_queue[minor], wait);
+  poll_wait(filp, &dt3155_read_wait_queue[minor], wait);
 
   return 0;
 }
 
 
-/*****************************************************
+/*
  * file operations supported by DT3155 driver
  *  needed by init_module
  *  register_chrdev
- *****************************************************/
-static struct file_operations dt3155_fops = {
-  read:		dt3155_read,
-  ioctl:		dt3155_ioctl,
-  mmap:		dt3155_mmap,
-  poll:           dt3155_poll,
-  open:		dt3155_open,
-  release:	dt3155_close
+ */
+static const struct file_operations dt3155_fops = {
+  .read	= dt3155_read,
+  .ioctl = dt3155_ioctl,
+  .mmap = dt3155_mmap,
+  .poll = dt3155_poll,
+  .open = dt3155_open,
+  .release = dt3155_close
 };
 
 
-/*****************************************************
+/*
  * find_PCI();
  *
  * PCI has been totally reworked in 2.1..
- *****************************************************/
-static int find_PCI (void)
+ */
+static int find_PCI(void)
 {
   struct pci_dev *pci_dev = NULL;
   int error, pci_index = 0;
@@ -873,68 +820,70 @@ static int find_PCI (void)
   unsigned char irq;
 
   while ((pci_dev = pci_get_device
-	  (DT3155_VENDORID, DT3155_DEVICEID, pci_dev)) != NULL)
-    {
-      pci_index ++;
-
-      /* Is it really there? */
-      if ((error =
-	   pci_read_config_word(pci_dev, PCI_CLASS_DEVICE, &rev_device)))
-	continue;
-
-      /* Found a board */
-      DT_3155_DEBUG_MSG("DT3155: Device number %d \n", pci_index);
-
-      /* Make sure the driver was compiled with enough buffers to handle
-	 this many boards */
-      if (pci_index > MAXBOARDS) {
-	printk("DT3155: ERROR - found %d devices, but driver only configured "
-	       "for %d devices\n"
-	       "DT3155: Please change MAXBOARDS in dt3155.h\n",
-	       pci_index, MAXBOARDS);
-	goto err;
-      }
-
-      /* Now, just go out and make sure that this/these device(s) is/are
-	 actually mapped into the kernel address space */
-      if ((error = pci_read_config_dword( pci_dev, PCI_BASE_ADDRESS_0,
-					  (u32 *) &base)))
-	{
-	  printk("DT3155: Was not able to find device \n");
-	  goto err;
+	  (DT3155_VENDORID, DT3155_DEVICEID, pci_dev)) != NULL) {
+	pci_index++;
+
+	/* Is it really there? */
+	error = pci_read_config_word(pci_dev, PCI_CLASS_DEVICE, &rev_device);
+	if (error)
+		continue;
+
+	/* Found a board */
+	DT_3155_DEBUG_MSG("DT3155: Device number %d\n", pci_index);
+
+	/* Make sure the driver was compiled with enough buffers to handle
+	 * this many boards
+	 */
+	if (pci_index > MAXBOARDS) {
+		printk(KERN_DEBUG
+		  "DT3155: ERROR - found %d devices, but driver only configured"
+		  " for %d devices\n"
+		  "DT3155: Please change MAXBOARDS in dt3155.h\n",
+		  pci_index, MAXBOARDS);
+		goto err;
 	}
 
-      DT_3155_DEBUG_MSG("DT3155: Base address 0 for device is %lx \n", base);
-      dt3155_status[pci_index-1].reg_addr = base;
+	/* Now, just go out and make sure that this/these device(s) is/are
+	 * actually mapped into the kernel address space
+	 */
+	error = pci_read_config_dword(pci_dev, PCI_BASE_ADDRESS_0,
+				      (u32 *) &base);
+	if (error) {
+		printk("DT3155: Was not able to find device\n");
+		goto err;
+	}
 
-      /* Remap the base address to a logical address through which we
-       * can access it. */
-      dt3155_lbase[ pci_index - 1 ] = ioremap(base,PCI_PAGE_SIZE);
-      dt3155_status[ pci_index - 1 ].reg_addr = base;
-      DT_3155_DEBUG_MSG("DT3155: New logical address is %p \n",
-			dt3155_lbase[pci_index-1]);
-      if ( !dt3155_lbase[pci_index-1] )
-	{
-	  printk("DT3155: Unable to remap control registers\n");
-	  goto err;
+	DT_3155_DEBUG_MSG("DT3155: Base address 0 for device is %lx\n", base);
+	dt3155_status[pci_index-1].reg_addr = base;
+
+	/* Remap the base address to a logical address through which we
+	 * can access it.
+	 */
+	dt3155_lbase[pci_index - 1] = ioremap(base, PCI_PAGE_SIZE);
+	dt3155_status[pci_index - 1].reg_addr = base;
+	DT_3155_DEBUG_MSG("DT3155: New logical address is %p\n",
+			   dt3155_lbase[pci_index-1]);
+	if (!dt3155_lbase[pci_index-1]) {
+		printk("DT3155: Unable to remap control registers\n");
+		goto err;
 	}
 
-      if ( (error = pci_read_config_byte( pci_dev, PCI_INTERRUPT_LINE, &irq)) )
-	{
-	  printk("DT3155: Was not able to find device \n");
-	  goto err;
+	error = pci_read_config_byte(pci_dev, PCI_INTERRUPT_LINE, &irq);
+	if (error) {
+		printk("DT3155: Was not able to find device\n");
+		goto err;
 	}
 
-      DT_3155_DEBUG_MSG("DT3155: IRQ is %d \n",irq);
-      dt3155_status[ pci_index-1 ].irq = irq;
-      /* Set flag: kth device found! */
-      dt3155_status[ pci_index-1 ].device_installed = 1;
-      printk("DT3155: Installing device %d w/irq %d and address %p\n",
-	     pci_index,
-	     dt3155_status[pci_index-1].irq,
-	     dt3155_lbase[pci_index-1]);
+	DT_3155_DEBUG_MSG("DT3155: IRQ is %d\n", irq);
+	dt3155_status[pci_index-1].irq = irq;
+	/* Set flag: kth device found! */
+	dt3155_status[pci_index-1].device_installed = 1;
+	printk("DT3155: Installing device %d w/irq %d and address %p\n",
+		pci_index,
+		dt3155_status[pci_index-1].irq,
+		dt3155_lbase[pci_index-1]);
 
-    }
+  }
   ndevices = pci_index;
 
   return DT_3155_SUCCESS;
@@ -946,126 +895,125 @@ err:
 
 u32 allocatorAddr = 0;
 
-/*****************************************************
+/*
  * init_module()
- *****************************************************/
+ */
 int init_module(void)
 {
   int index;
   int rcode = 0;
-  char *devname[ MAXBOARDS ];
+  char *devname[MAXBOARDS];
 
-  devname[ 0 ] = "dt3155a";
+  devname[0] = "dt3155a";
 #if MAXBOARDS == 2
-  devname[ 1 ] = "dt3155b";
+  devname[1] = "dt3155b";
 #endif
 
   printk("DT3155: Loading module...\n");
 
   /* Register the device driver */
-  rcode = register_chrdev( dt3155_major, "dt3155", &dt3155_fops );
-  if( rcode < 0 )
-    {
-      printk( KERN_INFO "DT3155: register_chrdev failed \n");
-      return rcode;
-    }
-
-  if( dt3155_major == 0 )
-    dt3155_major = rcode; /* dynamic */
-
-
-  /* init the status variables.                     */
-  /* DMA memory is taken care of in setup_buffers() */
-  for ( index = 0; index < MAXBOARDS; index++ )
-    {
-      dt3155_status[ index ].config.acq_mode   = DT3155_MODE_FRAME;
-      dt3155_status[ index ].config.continuous = DT3155_ACQ;
-      dt3155_status[ index ].config.cols       = DT3155_MAX_COLS;
-      dt3155_status[ index ].config.rows       = DT3155_MAX_ROWS;
-      dt3155_status[ index ].state = DT3155_STATE_IDLE;
-
-      /* find_PCI() will check if devices are installed; */
-      /* first assume they're not:                       */
-      dt3155_status[ index ].mem_addr          = 0;
-      dt3155_status[ index ].mem_size          = 0;
-      dt3155_status[ index ].state             = DT3155_STATE_IDLE;
-      dt3155_status[ index ].device_installed  = 0;
-    }
+  rcode = register_chrdev(dt3155_major, "dt3155", &dt3155_fops);
+  if (rcode < 0) {
+	printk(KERN_INFO "DT3155: register_chrdev failed\n");
+	return rcode;
+  }
+
+  if (dt3155_major == 0)
+	dt3155_major = rcode; /* dynamic */
+
+
+  /* init the status variables.
+   * DMA memory is taken care of in setup_buffers()
+   */
+  for (index = 0; index < MAXBOARDS; index++) {
+	dt3155_status[index].config.acq_mode   = DT3155_MODE_FRAME;
+	dt3155_status[index].config.continuous = DT3155_ACQ;
+	dt3155_status[index].config.cols       = DT3155_MAX_COLS;
+	dt3155_status[index].config.rows       = DT3155_MAX_ROWS;
+	dt3155_status[index].state = DT3155_STATE_IDLE;
+
+	/* find_PCI() will check if devices are installed;
+	 * first assume they're not:
+	 */
+	dt3155_status[index].mem_addr          = 0;
+	dt3155_status[index].mem_size          = 0;
+	dt3155_status[index].state             = DT3155_STATE_IDLE;
+	dt3155_status[index].device_installed  = 0;
+  }
 
   /* Now let's find the hardware.  find_PCI() will set ndevices to the
-   * number of cards found in this machine. */
-    {
-      if ( (rcode = find_PCI()) !=  DT_3155_SUCCESS )
-	{
-	  printk("DT3155 error: find_PCI() failed to find dt3155 board(s)\n");
-	  unregister_chrdev( dt3155_major, "dt3155" );
-	  return rcode;
-	}
-    }
+   * number of cards found in this machine.
+   */
+      rcode = find_PCI();
+  if (rcode !=  DT_3155_SUCCESS) {
+	printk("DT3155 error: find_PCI() failed to find dt3155 board(s)\n");
+	unregister_chrdev(dt3155_major, "dt3155");
+	return rcode;
+  }
 
   /* Ok, time to setup the frame buffers */
-  if( (rcode = dt3155_setup_buffers(&allocatorAddr)) < 0 )
-    {
-      printk("DT3155: Error: setting up buffer not large enough.");
-      unregister_chrdev( dt3155_major, "dt3155" );
-      return rcode;
-    }
-
-  /* If we are this far, then there is enough RAM */
-  /* for the buffers: Print the configuration.    */
-  for(  index = 0;  index < ndevices;  index++ )
-    {
-      printk("DT3155: Device = %d; acq_mode = %d; "
-	     "continuous = %d; cols = %d; rows = %d;\n",
-	     index ,
-	     dt3155_status[ index ].config.acq_mode,
-	     dt3155_status[ index ].config.continuous,
-	     dt3155_status[ index ].config.cols,
-	     dt3155_status[ index ].config.rows);
-      printk("DT3155: m_addr = 0x%x; m_size = %ld; "
-	     "state = %d; device_installed = %d\n",
-	     dt3155_status[ index ].mem_addr,
-	     (long int)dt3155_status[ index ].mem_size,
-	     dt3155_status[ index ].state,
-	     dt3155_status[ index ].device_installed);
-    }
+  rcode = dt3155_setup_buffers(&allocatorAddr);
+  if (rcode < 0) {
+	printk("DT3155: Error: setting up buffer not large enough.");
+	unregister_chrdev(dt3155_major, "dt3155");
+	return rcode;
+ }
+
+  /* If we are this far, then there is enough RAM
+   * for the buffers: Print the configuration.
+   */
+  for (index = 0; index < ndevices; index++) {
+	printk("DT3155: Device = %d; acq_mode = %d; "
+	       "continuous = %d; cols = %d; rows = %d;\n",
+	       index ,
+	       dt3155_status[index].config.acq_mode,
+	       dt3155_status[index].config.continuous,
+	       dt3155_status[index].config.cols,
+	       dt3155_status[index].config.rows);
+	printk("DT3155: m_addr = 0x%x; m_size = %ld; "
+	       "state = %d; device_installed = %d\n",
+	       dt3155_status[index].mem_addr,
+	       (long int)dt3155_status[index].mem_size,
+	       dt3155_status[index].state,
+	       dt3155_status[index].device_installed);
+  }
 
   /* Disable ALL interrupts */
   int_csr_r.reg = 0;
-  for(  index = 0;  index < ndevices;  index++ )
-    {
-      WriteMReg( (dt3155_lbase[ index ] + INT_CSR), int_csr_r.reg );
-      if( dt3155_status[ index ].device_installed )
-	{
-	  /*
-	   * This driver *looks* like it can handle sharing interrupts,
-	   * but I can't actually test myself. I've had reports that it
-	   * DOES work so I'll enable it for now. This comment will remain
-	   * as a reminder in case any problems arise. (SS)
-	   */
-	  /* in older kernels flags are: SA_SHIRQ | SA_INTERRUPT */
-	  rcode = request_irq( dt3155_status[ index ].irq, (void *)dt3155_isr,
-			       IRQF_SHARED | IRQF_DISABLED, devname[ index ],
-			       (void*) &dt3155_status[index]);
-	  if( rcode < 0 )
-	    {
-	      printk("DT3155: minor %d request_irq failed for IRQ %d\n",
-		     index, dt3155_status[index].irq);
-	      unregister_chrdev( dt3155_major, "dt3155" );
-	      return rcode;
-	    }
+  for (index = 0; index < ndevices; index++) {
+	WriteMReg((dt3155_lbase[index] + INT_CSR), int_csr_r.reg);
+	if (dt3155_status[index].device_installed) {
+		/*
+		 * This driver *looks* like it can handle sharing interrupts,
+		 * but I can't actually test myself. I've had reports that it
+		 * DOES work so I'll enable it for now. This comment will remain
+		 * as a reminder in case any problems arise. (SS)
+		 *
+		 * in older kernels flags are: SA_SHIRQ | SA_INTERRUPT
+		 */
+		rcode = request_irq(dt3155_status[index].irq,
+				    (void *)dt3155_isr,
+				    IRQF_SHARED | IRQF_DISABLED, devname[index],
+				    (void *) &dt3155_status[index]);
+		if (rcode < 0) {
+			printk(
+			    "DT3155: minor %d request_irq failed for IRQ %d\n",
+			    index, dt3155_status[index].irq);
+			unregister_chrdev(dt3155_major, "dt3155");
+			return rcode;
+		}
 	}
-    }
+  }
 
   printk("DT3155: finished loading\n");
 
   return 0;
 }
 
-/*****************************************************
+/*
  * cleanup_module(void)
  *
- *****************************************************/
+ */
 void cleanup_module(void)
 {
   int index;
@@ -1075,21 +1023,19 @@ void cleanup_module(void)
   /* removed DMA allocated with the allocator */
 #ifdef STANDALONE_ALLOCATOR
   if (allocatorAddr != 0)
-    allocator_free_dma(allocatorAddr);
+	allocator_free_dma(allocatorAddr);
 #else
   allocator_cleanup();
 #endif
 
-  unregister_chrdev( dt3155_major, "dt3155" );
+  unregister_chrdev(dt3155_major, "dt3155");
 
-  for( index = 0; index < ndevices; index++ )
-    {
-      if( dt3155_status[ index ].device_installed == 1 )
-	{
-	  printk( "DT3155: Freeing irq %d for device %d\n",
-		  dt3155_status[ index ].irq, index );
-	  free_irq( dt3155_status[ index ].irq, (void*)&dt3155_status[index] );
+  for (index = 0; index < ndevices; index++) {
+	if (dt3155_status[index].device_installed == 1) {
+		printk("DT3155: Freeing irq %d for device %d\n",
+			dt3155_status[index].irq, index);
+		free_irq(dt3155_status[index].irq,
+			 (void *)&dt3155_status[index]);
 	}
-    }
+  }
 }
-
-- 
1.7.0



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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ