Commit 843894ad authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

Staging: dt3155: use the fbuffer pointer instead of looking it up

Instead of passing the minor number and having to look up the fbuffer, just
pass the fbuffer directly to the buffer management code.

Also, to make the code more consistent, change the push_empty() call so
that the fbuffer is passed as the first parameter.

Prototype the printques routine to avoid having to declare it as extern.

Cleanup some of the comments in dt3155_isr.h.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Scott Smedley <ss@aao.gov.au>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent dd85c991
...@@ -55,8 +55,6 @@ MA 02111-1307 USA ...@@ -55,8 +55,6 @@ MA 02111-1307 USA
*/ */
extern void printques(int);
#include <linux/module.h> #include <linux/module.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -329,25 +327,25 @@ static void dt3155_isr(int irq, void *dev_id, struct pt_regs *regs) ...@@ -329,25 +327,25 @@ static void dt3155_isr(int irq, void *dev_id, struct pt_regs *regs)
local_irq_disable(); local_irq_disable();
#ifdef DEBUG_QUES_B #ifdef DEBUG_QUES_B
printques(minor); printques(fb);
#endif #endif
if (fb->nbuffers > 2) if (fb->nbuffers > 2)
{ {
if (!are_empty_buffers(minor)) if (!are_empty_buffers(fb))
{ {
/* The number of active + locked buffers is /* The number of active + locked buffers is
* at most 2, and since there are none empty, there * at most 2, and since there are none empty, there
* must be at least nbuffers-2 ready buffers. * must be at least nbuffers-2 ready buffers.
* This is where we 'drop frames', oldest first. */ * This is where we 'drop frames', oldest first. */
push_empty(pop_ready(minor), minor); push_empty(fb, pop_ready(fb));
} }
/* The ready_que can't be full, since we know /* The ready_que can't be full, since we know
* there is one active buffer right now, so it's safe * there is one active buffer right now, so it's safe
* to push the active buf on the ready_que. */ * to push the active buf on the ready_que. */
push_ready(minor, fb->active_buf); push_ready(fb, fb->active_buf);
/* There's at least 1 empty -- make it active */ /* There's at least 1 empty -- make it active */
fb->active_buf = pop_empty(minor); fb->active_buf = pop_empty(fb);
fb->frame_info[fb->active_buf].tag = ++unique_tag; fb->frame_info[fb->active_buf].tag = ++unique_tag;
} }
else /* nbuffers == 2, special case */ else /* nbuffers == 2, special case */
...@@ -357,20 +355,20 @@ static void dt3155_isr(int irq, void *dev_id, struct pt_regs *regs) ...@@ -357,20 +355,20 @@ static void dt3155_isr(int irq, void *dev_id, struct pt_regs *regs)
*/ */
if (fb->locked_buf < 0) if (fb->locked_buf < 0)
{ {
push_ready(minor, fb->active_buf); push_ready(fb, fb->active_buf);
if (are_empty_buffers(minor)) if (are_empty_buffers(fb))
{ {
fb->active_buf = pop_empty(minor); fb->active_buf = pop_empty(fb);
} }
else else
{ /* no empty or locked buffers, so use a readybuf */ { /* no empty or locked buffers, so use a readybuf */
fb->active_buf = pop_ready(minor); fb->active_buf = pop_ready(fb);
} }
} }
} }
#ifdef DEBUG_QUES_B #ifdef DEBUG_QUES_B
printques(minor); printques(fb);
#endif #endif
fb->even_happened = 0; fb->even_happened = 0;
...@@ -559,7 +557,7 @@ static int dt3155_ioctl(struct inode *inode, ...@@ -559,7 +557,7 @@ static int dt3155_ioctl(struct inode *inode,
{ {
if (dts->state != DT3155_STATE_IDLE) if (dts->state != DT3155_STATE_IDLE)
return -EBUSY; return -EBUSY;
return dt3155_flush(minor); return dt3155_flush(fb);
} }
case DT3155_STOP: case DT3155_STOP:
{ {
...@@ -669,6 +667,7 @@ static int dt3155_open(struct inode* inode, struct file* filep) ...@@ -669,6 +667,7 @@ static int dt3155_open(struct inode* inode, struct file* filep)
{ {
int minor = MINOR(inode->i_rdev); /* what device are we opening? */ int minor = MINOR(inode->i_rdev); /* what device are we opening? */
struct dt3155_status *dts = &dt3155_status[minor]; struct dt3155_status *dts = &dt3155_status[minor];
struct dt3155_fbuffer *fb = &dts->fbuffer;
if (dt3155_dev_open[minor]) { if (dt3155_dev_open[minor]) {
printk ("DT3155: Already opened by another process.\n"); printk ("DT3155: Already opened by another process.\n");
...@@ -692,7 +691,7 @@ static int dt3155_open(struct inode* inode, struct file* filep) ...@@ -692,7 +691,7 @@ static int dt3155_open(struct inode* inode, struct file* filep)
dt3155_dev_open[minor] = 1 ; dt3155_dev_open[minor] = 1 ;
dt3155_flush(minor); dt3155_flush(fb);
/* Disable ALL interrupts */ /* Disable ALL interrupts */
writel(0, dt3155_lbase[minor] + INT_CSR); writel(0, dt3155_lbase[minor] + INT_CSR);
...@@ -767,9 +766,9 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf, ...@@ -767,9 +766,9 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf,
/* non-blocking reads should return if no data */ /* non-blocking reads should return if no data */
if (filep->f_flags & O_NDELAY) if (filep->f_flags & O_NDELAY)
{ {
if ((frame_index = dt3155_get_ready_buffer(minor)) < 0) { if ((frame_index = dt3155_get_ready_buffer(fb)) < 0) {
/*printk("dt3155: no buffers available (?)\n");*/ /* printk("dt3155: no buffers available (?)\n"); */
/* printques(minor); */ /* printques(fb); */
return -EAGAIN; return -EAGAIN;
} }
} }
...@@ -780,15 +779,14 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf, ...@@ -780,15 +779,14 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf,
* Note that wait_event_interruptible() does not actually * Note that wait_event_interruptible() does not actually
* sleep/wait if it's condition evaluates to true upon entry. * 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(fb);
(frame_index = dt3155_get_ready_buffer(minor)) wait_event_interruptible(dt3155_read_wait_queue[minor], frame_index >= 0);
>= 0);
if (frame_index < 0) if (frame_index < 0)
{ {
printk ("DT3155: read: interrupted\n"); printk ("DT3155: read: interrupted\n");
quick_stop (minor); quick_stop (minor);
printques(minor); printques(fb);
return -EINTR; return -EINTR;
} }
} }
...@@ -813,8 +811,10 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf, ...@@ -813,8 +811,10 @@ static ssize_t dt3155_read(struct file *filep, char __user *buf,
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); int minor = MINOR(filp->f_dentry->d_inode->i_rdev);
struct dt3155_status *dts = &dt3155_status[minor];
struct dt3155_fbuffer *fb = &dts->fbuffer;
if (!is_ready_buf_empty(minor)) if (!is_ready_buf_empty(fb))
return POLLIN | POLLRDNORM; return POLLIN | POLLRDNORM;
poll_wait (filp, &dt3155_read_wait_queue[minor], wait); poll_wait (filp, &dt3155_read_wait_queue[minor], wait);
......
...@@ -68,10 +68,8 @@ Purpose: Buffer management routines, and other routines for the ISR ...@@ -68,10 +68,8 @@ Purpose: Buffer management routines, and other routines for the ISR
/*************************** /***************************
* are_empty_buffers * are_empty_buffers
***************************/ ***************************/
bool are_empty_buffers(int minor) bool are_empty_buffers(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
return fb->empty_len; return fb->empty_len;
} }
...@@ -84,10 +82,8 @@ bool are_empty_buffers(int minor) ...@@ -84,10 +82,8 @@ bool are_empty_buffers(int minor)
* given by fb->empty_buffers[0]. * given by fb->empty_buffers[0].
* empty_buffers should never fill up, though this is not checked. * empty_buffers should never fill up, though this is not checked.
**************************/ **************************/
void push_empty(int index, int minor) void push_empty(struct dt3155_fbuffer *fb, int index)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
fb->empty_buffers[fb->empty_len] = index; fb->empty_buffers[fb->empty_len] = index;
fb->empty_len++; fb->empty_len++;
} }
...@@ -95,10 +91,8 @@ void push_empty(int index, int minor) ...@@ -95,10 +91,8 @@ void push_empty(int index, int minor)
/************************** /**************************
* pop_empty * pop_empty
**************************/ **************************/
int pop_empty(int minor) int pop_empty(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
fb->empty_len--; fb->empty_len--;
return fb->empty_buffers[fb->empty_len]; return fb->empty_buffers[fb->empty_len];
} }
...@@ -106,10 +100,8 @@ int pop_empty(int minor) ...@@ -106,10 +100,8 @@ int pop_empty(int minor)
/************************* /*************************
* is_ready_buf_empty * is_ready_buf_empty
*************************/ *************************/
bool is_ready_buf_empty(int minor) bool is_ready_buf_empty(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
return fb->ready_len == 0; return fb->ready_len == 0;
} }
...@@ -120,19 +112,16 @@ bool is_ready_buf_empty(int minor) ...@@ -120,19 +112,16 @@ bool is_ready_buf_empty(int minor)
* buffers, since it corresponds to nbuffers ready buffers!! * buffers, since it corresponds to nbuffers ready buffers!!
* 7/31/02: total rewrite. --NJC * 7/31/02: total rewrite. --NJC
*************************/ *************************/
bool is_ready_buf_full(int minor) bool is_ready_buf_full(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
return fb->ready_len == fb->nbuffers; return fb->ready_len == fb->nbuffers;
} }
/***************************************************** /*****************************************************
* push_ready * push_ready
*****************************************************/ *****************************************************/
void push_ready(int minor, int index) void push_ready(struct dt3155_fbuffer *fb, int index)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
int head = fb->ready_head; int head = fb->ready_head;
fb->ready_que[head] = index; fb->ready_que[head] = index;
...@@ -145,10 +134,8 @@ void push_ready(int minor, int index) ...@@ -145,10 +134,8 @@ void push_ready(int minor, int index)
* *
* Simply comptutes the tail given the head and the length. * Simply comptutes the tail given the head and the length.
*****************************************************/ *****************************************************/
static int get_tail(int minor) static int get_tail(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
return (fb->ready_head - fb->ready_len + fb->nbuffers) % fb->nbuffers; return (fb->ready_head - fb->ready_len + fb->nbuffers) % fb->nbuffers;
} }
...@@ -158,10 +145,9 @@ static int get_tail(int minor) ...@@ -158,10 +145,9 @@ static int get_tail(int minor)
* This assumes that there is a ready buffer ready... should * This assumes that there is a ready buffer ready... should
* be checked (e.g. with is_ready_buf_empty() prior to call. * be checked (e.g. with is_ready_buf_empty() prior to call.
*****************************************************/ *****************************************************/
int pop_ready(int minor) int pop_ready(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer; int tail = get_tail(fb);
int tail = get_tail(minor);
fb->ready_len--; fb->ready_len--;
return fb->ready_que[tail]; return fb->ready_que[tail];
...@@ -170,13 +156,12 @@ int pop_ready(int minor) ...@@ -170,13 +156,12 @@ int pop_ready(int minor)
/***************************************************** /*****************************************************
* printques * printques
*****************************************************/ *****************************************************/
void printques(int minor) void printques(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
int i; int i;
printk(KERN_INFO "\n R:"); printk(KERN_INFO "\n R:");
for (i = get_tail(minor); i != fb->ready_head; i++, i %= fb->nbuffers) for (i = get_tail(fb); i != fb->ready_head; i++, i %= fb->nbuffers)
printk(" %d ", fb->ready_que[i]); printk(" %d ", fb->ready_que[i]);
printk(KERN_INFO "\n E:"); printk(KERN_INFO "\n E:");
...@@ -349,14 +334,14 @@ u32 dt3155_setup_buffers(u32 *allocatorAddr) ...@@ -349,14 +334,14 @@ u32 dt3155_setup_buffers(u32 *allocatorAddr)
} }
fb->frame_info[index].addr = rambuff_acm; fb->frame_info[index].addr = rambuff_acm;
push_empty(index, minor); push_empty(fb, index);
/* printk(" - Buffer : %lx\n", fb->frame_info[index].addr); */ /* printk(" - Buffer : %lx\n", fb->frame_info[index].addr); */
fb->nbuffers += 1; fb->nbuffers += 1;
rambuff_acm += bufsize; rambuff_acm += bufsize;
} }
/* Make sure there is an active buffer there. */ /* Make sure there is an active buffer there. */
fb->active_buf = pop_empty(minor); fb->active_buf = pop_empty(fb);
fb->even_happened = 0; fb->even_happened = 0;
fb->even_stopped = 0; fb->even_stopped = 0;
...@@ -382,12 +367,10 @@ u32 dt3155_setup_buffers(u32 *allocatorAddr) ...@@ -382,12 +367,10 @@ u32 dt3155_setup_buffers(u32 *allocatorAddr)
* The internal function for releasing a locked buffer. * The internal function for releasing a locked buffer.
* It assumes interrupts are turned off. * It assumes interrupts are turned off.
*****************************************************/ *****************************************************/
static void internal_release_locked_buffer(int minor) static void internal_release_locked_buffer(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
if (fb->locked_buf >= 0) { if (fb->locked_buf >= 0) {
push_empty(fb->locked_buf, minor); push_empty(fb, fb->locked_buf);
fb->locked_buf = -1; fb->locked_buf = -1;
} }
} }
...@@ -397,36 +380,35 @@ static void internal_release_locked_buffer(int minor) ...@@ -397,36 +380,35 @@ static void internal_release_locked_buffer(int minor)
* *
* The user function of the above. * The user function of the above.
*****************************************************/ *****************************************************/
void dt3155_release_locked_buffer(int minor) void dt3155_release_locked_buffer(struct dt3155_fbuffer *fb)
{ {
unsigned long int flags; unsigned long int flags;
local_save_flags(flags); local_save_flags(flags);
local_irq_disable(); local_irq_disable();
internal_release_locked_buffer(minor); internal_release_locked_buffer(fb);
local_irq_restore(flags); local_irq_restore(flags);
} }
/***************************************************** /*****************************************************
* dt3155_flush * dt3155_flush
*****************************************************/ *****************************************************/
int dt3155_flush(int minor) int dt3155_flush(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
unsigned long int flags; unsigned long int flags;
int index; int index;
local_save_flags(flags); local_save_flags(flags);
local_irq_disable(); local_irq_disable();
internal_release_locked_buffer(minor); internal_release_locked_buffer(fb);
fb->empty_len = 0; fb->empty_len = 0;
for (index = 0; index < fb->nbuffers; index++) for (index = 0; index < fb->nbuffers; index++)
push_empty(index, minor); push_empty(fb, index);
/* Make sure there is an active buffer there. */ /* Make sure there is an active buffer there. */
fb->active_buf = pop_empty(minor); fb->active_buf = pop_empty(fb);
fb->even_happened = 0; fb->even_happened = 0;
fb->even_stopped = 0; fb->even_stopped = 0;
...@@ -448,9 +430,8 @@ int dt3155_flush(int minor) ...@@ -448,9 +430,8 @@ int dt3155_flush(int minor)
* If the user has a buffer locked it will unlock * If the user has a buffer locked it will unlock
* that buffer before returning the new one. * that buffer before returning the new one.
*****************************************************/ *****************************************************/
int dt3155_get_ready_buffer(int minor) int dt3155_get_ready_buffer(struct dt3155_fbuffer *fb)
{ {
struct dt3155_fbuffer *fb = &dt3155_status[minor].fbuffer;
unsigned long int flags; unsigned long int flags;
int frame_index; int frame_index;
...@@ -458,20 +439,20 @@ int dt3155_get_ready_buffer(int minor) ...@@ -458,20 +439,20 @@ int dt3155_get_ready_buffer(int minor)
local_irq_disable(); local_irq_disable();
#ifdef DEBUG_QUES_A #ifdef DEBUG_QUES_A
printques(minor); printques(fb);
#endif #endif
internal_release_locked_buffer(minor); internal_release_locked_buffer(fb);
if (is_ready_buf_empty(minor)) { if (is_ready_buf_empty(fb)) {
frame_index = -1; frame_index = -1;
} else { } else {
frame_index = pop_ready(minor); frame_index = pop_ready(fb);
fb->locked_buf = frame_index; fb->locked_buf = frame_index;
} }
#ifdef DEBUG_QUES_B #ifdef DEBUG_QUES_B
printques(minor); printques(fb);
#endif #endif
local_irq_restore(flags); local_irq_restore(flags);
......
...@@ -36,40 +36,48 @@ MA 02111-1307 USA ...@@ -36,40 +36,48 @@ MA 02111-1307 USA
#ifndef DT3155_ISR_H #ifndef DT3155_ISR_H
#define DT3155_ISR_H #define DT3155_ISR_H
/* User functions for buffering */ /**********************************
/* Initialize the buffering system. This should */ * User functions for buffering
/* be called prior to enabling interrupts */ **********************************/
/*
* Initialize the buffering system.
* This should be called prior to enabling interrupts
*/
u32 dt3155_setup_buffers(u32 *allocatorAddr); u32 dt3155_setup_buffers(u32 *allocatorAddr);
/* Get the next frame of data if it is ready. Returns */ /*
/* zero if no data is ready. If there is data but */ * Get the next frame of data if it is ready.
/* the user has a locked buffer, it will unlock that */ * Returns zero if no data is ready. If there is data but the user has a
/* buffer and return it to the free list. */ * locked buffer, it will unlock that buffer and return it to the free list.
*/
int dt3155_get_ready_buffer(int minor); int dt3155_get_ready_buffer(struct dt3155_fbuffer *fb);
/* Return a locked buffer to the free list */
void dt3155_release_locked_buffer(int minor); /*
* Return a locked buffer to the free list.
*/
void dt3155_release_locked_buffer(struct dt3155_fbuffer *fb);
/* Flush the buffer system */ /*
int dt3155_flush(int minor); * Flush the buffer system.
*/
int dt3155_flush(struct dt3155_fbuffer *fb);
/********************************** /**********************************
* Simple array based que struct * Simple array based que struct
**********************************/ **********************************/
bool are_empty_buffers(int minor); bool are_empty_buffers(struct dt3155_fbuffer *fb);
void push_empty(int index, int minor); void push_empty(struct dt3155_fbuffer *fb, int index);
int pop_empty(int minor); int pop_empty(struct dt3155_fbuffer *fb);
bool is_ready_buf_empty(int minor); bool is_ready_buf_empty(struct dt3155_fbuffer *fb);
bool is_ready_buf_full(int minor); bool is_ready_buf_full(struct dt3155_fbuffer *fb);
void push_ready(int minor, int index); void push_ready(struct dt3155_fbuffer *fb, int index);
int pop_ready(int minor); int pop_ready(struct dt3155_fbuffer *fb);
void printques(struct dt3155_fbuffer *fb);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment