this is fun.  i wrote this driver a long time ago.  but all the little
quirks (even of the documentation) come back quickly.  i put
the kernel i'm running up on 9atom  you can download them
@
        http://ftp.9atom.org/other/9plug
        http://ftp.9atom.org/other/s9plug
or
        9fs atom; fcp /n/atom/ftp/*9plug /some/where

please try that kernel and let me know.  since the driver
does hotplugging, it might be after you've connected to the file
server that you get a connection.

also try unplugging the usb devices.  the host bridge error is
omnious.  often a host bridge error will screw up multiple devices.

here's the results i get

        kw# cat /dev/kmesg
        127 holes free
        009a9000 03be5000 52674560
        52674560 bytes free
        l1 D: 16384 bytes, 4 ways 128 sets 32 bytes/line; write-through only
        l1 I: 16384 bytes, 4 ways 128 sets 32 bytes/line; write-back type `reg 
7 ops, format C' (016) possible
        l2 cache: 256K or 512K: 4 ways, 32-byte lines, write-back, sdram only
        cpu0: 1200MHz ARM Marvell 88F6281 A0; arm926ej-s arch v5te rev 2.1 part 
131
        #S/sd0: sata ii 2 ports
        #F0: kwnand: Hy27UF084G2M 536,870,912 bytes pagesize 2048 erasesize 
131,072 spares per page 64
        #l0: 88e1116: 1000Mbps port 0xf1072000 irq 11 tu 1514: 00504301db37
        #l1: 88e1116: 1000Mbps port 0xf1076000 irq 15 tu 1514: 00504301db38
        #u/usb/ep1.0: ehci: port 0xf1050100 irq 19
        preallocate 16384 x 4096 KB 0x03be5000-0x07be5000
        504M memory: 52M kernel data, 452M user, 0M swap
        usb/hub... version...time...
        
        init: starting /bin/rc
        kw# sd01: status: 000 -> 123: new
        sd01: llba 78,165,360 sectors
          INTEL SSDSA2M040G2GC 2CV102HD CVGB03800093040NGN [newdrive]


        kw# cat /dev/sd00/ctl
        inquiry 
        state   null
        sig     00000000
        link    down
        sstatus 00000000
        serror  00000000
        sctl    00000300
        isr     00804000
        icfg    009b7095
        ifccr   00000000
        geometry 0 0


        kw# cat /dev/sd01/ctl
        inquiry INTEL SSDSA2M040G2GC
        state   ready
        sig     01010101
        model   INTEL SSDSA2M040G2GC
        serial  CVGB03800093040NGN
        firm    2CV102HD
        wwn     50015179593f82f0
        tler    5000
        link    up
        sstatus 00000123
        serror  14010000
        sctl    00000300
        isr     00404034
        icfg    009b7095
        ifccr   00000000
        geometry 78165360 512
        part data 0 78165360

you mention that the first thing you do is this

        d->reg[Sctl] = 3*Aipm | 0*Aspd | Adet; (I’m omitting | 3*Aspm as it 
done in NetBSD, though the results are bad even with it).

this doesn't jive with the sata spec (the ahci spec, which for the S registers
mirrors it, is more accessible).  it may be beneficial to read the spec.
the actions that need to be done are
        1.  clear the Serror register (sdkw:1228)
        2.  set the Icfg register (sdkw:1229)
                (the setting of emphasis was a guess and could be wrong for
                your device.  it may also vary by device.)
        3.  reset the phy.  this is a 3 step process in linkrst()
                a) turn on device detection
                b) wait 1ms  (unsure of this timing,  it could be longer)
                c) turn off device detection

3*Aspm requests transition to active state.  if you get bad results
by turning the device on, then something else is wrong.  :-)

in fact you mention that Sctl = 300, which means that the device
is asleep. (Iactive|Isleepy if you follow pc/ahci.h)

> Not changed at all… WTF?

you must clear the error register first.

> Maybe NetBSD SoC driver code does some init, which Plan 9 doesn’t?

i don't think that's it.

- erik

Reply via email to