--- drivers/ps2/smap.c.old Thu Apr 19 11:01:50 2001 +++ drivers/ps2/smap.c Sun Feb 24 03:15:34 2002 @@ -129,9 +129,36 @@ SMAPREG16(smap,SMAP_TXFIFO_WR_PTR) = (smap->txbwp & 0x0FFC); datap = (u_int32_t *)smap->txbuf; +#if 0 for (i = 0; i < txlen; i += 4) { /* memory -> FIFO */ SMAPREG32(smap,SMAP_TXFIFO_DATA) = *datap++; } +#else + /* use assembly for speed --achurch 2002/02/24 */ + if (txlen & 4) { + SMAPREG32(smap,SMAP_TXFIFO_DATA) = *datap++; + } + if (txlen >= 8) { + register u_int32_t *src __asm__("$12"); + register u_int32_t *dest __asm__("$13"); + register u_int32_t count __asm__("$14"); + src = datap; + dest = (u_int32_t *)smap->base; + count = txlen - 8; + asm(".Ltx:\ + slt $15,$0,$14;\ + lw $8,0($12);\ + addi $14,$14,-8;\ + lw $9,4($12);\ + addiu $12,$12,8;\ + sw $8,0x1100($13);\ + sw $9,0x1100($13);\ + bnez $15,.Ltx" + : /* no outputs */ + : "r" (src), "r" (dest), "r" (count) + : "$8", "$9", "$15"); + } +#endif if (smap->flags & SMAP_F_PRINT_PKT) { printk("%s: xmit: mem->fifo done, len=%d,%d,ptr=0x%04x\n", net_dev->name,skb->len,txlen,smap->txbwp);