Эх сурвалжийг харах

powermac: Use a spinlock in swim3.c (floppy driver) instead of cli

Signed-off-by: Paul Mackerras <paulus@samba.org>
Paul Mackerras 19 жил өмнө
parent
commit
515729ece1
1 өөрчлөгдсөн 10 нэмэгдсэн , 10 устгасан
  1. 10 10
      drivers/block/swim3.c

+ 10 - 10
drivers/block/swim3.c

@@ -28,6 +28,7 @@
 #include <linux/devfs_fs_kernel.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/module.h>
+#include <linux/spinlock.h>
 #include <asm/io.h>
 #include <asm/io.h>
 #include <asm/dbdma.h>
 #include <asm/dbdma.h>
 #include <asm/prom.h>
 #include <asm/prom.h>
@@ -176,6 +177,7 @@ struct swim3 {
 
 
 struct floppy_state {
 struct floppy_state {
 	enum swim_state	state;
 	enum swim_state	state;
+	spinlock_t lock;
 	struct swim3 __iomem *swim3;	/* hardware registers */
 	struct swim3 __iomem *swim3;	/* hardware registers */
 	struct dbdma_regs __iomem *dma;	/* DMA controller registers */
 	struct dbdma_regs __iomem *dma;	/* DMA controller registers */
 	int	swim3_intr;	/* interrupt number for SWIM3 */
 	int	swim3_intr;	/* interrupt number for SWIM3 */
@@ -304,7 +306,6 @@ static void do_fd_request(request_queue_t * q)
 #endif /* CONFIG_PMAC_MEDIABAY */
 #endif /* CONFIG_PMAC_MEDIABAY */
 		start_request(&floppy_states[i]);
 		start_request(&floppy_states[i]);
 	}
 	}
-	sti();
 }
 }
 
 
 static void start_request(struct floppy_state *fs)
 static void start_request(struct floppy_state *fs)
@@ -370,7 +371,7 @@ static void set_timeout(struct floppy_state *fs, int nticks,
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 
 
-	save_flags(flags); cli();
+	spin_lock_irqsave(&fs->lock, flags);
 	if (fs->timeout_pending)
 	if (fs->timeout_pending)
 		del_timer(&fs->timeout);
 		del_timer(&fs->timeout);
 	fs->timeout.expires = jiffies + nticks;
 	fs->timeout.expires = jiffies + nticks;
@@ -378,7 +379,7 @@ static void set_timeout(struct floppy_state *fs, int nticks,
 	fs->timeout.data = (unsigned long) fs;
 	fs->timeout.data = (unsigned long) fs;
 	add_timer(&fs->timeout);
 	add_timer(&fs->timeout);
 	fs->timeout_pending = 1;
 	fs->timeout_pending = 1;
-	restore_flags(flags);
+	spin_unlock_irqrestore(&fs->lock, flags);
 }
 }
 
 
 static inline void scan_track(struct floppy_state *fs)
 static inline void scan_track(struct floppy_state *fs)
@@ -790,14 +791,13 @@ static int grab_drive(struct floppy_state *fs, enum swim_state state,
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 
 
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&fs->lock, flags);
 	if (fs->state != idle) {
 	if (fs->state != idle) {
 		++fs->wanted;
 		++fs->wanted;
 		while (fs->state != available) {
 		while (fs->state != available) {
 			if (interruptible && signal_pending(current)) {
 			if (interruptible && signal_pending(current)) {
 				--fs->wanted;
 				--fs->wanted;
-				restore_flags(flags);
+				spin_unlock_irqrestore(&fs->lock, flags);
 				return -EINTR;
 				return -EINTR;
 			}
 			}
 			interruptible_sleep_on(&fs->wait);
 			interruptible_sleep_on(&fs->wait);
@@ -805,7 +805,7 @@ static int grab_drive(struct floppy_state *fs, enum swim_state state,
 		--fs->wanted;
 		--fs->wanted;
 	}
 	}
 	fs->state = state;
 	fs->state = state;
-	restore_flags(flags);
+	spin_unlock_irqrestore(&fs->lock, flags);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -813,11 +813,10 @@ static void release_drive(struct floppy_state *fs)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 
 
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&fs->lock, flags);
 	fs->state = idle;
 	fs->state = idle;
 	start_request(fs);
 	start_request(fs);
-	restore_flags(flags);
+	spin_unlock_irqrestore(&fs->lock, flags);
 }
 }
 
 
 static int fd_eject(struct floppy_state *fs)
 static int fd_eject(struct floppy_state *fs)
@@ -1109,6 +1108,7 @@ static int swim3_add_device(struct device_node *swim)
 		pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1);
 		pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1);
 	
 	
 	memset(fs, 0, sizeof(*fs));
 	memset(fs, 0, sizeof(*fs));
+	spin_lock_init(&fs->lock);
 	fs->state = idle;
 	fs->state = idle;
 	fs->swim3 = (struct swim3 __iomem *)
 	fs->swim3 = (struct swim3 __iomem *)
 		ioremap(swim->addrs[0].address, 0x200);
 		ioremap(swim->addrs[0].address, 0x200);