V4L/DVB (7956): cinergyT2: endianness annotations, endianness and race fixes
Endianness annotations and fixes + fixing the handling of ->uncorrected_block_count Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
39028ec69b
commit
f34ec12a17
@ -82,22 +82,22 @@ enum cinergyt2_ep1_cmd {
|
|||||||
|
|
||||||
struct dvbt_set_parameters_msg {
|
struct dvbt_set_parameters_msg {
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
uint32_t freq;
|
__le32 freq;
|
||||||
uint8_t bandwidth;
|
uint8_t bandwidth;
|
||||||
uint16_t tps;
|
__le16 tps;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct dvbt_get_status_msg {
|
struct dvbt_get_status_msg {
|
||||||
uint32_t freq;
|
__le32 freq;
|
||||||
uint8_t bandwidth;
|
uint8_t bandwidth;
|
||||||
uint16_t tps;
|
__le16 tps;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
uint16_t gain;
|
__le16 gain;
|
||||||
uint8_t snr;
|
uint8_t snr;
|
||||||
uint32_t viterbi_error_rate;
|
__le32 viterbi_error_rate;
|
||||||
uint32_t rs_error_rate;
|
__le32 rs_error_rate;
|
||||||
uint32_t uncorrected_block_count;
|
__le32 uncorrected_block_count;
|
||||||
uint8_t lock_bits;
|
uint8_t lock_bits;
|
||||||
uint8_t prev_lock_bits;
|
uint8_t prev_lock_bits;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
@ -136,6 +136,7 @@ struct cinergyt2 {
|
|||||||
wait_queue_head_t poll_wq;
|
wait_queue_head_t poll_wq;
|
||||||
int pending_fe_events;
|
int pending_fe_events;
|
||||||
int disconnect_pending;
|
int disconnect_pending;
|
||||||
|
unsigned int uncorrected_block_count;
|
||||||
atomic_t inuse;
|
atomic_t inuse;
|
||||||
|
|
||||||
void *streambuf;
|
void *streambuf;
|
||||||
@ -147,7 +148,7 @@ struct cinergyt2 {
|
|||||||
char phys[64];
|
char phys[64];
|
||||||
struct delayed_work rc_query_work;
|
struct delayed_work rc_query_work;
|
||||||
int rc_input_event;
|
int rc_input_event;
|
||||||
u32 rc_last_code;
|
__le32 rc_last_code;
|
||||||
unsigned long last_event_jiffies;
|
unsigned long last_event_jiffies;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@ -160,7 +161,7 @@ enum {
|
|||||||
|
|
||||||
struct cinergyt2_rc_event {
|
struct cinergyt2_rc_event {
|
||||||
char type;
|
char type;
|
||||||
uint32_t value;
|
__le32 value;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
static const uint32_t rc_keys[] = {
|
static const uint32_t rc_keys[] = {
|
||||||
@ -619,8 +620,11 @@ static int cinergyt2_ioctl (struct inode *inode, struct file *file,
|
|||||||
{
|
{
|
||||||
uint32_t unc_count;
|
uint32_t unc_count;
|
||||||
|
|
||||||
unc_count = stat->uncorrected_block_count;
|
if (mutex_lock_interruptible(&cinergyt2->sem))
|
||||||
stat->uncorrected_block_count = 0;
|
return -ERESTARTSYS;
|
||||||
|
unc_count = cinergyt2->uncorrected_block_count;
|
||||||
|
cinergyt2->uncorrected_block_count = 0;
|
||||||
|
mutex_unlock(&cinergyt2->sem);
|
||||||
|
|
||||||
/* UNC are already converted to host byte order... */
|
/* UNC are already converted to host byte order... */
|
||||||
return put_user(unc_count,(__u32 __user *) arg);
|
return put_user(unc_count,(__u32 __user *) arg);
|
||||||
@ -769,7 +773,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
|
|||||||
input_sync(cinergyt2->rc_input_dev);
|
input_sync(cinergyt2->rc_input_dev);
|
||||||
cinergyt2->rc_input_event = KEY_MAX;
|
cinergyt2->rc_input_event = KEY_MAX;
|
||||||
}
|
}
|
||||||
cinergyt2->rc_last_code = ~0;
|
cinergyt2->rc_last_code = cpu_to_le32(~0);
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -780,7 +784,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
|
|||||||
n, le32_to_cpu(rc_events[n].value), rc_events[n].type);
|
n, le32_to_cpu(rc_events[n].value), rc_events[n].type);
|
||||||
|
|
||||||
if (rc_events[n].type == CINERGYT2_RC_EVENT_TYPE_NEC &&
|
if (rc_events[n].type == CINERGYT2_RC_EVENT_TYPE_NEC &&
|
||||||
rc_events[n].value == ~0) {
|
rc_events[n].value == cpu_to_le32(~0)) {
|
||||||
/* keyrepeat bit -> just repeat last rc_input_event */
|
/* keyrepeat bit -> just repeat last rc_input_event */
|
||||||
} else {
|
} else {
|
||||||
cinergyt2->rc_input_event = KEY_MAX;
|
cinergyt2->rc_input_event = KEY_MAX;
|
||||||
@ -795,7 +799,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
|
|||||||
|
|
||||||
if (cinergyt2->rc_input_event != KEY_MAX) {
|
if (cinergyt2->rc_input_event != KEY_MAX) {
|
||||||
if (rc_events[n].value == cinergyt2->rc_last_code &&
|
if (rc_events[n].value == cinergyt2->rc_last_code &&
|
||||||
cinergyt2->rc_last_code != ~0) {
|
cinergyt2->rc_last_code != cpu_to_le32(~0)) {
|
||||||
/* emit a key-up so the double event is recognized */
|
/* emit a key-up so the double event is recognized */
|
||||||
dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event);
|
dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event);
|
||||||
input_report_key(cinergyt2->rc_input_dev,
|
input_report_key(cinergyt2->rc_input_dev,
|
||||||
@ -829,7 +833,7 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
|
|||||||
usb_make_path(cinergyt2->udev, cinergyt2->phys, sizeof(cinergyt2->phys));
|
usb_make_path(cinergyt2->udev, cinergyt2->phys, sizeof(cinergyt2->phys));
|
||||||
strlcat(cinergyt2->phys, "/input0", sizeof(cinergyt2->phys));
|
strlcat(cinergyt2->phys, "/input0", sizeof(cinergyt2->phys));
|
||||||
cinergyt2->rc_input_event = KEY_MAX;
|
cinergyt2->rc_input_event = KEY_MAX;
|
||||||
cinergyt2->rc_last_code = ~0;
|
cinergyt2->rc_last_code = cpu_to_le32(~0);
|
||||||
INIT_DELAYED_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc);
|
INIT_DELAYED_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc);
|
||||||
|
|
||||||
input_dev->name = DRIVER_NAME " remote control";
|
input_dev->name = DRIVER_NAME " remote control";
|
||||||
@ -840,8 +844,8 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
|
|||||||
input_dev->keycodesize = 0;
|
input_dev->keycodesize = 0;
|
||||||
input_dev->keycodemax = 0;
|
input_dev->keycodemax = 0;
|
||||||
input_dev->id.bustype = BUS_USB;
|
input_dev->id.bustype = BUS_USB;
|
||||||
input_dev->id.vendor = cinergyt2->udev->descriptor.idVendor;
|
input_dev->id.vendor = le16_to_cpu(cinergyt2->udev->descriptor.idVendor);
|
||||||
input_dev->id.product = cinergyt2->udev->descriptor.idProduct;
|
input_dev->id.product = le16_to_cpu(cinergyt2->udev->descriptor.idProduct);
|
||||||
input_dev->id.version = 1;
|
input_dev->id.version = 1;
|
||||||
input_dev->dev.parent = &cinergyt2->udev->dev;
|
input_dev->dev.parent = &cinergyt2->udev->dev;
|
||||||
|
|
||||||
@ -889,18 +893,16 @@ static void cinergyt2_query (struct work_struct *work)
|
|||||||
char cmd [] = { CINERGYT2_EP1_GET_TUNER_STATUS };
|
char cmd [] = { CINERGYT2_EP1_GET_TUNER_STATUS };
|
||||||
struct dvbt_get_status_msg *s = &cinergyt2->status;
|
struct dvbt_get_status_msg *s = &cinergyt2->status;
|
||||||
uint8_t lock_bits;
|
uint8_t lock_bits;
|
||||||
uint32_t unc;
|
|
||||||
|
|
||||||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
|
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unc = s->uncorrected_block_count;
|
|
||||||
lock_bits = s->lock_bits;
|
lock_bits = s->lock_bits;
|
||||||
|
|
||||||
cinergyt2_command(cinergyt2, cmd, sizeof(cmd), (char *) s, sizeof(*s));
|
cinergyt2_command(cinergyt2, cmd, sizeof(cmd), (char *) s, sizeof(*s));
|
||||||
|
|
||||||
unc += le32_to_cpu(s->uncorrected_block_count);
|
cinergyt2->uncorrected_block_count +=
|
||||||
s->uncorrected_block_count = unc;
|
le32_to_cpu(s->uncorrected_block_count);
|
||||||
|
|
||||||
if (lock_bits != s->lock_bits) {
|
if (lock_bits != s->lock_bits) {
|
||||||
wake_up_interruptible(&cinergyt2->poll_wq);
|
wake_up_interruptible(&cinergyt2->poll_wq);
|
||||||
|
Loading…
Reference in New Issue
Block a user