Converted the ATA bus manager to the new driver architecture; did not test it
yet, though, as this machine takes a bit longer compiling... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25668 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -4,12 +4,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Part of Open IDE bus manager
|
|
||||||
|
|
||||||
Manager of IDE controllers
|
Manager of IDE controllers
|
||||||
|
|
||||||
Whenever a new IDE channel is reported, a new SIM is
|
Whenever a new IDE channel is reported, a new SIM is
|
||||||
registered at the SCSI bus manager.
|
registered at the SCSI bus manager.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ide_internal.h"
|
#include "ide_internal.h"
|
||||||
@@ -23,12 +21,11 @@
|
|||||||
#define TRACE dprintf
|
#define TRACE dprintf
|
||||||
|
|
||||||
|
|
||||||
/** called when an IDE channel was registered by a controller driver */
|
/*! Called when an IDE channel was registered by a controller driver */
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
ide_channel_added(device_node_handle parent)
|
ide_channel_added(device_node *parent)
|
||||||
{
|
{
|
||||||
char *controller_name = NULL;
|
const char *controller_name = NULL;
|
||||||
uint32 channel_id;
|
uint32 channel_id;
|
||||||
|
|
||||||
TRACE("ide_channel_added, parent is %p\n", parent);
|
TRACE("ide_channel_added, parent is %p\n", parent);
|
||||||
@@ -49,10 +46,9 @@ ide_channel_added(device_node_handle parent)
|
|||||||
{
|
{
|
||||||
device_attr attrs[] =
|
device_attr attrs[] =
|
||||||
{
|
{
|
||||||
{ B_DRIVER_MODULE, B_STRING_TYPE, { string: IDE_SIM_MODULE_NAME }},
|
{ B_DEVICE_FIXED_CHILD, B_STRING_TYPE, { string: SCSI_FOR_SIM_MODULE_NAME }},
|
||||||
{ B_DRIVER_FIXED_CHILD, B_STRING_TYPE, { string: SCSI_FOR_SIM_MODULE_NAME }},
|
|
||||||
|
|
||||||
{ SCSI_DESCRIPTION_CONTROLLER_NAME, B_STRING_TYPE,
|
{ SCSI_DESCRIPTION_CONTROLLER_NAME, B_STRING_TYPE,
|
||||||
{ string: controller_name }},
|
{ string: controller_name }},
|
||||||
// maximum number of blocks per transmission:
|
// maximum number of blocks per transmission:
|
||||||
// - ATAPI uses packets, i.e. normal SCSI limits apply
|
// - ATAPI uses packets, i.e. normal SCSI limits apply
|
||||||
@@ -61,31 +57,23 @@ ide_channel_added(device_node_handle parent)
|
|||||||
// - some broken disk's firmware (read: IBM DTTA drives)
|
// - some broken disk's firmware (read: IBM DTTA drives)
|
||||||
// don't like 256 blocks in command queuing mode
|
// don't like 256 blocks in command queuing mode
|
||||||
// -> use 255 blocks as a least common nominator
|
// -> use 255 blocks as a least common nominator
|
||||||
// (this is still 127.5K for HDs and 510K for CDs,
|
// (this is still 127.5K for HDs and 510K for CDs,
|
||||||
// which should be sufficient)
|
// which should be sufficient)
|
||||||
// Note: to fix specific drive bugs, use ide_sim_get_restrictions()
|
// Note: to fix specific drive bugs, use ide_sim_get_restrictions()
|
||||||
// in ide_sim.c!
|
// in ide_sim.c!
|
||||||
{ B_BLOCK_DEVICE_MAX_BLOCKS_ITEM, B_UINT32_TYPE, { ui32: 255 }},
|
{ B_BLOCK_DEVICE_MAX_BLOCKS_ITEM, B_UINT32_TYPE, { ui32: 255 }},
|
||||||
{ IDE_CHANNEL_ID_ITEM, B_UINT32_TYPE, { ui32: channel_id }},
|
{ IDE_CHANNEL_ID_ITEM, B_UINT32_TYPE, { ui32: channel_id }},
|
||||||
{ PNP_MANAGER_ID_GENERATOR, B_STRING_TYPE, { string: IDE_CHANNEL_ID_GENERATOR }},
|
// { PNP_MANAGER_ID_GENERATOR, B_STRING_TYPE, { string: IDE_CHANNEL_ID_GENERATOR }},
|
||||||
{ PNP_MANAGER_AUTO_ID, B_UINT32_TYPE, { ui32: channel_id }},
|
// { PNP_MANAGER_AUTO_ID, B_UINT32_TYPE, { ui32: channel_id }},
|
||||||
|
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
device_node_handle node;
|
return pnp->register_node(parent, IDE_SIM_MODULE_NAME, attrs, NULL,
|
||||||
status_t res;
|
NULL);
|
||||||
|
|
||||||
res = pnp->register_device(parent, attrs, NULL, &node);
|
|
||||||
|
|
||||||
free(controller_name);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err:
|
err:
|
||||||
free(controller_name);
|
|
||||||
|
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,18 +5,13 @@
|
|||||||
#ifndef __IDE_INTERNAL_H__
|
#ifndef __IDE_INTERNAL_H__
|
||||||
#define __IDE_INTERNAL_H__
|
#define __IDE_INTERNAL_H__
|
||||||
|
|
||||||
/*
|
|
||||||
Part of Open IDE bus manager
|
|
||||||
|
|
||||||
Internal structures
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <bus/IDE.h>
|
#include <bus/IDE.h>
|
||||||
#include <bus/SCSI.h>
|
#include <bus/SCSI.h>
|
||||||
#include "ide_device_infoblock.h"
|
|
||||||
#include <ide_types.h>
|
|
||||||
#include <device_manager.h>
|
#include <device_manager.h>
|
||||||
|
|
||||||
|
#include <ide_types.h>
|
||||||
|
|
||||||
|
#include "ide_device_infoblock.h"
|
||||||
#include "ata_request.h"
|
#include "ata_request.h"
|
||||||
|
|
||||||
#define debug_level_error 2
|
#define debug_level_error 2
|
||||||
@@ -39,7 +34,7 @@
|
|||||||
// node item containing channel id (uint32)
|
// node item containing channel id (uint32)
|
||||||
#define IDE_CHANNEL_ID_ITEM "ide/channel_id"
|
#define IDE_CHANNEL_ID_ITEM "ide/channel_id"
|
||||||
// SIM interface
|
// SIM interface
|
||||||
#define IDE_SIM_MODULE_NAME "bus_managers/ide/sim/v1"
|
#define IDE_SIM_MODULE_NAME "bus_managers/ide/sim/driver_v1"
|
||||||
|
|
||||||
|
|
||||||
extern device_manager_info *pnp;
|
extern device_manager_info *pnp;
|
||||||
@@ -61,8 +56,6 @@ typedef struct ide_bus_timer_info {
|
|||||||
} ide_bus_timer_info;
|
} ide_bus_timer_info;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct ide_device_info {
|
typedef struct ide_device_info {
|
||||||
struct ide_bus_info *bus;
|
struct ide_bus_info *bus;
|
||||||
|
|
||||||
@@ -73,12 +66,11 @@ typedef struct ide_device_info {
|
|||||||
uint8 DMA_enabled : 1; // DMA enabled
|
uint8 DMA_enabled : 1; // DMA enabled
|
||||||
uint8 is_device1 : 1; // true for slave, false for master
|
uint8 is_device1 : 1; // true for slave, false for master
|
||||||
|
|
||||||
uint8 last_lun; // last LUN
|
uint8 last_lun; // last LUN
|
||||||
|
|
||||||
uint8 DMA_failures; // DMA failures in a row
|
uint8 DMA_failures; // DMA failures in a row
|
||||||
uint8 num_failed_send; // number of consequetive send problems
|
uint8 num_failed_send; // number of consequetive send problems
|
||||||
|
|
||||||
|
|
||||||
struct ata_request * requestActive;
|
struct ata_request * requestActive;
|
||||||
struct ata_request * requestFree;
|
struct ata_request * requestFree;
|
||||||
|
|
||||||
@@ -93,7 +85,7 @@ typedef struct ide_device_info {
|
|||||||
// ata from here on
|
// ata from here on
|
||||||
uint64 total_sectors; // size in sectors
|
uint64 total_sectors; // size in sectors
|
||||||
|
|
||||||
// atapi from here on
|
// atapi from here on
|
||||||
uint8 packet[12]; // atapi command packet
|
uint8 packet[12]; // atapi command packet
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -113,7 +105,7 @@ typedef struct ide_device_info {
|
|||||||
bool has_odd_byte; // remaining odd byte
|
bool has_odd_byte; // remaining odd byte
|
||||||
int odd_byte; // content off odd byte
|
int odd_byte; // content off odd byte
|
||||||
|
|
||||||
ide_device_infoblock infoblock; // infoblock of device
|
ide_device_infoblock infoblock; // infoblock of device
|
||||||
} ide_device_info;
|
} ide_device_info;
|
||||||
|
|
||||||
|
|
||||||
@@ -137,7 +129,6 @@ typedef enum {
|
|||||||
|
|
||||||
|
|
||||||
struct ide_bus_info {
|
struct ide_bus_info {
|
||||||
|
|
||||||
// controller
|
// controller
|
||||||
ide_controller_interface *controller;
|
ide_controller_interface *controller;
|
||||||
void *channel_cookie;
|
void *channel_cookie;
|
||||||
@@ -163,7 +154,7 @@ struct ide_bus_info {
|
|||||||
|
|
||||||
uchar path_id;
|
uchar path_id;
|
||||||
|
|
||||||
device_node_handle node; // our pnp node
|
device_node *node; // our pnp node
|
||||||
|
|
||||||
// restrictions, read from controller node
|
// restrictions, read from controller node
|
||||||
uint8 max_devices;
|
uint8 max_devices;
|
||||||
|
|||||||
@@ -1,20 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004-2006, Axel Dörfler, [email protected]. All rights reserved.
|
* Copyright 2004-2008, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
* Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
* Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
||||||
*
|
*
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Part of Open IDE bus manager
|
|
||||||
|
|
||||||
Interface between ide bus manager and scsi bus manager.
|
Interface between ide bus manager and scsi bus manager.
|
||||||
|
|
||||||
The IDE bus manager has a bit unusual structure as it
|
The IDE bus manager has a bit unusual structure as it
|
||||||
consists of a single level only. In fact it is no bus manager
|
consists of a single level only. In fact it is no bus manager
|
||||||
in terms of the PnP structure at all but a driver that maps
|
in terms of the PnP structure at all but a driver that maps
|
||||||
one SCSI bus onto one IDE controller.
|
one SCSI bus onto one IDE controller.
|
||||||
|
|
||||||
This structure does not allow us to publish IDE devices
|
This structure does not allow us to publish IDE devices
|
||||||
as they can be accessed via the SCSI bus node only. Therefore
|
as they can be accessed via the SCSI bus node only. Therefore
|
||||||
we do a full bus scan every time the IDE bus node is loaded.
|
we do a full bus scan every time the IDE bus node is loaded.
|
||||||
@@ -103,7 +101,7 @@ err_disconnected:
|
|||||||
static uchar
|
static uchar
|
||||||
sim_path_inquiry(ide_bus_info *bus, scsi_path_inquiry *info)
|
sim_path_inquiry(ide_bus_info *bus, scsi_path_inquiry *info)
|
||||||
{
|
{
|
||||||
char *controller_name;
|
const char *controller_name;
|
||||||
|
|
||||||
FLOW("sim_path_inquiry, bus %p\n", bus);
|
FLOW("sim_path_inquiry, bus %p\n", bus);
|
||||||
|
|
||||||
@@ -128,7 +126,6 @@ sim_path_inquiry(ide_bus_info *bus, scsi_path_inquiry *info)
|
|||||||
if (pnp->get_attr_string(bus->node, SCSI_DESCRIPTION_CONTROLLER_NAME,
|
if (pnp->get_attr_string(bus->node, SCSI_DESCRIPTION_CONTROLLER_NAME,
|
||||||
&controller_name, true) == B_OK) {
|
&controller_name, true) == B_OK) {
|
||||||
strlcpy(info->hba_vid, controller_name, SCSI_HBA_ID);
|
strlcpy(info->hba_vid, controller_name, SCSI_HBA_ID);
|
||||||
free(controller_name);
|
|
||||||
} else
|
} else
|
||||||
strlcpy(info->hba_vid, "", SCSI_HBA_ID);
|
strlcpy(info->hba_vid, "", SCSI_HBA_ID);
|
||||||
|
|
||||||
@@ -199,6 +196,17 @@ scan_bus(ide_bus_info *bus)
|
|||||||
TRACE("ATA: scan_bus: bus %p finished\n", bus);
|
TRACE("ATA: scan_bus: bus %p finished\n", bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
sim_set_scsi_bus(ide_bus_info *bus, scsi_bus scsi)
|
||||||
|
{
|
||||||
|
bus->scsi_cookie = scsi;
|
||||||
|
|
||||||
|
// detect devices
|
||||||
|
scan_bus(bus);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static uchar
|
static uchar
|
||||||
sim_rescan_bus(ide_bus_info *bus)
|
sim_rescan_bus(ide_bus_info *bus)
|
||||||
{
|
{
|
||||||
@@ -253,9 +261,9 @@ sim_reset_device(ide_bus_info *bus, uchar target_id, uchar target_lun)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
ide_sim_init_bus(device_node_handle node, void *user_cookie, void **cookie)
|
ide_sim_init_bus(device_node *node, void **cookie)
|
||||||
{
|
{
|
||||||
device_node_handle parent;
|
device_node *parent;
|
||||||
ide_bus_info *bus;
|
ide_bus_info *bus;
|
||||||
bool dmaDisabled = false;
|
bool dmaDisabled = false;
|
||||||
status_t status;
|
status_t status;
|
||||||
@@ -280,7 +288,6 @@ ide_sim_init_bus(device_node_handle node, void *user_cookie, void **cookie)
|
|||||||
sprintf(bus->name, "ide_bus %d", (int)channel_id);
|
sprintf(bus->name, "ide_bus %d", (int)channel_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bus->scsi_cookie = user_cookie;
|
|
||||||
bus->timer.bus = bus;
|
bus->timer.bus = bus;
|
||||||
|
|
||||||
if ((status = scsi->alloc_dpc(&bus->irq_dpc)) < B_OK)
|
if ((status = scsi->alloc_dpc(&bus->irq_dpc)) < B_OK)
|
||||||
@@ -293,7 +300,7 @@ ide_sim_init_bus(device_node_handle node, void *user_cookie, void **cookie)
|
|||||||
bus->devices[1] = NULL;
|
bus->devices[1] = NULL;
|
||||||
|
|
||||||
status = INIT_BEN(&bus->status_report_ben, "ide_status_report");
|
status = INIT_BEN(&bus->status_report_ben, "ide_status_report");
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
goto err4;
|
goto err4;
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -324,19 +331,16 @@ ide_sim_init_bus(device_node_handle node, void *user_cookie, void **cookie)
|
|||||||
|
|
||||||
SHOW_FLOW(2, "can_dma: %d", bus->can_DMA);
|
SHOW_FLOW(2, "can_dma: %d", bus->can_DMA);
|
||||||
|
|
||||||
parent = pnp->get_parent(node);
|
parent = pnp->get_parent_node(node);
|
||||||
|
|
||||||
status = pnp->init_driver(parent, bus, (driver_module_info **)&bus->controller,
|
status = pnp->get_driver(parent, (driver_module_info **)&bus->controller,
|
||||||
(void **)&bus->channel_cookie);
|
(void **)&bus->channel_cookie);
|
||||||
|
|
||||||
pnp->put_device_node(parent);
|
pnp->put_node(parent);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
goto err5;
|
goto err5;
|
||||||
|
|
||||||
*cookie = bus;
|
*cookie = bus;
|
||||||
|
|
||||||
// detect devices
|
|
||||||
scan_bus(bus);
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
err5:
|
err5:
|
||||||
@@ -350,28 +354,20 @@ err1:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static void
|
||||||
ide_sim_uninit_bus(ide_bus_info *bus)
|
ide_sim_uninit_bus(ide_bus_info *bus)
|
||||||
{
|
{
|
||||||
device_node_handle parent;
|
|
||||||
|
|
||||||
FLOW("ide_sim_uninit_bus: bus %p\n", bus);
|
FLOW("ide_sim_uninit_bus: bus %p\n", bus);
|
||||||
|
|
||||||
parent = pnp->get_parent(bus->node);
|
|
||||||
pnp->uninit_driver(parent);
|
|
||||||
pnp->put_device_node(parent);
|
|
||||||
|
|
||||||
DELETE_BEN(&bus->status_report_ben);
|
DELETE_BEN(&bus->status_report_ben);
|
||||||
scsi->free_dpc(bus->irq_dpc);
|
scsi->free_dpc(bus->irq_dpc);
|
||||||
|
|
||||||
free(bus);
|
free(bus);
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ide_sim_bus_removed(device_node_handle node, ide_bus_info *bus)
|
ide_sim_bus_removed(ide_bus_info *bus)
|
||||||
{
|
{
|
||||||
FLOW("ide_sim_bus_removed\n");
|
FLOW("ide_sim_bus_removed\n");
|
||||||
|
|
||||||
@@ -412,9 +408,9 @@ ide_sim_get_restrictions(ide_bus_info *bus, uchar target_id,
|
|||||||
*max_blocks = 255;
|
*max_blocks = 255;
|
||||||
|
|
||||||
if (device->is_atapi) {
|
if (device->is_atapi) {
|
||||||
if (strncmp(device->infoblock.model_number, "IOMEGA ZIP 100 ATAPI",
|
if (strncmp(device->infoblock.model_number, "IOMEGA ZIP 100 ATAPI",
|
||||||
strlen("IOMEGA ZIP 100 ATAPI")) == 0
|
strlen("IOMEGA ZIP 100 ATAPI")) == 0
|
||||||
|| strncmp( device->infoblock.model_number, "IOMEGA Clik!",
|
|| strncmp( device->infoblock.model_number, "IOMEGA Clik!",
|
||||||
strlen( "IOMEGA Clik!")) == 0) {
|
strlen( "IOMEGA Clik!")) == 0) {
|
||||||
SHOW_ERROR0(2, "Found buggy ZIP/Clik! drive - restricting transmission size");
|
SHOW_ERROR0(2, "Found buggy ZIP/Clik! drive - restricting transmission size");
|
||||||
*max_blocks = 64;
|
*max_blocks = 64;
|
||||||
@@ -493,13 +489,18 @@ scsi_sim_interface ide_sim_module = {
|
|||||||
std_ops,
|
std_ops,
|
||||||
},
|
},
|
||||||
|
|
||||||
NULL, // supported devices
|
NULL, // supported devices
|
||||||
NULL, // register node
|
NULL, // register node
|
||||||
(status_t (*)(device_node_handle, void *, void **))ide_sim_init_bus,
|
(status_t (*)(device_node *, void **)) ide_sim_init_bus,
|
||||||
(status_t (*)(void *) ) ide_sim_uninit_bus,
|
(void (*)(void *)) ide_sim_uninit_bus,
|
||||||
(void (*)(device_node_handle, void *)) ide_sim_bus_removed
|
NULL, // register child devices
|
||||||
|
NULL, // rescan
|
||||||
|
(void (*)(void *)) ide_sim_bus_removed,
|
||||||
|
NULL, // suspend
|
||||||
|
NULL // resume
|
||||||
},
|
},
|
||||||
|
|
||||||
|
(void (*)(scsi_sim_cookie, scsi_bus)) sim_set_scsi_bus,
|
||||||
(void (*)(scsi_sim_cookie, scsi_ccb *)) sim_scsi_io,
|
(void (*)(scsi_sim_cookie, scsi_ccb *)) sim_scsi_io,
|
||||||
(uchar (*)(scsi_sim_cookie, scsi_ccb *)) sim_abort,
|
(uchar (*)(scsi_sim_cookie, scsi_ccb *)) sim_abort,
|
||||||
(uchar (*)(scsi_sim_cookie, uchar, uchar)) sim_reset_device,
|
(uchar (*)(scsi_sim_cookie, uchar, uchar)) sim_reset_device,
|
||||||
@@ -508,8 +509,8 @@ scsi_sim_interface ide_sim_module = {
|
|||||||
(uchar (*)(scsi_sim_cookie, scsi_path_inquiry *))sim_path_inquiry,
|
(uchar (*)(scsi_sim_cookie, scsi_path_inquiry *))sim_path_inquiry,
|
||||||
(uchar (*)(scsi_sim_cookie)) sim_rescan_bus,
|
(uchar (*)(scsi_sim_cookie)) sim_rescan_bus,
|
||||||
(uchar (*)(scsi_sim_cookie)) sim_reset_bus,
|
(uchar (*)(scsi_sim_cookie)) sim_reset_bus,
|
||||||
|
|
||||||
(void (*)(scsi_sim_cookie, uchar,
|
(void (*)(scsi_sim_cookie, uchar,
|
||||||
bool*, bool *, uint32 *)) ide_sim_get_restrictions,
|
bool*, bool *, uint32 *)) ide_sim_get_restrictions,
|
||||||
|
|
||||||
(status_t (*)(scsi_sim_cookie, uint8, uint32, void *, size_t))ide_sim_ioctl,
|
(status_t (*)(scsi_sim_cookie, uint8, uint32, void *, size_t))ide_sim_ioctl,
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ ide_irq_handler(ide_bus_info *bus, uint8 status)
|
|||||||
IDE_UNLOCK(bus);
|
IDE_UNLOCK(bus);
|
||||||
|
|
||||||
scsi->schedule_dpc(bus->scsi_cookie, bus->irq_dpc, ide_dpc, bus);
|
scsi->schedule_dpc(bus->scsi_cookie, bus->irq_dpc, ide_dpc, bus);
|
||||||
return B_INVOKE_SCHEDULER;
|
return B_INVOKE_SCHEDULER;
|
||||||
|
|
||||||
case ide_state_idle:
|
case ide_state_idle:
|
||||||
TRACE(("state: idle, num_running_reqs %d\n", bus->num_running_reqs));
|
TRACE(("state: idle, num_running_reqs %d\n", bus->num_running_reqs));
|
||||||
@@ -319,7 +319,7 @@ ide_timeout(timer *arg)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
// this case also happens if a timeout fires too late;
|
// this case also happens if a timeout fires too late;
|
||||||
// unless there is a bug, the timeout should always be canceled
|
// unless there is a bug, the timeout should always be canceled
|
||||||
// before declaring bus as being idle
|
// before declaring bus as being idle
|
||||||
dprintf("BUG: unknown state (%d)\n", (int)bus->state);
|
dprintf("BUG: unknown state (%d)\n", (int)bus->state);
|
||||||
|
|
||||||
@@ -333,7 +333,7 @@ ide_timeout(timer *arg)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** finish bus access;
|
/** finish bus access;
|
||||||
* check if any device wants to service pending commands + execute synced_pc
|
* check if any device wants to service pending commands + execute synced_pc
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user