}
}
-irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
{
int id0=0, id1=0, id2=0, id3=0;
if (irq_register == 0x01) {
DEBUGMSG("Status register: 0x%x\n",can_read_reg(chip, iSTAT));
- return IRQ_NONE;
+ return CAN_IRQ_NONE;
}
if (irq_register == 0x02)
obj=chip->msgobj[object];
if (canobj_read_reg(chip,obj,iMSGCFG) & MCFG_DIR) {
- set_bit(OBJ_TX_REQUEST,&obj->flags);
- while(!test_and_set_bit(OBJ_TX_LOCK,&obj->flags)){
- clear_bit(OBJ_TX_REQUEST,&obj->flags);
+ can_msgobj_set_fl(obj,TX_REQUEST);
+ while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+ can_msgobj_clear_fl(obj,TX_REQUEST);
if(canobj_read_reg(chip,obj,iMSGCTL1)&TXRQ_RES)
i82527_irq_write_handler(chip, obj);
- clear_bit(OBJ_TX_LOCK,&obj->flags);
- if(!test_bit(OBJ_TX_REQUEST,&obj->flags)) break;
+ can_msgobj_clear_fl(obj,TX_LOCK);
+ if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
}
}
else {
message_id=(id0|id1)>>5;
}
- spin_lock(&hardware_p->rtr_lock);
+ can_spin_lock(&hardware_p->rtr_lock);
rtr_search=hardware_p->rtr_queue;
while (rtr_search != NULL) {
if (rtr_search->id == message_id)
break;
rtr_search=rtr_search->next;
}
- spin_unlock(&hardware_p->rtr_lock);
+ can_spin_unlock(&hardware_p->rtr_lock);
if ((rtr_search!=NULL) && (rtr_search->id==message_id))
i82527_irq_rtr_handler(chip, obj, rtr_search, message_id);
else
irq_register=i82527_seg_read_reg(chip, iIRQ);
}
- return IRQ_HANDLED;
+ return CAN_IRQ_HANDLED;
}
void i82527_irq_rtr_handler(struct chip_t *chip, struct msgobj_t *obj,
canobj_write_reg(chip,obj,(MVAL_RES|TXIE_RES|RXIE_RES|INTPD_RES),iMSGCTL0);
canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_RES|MLST_RES|NEWD_RES),iMSGCTL1);
- spin_lock(&hardware_p->rtr_lock);
+ can_spin_lock(&hardware_p->rtr_lock);
rtr_search->rtr_message->id=message_id;
rtr_search->rtr_message->length=(canobj_read_reg(chip,obj,iMSGCFG) & 0xf0)>>4;
for (i=0; i<rtr_search->rtr_message->length; i++)
rtr_search->rtr_message->data[i]=canobj_read_reg(chip,obj,iMSGDAT0+i);
- spin_unlock(&hardware_p->rtr_lock);
+ can_spin_unlock(&hardware_p->rtr_lock);
if (waitqueue_active(&rtr_search->rtr_wq))
wake_up(&rtr_search->rtr_wq);
int i82527_wakeup_tx(struct chip_t *chip, struct msgobj_t *obj)
{
- /* dummy lock to prevent preemption fully portable way */
- spinlock_t dummy_lock;
+ can_preempt_disable();
- /* preempt_disable() */
- spin_lock_init(&dummy_lock);
- spin_lock(&dummy_lock);
-
- set_bit(OBJ_TX_REQUEST,&obj->flags);
- while(!test_and_set_bit(OBJ_TX_LOCK,&obj->flags)){
- clear_bit(OBJ_TX_REQUEST,&obj->flags);
+ can_msgobj_set_fl(obj,TX_REQUEST);
+ while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+ can_msgobj_clear_fl(obj,TX_REQUEST);
if(canobj_read_reg(chip,obj,iMSGCTL1)&TXRQ_RES)
i82527_irq_write_handler(chip, obj);
- clear_bit(OBJ_TX_LOCK,&obj->flags);
- if(!test_bit(OBJ_TX_REQUEST,&obj->flags)) break;
+ can_msgobj_clear_fl(obj,TX_LOCK);
+ if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
}
- /* preempt_enable(); */
- spin_unlock(&dummy_lock);
+ can_preempt_enable();
return 0;
}