Date: Sun, 27 Sep 2009 15:17:57 +0300 From: Andriy Gapon <avg@icyb.net.ua> To: Hans Petter Selasky <hselasky@c2i.net> Cc: freebsd-current@freebsd.org, freebsd-usb@freebsd.org Subject: Re: sb600/sb700 ohci experimental patch Message-ID: <4ABF57F5.1050106@icyb.net.ua> In-Reply-To: <200909250928.51515.hselasky@c2i.net> References: <4ABA36B1.9070706@icyb.net.ua> <200909241651.47850.hselasky@c2i.net> <4ABC646D.4070604@icyb.net.ua> <200909250928.51515.hselasky@c2i.net>
next in thread | previous in thread | raw e-mail | index | archive | help
on 25/09/2009 10:28 Hans Petter Selasky said the following: > On Friday 25 September 2009 08:34:21 Andriy Gapon wrote: >> Not sure how to interpret this. > > In ohci_controller_init() try to disable the > > DPRINTF("SMM active, request owner change\n"); > > part of the code for !(ohci_unit == 0) or (ohci_unit == 2) and see what > happens. > > Your clue might also indicate that we should request owner change for all > OHCI's before resetting any of them. Possibly a BIOS bug! Haven't tried the suggested changes yet, but here is some more info. This is register dump of ohci0 just _before_ we start doing anything with it: ohci0: <OHCI (generic) USB controller> mem 0xfe02e000-0xfe02efff irq 16 at device 18.0 on pci0 ohci0: [ITHREAD] ohci_dumpregs:567: ohci_dumpregs: rev=0x00000110 control=0x00000184 command=0x00000000 ohci_dumpregs:571: intrstat=0x00000024 intre=0xc0000042 intrd=0xc0000042 ohci_dumpregs:575: hcca=0xbfdf1f00 percur=0x00000000 ctrlhd=0xbfdf1c50 ohci_dumpregs:579: ctrlcur=0x00000000 bulkhd=0x00000000 bulkcur=0x00000000 ohci_dumpregs:583: done=0xbfdf1ca0 fmival=0x27782edf fmrem=0x000009bd ohci_dumpregs:587: fmnum=0x00008e3a perst=0x00002a27 lsthrs=0x00000628 ohci_dumpregs:591: desca=0x02000b03 descb=0x00000000 stat=0x00000000 ohci_dumpregs:594: port1=0x00000303 port2=0x00000100 ohci_dumpregs:600: HCCA: frame_number=0x0000 done_head=0x00000000 This is dump just after we programmed it: ohci_controller_init:308: rewrite head regs ohci_dumpregs:567: ohci_dumpregs: rev=0x00000110 control=0x000000af command=0x00000000 ohci_dumpregs:571: intrstat=0x00000044 intre=0x8000005a intrd=0x8000005a ohci_dumpregs:575: hcca=0x06647000 percur=0x00000000 ctrlhd=0x06692000 ohci_dumpregs:579: ctrlcur=0x00000000 bulkhd=0x06693000 bulkcur=0x00000000 ohci_dumpregs:583: done=0x00000000 fmival=0xa7782edf fmrem=0x80001096 ohci_dumpregs:587: fmnum=0x0000000d perst=0x00002a2f lsthrs=0x00000628 ohci_dumpregs:591: desca=0x02000b03 descb=0x00000000 stat=0x00000000 ohci_dumpregs:594: port1=0x00010301 port2=0x00000100 ohci_dumpregs:600: HCCA: frame_number=0x000e done_head=0x00000000 This is dump of ohci0 registers just before we run takeover code of ohci1: ohci1: <OHCI (generic) USB controller> mem 0xfe02d000-0xfe02dfff irq 16 at device 18.1 on pci0 ohci1: [ITHREAD] ohci_controller_init:185: reread ohci0 regs: ohci_dumpregs:567: ohci_dumpregs: rev=0x00000110 control=0x000000af command=0x00000000 ohci_dumpregs:571: intrstat=0x00000044 intre=0x8000005a intrd=0x8000005a ohci_dumpregs:575: hcca=0x06647000 percur=0x00000000 ctrlhd=0x06692000 ohci_dumpregs:579: ctrlcur=0x00000000 bulkhd=0x06693000 bulkcur=0x00000000 ohci_dumpregs:583: done=0x00000000 fmival=0xa7782edf fmrem=0x800003b5 ohci_dumpregs:587: fmnum=0x00000012 perst=0x00002a2f lsthrs=0x00000628 ohci_dumpregs:591: desca=0x02000b03 descb=0x00000000 stat=0x00000000 ohci_dumpregs:594: port1=0x00010301 port2=0x00000100 ohci_dumpregs:600: HCCA: frame_number=0x0012 done_head=0x00000000 And this is dump of ohci0 right after we've taken over ohci1: ohci_controller_init:195: SMM active, request owner change ohci_controller_init:219: usbus1: resetting ohci_controller_init:246: reread ohci0 regs: ohci_dumpregs:567: ohci_dumpregs: rev=0x00000110 control=0x000000af command=0x00000000 ohci_dumpregs:571: intrstat=0x00000004 intre=0x8000005a intrd=0x8000005a ohci_dumpregs:575: hcca=0x06647000 percur=0x00000000 ctrlhd=0xbfdf1c50 ohci_dumpregs:579: ctrlcur=0x00000000 bulkhd=0x06693000 bulkcur=0x00000000 ohci_dumpregs:583: done=0xbfdf1ca0 fmival=0xa7782edf fmrem=0x80002122 ohci_dumpregs:587: fmnum=0x00000192 perst=0x00002a2f lsthrs=0x00000628 ohci_dumpregs:591: desca=0x02000b03 descb=0x00000000 stat=0x00000000 ohci_dumpregs:594: port1=0x00000303 port2=0x00000100 ohci_dumpregs:600: HCCA: frame_number=0x0192 done_head=0x00000000 As you can see, indeed, the register gets over-written right when we take over ohci1. Some additional observations: 1. frame_number seems to grow quite a lot for ohci0 2. before we touch ohci0 it has port1=0x00000303, after reset port1=0x00010301, after ohci1 takeover port1=0x00000303 again. I'd say that this is a pretty strong evidence that BIOS does something to ohci0 after we took over it and while we are taking over ohci1. Another idea of working around this: 1) in pci fixup code disable USB SMI for these chipsets 2) (optional) in ohci code skip takeover step Sounds messy. -- Andriy Gapon
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4ABF57F5.1050106>