[haiku-commits] r42575 - haiku/trunk/src/add-ons/kernel/busses/usb

  • From: korli@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 4 Aug 2011 23:52:03 +0200 (CEST)

Author: korli
Date: 2011-08-04 23:52:03 +0200 (Thu, 04 Aug 2011)
New Revision: 42575
Changeset: https://dev.haiku-os.org/changeset/42575

Modified:
   haiku/trunk/src/add-ons/kernel/busses/usb/ehci.cpp
Log:
use locking when messing ITD and SITD queues. itd->prev was becoming NULL, thus 
leading to KDL.


Modified: haiku/trunk/src/add-ons/kernel/busses/usb/ehci.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/busses/usb/ehci.cpp  2011-08-04 17:49:45 UTC 
(rev 42574)
+++ haiku/trunk/src/add-ons/kernel/busses/usb/ehci.cpp  2011-08-04 21:52:03 UTC 
(rev 42575)
@@ -2243,6 +2243,7 @@
 void
 EHCI::LinkITDescriptors(ehci_itd *itd, ehci_itd **_last)
 {
+       LockIsochronous();
        ehci_itd *last = *_last;
        itd->next_phy = last->next_phy;
        itd->next = NULL;
@@ -2250,12 +2251,14 @@
        last->next = itd;
        last->next_phy = itd->this_phy;
        *_last = itd;
+       UnlockIsochronous();
 }
 
 
 void
 EHCI::LinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **_last)
 {
+       LockIsochronous();
        ehci_sitd *last = *_last;
        sitd->next_phy = last->next_phy;
        sitd->next = NULL;
@@ -2263,29 +2266,34 @@
        last->next = sitd;
        last->next_phy = sitd->this_phy;
        *_last = sitd;
+       UnlockIsochronous();
 }
 
 void
 EHCI::UnlinkITDescriptors(ehci_itd *itd, ehci_itd **last)
 {
+       LockIsochronous();
        itd->prev->next_phy = itd->next_phy;
        itd->prev->next = itd->next;
        if (itd->next != NULL)
                itd->next->prev = itd->prev;
        if (itd == *last)
                *last = itd->prev;
+       UnlockIsochronous();
 }
 
 
 void
 EHCI::UnlinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **last)
 {
+       LockIsochronous();
        sitd->prev->next_phy = sitd->next_phy;
        sitd->prev->next = sitd->next;
        if (sitd->next != NULL)
                sitd->next->prev = sitd->prev;
        if (sitd == *last)
                *last = sitd->prev;
+       UnlockIsochronous();
 }
 
 


Other related posts:

  • » [haiku-commits] r42575 - haiku/trunk/src/add-ons/kernel/busses/usb - korli