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 |
On Mon, Feb 16, 2009 at 03:15:08PM +0500, engineer wrote:
> Есть предложения куда ещё натыкать для дальнейшего хачинга? :-)) Попробуйте окружить вызов piixpm_intr splbio. > -- > engineer -- Alexander Yurchenko |
>> Есть предложения куда ещё натыкать для дальнейшего хачинга? :-))
> Попробуйте окружить вызов 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 |
>>> Есть предложения куда ещё натыкать для дальнейшего хачинга? :-))
>> Попробуйте окружить вызов 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 |
Так, нашпиговал я снова дебагмессагами, получается вот что.
Предпоследний раз кернель заходит в 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 |
Кстати вот, продолжил я играться с 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 |
> Для начала обернул уже весь код внутри 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 |
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(). > -- Динар Талыпов |
>> Повторюсь, машина UP, ядро UP. Заработало именно от того, что я
>> обернул внутренность piixpm_exec в splbio(). >> > spl'ы полезны не только в MP Так вот я этой пометкой как раз и акцентировал внимание читателей на том, что проблема именно в гонке прерываний, а НЕ в SMP. Просто чтобы было ясно остальным. Сам-то я это понял :) -- engineer |
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 |
Free forum by Nabble | Edit this page |