Index: c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h
===================================================================
--- c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h	(revision 57e1f4c30b7e652b7f45fe6e35af2b55bfc140c9)
+++ c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h	(revision 9cb7e5d80ff4db2db02ff198b998e662d20070eb)
@@ -488,5 +488,5 @@
 #define GRSPW_OP_AND 0
 #define GRSPW_OP_OR 1
-/* Block until ready_cnt or fewer packets are Queued in "Send and Scheduled" Q,
+/* Block until send_cnt or fewer packets are Queued in "Send and Scheduled" Q,
  * op (AND or OR), sent_cnt or more packet "have been sent" (Sent Q) condition
  * is met.
@@ -505,4 +505,5 @@
  *  1    DMA stopped
  *  2    Timeout, conditions are not met
+ *  3    Another task is already waiting. Service is Busy.
  */
 extern int grspw_dma_tx_wait(void *c, int send_cnt, int op, int sent_cnt, int timeout);
@@ -566,5 +567,5 @@
  * until the condition is satisfied.
  *
- * NOTE: if IRQ of TX descriptors are not enabled conditions are never
+ * NOTE: if IRQ of RX descriptors are not enabled conditions are never
  *       checked, this may hang infinitely unless a timeout has been specified
  *
@@ -574,4 +575,5 @@
  *  1    DMA stopped
  *  2    Timeout, conditions are not met
+ *  3    Another task is already waiting. Service is Busy.
  */
 extern int grspw_dma_rx_wait(void *c, int recv_cnt, int op, int ready_cnt, int timeout);
Index: c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c
===================================================================
--- c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c	(revision 57e1f4c30b7e652b7f45fe6e35af2b55bfc140c9)
+++ c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c	(revision 9cb7e5d80ff4db2db02ff198b998e662d20070eb)
@@ -1927,5 +1927,5 @@
 {
 	struct grspw_dma_priv *dma = c;
-	int ret, rc;
+	int ret, rc, initialized = 0;
 
 	if (timeout == 0)
@@ -1942,13 +1942,13 @@
 	 * one waiter at a time.
 	 */
-	if (dma->tx_wait.waiting) {
-		ret = -1;
-		goto out;
-	}
-
-	/* Stop if link error or similar, abort */
+	if (initialized == 0 && dma->tx_wait.waiting) {
+		ret = 3;
+		goto out_release;
+	}
+
+	/* Stop if link error or similar (DMA stopped), abort */
 	if (dma->started == 0) {
 		ret = 1;
-		goto out;
+		goto out_release;
 	}
 
@@ -1960,4 +1960,5 @@
 	if (grspw_tx_wait_eval(dma) == 0) {
 		/* Prepare Wait */
+		initialized = 1;
 		dma->tx_wait.waiting = 1;
 
@@ -1971,25 +1972,32 @@
 						timeout);
 		if (rc == RTEMS_TIMEOUT) {
-			dma->tx_wait.waiting = 0;
-			return 2;
+			ret = 2;
+			goto out;
 		} else if (rc == RTEMS_UNSATISFIED ||
 		           rc == RTEMS_OBJECT_WAS_DELETED) {
-			dma->tx_wait.waiting = 0;
-			return 1; /* sem was flushed/deleted, means DMA stop */
-		} else if (rc != RTEMS_SUCCESSFUL)
-		    	return -1;
+			ret = 1; /* sem was flushed/deleted, means DMA stop */
+			goto out;
+		} else if (rc != RTEMS_SUCCESSFUL) {
+			/* Unknown Error */
+			ret = -1;
+			goto out;
+		} else if (dma->started == 0) {
+			ret = 1;
+			goto out;
+		}
 
 		/* Check condition once more */
 		goto check_condition;
-	} else {
-		/* No Wait needed */
-		dma->tx_wait.waiting = 0;
 	}
 
 	ret = 0;
-out:
+
+out_release:
 	/* Unlock DMA channel */
 	rtems_semaphore_release(dma->sem_dma);
 
+out:
+	if (initialized)
+		dma->tx_wait.waiting = 0;
 	return ret;
 }
@@ -2133,5 +2141,5 @@
 {
 	struct grspw_dma_priv *dma = c;
-	int ret, rc;
+	int ret, rc, initialized = 0;
 
 	if (timeout == 0)
@@ -2148,13 +2156,13 @@
 	 * one waiter at a time.
 	 */
-	if (dma->rx_wait.waiting) {
-		ret = -1;
-		goto out;
-	}
-
-	/* Stop if link error or similar (MDA stopped) */
+	if (initialized == 0 && dma->rx_wait.waiting) {
+		ret = 3;
+		goto out_release;
+	}
+
+	/* Stop if link error or similar (DMA stopped), abort */
 	if (dma->started == 0) {
 		ret = 1;
-		goto out;
+		goto out_release;
 	}
 
@@ -2166,4 +2174,5 @@
 	if (grspw_rx_wait_eval(dma) == 0) {
 		/* Prepare Wait */
+		initialized = 1;
 		dma->rx_wait.waiting = 1;
 
@@ -2177,25 +2186,32 @@
 		                           timeout);
 		if (rc == RTEMS_TIMEOUT) {
-			dma->rx_wait.waiting = 0;
-			return 2;
+		    	ret = 2;
+			goto out;
 		} else if (rc == RTEMS_UNSATISFIED ||
 		           rc == RTEMS_OBJECT_WAS_DELETED) {
-			dma->rx_wait.waiting = 0;
-			return 1; /* sem was flushed/deleted, means DMA stop */
-		} else if (rc != RTEMS_SUCCESSFUL)
-		    	return -1;
+			ret = 1; /* sem was flushed/deleted, means DMA stop */
+			goto out;
+		} else if (rc != RTEMS_SUCCESSFUL) {
+		    	/* Unknown Error */
+			ret = -1;
+			goto out;
+		} else if (dma->started == 0) {
+			ret = 1;
+			goto out;
+		}
 
 		/* Check condition once more */
 		goto check_condition;
-	} else {
-		/* No Wait needed */
-		dma->rx_wait.waiting = 0;
-	}
+	}
+
 	ret = 0;
 
-out:
+out_release:
 	/* Unlock DMA channel */
 	rtems_semaphore_release(dma->sem_dma);
 
+out:
+	if (initialized)
+		dma->rx_wait.waiting = 0;
 	return ret;
 }
@@ -2399,6 +2415,6 @@
 
 	/* Link is down for some reason, and the user has configured
-	 * that we stop all DMA channels and throw out all blocked
-	 * threads.
+	 * that we stop all (open) DMA channels and throw out all their
+	 * blocked threads.
 	 */
 	for (i=0; i<priv->hwsup.ndma_chans; i++)
@@ -2422,4 +2438,8 @@
 	    != RTEMS_SUCCESSFUL)
 		return;
+
+	/* If closing DMA channel or just shut down */
+	if (dma->started == 0)
+		goto out;
 
 	/* Look at cause we were woken up and clear source */
@@ -2449,9 +2469,6 @@
 		 	 * task is fullfilled.
 			 */
-			if (dma->rx_wait.waiting) {
+			if (dma->rx_wait.waiting)
 				rx_cond_true = grspw_rx_wait_eval(dma);
-				if (rx_cond_true)
-					dma->rx_wait.waiting = 0;
-			}
 		}
 		if (ctrl & GRSPW_DMACTRL_PS) {
@@ -2460,13 +2477,11 @@
 			grspw_tx_process_scheduled(dma);
 			dma->stats.tx_work_enabled += grspw_tx_schedule_send(dma);
-			if (dma->tx_wait.waiting) {
+			if (dma->tx_wait.waiting)
 				tx_cond_true = grspw_tx_wait_eval(dma);
-				if (tx_cond_true)
-					dma->tx_wait.waiting = 0;
-			}
 		}
 	} else
 		SPIN_UNLOCK_IRQ(&priv->devlock, irqflags);
 
+out:
 	/* Release lock */
 	rtems_semaphore_release(dma->sem_dma);
