diff --git a/workbench/devs/AHI/Drivers/HDAudio/DriverData.h b/workbench/devs/AHI/Drivers/HDAudio/DriverData.h index b1f6b68397..428dad340a 100644 --- a/workbench/devs/AHI/Drivers/HDAudio/DriverData.h +++ b/workbench/devs/AHI/Drivers/HDAudio/DriverData.h @@ -182,7 +182,13 @@ struct HDAudioChip /** The recording software interrupt */ struct Interrupt record_interrupt; - + + /** The reset handler */ + struct Interrupt reset_handler; + + /** TRUE if the reset handler has been added to the system */ + BOOL reset_handler_added; + /*** Card structures **************************************************/ HDAADDR(playback_buffer1); HDAADDR(playback_buffer2); diff --git a/workbench/devs/AHI/Drivers/HDAudio/misc.c b/workbench/devs/AHI/Drivers/HDAudio/misc.c index dd1284cea0..3518a1978c 100644 --- a/workbench/devs/AHI/Drivers/HDAudio/misc.c +++ b/workbench/devs/AHI/Drivers/HDAudio/misc.c @@ -254,6 +254,11 @@ void FreeDriverData(struct HDAudioChip* card, struct DriverBase* AHIsubBase) ahi_pci_rem_intserver(&card->interrupt, card->pci_dev); } + if (card->reset_handler_added) + { + RemResetCallback(&card->reset_handler); + } + FreeVec(card); } } @@ -1050,19 +1055,18 @@ static ULONG ResetHandler(struct HDAudioChip *card) void AddResetHandler(struct HDAudioChip *card) { - static struct Interrupt interrupt; - - interrupt.is_Code = (void (*)())ResetHandler; - interrupt.is_Data = (APTR) card; - interrupt.is_Node.ln_Pri = 0; + struct Interrupt *handler = &card->reset_handler; + handler->is_Code = (void (*)())ResetHandler; + handler->is_Data = (APTR) card; + handler->is_Node.ln_Pri = 0; #ifdef __AMIGAOS4__ - interrupt.is_Node.ln_Type = NT_EXTINTERRUPT; + handler->is_Node.ln_Type = NT_EXTINTERRUPT; #else - interrupt.is_Node.ln_Type = NT_INTERRUPT; + handler->is_Node.ln_Type = NT_INTERRUPT; #endif - interrupt.is_Node.ln_Name = "HDAudio reset handler"; + handler->is_Node.ln_Name = "HDAudio reset handler"; - AddResetCallback(&interrupt); + card->reset_handler_added = AddResetCallback(handler); } diff --git a/workbench/devs/AHI/Drivers/HDAudio/version.date b/workbench/devs/AHI/Drivers/HDAudio/version.date index 232c15aa7e..db8e340a03 100644 --- a/workbench/devs/AHI/Drivers/HDAudio/version.date +++ b/workbench/devs/AHI/Drivers/HDAudio/version.date @@ -1 +1 @@ -29.12.2024 +15.11.2025 diff --git a/workbench/devs/AHI/Drivers/HDAudio/version.rev b/workbench/devs/AHI/Drivers/HDAudio/version.rev index 7facc89938..81b5c5d06c 100644 --- a/workbench/devs/AHI/Drivers/HDAudio/version.rev +++ b/workbench/devs/AHI/Drivers/HDAudio/version.rev @@ -1 +1 @@ -36 +37 diff --git a/workbench/devs/AHI/Drivers/SB128/DriverData.h b/workbench/devs/AHI/Drivers/SB128/DriverData.h index 7f6c9d91bf..8ff76a46f8 100755 --- a/workbench/devs/AHI/Drivers/SB128/DriverData.h +++ b/workbench/devs/AHI/Drivers/SB128/DriverData.h @@ -112,6 +112,11 @@ struct SB128_DATA /** TRUE if the hardware interrupt may Cause() playback_interrupt */ BOOL record_interrupt_enabled; + /** The reset handler */ + struct Interrupt reset_handler; + + /** TRUE if the reset handler has been added to the system */ + BOOL reset_handler_added; /*** CAMD support functions **********************************************/ diff --git a/workbench/devs/AHI/Drivers/SB128/misc.c b/workbench/devs/AHI/Drivers/SB128/misc.c index 0754667fd9..1092106986 100755 --- a/workbench/devs/AHI/Drivers/SB128/misc.c +++ b/workbench/devs/AHI/Drivers/SB128/misc.c @@ -813,6 +813,11 @@ FreeDriverData( struct SB128_DATA* card, ahi_pci_rem_intserver(&card->interrupt, card->pci_dev); } + if( card->reset_handler_added ) + { + RemResetCallback(&card->reset_handler); + } + FreeVec( card ); } } @@ -1242,17 +1247,16 @@ static ULONG ResetHandler(struct SB128_DATA *card) void AddResetHandler(struct SB128_DATA *card) { - static struct Interrupt interrupt; - - interrupt.is_Code = (void (*)())ResetHandler; - interrupt.is_Data = (APTR) card; - interrupt.is_Node.ln_Pri = 0; + struct Interrupt *handler = &card->reset_handler; + handler->is_Code = (void (*)())ResetHandler; + handler->is_Data = (APTR) card; + handler->is_Node.ln_Pri = 0; #ifdef __AMIGAOS4__ - interrupt.is_Node.ln_Type = NT_EXTINTERRUPT; + handler->is_Node.ln_Type = NT_EXTINTERRUPT; #else - interrupt.is_Node.ln_Type = NT_INTERRUPT; + handler->is_Node.ln_Type = NT_INTERRUPT; #endif - interrupt.is_Node.ln_Name = "SB128 Reset Handler"; + handler->is_Node.ln_Name = "SB128 Reset Handler"; - AddResetCallback( &interrupt ); + card->reset_handler_added = AddResetCallback( handler ); } diff --git a/workbench/devs/AHI/Drivers/SB128/version.date b/workbench/devs/AHI/Drivers/SB128/version.date index e10eaea9b6..db8e340a03 100755 --- a/workbench/devs/AHI/Drivers/SB128/version.date +++ b/workbench/devs/AHI/Drivers/SB128/version.date @@ -1 +1 @@ -20.7.2012 +15.11.2025 diff --git a/workbench/devs/AHI/Drivers/SB128/version.rev b/workbench/devs/AHI/Drivers/SB128/version.rev index f64f5d8d85..9902f17848 100755 --- a/workbench/devs/AHI/Drivers/SB128/version.rev +++ b/workbench/devs/AHI/Drivers/SB128/version.rev @@ -1 +1 @@ -27 +28