Skip to content

Commit

Permalink
floppy: cleanup: do not iterate on current_fdc in DMA grab/release fu…
Browse files Browse the repository at this point in the history
…nctions

Both floppy_grab_irq_and_dma() and floppy_release_irq_and_dma() used to
iterate on the global variable while setting up or freeing resources.
Now that they exclusively rely on functions which take the fdc as an
argument, so let's not touch the global one anymore.

Link: https://lore.kernel.org/r/20200331094054.24441-23-w@1wt.eu
Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Denis Efremov <efremov@linux.com>
  • Loading branch information
wtarreau authored and evdenis committed May 12, 2020
1 parent e5a9c95 commit 82a6301
Showing 1 changed file with 20 additions and 19 deletions.
39 changes: 20 additions & 19 deletions drivers/block/floppy.c
Original file line number Diff line number Diff line change
Expand Up @@ -4854,6 +4854,8 @@ static void floppy_release_regions(int fdc)

static int floppy_grab_irq_and_dma(void)
{
int fdc;

if (atomic_inc_return(&usage_count) > 1)
return 0;

Expand Down Expand Up @@ -4881,24 +4883,24 @@ static int floppy_grab_irq_and_dma(void)
}
}

for (current_fdc = 0; current_fdc < N_FDC; current_fdc++) {
if (fdc_state[current_fdc].address != -1) {
if (floppy_request_regions(current_fdc))
for (fdc = 0; fdc < N_FDC; fdc++) {
if (fdc_state[fdc].address != -1) {
if (floppy_request_regions(fdc))
goto cleanup;
}
}
for (current_fdc = 0; current_fdc < N_FDC; current_fdc++) {
if (fdc_state[current_fdc].address != -1) {
reset_fdc_info(current_fdc, 1);
fdc_outb(fdc_state[current_fdc].dor, current_fdc, FD_DOR);
for (fdc = 0; fdc < N_FDC; fdc++) {
if (fdc_state[fdc].address != -1) {
reset_fdc_info(fdc, 1);
fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR);
}
}
current_fdc = 0;

set_dor(0, ~0, 8); /* avoid immediate interrupt */

for (current_fdc = 0; current_fdc < N_FDC; current_fdc++)
if (fdc_state[current_fdc].address != -1)
fdc_outb(fdc_state[current_fdc].dor, current_fdc, FD_DOR);
for (fdc = 0; fdc < N_FDC; fdc++)
if (fdc_state[fdc].address != -1)
fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR);
/*
* The driver will try and free resources and relies on us
* to know if they were allocated or not.
Expand All @@ -4909,15 +4911,16 @@ static int floppy_grab_irq_and_dma(void)
cleanup:
fd_free_irq();
fd_free_dma();
while (--current_fdc >= 0)
floppy_release_regions(current_fdc);
while (--fdc >= 0)
floppy_release_regions(fdc);
current_fdc = 0;
atomic_dec(&usage_count);
return -1;
}

static void floppy_release_irq_and_dma(void)
{
int old_fdc;
int fdc;
#ifndef __sparc__
int drive;
#endif
Expand Down Expand Up @@ -4958,11 +4961,9 @@ static void floppy_release_irq_and_dma(void)
pr_info("auxiliary floppy timer still active\n");
if (work_pending(&floppy_work))
pr_info("work still pending\n");
old_fdc = current_fdc;
for (current_fdc = 0; current_fdc < N_FDC; current_fdc++)
if (fdc_state[current_fdc].address != -1)
floppy_release_regions(current_fdc);
current_fdc = old_fdc;
for (fdc = 0; fdc < N_FDC; fdc++)
if (fdc_state[fdc].address != -1)
floppy_release_regions(fdc);
}

#ifdef MODULE
Expand Down

0 comments on commit 82a6301

Please sign in to comment.