/* Minimized device handling from sys/src/io.c */

/*
 *------------------------------------------------------------------
 *
 * $Source: /mit/cgw/src/tftp.mar/RCS/dev.c,v $
 * $Revision: 1.3 $
 * $Date: 89/03/15 18:41:30 $
 * $State: Exp $
 * $Author: mar $
 * $Locker:  $
 *
 * $Log:	dev.c,v $
 * Revision 1.3  89/03/15  18:41:30  mar
 * removed some stuff #ifdef'ed out;
 * don't call qna routines explicitly, use devp->d_strt
 * 
 * Revision 1.2  88/07/11  19:07:28  jon
 * Sommerfeld's changes.
 * 
 * 
 *------------------------------------------------------------------
 */

#ifndef lint
static char *rcsid_dev_c = "$Header: dev.c,v 1.3 89/03/15 18:41:30 mar Exp $";
#endif	lint

#include <types.h>
#include <sys.h>

#define NULL 0

static iorb iiob;

init_dev (devp)
reg dct *devp;
{
  devp->d_flg = 0;
  devp->d_qhd = &iiob;
  devp->d_qtl = NULL;
  if (!(devp->d_flg & D_INI)) {
    if (devp->d_ina != NULL)
      (*devp->d_ina)(devp);
  }
}

iocmr (devp)
reg dct *devp;
{
#ifdef ndef
  reg iorb *iob;
  iob = devp->d_qhd;
  (*(int (*)())devp->d_strt)(devp);
  /* no completion routine for qna? */
#endif
}

/* Buffer and queue output to a device.  Returns number of bytes written. */
dev_write(devp, data, len)
dct *devp;
byte *data;
int len;
{
  int imask;

#ifndef NOINTR
  imask = disable();
#endif
  devp->d_addr = data;
  devp->d_breq = len;
  (*devp->d_strt)(devp);
#ifndef NOINTR
  enable(imask);
#endif
}

int dev_read(devp, data, len)
dct *devp;
byte *data;
int len;
{
  int i, imask;

#ifdef NOINTR
  devp->d_addr = data;
  devp->d_breq = len;
  return (*devp->d_strt)(devp, data, len);
#else
  devp->d_addr = iiob.i_addr;
  devp->d_breq = len;
  imask = disable();
  (*(int (*)())devp->d_strt)(devp);
  enable(imask);
  if (iiob.i_stat & I_DONE) {
#ifdef DEBUG
    puts ("dev_read: done!");
#endif
    for (i = 0; (i < iiob.i_bxfr) && (i < len); i++)
      data[i] = iiob.i_addr[i];
    iiob.i_stat = 0;  /* hmm ... */
    return (iiob.i_bxfr);
  }
  else 
    return (0);
#endif
}
