int gpair::output (FILE *f, bool writing) const { int n = 0; #define NOUTC(x) do { \ int nn = x; \ if (nn == EOF) \ return -1; \ else n++; \ } while (0) #define NOUT(x) do { \ int nn = x; \ if (nn == -1) \ return -1; \ else n += nn; \ } while (0) NOUTC (fputc ('(', f)); const gob *ob = this; while (!g_null (ob)) { assert (ob->type == gtype_pair); const gpair *p = static_cast<const gpair *> (ob); if (writing) NOUT (p->car->fwrite (f)); else NOUT (p->car->fprint (f)); ob = p->cdr; if (!g_null (ob)) NOUTC (fputc (' ', f)); } NOUTC (fputc (')', f)); return n; }
static int downlink( DEV *dev ) { u8 cmq, len, st; u8 *p; int idx; u32 cport, wport; dbg8("%s(): dev=%08X", __FUNCTION__, (uint)dev); cport = dev->cport; wport = dev->wport; idx = dev->outhead; p = dev->outbuf[idx]; #if 0 len = *p++; cmq = *p++; #else cmq = *p++; len = *p++; // len ++; #endif if (debug & DEBUG_DUMP2) DumpBuffer(">>", p-2, len+2); // printk(KERN_DEBUG ">len=%02X cmq=%02X\n", len, cmq); HS; NOUT(CMD_XFER); HS; NOUT(len+1); HS; NOUT(cmq); HS; // printk(KERN_DEBUG "len=%02X Loop: ", len); while(len--) { // printk ("%.2x ", *p); HS; NOUT(*p++); } // printk ("\n"); HS; NOUT(EOM); idx++; if(idx >= NUM_OUTBUF) idx=0; dev->outhead = idx; return 0; }
static int sm_lpc(register DEV *dev) { u8 *p; u8 st; int g; // int flags; u16 idx; // avoid critical section u32 cport, rport, wport; dbg4(" %s(): dev=%08X", __FUNCTION__, (uint)dev); cport = dev->cport; rport = dev->rport; wport = dev->wport; switch( dev->state ) { case ST_RESYNC: if(LPCSTAT & 1) return 0; dev->ctl &= ~4; SETCTL; // clear reset flipflop SETCTL; SETCTL; dev->ctl |= 4; SETCTL; HS; NOUT(CMD_RESYNC); // send RESYNC HS; NOUT(EOM); HS; if(NIN != CMD_ACKSYNC) return -1; // get ACKSYNC dev->state = ST_RESET; return 0; case ST_RESET: HS; NOUT(CMD_NULL); // send NULL HS; NOUT(EOM); dev->state = ST_FLCAN; return 0; case ST_FLCAN: HS; if(NIN != CMD_XFER) return -1; // get niRESET HS; if(NIN != 1) return -1; HS; if(NIN != 0x50) return -1; // dev->intail = dev->inhead; // dev->outhead = dev->outtail; idx = dev->intail; p = dev->inbuf[idx]; *p++ = 0x50; *p++ = 0x00; idx++; if(idx >= NUM_INBUF) idx=0; if(idx != dev->inhead) { dev->intail = idx; dbg8(" %s(): before waitqueue_active()", __FUNCTION__); if (waitqueue_active(&dev->rd_wait)) { dbg8(" %s(): before wake_up_interruptible()", __FUNCTION__); wake_up_interruptible( &dev->rd_wait ); } else dbg8(" %s(): waitqueue_active()=0", __FUNCTION__); } HS; NOUT(CMD_XFER); // send FLUSH_CANCEL HS; NOUT(1); HS; NOUT(0x60); HS; NOUT(EOM); dev->state = ST_UPLINK; return 0; case ST_IDLE: if(dev->outhead == dev->outtail) { HS; NOUT(CMD_NULL); // send NULL HS; NOUT(EOM); dev->state = ST_UPLINK; return 0; } p = dev->outbuf[dev->outhead]; if( !((p[0]-0x10) & 0xE0) ) { // 1x or 2x HS; NOUT(CMD_XFER); // buffer request HS; NOUT(0x01); HS; NOUT(p[0]); HS; NOUT(EOM); HS; dev->state = ST_NIACK; return 0; } if( downlink( dev ) ) return -1; dev->state = ST_UPLINK; return 0; case ST_UPLINK: if( uplink( dev ) < 0 ) return -1; dev->state = ST_IDLE; if(dev->outhead != dev->outtail) { // CLI; dev->active++; // STI; } return 0; case ST_NIACK: g = uplink( dev ); if( g < 0 ) return -1; if( g == 1 ) { downlink( dev ); dev->state = ST_UPLINK; return 0; } HS; NOUT(CMD_NULL); // send NULL HS; NOUT(EOM); dev->state = ST_NIACK; return 0; } return 0; }