- usb_msd: return status packet after partial disk write (Win98SE needs this)

- usb_hub: removed unnecessary include
- don't accept IN and OUT packets if a device is stalled (SETUP packet clears
  this mode)
This commit is contained in:
Volker Ruppert 2009-04-10 20:26:14 +00:00
parent 3b0fb9f28a
commit a342f0bfe6
5 changed files with 23 additions and 6 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: usb_common.cc,v 1.10 2009-04-03 16:42:56 vruppert Exp $
// $Id: usb_common.cc,v 1.11 2009-04-10 20:26:14 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2009 Benjamin D Lunt (fys at frontiernet net)
@ -180,6 +180,7 @@ int usb_device_c::handle_packet(USBPacket *p)
return USB_RET_NODEV;
if (len != 8)
goto fail;
d.stall = 0;
memcpy(d.setup_buf, data, 8);
d.setup_len = (d.setup_buf[7] << 8) | d.setup_buf[6];
d.setup_index = 0;
@ -203,6 +204,7 @@ int usb_device_c::handle_packet(USBPacket *p)
case USB_TOKEN_IN:
if (d.state < USB_STATE_DEFAULT || p->devaddr != d.addr)
return USB_RET_NODEV;
if (d.stall) goto fail;
switch(p->devep) {
case 0:
switch(d.setup_state) {
@ -246,6 +248,7 @@ int usb_device_c::handle_packet(USBPacket *p)
case USB_TOKEN_OUT:
if (d.state < USB_STATE_DEFAULT || p->devaddr != d.addr)
return USB_RET_NODEV;
if (d.stall) goto fail;
switch(p->devep) {
case 0:
switch(d.setup_state) {
@ -286,6 +289,7 @@ int usb_device_c::handle_packet(USBPacket *p)
break;
default:
fail:
d.stall = 1;
ret = USB_RET_STALL;
break;
}

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: usb_common.h,v 1.9 2009-04-10 07:12:25 vruppert Exp $
// $Id: usb_common.h,v 1.10 2009-04-10 20:26:14 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2009 Benjamin D Lunt (fys at frontiernet net)
@ -166,6 +166,7 @@ protected:
int setup_state;
int setup_len;
int setup_index;
bx_bool stall;
} d;
void usb_dump_packet(Bit8u *data, unsigned size);

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: usb_hid.cc,v 1.18 2009-04-10 07:12:25 vruppert Exp $
// $Id: usb_hid.cc,v 1.19 2009-04-10 20:26:14 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2009 Volker Ruppert
@ -651,6 +651,7 @@ int usb_hid_device_c::handle_control(int request, int value, int index, int leng
default:
BX_ERROR(("USB HID handle_control: unknown request 0x%04x", request));
fail:
d.stall = 1;
ret = USB_RET_STALL;
break;
}
@ -686,6 +687,7 @@ int usb_hid_device_c::handle_data(USBPacket *p)
BX_ERROR(("USB HID handle_data: unexpected pid TOKEN_OUT"));
default:
fail:
d.stall = 1;
ret = USB_RET_STALL;
break;
}

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: usb_hub.cc,v 1.10 2009-04-10 07:12:25 vruppert Exp $
// $Id: usb_hub.cc,v 1.11 2009-04-10 20:26:14 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2009 Volker Ruppert
@ -32,7 +32,6 @@
#if BX_SUPPORT_PCI && BX_SUPPORT_PCIUSB
#include "usb_common.h"
#include "usb_hid.h"
#include "usb_hub.h"
#include "usb_msd.h"
@ -467,6 +466,7 @@ int usb_hub_device_c::handle_control(int request, int value, int index, int leng
}
default:
fail:
d.stall = 1;
ret = USB_RET_STALL;
break;
}
@ -508,6 +508,7 @@ int usb_hub_device_c::handle_data(USBPacket *p)
case USB_TOKEN_OUT:
default:
fail:
d.stall = 1;
ret = USB_RET_STALL;
break;
}

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: usb_msd.cc,v 1.22 2009-04-06 15:36:54 vruppert Exp $
// $Id: usb_msd.cc,v 1.23 2009-04-10 20:26:14 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2009 Volker Ruppert
@ -356,6 +356,7 @@ int usb_msd_device_c::handle_control(int request, int value, int index, int leng
default:
BX_ERROR(("USB MSD handle_control: unknown request 0x%04x", request));
fail:
d.stall = 1;
ret = USB_RET_STALL;
break;
}
@ -449,6 +450,13 @@ int usb_msd_device_c::handle_data(USBPacket *p)
switch (s.mode) {
case USB_MSDM_DATAOUT:
if ((s.data_len > 0) && (len == 13)) {
s.usb_len = len;
s.usb_buf = data;
send_status();
ret = 13;
break;
}
if (s.data_len != 0 || len < 13)
goto fail;
usb_defer_packet(p, this);
@ -505,6 +513,7 @@ int usb_msd_device_c::handle_data(USBPacket *p)
default:
BX_ERROR(("USB MSD handle_data: bad token"));
fail:
d.stall = 1;
ret = USB_RET_STALL;
break;
}