Commit 167f1667 authored by Mark Cave-Ayland's avatar Mark Cave-Ayland
Browse files

adb: fix adb-mouse read length and revert disable-reg3-direct-writes workaround



Commit 84051eb4 "adb: add property to disable direct reg 3 writes" introduced
a workaround for spurious writes to ADB register 3 when MacOS 9 enables
autopoll on the mouse device. Further analysis shows that the problem is that
only a partial request is sent, and since the len parameter is ignored then
stale data from the previous request is used causing the incorrect address
assignment.

Remove the disable-reg3-direct-writes workaround and instead check the length
parameter when the write is attempted, discarding the invalid request.

Signed-off-by: default avatarMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Acked-by: default avatarLaurent Vivier <laurent@vivier.eu>
Message-Id: <20200623204936.24064-3-mark.cave-ayland@ilande.co.uk>
parent bcaaefdb
Loading
Loading
Loading
Loading
+12 −14
Original line number Diff line number Diff line
@@ -259,10 +259,9 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,
                trace_adb_kbd_request_change_addr(d->devaddr);
                break;
            default:
                if (!d->disable_direct_reg3_writes) {
                d->devaddr = buf[1] & 0xf;

                    /* we support handlers:
                /*
                 * we support handlers:
                 * 1: Apple Standard Keyboard
                 * 2: Apple Extended Keyboard (LShift = RShift)
                 * 3: Apple Extended Keyboard (LShift != RShift)
@@ -273,7 +272,6 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,

                trace_adb_kbd_request_change_addr_and_handler(d->devaddr,
                                                              d->handler);
                }
                break;
            }
        }
+28 −20
Original line number Diff line number Diff line
@@ -135,6 +135,16 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
        case 2:
            break;
        case 3:
            /*
             * MacOS 9 has a bug in its ADB driver whereby after configuring
             * the ADB bus devices it sends another write of invalid length
             * to reg 3. Make sure we ignore it to prevent an address clash
             * with the previous device.
             */
            if (len != 3) {
                return 0;
            }

            switch (buf[2]) {
            case ADB_CMD_SELF_TEST:
                break;
@@ -145,10 +155,9 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
                trace_adb_mouse_request_change_addr(d->devaddr);
                break;
            default:
                if (!d->disable_direct_reg3_writes) {
                d->devaddr = buf[1] & 0xf;

                    /* we support handlers:
                /*
                 * we support handlers:
                 * 0x01: Classic Apple Mouse Protocol / 100 cpi operations
                 * 0x02: Classic Apple Mouse Protocol / 200 cpi operations
                 * we don't support handlers (at least):
@@ -163,9 +172,8 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
                    d->handler = buf[2];
                }

                    trace_adb_mouse_request_change_addr_and_handler(
                        d->devaddr, d->handler);
                }
                trace_adb_mouse_request_change_addr_and_handler(d->devaddr,
                                                                d->handler);
                break;
            }
        }
+0 −7
Original line number Diff line number Diff line
@@ -118,18 +118,11 @@ static void adb_device_realizefn(DeviceState *dev, Error **errp)
    bus->devices[bus->nb_devices++] = d;
}

static Property adb_device_properties[] = {
    DEFINE_PROP_BOOL("disable-direct-reg3-writes", ADBDevice,
                     disable_direct_reg3_writes, false),
    DEFINE_PROP_END_OF_LIST(),
};

static void adb_device_class_init(ObjectClass *oc, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(oc);

    dc->realize = adb_device_realizefn;
    device_class_set_props(dc, adb_device_properties);
    dc->bus_type = TYPE_ADB_BUS;
}

+0 −2
Original line number Diff line number Diff line
@@ -404,11 +404,9 @@ static void ppc_core99_init(MachineState *machine)

        adb_bus = qdev_get_child_bus(dev, "adb.0");
        dev = qdev_new(TYPE_ADB_KEYBOARD);
        qdev_prop_set_bit(dev, "disable-direct-reg3-writes", true);
        qdev_realize_and_unref(dev, adb_bus, &error_fatal);

        dev = qdev_new(TYPE_ADB_MOUSE);
        qdev_prop_set_bit(dev, "disable-direct-reg3-writes", true);
        qdev_realize_and_unref(dev, adb_bus, &error_fatal);
    }

+0 −1
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@ struct ADBDevice {

    int devaddr;
    int handler;
    bool disable_direct_reg3_writes;
};

#define ADB_DEVICE_CLASS(cls) \