Takashi Iwai wrote: > At Mon, 20 Oct 2008 19:34:39 +0100, > James Courtier-Dutton wrote: >> Takashi Iwai wrote: >>> At Sun, 19 Oct 2008 17:07:08 +0100, >>> James Courtier-Dutton wrote: >>>> This info should help the current snd-sbxfi driver to actually work with >>>> the "Vista compatible" cards that it currently does not work with. >>>> I believe the true UAA to 20K1 mode switch code is missing from the >>>> current alsa snd-sbxfi driver. >>> The code to switch to 20k1 mode is already there. >>> The sbxfi driver uses ioport for the access, and it looks like in BAR5 >>> for UAA boards. This could be the problem... >>> >> Well I cannot find it. I can only find: >> static void sbxfi_switch_xfi_mode(struct sbxfi *chip) >> and that does not do the job. > > Well, this is supposed to be (1), switching to 20k1 mode. (1) is a config space switch, nothing else. It leaves the UAA chip in control of the bus master. > >> You need to do this: >> >>>> 2) UAA/20K1 MODE CHANGE (controls who the bus master is): >>>> The "Mode Change" register is located in the UAA configuration space at >>>> location offset 0x3FFC. This location stores 4 values in a ring. >>>> To switch from 20K1 mode to UAA mode write each DW value: CTLA, CTLZ, >>>> CTLL, CTLA. >>>> To switch from UAA mode to 20K1 mode write each DW value: CTLX, CTL-, >>>> CTLF, CTLi >>>> To read the current mode, the 4 value ring may be in any position, so >>>> one might read for example: >>>> CTLL, CTLA, CTLA, CTLZ > > Hm, but procedure this isn't in OSS driver, too. > Doesn't OSS driver work with UAA boards? I do not know. I do not have access to any of the X-Fi hardware at the moment. I am just reading the datasheets and commenting. There is also sample code that I received with the datesheeets. Here is some pseudo code to explain the CTLX etc. values. WriteMemory((bar0 + 0x00003ffc),0x43544c58); // CTLX WriteMemory((bar0 + 0x00003ffc),0x43544c2d); // CTL- WriteMemory((bar0 + 0x00003ffc),0x43544c46); // CTLF WriteMemory((bar0 + 0x00003ffc),0x43544c69); // CTLi > >>>> At power on, the card is in UAA mode. >>>> In UAA mode, the UAA chip is the bus master. >>>> In 20K1 mode, the 20K1 chip is the bus master. >>>> Under either UAA mode or 20K1 mode, the driver can read and write the >>>> configuration space of both UAA chip and 20K1 chip. > > Doesn't it mean that 20k1 chip gets the bus master automatically > when switch into 20k1 mode from UAA mode? (1) is a config space switch and PCI IDs switch, nothing else. It leaves the chip in UAA mode. (2) is the real mode change. > > Anyway ,20k1 mode switching is a mess. This may screw up also the > internal room-keeping of struct pci. Maybe we can't do it without > switching but just master mode switch? I agree that it is messy. I did not design the hardware. Maybe we need to make a suggestion on LKML so that we can make a call that updates the global kernel struct pci once we make the config space switch. I do not think we need to switch back from 20K1 to UAA mode. We already have hotplug for cardbus pccards, maybe we could use some of those calls. Kind regards James _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel