]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/block/ataflop.c
Merge branch 'for-3.16/core' of git://git.kernel.dk/linux-block into next
[karo-tx-linux.git] / drivers / block / ataflop.c
index 0e30c6e5492a54e9cd703271e9c3e7b5ec5d59b3..2104b1b4ccda276dd324b12b843468c322a39ed5 100644 (file)
@@ -68,6 +68,8 @@
 #include <linux/init.h>
 #include <linux/blkdev.h>
 #include <linux/mutex.h>
+#include <linux/completion.h>
+#include <linux/wait.h>
 
 #include <asm/atafd.h>
 #include <asm/atafdreg.h>
@@ -301,7 +303,7 @@ module_param_array(UserSteprate, int, NULL, 0);
 /* Synchronization of FDC access. */
 static volatile int fdc_busy = 0;
 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
-static DECLARE_WAIT_QUEUE_HEAD(format_wait);
+static DECLARE_COMPLETION(format_wait);
 
 static unsigned long changed_floppies = 0xff, fake_change = 0;
 #define        CHECK_CHANGE_DELAY      HZ/2
@@ -608,7 +610,7 @@ static void fd_error( void )
        if (IsFormatting) {
                IsFormatting = 0;
                FormatError = 1;
-               wake_up( &format_wait );
+               complete(&format_wait);
                return;
        }
 
@@ -650,9 +652,8 @@ static int do_format(int drive, int type, struct atari_format_descr *desc)
        DPRINT(("do_format( dr=%d tr=%d he=%d offs=%d )\n",
                drive, desc->track, desc->head, desc->sect_offset ));
 
+       wait_event(fdc_wait, cmpxchg(&fdc_busy, 0, 1) == 0);
        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 */
        local_irq_restore(flags);
@@ -706,7 +707,7 @@ static int do_format(int drive, int type, struct atari_format_descr *desc)
        ReqSide  = desc->head;
        do_fd_action( drive );
 
-       sleep_on( &format_wait );
+       wait_for_completion(&format_wait);
 
        redo_fd_request();
        return( FormatError ? -EIO : 0 );       
@@ -1229,7 +1230,7 @@ static void fd_writetrack_done( int status )
                goto err_end;
        }
 
-       wake_up( &format_wait );
+       complete(&format_wait);
        return;
 
   err_end:
@@ -1483,7 +1484,7 @@ repeat:
        ReqCnt = 0;
        ReqCmd = rq_data_dir(fd_request);
        ReqBlock = blk_rq_pos(fd_request);
-       ReqBuffer = fd_request->buffer;
+       ReqBuffer = bio_data(fd_request->bio);
        setup_req_params( drive );
        do_fd_action( drive );
 
@@ -1497,8 +1498,7 @@ repeat:
 void do_fd_request(struct request_queue * q)
 {
        DPRINT(("do_fd_request for pid %d\n",current->pid));
-       while( fdc_busy ) sleep_on( &fdc_wait );
-       fdc_busy = 1;
+       wait_event(fdc_wait, cmpxchg(&fdc_busy, 0, 1) == 0);
        stdma_lock(floppy_irq, NULL);
 
        atari_disable_irq( IRQ_MFP_FDC );
@@ -1952,7 +1952,7 @@ static int __init atari_floppy_init (void)
                goto Enomem;
        }
        TrackBuffer = DMABuffer + 512;
-       PhysDMABuffer = virt_to_phys(DMABuffer);
+       PhysDMABuffer = atari_stram_to_phys(DMABuffer);
        PhysTrackBuffer = virt_to_phys(TrackBuffer);
        BufferDrive = BufferSide = BufferTrack = -1;