Index: /trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/include/vci_cc_vcache_wrapper2_v1.h
===================================================================
--- /trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/include/vci_cc_vcache_wrapper2_v1.h	(revision 67)
+++ /trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/include/vci_cc_vcache_wrapper2_v1.h	(revision 68)
@@ -114,20 +114,19 @@
         DCACHE_SC_DIRTY_WAIT,       // 19
         DCACHE_WRITE_UPDT,          // 1a
-        DCACHE_WRITE_DIRTY,         // 1b
-        DCACHE_WRITE_REQ,           // 1c
-        DCACHE_MISS_WAIT,           // 1d
-        DCACHE_MISS_UPDT,           // 1e
-        DCACHE_UNC_WAIT,            // 1f
-        DCACHE_ERROR,               // 20
-        DCACHE_ITLB_READ,           // 21
-        DCACHE_ITLB_UPDT,           // 22
-        DCACHE_ITLB_LL_WAIT,        // 23
-        DCACHE_ITLB_SC_WAIT,        // 24
-        DCACHE_CC_CHECK,            // 25
-        DCACHE_CC_INVAL,            // 26
-        DCACHE_CC_UPDT,             // 27
-        DCACHE_CC_NOP,              // 28
-        DCACHE_TLB_CC_INVAL,        // 29
-        DCACHE_ITLB_CLEANUP,        // 2a
+        DCACHE_WRITE_REQ,           // 1b
+        DCACHE_MISS_WAIT,           // 1c
+        DCACHE_MISS_UPDT,           // 1d
+        DCACHE_UNC_WAIT,            // 1e
+        DCACHE_ERROR,               // 1f
+        DCACHE_ITLB_READ,           // 20
+        DCACHE_ITLB_UPDT,           // 21
+        DCACHE_ITLB_LL_WAIT,        // 22
+        DCACHE_ITLB_SC_WAIT,        // 23
+        DCACHE_CC_CHECK,            // 24
+        DCACHE_CC_INVAL,            // 25
+        DCACHE_CC_UPDT,             // 26
+        DCACHE_CC_NOP,              // 27
+        DCACHE_TLB_CC_INVAL,        // 28
+        DCACHE_ITLB_CLEANUP,        // 29
     };
 
Index: /trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp
===================================================================
--- /trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp	(revision 67)
+++ /trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp	(revision 68)
@@ -85,5 +85,4 @@
 	"DCACHE_SC_DIRTY_WAIT",
         "DCACHE_WRITE_UPDT", 
-        "DCACHE_WRITE_DIRTY",
         "DCACHE_WRITE_REQ",  
         "DCACHE_MISS_WAIT",  
@@ -3057,5 +3056,9 @@
 		else
 		{
-	            r_dcache_fsm = DCACHE_WRITE_DIRTY; 
+	            /*
+		     * SC succeeded, but has updated the cache and
+		     * invalidated the TLB entry. Redo the translation
+		     */
+		    r_dcache_fsm = DCACHE_IDLE;
 		}
 	    }
@@ -4482,39 +4485,4 @@
         break;
     }
-    ////////////////////////
-    case DCACHE_WRITE_DIRTY:
-    {
-	m_cost_data_tlb_update_dirty_frz++;
-
-        // external cache invalidate request
-        if ( r_tgt_dcache_req ) 
-        {
-            r_dcache_fsm = DCACHE_CC_CHECK;
-            r_dcache_fsm_save = r_dcache_fsm;
-            break;
-        }
-
-        if ( r_dcache_inval_tlb_rsp ) // Miss read response and tlb invalidation
-        {
-            r_dcache_fsm = DCACHE_IDLE;
-            r_dcache_inval_tlb_rsp = false;
-	    break;
-        }
-
-	if ( r_dcache_inval_rsp ) // TLB miss response and cache invalidation
-	{
-            r_dcache_fsm = DCACHE_IDLE; 
-            r_dcache_inval_rsp = false;
-	    break;	    
-	}
-
-	m_cpt_dcache_data_write++; 
-        r_dcache.write(r_dcache_tlb_paddr, r_dcache_pte_update);
-        dcache_tlb.setdirty(r_dcache_tlb_way_save, r_dcache_tlb_set_save);
-        r_dcache_fsm = DCACHE_WRITE_REQ;
-        drsp.valid = true;
-        drsp.rdata = 0;
-        break;
-    }
     /////////////////
     case DCACHE_ERROR:
@@ -4758,5 +4726,5 @@
         }
 
-	// DCACHE_TLB1_LL_WAIT  DCACHE_TLB1_SC_WAIT  DCACHE_LL_DIRTY_WAIT  DCACHE_WRITE_DIRTY DCACHE_ITLB_LL_WAIT  DCACHE_ITLB_SC_WAIT
+	// DCACHE_TLB1_LL_WAIT  DCACHE_TLB1_SC_WAIT  DCACHE_LL_DIRTY_WAIT  DCACHE_ITLB_LL_WAIT  DCACHE_ITLB_SC_WAIT
 	// DCACHE_TLB2_LL_WAIT  DCACHE_TLB2_SC_WAIT  DCACHE_SC_DIRTY_WAIT
         if((( /*( r_dcache_fsm_save == DCACHE_UNC_WAIT ) ||*/
@@ -4768,6 +4736,5 @@
 	     ( r_dcache_fsm_save == DCACHE_TLB1_LL_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_LL_WAIT )   ||
 	     ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )   ||
-	     ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )  || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )  ||
-	     ( r_dcache_fsm_save == DCACHE_WRITE_DIRTY )*/ ) && 
+	     ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )  || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )  */ ) && 
            ( (r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) ) 
         || (( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) || ( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) /*||
@@ -4775,4 +4742,10 @@
            ( (r_icache_paddr_save.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) ) ) 
         {
+	    data_t dcache_rdata = 0;
+	    size_t way = 0;
+	    size_t set = 0;
+	    bool dcache_hit = r_dcache.read(r_tgt_addr.read(), &dcache_rdata, way, &set);;
+	    assert(!dcache_hit && "ignored update req should not be in dcache");
+
             r_dcache_inval_rsp = true;
             r_tgt_dcache_req = false;
@@ -4941,6 +4914,5 @@
              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )        ||
              ( r_dcache_fsm_save == DCACHE_DTLB1_READ_CACHE ) || ( r_dcache_fsm_save == DCACHE_DTLB2_READ_CACHE ) ||
-             ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )    || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )    ||
-	     ( r_dcache_fsm_save == DCACHE_WRITE_DIRTY )) && 
+             ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )    || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT ) ) && 
             (((r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) >> (uint32_log2(m_dcache_words) + 2)) == r_dcache_dtlb_inval_line.read()) ) 
         {
