void ApplePS2Mouse::resetMouse()
{
  DEBUG_LOG("%s::resetMouse called\n", getName());
    
  //
  // Reset the mouse to its default state.
  //

  // Contrary to what you might think kDP_SetDefaultsAndDisable does not set
  // relative mode (for trackpads), as kDP_SetDefaults does.  This is probably an
  // oversight/error in the naming of these constants.
  //
  // For the kDP_SetDefaults, there is no point in trying to read the ACK
  // ... it is just going to time out... and then later show up in the
  // input stream unexpectedly.
    
  TPS2Request<8> request;
  request.commands[0].command = kPS2C_WriteCommandPort;
  request.commands[0].inOrOut = kCP_TransmitToMouse;
  request.commands[1].command = kPS2C_WriteDataPort;
  request.commands[1].inOrOut = kDP_SetDefaults;
  request.commands[2].command = kPS2C_WriteCommandPort;
  request.commands[2].inOrOut = kCP_TransmitToMouse;
  request.commands[3].command = kPS2C_WriteDataPort;
  request.commands[3].inOrOut = kDP_GetMouseInformation;
  request.commands[4].command = kPS2C_ReadDataPortAndCompare;
  request.commands[4].inOrOut = kSC_Acknowledge;
  request.commands[5].command = kPS2C_ReadDataPort;
  request.commands[5].inOrOut = 0;
  request.commands[6].command = kPS2C_ReadDataPort;
  request.commands[6].inOrOut = 0;
  request.commands[7].command = kPS2C_ReadDataPort;
  request.commands[7].inOrOut = 0;
  request.commandsCount = 8;
  assert(request.commandsCount <= countof(request.commands));
  _device->submitRequestAndBlock(&request);
  if (8 != request.commandsCount)
      DEBUG_LOG("%s: reset mouse sequence failed: %d\n", getName(), request.commandsCount);
  
  // Now deal with Synaptics specifics (ActLikeTrackpad trick)...
  ledpresent = false;
  do if (actliketrackpad && !noled)
  {
    // do Synaptics specific, but only if it is Synaptics device
    UInt8 buf3[3];
    if (!getTouchPadData(0x0, buf3) || (0x46 != buf3[1] && 0x47 != buf3[1]))
        break;
    // it is Synaptics, now test for LED capability...
    if (!getTouchPadData(0x2, buf3) || !(buf3[0] & 0x80))
        break;
    int nExtendedQueries = (buf3[0] & 0x70) >> 4;
    // check LED capability if query is supported
    if (nExtendedQueries >= 1 && getTouchPadData(0x9, buf3))
    {
        ledpresent = (buf3[0] >> 6) & 1;
        DEBUG_LOG("%s: ledpresent=%d\n", getName(), ledpresent);
    }
void ApplePS2Mouse::resetMouse()
{
  DEBUG_LOG("%s::resetMouse called\n", getName());
    
  //
  // Reset the mouse to its default state.
  //

  PS2Request * request = _device->allocateRequest();
  if (request)
  {
    request->commands[0].command = kPS2C_SendMouseCommandAndCompareAck;
  //REVIEW: This was kDP_SetDefaults, but there is conflicting information on
    // what this should do.  I need to find some regular mouse PS2 docs to see
    // how that might differ from what Synaptics docs are saying.
    // If this is kDP_SetDefaults instead of kDP_SetDefaultsAndDisable, we end
    // up seeing an unexpected ack ($FA) in the stream and it throws off the
    // getMouseInformation return value.
    //request->commands[0].inOrOut = kDP_SetDefaults;
    request->commands[0].inOrOut = kDP_SetDefaultsAndDisable;
    request->commandsCount = 1;
      /*  
    // alternate way to do the same thing as above...
    request->commands[0].command = kPS2C_WriteCommandPort;
    request->commands[0].inOrOut = kCP_TransmitToMouse;
    request->commands[1].command = kPS2C_WriteDataPort;
    request->commands[1].inOrOut = kDP_SetDefaultsAndDisable;
    request->commands[2].command = kPS2C_ReadDataPortAndCompare;
    request->commands[2].inOrOut = kSC_Acknowledge;
    request->commandsCount = 3;
       */
    _device->submitRequestAndBlock(request);
    _device->freeRequest(request);
  }

  if (actliketrackpad && !noled)
  {
    // deal with LED capability
    UInt8 buf3[3];
      
    //REVIEW; should really be sure this is synaptics first
    if (getTouchPadData(0x9, buf3))
    {
        ledpresent = (buf3[0] >> 6) & 1;
        DEBUG_LOG("VoodooPS2Mouse: ledpresent=%d\n", ledpresent);
    }