iic0 at piixpm0

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

iic0 at piixpm0

Anton Maksimenkov-2
Hi all.

Предистория такова. Машина PIII ибмовский сервер. Издавна не хочет
дружить с iic. Загрузка зависает на
piixpm at pci0 dev15 function0 "ServerWorks OSB4" rev 0x4f: polling
iic0 at piixpm0

Сидел я сидел, решил пошукать что там происходит. Понатыкал в них
printf'ов и вот что получается. Несколько раз входит в
piixpm_i2c_exec, в ic_exec... и так несколько раз промелькнуло.

Потом вот что. В piixpm_i2c_exec есть такая ветка:

    /* Start transaction */
    ctl |= PIIX_SMB_HC_START;
/* моё */ printf("\tstart transaction\n");
    bus_space_write_1(sc->sc_iot, sc->sc_ioh, PIIX_SMB_HC, ctl);

    if (flags & I2C_F_POLL) {
        /* Poll for completion */
        DELAY(PIIXPM_DELAY);
        for (retries = 1000; retries > 0; retries--) {
            st = bus_space_read_1(sc->sc_iot, sc->sc_ioh,
                PIIX_SMB_HS);
            if ((st & PIIX_SMB_HS_BUSY) == 0)
                break;
            DELAY(PIIXPM_DELAY);
        }
        if (st & PIIX_SMB_HS_BUSY)
            goto timeout;
/* моё */ printf("\tpre piixpm_intr\n");
        piixpm_intr(sc);
/* моё */ printf("\tpost piixpm_intr\n");
    } else {
/* моё */ printf("\t\twait for interrupt\n");
        /* Wait for interrupt */
        if (tsleep(sc, PRIBIO, "iicexec", PIIXPM_TIMEOUT * hz))
            goto timeout;
    }

И вот что самое прикольное. Если в предыдущих входах в piixpm_i2c_exec
выводятся честные
    start transaction
    pre piixpm_intr
    post piixpm_intr
то в последнем случае выводится только
    start transaction
    pre

То есть дело затыкается толи в piixpm_intr(sc), толи до ли начинается
где-то раньше и ко времени вывода моей строки на дисплей, кернел уже
"доходит до кондиции".
Делал я это 1 раз, машина кстати UP. Повторять тест времени не было.

Есть предложения куда ещё натыкать для дальнейшего хачинга? :-))
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Alexander Yurchenko-3
On Mon, Feb 16, 2009 at 03:15:08PM +0500, engineer wrote:
> Есть предложения куда ещё натыкать для дальнейшего хачинга? :-))

Попробуйте окружить вызов piixpm_intr splbio.

> --
> engineer

--
   Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Anton Maksimenkov-2
>> Есть предложения куда ещё натыкать для дальнейшего хачинга? :-))
> Попробуйте окружить вызов piixpm_intr splbio.
Сделал так:

printf("\tpre piixpm_intr ");
retries = splbio();
                piixpm_intr(sc);
splx(retries);
printf("post piixpm_intr\n");

Теперь выводит строчку нормально
    pre piixpm_intr post piixpm_intr:

Но всё равно зависает после нескольких вызовов.
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Anton Maksimenkov-2
>>> Есть предложения куда ещё натыкать для дальнейшего хачинга? :-))
>> Попробуйте окружить вызов piixpm_intr splbio.
> Сделал так:
>
> printf("\tpre piixpm_intr ");
> retries = splbio();
>                piixpm_intr(sc);
> splx(retries);
> printf("post piixpm_intr\n");
>
> Теперь выводит строчку нормально
>    pre piixpm_intr post piixpm_intr:
>
> Но всё равно зависает после нескольких вызовов.

Смысле зря я убрал остальные втычки, завтра верну обратно и поищу
дальше, сегодня меня там уже нету.
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Anton Maksimenkov-2
Так, нашпиговал я снова дебагмессагами, получается вот что.

Предпоследний раз кернель заходит в
 piixpm_i2c_exec ... в нём выполняет обёрнутую spl'ем piixpm_intr ...
затем входит в iicprobe, затем в iicprobenc, и входит в iic_exec.

Затем последний раз заходит в piixpm_i2c_exec и в ней дело доходит до
    /* Start transaction */
    ctl |= PIIX_SMB_HC_START;
    bus_space_write_1(sc->sc_iot, sc->sc_ioh, PIIX_SMB_HC, ctl);

    if (flags & I2C_F_POLL) {
        /* Poll for completion */
        DELAY(PIIXPM_DELAY);
        for (retries = 1000; retries > 0; retries--) {
printf(" (begin bus_space_read_1");
            st = bus_space_read_1(sc->sc_iot, sc->sc_ioh,
                PIIX_SMB_HS);
printf(" end)");
...
и этот bus_space_read_1 не заканчивается. Последним выводится '(begin
bus_space_read_1' и всё. 'end)' нету.

Причём меня смутил один такой момент. Эти iicprobe, iicprobenc и
iic_exec я же тоже нашпиговал (см. их код ниже). Так вот в последнем
входе в piixpm_i2c_exec после строчки 'pre piixpm_intr post
piixpm_intr' следующие сообщения в строку попадают так:
'end2) end2) (begin iicprobe (begin iicprobenc' и затем сообщение о
входе в iic_exec. Внутри iic_exec'а больше сообщений я не ставил,
поэтому не знаю.
Но вот странно что два сообщения 'end2)', которые при ВЫХОДЕ из
iicprobe и iicprobenc образовались - так вот эти сообщения попадают в
строку ПЕРЕД тем как в неё попали сообщения о ВХОДЕ в эти функции.
Хотя должно быть наоборот по идее.

Что-то из этого понятно, или дальше нашпиговывать дебагмессагами?

Вот что я добавил в код той пары функций:
==============================================
u_int8_t
iicprobenc(u_int8_t cmd)
{
    u_int8_t data;

 printf(" (begin iicprobenc");
    /*
     * If we think we are talking to an evil Maxim 1617 or clone,
     * avoid accessing this register because it is death.
     */
    if (skip_fc && cmd == 0xfc)
 {
 printf(" end1)");
        return (0xff);
 }
    iic_acquire_bus(probe_ic, 0);
    if (iic_exec(probe_ic, I2C_OP_READ_WITH_STOP,
        probe_addr, &cmd, sizeof cmd, &data, sizeof data, 0) != 0)
        data = 0xff;
    iic_release_bus(probe_ic, 0);
 printf(" end2)");
    return (data);
}
==============================================
u_int8_t
iicprobe(u_int8_t cmd)
{
 printf(" (begin iicprobe");
    if (probe_val[cmd] != 0xff)
 {
 printf(" end1)");
        return probe_val[cmd];
 }
    probe_val[cmd] = iicprobenc(cmd);
 printf(" end2)");
    return (probe_val[cmd]);
}
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Anton Maksimenkov-2
Кстати вот, продолжил я играться с piixpm и iic.

Для начала обернул уже весь код внутри piixpm_i2c_exec в splbio().
Пока не знаю насколько это правильно, чисто напробу.
Так вот. Теперь понял, что дело происходит так:
...
- iic_exec
-- iic_probe_sensor
--- iic_probe
---- iic_probenc - iic_exec - piixpm_exec
---- выход из iic_probenc
--- выход из iic_probe
--- iic_probe
---- iic_probenc - iic_exec - piixpm_exec

И  опять доходит сюда:
>    /* Start transaction */
>    ctl |= PIIX_SMB_HC_START;
>    bus_space_write_1(sc->sc_iot, sc->sc_ioh, PIIX_SMB_HC, ctl);
printf("end bus_space_write_1)");

>
>    if (flags & I2C_F_POLL) {
>        /* Poll for completion */
>        DELAY(PIIXPM_DELAY);
>        for (retries = 1000; retries > 0; retries--) {
> printf(" (begin bus_space_read_1");
>            st = bus_space_read_1(sc->sc_iot, sc->sc_ioh,
>                PIIX_SMB_HS);
> printf(" end)");
> ...
> и этот bus_space_read_1 не заканчивается. Последним выводится '(begin
> bus_space_read_1' и всё. 'end)' нету.

Только теперь '(begin bus_space_read_1' даже не выводится. Выводится
'end bus_space_write_1)' и всё, встаёт.

Я подумал, может теперь не хватает времени чтобы отработал вывод на
экран даже строчки о начале read. Взял натыкал DELAY(10 *
PIIXPM_DELAY); сразу после printf'ов. Посмотрю что будет.


P.S.
> Причём меня смутил один такой момент. Эти iicprobe, iicprobenc и
...
> Но вот странно что два сообщения 'end2)', которые при ВЫХОДЕ из
> iicprobe и iicprobenc образовались - так вот эти сообщения попадают в
> строку ПЕРЕД тем как в неё попали сообщения о ВХОДЕ в эти функции.
> Хотя должно быть наоборот по идее.
Это моё гониво. Оказывается строчки end) выводились от предыдущих
запусков этих функций, и из гигантских отладочных сообщений я этого не
увидел. Щас переделал дебагмессаги на короткие и почти без '\n'.
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Anton Maksimenkov-2
> Для начала обернул уже весь код внутри piixpm_i2c_exec в splbio().
> Пока не знаю насколько это правильно, чисто напробу.

Я хренею, дорогая редакция... Но ведь ОНО ЗАРАБОТАЛО!


Дело было так. Сначала укоротил я _свои_ дебажные мессаги, поубирал
'\t', '\n' во многих местах. Гружу. Идёт дмесг, потом экран
превращается в фейерверк. Мелькает то выводимые мессаги, то какие-то
шрифты, разные цветные кубики... короче matrix has you.
Ладно думаю. Убрал свои эти левые DELAY'и, гружу... и на тебе, работает!

Повторюсь, машина UP, ядро UP. Заработало именно от того, что я
обернул внутренность piixpm_exec в splbio().

OpenBSD 4.4-stable (GENERIC) #9: Thu Feb 19 12:52:33 YEKT 2009
    root@....ru:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: Intel Pentium III Xeon ("GenuineIntel" 686-class) 700 MHz
cpu0: FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE
real mem  = 1073270784 (1023MB)
avail mem = 1028755456 (981MB)
mainbus0 at root
bios0 at mainbus0: AT/286+ BIOS, date 01/28/04, BIOS32 rev. 0 @ 0xfd591
pcibios0 at bios0: rev 2.1 @ 0xf0000/0xffff
pcibios0: PCI BIOS has 10 Interrupt Routing table entries
pcibios0: PCI Interrupt Router at 000:15:0 ("ServerWorks OSB4" rev 0x00)
pcibios0: PCI bus #0 is the last bus
bios0: ROM list: 0xc0000/0x8000 0xc8000/0x5000 0xcd000/0x2600 0xcf600/0x3400
cpu0 at mainbus0
pci0 at mainbus0 bus 0: configuration mode 1 (no bios)
pchb0 at pci0 dev 0 function 0 "ServerWorks CNB20HE Host" rev 0x21
pci1 at pchb0 bus 1
pchb1 at pci0 dev 0 function 1 "ServerWorks CNB20HE Host" rev 0x01
pchb2 at pci0 dev 0 function 2 "ServerWorks CNB20HE Host" rev 0x00
pci2 at pchb2 bus 2
ami0 at pci2 dev 4 function 0 "Symbios Logic MegaRAID" rev 0x01: irq 10
ami0: LSI 520, 64b/lhc, FW 1L47, BIOS vG121, 128MB RAM
ami0: 1 channels, 0 FC loops, 1 logical drives
scsibus0 at ami0: 40 targets, initiator 40
sd0 at scsibus0 targ 0 lun 0: <AMI, Host drive #00, > SCSI2 0/direct fixed
sd0: 700065MB, 89245 cyl, 255 head, 63 sec, 512 bytes/sec, 1433733120 sec total
scsibus1 at ami0: 16 targets, initiator 16
ses0 at scsibus1 targ 15 lun 0: <IBM, EXP300 S160, D014> SCSI3 3/processor fixed
ips0 at pci2 dev 5 function 0 "IBM ServeRAID" rev 0x00: irq 10
ips0: Morpheus, firmware 7.10.18, bootblock 7.10.18, 64 CCBs, 0 units
scsibus2 at ips0: 8 targets, initiator 0
fxp0 at pci2 dev 6 function 0 "Intel 8255x" rev 0x08, i82559: irq 11,
address 00:90:27:42:6d:73
inphy0 at fxp0 phy 1: i82555 10/100 PHY, rev. 4
pchb3 at pci0 dev 0 function 3 "ServerWorks CNB20HE Host" rev 0x00
ahc0 at pci0 dev 1 function 0 "Adaptec AIC-7896/7 U2" rev 0x00: irq 10
scsibus3 at ahc0: 16 targets, initiator 7
ahc1 at pci0 dev 1 function 1 "Adaptec AIC-7896/7 U2" rev 0x00: irq 10
scsibus4 at ahc1: 16 targets, initiator 7
safte0 at scsibus4 targ 9 lun 0: <IBM, AuSbV1S2, 0> SCSI2 3/processor fixed
pcn0 at pci0 dev 5 function 0 "AMD 79c970 PCnet-PCI" rev 0x44,
Am79c975, rev 4: irq 11, address 00:06:29:55:8c:ce
ukphy0 at pcn0 phy 30: Generic IEEE 802.3u media interface, rev. 0:
OUI 0x00001a, model 0x0036
vga1 at pci0 dev 6 function 0 "S3 Trio3D AGP" rev 0x01
wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
drm at vga1 unsupported
piixpm0 at pci0 dev 15 function 0 "ServerWorks OSB4" rev 0x4f: polling
pre ATTACH  intra ATTACH iic0 at piixpm0
 in ic_attach(pre config_search in iic_search: out iic_search in
iic_search: out iic_search in iic_search: out iic_search in
iic_search: out iic_search in iic
_search: out iic_search in iic_search: out iic_search in iic_search:
out iic_search in iic_search: out iic_search in iic_search: out
iic_search in iic_search:
 out iic_search in iic_search: out iic_search in iic_search: out
iic_search in iic_search: out iic_search in iic_search: out iic_search
in iic_search: out iic
_search in iic_search: out iic_search in iic_search: out iic_search in
iic_search: out iic_search in iic_search: out iic_search in
iic_search: out iic_search
in iic_search: out iic_search in iic_search: out iic_search in
iic_search: out iic_search post config_search) (pre iic_scan in
iic_scanin ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr)in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr)in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr)in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr)in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr)in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr)in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3}in ic_exec

in piixpm_i2c_exec: (R1 (W1-W1) (W2-W2) (W3-W3) (D1-D1) (R2-R2)
(piixpm_intr-piixpm_intr) {3} post iic_scan) post ATTACH
pciide0 at pci0 dev 15 function 1 "ServerWorks OSB4 IDE" rev 0x00: DMA
atapiscsi0 at pciide0 channel 0 drive 0
scsibus5 at atapiscsi0: 2 targets, initiator 7
cd0 at scsibus5 targ 0 lun 0: <LITEON, CD-ROM LTN486S, YUS3> ATAPI
5/cdrom removable
cd0(pciide0:0:0): using PIO mode 4, DMA mode 2, Ultra-DMA mode 2
ohci0 at pci0 dev 15 function 2 "ServerWorks OSB4/CSB5 USB" rev 0x04:
couldn't establish interrupt at irq 15
isa0 at mainbus0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
pckbc0 at isa0 port 0x60/5
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pmsi0 at pckbc0 (aux slot)
pckbc0: using irq 12 for aux slot
wsmouse0 at pmsi0 mux 0
pcppi0 at isa0 port 0x61
midi0 at pcppi0: <PC speaker>
spkr0 at pcppi0
lpt0 at isa0 port 0x378/4 irq 7
npx0 at isa0 port 0xf0/16: reported by CPUID; using exception 16
fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
fd0 at fdc0 drive 0: 1.44MB 80 cyl, 2 head, 18 sec
biomask e765 netmask ef65 ttymask ffff
mtrr: Pentium Pro MTRR support
softraid0 at root
root on sd0a swap on sd0b dump on sd0b

Перегружал, работает. Выключал-включал сервак, работает.
Попожже уберу свой дебажный мусор и попробую без него, и если будет ок
нарисую патчик.
--
engineer


Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Dinar Talypov
On Thu, 19 Feb 2009 13:26:12 +0500
engineer <[hidden email]> wrote:

> > Для начала обернул уже весь код внутри piixpm_i2c_exec в splbio().
> > Пока не знаю насколько это правильно, чисто напробу.
>
> Я хренею, дорогая редакция... Но ведь ОНО ЗАРАБОТАЛО!
>
>
> Дело было так. Сначала укоротил я _свои_ дебажные мессаги, поубирал
> '\t', '\n' во многих местах. Гружу. Идёт дмесг, потом экран
> превращается в фейерверк. Мелькает то выводимые мессаги, то какие-то
> шрифты, разные цветные кубики... короче matrix has you.
> Ладно думаю. Убрал свои эти левые DELAY'и, гружу... и на тебе, работает!
>
> Повторюсь, машина UP, ядро UP. Заработало именно от того, что я
> обернул внутренность piixpm_exec в splbio().
>
spl'ы полезны не только в MP

--
Динар Талыпов


Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Anton Maksimenkov-2
>> Повторюсь, машина UP, ядро UP. Заработало именно от того, что я
>> обернул внутренность piixpm_exec в splbio().
>>
> spl'ы полезны не только в MP

Так вот я этой пометкой как раз и акцентировал внимание читателей на
том, что проблема именно в гонке прерываний, а НЕ в SMP. Просто чтобы
было ясно остальным. Сам-то я это понял :)
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: iic0 at piixpm0

Anton Maksimenkov-2
In reply to this post by Anton Maksimenkov-2
>> Для начала обернул уже весь код внутри piixpm_i2c_exec в splbio().
>> Пока не знаю насколько это правильно, чисто напробу.
> Я хренею, дорогая редакция... Но ведь ОНО ЗАРАБОТАЛО!

Мда... прошу пардону у почтеннейшей публики. Нифига оно не заработало.
Я шибко поторопился.

Вначале я стал смущаться, что на этом iic0 ничего не обнаружилось,
стал всё перепроверять. И понял, что во время втычивания своих
дебагмесседжей превратил вот это
    if (sc->sc_i2c_xfer.error)
        return (1);
в это
    if (sc->sc_i2c_xfer.error)
{
printf("...
}
        return (1);
что и привело к тому что оно как бы "заработало".

Я конечно исправил это, но всё равно дело тормозится в этой же
piixpm.c, вот в этом куске (привожу вместе с дебагмессагами)
--------
printf(" (W3");
    /* Start transaction */
    ctl |= PIIX_SMB_HC_START;
    bus_space_write_1(sc->sc_iot, sc->sc_ioh, PIIX_SMB_HC, ctl);
printf("-W3)");

    if (flags & I2C_F_POLL) {
printf(" (D1");
        /* Poll for completion */
        DELAY(PIIXPM_DELAY);
printf("-D1)");
        for (retries = 1000; retries > 0; retries--) {
printf(" (R2");
            st = bus_space_read_1(sc->sc_iot, sc->sc_ioh,
                PIIX_SMB_HS);
printf("-R2)");
            if ((st & PIIX_SMB_HS_BUSY) == 0)
                break;
printf(" (D2");
            DELAY(PIIXPM_DELAY);
printf("-D2)");
        }
        if (st & PIIX_SMB_HS_BUSY)
            goto timeout;
printf(" (piixpm_intr");
        piixpm_intr(sc);
printf("-piixpm_intr)");
    } else {
        /* Wait for interrupt */
printf(" (tsleep");
        if (tsleep(sc, PRIBIO, "iicexec", PIIXPM_TIMEOUT * hz))
            goto timeout;
printf("-tsleep)");
    }

    if (sc->sc_i2c_xfer.error)
{
splx(s);
printf(" {3}");
        return (1);
}

splx(s);
printf(" {4}");
    return (0);

timeout:
--------

Последнее что работает, это начинается в в очередной раз piixpm_i2c_exec
(W3-W3) (D1-D1) (R2-R2) (D2

То есть дело гибнет почему-то во время DELAY'я. Кто-то успевает что-то сделать.

Ваще я чот сумневаться стал. В предпоследнем вызове, перед зависанием,
пролетала связка (W3-W3) (D1-D1) (R2-R2) (D2-В2) (R2-R2)
(piixpm_intr-piixpm_intr) {4}, то есть сработало один раз.
У других людей видимо всё работает, раз никто подобной проблемой не
озабачивается. И судя по piixpm(4) как раз даже на таком же
ServerWorks OSB4... Мож у моих машинок глюк железный.

Дома, вон, старинный П2, а поди ж ты:
piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x01: SMI
iic0 at piixpm0
spdmem0 at iic0 addr 0x50: 128MB SDRAM non-parity PC133CL2
spdmem1 at iic0 addr 0x51: 128MB SDRAM non-parity PC133CL3
--
engineer