Relaxed CORB read pointer reset checking for nVidia HDA

* At least some nVidia HDA controllers do not acknowledge the CORB
  read pointer reset, which is required by the spec (cf. HDA 1.0a
  ch. 3.3.21). For these controllers, do not fail when acknowledge
  is missing.

* Makes hda driver work for nVidia HDA controllers again, thus fixing
  the regression pointed out in #10212.
This commit is contained in:
Julian Harnath 2014-09-04 00:34:10 +02:00
parent 1a23bff796
commit 7ef10f899a

View File

@ -537,8 +537,14 @@ init_corb_rirb_pos(hda_controller* controller)
break;
}
if ((corbReadPointer & CORB_READ_POS_RESET) == 0) {
dprintf("hda: CORB read pointer reset failed\n");
return B_BUSY;
dprintf("hda: CORB read pointer reset not acknowledged\n");
// According to HDA spec v1.0a ch3.3.21, software must read the
// bit as 1 to verify that the reset completed. However, at least
// some nVidia HDA controllers do not update the bit after reset.
// Thus don't fail here on nVidia controllers.
if (controller->pci_info.vendor_id != PCI_VENDOR_NVIDIA)
return B_BUSY;
}
corbReadPointer &= ~CORB_READ_POS_RESET;