static irqreturn_t r_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { unsigned long flags; unsigned char data[PACKET_DATA_LENGTH_WITH_SIZE]; int data_length; local_irq_save(flags); data_length = _receive_packet(data); local_irq_restore(flags); if(data_length == -RF_ERR_TOUT) return IRQ_HANDLED; if(data_length == -RF_ERR_CRC_ERROR) { printk(KERN_NOTICE DEV_NAME ": CRC error\n"); return IRQ_HANDLED; } if(data_length > PACKET_DATA_LENGTH_WITH_SIZE) { printk(KERN_NOTICE DEV_NAME ": wrong data length in incoming packet (%d), packet dropped\n", data_length); return IRQ_HANDLED; } spin_lock(&buffer_lock); _add_received_packet_to_buffer(data); spin_unlock(&buffer_lock); return IRQ_HANDLED; }
unsigned char handle_interrupt() { unsigned char bytes_received = _receive_packet(); rfm12_DisableRx(); rfm12_DisableFifo(); // Process the packet, but only if the application has dealt with the // last packet. If not, it will be silently dropped.. if (!data_arrived) { _process_packet(bytes_received); } rfm12_EnableFifo(); rfm12_EnableRx(); return 1; }