- 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:
parent
3b0fb9f28a
commit
a342f0bfe6
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user