Interrupt Handlers and Driver to Driver Communication
NKoch at demig.de
Thu Jan 19 04:48:03 PST 2006
>From which context/function in your driver 2 do you check g_status?
Does your debug output show, that this context really
Are your drivers in the same or different source files?
Or are they being loaded as different klds?
Have you tried if it makes any difference to declare
g_status as volatile?
Any interesting compiler warnings?
(Just for not forgetting to ask: You didn't by accident declare
g_status twice, once at global and once static at function scope?)
> -----Original Message-----
> From: owner-freebsd-drivers at freebsd.org
> [mailto:owner-freebsd-drivers at freebsd.org]On Behalf Of Kimberly Davis
> Sent: Wednesday, January 18, 2006 7:22 PM
> To: freebsd-drivers at freebsd.org
> Subject: Interrupt Handlers and Driver to Driver Communication
> I am having a very serious problem with a driver that I am
> writing. Specifically, my problem is related to driver to driver
> communication. I've tried to abstract the problem in my description below.
> I have a driver (let's call it Driver 1) in which I register the
> interrupt handler in this way:
> tsc->irqid = 0x0;
> tsc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ,&(tsc->irqid), 0, ~0,
> 1, RF_SHAREABLE | RF_ACTIVE);
> if(tsc->irq_res == NULL)
> print_osal("Failed to allocate irq resource\n");
> error = bus_setup_intr(dev, tsc->irq_res, INTR_TYPE_MISC ,
> driver_one_interrupt_handler, tsc, &(tsc->handler));
> My interrupt handler function is actually quite long, but there
> is nothing to be done about it. There is no really good way to
> make it shorter. Anyway, in Driver 2, I call a function (part of
> an API that I provide in driver 1) and it returns a value:
> status = driver_one_is_operation_complete(param, param);
> The driver_one_is_operation_complete function actually returns to
> Driver 2 a status variable that is set in the interrupt handler
> of driver 1.
> //global for status of an event.
> int g_status;
> void driver_one_interrupt_handler(void * arg)
> g_status = 0;
> g_status = 1;
> The problem is that I never, ever get the value from the
> function driver_one_is_operation_complete that I would expect.
> The value returned is always 0 and never 1. However, when I check
> this value in driver one's detach function, right before the end
> of execution, the value is 1.
> print("g_status %x\n",g_status)
> blah, blah, blah
> Clearly, the interrupt handler has executed and the value has
> been set to one.
> In driver two, I've tried waiting 2 or 3 seconds (with the
> system's delay function) before calling
> driver_one_is_operation_complete, but this doesn't help either.
> Is there something weird going on in the Driver to Driver communication?
> Thanks in advance for any help or clues you may be able to provide,
> freebsd-drivers at freebsd.org mailing list
> To unsubscribe, send any mail to "freebsd-drivers-unsubscribe at freebsd.org"
More information about the freebsd-drivers