Messages in this thread Patch in this message | | | From | Taral <> | Subject | Re: floppy.c IRQ/DMA potential bug? | Date | Thu, 4 Mar 1999 14:55:13 -0600 |
| |
On Thu, 04 Mar 1999, you wrote: >Attached the the patch as it would apply to 2.2.2 -- not sure if it's still >needed.
Okay... Mistype. Corrected patch attached.
Taral--- linux/drivers/block/floppy.c.old Sun Jan 10 11:59:59 1999 +++ linux/drivers/block/floppy.c Thu Mar 4 14:56:12 1999 @@ -4240,20 +4240,10 @@ static int floppy_grab_irq_and_dma(void) } INT_ON; MOD_INC_USE_COUNT; - if (fd_request_irq()) { - DPRINT("Unable to grab IRQ%d for the floppy driver\n", - FLOPPY_IRQ); - MOD_DEC_USE_COUNT; - usage_count--; - return -1; - } if (fd_request_dma()) { DPRINT("Unable to grab DMA%d for the floppy driver\n", FLOPPY_DMA); - fd_free_irq(); - MOD_DEC_USE_COUNT; - usage_count--; - return -1; + goto out_no_dma; } for (fdc=0; fdc< N_FDC; fdc++){ @@ -4261,15 +4251,7 @@ static int floppy_grab_irq_and_dma(void) if (check_region(FDCS->address, 6) < 0 || check_region(FDCS->address+7, 1) < 0) { DPRINT("Floppy io-port 0x%04lx in use\n", FDCS->address); - fd_free_irq(); - fd_free_dma(); - while(--fdc >= 0) { - release_region(FDCS->address, 6); - release_region(FDCS->address+7, 1); - } - MOD_DEC_USE_COUNT; - usage_count--; - return -1; + goto release_resources; } request_region(FDCS->address, 6, "floppy"); request_region(FDCS->address+7, 1, "floppy DIR"); @@ -4277,6 +4259,11 @@ static int floppy_grab_irq_and_dma(void) * Unfortunately, Adaptec doesn't know this :-(, */ } } + if (fd_request_irq()) { + DPRINT("Unable to grab IRQ%d for the floppy driver\n", + FLOPPY_IRQ); + goto release_resources; + } for (fdc=0; fdc< N_FDC; fdc++){ if (FDCS->address != -1){ reset_fdc_info(1); @@ -4296,6 +4283,18 @@ static int floppy_grab_irq_and_dma(void) fdc = 0; irqdma_allocated = 1; return 0; + +release_resources: + fd_free_dma(); + while(--fdc >= 0) + if (FDCS->address != -1) { + release_region(FDCS->address, 6); + release_region(FDCS->address+7, 1); + } +out_no_dma: + MOD_DEC_USE_COUNT; + usage_count--; + return -1; } static void floppy_release_irq_and_dma(void) | |