#include <rtl_malloc.h>
+can_spinlock_t can_irq_manipulation_lock;
+
unsigned int can_rtl_isr( unsigned int irq_num, struct pt_regs *r )
{
struct chip_t *chip;
struct candevice_t *candev;
int board_nr;
int chip_nr;
+ int irq2linux=0;
pthread_t thread=NULL;
DEBUGMSG("can_rtl_isr invoked for irq %d\n",irq_num);
set_bit(MSGOBJ_IRQ_REQUEST_b,&chip->pend_flags);
set_bit(MSGOBJ_WORKER_WAKE_b,&chip->pend_flags);
-
+ if(chip->flags & CHIP_IRQ_PCI)
+ irq2linux=1;
if(!chip->worker_thread) continue;
thread=chip->worker_thread;
pthread_kill(thread,RTL_SIGNAL_WAKEUP);
}
}
- /*rtl_global_pend_irq(irq_num);*/
+ if(irq2linux)
+ rtl_global_pend_irq(irq_num);
/*if(thread) rtl_reschedule_thread(thread);*/
for(i=0;i<chip->max_objects;i++){
if((obj=chip->msgobj[i])==NULL)
continue;
- if(!can_msgobj_test_and_clear_fl(obj,TX_REQUEST))
- continue;
- DEBUGMSG("Calling wakeup_tx\n");
- chip->chipspecops->wakeup_tx(chip, obj);
+ if(can_msgobj_test_fl(obj,TX_REQUEST)) {
+ DEBUGMSG("Calling wakeup_tx\n");
+ chip->chipspecops->wakeup_tx(chip, obj);
+ }
+ if(can_msgobj_test_fl(obj,FILTCH_REQUEST)) {
+ DEBUGMSG("Calling filtch_rq\n");
+ if(chip->chipspecops->filtch_rq)
+ chip->chipspecops->filtch_rq(chip, obj);
+ }
}
continue;
}
int can_chip_setup_irq(struct chip_t *chip)
{
int ret;
+ struct sched_param sched_param;
+ pthread_attr_t attrib;
+ pthread_attr_t *attrib_p=NULL;
if(chip==NULL)
return -1;
+
+ if(can_rtl_priority>=0){
+ pthread_attr_init(&attrib);
+ sched_param.sched_priority = can_rtl_priority;
+ pthread_attr_setschedparam(&attrib, &sched_param);
+ /* pthread_attr_setschedpolicy(&attrib, SCHED_FIFO); */
+ attrib_p=&attrib;
+ }
+
if(chip->chipspecops->irq_handler){
if (rtl_request_irq(chip->chip_irq,can_rtl_isr))
return -1;
chip->flags |= CHIP_IRQ_SETUP;
}
}
- ret=pthread_create(&chip->worker_thread, NULL, can_chip_worker_thread, chip);
+ ret=pthread_create(&chip->worker_thread, attrib_p, can_chip_worker_thread, chip);
if(ret<0) chip->worker_thread=NULL;
return ret;