From 29d61ad0eba019ff596945bc75c67b2f1bb503ed Mon Sep 17 00:00:00 2001 From: David Gwynne Date: Thu, 5 Apr 2007 10:45:26 +0000 Subject: finish resetting the device by sending a soft reset via the post_direct mechanism, and then read the device signature. --- sys/dev/ic/sili.c | 37 +++++++++++++++++++++++++++++++++++-- sys/dev/ic/silireg.h | 6 +++++- 2 files changed, 40 insertions(+), 3 deletions(-) (limited to 'sys/dev/ic') diff --git a/sys/dev/ic/sili.c b/sys/dev/ic/sili.c index de928480f96..ca781baa117 100644 --- a/sys/dev/ic/sili.c +++ b/sys/dev/ic/sili.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sili.c,v 1.10 2007/04/05 10:15:27 dlg Exp $ */ +/* $OpenBSD: sili.c,v 1.11 2007/04/05 10:45:25 dlg Exp $ */ /* * Copyright (c) 2007 David Gwynne @@ -65,6 +65,7 @@ int sili_pwait_ne(struct sili_port *, bus_size_t, u_int32_t, u_int32_t, int); void sili_post_direct(struct sili_port *, u_int, void *, size_t buflen); +u_int32_t sili_signature(struct sili_port *, u_int); /* atascsi interface */ int sili_ata_probe(void *, int); @@ -249,11 +250,26 @@ sili_post_direct(struct sili_port *sp, u_int slot, void *buf, size_t buflen) sili_pwrite(sp, SILI_PREG_FIFO, slot); } +u_int32_t +sili_signature(struct sili_port *sp, u_int slot) +{ + u_int32_t sig_hi, sig_lo; + + sig_hi = sili_pread(sp, SILI_PREG_SIG_HI(slot)); + sig_hi <<= SILI_PREG_SIG_HI_SHIFT; + sig_lo = sili_pread(sp, SILI_PREG_SIG_LO(slot)); + sig_lo &= SILI_PREG_SIG_LO_MASK; + + return (sig_hi | sig_lo); +} + int sili_ata_probe(void *xsc, int port) { struct sili_softc *sc = xsc; struct sili_port *sp = &sc->sc_ports[port]; + struct sili_prb_softreset sreset; + u_int32_t signature; sili_pwrite(sp, SILI_PREG_PCC, SILI_PREG_PCC_PORTRESET); sili_pwrite(sp, SILI_PREG_PCS, SILI_PREG_PCS_A32B); @@ -262,9 +278,26 @@ sili_ata_probe(void *xsc, int port) SATA_SStatus_DET_DEV, 1000)) return (ATA_PORT_T_NONE); - printf("%s.%d: SSTS 0x%08x\n", DEVNAME(sc), port, + DPRINTF(SILI_D_VERBOSE, "%s.%d: SSTS 0x%08x\n", DEVNAME(sc), port, sili_pread(sp, SILI_PREG_SSTS)); + bzero(&sreset, sizeof(sreset)); + sreset.control = htole16(SILI_PRB_SOFT_RESET | SILI_PRB_INTERRUPT_MASK); + /* XXX sreset fis pmp field */ + + /* we use slot 0 */ + sili_post_direct(sp, 0, &sreset, sizeof(sreset)); + if (!sili_pwait_eq(sp, SILI_PREG_PSS, (1 << 0), 0, 1000)) { + /* DPRINTF timeout waiting for soft reset */ + return (ATA_PORT_T_NONE); + } + + /* Read device signature from command slot. */ + signature = sili_signature(sp, 0); + + DPRINTF(SILI_D_VERBOSE, "%s.%d: signature 0x%08x\n", DEVNAME(sc), port, + signature); + return (ATA_PORT_T_NONE); } diff --git a/sys/dev/ic/silireg.h b/sys/dev/ic/silireg.h index 992c546fddb..5e340673477 100644 --- a/sys/dev/ic/silireg.h +++ b/sys/dev/ic/silireg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: silireg.h,v 1.16 2007/04/05 09:57:50 dlg Exp $ */ +/* $OpenBSD: silireg.h,v 1.17 2007/04/05 10:45:25 dlg Exp $ */ /* * Copyright (c) 2007 David Gwynne @@ -59,6 +59,10 @@ #define SILI_PREG_LRAM 0x0000 /* Port LRAM */ #define SILI_PREG_SLOT_WIDTH 0x80 #define SILI_PREG_SLOT(_s) (SILI_PREG_LRAM + (_s) * SILI_PREG_SLOT_WIDTH) +#define SILI_PREG_SIG_HI(_s) (SILI_PREG_SLOT(_s) + 0x0c) +#define SILI_PREG_SIG_HI_SHIFT 8 +#define SILI_PREG_SIG_LO(_s) (SILI_PREG_SLOT(_s) + 0x14) +#define SILI_PREG_SIG_LO_MASK 0xff /* XXX PMP Bits */ #define SILI_PREG_PCS 0x1000 /* Port Control Set / Status */ #define SILI_PREG_PCS_OOBB (1<<25) /* OOB Bypass */ -- cgit v1.2.3