From 0839540d1e84ff4829960f08c9d3025987a5ca04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 4 Aug 2011 21:52:03 +0000 Subject: [PATCH] use locking when messing ITD and SITD queues. itd->prev was becoming NULL, thus leading to KDL. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42575 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/busses/usb/ehci.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/add-ons/kernel/busses/usb/ehci.cpp b/src/add-ons/kernel/busses/usb/ehci.cpp index 209c40fd25..c0fec9e373 100644 --- a/src/add-ons/kernel/busses/usb/ehci.cpp +++ b/src/add-ons/kernel/busses/usb/ehci.cpp @@ -2243,6 +2243,7 @@ EHCI::LinkDescriptors(ehci_qtd *first, ehci_qtd *last, ehci_qtd *alt) 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 @@ EHCI::LinkITDescriptors(ehci_itd *itd, ehci_itd **_last) 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 @@ EHCI::LinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **_last) 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(); }