Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
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;
}