if ((*dma & 0x0f00)!=devpriv->chanlist[j]) { // data dropout!
rt_printk("comedi: A/D DMA - data dropout: received channel %d, expected %d!\n",(*dma & 0x0f00)>>8,devpriv->chanlist[j]>>8);
pci9118_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
return;
}
#endif
m=0;
devpriv->ai1234_act_scan++;
if (devpriv->ai1234_flags & TRIG_WAKE_EOS)
- comedi_eos(dev,s);
+ s->async->events |= COMEDI_CB_EOS;
}
}
}
if(m>=devpriv->ai1234_n_scanlen) {
m=0;
devpriv->ai1234_act_scan++;
- if (devpriv->ai1234_flags & TRIG_WAKE_EOS)
- comedi_eos(dev,s);
+ s->async->events |= COMEDI_CB_EOS;
}
}
}
if (samplesinbuf & 1) {
comedi_error(dev,"Odd count of bytes in DMA ring!");
pci9118_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
comedi_error(dev,"A/D Overrun Status (Fatal Error!)");
if (m & 0x10a) {
pci9118_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
}
samplesinbuf-=m;
s->async->buf_int_ptr=0;
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
if (samplesinbuf) {
s->async->buf_int_count+=samplesinbuf*sizeof(sampl_t);
s->async->buf_int_ptr+=samplesinbuf*sizeof(sampl_t);
if (!(devpriv->ai1234_flags & TRIG_WAKE_EOS)) {
- comedi_bufcheck(dev,s);
+ s->async->events |= COMEDI_CB_EOS;
}
}
if (!devpriv->neverending_ai)
if ( devpriv->ai1234_act_scan>=devpriv->ai1234_scans ) { /* all data sampled */
pci9118_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
return;
}
outl(devpriv->dmabuf_hw[0], devpriv->iobase_a+AMCC_OP_REG_MWAR);
outl(devpriv->dmabuf_use_size[0], devpriv->iobase_a+AMCC_OP_REG_MWTC);
}
+
+ comedi_event(dev,s,s->async->events);
}
/*
if (m & Status_FE) {
rt_printk("comedi%d: A/D FIFO empty (%4x)\n", dev->minor, m);
pci171x_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
if (m & Status_FF) {
rt_printk("comedi%d: A/D FIFO Full status (Fatal Error!) (%4x)\n", dev->minor, m);
pci171x_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
if ((sampl & 0xf000)!=devpriv->act_chanlist[s->async->cur_chan]) {
rt_printk("comedi: A/D data dropout: received data from channel %d, expected %d!\n",(sampl & 0xf000)>>12,(devpriv->act_chanlist[s->async->cur_chan] & 0xf000)>>12);
pci171x_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
*(sampl_t *)((void *)(devpriv->ai_data)+s->async->buf_int_ptr)=sampl & 0x0fff;
if (s->async->buf_int_ptr>=devpriv->ai_data_len) { // buffer rollover
s->async->buf_int_ptr = 0;
DPRINTK("adv_pci1710 EDBG: EOBUF1 bic %d bip %d buc %d bup %d\n",s->async->buf_int_count,s->async->buf_int_ptr, s->async->buf_user_count, s->async->buf_user_ptr);
- comedi_eobuf(dev, s);
+ s->async->events |= COMEDI_CB_BLOCK;
DPRINTK("adv_pci1710 EDBG: EOBUF2\n");
}
s->async->cur_chan=0;
devpriv->ai_act_scan++;
DPRINTK("adv_pci1710 EDBG: EOS1 bic %d bip %d buc %d bup %d\n",s->async->buf_int_count,s->async->buf_int_ptr, s->async->buf_user_count, s->async->buf_user_ptr);
- comedi_eos(dev, s);
+ s->async->events |= COMEDI_CB_EOS;
DPRINTK("adv_pci1710 EDBG: EOS2\n");
if ((!devpriv->neverending_ai)&&(devpriv->ai_act_scan>=devpriv->ai_scans)) { // all data sampled
pci171x_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
return;
}
}
outb(0, dev->iobase + PCI171x_CLRINT); // clear our INT request
DPRINTK("adv_pci1710 EDBG: END: interrupt_pci1710_every_sample(...)\n");
+
+ comedi_event(dev,s,s->async->events);
}
/*
s->async->buf_int_ptr+=i*sizeof(sampl_t);
s->async->cur_chan=j;
pci171x_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return 1;
}
*data=sampl & 0x0fff;
if (!(m & Status_FH)) {
rt_printk("comedi%d: A/D FIFO not half full! (%4x)\n", dev->minor, m);
pci171x_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
if (m & Status_FF) {
rt_printk("comedi%d: A/D FIFO Full status (Fatal Error!) (%4x)\n", dev->minor, m);
pci171x_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
samplesinbuf-=m;
s->async->buf_int_ptr=0;
DPRINTK("adv_pci1710 EDBG: EOBUF1 bic %d bip %d buc %d bup %d\n",s->async->buf_int_count,s->async->buf_int_ptr, s->async->buf_user_count, s->async->buf_user_ptr);
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
DPRINTK("adv_pci1710 EDBG: EOBUF2\n");
}
s->async->buf_int_ptr+=samplesinbuf*sizeof(sampl_t);
DPRINTK("adv_pci1710 EDBG: BUFCHECK1 bic %d bip %d buc %d bup %d\n",s->async->buf_int_count,s->async->buf_int_ptr, s->async->buf_user_count, s->async->buf_user_ptr);
- comedi_bufcheck(dev,s);
+ s->async->events |= COMEDI_CB_BLOCK;
DPRINTK("adv_pci1710 EDBG: BUFCHECK2\n");
}
if (!devpriv->neverending_ai)
if ( devpriv->ai_act_scan>=devpriv->ai_scans ) { /* all data sampled */
pci171x_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
return;
}
outb(0, dev->iobase + PCI171x_CLRINT); // clear our INT request
DPRINTK("adv_pci1710 EDBG: END: interrupt_pci1710_half_fifo(...)\n");
+
+ comedi_event(dev,s,s->async->events);
}
/*
s->async->buf_int_count+=sizeof(sampl_t);
if(s->async->buf_int_ptr>=s->async->data_len){
s->async->buf_int_ptr=0;
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
- comedi_bufcheck(dev,s);
+ comedi_event(dev,s,s->async->events);
}
static int parport_attach(comedi_device *dev,comedi_devconfig *it)
#ifdef DEBUG
printk("das6402: Got %i samples\n\n",devpriv->das6402_wordsread-diff);
#endif
- comedi_done(dev,dev->subdevices+0);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
}
outb(0x01,dev->iobase+8); /* clear only the interrupt flip-flop */
- return;
+ comedi_event(dev,s,s->async->events);
}
#if 0
s->async->buf_int_count+=sizeof(sampl_t);
}
s->async->buf_int_ptr=0;
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
#if 0
if (n>1024) {
if (!(--devpriv->ntrig)) {
/* how to turn off acquisition */
- comedi_done(dev, dev->subdevices + 0);
+ s->async->events |= COMEDI_SB_EOA;
}
+ comedi_event(dev, s, s->async->events);
}
#endif
{
int lo,hi;
comedi_device *dev=d;
+ comedi_subdevice *s = dev->subdevices + 0;
int data;
hi=inb(dev->iobase+DT2814_DATA);
inb(dev->iobase+DT2814_DATA);
restore_flags(flags);
- comedi_done(dev,dev->subdevices);
+ s->async->events |= COMEDI_CB_EOA;
}
+ comedi_event(dev,s,s->async->events);
}
if(!size){
printk("dt282x: AO underrun\n");
dt282x_ao_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
prep_ao_dma(dev,i,size/2);
enable_dma(devpriv->dma[i].chan);
- comedi_bufcheck(dev,s);
+ s->async->events |= COMEDI_CB_BLOCK;
+ comedi_event(dev,s,s->async->events);
return;
}
devpriv->supcsr = 0;
update_supcsr(DT2821_ADCINIT);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
return;
}else{
- comedi_bufcheck(dev,s);
+ s->async->events |= COMEDI_CB_BLOCK;
}
#if 1
enable_dma(devpriv->dma[i].chan);
- return;
+ comedi_event(dev,s,s->async->events);
}
static int prep_ai_dma(comedi_device * dev,int chan,int n)
if (adcsr & DT2821_ADERR) {
comedi_error(dev, "A/D error");
dt282x_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
supcsr = inw(dev->iobase + DT2821_SUPCSR);
#endif
comedi_error(dev, "D/A error");
dt282x_ao_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev,s,s->async->events);
return;
}
if (adcsr & DT2821_ADDONE) {
s->async->buf_int_count+=sizeof(sampl_t);
if(s->async->buf_int_ptr>=s->async->data_len){
s->async->buf_int_ptr = 0;
- //s->events |= COMEDI_EOBUF;
+ s->async->events |= COMEDI_CB_EOBUF;
}
devpriv->nread--;
if(!devpriv->nread){
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
}else{
if(supcsr&DT2821_SCDN)
update_supcsr(DT2821_STRIG);
}
+ comedi_event(dev,s,s->async->events);
return;
}
}
if((++s->async->cur_chan) >= s->async->cmd.chanlist_len) { /* one scan done */
s->async->cur_chan = 0;
- comedi_eos(dev, s);
+ s->async->events |= COMEDI_CB_EOS;
}
if (s->async->buf_int_ptr >= s->async->data_len) { /* buffer rollover */
s->async->buf_int_ptr = 0;
- comedi_eobuf(dev, s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
+ comedi_event(dev, s, s->async->events);
}
static int atmio16d_ai_cmdtest(comedi_device *dev, comedi_subdevice *s, comedi_cmd *cmd)
comedi_subdevice *s=dev->subdevices+0;
- comedi_event(dev,s,COMEDI_CB_BLOCK);
+ s->async->events |= COMEDI_CB_BLOCK;
MDPRINTK("mite_handle_interrupt\n");
writel(CHOR_CLRLC, devpriv->mite->mite_io_addr+MITE_CHOR+CHAN_OFFSET(0));
rt_printk("ni_mio_common: a_status=0xffff. Card removed?\n");
/* we probably aren't even running a command now,
* so it's a good idea to be careful. */
- if(s->subdev_flags&SDF_RUNNING)comedi_done(dev,s);
+ if(s->subdev_flags&SDF_RUNNING){
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
+ }
return;
}
if(status&(AI_Overrun_St|AI_Overflow_St|AI_SC_TC_Error_St)){
AI_FIFO_Interrupt_Enable,0);
ni_ai_reset(dev,dev->subdevices);//added by tim
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev,s,s->async->events);
return;
}
if(status&AI_SC_TC_St){
AI_STOP_Interrupt_Enable| AI_Error_Interrupt_Enable|
AI_FIFO_Interrupt_Enable,0);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
}
#endif // !PCIDMA
ack|=AI_SC_TC_Interrupt_Ack;
rt_printk("Ack! didn't clear AO interrupt. b_status=0x%04x\n",b_status);
win_out(0,Interrupt_B_Enable_Register);
}
+
+ comedi_event(dev,s,s->async->events);
}
#ifdef DEBUG_STATUS_A
static void ni_handle_block_dma(comedi_device *dev)
{
+ comedi_subdevice *s = dev->subdevices + 0;
+
MDPRINTK("ni_handle_block_dma\n");
//mite_dump_regs(devpriv->mite);
mite_dma_disarm(devpriv->mite);
AI_FIFO_Interrupt_Enable,0);
ni_ai_reset(dev,dev->subdevices);
- comedi_done(dev,dev->subdevices);
+ s->async->events |= COMEDI_CB_EOA;
MDPRINTK("exit ni_handle_block_dma\n");
}
}
ni_ao_fifo_load(dev,s,s->async->data+s->async->buf_int_ptr,n);
- comedi_bufcheck(dev,s);
+ s->async->events |= COMEDI_CB_BLOCK;
return 1;
}
outb(0, dev->iobase + PCL711_MODE);
}
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
}
+ comedi_event(dev, s, s->async->events);
}
static void pcl711_set_changain(comedi_device * dev, int chan)
outb(0,dev->iobase+PCL818_STATUS); /* clear INT request */
comedi_error(dev,"A/D mode1/3 IRQ without DRDY!");
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
conv_finish:
if ((low & 0xf)!=devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout!
rt_printk("comedi: A/D mode1/3 IRQ - channel dropout %x!=%x !\n",(low & 0xf),devpriv->act_chanlist[devpriv->act_chanlist_pos]);
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
}
s->async->buf_int_ptr+=sizeof(sampl_t);
s->async->cur_chan++;
if (s->async->cur_chan>=s->async->cmd.chanlist_len){
s->async->cur_chan=0;
-#if 0
- if (devpriv->cur_flags & TRIG_WAKE_EOS){
- comedi_eos(dev,s);
- } else {
- comedi_bufcheck(dev,s);
- }
-#else
- comedi_bufcheck(dev,s);
-#endif
+ s->async->events |= COMEDI_CB_BLOCK;
// rt_printk("E");
devpriv->int13_act_scan--;
}
s->async->buf_int_ptr=0;
devpriv->buf_ptr=0;
//printk("B ");
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
- if (!devpriv->neverending_ai)
+ if (!devpriv->neverending_ai){
if ( devpriv->int13_act_scan == 0 ) { /* all data sampled */
pcl818_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
return;
}
+ }
+ comedi_event(dev, s, s->async->events);
}
/*
if ((ptr[bufptr] & 0xf)!=devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout!
rt_printk("comedi: A/D mode1/3 DMA - channel dropout %d!=%d !\n",(ptr[bufptr] & 0xf),devpriv->act_chanlist[devpriv->act_chanlist_pos]);
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
}
if (s->async->buf_int_ptr>=s->async->data_len) { /* buffer rollover */
s->async->buf_int_ptr=0;
devpriv->buf_ptr=0;
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
if (!devpriv->neverending_ai)
if ( devpriv->int13_act_scan == 0 ) { /* all data sampled */
pcl818_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev, s, s->async->events);
// printk("done int ai13 dma\n");
return;
}
}
- if (len>0) comedi_bufcheck(dev,s);
+ if (len>0) comedi_event(dev, s, s->async->events);
}
/*
comedi_error(dev,"A/D mode1/3 DMA buffer overflow!");
//rt_printk("I %d dmabuf[i] %d %d\n",i,dmabuf[i],devpriv->dmasamplsize);
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
}
//rt_printk("r %ld ",ofs_dats);
if ((dmabuf[bufptr] & 0xf)!=devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout!
rt_printk("comedi: A/D mode1/3 DMA - channel dropout %d!=%d !\n",(dmabuf[bufptr] & 0xf),devpriv->act_chanlist[devpriv->act_chanlist_pos]);
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
}
if (s->async->buf_int_ptr>=s->async->data_len) { /* buffer rollover */
s->async->buf_int_ptr=0;
devpriv->buf_ptr=0;
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
if (!devpriv->neverending_ai)
if ( devpriv->int13_act_scan == 0 ) { /* all data sampled */
pcl818_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev, s, s->async->events);
//printk("done int ai13 dma\n");
return;
}
bufptr--;
bufptr&=(devpriv->dmasamplsize-1);
dmabuf[bufptr]=MAGIC_DMA_WORD;
- comedi_bufcheck(dev,s);
+ comedi_event(dev, s, s->async->events);
//outb(0,0x378);
return;
}
//outb(0,0x378);
-
}
/*
if (lo&4) {
comedi_error(dev,"A/D mode1/3 FIFO overflow!");
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
}
if (lo&1) {
comedi_error(dev,"A/D mode1/3 FIFO interrupt without data!");
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
}
if ((lo & 0xf)!=devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout!
rt_printk("comedi: A/D mode1/3 FIFO - channel dropout %d!=%d !\n",(lo & 0xf),devpriv->act_chanlist[devpriv->act_chanlist_pos]);
pcl818_ai_cancel(dev,s);
- comedi_error_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+ comedi_event(dev, s, s->async->events);
return;
}
if (s->async->buf_int_ptr>=s->async->data_len) { /* buffer rollover */
s->async->buf_int_ptr=0;
devpriv->buf_ptr=0;
- comedi_eobuf(dev,s);
+ s->async->events |= COMEDI_CB_EOBUF;
}
if (!devpriv->neverending_ai)
if ( devpriv->int13_act_scan == 0 ) { /* all data sampled */
- comedi_bufcheck(dev,s);
pcl818_ai_cancel(dev,s);
- comedi_done(dev,s);
+ s->async->events |= COMEDI_CB_EOA;
+ comedi_event(dev, s, s->async->events);
return;
}
}
- if (len>0) comedi_bufcheck(dev,s);
+ if (len>0) comedi_event(dev, s, s->async->events);
}
/*
/* Check for any ready data */
if (RtdFifoStatus (dev) & FS_ADC_HEMPTY) { /* read 1/2 fifo worth */
ai_read_half_fifo (dev, s);
- /*comedi_bufcheck (dev, s); */
s->async->events |= COMEDI_CB_BLOCK; /* signal something there */
} else {
/* for slow transfers, we should read whatever is there */
if (0 == devpriv->aiCount) { /* done! stop! */
RtdInterruptMask (dev, 0); /* mask out ABOUT and SAMPLE */
RtdPacerStop (dev); /* Stop PACER */
- /*comedi_done (dev, s);*/
s->async->events |= COMEDI_CB_EOA;/* signal end to comedi */
} else if (status & IRQM_ADC_ABOUT_CNT) { /* about cnt terminated */
if (devpriv->aboutWrap) { /* multi-count wraps */
RtdPacerStop (dev); /* Stop PACER */
ai_read_dregs (dev, s); /* ready anything in FIFO */
- /*comedi_done (dev, s);*/
s->async->events |= COMEDI_CB_EOA;/* signal end to comedi */
}
}
/* check for fifo over-run */
- if (s->async->events != 0) { /* signal any events */
- comedi_event (dev, s, s->async->events);
- s->async->events = 0;
- }
+ comedi_event (dev, s, s->async->events);
}
/* clear the interrupt */
= d + 2048; /* convert to comedi unsigned data */
s->async->buf_int_count += sizeof(sampl_t);
s->async->buf_int_ptr += sizeof(sampl_t);
- comedi_done (dev, s);
} else {
/* interrupt setup */
if (! dev->irq) {