linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] sym53c416 2.5-bk cli() replacement
@ 2002-09-23 23:40 Bjoern A. Zeeb
  0 siblings, 0 replies; only message in thread
From: Bjoern A. Zeeb @ 2002-09-23 23:40 UTC (permalink / raw)
  To: linux-kernel; +Cc: patch

Hi,

tried to remove cli() from sym53c416 driver. please review. Patch
should cleanly apply against latest BK-2.5.


--- linux-20020923-211332/drivers/scsi/sym53c416.c.orig	Mon Sep 23 23:10:59 2002
+++ linux-20020923-211332/drivers/scsi/sym53c416.c	Mon Sep 23 22:18:32 2002
@@ -180,6 +180,8 @@
 #define READ_TIMEOUT              150
 #define WRITE_TIMEOUT             150

+#define SG_ADDRESS(buffer)	((char *) (page_address((buffer)->page)+(buffer)->offset))
+
 #ifdef MODULE

 #define sym53c416_base sym53c416
@@ -246,6 +248,8 @@
 	outb((len & 0xFF0000) >> 16, base + TC_HIGH);
 }

+static spinlock_t sym53c416_lock = SPIN_LOCK_UNLOCKED;
+
 /* Returns the number of bytes read */
 static __inline__ unsigned int sym53c416_read(int base, unsigned char *buffer, unsigned int len)
 {
@@ -256,8 +260,7 @@
 	int timeout = READ_TIMEOUT;

 	/* Do transfer */
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&sym53c416_lock, flags);
 	while(len && timeout)
 	{
 		bytes_left = inb(base + PIO_FIFO_CNT); /* Number of bytes in the PIO FIFO */
@@ -276,17 +279,16 @@
 		else
 		{
 			i = jiffies + timeout;
-			restore_flags(flags);
+			spin_unlock_irqrestore(&sym53c416_lock, flags);
 			while(jiffies < i && (inb(base + PIO_INT_REG) & EMPTY) && timeout)
 				if(inb(base + PIO_INT_REG) & SCI)
 					timeout = 0;
-			save_flags(flags);
-			cli();
+			spin_lock_irqsave(&sym53c416_lock, flags);
 			if(inb(base + PIO_INT_REG) & EMPTY)
 				timeout = 0;
 		}
 	}
-	restore_flags(flags);
+	spin_unlock_irqrestore(&sym53c416_lock, flags);
 	return orig_len - len;
 }

@@ -300,8 +302,7 @@
 	unsigned int timeout = WRITE_TIMEOUT;

 	/* Do transfer */
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&sym53c416_lock, flags);
 	while(len && timeout)
 	{
 		bufferfree = PIO_SIZE - inb(base + PIO_FIFO_CNT);
@@ -322,16 +323,15 @@
 		else
 		{
 			i = jiffies + timeout;
-			restore_flags(flags);
+			spin_unlock_irqrestore(&sym53c416_lock, flags);
 			while(jiffies < i && (inb(base + PIO_INT_REG) & FULL) && timeout)
 				;
-			save_flags(flags);
-			cli();
+			spin_lock_irqsave(&sym53c416_lock, flags);
 			if(inb(base + PIO_INT_REG) & FULL)
 				timeout = 0;
 		}
 	}
-	restore_flags(flags);
+	spin_unlock_irqrestore(&sym53c416_lock, flags);
 	return orig_len - len;
 }

@@ -449,7 +449,7 @@
 					sglist = current_command->request_buffer;
 					while(sgcount--)
 					{
-						tot_trans += sym53c416_write(base, sglist->address, sglist->length);
+						tot_trans += sym53c416_write(base, SG_ADDRESS(sglist), sglist->length);
 						sglist++;
 					}
 				}
@@ -475,7 +475,7 @@
 					sglist = current_command->request_buffer;
 					while(sgcount--)
 					{
-						tot_trans += sym53c416_read(base, sglist->address, sglist->length);
+						tot_trans += sym53c416_read(base, SG_ADDRESS(sglist), sglist->length);
 						sglist++;
 					}
 				}
@@ -716,13 +716,12 @@
 				shpnt = scsi_register(tpnt, 0);
 				if(shpnt==NULL)
 					continue;
-				save_flags(flags);
-				cli();
+				spin_lock_irqsave(&sym53c416_lock, flags);
 				/* FIXME: Request_irq with CLI is not safe */
 				/* Request for specified IRQ */
 				if(request_irq(hosts[i].irq, sym53c416_intr_handle, 0, ID, shpnt))
 				{
-					restore_flags(flags);
+					spin_unlock_irqrestore(&sym53c416_lock, flags);
 					printk(KERN_ERR "sym53c416: Unable to assign IRQ %d\n", hosts[i].irq);
 					scsi_unregister(shpnt);
 				}
@@ -737,7 +736,7 @@
 					shpnt->this_id = hosts[i].scsi_id;
 					sym53c416_init(hosts[i].base, hosts[i].scsi_id);
 					count++;
-					restore_flags(flags);
+					spin_unlock_irqrestore(&sym53c416_lock, flags);
 				}
 			}
 		}
@@ -774,8 +773,7 @@
 	current_command->SCp.Status = 0;
 	current_command->SCp.Message = 0;

-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&sym53c416_lock, flags);
 	outb(SCpnt->target, base + DEST_BUS_ID); /* Set scsi id target        */
 	outb(FLUSH_FIFO, base + COMMAND_REG);    /* Flush SCSI and PIO FIFO's */
 	/* Write SCSI command into the SCSI fifo */
@@ -784,7 +782,7 @@
 	/* Start selection sequence */
 	outb(SEL_WITHOUT_ATN_SEQ, base + COMMAND_REG);
 	/* Now an interrupt will be generated which we will catch in out interrupt routine */
-	restore_flags(flags);
+	spin_unlock_irqrestore(&sym53c416_lock, flags);
 	return 0;
 }


-- 
Greetings

Bjoern A. Zeeb				bzeeb at Zabbadoz dot NeT
56 69 73 69 74				http://www.zabbadoz.net/


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-09-23 23:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-09-23 23:40 [PATCH] sym53c416 2.5-bk cli() replacement Bjoern A. Zeeb

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).