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; }
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); }
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); } }
void ep1_reset(void) { ep1_done(-EINTR); }
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 */ }