Index: /trunk/src/VBox/Devices/Audio/DevHda.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHda.cpp	(revision 88571)
+++ /trunk/src/VBox/Devices/Audio/DevHda.cpp	(revision 88572)
@@ -1301,5 +1301,5 @@
         if (pStreamShared->State.fRunning)
         {
-            int rc2 = hdaR3StreamEnable(pStreamShared, pStreamR3, false /* fEnable */);
+            int rc2 = hdaR3StreamEnable(pThis, pStreamShared, pStreamR3, false /* fEnable */);
             AssertRC(rc2); Assert(!pStreamShared->State.fRunning);
             pStreamShared->State.fRunning = false;
@@ -1380,5 +1380,5 @@
             {
                 /* Enable/disable the stream. */
-                rc2 = hdaR3StreamEnable(pStreamShared, pStreamR3, fRun /* fEnable */);
+                rc2 = hdaR3StreamEnable(pThis, pStreamShared, pStreamR3, fRun /* fEnable */);
                 AssertRC(rc2);
 
@@ -2518,5 +2518,5 @@
             /* Only disable the stream if the stream descriptor # has changed. */
             if (pSink->pStreamShared->u8SD != uSD)
-                hdaR3StreamEnable(pSink->pStreamShared, pSink->pStreamR3, false /*fEnable*/);
+                hdaR3StreamEnable(pThis, pSink->pStreamShared, pSink->pStreamR3, false /*fEnable*/);
 
             pSink->pStreamR3->pMixSink = NULL;
@@ -2766,5 +2766,5 @@
 
         /* We're doing this unconditionally, hope that's not problematic in any way... */
-        int rc = hdaR3StreamEnable(pStreamShared, &pThisCC->aStreams[idxStream], false /* fEnable */);
+        int rc = hdaR3StreamEnable(pThis, pStreamShared, &pThisCC->aStreams[idxStream], false /* fEnable */);
         AssertLogRelMsg(RT_SUCCESS(rc) && !pStreamShared->State.fRunning,
                         ("Disabling stream #%u failed: %Rrc, fRunning=%d\n", idxStream, rc, pStreamShared->State.fRunning));
@@ -3474,5 +3474,5 @@
 #endif
             /* (Re-)enable the stream. */
-            rc2 = hdaR3StreamEnable(pStreamShared, pStreamR3, true /* fEnable */);
+            rc2 = hdaR3StreamEnable(pThis, pStreamShared, pStreamR3, true /* fEnable */);
             AssertRC(rc2);
 
Index: /trunk/src/VBox/Devices/Audio/DevHdaStream.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHdaStream.cpp	(revision 88571)
+++ /trunk/src/VBox/Devices/Audio/DevHdaStream.cpp	(revision 88572)
@@ -885,9 +885,10 @@
  *
  * @returns VBox status code.
+ * @param   pThis               The shared HDA device state.
  * @param   pStreamShared       HDA stream to enable or disable - shared bits.
  * @param   pStreamR3           HDA stream to enable or disable - ring-3 bits.
  * @param   fEnable             Whether to enable or disble the stream.
  */
-int hdaR3StreamEnable(PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, bool fEnable)
+int hdaR3StreamEnable(PHDASTATE pThis, PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, bool fEnable)
 {
     AssertPtr(pStreamR3);
@@ -942,4 +943,16 @@
             pStreamShared->State.tsTransferLast = 0; /* Make sure it's not stale and messes up WALCLK calculations. */
         pStreamShared->State.fRunning = fEnable;
+
+        /*
+         * Set the FIFORDY bit when we start running and clear it when stopping.
+         *
+         * This prevents Linux from timing out in snd_hdac_stream_sync when starting
+         * a stream.  Technically, Linux also uses the SSYNC feature there, but we
+         * can get away with just setting the FIFORDY bit for now.
+         */
+        if (fEnable)
+            HDA_STREAM_REG(pThis, STS, pStreamShared->u8SD) |= HDA_SDSTS_FIFORDY;
+        else
+            HDA_STREAM_REG(pThis, STS, pStreamShared->u8SD) &= ~HDA_SDSTS_FIFORDY;
     }
 
@@ -1204,14 +1217,4 @@
     pStreamShared->State.tsLastTransferNs = tsNowNs;
 
-    /*
-     * Set the FIFORDY bit on the stream while doing the transfer.
-     */
-    /** @todo r=bird: I don't get the HDA_SDSTS_FIFORDY logic.  Unless we're
-     *        assuming SMP guest and that it can get stream registers while we're
-     *        here.  Only it cannot do the later because we're sitting on the big
-     *        HDA device lock, see assertions in hdaR3Timer().  So, this is an
-     *        pointless guesture given that we clear it again after the loop. */
-    HDA_STREAM_REG(pThis, STS, uSD) |= HDA_SDSTS_FIFORDY;
-
     return true;
 }
@@ -1221,15 +1224,9 @@
  *
  * @param   pDevIns         The device instance.
- * @param   pThis           The shared HDA device state.
  * @param   pStreamShared   The HDA stream (shared).
  * @param   pStreamR3       The HDA stream (ring-3).
  */
-DECLINLINE(void) hdaR3StreamDoDmaEpilogue(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3)
-{
-    /*
-     * Clear the (pointless) FIFORDY bit again.
-     */
-    HDA_STREAM_REG(pThis, STS, pStreamShared->u8SD) &= ~HDA_SDSTS_FIFORDY;
-
+DECLINLINE(void) hdaR3StreamDoDmaEpilogue(PPDMDEVINS pDevIns, PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3)
+{
     /*
      * We must update this in the epilogue rather than in the prologue
@@ -1525,5 +1522,5 @@
      * Common epilogue.
      */
-    hdaR3StreamDoDmaEpilogue(pDevIns, pThis, pStreamShared, pStreamR3);
+    hdaR3StreamDoDmaEpilogue(pDevIns, pStreamShared, pStreamR3);
 
     /*
@@ -1812,5 +1809,5 @@
      * Common epilogue.
      */
-    hdaR3StreamDoDmaEpilogue(pDevIns, pThis, pStreamShared, pStreamR3);
+    hdaR3StreamDoDmaEpilogue(pDevIns, pStreamShared, pStreamR3);
 
     /*
Index: /trunk/src/VBox/Devices/Audio/DevHdaStream.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHdaStream.h	(revision 88571)
+++ /trunk/src/VBox/Devices/Audio/DevHdaStream.h	(revision 88572)
@@ -354,5 +354,5 @@
 void                hdaR3StreamReset(PHDASTATE pThis, PHDASTATER3 pThisCC,
                                      PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, uint8_t uSD);
-int                 hdaR3StreamEnable(PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, bool fEnable);
+int                 hdaR3StreamEnable(PHDASTATE pThis, PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, bool fEnable);
 void                hdaR3StreamMarkStarted(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTREAM pStreamShared, uint64_t tsNow);
 void                hdaR3StreamMarkStopped(PHDASTREAM pStreamShared);
