[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 15/22] adb: add autopoll_blocked variable to block autopoll
From: |
Mark Cave-Ayland |
Subject: |
[PULL 15/22] adb: add autopoll_blocked variable to block autopoll |
Date: |
Fri, 26 Jun 2020 10:23:10 +0100 |
Whilst autopoll is enabled it is necessary to prevent the ADB buffer contents
from being overwritten until the host has read back the response in its
entirety.
Add adb_autopoll_block() and adb_autopoll_unblock() functions in preparation
for ensuring that the ADB buffer contents are protected for explicit ADB
requests.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: Finn Thain <fthain@telegraphics.com.au>
Acked-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20200623204936.24064-16-mark.cave-ayland@ilande.co.uk>
---
hw/input/adb.c | 21 +++++++++++++++++++++
include/hw/input/adb.h | 4 ++++
2 files changed, 25 insertions(+)
diff --git a/hw/input/adb.c b/hw/input/adb.c
index b3ad7c5fca..70aa1f4570 100644
--- a/hw/input/adb.c
+++ b/hw/input/adb.c
@@ -157,6 +157,26 @@ void adb_set_autopoll_mask(ADBBusState *s, uint16_t mask)
}
}
+void adb_autopoll_block(ADBBusState *s)
+{
+ s->autopoll_blocked = true;
+
+ if (s->autopoll_enabled) {
+ timer_del(s->autopoll_timer);
+ }
+}
+
+void adb_autopoll_unblock(ADBBusState *s)
+{
+ s->autopoll_blocked = false;
+
+ if (s->autopoll_enabled) {
+ timer_mod(s->autopoll_timer,
+ qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) +
+ s->autopoll_rate_ms);
+ }
+}
+
static void adb_autopoll(void *opaque)
{
ADBBusState *s = opaque;
@@ -184,6 +204,7 @@ static const VMStateDescription vmstate_adb_bus = {
VMSTATE_BOOL(autopoll_enabled, ADBBusState),
VMSTATE_UINT8(autopoll_rate_ms, ADBBusState),
VMSTATE_UINT16(autopoll_mask, ADBBusState),
+ VMSTATE_BOOL(autopoll_blocked, ADBBusState),
VMSTATE_END_OF_LIST()
}
};
diff --git a/include/hw/input/adb.h b/include/hw/input/adb.h
index cff264739c..bb75a7b1e3 100644
--- a/include/hw/input/adb.h
+++ b/include/hw/input/adb.h
@@ -86,6 +86,7 @@ struct ADBBusState {
QEMUTimer *autopoll_timer;
bool autopoll_enabled;
+ bool autopoll_blocked;
uint8_t autopoll_rate_ms;
uint16_t autopoll_mask;
void (*autopoll_cb)(void *opaque);
@@ -96,6 +97,9 @@ int adb_request(ADBBusState *s, uint8_t *buf_out,
const uint8_t *buf, int len);
int adb_poll(ADBBusState *s, uint8_t *buf_out, uint16_t poll_mask);
+void adb_autopoll_block(ADBBusState *s);
+void adb_autopoll_unblock(ADBBusState *s);
+
void adb_set_autopoll_enabled(ADBBusState *s, bool enabled);
void adb_set_autopoll_rate_ms(ADBBusState *s, int rate_ms);
void adb_set_autopoll_mask(ADBBusState *s, uint16_t mask);
--
2.20.1
- [PULL 05/22] pmu: honour autopoll_rate_ms when rearming the ADB autopoll timer, (continued)
- [PULL 05/22] pmu: honour autopoll_rate_ms when rearming the ADB autopoll timer, Mark Cave-Ayland, 2020/06/26
- [PULL 06/22] adb: introduce realize/unrealize and VMStateDescription for ADB bus, Mark Cave-Ayland, 2020/06/26
- [PULL 07/22] adb: create autopoll variables directly within ADBBusState, Mark Cave-Ayland, 2020/06/26
- [PULL 08/22] cuda: convert to use ADBBusState internal autopoll variables, Mark Cave-Ayland, 2020/06/26
- [PULL 09/22] pmu: convert to use ADBBusState internal autopoll variables, Mark Cave-Ayland, 2020/06/26
- [PULL 10/22] mac_via: convert to use ADBBusState internal autopoll variables, Mark Cave-Ayland, 2020/06/26
- [PULL 11/22] adb: introduce new ADBDeviceHasData method to ADBDeviceClass, Mark Cave-Ayland, 2020/06/26
- [PULL 12/22] adb: keep track of devices with pending data, Mark Cave-Ayland, 2020/06/26
- [PULL 13/22] adb: add status field for holding information about the last ADB request, Mark Cave-Ayland, 2020/06/26
- [PULL 14/22] adb: use adb_request() only for explicit requests, Mark Cave-Ayland, 2020/06/26
- [PULL 15/22] adb: add autopoll_blocked variable to block autopoll,
Mark Cave-Ayland <=
- [PULL 16/22] cuda: add adb_autopoll_block() and adb_autopoll_unblock() functions, Mark Cave-Ayland, 2020/06/26
- [PULL 17/22] pmu: add adb_autopoll_block() and adb_autopoll_unblock() functions, Mark Cave-Ayland, 2020/06/26
- [PULL 18/22] mac_via: move VIA1 portB write logic into mos6522_q800_via1_write(), Mark Cave-Ayland, 2020/06/26
- [PULL 19/22] mac_via: rework ADB state machine to be compatible with both MacOS and Linux, Mark Cave-Ayland, 2020/06/26
- [PULL 20/22] adb: only call autopoll callbacks when autopoll is not blocked, Mark Cave-Ayland, 2020/06/26
- [PULL 21/22] adb: use adb_device prefix for ADB device trace events, Mark Cave-Ayland, 2020/06/26
- [PULL 22/22] adb: add ADB bus trace events, Mark Cave-Ayland, 2020/06/26
- Re: [PULL 00/22] qemu-macppc queue 20200626, Peter Maydell, 2020/06/26