Ejemplo n.º 1
0
int ep1_init(dma_regs_t *chn)
{
	UDC_write( Ser0UDCOMP, rx_pktsize-1 );
	dmachn_rx = chn;
	sa1100_clear_dma(dmachn_rx);
	ep1_done(-EAGAIN);
	return 0;
}
Ejemplo n.º 2
0
void ep1_reset(void)
{
	if (currentPort) {
		rx_pktsize = 8; // OJO
	}
	else
	{	
		rx_pktsize = 1; // OJO
	}

	sa1100_clear_dma(dmachn_rx);
	UDC_clear(Ser0UDCCS1, UDCCS1_FST);
	ep1_done(-EINTR);
}
Ejemplo n.º 3
0
void ep1_int_hndlr(struct usb_request *usb_req)
{
	ep1_remain = ep1_len - usb_req->length;

	if (usb_debug)
		printf("%s send finisned buf %x len %d remain %d\n", 
			__func__, usb_req->buf, usb_req->length, ep1_remain);

	if (ep1_remain != 0) {
		/* more data to go */
		ep1_start();
	} else {
		ep1_done(0);
	}

}
Ejemplo n.º 4
0
void
ep1_reset(void)
{
	ep1_done(-EINTR);
}
Ejemplo n.º 5
0
void ep1_int_hndlr()
{
	dma_addr_t dma_addr;
	unsigned int len;
	int status = Ser0UDCCS1;

	PRINTKD( "[%lu]Ep1 int %d\n", (jiffies-start_time)*10, status);
	
	if ( naking )
		printk( "%sEh? in ISR but naking = %d\n", "usbrx: ", naking );

	// Reive packet complete
	if (status & UDCCS1_RPC) {
		if (!ep1_curdmalen) {
			printk("usb_recv: RPC for non-existent buffer\n");
			naking = 1;
			return;
		}

		sa1100_stop_dma(dmachn_rx);

		if (status & UDCCS1_SST) {
			printk("usb_recv: stall sent OMP=%d\n",Ser0UDCOMP);
			UDC_flip(Ser0UDCCS1, UDCCS1_SST);
			ep1_done(-EIO); // UDC aborted current transfer, so we do
			return;
		}

		if (status & UDCCS1_RPE) {
		    printk("usb_recv: RPError %x\n", status);
			UDC_flip(Ser0UDCCS1, UDCCS1_RPC);
			ep1_done(-EIO);
			return;
		}

		dma_addr = sa1100_get_dma_pos(dmachn_rx);
		pci_unmap_single(NULL, ep1_curdmapos, ep1_curdmalen, PCI_DMA_FROMDEVICE);
		
		len = dma_addr - ep1_curdmapos;

		if (len < ep1_curdmalen) {
			char *buf = ep1_curdmabuf + len;
			while (Ser0UDCCS1 & UDCCS1_RNE) {
				if (len >= ep1_curdmalen) {
					printk("usb_recv: too much data in fifo\n");
					break;
				}
				*buf++ = Ser0UDCDR;
				len++;
			}
		} else if (Ser0UDCCS1 & UDCCS1_RNE) {
			printk("usb_recv: fifo screwed, shouldn't contain data\n");
			len = 0;
		}
		ep1_curdmalen = 0;  /* dma unmap already done */
		ep1_remain -= len;
		naking = 1;
		ep1_done((len) ? 0 : -EPIPE);
	}
	/* else, you can get here if we are holding NAK */
}