SDOCM00103043:Resolve Concerto IPC stress test failures
authorJudah Vang <judah@ti.com>
Fri, 20 Sep 2013 19:26:48 +0000 (12:26 -0700)
committerChris Ring <cring@ti.com>
Thu, 26 Sep 2013 00:41:41 +0000 (17:41 -0700)
packages/ti/sdo/ipc/family/f28m35x/NotifyDriverCirc.c
packages/ti/sdo/ipc/family/f28m35x/TransportCirc.c

index 3edbe7cb94b3dc9041293aab7bd962fe3179c4e5..2d83f26e6e8dd19fdc24b4e85efb1f5fc59fb79e 100644 (file)
@@ -366,11 +366,24 @@ Void NotifyDriverCirc_intSend()
 {
 #ifdef xdc_target__isaCompatible_v7M
     volatile UInt32 *set = (volatile UInt32 *)MTOCIPCSET;
+    volatile UInt32 *clear  = (volatile UInt32 *)MTOCIPCCLR;
 #else
     volatile UInt16 *set = (volatile UInt16 *)CTOMIPCSET;
+    volatile UInt32 *clear  = (volatile UInt32 *)CTOMIPCCLR;
 #endif
+    UInt hwiKey;
+
+    /* Make sure multiple threads are not hitting this at the same time */
+    hwiKey = Hwi_disable();
 
+    /* Make sure we get a leading edge... */
+    *clear  = 1 << IpcMgr_ipcSetFlag;
+
+    /* Signal the other side */
     *set = 1 << IpcMgr_ipcSetFlag;
+
+    /* Restore the interrupt line */
+    Hwi_restore(hwiKey);
 }
 
 /*
@@ -404,9 +417,6 @@ Void NotifyDriverCirc_isr(UArg arg)
     /* Make sure the NotifyDriverCirc_Object is not NULL */
     Assert_isTrue(obj != NULL, IpcMgr_A_internal);
 
-    /* Clear the remote interrupt */
-    NotifyDriverCirc_intClear();
-
     /* get the writeIndex and readIndex */
     writeIndex = obj->getWriteIndex[0];
     readIndex = obj->getReadIndex[0];
index a4799a987846179aede8cf13b5efd363d3b66530..c0138ae4f9bb9963d7d8c60177f4a14ffca1b3d2 100644 (file)
@@ -328,7 +328,14 @@ Void TransportCirc_swiFxn(UArg arg)
         buf = MessageQ_alloc(msg->heapId, msgSize);
 
         /* Make sure buf is not NULL */
-        Assert_isTrue(buf != NULL, IpcMgr_A_internal);
+        if (buf == NULL) {
+            TransportCirc_errFxn(TransportCirc_Reason_FAILEDALLOC,
+                ti_sdo_ipc_family_f28m35x_TransportCirc_Handle_upCast(obj),
+                NULL,
+                (UArg)msg);
+
+            return;
+        }
 
         /* copy the message to the buffer allocated, set the heap id */
         memcpy((Ptr)buf, (Ptr)msg, msgSize);