Commit bc127d93 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Martin K. Petersen

scsi: aacraid: change event_wait to a completion

The event_wait semaphore has completion semantics, so we can
change it over to the completion interface for clarity without
changing the behavior.
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: default avatarDave Carroll <david.carroll@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent dc71eccc
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#define nblank(x) _nblank(x)[0] #define nblank(x) _nblank(x)[0]
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/completion.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
...@@ -1313,7 +1314,7 @@ struct fib { ...@@ -1313,7 +1314,7 @@ struct fib {
* This is the event the sendfib routine will wait on if the * This is the event the sendfib routine will wait on if the
* caller did not pass one and this is synch io. * caller did not pass one and this is synch io.
*/ */
struct semaphore event_wait; struct completion event_wait;
spinlock_t event_lock; spinlock_t event_lock;
u32 done; /* gets set to 1 when fib is complete */ u32 done; /* gets set to 1 when fib is complete */
......
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/delay.h> /* ssleep prototype */ #include <linux/delay.h> /* ssleep prototype */
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/semaphore.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
......
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/semaphore.h>
#include <linux/bcd.h> #include <linux/bcd.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
...@@ -189,7 +188,7 @@ int aac_fib_setup(struct aac_dev * dev) ...@@ -189,7 +188,7 @@ int aac_fib_setup(struct aac_dev * dev)
fibptr->hw_fib_va = hw_fib; fibptr->hw_fib_va = hw_fib;
fibptr->data = (void *) fibptr->hw_fib_va->data; fibptr->data = (void *) fibptr->hw_fib_va->data;
fibptr->next = fibptr+1; /* Forward chain the fibs */ fibptr->next = fibptr+1; /* Forward chain the fibs */
sema_init(&fibptr->event_wait, 0); init_completion(&fibptr->event_wait);
spin_lock_init(&fibptr->event_lock); spin_lock_init(&fibptr->event_lock);
hw_fib->header.XferState = cpu_to_le32(0xffffffff); hw_fib->header.XferState = cpu_to_le32(0xffffffff);
hw_fib->header.SenderSize = hw_fib->header.SenderSize =
...@@ -623,7 +622,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, ...@@ -623,7 +622,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
} }
if (wait) { if (wait) {
fibptr->flags |= FIB_CONTEXT_FLAG_WAIT; fibptr->flags |= FIB_CONTEXT_FLAG_WAIT;
if (down_interruptible(&fibptr->event_wait)) { if (wait_for_completion_interruptible(&fibptr->event_wait)) {
fibptr->flags &= ~FIB_CONTEXT_FLAG_WAIT; fibptr->flags &= ~FIB_CONTEXT_FLAG_WAIT;
return -EFAULT; return -EFAULT;
} }
...@@ -659,7 +658,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, ...@@ -659,7 +658,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
* hardware failure has occurred. * hardware failure has occurred.
*/ */
unsigned long timeout = jiffies + (180 * HZ); /* 3 minutes */ unsigned long timeout = jiffies + (180 * HZ); /* 3 minutes */
while (down_trylock(&fibptr->event_wait)) { while (!try_wait_for_completion(&fibptr->event_wait)) {
int blink; int blink;
if (time_is_before_eq_jiffies(timeout)) { if (time_is_before_eq_jiffies(timeout)) {
struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue]; struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue];
...@@ -689,9 +688,9 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, ...@@ -689,9 +688,9 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
*/ */
schedule(); schedule();
} }
} else if (down_interruptible(&fibptr->event_wait)) { } else if (wait_for_completion_interruptible(&fibptr->event_wait)) {
/* Do nothing ... satisfy /* Do nothing ... satisfy
* down_interruptible must_check */ * wait_for_completion_interruptible must_check */
} }
spin_lock_irqsave(&fibptr->event_lock, flags); spin_lock_irqsave(&fibptr->event_lock, flags);
...@@ -777,7 +776,7 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback, ...@@ -777,7 +776,7 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback,
return -EFAULT; return -EFAULT;
fibptr->flags |= FIB_CONTEXT_FLAG_WAIT; fibptr->flags |= FIB_CONTEXT_FLAG_WAIT;
if (down_interruptible(&fibptr->event_wait)) if (wait_for_completion_interruptible(&fibptr->event_wait))
fibptr->done = 2; fibptr->done = 2;
fibptr->flags &= ~(FIB_CONTEXT_FLAG_WAIT); fibptr->flags &= ~(FIB_CONTEXT_FLAG_WAIT);
...@@ -1538,7 +1537,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type) ...@@ -1538,7 +1537,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
|| fib->flags & FIB_CONTEXT_FLAG_WAIT) { || fib->flags & FIB_CONTEXT_FLAG_WAIT) {
unsigned long flagv; unsigned long flagv;
spin_lock_irqsave(&fib->event_lock, flagv); spin_lock_irqsave(&fib->event_lock, flagv);
up(&fib->event_wait); complete(&fib->event_wait);
spin_unlock_irqrestore(&fib->event_lock, flagv); spin_unlock_irqrestore(&fib->event_lock, flagv);
schedule(); schedule();
retval = 0; retval = 0;
......
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/semaphore.h>
#include "aacraid.h" #include "aacraid.h"
...@@ -129,7 +128,7 @@ unsigned int aac_response_normal(struct aac_queue * q) ...@@ -129,7 +128,7 @@ unsigned int aac_response_normal(struct aac_queue * q)
spin_lock_irqsave(&fib->event_lock, flagv); spin_lock_irqsave(&fib->event_lock, flagv);
if (!fib->done) { if (!fib->done) {
fib->done = 1; fib->done = 1;
up(&fib->event_wait); complete(&fib->event_wait);
} }
spin_unlock_irqrestore(&fib->event_lock, flagv); spin_unlock_irqrestore(&fib->event_lock, flagv);
...@@ -376,16 +375,16 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif, ...@@ -376,16 +375,16 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif,
start_callback = 1; start_callback = 1;
} else { } else {
unsigned long flagv; unsigned long flagv;
int complete = 0; int completed = 0;
dprintk((KERN_INFO "event_wait up\n")); dprintk((KERN_INFO "event_wait up\n"));
spin_lock_irqsave(&fib->event_lock, flagv); spin_lock_irqsave(&fib->event_lock, flagv);
if (fib->done == 2) { if (fib->done == 2) {
fib->done = 1; fib->done = 1;
complete = 1; completed = 1;
} else { } else {
fib->done = 1; fib->done = 1;
up(&fib->event_wait); complete(&fib->event_wait);
} }
spin_unlock_irqrestore(&fib->event_lock, flagv); spin_unlock_irqrestore(&fib->event_lock, flagv);
...@@ -395,7 +394,7 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif, ...@@ -395,7 +394,7 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif,
mflags); mflags);
FIB_COUNTER_INCREMENT(aac_config.NativeRecved); FIB_COUNTER_INCREMENT(aac_config.NativeRecved);
if (complete) if (completed)
aac_fib_complete(fib); aac_fib_complete(fib);
} }
} else { } else {
...@@ -428,16 +427,16 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif, ...@@ -428,16 +427,16 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif,
start_callback = 1; start_callback = 1;
} else { } else {
unsigned long flagv; unsigned long flagv;
int complete = 0; int completed = 0;
dprintk((KERN_INFO "event_wait up\n")); dprintk((KERN_INFO "event_wait up\n"));
spin_lock_irqsave(&fib->event_lock, flagv); spin_lock_irqsave(&fib->event_lock, flagv);
if (fib->done == 2) { if (fib->done == 2) {
fib->done = 1; fib->done = 1;
complete = 1; completed = 1;
} else { } else {
fib->done = 1; fib->done = 1;
up(&fib->event_wait); complete(&fib->event_wait);
} }
spin_unlock_irqrestore(&fib->event_lock, flagv); spin_unlock_irqrestore(&fib->event_lock, flagv);
...@@ -447,7 +446,7 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif, ...@@ -447,7 +446,7 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif,
mflags); mflags);
FIB_COUNTER_INCREMENT(aac_config.NormalRecved); FIB_COUNTER_INCREMENT(aac_config.NormalRecved);
if (complete) if (completed)
aac_fib_complete(fib); aac_fib_complete(fib);
} }
} }
......
...@@ -1560,7 +1560,7 @@ static void __aac_shutdown(struct aac_dev * aac) ...@@ -1560,7 +1560,7 @@ static void __aac_shutdown(struct aac_dev * aac)
struct fib *fib = &aac->fibs[i]; struct fib *fib = &aac->fibs[i];
if (!(fib->hw_fib_va->header.XferState & cpu_to_le32(NoResponseExpected | Async)) && if (!(fib->hw_fib_va->header.XferState & cpu_to_le32(NoResponseExpected | Async)) &&
(fib->hw_fib_va->header.XferState & cpu_to_le32(ResponseExpected))) (fib->hw_fib_va->header.XferState & cpu_to_le32(ResponseExpected)))
up(&fib->event_wait); complete(&fib->event_wait);
} }
kthread_stop(aac->thread); kthread_stop(aac->thread);
aac->thread = NULL; aac->thread = NULL;
......
...@@ -106,7 +106,7 @@ static irqreturn_t aac_src_intr_message(int irq, void *dev_id) ...@@ -106,7 +106,7 @@ static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
spin_lock_irqsave(&dev->sync_fib->event_lock, sflags); spin_lock_irqsave(&dev->sync_fib->event_lock, sflags);
if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) { if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) {
dev->management_fib_count--; dev->management_fib_count--;
up(&dev->sync_fib->event_wait); complete(&dev->sync_fib->event_wait);
} }
spin_unlock_irqrestore(&dev->sync_fib->event_lock, spin_unlock_irqrestore(&dev->sync_fib->event_lock,
sflags); sflags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment