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);*/
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;