Index: /branches/libffado-2.0/src/libieee1394/ieee1394service.cpp =================================================================== --- /branches/libffado-2.0/src/libieee1394/ieee1394service.cpp (revision 1371) +++ /branches/libffado-2.0/src/libieee1394/ieee1394service.cpp (revision 1372) @@ -292,6 +292,6 @@ } } - - // check state + + // init helpers if(!m_pCTRHelper) { debugFatal("No CycleTimerHelper available, bad!\n"); @@ -309,4 +309,7 @@ } m_pIsoManager->setVerboseLevel(getDebugLevel()); + + m_pIsoManager->setReceiveMode(RAW1394_DMA_PACKET_PER_BUFFER); + if(!m_pIsoManager->init()) { debugFatal("Could not initialize IsoHandlerManager\n"); Index: /branches/libffado-2.0/src/libieee1394/IsoHandlerManager.cpp =================================================================== --- /branches/libffado-2.0/src/libieee1394/IsoHandlerManager.cpp (revision 1345) +++ /branches/libffado-2.0/src/libieee1394/IsoHandlerManager.cpp (revision 1372) @@ -459,4 +459,5 @@ , m_IsoThreadReceive ( NULL ) , m_IsoTaskReceive ( NULL ) + , m_receive_mode( RAW1394_DMA_PACKET_PER_BUFFER ) { } @@ -470,4 +471,5 @@ , m_IsoThreadReceive ( NULL ) , m_IsoTaskReceive ( NULL ) + , m_receive_mode( RAW1394_DMA_PACKET_PER_BUFFER ) { } @@ -777,11 +779,18 @@ // the receive buffer size doesn't matter for the latency, // but it has a minimal value in order for libraw to operate correctly (300) - int buffers=400; + int buffers=1; + while(buffers < (int)packets_per_period && buffers < MAX_RECV_NB_BUFFERS) { + buffers *= 2; + } + + // ensure at least 2 hardware interrupts per ISO buffer wraparound + if(irq_interval > buffers/2) { + irq_interval = buffers/2; + } // create the actual handler + debugOutput( DEBUG_LEVEL_VERBOSE, " creating IsoRecvHandler\n"); h = new IsoHandler(*this, IsoHandler::eHT_Receive, buffers, max_packet_size, irq_interval); - - debugOutput( DEBUG_LEVEL_VERBOSE, " creating IsoRecvHandler\n"); if(!h) { @@ -790,16 +799,10 @@ } + h->setReceiveMode(m_receive_mode); + } else if (stream->getType()==StreamProcessor::ePT_Transmit) { // setup the optimal parameters for the raw1394 ISO buffering -// unsigned int packets_per_period = stream->getPacketsPerPeriod(); unsigned int max_packet_size = stream->getMaxPacketSize(); -// unsigned int page_size = getpagesize(); - - // Ensure we don't request a packet size bigger than the - // kernel-enforced maximum which is currently 1 page. -// if (max_packet_size > page_size) { -// debugError("max packet size (%u) > page size (%u)\n", max_packet_size, page_size); -// return false; -// } + if (max_packet_size > MAX_XMIT_PACKET_SIZE) { debugError("max packet size (%u) > MAX_XMIT_PACKET_SIZE (%u)\n", @@ -809,13 +812,14 @@ // the SP specifies how many packets to ISO-buffer - int buffers = stream->getNbPacketsIsoXmitBuffer(); - if (buffers > MAX_XMIT_NB_BUFFERS) { - debugOutput(DEBUG_LEVEL_VERBOSE, - "nb buffers (%u) > MAX_XMIT_NB_BUFFERS (%u)\n", - buffers, MAX_XMIT_NB_BUFFERS); - buffers = MAX_XMIT_NB_BUFFERS; - } - unsigned int irq_interval = buffers / MINIMUM_INTERRUPTS_PER_PERIOD; - if(irq_interval <= 0) irq_interval=1; + int req_buffers = stream->getNbPacketsIsoXmitBuffer(); + int buffers=1; + while(buffers < (int)req_buffers && buffers < MAX_RECV_NB_BUFFERS) { + buffers *= 2; + } + + int irq_interval = req_buffers / MINIMUM_INTERRUPTS_PER_PERIOD; + if(irq_interval <= 0) irq_interval = 1; + // ensure at least 2 hardware interrupts per ISO buffer wraparound + if(irq_interval > buffers/2) irq_interval = buffers/2; debugOutput( DEBUG_LEVEL_VERBOSE, " creating IsoXmitHandler\n"); Index: /branches/libffado-2.0/src/libieee1394/IsoHandlerManager.h =================================================================== --- /branches/libffado-2.0/src/libieee1394/IsoHandlerManager.h (revision 1292) +++ /branches/libffado-2.0/src/libieee1394/IsoHandlerManager.h (revision 1372) @@ -197,4 +197,12 @@ */ bool handleBusReset(); + + /** + * @brief set iso receive mode. doesn't have any effect if the stream is running + * @param m receive mode + */ + void setReceiveMode(enum raw1394_iso_dma_recv_mode m) + {m_receive_mode = m;} + // the state machine private: @@ -236,4 +244,5 @@ Util::Thread * m_IsoThreadReceive; IsoTask * m_IsoTaskReceive; + enum raw1394_iso_dma_recv_mode m_receive_mode; // debug stuff Index: /branches/libffado-2.0/src/libieee1394/IsoHandler.cpp =================================================================== --- /branches/libffado-2.0/src/libieee1394/IsoHandler.cpp (revision 1345) +++ /branches/libffado-2.0/src/libieee1394/IsoHandler.cpp (revision 1372) @@ -81,4 +81,5 @@ , m_last_now( 0xFFFFFFFF ) , m_last_packet_handled_at( 0xFFFFFFFF ) + , m_receive_mode ( RAW1394_DMA_PACKET_PER_BUFFER ) , m_Client( 0 ) , m_speed( RAW1394_ISO_SPEED_400 ) @@ -106,4 +107,5 @@ , m_last_now( 0xFFFFFFFF ) , m_last_packet_handled_at( 0xFFFFFFFF ) + , m_receive_mode ( RAW1394_DMA_PACKET_PER_BUFFER ) , m_Client( 0 ) , m_speed( RAW1394_ISO_SPEED_400 ) @@ -131,4 +133,5 @@ , m_last_now( 0xFFFFFFFF ) , m_last_packet_handled_at( 0xFFFFFFFF ) + , m_receive_mode ( RAW1394_DMA_PACKET_PER_BUFFER ) , m_Client( 0 ) , m_speed( speed ) @@ -675,7 +678,7 @@ m_max_packet_size, m_Client->getChannel(), - RAW1394_DMA_PACKET_PER_BUFFER, + m_receive_mode, m_irq_interval)) { - debugFatal("Could not do receive initialisation (DMA_BUFFERFILL)!\n" ); + debugFatal("Could not do receive initialisation!\n" ); debugFatal(" %s\n",strerror(errno)); return false; Index: /branches/libffado-2.0/src/libieee1394/IsoHandler.h =================================================================== --- /branches/libffado-2.0/src/libieee1394/IsoHandler.h (revision 1343) +++ /branches/libffado-2.0/src/libieee1394/IsoHandler.h (revision 1372) @@ -168,4 +168,11 @@ uint32_t getLastPacketTime() {return m_last_packet_handled_at;}; + /** + * @brief set iso receive mode. doesn't have any effect if the stream is running + * @param m receive mode + */ + void setReceiveMode(enum raw1394_iso_dma_recv_mode m) + {m_receive_mode = m;} + void notifyOfDeath(); bool handleBusReset(); @@ -181,4 +188,5 @@ uint32_t m_last_now; uint32_t m_last_packet_handled_at; + enum raw1394_iso_dma_recv_mode m_receive_mode; Streaming::StreamProcessor *m_Client; // FIXME: implement with functors Index: /branches/libffado-2.0/config.h.in =================================================================== --- /branches/libffado-2.0/config.h.in (revision 1371) +++ /branches/libffado-2.0/config.h.in (revision 1372) @@ -133,5 +133,6 @@ // due to weirdness in the kernel layer #define MAX_XMIT_PACKET_SIZE (2048-16) -#define MAX_XMIT_NB_BUFFERS 200 +#define MAX_XMIT_NB_BUFFERS 128 +#define MAX_RECV_NB_BUFFERS 128 // should be PAGE_SIZE (4096) for unpatched kernels