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
This commit is contained in:
@@ -2243,6 +2243,7 @@ EHCI::LinkDescriptors(ehci_qtd *first, ehci_qtd *last, ehci_qtd *alt)
|
|||||||
void
|
void
|
||||||
EHCI::LinkITDescriptors(ehci_itd *itd, ehci_itd **_last)
|
EHCI::LinkITDescriptors(ehci_itd *itd, ehci_itd **_last)
|
||||||
{
|
{
|
||||||
|
LockIsochronous();
|
||||||
ehci_itd *last = *_last;
|
ehci_itd *last = *_last;
|
||||||
itd->next_phy = last->next_phy;
|
itd->next_phy = last->next_phy;
|
||||||
itd->next = NULL;
|
itd->next = NULL;
|
||||||
@@ -2250,12 +2251,14 @@ EHCI::LinkITDescriptors(ehci_itd *itd, ehci_itd **_last)
|
|||||||
last->next = itd;
|
last->next = itd;
|
||||||
last->next_phy = itd->this_phy;
|
last->next_phy = itd->this_phy;
|
||||||
*_last = itd;
|
*_last = itd;
|
||||||
|
UnlockIsochronous();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
EHCI::LinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **_last)
|
EHCI::LinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **_last)
|
||||||
{
|
{
|
||||||
|
LockIsochronous();
|
||||||
ehci_sitd *last = *_last;
|
ehci_sitd *last = *_last;
|
||||||
sitd->next_phy = last->next_phy;
|
sitd->next_phy = last->next_phy;
|
||||||
sitd->next = NULL;
|
sitd->next = NULL;
|
||||||
@@ -2263,29 +2266,34 @@ EHCI::LinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **_last)
|
|||||||
last->next = sitd;
|
last->next = sitd;
|
||||||
last->next_phy = sitd->this_phy;
|
last->next_phy = sitd->this_phy;
|
||||||
*_last = sitd;
|
*_last = sitd;
|
||||||
|
UnlockIsochronous();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EHCI::UnlinkITDescriptors(ehci_itd *itd, ehci_itd **last)
|
EHCI::UnlinkITDescriptors(ehci_itd *itd, ehci_itd **last)
|
||||||
{
|
{
|
||||||
|
LockIsochronous();
|
||||||
itd->prev->next_phy = itd->next_phy;
|
itd->prev->next_phy = itd->next_phy;
|
||||||
itd->prev->next = itd->next;
|
itd->prev->next = itd->next;
|
||||||
if (itd->next != NULL)
|
if (itd->next != NULL)
|
||||||
itd->next->prev = itd->prev;
|
itd->next->prev = itd->prev;
|
||||||
if (itd == *last)
|
if (itd == *last)
|
||||||
*last = itd->prev;
|
*last = itd->prev;
|
||||||
|
UnlockIsochronous();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
EHCI::UnlinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **last)
|
EHCI::UnlinkSITDescriptors(ehci_sitd *sitd, ehci_sitd **last)
|
||||||
{
|
{
|
||||||
|
LockIsochronous();
|
||||||
sitd->prev->next_phy = sitd->next_phy;
|
sitd->prev->next_phy = sitd->next_phy;
|
||||||
sitd->prev->next = sitd->next;
|
sitd->prev->next = sitd->next;
|
||||||
if (sitd->next != NULL)
|
if (sitd->next != NULL)
|
||||||
sitd->next->prev = sitd->prev;
|
sitd->next->prev = sitd->prev;
|
||||||
if (sitd == *last)
|
if (sitd == *last)
|
||||||
*last = sitd->prev;
|
*last = sitd->prev;
|
||||||
|
UnlockIsochronous();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user