aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/iseries
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2007-05-14 01:50:27 +1000
committerPaul Mackerras <paulus@samba.org>2007-05-17 21:11:13 +1000
commit9d561ed46ea33c223def2eb8e2b09ea108a4d70b (patch)
tree02a4d1ada9fbaa0e8bef7aae98f2e22f820cd160 /arch/powerpc/platforms/iseries
parent[POWERPC] Fix Kconfig undefined symbol 'IBM_NEW_EMAC_ZMII' (diff)
downloadlinux-dev-9d561ed46ea33c223def2eb8e2b09ea108a4d70b.tar.xz
linux-dev-9d561ed46ea33c223def2eb8e2b09ea108a4d70b.zip
[POWERPC] viopath: Use completion
Use a completion instead of abusing a semaphore for hypervisor event completion in viopath. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/iseries')
-rw-r--r--arch/powerpc/platforms/iseries/viopath.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/powerpc/platforms/iseries/viopath.c b/arch/powerpc/platforms/iseries/viopath.c
index 354b8dd2a2c1..7f58e5929a2c 100644
--- a/arch/powerpc/platforms/iseries/viopath.c
+++ b/arch/powerpc/platforms/iseries/viopath.c
@@ -37,6 +37,7 @@
#include <linux/wait.h>
#include <linux/seq_file.h>
#include <linux/interrupt.h>
+#include <linux/completion.h>
#include <asm/system.h>
#include <asm/uaccess.h>
@@ -115,7 +116,7 @@ static int proc_viopath_show(struct seq_file *m, void *v)
u16 vlanMap;
dma_addr_t handle;
HvLpEvent_Rc hvrc;
- DECLARE_MUTEX_LOCKED(Semaphore);
+ DECLARE_COMPLETION(done);
struct device_node *node;
const char *sysid;
@@ -132,13 +133,13 @@ static int proc_viopath_show(struct seq_file *m, void *v)
HvLpEvent_AckInd_DoAck, HvLpEvent_AckType_ImmediateAck,
viopath_sourceinst(viopath_hostLp),
viopath_targetinst(viopath_hostLp),
- (u64)(unsigned long)&Semaphore, VIOVERSION << 16,
+ (u64)(unsigned long)&done, VIOVERSION << 16,
((u64)handle) << 32, HW_PAGE_SIZE, 0, 0);
if (hvrc != HvLpEvent_Rc_Good)
printk(VIOPATH_KERN_WARN "hv error on op %d\n", (int)hvrc);
- down(&Semaphore);
+ wait_for_completion(&done);
vlanMap = HvLpConfig_getVirtualLanIndexMap();
@@ -353,7 +354,7 @@ static void handleConfig(struct HvLpEvent *event)
return;
}
- up((struct semaphore *)event->xCorrelationToken);
+ complete((struct completion *)event->xCorrelationToken);
}
/*