Changeset a8595605 in rtems
- Timestamp:
- 03/06/17 12:08:04 (7 years ago)
- Branches:
- 5, master
- Children:
- 21b3319f
- Parents:
- c609ccea
- git-author:
- Martin Aberg <maberg@…> (03/06/17 12:08:04)
- git-committer:
- Daniel Hellstrom <daniel@…> (05/02/17 10:34:48)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/lib/libbsp/sparc/shared/can/occan.c
rc609ccea ra8595605 9 9 */ 10 10 11 #include <rtems.h> 11 12 #include <rtems/libio.h> 12 13 #include <stdlib.h> … … 70 71 #define DBG(fmt, vargs...) 71 72 #endif 73 74 /* Spin locks mapped via rtems_interrupt_lock_* API: */ 75 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 76 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 77 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 78 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 79 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 80 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 81 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 82 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 72 83 73 84 /* fifo interface */ … … 204 215 struct drvmgr_dev *dev; 205 216 char devName[32]; 217 SPIN_DECLARE(devlock); 206 218 207 219 /* hardware shortcuts */ … … 1166 1178 } 1167 1179 1168 static rtems_device_driver occan_open(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ 1180 static rtems_device_driver occan_open(rtems_device_major_number major, rtems_device_minor_number minor, void *arg) 1181 { 1169 1182 occan_priv *can; 1170 1183 struct drvmgr_dev *dev; … … 1180 1193 1181 1194 /* already opened? */ 1182 rtems_semaphore_obtain(can->devsem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);1195 rtems_semaphore_obtain(can->devsem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 1183 1196 if ( can->open ){ 1184 1197 rtems_semaphore_release(can->devsem); … … 1187 1200 can->open = 1; 1188 1201 rtems_semaphore_release(can->devsem); 1202 1203 SPIN_INIT(&can->devlock, can->devName); 1189 1204 1190 1205 /* allocate fifos */ … … 1254 1269 } 1255 1270 1256 static rtems_device_driver occan_read(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ 1271 static rtems_device_driver occan_read(rtems_device_major_number major, rtems_device_minor_number minor, void *arg) 1272 { 1257 1273 occan_priv *can; 1258 1274 struct drvmgr_dev *dev; 1259 1275 rtems_libio_rw_args_t *rw_args=(rtems_libio_rw_args_t *) arg; 1260 1276 CANMsg *dstmsg, *srcmsg; 1261 rtems_interrupt_level oldLevel;1277 SPIN_IRQFLAGS(oldLevel); 1262 1278 int left; 1263 1279 … … 1289 1305 1290 1306 /* turn off interrupts */ 1291 rtems_interrupt_disable(oldLevel);1307 SPIN_LOCK_IRQ(&can->devlock, oldLevel); 1292 1308 1293 1309 /* A bus off interrupt may have occured after checking can->started */ 1294 1310 if ( can->status & (OCCAN_STATUS_ERR_BUSOFF|OCCAN_STATUS_RESET) ){ 1295 rtems_interrupt_enable(oldLevel);1311 SPIN_UNLOCK_IRQ(&can->devlock, oldLevel); 1296 1312 DBG("OCCAN: read is cancelled due to a BUS OFF error\n\r"); 1297 1313 rw_args->bytes_moved = rw_args->count-left; … … 1308 1324 if ( !can->rxblk || (left != rw_args->count) ){ 1309 1325 /* turn on interrupts again */ 1310 rtems_interrupt_enable(oldLevel);1326 SPIN_UNLOCK_IRQ(&can->devlock, oldLevel); 1311 1327 break; 1312 1328 } 1313 1329 1314 1330 /* turn on interrupts again */ 1315 rtems_interrupt_enable(oldLevel);1331 SPIN_UNLOCK_IRQ(&can->devlock, oldLevel); 1316 1332 1317 1333 DBG("OCCAN: Waiting for RX int\n\r"); … … 1340 1356 1341 1357 /* turn on interrupts again */ 1342 rtems_interrupt_enable(oldLevel);1358 SPIN_UNLOCK_IRQ(&can->devlock, oldLevel); 1343 1359 1344 1360 /* increase pointers */ … … 1356 1372 } 1357 1373 1358 static rtems_device_driver occan_write(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ 1374 static rtems_device_driver occan_write(rtems_device_major_number major, rtems_device_minor_number minor, void *arg) 1375 { 1359 1376 occan_priv *can; 1360 1377 struct drvmgr_dev *dev; 1361 1378 rtems_libio_rw_args_t *rw_args=(rtems_libio_rw_args_t *) arg; 1362 1379 CANMsg *msg,*fifo_msg; 1363 rtems_interrupt_level oldLevel;1380 SPIN_IRQFLAGS(oldLevel); 1364 1381 int left; 1365 1382 … … 1390 1407 1391 1408 /* turn off interrupts */ 1392 rtems_interrupt_disable(oldLevel);1409 SPIN_LOCK_IRQ(&can->devlock, oldLevel); 1393 1410 1394 1411 /* A bus off interrupt may have occured after checking can->started */ 1395 1412 if ( can->status & (OCCAN_STATUS_ERR_BUSOFF|OCCAN_STATUS_RESET) ){ 1396 rtems_interrupt_enable(oldLevel);1413 SPIN_UNLOCK_IRQ(&can->devlock, oldLevel); 1397 1414 rw_args->bytes_moved = 0; 1398 1415 return RTEMS_IO_ERROR; /* EIO */ … … 1446 1463 CHECK_IF_FIFO_EMPTY ==> SEND DIRECT VIA HW; 1447 1464 */ 1448 rtems_interrupt_enable(oldLevel);1465 SPIN_UNLOCK_IRQ(&can->devlock, oldLevel); 1449 1466 1450 1467 DBG("OCCAN: Waiting for tx int\n\r"); … … 1460 1477 } 1461 1478 1462 rtems_interrupt_disable(oldLevel);1479 SPIN_LOCK_IRQ(&can->devlock, oldLevel); 1463 1480 1464 1481 if ( occan_fifo_empty(can->txfifo) ){ … … 1497 1514 } 1498 1515 1499 rtems_interrupt_enable(oldLevel);1516 SPIN_UNLOCK_IRQ(&can->devlock, oldLevel); 1500 1517 1501 1518 rw_args->bytes_moved = rw_args->count-left; … … 1507 1524 } 1508 1525 1509 static rtems_device_driver occan_ioctl(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ 1526 static rtems_device_driver occan_ioctl(rtems_device_major_number major, rtems_device_minor_number minor, void *arg) 1527 { 1510 1528 int ret; 1511 1529 occan_speed_regs timing; … … 1705 1723 unsigned char tmp, errcode, arbcode; 1706 1724 int tx_error_cnt,rx_error_cnt; 1725 SPIN_ISR_IRQFLAGS(irqflags); 1707 1726 1708 1727 if ( !can->started ) 1709 1728 return; /* Spurious Interrupt, do nothing */ 1710 1729 1730 SPIN_LOCK(&can->devlock, irqflags); 1711 1731 while (1) { 1712 1732 … … 1943 1963 } 1944 1964 } 1965 SPIN_UNLOCK(&can->devlock, irqflags); 1945 1966 1946 1967 /* signal Binary semaphore, messages available! */
Note: See TracChangeset
for help on using the changeset viewer.