154359Sroberto/*
254359Sroberto**	dynamically loadable chu driver
354359Sroberto**
454359Sroberto**	william robertson <rob@agate.berkeley.edu>
554359Sroberto*/
654359Sroberto
754359Sroberto#include <sys/types.h>
854359Sroberto#include <sys/conf.h>
954359Sroberto#include <sys/errno.h>
1054359Sroberto#include <sys/stream.h>
1154359Sroberto#include <sys/syslog.h>
1254359Sroberto
1354359Sroberto#include <sun/openprom.h>
1454359Sroberto#include <sun/vddrv.h>
1554359Sroberto
1654359Srobertoextern int findmod();		/* os/str_io.c */
1754359Sroberto
1854359Srobertoextern struct streamtab chuinfo;
1954359Sroberto
2054359Srobertostruct vdldrv vd = {
2154359Sroberto     VDMAGIC_USER,
2254359Sroberto     "chu"
2354359Sroberto  };
2454359Sroberto
2554359Sroberto
2654359Srobertoint
2754359Srobertoxxxinit(function_code, vdp, vdi, vds)
2854359Srobertounsigned int function_code;
2954359Srobertostruct vddrv *vdp;
3054359Srobertoaddr_t vdi;
3154359Srobertostruct vdstat *vds;
3254359Sroberto{
3354359Sroberto     register int i = 0;
3454359Sroberto     register int j;
3554359Sroberto
3654359Sroberto     switch (function_code) {
3754359Sroberto	case VDLOAD:
3854359Sroberto
3954359Sroberto	  if (findmod("chu") >= 0) {
4054359Sroberto	       log(LOG_ERR, "chu stream module already loaded\n");
4154359Sroberto	       return (EADDRINUSE);
4254359Sroberto	  }
4354359Sroberto
4454359Sroberto	  i = findmod("\0");
4554359Sroberto
4654359Sroberto	  if (i == -1 || fmodsw[i].f_name[0] != '\0')
4754359Sroberto	    return(-1);
4854359Sroberto
4954359Sroberto	  for (j = 0; vd.Drv_name[j] != '\0'; j++)	/* XXX check bounds */
5054359Sroberto	    fmodsw[i].f_name[j] = vd.Drv_name[j];
5154359Sroberto
5254359Sroberto	  fmodsw[i].f_name[j] = '\0';
5354359Sroberto	  fmodsw[i].f_str = &chuinfo;
5454359Sroberto
5554359Sroberto	  vdp->vdd_vdtab = (struct vdlinkage *)  &vd;
5654359Sroberto
5754359Sroberto	  return(0);
5854359Sroberto
5954359Sroberto	case VDUNLOAD:
6054359Sroberto	  if ((i = findmod(vd.Drv_name)) == -1)
6154359Sroberto	    return(-1);
6254359Sroberto
6354359Sroberto	  fmodsw[i].f_name[0] = '\0';
6454359Sroberto	  fmodsw[i].f_str = 0;
6554359Sroberto
6654359Sroberto	  return(0);
6754359Sroberto
6854359Sroberto	case VDSTAT:
6954359Sroberto	  return(0);
7054359Sroberto
7154359Sroberto	default:
7254359Sroberto	  return(EIO);
7354359Sroberto     }
7454359Sroberto}
75