unsigned long cur_frame_length; \r
wait_queue_head_t data_ready_wq;\r
atomic_t data_ready;\r
+ spinlock_t data_lock; \r
\r
int tx_empty; /* last TX empty bit */\r
\r
if (!IS_FIR(s))\r
tty_flip_buffer_push(s->port.state->port.tty);\r
else\r
+ spin_lock(&s->data_lock);\r
s->cur_frame_length += len;\r
+ spin_unlock(&s->data_lock);\r
}\r
\r
if ((irq_src & REG_INT_EOF) && (s->port.state->port.tty != NULL)) {\r
tty_flip_buffer_push(s->port.state->port.tty);\r
if (IS_FIR(s)) {\r
- s->last_frame_length = s->cur_frame_length;\r
+ spin_lock(&s->data_lock);\r
+ s->last_frame_length += s->cur_frame_length;\r
s->cur_frame_length = 0;\r
atomic_set(&(s->data_ready), 1);\r
wake_up(&(s->data_ready_wq) );\r
+ spin_unlock(&s->data_lock);\r
}\r
}\r
\r
destroy_workqueue(s->workqueue);\r
s->workqueue = NULL;\r
}\r
- \r
+\r
+ spin_lock(&s->data_lock);\r
atomic_set(&(s->data_ready), 0);\r
s->last_frame_length = 0;\r
s->cur_frame_length = 0;\r
+ spin_unlock(&s->data_lock);\r
\r
if (s->irq)\r
free_irq(s->irq, s);\r
\r
s->baud = 9600;\r
s->rx_enabled = 1;\r
+ \r
+ spin_lock(&s->data_lock);\r
s->last_frame_length = 0;\r
s->cur_frame_length = 0;\r
+ spin_unlock(&s->data_lock);\r
\r
if (s->suspending)\r
return 0;\r
return -1;\r
}\r
\r
+ spin_lock(&s->data_lock);\r
len = s->last_frame_length;\r
s->last_frame_length = 0;\r
- \r
atomic_set(&(s->data_ready), 0);\r
+ spin_unlock(&s->data_lock);\r
\r
return len;\r
}\r
\r
init_waitqueue_head(&(bu92747s[i]->data_ready_wq));\r
\r
+ spin_lock_init(&(bu92747s[i]->data_lock));\r
+\r
mutex_unlock(&bu92747s_lock);\r
\r
return 0;\r