Reverted Cacodemon345's broken USB OHCI implementation, fixes #3597.
This commit is contained in:
@@ -70,7 +70,6 @@ typedef struct ali1543_t {
|
|||||||
sff8038i_t *ide_controller[2];
|
sff8038i_t *ide_controller[2];
|
||||||
smbus_ali7101_t *smbus;
|
smbus_ali7101_t *smbus;
|
||||||
usb_t *usb;
|
usb_t *usb;
|
||||||
usb_params_t usb_params;
|
|
||||||
|
|
||||||
} ali1543_t;
|
} ali1543_t;
|
||||||
|
|
||||||
@@ -1472,17 +1471,6 @@ ali7101_read(int func, int addr, void *priv)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
ali5237_usb_update_interrupt(usb_t* usb, void *priv)
|
|
||||||
{
|
|
||||||
ali1543_t *dev = (ali1543_t *) priv;
|
|
||||||
|
|
||||||
if (usb->irq_level)
|
|
||||||
pci_set_mirq(4, !!(dev->pci_conf[0x74] & 0x10), &dev->mirq_states[4]);
|
|
||||||
else
|
|
||||||
pci_clear_mirq(4, !!(dev->pci_conf[0x74] & 0x10), &dev->mirq_states[4]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ali1543_reset(void *priv)
|
ali1543_reset(void *priv)
|
||||||
{
|
{
|
||||||
@@ -1633,10 +1621,7 @@ ali1543_init(const device_t *info)
|
|||||||
dev->smbus = device_add(&ali7101_smbus_device);
|
dev->smbus = device_add(&ali7101_smbus_device);
|
||||||
|
|
||||||
/* USB */
|
/* USB */
|
||||||
dev->usb_params.parent_priv = dev;
|
dev->usb = device_add(&usb_device);
|
||||||
dev->usb_params.smi_handle = NULL;
|
|
||||||
dev->usb_params.update_interrupt = ali5237_usb_update_interrupt;
|
|
||||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
|
||||||
|
|
||||||
dev->type = info->local & 0xff;
|
dev->type = info->local & 0xff;
|
||||||
dev->offset = (info->local >> 8) & 0x7f;
|
dev->offset = (info->local >> 8) & 0x7f;
|
||||||
|
@@ -66,7 +66,6 @@ typedef struct _piix_ {
|
|||||||
uint8_t max_func;
|
uint8_t max_func;
|
||||||
uint8_t pci_slot;
|
uint8_t pci_slot;
|
||||||
uint8_t no_mirq0;
|
uint8_t no_mirq0;
|
||||||
uint8_t usb_irq_state;
|
|
||||||
uint8_t regs[4][256];
|
uint8_t regs[4][256];
|
||||||
uint8_t readout_regs[256];
|
uint8_t readout_regs[256];
|
||||||
uint8_t board_config[2];
|
uint8_t board_config[2];
|
||||||
@@ -84,7 +83,6 @@ typedef struct _piix_ {
|
|||||||
piix_io_trap_t io_traps[26];
|
piix_io_trap_t io_traps[26];
|
||||||
port_92_t *port_92;
|
port_92_t *port_92;
|
||||||
pc_timer_t fast_off_timer;
|
pc_timer_t fast_off_timer;
|
||||||
usb_params_t usb_params;
|
|
||||||
} piix_t;
|
} piix_t;
|
||||||
|
|
||||||
#ifdef ENABLE_PIIX_LOG
|
#ifdef ENABLE_PIIX_LOG
|
||||||
@@ -1443,17 +1441,6 @@ piix_fast_off_count(void *priv)
|
|||||||
dev->regs[0][0xaa] |= 0x20;
|
dev->regs[0][0xaa] |= 0x20;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
piix_usb_update_interrupt(usb_t* usb, void *priv)
|
|
||||||
{
|
|
||||||
piix_t *dev = (piix_t *) priv;
|
|
||||||
|
|
||||||
if (usb->irq_level)
|
|
||||||
pci_set_irq(dev->pci_slot, PCI_INTD, &dev->usb_irq_state);
|
|
||||||
else
|
|
||||||
pci_clear_irq(dev->pci_slot, PCI_INTD, &dev->usb_irq_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
piix_reset(void *priv)
|
piix_reset(void *priv)
|
||||||
{
|
{
|
||||||
@@ -1598,12 +1585,8 @@ piix_init(const device_t *info)
|
|||||||
sff_set_irq_mode(dev->bm[1], 1, 2);
|
sff_set_irq_mode(dev->bm[1], 1, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->type >= 3) {
|
if (dev->type >= 3)
|
||||||
dev->usb_params.parent_priv = dev;
|
dev->usb = device_add(&usb_device);
|
||||||
dev->usb_params.smi_handle = NULL;
|
|
||||||
dev->usb_params.update_interrupt = piix_usb_update_interrupt;
|
|
||||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->type > 3) {
|
if (dev->type > 3) {
|
||||||
dev->nvr = device_add(&piix4_nvr_device);
|
dev->nvr = device_add(&piix4_nvr_device);
|
||||||
|
@@ -87,9 +87,6 @@ typedef struct sis_5571_t {
|
|||||||
sff8038i_t *ide_drive[2];
|
sff8038i_t *ide_drive[2];
|
||||||
smram_t *smram;
|
smram_t *smram;
|
||||||
usb_t *usb;
|
usb_t *usb;
|
||||||
|
|
||||||
usb_params_t usb_params;
|
|
||||||
|
|
||||||
} sis_5571_t;
|
} sis_5571_t;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -669,43 +666,6 @@ pci_isa_bridge_read(int func, int addr, void *priv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
sis_5571_usb_update_interrupt(usb_t* usb, void* priv)
|
|
||||||
{
|
|
||||||
sis_5571_t *dev = (sis_5571_t *) priv;
|
|
||||||
|
|
||||||
if (dev->pci_conf_sb[0][0x68] & 0x80) {
|
|
||||||
/* TODO: Is the normal PCI interrupt inhibited when USB IRQ remapping is enabled? */
|
|
||||||
switch (dev->pci_conf_sb[0][0x68] & 0x0F) {
|
|
||||||
case 0x00:
|
|
||||||
case 0x01:
|
|
||||||
case 0x02:
|
|
||||||
case 0x08:
|
|
||||||
case 0x0d:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (usb->irq_level)
|
|
||||||
picint(1 << dev->pci_conf_sb[0][0x68] & 0x0f);
|
|
||||||
else
|
|
||||||
picintc(1 << dev->pci_conf_sb[0][0x68] & 0x0f);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (usb->irq_level)
|
|
||||||
pci_set_irq(dev->sb_slot, PCI_INTA, &dev->usb_irq_state);
|
|
||||||
else
|
|
||||||
pci_clear_irq(dev->sb_slot, PCI_INTA, &dev->usb_irq_state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t
|
|
||||||
sis_5571_usb_handle_smi(UNUSED(usb_t* usb), UNUSED(void* priv))
|
|
||||||
{
|
|
||||||
/* Left unimplemented for now. */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sis_5571_reset(void *priv)
|
sis_5571_reset(void *priv)
|
||||||
{
|
{
|
||||||
@@ -790,10 +750,7 @@ sis_5571_init(UNUSED(const device_t *info))
|
|||||||
dev->ide_drive[1] = device_add_inst(&sff8038i_device, 2);
|
dev->ide_drive[1] = device_add_inst(&sff8038i_device, 2);
|
||||||
|
|
||||||
/* USB */
|
/* USB */
|
||||||
dev->usb_params.parent_priv = dev;
|
dev->usb = device_add(&usb_device);
|
||||||
dev->usb_params.update_interrupt = sis_5571_usb_update_interrupt;
|
|
||||||
dev->usb_params.smi_handle = sis_5571_usb_handle_smi;
|
|
||||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
|
||||||
|
|
||||||
sis_5571_reset(dev);
|
sis_5571_reset(dev);
|
||||||
|
|
||||||
|
@@ -73,9 +73,6 @@ typedef struct stpc_t {
|
|||||||
smram_t *smram;
|
smram_t *smram;
|
||||||
usb_t *usb;
|
usb_t *usb;
|
||||||
sff8038i_t *bm[2];
|
sff8038i_t *bm[2];
|
||||||
|
|
||||||
/* Miscellaneous */
|
|
||||||
usb_params_t usb_params;
|
|
||||||
} stpc_t;
|
} stpc_t;
|
||||||
|
|
||||||
typedef struct stpc_serial_t {
|
typedef struct stpc_serial_t {
|
||||||
@@ -898,17 +895,6 @@ stpc_setup(stpc_t *dev)
|
|||||||
pci_set_irq_routing(PCI_INTD, PCI_IRQ_DISABLED);
|
pci_set_irq_routing(PCI_INTD, PCI_IRQ_DISABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
stpc_usb_update_interrupt(usb_t* usb, void* priv)
|
|
||||||
{
|
|
||||||
stpc_t *dev = (stpc_t *) priv;
|
|
||||||
|
|
||||||
if (usb->irq_level)
|
|
||||||
pci_set_irq(dev->usb_slot, PCI_INTA, &dev->usb_irq_state);
|
|
||||||
else
|
|
||||||
pci_clear_irq(dev->usb_slot, PCI_INTA, &dev->usb_irq_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
stpc_close(void *priv)
|
stpc_close(void *priv)
|
||||||
{
|
{
|
||||||
@@ -934,12 +920,9 @@ stpc_init(const device_t *info)
|
|||||||
pci_add_card(PCI_ADD_NORTHBRIDGE, stpc_nb_read, stpc_nb_write, dev, &dev->nb_slot);
|
pci_add_card(PCI_ADD_NORTHBRIDGE, stpc_nb_read, stpc_nb_write, dev, &dev->nb_slot);
|
||||||
pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_isab_read, stpc_isab_write, dev, &dev->sb_slot);
|
pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_isab_read, stpc_isab_write, dev, &dev->sb_slot);
|
||||||
if (dev->local == STPC_ATLAS) {
|
if (dev->local == STPC_ATLAS) {
|
||||||
dev->usb_params.smi_handle = NULL;
|
|
||||||
dev->usb_params.update_interrupt = stpc_usb_update_interrupt;
|
|
||||||
dev->usb_params.parent_priv = dev;
|
|
||||||
|
|
||||||
pci_add_card(PCI_ADD_SOUTHBRIDGE_IDE, stpc_ide_read, stpc_ide_write, dev, &dev->ide_slot);
|
pci_add_card(PCI_ADD_SOUTHBRIDGE_IDE, stpc_ide_read, stpc_ide_write, dev, &dev->ide_slot);
|
||||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
|
||||||
|
dev->usb = device_add(&usb_device);
|
||||||
pci_add_card(PCI_ADD_SOUTHBRIDGE_USB, stpc_usb_read, stpc_usb_write, dev, &dev->usb_slot);
|
pci_add_card(PCI_ADD_SOUTHBRIDGE_USB, stpc_usb_read, stpc_usb_write, dev, &dev->usb_slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,18 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||||
* running old operating systems and software designed for IBM
|
* running old operating systems and software designed for IBM
|
||||||
* PC systems and compatibles from 1981 through fairly recent
|
* PC systems and compatibles from 1981 through fairly recent
|
||||||
* system designs based on the PCI bus.
|
* system designs based on the PCI bus.
|
||||||
*
|
*
|
||||||
* This file is part of the 86Box distribution.
|
* This file is part of the 86Box distribution.
|
||||||
*
|
*
|
||||||
* Definitions for the Distributed DMA emulation.
|
* Definitions for the Distributed DMA emulation.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
* Copyright 2020 Miran Grca.
|
* Copyright 2020 Miran Grca.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef USB_H
|
#ifndef USB_H
|
||||||
@@ -22,188 +22,21 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct usb_t usb_t;
|
typedef struct
|
||||||
typedef struct usb_device_t usb_device_t;
|
|
||||||
|
|
||||||
enum usb_pid
|
|
||||||
{
|
{
|
||||||
USB_PID_OUT = 0xE1,
|
uint8_t uhci_io[32], ohci_mmio[4096];
|
||||||
USB_PID_IN = 0x69,
|
|
||||||
USB_PID_SETUP = 0x2D
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usb_errors
|
|
||||||
{
|
|
||||||
USB_ERROR_NO_ERROR = 0,
|
|
||||||
USB_ERROR_NAK = 1,
|
|
||||||
USB_ERROR_OVERRUN = 2,
|
|
||||||
USB_ERROR_UNDERRUN = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usb_bus_types
|
|
||||||
{
|
|
||||||
USB_BUS_OHCI = 0,
|
|
||||||
USB_BUS_UHCI = 1,
|
|
||||||
USB_BUS_MAX = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB device creation parameters struct */
|
|
||||||
typedef struct usb_params_t
|
|
||||||
{
|
|
||||||
void (*update_interrupt)(usb_t*, void*);
|
|
||||||
/* Handle (but do not raise) SMI. Returns 1 if SMI can be raised, 0 otherwise. */
|
|
||||||
uint8_t (*smi_handle)(usb_t*, void*);
|
|
||||||
void* parent_priv;
|
|
||||||
} usb_params_t;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
uint32_t l;
|
|
||||||
uint16_t w[2];
|
|
||||||
uint8_t b[4];
|
|
||||||
} ohci_mmio_t;
|
|
||||||
|
|
||||||
/* USB Host Controller device struct */
|
|
||||||
typedef struct usb_t {
|
|
||||||
uint8_t uhci_io[32];
|
|
||||||
ohci_mmio_t ohci_mmio[1024];
|
|
||||||
uint16_t uhci_io_base;
|
uint16_t uhci_io_base;
|
||||||
int uhci_enable;
|
int uhci_enable, ohci_enable;
|
||||||
int ohci_enable;
|
|
||||||
uint32_t ohci_mem_base;
|
uint32_t ohci_mem_base;
|
||||||
uint32_t irq_level;
|
|
||||||
mem_mapping_t ohci_mmio_mapping;
|
mem_mapping_t ohci_mmio_mapping;
|
||||||
pc_timer_t ohci_frame_timer;
|
|
||||||
pc_timer_t ohci_port_reset_timer[2];
|
|
||||||
uint8_t ohci_interrupt_counter : 3;
|
|
||||||
usb_device_t *ohci_devices[2];
|
|
||||||
usb_device_t *uhci_devices[2];
|
|
||||||
uint8_t ohci_usb_buf[4096];
|
|
||||||
uint8_t ohci_initial_start;
|
|
||||||
|
|
||||||
usb_params_t *usb_params;
|
|
||||||
} usb_t;
|
} usb_t;
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
|
|
||||||
/* Base USB descriptor struct. */
|
|
||||||
typedef struct usb_desc_base_t {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
} usb_desc_base_t;
|
|
||||||
|
|
||||||
enum usb_desc_setup_req_types {
|
|
||||||
USB_SETUP_TYPE_DEVICE = 0x0,
|
|
||||||
USB_SETUP_TYPE_INTERFACE = 0x1,
|
|
||||||
USB_SETUP_TYPE_ENDPOING = 0x2,
|
|
||||||
USB_SETUP_TYPE_OTHER = 0x3,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define USB_SETUP_TYPE_MAX 0x1F
|
|
||||||
|
|
||||||
#define USB_SETUP_DEV_TO_HOST 0x80
|
|
||||||
|
|
||||||
typedef struct usb_desc_setup_t {
|
|
||||||
uint8_t bmRequestType;
|
|
||||||
uint8_t bRequest;
|
|
||||||
uint16_t wValue;
|
|
||||||
uint16_t wIndex;
|
|
||||||
uint16_t wLength;
|
|
||||||
} usb_desc_setup_t;
|
|
||||||
|
|
||||||
typedef struct usb_desc_endpoint_t {
|
|
||||||
usb_desc_base_t base;
|
|
||||||
uint8_t bEndpointAddress;
|
|
||||||
uint8_t bmAttributes;
|
|
||||||
uint16_t wMaxPacketSize;
|
|
||||||
uint8_t bInterval;
|
|
||||||
} usb_desc_endpoint_t;
|
|
||||||
|
|
||||||
typedef struct usb_desc_hid_t {
|
|
||||||
usb_desc_base_t base;
|
|
||||||
|
|
||||||
uint16_t bcdHID;
|
|
||||||
uint8_t bCountryCode;
|
|
||||||
uint8_t bNumDescriptors;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
uint16_t wDescriptorLength;
|
|
||||||
} usb_desc_hid_t;
|
|
||||||
|
|
||||||
typedef struct usb_desc_interface_t {
|
|
||||||
usb_desc_base_t base;
|
|
||||||
|
|
||||||
uint8_t bInterfaceNumber;
|
|
||||||
uint8_t bAlternateSetting;
|
|
||||||
uint8_t bNumEndpoints;
|
|
||||||
uint8_t bInterfaceClass;
|
|
||||||
uint8_t bInterfaceSubClass;
|
|
||||||
uint8_t bInterfaceProtocol;
|
|
||||||
uint8_t iInterface;
|
|
||||||
} usb_desc_interface_t;
|
|
||||||
|
|
||||||
typedef struct usb_desc_string_t {
|
|
||||||
usb_desc_base_t base;
|
|
||||||
uint16_t bString[];
|
|
||||||
} usb_desc_string_t;
|
|
||||||
|
|
||||||
typedef struct usb_desc_conf_t {
|
|
||||||
usb_desc_base_t base;
|
|
||||||
|
|
||||||
uint16_t wTotalLength;
|
|
||||||
uint8_t bNumInterfaces;
|
|
||||||
uint8_t bConfigurationValue;
|
|
||||||
uint8_t iConfiguration;
|
|
||||||
uint8_t bmAttributes;
|
|
||||||
uint8_t bMaxPower;
|
|
||||||
} usb_desc_conf_t;
|
|
||||||
|
|
||||||
typedef struct usb_desc_device_t {
|
|
||||||
usb_desc_base_t base;
|
|
||||||
|
|
||||||
uint16_t bcdUSB;
|
|
||||||
uint8_t bDeviceClass;
|
|
||||||
uint8_t bDeviceSubClass;
|
|
||||||
uint8_t bDeviceProtocol;
|
|
||||||
uint8_t bMaxPacketSize;
|
|
||||||
uint16_t idVendor;
|
|
||||||
uint16_t idProduct;
|
|
||||||
uint16_t bcdDevice;
|
|
||||||
uint8_t iManufacturer;
|
|
||||||
uint8_t iProduct;
|
|
||||||
uint8_t iSerialNumber;
|
|
||||||
uint8_t bNumConfigurations;
|
|
||||||
} usb_desc_device_t;
|
|
||||||
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
/* USB endpoint device struct. Incomplete and unused. */
|
|
||||||
typedef struct usb_device_t {
|
|
||||||
usb_desc_device_t device_desc;
|
|
||||||
struct {
|
|
||||||
usb_desc_conf_t conf_desc;
|
|
||||||
usb_desc_base_t* other_descs[16];
|
|
||||||
} conf_desc_items;
|
|
||||||
|
|
||||||
/* General-purpose function for I/O. Non-zero value indicates error. */
|
|
||||||
uint8_t (*device_process)(void* priv, uint8_t* data, uint32_t *len, uint8_t pid_token, uint8_t endpoint, uint8_t underrun_not_allowed);
|
|
||||||
/* Device reset. */
|
|
||||||
void (*device_reset)(void* priv);
|
|
||||||
/* Get address. */
|
|
||||||
uint8_t (*device_get_address)(void* priv);
|
|
||||||
|
|
||||||
void* priv;
|
|
||||||
} usb_device_t;
|
|
||||||
|
|
||||||
/* Global variables. */
|
/* Global variables. */
|
||||||
extern const device_t usb_device;
|
extern const device_t usb_device;
|
||||||
extern usb_t* usb_device_inst;
|
|
||||||
|
|
||||||
/* Functions. */
|
/* Functions. */
|
||||||
extern void uhci_update_io_mapping(usb_t *dev, uint8_t base_l, uint8_t base_h, int enable);
|
extern void uhci_update_io_mapping(usb_t *dev, uint8_t base_l, uint8_t base_h, int enable);
|
||||||
extern void ohci_update_mem_mapping(usb_t *dev, uint8_t base1, uint8_t base2, uint8_t base3, int enable);
|
extern void ohci_update_mem_mapping(usb_t *dev, uint8_t base1, uint8_t base2, uint8_t base3, int enable);
|
||||||
/* Attach USB device to a port of a USB bus. Returns the port to which it got attached to. */
|
|
||||||
extern uint8_t usb_attach_device(usb_t *dev, usb_device_t* device, uint8_t bus_type);
|
|
||||||
/* Detach USB device from a port. */
|
|
||||||
extern void usb_detach_device(usb_t *dev, uint8_t port, uint8_t bus_type);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user