* [PATCH 24/37] dvb: dst: protect the read/write commands with a mutex
@ 2005-11-01 8:15 Michael Krufky
2005-11-03 2:57 ` Andrew Morton
0 siblings, 1 reply; 3+ messages in thread
From: Michael Krufky @ 2005-11-01 8:15 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel, linux-dvb-maintainer
[-- Attachment #1: Type: text/plain, Size: 2 bytes --]
[-- Attachment #2: 2395.patch --]
[-- Type: text/x-patch, Size: 4374 bytes --]
From: Manu Abraham <manu@linuxtv.org>
-We need to protect the read/write commands with a mutex.
Bug reported by Henrik Sjoberg <henke@epact.se>
Signed-off-by: Manu Abraham <manu@linuxtv.org>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
drivers/media/dvb/bt8xx/dst.c | 34 +++++++++++++++++++++-------------
drivers/media/dvb/bt8xx/dst_ca.c | 17 +++++++++++------
drivers/media/dvb/bt8xx/dst_common.h | 3 +++
3 files changed, 35 insertions(+), 19 deletions(-)
--- linux-2.6.14-git3.orig/drivers/media/dvb/bt8xx/dst.c
+++ linux-2.6.14-git3/drivers/media/dvb/bt8xx/dst.c
@@ -910,6 +910,7 @@
static int dst_probe(struct dst_state *state)
{
+ sema_init(&state->dst_mutex, 1);
if ((rdc_8820_reset(state)) < 0) {
dprintk(verbose, DST_ERROR, 1, "RDC 8820 RESET Failed.");
return -1;
@@ -960,21 +961,23 @@
int dst_command(struct dst_state *state, u8 *data, u8 len)
{
u8 reply;
+
+ down(&state->dst_mutex);
if ((dst_comm_init(state)) < 0) {
dprintk(verbose, DST_NOTICE, 1, "DST Communication Initialization Failed.");
- return -1;
+ goto error;
}
if (write_dst(state, data, len)) {
dprintk(verbose, DST_INFO, 1, "Tring to recover.. ");
if ((dst_error_recovery(state)) < 0) {
dprintk(verbose, DST_ERROR, 1, "Recovery Failed.");
- return -1;
+ goto error;
}
- return -1;
+ goto error;
}
if ((dst_pio_disable(state)) < 0) {
dprintk(verbose, DST_ERROR, 1, "PIO Disable Failed.");
- return -1;
+ goto error;
}
if (state->type_flags & DST_TYPE_HAS_FW_1)
udelay(3000);
@@ -982,36 +985,41 @@
dprintk(verbose, DST_DEBUG, 1, "Trying to recover.. ");
if ((dst_error_recovery(state)) < 0) {
dprintk(verbose, DST_INFO, 1, "Recovery Failed.");
- return -1;
+ goto error;
}
- return -1;
+ goto error;
}
if (reply != ACK) {
dprintk(verbose, DST_INFO, 1, "write not acknowledged 0x%02x ", reply);
- return -1;
+ goto error;
}
if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
- return 0;
+ goto error;
if (state->type_flags & DST_TYPE_HAS_FW_1)
udelay(3000);
else
udelay(2000);
if (!dst_wait_dst_ready(state, NO_DELAY))
- return -1;
+ goto error;
if (read_dst(state, state->rxbuffer, FIXED_COMM)) {
dprintk(verbose, DST_DEBUG, 1, "Trying to recover.. ");
if ((dst_error_recovery(state)) < 0) {
dprintk(verbose, DST_INFO, 1, "Recovery failed.");
- return -1;
+ goto error;
}
- return -1;
+ goto error;
}
if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {
dprintk(verbose, DST_INFO, 1, "checksum failure");
- return -1;
+ goto error;
}
-
+ up(&state->dst_mutex);
return 0;
+
+error:
+ up(&state->dst_mutex);
+ return -EIO;
+
}
EXPORT_SYMBOL(dst_command);
--- linux-2.6.14-git3.orig/drivers/media/dvb/bt8xx/dst_ca.c
+++ linux-2.6.14-git3/drivers/media/dvb/bt8xx/dst_ca.c
@@ -81,36 +81,41 @@
{
u8 reply;
+ down(&state->dst_mutex);
dst_comm_init(state);
msleep(65);
if (write_dst(state, data, len)) {
dprintk(verbose, DST_CA_INFO, 1, " Write not successful, trying to recover");
dst_error_recovery(state);
- return -1;
+ goto error;
}
if ((dst_pio_disable(state)) < 0) {
dprintk(verbose, DST_CA_ERROR, 1, " DST PIO disable failed.");
- return -1;
+ goto error;
}
if (read_dst(state, &reply, GET_ACK) < 0) {
dprintk(verbose, DST_CA_INFO, 1, " Read not successful, trying to recover");
dst_error_recovery(state);
- return -1;
+ goto error;
}
if (read) {
if (! dst_wait_dst_ready(state, LONG_DELAY)) {
dprintk(verbose, DST_CA_NOTICE, 1, " 8820 not ready");
- return -1;
+ goto error;
}
if (read_dst(state, ca_string, 128) < 0) { /* Try to make this dynamic */
dprintk(verbose, DST_CA_INFO, 1, " Read not successful, trying to recover");
dst_error_recovery(state);
- return -1;
+ goto error;
}
}
-
+ up(&state->dst_mutex);
return 0;
+
+error:
+ up(&state->dst_mutex);
+ return -EIO;
}
--- linux-2.6.14-git3.orig/drivers/media/dvb/bt8xx/dst_common.h
+++ linux-2.6.14-git3/drivers/media/dvb/bt8xx/dst_common.h
@@ -22,6 +22,7 @@
#ifndef DST_COMMON_H
#define DST_COMMON_H
+#include <linux/smp_lock.h>
#include <linux/dvb/frontend.h>
#include <linux/device.h>
#include "bt878.h"
@@ -119,6 +120,8 @@
u8 card_info[8];
u8 vendor[8];
u8 board_info[8];
+
+ struct semaphore dst_mutex;
};
struct dst_types {
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 24/37] dvb: dst: protect the read/write commands with a mutex
2005-11-01 8:15 [PATCH 24/37] dvb: dst: protect the read/write commands with a mutex Michael Krufky
@ 2005-11-03 2:57 ` Andrew Morton
2005-11-03 9:26 ` Manu Abraham
0 siblings, 1 reply; 3+ messages in thread
From: Andrew Morton @ 2005-11-03 2:57 UTC (permalink / raw)
To: Michael Krufky; +Cc: linux-kernel, linux-dvb-maintainer, Manu Abraham
Michael Krufky <mkrufky@m1k.net> wrote:
>
> + sema_init(&state->dst_mutex, 1);
We normally use init_MUTEX(), so we don't have to remember that 1 == unlocked.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 24/37] dvb: dst: protect the read/write commands with a mutex
2005-11-03 2:57 ` Andrew Morton
@ 2005-11-03 9:26 ` Manu Abraham
0 siblings, 0 replies; 3+ messages in thread
From: Manu Abraham @ 2005-11-03 9:26 UTC (permalink / raw)
To: Andrew Morton
Cc: Michael Krufky, linux-kernel, linux-dvb-maintainer, Manu Abraham
Andrew Morton wrote:
>Michael Krufky <mkrufky@m1k.net> wrote:
>
>
>>+ sema_init(&state->dst_mutex, 1);
>>
>>
>
>We normally use init_MUTEX(), so we don't have to remember that 1 == unlocked.
>
>
>
Hello Andrew,
I will have that changed in dvb-kernel CVS. Would you like me to send in
a patch for the same. Or you can have it changed .. ?
Thanks,
Manu
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-11-03 9:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-01 8:15 [PATCH 24/37] dvb: dst: protect the read/write commands with a mutex Michael Krufky
2005-11-03 2:57 ` Andrew Morton
2005-11-03 9:26 ` Manu Abraham
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox