aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc
diff options
context:
space:
mode:
authorDwight Engen <dwight.engen@oracle.com>2014-12-11 12:26:16 -0500
committerDavid S. Miller <davem@davemloft.net>2014-12-11 21:52:45 -0500
commit1678c2bd131313b58c7492487c00dca982be7f28 (patch)
treeaa674d9f464626aab98183d17a00ad84bbd5c43f /arch/sparc
parentfe47c3c2623d6914655f507a317a6b881bc7c6a4 (diff)
sparc/ldc: create separate ldc_unbind from ldc_free
Signed-off-by: Dwight Engen <dwight.engen@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc')
-rw-r--r--arch/sparc/include/asm/ldc.h1
-rw-r--r--arch/sparc/kernel/ldc.c12
2 files changed, 10 insertions, 3 deletions
diff --git a/arch/sparc/include/asm/ldc.h b/arch/sparc/include/asm/ldc.h
index 58ab64de25d2..6e9004aa6f25 100644
--- a/arch/sparc/include/asm/ldc.h
+++ b/arch/sparc/include/asm/ldc.h
@@ -61,6 +61,7 @@ void ldc_free(struct ldc_channel *lp);
61 61
62/* Register TX and RX queues of the link with the hypervisor. */ 62/* Register TX and RX queues of the link with the hypervisor. */
63int ldc_bind(struct ldc_channel *lp); 63int ldc_bind(struct ldc_channel *lp);
64void ldc_unbind(struct ldc_channel *lp);
64 65
65/* For non-RAW protocols we need to complete a handshake before 66/* For non-RAW protocols we need to complete a handshake before
66 * communication can proceed. ldc_connect() does that, if the 67 * communication can proceed. ldc_connect() does that, if the
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c
index 4310332872d4..274a9f59d95c 100644
--- a/arch/sparc/kernel/ldc.c
+++ b/arch/sparc/kernel/ldc.c
@@ -1222,11 +1222,12 @@ out_err:
1222} 1222}
1223EXPORT_SYMBOL(ldc_alloc); 1223EXPORT_SYMBOL(ldc_alloc);
1224 1224
1225void ldc_free(struct ldc_channel *lp) 1225void ldc_unbind(struct ldc_channel *lp)
1226{ 1226{
1227 if (lp->flags & LDC_FLAG_REGISTERED_IRQS) { 1227 if (lp->flags & LDC_FLAG_REGISTERED_IRQS) {
1228 free_irq(lp->cfg.rx_irq, lp); 1228 free_irq(lp->cfg.rx_irq, lp);
1229 free_irq(lp->cfg.tx_irq, lp); 1229 free_irq(lp->cfg.tx_irq, lp);
1230 lp->flags &= ~LDC_FLAG_REGISTERED_IRQS;
1230 } 1231 }
1231 1232
1232 if (lp->flags & LDC_FLAG_REGISTERED_QUEUES) { 1233 if (lp->flags & LDC_FLAG_REGISTERED_QUEUES) {
@@ -1240,10 +1241,15 @@ void ldc_free(struct ldc_channel *lp)
1240 lp->flags &= ~LDC_FLAG_ALLOCED_QUEUES; 1241 lp->flags &= ~LDC_FLAG_ALLOCED_QUEUES;
1241 } 1242 }
1242 1243
1243 hlist_del(&lp->list); 1244 ldc_set_state(lp, LDC_STATE_INIT);
1245}
1246EXPORT_SYMBOL(ldc_unbind);
1244 1247
1248void ldc_free(struct ldc_channel *lp)
1249{
1250 ldc_unbind(lp);
1251 hlist_del(&lp->list);
1245 kfree(lp->mssbuf); 1252 kfree(lp->mssbuf);
1246
1247 ldc_iommu_release(lp); 1253 ldc_iommu_release(lp);
1248 1254
1249 kfree(lp); 1255 kfree(lp);