SiI3124 has no SNotification register. Handle Asynchronous Notifications

there without it as good as possible.
This commit is contained in:
mav 2009-12-07 16:10:48 +00:00
parent 5644cc9a41
commit 0f3cbe47eb
2 changed files with 27 additions and 12 deletions

View File

@ -93,15 +93,17 @@ static struct {
uint32_t id;
const char *name;
int ports;
int quirks;
#define SIIS_Q_SNTF 1
} siis_ids[] = {
{0x31241095, "SiI3124", 4},
{0x31248086, "SiI3124", 4},
{0x31321095, "SiI3132", 2},
{0x02421095, "SiI3132", 2},
{0x02441095, "SiI3132", 2},
{0x31311095, "SiI3131", 1},
{0x35311095, "SiI3531", 1},
{0, NULL, 0}
{0x31241095, "SiI3124", 4, 0},
{0x31248086, "SiI3124", 4, 0},
{0x31321095, "SiI3132", 2, SIIS_Q_SNTF},
{0x02421095, "SiI3132", 2, SIIS_Q_SNTF},
{0x02441095, "SiI3132", 2, SIIS_Q_SNTF},
{0x31311095, "SiI3131", 1, SIIS_Q_SNTF},
{0x35311095, "SiI3531", 1, SIIS_Q_SNTF},
{0, NULL, 0, 0}
};
static int
@ -113,7 +115,7 @@ siis_probe(device_t dev)
for (i = 0; siis_ids[i].id != 0; i++) {
if (siis_ids[i].id == devid) {
snprintf(buf, sizeof(buf), "%s SATA2 controller",
snprintf(buf, sizeof(buf), "%s SATA controller",
siis_ids[i].name);
device_set_desc_copy(dev, buf);
return (BUS_PROBE_VENDOR);
@ -130,11 +132,12 @@ siis_attach(device_t dev)
device_t child;
int error, i, unit;
ctlr->dev = dev;
for (i = 0; siis_ids[i].id != 0; i++) {
if (siis_ids[i].id == devid)
break;
}
ctlr->dev = dev;
ctlr->quirks = siis_ids[i].quirks;
/* Global memory */
ctlr->r_grid = PCIR_BAR(0);
if (!(ctlr->r_gmem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
@ -413,12 +416,14 @@ siis_ch_probe(device_t dev)
static int
siis_ch_attach(device_t dev)
{
struct siis_controller *ctlr = device_get_softc(device_get_parent(dev));
struct siis_channel *ch = device_get_softc(dev);
struct cam_devq *devq;
int rid, error, i, sata_rev = 0;
ch->dev = dev;
ch->unit = (intptr_t)device_get_ivars(dev);
ch->quirks = ctlr->quirks;
resource_int_value(device_get_name(dev),
device_get_unit(dev), "pm_level", &ch->pm_level);
resource_int_value(device_get_name(dev),
@ -680,8 +685,16 @@ siis_notify_events(device_t dev)
u_int32_t status;
int i;
status = ATA_INL(ch->r_mem, SIIS_P_SNTF);
ATA_OUTL(ch->r_mem, SIIS_P_SNTF, status);
if (ch->quirks & SIIS_Q_SNTF) {
status = ATA_INL(ch->r_mem, SIIS_P_SNTF);
ATA_OUTL(ch->r_mem, SIIS_P_SNTF, status);
} else {
/*
* Without SNTF we have no idea which device sent notification.
* If PMP is connected, assume it, else - device.
*/
status = (ch->pm_present) ? 0x8000 : 0x0001;
}
if (bootverbose)
device_printf(dev, "SNTF 0x%04x\n", status);
for (i = 0; i < 16; i++) {

View File

@ -363,6 +363,7 @@ struct siis_channel {
struct ata_dma dma; /* DMA data */
struct cam_sim *sim;
struct cam_path *path;
int quirks;
int pm_level; /* power management level */
struct siis_slot slot[SIIS_MAX_SLOTS];
@ -400,6 +401,7 @@ struct siis_controller {
void *handle;
int r_irq_rid;
} irq;
int quirks;
int channels;
struct {
void (*function)(void *);