English is also my mother language. i think your handle should check your device interrupt status register,check if this interrupt is yours or others.if yours,handle it .if others,should return IRQ_NONE. But your code : // find out which board got an interrupt for (i = 0; i < MAX_BOARDS; i++) if (dev_id == &my_boards[i]) { board = dev_id; break; } // Check if interrupt was issued by another device (in case of shared // interrupt line). if (i == MAX_BOARDS) goto handled; if (board == NULL) goto handled; Maybe scenario is wrong.Others come in a interrupt ,your handle dev_id == my_boards[0] ,so i == 0 && board !=NULL so not jump to your label handled. So i think your condition to check maybe is wrong.you only should check your device interrupt status register flag-bit. 2009/2/25 Denis Borisevich <dennisfen@xxxxxxxxx>: > Hi! > I've done some tests and here is what I figured out: the interrupts > assigned to the device controlled by the ahci driver keep going even > without my driver loaded and even with all my boards removed from > system physically. So it seems that everything ok. > But I have another question concerning interrupts: > Let's take the situation I described in my first and second posts - I > have a system with the PCI board which I develop driver for. This > board shares interrupt with the device controlled by ahci driver. The > question is why every interrupt I got on this line is interpreted by > my driver as the interrupt which belongs to it? Here is the code I > use: > > === CODE BELOW === > > to register ISR: > struct my_dev *board; > request_irq(board->irq, my_interrupt_handler, IRQF_SHARED, "my_module", board); > > ISR: > static irqreturn_t my_interrupt_handler(int irq, void *dev_id) > { > struct my_dev *board; > int i, retval = IRQ_NONE; > > // find out which board got an interrupt > for (i = 0; i < MAX_BOARDS; i++) > if (dev_id == &my_boards[i]) { > board = dev_id; > break; > } > > // Check if interrupt was issued by another device (in case of shared > // interrupt line). > if (i == MAX_BOARDS) > goto handled; > if (board == NULL) > goto handled; > > // if we are here then it's our interrupt > retval = IRQ_HANDLED; > > /* here goes some checks on the device registers > to know if there is interrupts pending in it. > these checks are sure to be right. If there's no > interrupt, then debug message "no interrupt" is > printed. > */ > ....... > /* here goes the interrupt handling, if the previous check > was successful > */ > ....... > > handled: > return retval; > } > > === CODE ABOVE === > > So, what do I have now. When no program touches my device (it is > idling) and the ahci driver is loaded I have this "no interrupt" > message in dmesg output 20-30 times per second. When some application > uses my device I have the proper printouts (the kind of interrupt and > so on) and bunch of these "no interrupt". When I install my board into > another PCI slot (and get another interrupt line) I never see these > "no interrupt" messages, but only the ones concerning to the actual > interrupt handling in my driver. Which indicates that driver works as > intended. The questions is why the dev_id parameter of > my_interrupt_handler() holds the data which belongs to one of the > boards controlled by my driver (which is the reason why the check in > the very beginning of ISR routine is passed)? > > P.S.: I hope that you got what I tried to explain=) English is not my > native language=) > > -- > Denis > > -- > To unsubscribe from this list: send an email with > "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx > Please read the FAQ at http://kernelnewbies.org/FAQ > > -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ