Module: xenomai-abe Branch: experimental Commit: 8524f5d114b4c9facf6fe2c5b790e1de62eeee79 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=8524f5d114b4c9facf6fe2c5b790e1de62eeee79
Author: Alexis Berlemont <alexis.berlem...@gmail.com> Date: Sat Jun 12 01:34:12 2010 +0200 analogy: fix a missing setting of the buf field in subdevice (broken) --- ksrc/drivers/analogy/buffer.c | 15 ++++++++++++--- ksrc/drivers/analogy/command.c | 7 ++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ksrc/drivers/analogy/buffer.c b/ksrc/drivers/analogy/buffer.c index a72b4ad..1134b8e 100644 --- a/ksrc/drivers/analogy/buffer.c +++ b/ksrc/drivers/analogy/buffer.c @@ -124,6 +124,12 @@ int a4l_setup_buffer(a4l_cxt_t *cxt, a4l_cmd_t *cmd) return -EINVAL; } + if (a4l_reserve_subd(buf_desc->subd) < 0) { + __a4l_err("a4l_setup_buffer: subdevice %d already busy\n", + cmd->idx_subd); + return -EBUSY; + } + /* Checks if the transfer system has to work in bulk mode */ if (cmd->flags & A4L_CMD_BULK) set_bit(A4L_BUF_BULK_NR, &buf_desc->flags); @@ -131,6 +137,9 @@ int a4l_setup_buffer(a4l_cxt_t *cxt, a4l_cmd_t *cmd) /* Sets the working command */ buf_desc->cur_cmd = cmd; + /* Link the subdevice with the context's buffer */ + buf_desc->subd->buf = buf_desc; + /* Computes the count to reach, if need be */ if (cmd->stop_src == TRIG_COUNT) { for (i = 0; i < cmd->nb_chan; i++) { @@ -167,9 +176,6 @@ int a4l_cancel_buffer(a4l_cxt_t *cxt) __a4l_err("a4l_cancel: cancel handler failed (err=%d)\n", err); } - a4l_release_subd(subd); - subd->buf = NULL; - if (buf_desc->cur_cmd != NULL) { a4l_free_cmddesc(buf_desc->cur_cmd); rtdm_free(buf_desc->cur_cmd); @@ -178,6 +184,9 @@ int a4l_cancel_buffer(a4l_cxt_t *cxt) a4l_init_buffer(buf_desc); + a4l_release_subd(subd); + subd->buf = NULL; + return err; } diff --git a/ksrc/drivers/analogy/command.c b/ksrc/drivers/analogy/command.c index 51aad35..da89c9a 100644 --- a/ksrc/drivers/analogy/command.c +++ b/ksrc/drivers/analogy/command.c @@ -354,14 +354,11 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) goto out_ioctl_cmd; } - /* Sets the concerned subdevice as busy */ - ret = a4l_reserve_subd(subd); + /* Gets the transfer system ready */ + ret = a4l_setup_buffer(cxt, cmd_desc); if (ret < 0) goto out_ioctl_cmd; - /* Gets the transfer system ready */ - a4l_setup_buffer(cxt, cmd_desc); - /* Eventually launches the command */ ret = subd->do_cmd(subd, cmd_desc); _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git