[PATCH] M68k block local_irq*() updates

Geert Uytterhoeven (geert@linux-m68k.org)
Fri, 27 Dec 2002 17:11:10 +0100


Convert m68k block drivers to new local_irq*() framework:
- Atari ACSI
- Amiga floppy
- Atari floppy
- Macintosh IIfx/Quadra 900/Quadra 950 floppy

--- linux-2.5.53/drivers/block/acsi.c Thu Oct 31 10:14:59 2002
+++ linux-m68k-2.5.53/drivers/block/acsi.c Thu Nov 7 23:02:52 2002
@@ -496,8 +496,7 @@
acsi_delay_end(COMMAND_DELAY);
DISABLE_IRQ();

- save_flags(flags);
- cli();
+ local_irq_save(flags);
/* Low on A1 */
dma_wd.dma_mode_status = 0x88 | rwflag;
MFPDELAY();
@@ -514,7 +513,7 @@
else
dma_wd.dma_hi = (unsigned char)paddr;
MFPDELAY();
- restore_flags(flags);
+ local_irq_restore(flags);

/* send the command bytes except the last */
for( i = 0; i < 5; ++i ) {
--- linux-2.5.53/drivers/block/amiflop.c Wed Nov 6 16:13:59 2002
+++ linux-m68k-2.5.53/drivers/block/amiflop.c Thu Nov 7 23:03:15 2002
@@ -231,12 +231,11 @@
unsigned long flags;
int ticks;
if (ms > 0) {
- save_flags(flags);
- cli();
+ local_irq_save(flags);
while (ms_busy == 0)
sleep_on(&ms_wait);
ms_busy = 0;
- restore_flags(flags);
+ local_irq_restore(flags);
ticks = MS_TICKS*ms-1;
ciaa.tblo=ticks%256;
ciaa.tbhi=ticks/256;
@@ -262,13 +261,12 @@
#ifdef DEBUG
printk("get_fdc: drive %d fdc_busy %d fdc_nested %d\n",drive,fdc_busy,fdc_nested);
#endif
- save_flags(flags);
- cli();
+ local_irq_save(flags);
while (!try_fdc(drive))
sleep_on(&fdc_wait);
fdc_busy = drive;
fdc_nested++;
- restore_flags(flags);
+ local_irq_restore(flags);
}

static inline void rel_fdc(void)
@@ -324,8 +322,7 @@
}

get_fdc(drive);
- save_flags (flags);
- cli();
+ local_irq_save(flags);

selected = -1;

@@ -333,7 +330,7 @@
prb |= (SELMASK(0)|SELMASK(1)|SELMASK(2)|SELMASK(3));
ciab.prb = prb;

- restore_flags (flags);
+ local_irq_restore (flags);
rel_fdc();

}
@@ -1308,10 +1305,9 @@
rel_fdc();
return 0;
}
- save_flags(flags);
- cli();
+ local_irq_save(flags);
if (writepending != 2) {
- restore_flags(flags);
+ local_irq_restore(flags);
(*unit[nr].dtype->write_fkt)(nr);
if (!raw_write(nr)) {
printk (KERN_NOTICE "floppy disk write protected "
@@ -1323,7 +1319,7 @@
sleep_on (&wait_fd_block);
}
else {
- restore_flags(flags);
+ local_irq_restore(flags);
ms_delay(2); /* 2 ms post_write delay */
post_write(nr);
}
@@ -1431,8 +1427,7 @@
* setup a callback to write the track buffer
* after a short (1 tick) delay.
*/
- save_flags (flags);
- cli();
+ local_irq_save(flags);

floppy->dirty = 1;
/* reset the timer */
@@ -1440,7 +1435,7 @@

flush_track_timer[drive].expires = jiffies + 1;
add_timer (flush_track_timer + drive);
- restore_flags (flags);
+ local_irq_restore(flags);
break;
}
}
@@ -1609,15 +1604,14 @@
}
}

- save_flags(flags);
- cli();
+ local_irq_save(flags);
fd_ref[drive]++;
fd_device[drive] = system;
#ifdef MODULE
if (unit[drive].motor == 0)
MOD_INC_USE_COUNT;
#endif
- restore_flags(flags);
+ local_irq_restore(flags);

if (old_dev != system)
invalidate_buffers(mk_kdev(MAJOR_NR, drive + (system << 2)));
--- linux-2.5.53/drivers/block/acsi_slm.c Mon Nov 11 10:19:11 2002
+++ linux-m68k-2.5.53/drivers/block/acsi_slm.c Mon Nov 11 11:13:19 2002
@@ -502,12 +502,11 @@
int did_wait = 0;
#endif

- save_flags(flags);
- cli();
-
+ local_irq_save(flags);
+
addr = get_dma_addr();
if ((d = SLMEndAddr - addr) > 0) {
- restore_flags(flags);
+ local_irq_restore(flags);

/* slice not yet finished, decide whether to start another timer or to
* busy-wait */
@@ -525,7 +524,7 @@
do_gettimeofday( &start_tm );
did_wait = 1;
#endif
- cli();
+ local_irq_disable();
while( get_dma_addr() < SLMEndAddr )
barrier();
}
@@ -549,7 +548,7 @@
DMA_LONG_WRITE( SLM_DMA_AMOUNT, 0x112 );
#endif

- restore_flags(flags);
+ local_irq_restore(flags);

#ifdef DEBUG
if (did_wait) {
@@ -586,10 +585,9 @@

static void set_dma_addr( unsigned long paddr )

-{ unsigned long flags;
-
- save_flags(flags);
- cli();
+{ unsigned long flags;
+
+ local_irq_save(flags);
dma_wd.dma_lo = (unsigned char)paddr;
paddr >>= 8;
MFPDELAY();
@@ -601,7 +599,7 @@
else
dma_wd.dma_hi = (unsigned char)paddr;
MFPDELAY();
- restore_flags(flags);
+ local_irq_restore(flags);
}


--- linux-2.5.53/drivers/block/ataflop.c Mon Nov 11 10:19:11 2002
+++ linux-m68k-2.5.53/drivers/block/ataflop.c Mon Nov 11 13:05:00 2002
@@ -250,24 +250,24 @@
#define FDC_READ(reg) ({ \
/* unsigned long __flags; */ \
unsigned short __val; \
- /* save_flags(__flags); cli(); */ \
+ /* local_irq_save(__flags); */ \
dma_wd.dma_mode_status = 0x80 | (reg); \
udelay(25); \
__val = dma_wd.fdc_acces_seccount; \
MFPDELAY(); \
- /* restore_flags(__flags); */ \
+ /* local_irq_restore(__flags); */ \
__val & 0xff; \
})

#define FDC_WRITE(reg,val) \
do { \
/* unsigned long __flags; */ \
- /* save_flags(__flags); cli(); */ \
+ /* local_irq_save(__flags); */ \
dma_wd.dma_mode_status = 0x80 | (reg); \
udelay(25); \
dma_wd.fdc_acces_seccount = (val); \
MFPDELAY(); \
- /* restore_flags(__flags); */ \
+ /* local_irq_restore(__flags); */ \
} while(0)


@@ -436,14 +436,14 @@
{
unsigned long flags;

- save_flags(flags);
- cli(); /* protect against various other ints mucking around with the PSG */
+ /* protect against various other ints mucking around with the PSG */
+ local_irq_save(flags);

sound_ym.rd_data_reg_sel = 14; /* Select PSG Port A */
sound_ym.wd_data = (side == 0) ? sound_ym.rd_data_reg_sel | 0x01 :
sound_ym.rd_data_reg_sel & 0xfe;

- restore_flags(flags);
+ local_irq_restore(flags);
}


@@ -459,13 +459,13 @@
if (drive == SelectedDrive)
return;

- save_flags(flags);
- cli(); /* protect against various other ints mucking around with the PSG */
+ /* protect against various other ints mucking around with the PSG */
+ local_irq_save(flags);
sound_ym.rd_data_reg_sel = 14; /* Select PSG Port A */
tmp = sound_ym.rd_data_reg_sel;
sound_ym.wd_data = (tmp | DSKDRVNONE) & ~(drive == 0 ? DSKDRV0 : DSKDRV1);
atari_dont_touch_floppy_select = 1;
- restore_flags(flags);
+ local_irq_restore(flags);

/* restore track register to saved value */
FDC_WRITE( FDCREG_TRACK, UD.track );
@@ -486,8 +486,8 @@
{
unsigned long flags;

- save_flags(flags);
- cli(); /* protect against various other ints mucking around with the PSG */
+ /* protect against various other ints mucking around with the PSG */
+ local_irq_save(flags);
atari_dont_touch_floppy_select = 0;
sound_ym.rd_data_reg_sel=14; /* Select PSG Port A */
sound_ym.wd_data = (sound_ym.rd_data_reg_sel |
@@ -495,7 +495,7 @@
/* On Falcon, the drive B select line is used on the printer port, so
* leave it alone... */
SelectedDrive = -1;
- restore_flags(flags);
+ local_irq_restore(flags);
}


@@ -551,8 +551,8 @@
if (++drive > 1 || !UD.connected)
drive = 0;

- save_flags(flags);
- cli(); /* protect against various other ints mucking around with the PSG */
+ /* protect against various other ints mucking around with the PSG */
+ local_irq_save(flags);

if (!stdma_islocked()) {
sound_ym.rd_data_reg_sel = 14;
@@ -568,7 +568,7 @@
set_bit (drive, &changed_floppies);
}
}
- restore_flags(flags);
+ local_irq_restore(flags);

start_check_change_timer();
}
@@ -668,13 +668,12 @@
DPRINT(("do_format( dr=%d tr=%d he=%d offs=%d )\n",
drive, desc->track, desc->head, desc->sect_offset ));

- save_flags(flags);
- cli();
+ local_irq_save(flags);
while( fdc_busy ) sleep_on( &fdc_wait );
fdc_busy = 1;
stdma_lock(floppy_irq, NULL);
atari_turnon_irq( IRQ_MFP_FDC ); /* should be already, just to be sure */
- restore_flags(flags);
+ local_irq_restore(flags);

type = minor(device) >> 2;
if (type) {
@@ -932,8 +931,7 @@
udelay(25);

/* Setup DMA */
- save_flags(flags);
- cli();
+ local_irq_save(flags);
dma_wd.dma_lo = (unsigned char)paddr;
MFPDELAY();
paddr >>= 8;
@@ -945,7 +943,7 @@
else
dma_wd.dma_hi = (unsigned char)paddr;
MFPDELAY();
- restore_flags(flags);
+ local_irq_restore(flags);

/* Clear FIFO and switch DMA to correct mode */
dma_wd.dma_mode_status = 0x90 | rwflag;
@@ -992,8 +990,7 @@
{
unsigned long flags, addr, addr2;

- save_flags(flags);
- cli();
+ local_irq_save(flags);

if (!MultReadInProgress) {
/* This prevents a race condition that could arise if the
@@ -1002,7 +999,7 @@
* already cleared 'MultReadInProgress' when flow of control
* gets here.
*/
- restore_flags(flags);
+ local_irq_restore(flags);
return;
}

@@ -1028,7 +1025,7 @@
*/
SET_IRQ_HANDLER( NULL );
MultReadInProgress = 0;
- restore_flags(flags);
+ local_irq_restore(flags);
DPRINT(("fd_readtrack_check(): done\n"));
FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
udelay(25);
@@ -1040,7 +1037,7 @@
}
else {
/* not yet finished, wait another tenth rotation */
- restore_flags(flags);
+ local_irq_restore(flags);
DPRINT(("fd_readtrack_check(): not yet finished\n"));
mod_timer(&readtrack_timer, jiffies + HZ/5/10);
}
@@ -1201,8 +1198,7 @@
udelay(40);

/* Setup DMA */
- save_flags(flags);
- cli();
+ local_irq_save(flags);
dma_wd.dma_lo = (unsigned char)paddr;
MFPDELAY();
paddr >>= 8;
@@ -1214,7 +1210,7 @@
else
dma_wd.dma_hi = (unsigned char)paddr;
MFPDELAY();
- restore_flags(flags);
+ local_irq_restore(flags);

/* Clear FIFO and switch DMA to correct mode */
dma_wd.dma_mode_status = 0x190;
@@ -1327,12 +1323,11 @@
start_check_change_timer();
start_motor_off_timer();

- save_flags(flags);
- cli();
+ local_irq_save(flags);
stdma_release();
fdc_busy = 0;
wake_up( &fdc_wait );
- restore_flags(flags);
+ local_irq_restore(flags);

DPRINT(("finish_fdc() finished\n"));
}
@@ -1521,10 +1516,10 @@
stdma_lock(floppy_irq, NULL);

atari_disable_irq( IRQ_MFP_FDC );
- save_flags(flags); /* The request function is called with ints
- sti(); * disabled... so must save the IPL for later */
+ local_save_flags(flags); /* The request function is called with ints
+ local_irq_disable(); * disabled... so must save the IPL for later */
redo_fd_request();
- restore_flags(flags);
+ local_irq_restore(flags);
atari_enable_irq( IRQ_MFP_FDC );
}

--- linux-2.5.53/drivers/block/swim_iop.c Mon Nov 11 10:19:12 2002
+++ linux-m68k-2.5.53/drivers/block/swim_iop.c Mon Nov 11 11:13:21 2002
@@ -212,17 +212,16 @@

static int swimiop_send_request(struct swim_iop_req *req)
{
- unsigned long cpu_flags;
+ unsigned long flags;
int err;

/* It's doubtful an interrupt routine would try to send */
/* a SWIM request, but I'd rather play it safe here. */

- save_flags(cpu_flags);
- cli();
+ local_irq_save(flags);

if (current_req != NULL) {
- restore_flags(cpu_flags);
+ local_irq_restore(flags);
return -ENOMEM;
}

@@ -230,7 +229,7 @@

/* Interrupts should be back on for iop_send_message() */

- restore_flags(cpu_flags);
+ local_irq_restore(flags);

err = iop_send_message(SWIM_IOP, SWIM_CHAN, (void *) req,
sizeof(req->command), (__u8 *) &req->command[0],
@@ -426,14 +425,13 @@
{
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
if (fs->state != idle) {
++fs->wanted;
while (fs->state != available) {
if (interruptible && signal_pending(current)) {
--fs->wanted;
- restore_flags(flags);
+ local_irq_restore(flags);
return -EINTR;
}
interruptible_sleep_on(&fs->wait);
@@ -441,7 +439,7 @@
--fs->wanted;
}
fs->state = state;
- restore_flags(flags);
+ local_irq_restore(flags);
return 0;
}

@@ -449,11 +447,10 @@
{
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
fs->state = idle;
start_request(fs);
- restore_flags(flags);
+ local_irq_restore(flags);
}

static void set_timeout(struct floppy_state *fs, int nticks,
@@ -461,7 +458,7 @@
{
unsigned long flags;

- save_flags(flags); cli();
+ local_irq_save(flags);
if (fs->timeout_pending)
del_timer(&fs->timeout);
init_timer(&fs->timeout);
@@ -470,7 +467,7 @@
fs->timeout.data = (unsigned long) fs;
add_timer(&fs->timeout);
fs->timeout_pending = 1;
- restore_flags(flags);
+ local_irq_restore(flags);
}

static void do_fd_request(request_queue_t * q)

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/