[Xenomai-git] Alexis Berlemont : analogy: declare the reserve / release functions at the subd level (broken)
Module: xenomai-head Branch: master Commit: 7f58510b4748a25aef03e17b1d4ded1f6bf4d96d URL: http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=7f58510b4748a25aef03e17b1d4ded1f6bf4d96d Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Mon May 24 16:46:31 2010 +0200 analogy: declare the reserve / release functions at the subd level (broken) --- include/analogy/subdevice.h|2 ++ ksrc/drivers/analogy/command.c | 33 - ksrc/drivers/analogy/instruction.c |2 +- ksrc/drivers/analogy/subdevice.c | 15 +++ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/include/analogy/subdevice.h b/include/analogy/subdevice.h index 0f9e1c5..ded82f3 100644 --- a/include/analogy/subdevice.h +++ b/include/analogy/subdevice.h @@ -290,6 +290,8 @@ a4l_subd_t * a4l_get_subd(struct a4l_device *dev, int idx); a4l_subd_t * a4l_alloc_subd(int sizeof_priv, void (*setup)(a4l_subd_t *)); int a4l_add_subd(struct a4l_device *dev, a4l_subd_t * subd); +int a4l_reserve_subd(a4l_subd_t *subd); +void a4l_release_subd(a4l_subd_t *subd); int a4l_ioctl_subdinfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_chaninfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_rnginfo(a4l_cxt_t * cxt, void *arg); diff --git a/ksrc/drivers/analogy/command.c b/ksrc/drivers/analogy/command.c index b300d9a..94d6137 100644 --- a/ksrc/drivers/analogy/command.c +++ b/ksrc/drivers/analogy/command.c @@ -90,11 +90,8 @@ void a4l_free_cmddesc(a4l_cmd_t * desc) int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) { - int ret = 0; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, -a4l_check_cmddesc: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; if (desc-idx_subd = dev-transfer.nb_subd) { __a4l_err(a4l_check_cmddesc: @@ -103,25 +100,23 @@ int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) return -EINVAL; } - if ((dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_TYPES) == - A4L_SUBD_UNUSED) { + subd = dev-transfer.subds[desc-idx_subd]; + + if ((subd-flags A4L_SUBD_TYPES) == A4L_SUBD_UNUSED) { __a4l_err(a4l_check_cmddesc: subdevice type incoherent\n); return -EIO; } - if (!(dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_CMD)) { + if (!(subd-flags A4L_SUBD_CMD)) { __a4l_err(a4l_check_cmddesc: operation not supported, synchronous only subdevice\n); return -EIO; } - if (test_bit(A4L_TSF_BUSY, (dev-transfer.status[desc-idx_subd]))) - return -EBUSY; - - if (ret != 0) { + if (test_bit(A4L_SUBD_BUSY, subd-status)) { __a4l_err(a4l_check_cmddesc: subdevice busy\n); - return ret; + return -EBUSY; } return a4l_check_chanlist(dev-transfer.subds[desc-idx_subd], @@ -299,17 +294,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) { int ret = 0, simul_flag = 0; a4l_cmd_t *cmd_desc = NULL; - a4l_subd_t *subd; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, - a4l_ioctl_cmd: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; /* The command launching cannot be done in real-time because of some possible buffer allocations in the drivers */ - if (rtdm_in_rt_context()) { + if (rtdm_in_rt_context()) return -ENOSYS; - } /* Basically check the device */ if (!test_bit(A4L_DEV_ATTACHED, dev-flags)) { @@ -373,13 +364,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) /* Eventually launches the command */ ret = subd-do_cmd(subd, cmd_desc); - + if (ret != 0) { - a4l_cancel_transfer(cxt, cmd_desc-idx_subd); + a4l_cancel_buffer(cxt); goto out_ioctl_cmd; } - out_ioctl_cmd: +out_ioctl_cmd: if (ret != 0 || simul_flag == 1) { a4l_free_cmddesc(cmd_desc); rtdm_free(cmd_desc); diff --git a/ksrc/drivers/analogy/instruction.c b/ksrc/drivers/analogy/instruction.c index 941fa69..413c0d2 100644 --- a/ksrc/drivers/analogy/instruction.c +++ b/ksrc/drivers/analogy/instruction.c @@ -281,7 +281,7 @@ int a4l_do_insn(a4l_cxt_t * cxt, a4l_kinsn_t * dsc) out_do_insn: /* Releases the subdevice from its reserved state */ - a4l_cancel_transfer(cxt, dsc-idx_subd); + a4l_release_subd(subd); return ret; } diff --git a/ksrc/drivers/analogy/subdevice.c b/ksrc/drivers/analogy/subdevice.c index 1278081..506b742 100644 --- a/ksrc/drivers/analogy/subdevice.c +++ b/ksrc/drivers/analogy/subdevice.c @@ -180,6 +180,21 @@ a4l_subd_t *a4l_get_subd(a4l_dev_t *dev, int idx) return subd; } +int
[Xenomai-git] Alexis Berlemont : analogy: declare the reserve / release functions at the subd level (broken)
Module: xenomai-abe Branch: analogy Commit: 38605bb16b43d73477d5aa6406c6effd7d127c02 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=38605bb16b43d73477d5aa6406c6effd7d127c02 Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Mon May 24 16:46:31 2010 +0200 analogy: declare the reserve / release functions at the subd level (broken) --- include/analogy/subdevice.h|2 ++ ksrc/drivers/analogy/command.c | 33 - ksrc/drivers/analogy/instruction.c |2 +- ksrc/drivers/analogy/subdevice.c | 15 +++ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/include/analogy/subdevice.h b/include/analogy/subdevice.h index 0f9e1c5..ded82f3 100644 --- a/include/analogy/subdevice.h +++ b/include/analogy/subdevice.h @@ -290,6 +290,8 @@ a4l_subd_t * a4l_get_subd(struct a4l_device *dev, int idx); a4l_subd_t * a4l_alloc_subd(int sizeof_priv, void (*setup)(a4l_subd_t *)); int a4l_add_subd(struct a4l_device *dev, a4l_subd_t * subd); +int a4l_reserve_subd(a4l_subd_t *subd); +void a4l_release_subd(a4l_subd_t *subd); int a4l_ioctl_subdinfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_chaninfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_rnginfo(a4l_cxt_t * cxt, void *arg); diff --git a/ksrc/drivers/analogy/command.c b/ksrc/drivers/analogy/command.c index b300d9a..94d6137 100644 --- a/ksrc/drivers/analogy/command.c +++ b/ksrc/drivers/analogy/command.c @@ -90,11 +90,8 @@ void a4l_free_cmddesc(a4l_cmd_t * desc) int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) { - int ret = 0; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, -a4l_check_cmddesc: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; if (desc-idx_subd = dev-transfer.nb_subd) { __a4l_err(a4l_check_cmddesc: @@ -103,25 +100,23 @@ int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) return -EINVAL; } - if ((dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_TYPES) == - A4L_SUBD_UNUSED) { + subd = dev-transfer.subds[desc-idx_subd]; + + if ((subd-flags A4L_SUBD_TYPES) == A4L_SUBD_UNUSED) { __a4l_err(a4l_check_cmddesc: subdevice type incoherent\n); return -EIO; } - if (!(dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_CMD)) { + if (!(subd-flags A4L_SUBD_CMD)) { __a4l_err(a4l_check_cmddesc: operation not supported, synchronous only subdevice\n); return -EIO; } - if (test_bit(A4L_TSF_BUSY, (dev-transfer.status[desc-idx_subd]))) - return -EBUSY; - - if (ret != 0) { + if (test_bit(A4L_SUBD_BUSY, subd-status)) { __a4l_err(a4l_check_cmddesc: subdevice busy\n); - return ret; + return -EBUSY; } return a4l_check_chanlist(dev-transfer.subds[desc-idx_subd], @@ -299,17 +294,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) { int ret = 0, simul_flag = 0; a4l_cmd_t *cmd_desc = NULL; - a4l_subd_t *subd; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, - a4l_ioctl_cmd: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; /* The command launching cannot be done in real-time because of some possible buffer allocations in the drivers */ - if (rtdm_in_rt_context()) { + if (rtdm_in_rt_context()) return -ENOSYS; - } /* Basically check the device */ if (!test_bit(A4L_DEV_ATTACHED, dev-flags)) { @@ -373,13 +364,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) /* Eventually launches the command */ ret = subd-do_cmd(subd, cmd_desc); - + if (ret != 0) { - a4l_cancel_transfer(cxt, cmd_desc-idx_subd); + a4l_cancel_buffer(cxt); goto out_ioctl_cmd; } - out_ioctl_cmd: +out_ioctl_cmd: if (ret != 0 || simul_flag == 1) { a4l_free_cmddesc(cmd_desc); rtdm_free(cmd_desc); diff --git a/ksrc/drivers/analogy/instruction.c b/ksrc/drivers/analogy/instruction.c index 941fa69..413c0d2 100644 --- a/ksrc/drivers/analogy/instruction.c +++ b/ksrc/drivers/analogy/instruction.c @@ -281,7 +281,7 @@ int a4l_do_insn(a4l_cxt_t * cxt, a4l_kinsn_t * dsc) out_do_insn: /* Releases the subdevice from its reserved state */ - a4l_cancel_transfer(cxt, dsc-idx_subd); + a4l_release_subd(subd); return ret; } diff --git a/ksrc/drivers/analogy/subdevice.c b/ksrc/drivers/analogy/subdevice.c index 1278081..506b742 100644 --- a/ksrc/drivers/analogy/subdevice.c +++ b/ksrc/drivers/analogy/subdevice.c @@ -180,6 +180,21 @@ a4l_subd_t *a4l_get_subd(a4l_dev_t *dev, int idx) return subd; } +int
[Xenomai-git] Alexis Berlemont : analogy: declare the reserve / release functions at the subd level (broken)
Module: xenomai-abe Branch: experimental Commit: d20cb6dc3652d7dc866b5c8a7c8281bfc7f23b32 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=d20cb6dc3652d7dc866b5c8a7c8281bfc7f23b32 Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Mon May 24 16:46:31 2010 +0200 analogy: declare the reserve / release functions at the subd level (broken) --- include/analogy/subdevice.h|2 ++ ksrc/drivers/analogy/command.c | 33 - ksrc/drivers/analogy/instruction.c |2 +- ksrc/drivers/analogy/subdevice.c | 15 +++ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/include/analogy/subdevice.h b/include/analogy/subdevice.h index 0f9e1c5..ded82f3 100644 --- a/include/analogy/subdevice.h +++ b/include/analogy/subdevice.h @@ -290,6 +290,8 @@ a4l_subd_t * a4l_get_subd(struct a4l_device *dev, int idx); a4l_subd_t * a4l_alloc_subd(int sizeof_priv, void (*setup)(a4l_subd_t *)); int a4l_add_subd(struct a4l_device *dev, a4l_subd_t * subd); +int a4l_reserve_subd(a4l_subd_t *subd); +void a4l_release_subd(a4l_subd_t *subd); int a4l_ioctl_subdinfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_chaninfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_rnginfo(a4l_cxt_t * cxt, void *arg); diff --git a/ksrc/drivers/analogy/command.c b/ksrc/drivers/analogy/command.c index b300d9a..94d6137 100644 --- a/ksrc/drivers/analogy/command.c +++ b/ksrc/drivers/analogy/command.c @@ -90,11 +90,8 @@ void a4l_free_cmddesc(a4l_cmd_t * desc) int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) { - int ret = 0; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, -a4l_check_cmddesc: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; if (desc-idx_subd = dev-transfer.nb_subd) { __a4l_err(a4l_check_cmddesc: @@ -103,25 +100,23 @@ int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) return -EINVAL; } - if ((dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_TYPES) == - A4L_SUBD_UNUSED) { + subd = dev-transfer.subds[desc-idx_subd]; + + if ((subd-flags A4L_SUBD_TYPES) == A4L_SUBD_UNUSED) { __a4l_err(a4l_check_cmddesc: subdevice type incoherent\n); return -EIO; } - if (!(dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_CMD)) { + if (!(subd-flags A4L_SUBD_CMD)) { __a4l_err(a4l_check_cmddesc: operation not supported, synchronous only subdevice\n); return -EIO; } - if (test_bit(A4L_TSF_BUSY, (dev-transfer.status[desc-idx_subd]))) - return -EBUSY; - - if (ret != 0) { + if (test_bit(A4L_SUBD_BUSY, subd-status)) { __a4l_err(a4l_check_cmddesc: subdevice busy\n); - return ret; + return -EBUSY; } return a4l_check_chanlist(dev-transfer.subds[desc-idx_subd], @@ -299,17 +294,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) { int ret = 0, simul_flag = 0; a4l_cmd_t *cmd_desc = NULL; - a4l_subd_t *subd; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, - a4l_ioctl_cmd: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; /* The command launching cannot be done in real-time because of some possible buffer allocations in the drivers */ - if (rtdm_in_rt_context()) { + if (rtdm_in_rt_context()) return -ENOSYS; - } /* Basically check the device */ if (!test_bit(A4L_DEV_ATTACHED, dev-flags)) { @@ -373,13 +364,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) /* Eventually launches the command */ ret = subd-do_cmd(subd, cmd_desc); - + if (ret != 0) { - a4l_cancel_transfer(cxt, cmd_desc-idx_subd); + a4l_cancel_buffer(cxt); goto out_ioctl_cmd; } - out_ioctl_cmd: +out_ioctl_cmd: if (ret != 0 || simul_flag == 1) { a4l_free_cmddesc(cmd_desc); rtdm_free(cmd_desc); diff --git a/ksrc/drivers/analogy/instruction.c b/ksrc/drivers/analogy/instruction.c index 941fa69..413c0d2 100644 --- a/ksrc/drivers/analogy/instruction.c +++ b/ksrc/drivers/analogy/instruction.c @@ -281,7 +281,7 @@ int a4l_do_insn(a4l_cxt_t * cxt, a4l_kinsn_t * dsc) out_do_insn: /* Releases the subdevice from its reserved state */ - a4l_cancel_transfer(cxt, dsc-idx_subd); + a4l_release_subd(subd); return ret; } diff --git a/ksrc/drivers/analogy/subdevice.c b/ksrc/drivers/analogy/subdevice.c index 1278081..506b742 100644 --- a/ksrc/drivers/analogy/subdevice.c +++ b/ksrc/drivers/analogy/subdevice.c @@ -180,6 +180,21 @@ a4l_subd_t *a4l_get_subd(a4l_dev_t *dev, int idx) return subd; }
[Xenomai-git] Alexis Berlemont : analogy: declare the reserve / release functions at the subd level (broken)
Module: xenomai-abe Branch: analogy Commit: d20cb6dc3652d7dc866b5c8a7c8281bfc7f23b32 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=d20cb6dc3652d7dc866b5c8a7c8281bfc7f23b32 Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Mon May 24 16:46:31 2010 +0200 analogy: declare the reserve / release functions at the subd level (broken) --- include/analogy/subdevice.h|2 ++ ksrc/drivers/analogy/command.c | 33 - ksrc/drivers/analogy/instruction.c |2 +- ksrc/drivers/analogy/subdevice.c | 15 +++ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/include/analogy/subdevice.h b/include/analogy/subdevice.h index 0f9e1c5..ded82f3 100644 --- a/include/analogy/subdevice.h +++ b/include/analogy/subdevice.h @@ -290,6 +290,8 @@ a4l_subd_t * a4l_get_subd(struct a4l_device *dev, int idx); a4l_subd_t * a4l_alloc_subd(int sizeof_priv, void (*setup)(a4l_subd_t *)); int a4l_add_subd(struct a4l_device *dev, a4l_subd_t * subd); +int a4l_reserve_subd(a4l_subd_t *subd); +void a4l_release_subd(a4l_subd_t *subd); int a4l_ioctl_subdinfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_chaninfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_rnginfo(a4l_cxt_t * cxt, void *arg); diff --git a/ksrc/drivers/analogy/command.c b/ksrc/drivers/analogy/command.c index b300d9a..94d6137 100644 --- a/ksrc/drivers/analogy/command.c +++ b/ksrc/drivers/analogy/command.c @@ -90,11 +90,8 @@ void a4l_free_cmddesc(a4l_cmd_t * desc) int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) { - int ret = 0; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, -a4l_check_cmddesc: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; if (desc-idx_subd = dev-transfer.nb_subd) { __a4l_err(a4l_check_cmddesc: @@ -103,25 +100,23 @@ int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) return -EINVAL; } - if ((dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_TYPES) == - A4L_SUBD_UNUSED) { + subd = dev-transfer.subds[desc-idx_subd]; + + if ((subd-flags A4L_SUBD_TYPES) == A4L_SUBD_UNUSED) { __a4l_err(a4l_check_cmddesc: subdevice type incoherent\n); return -EIO; } - if (!(dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_CMD)) { + if (!(subd-flags A4L_SUBD_CMD)) { __a4l_err(a4l_check_cmddesc: operation not supported, synchronous only subdevice\n); return -EIO; } - if (test_bit(A4L_TSF_BUSY, (dev-transfer.status[desc-idx_subd]))) - return -EBUSY; - - if (ret != 0) { + if (test_bit(A4L_SUBD_BUSY, subd-status)) { __a4l_err(a4l_check_cmddesc: subdevice busy\n); - return ret; + return -EBUSY; } return a4l_check_chanlist(dev-transfer.subds[desc-idx_subd], @@ -299,17 +294,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) { int ret = 0, simul_flag = 0; a4l_cmd_t *cmd_desc = NULL; - a4l_subd_t *subd; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, - a4l_ioctl_cmd: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; /* The command launching cannot be done in real-time because of some possible buffer allocations in the drivers */ - if (rtdm_in_rt_context()) { + if (rtdm_in_rt_context()) return -ENOSYS; - } /* Basically check the device */ if (!test_bit(A4L_DEV_ATTACHED, dev-flags)) { @@ -373,13 +364,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) /* Eventually launches the command */ ret = subd-do_cmd(subd, cmd_desc); - + if (ret != 0) { - a4l_cancel_transfer(cxt, cmd_desc-idx_subd); + a4l_cancel_buffer(cxt); goto out_ioctl_cmd; } - out_ioctl_cmd: +out_ioctl_cmd: if (ret != 0 || simul_flag == 1) { a4l_free_cmddesc(cmd_desc); rtdm_free(cmd_desc); diff --git a/ksrc/drivers/analogy/instruction.c b/ksrc/drivers/analogy/instruction.c index 941fa69..413c0d2 100644 --- a/ksrc/drivers/analogy/instruction.c +++ b/ksrc/drivers/analogy/instruction.c @@ -281,7 +281,7 @@ int a4l_do_insn(a4l_cxt_t * cxt, a4l_kinsn_t * dsc) out_do_insn: /* Releases the subdevice from its reserved state */ - a4l_cancel_transfer(cxt, dsc-idx_subd); + a4l_release_subd(subd); return ret; } diff --git a/ksrc/drivers/analogy/subdevice.c b/ksrc/drivers/analogy/subdevice.c index 1278081..506b742 100644 --- a/ksrc/drivers/analogy/subdevice.c +++ b/ksrc/drivers/analogy/subdevice.c @@ -180,6 +180,21 @@ a4l_subd_t *a4l_get_subd(a4l_dev_t *dev, int idx) return subd; } +int
[Xenomai-git] Alexis Berlemont : analogy: declare the reserve / release functions at the subd level (broken)
Module: xenomai-abe Branch: experimental Commit: afe94634dc91fe6462c21ab86cbb4166a05a1ccf URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=afe94634dc91fe6462c21ab86cbb4166a05a1ccf Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Mon May 24 16:46:31 2010 +0200 analogy: declare the reserve / release functions at the subd level (broken) --- include/analogy/subdevice.h|2 ++ ksrc/drivers/analogy/command.c | 33 - ksrc/drivers/analogy/instruction.c |2 +- ksrc/drivers/analogy/subdevice.c | 15 +++ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/include/analogy/subdevice.h b/include/analogy/subdevice.h index 0f9e1c5..ded82f3 100644 --- a/include/analogy/subdevice.h +++ b/include/analogy/subdevice.h @@ -290,6 +290,8 @@ a4l_subd_t * a4l_get_subd(struct a4l_device *dev, int idx); a4l_subd_t * a4l_alloc_subd(int sizeof_priv, void (*setup)(a4l_subd_t *)); int a4l_add_subd(struct a4l_device *dev, a4l_subd_t * subd); +int a4l_reserve_subd(a4l_subd_t *subd); +void a4l_release_subd(a4l_subd_t *subd); int a4l_ioctl_subdinfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_chaninfo(a4l_cxt_t * cxt, void *arg); int a4l_ioctl_rnginfo(a4l_cxt_t * cxt, void *arg); diff --git a/ksrc/drivers/analogy/command.c b/ksrc/drivers/analogy/command.c index b300d9a..94d6137 100644 --- a/ksrc/drivers/analogy/command.c +++ b/ksrc/drivers/analogy/command.c @@ -90,11 +90,8 @@ void a4l_free_cmddesc(a4l_cmd_t * desc) int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) { - int ret = 0; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, -a4l_check_cmddesc: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; if (desc-idx_subd = dev-transfer.nb_subd) { __a4l_err(a4l_check_cmddesc: @@ -103,25 +100,23 @@ int a4l_check_cmddesc(a4l_cxt_t * cxt, a4l_cmd_t * desc) return -EINVAL; } - if ((dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_TYPES) == - A4L_SUBD_UNUSED) { + subd = dev-transfer.subds[desc-idx_subd]; + + if ((subd-flags A4L_SUBD_TYPES) == A4L_SUBD_UNUSED) { __a4l_err(a4l_check_cmddesc: subdevice type incoherent\n); return -EIO; } - if (!(dev-transfer.subds[desc-idx_subd]-flags A4L_SUBD_CMD)) { + if (!(subd-flags A4L_SUBD_CMD)) { __a4l_err(a4l_check_cmddesc: operation not supported, synchronous only subdevice\n); return -EIO; } - if (test_bit(A4L_TSF_BUSY, (dev-transfer.status[desc-idx_subd]))) - return -EBUSY; - - if (ret != 0) { + if (test_bit(A4L_SUBD_BUSY, subd-status)) { __a4l_err(a4l_check_cmddesc: subdevice busy\n); - return ret; + return -EBUSY; } return a4l_check_chanlist(dev-transfer.subds[desc-idx_subd], @@ -299,17 +294,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) { int ret = 0, simul_flag = 0; a4l_cmd_t *cmd_desc = NULL; - a4l_subd_t *subd; a4l_dev_t *dev = a4l_get_dev(cxt); - - __a4l_dbg(1, core_dbg, - a4l_ioctl_cmd: minor=%d\n, a4l_get_minor(cxt)); + a4l_subd_t *subd; /* The command launching cannot be done in real-time because of some possible buffer allocations in the drivers */ - if (rtdm_in_rt_context()) { + if (rtdm_in_rt_context()) return -ENOSYS; - } /* Basically check the device */ if (!test_bit(A4L_DEV_ATTACHED, dev-flags)) { @@ -373,13 +364,13 @@ int a4l_ioctl_cmd(a4l_cxt_t * cxt, void *arg) /* Eventually launches the command */ ret = subd-do_cmd(subd, cmd_desc); - + if (ret != 0) { - a4l_cancel_transfer(cxt, cmd_desc-idx_subd); + a4l_cancel_buffer(cxt); goto out_ioctl_cmd; } - out_ioctl_cmd: +out_ioctl_cmd: if (ret != 0 || simul_flag == 1) { a4l_free_cmddesc(cmd_desc); rtdm_free(cmd_desc); diff --git a/ksrc/drivers/analogy/instruction.c b/ksrc/drivers/analogy/instruction.c index 941fa69..413c0d2 100644 --- a/ksrc/drivers/analogy/instruction.c +++ b/ksrc/drivers/analogy/instruction.c @@ -281,7 +281,7 @@ int a4l_do_insn(a4l_cxt_t * cxt, a4l_kinsn_t * dsc) out_do_insn: /* Releases the subdevice from its reserved state */ - a4l_cancel_transfer(cxt, dsc-idx_subd); + a4l_release_subd(subd); return ret; } diff --git a/ksrc/drivers/analogy/subdevice.c b/ksrc/drivers/analogy/subdevice.c index 1278081..506b742 100644 --- a/ksrc/drivers/analogy/subdevice.c +++ b/ksrc/drivers/analogy/subdevice.c @@ -180,6 +180,21 @@ a4l_subd_t *a4l_get_subd(a4l_dev_t *dev, int idx) return subd; }