summaryrefslogtreecommitdiff
path: root/components/drivers/can
diff options
context:
space:
mode:
authorAubr.Cool <[email protected]>2015-07-07 08:36:47 +0800
committerAubr.Cool <[email protected]>2015-07-07 11:50:39 +0800
commit0f20bf12fda09cceda71eb7005539726516acf78 (patch)
treeb94b43e21a617307d0847586998ff6b08045baf7 /components/drivers/can
parent7de47e029b49df3c8e85b19f6c2152d617354d95 (diff)
[DeviceDriver]correct can critical problems
Diffstat (limited to 'components/drivers/can')
-rw-r--r--components/drivers/can/can.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/components/drivers/can/can.c b/components/drivers/can/can.c
index 0ed971053d..a0e5178107 100644
--- a/components/drivers/can/can.c
+++ b/components/drivers/can/can.c
@@ -189,6 +189,7 @@ rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *da
rt_list_remove(&tx_tosnd->list);
}
rt_list_insert_before(&tx_fifo->freelist, &tx_tosnd->list);
+ rt_completion_done(&(tx_fifo->completion));
rt_hw_interrupt_enable(level);
if (result == RT_CAN_SND_RESULT_OK)
@@ -208,13 +209,6 @@ rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *da
rt_hw_interrupt_enable(level);
break;
}
-
- level = rt_hw_interrupt_disable();
- if (rt_list_isempty(&tx_fifo->freelist))
- {
- rt_completion_done(&(tx_fifo->completion));
- }
- rt_hw_interrupt_enable(level);
}
return (size - msgs);
@@ -541,12 +535,12 @@ static rt_err_t rt_can_control(struct rt_device *dev,
{
rt_completion_done(&(tx_fifo->completion));
- level = rt_hw_interrupt_disable();
for (i = 0; i < can->config.sndboxnumber; i++)
{
+ level = rt_hw_interrupt_disable();
rt_list_remove(&tx_fifo->buffer[i].list);
+ rt_hw_interrupt_enable(level);
}
- rt_hw_interrupt_enable(level);
}
else
{
@@ -600,8 +594,10 @@ static rt_err_t rt_can_control(struct rt_device *dev,
level = rt_hw_interrupt_disable();
if (!can->hdr[pitem->hdr].connected)
{
+ rt_hw_interrupt_enable(level);
rt_memcpy(&can->hdr[pitem->hdr].filter, pitem,
sizeof(struct rt_can_filter_item));
+ level = rt_hw_interrupt_disable();
can->hdr[pitem->hdr].connected = 1;
can->hdr[pitem->hdr].msgs = 0;
rt_list_init(&can->hdr[pitem->hdr].list);
@@ -626,16 +622,20 @@ static rt_err_t rt_can_control(struct rt_device *dev,
if (can->hdr[pitem->hdr].connected)
{
- rt_memset(&can->hdr[pitem->hdr].filter, 0,
- sizeof(struct rt_can_filter_item));
can->hdr[pitem->hdr].connected = 0;
can->hdr[pitem->hdr].msgs = 0;
if (!rt_list_isempty(&can->hdr[pitem->hdr].list))
{
rt_list_remove(can->hdr[pitem->hdr].list.next);
}
+ rt_hw_interrupt_enable(level);
+ rt_memset(&can->hdr[pitem->hdr].filter, 0,
+ sizeof(struct rt_can_filter_item));
}
- rt_hw_interrupt_enable(level);
+ else
+ {
+ rt_hw_interrupt_enable(level);
+ }
count--;
pitem++;
}