hrev46094 adds 2 changesets to branch 'master' old head: 7416b5878f62ef0c1871e53607ccfebdc82f86b8 new head: bd3bcbe5d6f544a4c9ce93cf28c29fd9e88abbe9 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=bd3bcbe+%5E7416b58 ---------------------------------------------------------------------------- 33f263c: virtio: add queue_is_full(), queue_is_empty(), queue_size() hooks. bd3bcbe: hda: reorganized the code for sense checking. * should help with #9965 [ Jerome Duval <jerome.duval@xxxxxxxxx> ] ---------------------------------------------------------------------------- 4 files changed, 43 insertions(+), 10 deletions(-) headers/private/virtio/virtio.h | 6 ++++ .../kernel/bus_managers/virtio/VirtioModule.cpp | 30 +++++++++++++++++++- .../kernel/bus_managers/virtio/VirtioPrivate.h | 1 + .../kernel/drivers/audio/hda/hda_codec.cpp | 16 +++++------ ############################################################################ Commit: 33f263cb01e82be571639584a3fe6a690b583467 URL: http://cgit.haiku-os.org/haiku/commit/?id=33f263c Author: Jerome Duval <jerome.duval@xxxxxxxxx> Date: Mon Sep 16 15:09:00 2013 UTC virtio: add queue_is_full(), queue_is_empty(), queue_size() hooks. ---------------------------------------------------------------------------- diff --git a/headers/private/virtio/virtio.h b/headers/private/virtio/virtio.h index 0379242..12691a1 100644 --- a/headers/private/virtio/virtio.h +++ b/headers/private/virtio/virtio.h @@ -117,6 +117,12 @@ typedef struct { size_t readVectorCount, size_t writtenVectorCount, virtio_callback_func callback, void *callbackCookie); + bool (*queue_is_full)(virtio_queue queue); + + bool (*queue_is_empty)(virtio_queue queue); + + uint16 (*queue_size)(virtio_queue queue); + } virtio_device_interface; diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp index f2a284e..41b5860 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp @@ -134,6 +134,31 @@ virtio_queue_request(virtio_queue cookie, const physical_entry *readEntry, } +bool +virtio_queue_is_full(virtio_queue cookie) +{ + VirtioQueue *queue = (VirtioQueue *)cookie; + return queue->IsFull(); +} + + +bool +virtio_queue_is_empty(virtio_queue cookie) +{ + VirtioQueue *queue = (VirtioQueue *)cookie; + return queue->IsEmpty(); +} + + +uint16 +virtio_queue_size(virtio_queue cookie) +{ + VirtioQueue *queue = (VirtioQueue *)cookie; + return queue->Size(); +} + + + // #pragma mark - @@ -222,7 +247,10 @@ virtio_device_interface virtio_device_module = { virtio_alloc_queues, virtio_setup_interrupt, virtio_queue_request, - virtio_queue_request_v + virtio_queue_request_v, + virtio_queue_is_full, + virtio_queue_is_empty, + virtio_queue_size }; virtio_for_controller_interface virtio_for_controller_module = { diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h index a83eaf8..4e0e0d1 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h @@ -107,6 +107,7 @@ public: bool IsFull() const { return fRingFree == 0; } bool IsEmpty() const { return fRingFree == fRingSize; } + uint16 Size() const { return fRingSize; } VirtioDevice* Device() { return fDevice; } ############################################################################ Revision: hrev46094 Commit: bd3bcbe5d6f544a4c9ce93cf28c29fd9e88abbe9 URL: http://cgit.haiku-os.org/haiku/commit/?id=bd3bcbe Author: Jerome Duval <jerome.duval@xxxxxxxxx> Date: Wed Sep 18 16:26:26 2013 UTC Ticket: https://dev.haiku-os.org/ticket/9965 hda: reorganized the code for sense checking. * should help with #9965 ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp index b8ff560..4cdd222 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp @@ -1154,7 +1154,7 @@ TRACE("build tree!\n"); static void -hda_codec_switch_init(hda_audio_group* audioGroup) +hda_audio_group_switch_init(hda_audio_group* audioGroup) { for (uint32 i = 0; i < audioGroup->widget_count; i++) { hda_widget& widget = audioGroup->widgets[i]; @@ -1175,10 +1175,8 @@ hda_codec_switch_init(hda_audio_group* audioGroup) static void -hda_codec_check_sense(hda_codec* codec, bool disable) +hda_audio_group_check_sense(hda_audio_group* audioGroup, bool disable) { - hda_audio_group* audioGroup = codec->audio_groups[0]; - for (uint32 i = 0; i < audioGroup->widget_count; i++) { hda_widget& widget = audioGroup->widgets[i]; @@ -1233,7 +1231,8 @@ hda_codec_switch_handler(hda_codec* codec) codec->unsol_response_read %= MAX_CODEC_UNSOL_RESPONSES; bool disable = response & 1; - hda_codec_check_sense(codec, disable); + hda_audio_group* audioGroup = codec->audio_groups[0]; + hda_audio_group_check_sense(audioGroup, disable); } return B_OK; } @@ -1285,8 +1284,8 @@ hda_codec_new_audio_group(hda_codec* codec, uint32 audioGroupNodeID) if (hda_audio_group_build_tree(audioGroup) != B_OK) goto err; - hda_codec_switch_init(audioGroup); - + hda_audio_group_switch_init(audioGroup); + audioGroup->playback_stream = hda_stream_new(audioGroup, STREAM_PLAYBACK); audioGroup->record_stream = hda_stream_new(audioGroup, STREAM_RECORD); TRACE("hda: streams playback %p, record %p\n", audioGroup->playback_stream, @@ -1295,6 +1294,7 @@ hda_codec_new_audio_group(hda_codec* codec, uint32 audioGroupNodeID) if (audioGroup->playback_stream != NULL || audioGroup->record_stream != NULL) { codec->audio_groups[codec->num_audio_groups++] = audioGroup; + hda_audio_group_check_sense(audioGroup, false); return B_OK; } @@ -1527,8 +1527,6 @@ hda_codec_new(hda_controller* controller, uint32 codecAddress) } } - hda_codec_check_sense(codec, false); - codec->unsol_response_thread = spawn_kernel_thread( (status_t(*)(void*))hda_codec_switch_handler, "hda_codec_unsol_thread", B_LOW_PRIORITY, codec);