This looks like a hardware limitation. 9600/0.002=4.8M > 3M.
The only way is to check your H/W to see if it supports bus master or DMA.
Wait, if the limitation IS 3M, nothing can help you.
What kind of DSP card are you using?
For 33MHz 32 bit PCI bus, it should be 33Mx4=132M.
Most of PCI card for example Ethernet card support bus master, this is the best way. But your PCI host controller and PCI card have to support this feature.
If bus master is unavailable, you can check if your hardware support DMA.
For DMA and bus master, it really depends on the hardware design.
Key word: source address register, destination address register, control register, descriptor.
Got to sleep.
Bus master transaction? This has nothing to do with the OS.
Are you running on x86 with a BIOS? If so, BIOS should configured the PCI host as bus master enabled. The problem is if your DSP card support bus master transaction or not which you have to check the hardware manual.
If your hardware support bus master, you have to set the bus master bit
in the PCI command register.
You can do it like this:
pci_read_config( handle, offsetof (struct _pci_config_regs, Command), 1, sizeof( cmd ), &cmd );
cmd |= PCI_COMMAND_MASTER_ENABLE;
pci_write_config( handle, offsetof (struct _pci_config_regs, Command), 1, sizeof( cmd ), &cmd );
handle is the value you get by pci_attach_device() and cmd is unsigned short variable.
You can also use pci utility to check if your bus master is enabled (pci -vvv).
Bus mster is kind of DMA, your hardware has to support this feature.
In this case, you don’t need memcpy to copy the data, the PCI card
will put the data in your main memory directly.
Basically you have to pre-allocate a chunk of memory, and tell the
your PCI card the memory address, length. PCI card will put the data
into the memory which you pre-allocated, and then generate an interrupt.
That means, when you get the interrupt, the data is already in your
Most of the network driver use bus master, If you have network DDK,
there are many sample, epic, speedo, el900 etc.
If there is network DDK in your system, it should be under /usr/src/ddk-6.x.1 directory.
speedo driver is a good example.
I think you have to check your PCI card support bus master first.
What kind DSP card are you using?
Seem this chip support bus master transfer.
Do you have <<TMS320C6000 DSP Peripheral Component Interconnection(PCI) Reference Guid>> (spru581a.pdf)? It will give you some hint.