Ejemplo n.º 1
0
/*
**  Name:	void do_vread_s(message *mp, int vectored)
**  Function:
*/
static void do_vread_s(const message * mp)
{
  int size;
  dpeth_t *dep;

  dep = &de_state;

  dep->de_client = mp->m_source;

  if (dep->de_mode == DEM_ENABLED) {

	if (dep->de_flags & DEF_READING)	/* Reading in progress */
		panic("read already in progress");

	dep->de_read_iovec.iod_proc_nr = mp->DL_ENDPT;
	get_userdata_s(mp->DL_ENDPT, (cp_grant_id_t) mp->DL_GRANT, 0,
		mp->DL_COUNT, dep->de_read_iovec.iod_iovec);
	dep->de_read_iovec.iod_iovec_s = mp->DL_COUNT;
	dep->de_read_iovec.iod_grant = (cp_grant_id_t) mp->DL_GRANT;
	dep->de_read_iovec.iod_iovec_offset = 0;
	size = calc_iovec_size(&dep->de_read_iovec);
	if (size < ETH_MAX_PACK_SIZE) panic(SizeErrMsg, size);

	dep->de_flags |= DEF_READING;
	(*dep->de_recvf) (dep, FALSE, size);
#if 0
	if ((dep->de_flags & (DEF_READING | DEF_STOPPED)) == (DEF_READING | DEF_STOPPED))
		/* The chip is stopped, and all arrived packets delivered */
		(*dep->de_resetf) (dep);
	dep->de_flags &= NOT(DEF_STOPPED);
#endif
  }
  reply(dep);
  return;
}
Ejemplo n.º 2
0
/*
**  Name:	void do_vwrite_s(message *mp)
**  Function:
*/
static void do_vwrite_s(const message * mp)
{
  int size;
  dpeth_t *dep;

  dep = &de_state;

  dep->de_client = mp->m_source;

  if (dep->de_mode == DEM_ENABLED) {

	if (dep->de_flags & DEF_SENDING)	/* Is sending in progress? */
		panic("send already in progress ");

	dep->de_write_iovec.iod_proc_nr = mp->DL_ENDPT;
	get_userdata_s(mp->DL_ENDPT, mp->DL_GRANT, 0,
	       mp->DL_COUNT, dep->de_write_iovec.iod_iovec);
	dep->de_write_iovec.iod_iovec_s = mp->DL_COUNT;
	dep->de_write_iovec.iod_grant = (cp_grant_id_t) mp->DL_GRANT;
	dep->de_write_iovec.iod_iovec_offset = 0;
	size = calc_iovec_size(&dep->de_write_iovec);
	if (size < ETH_MIN_PACK_SIZE || size > ETH_MAX_PACK_SIZE)
		panic(SizeErrMsg, size);

	dep->de_flags |= DEF_SENDING;
	(*dep->de_sendf) (dep, FALSE, size);

  } else if (dep->de_mode == DEM_SINK)
	dep->de_flags |= DEF_ACK_SEND;

  reply(dep);
  return;
}
Ejemplo n.º 3
0
/*
**  Name:	void do_vread(message *mp, int vectored)
**  Function:
*/
static void do_vread(message * mp, int vectored)
{
  int port, size;
  dpeth_t *dep;

  port = mp->DL_PORT;
  if (port < 0 || port >= DE_PORT_NR)	/* Check for illegal port number */
	panic(dep->de_name, PortErrMsg, port);

  dep = &de_table[port];
  dep->de_client = mp->DL_PROC;

  if (dep->de_mode == DEM_ENABLED) {

	if (dep->de_flags & DEF_READING)	/* Reading in progress */
		panic(dep->de_name, "read already in progress", NO_NUM);

	dep->de_read_iovec.iod_proc_nr = mp->DL_PROC;
	if (vectored) {
		get_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR,
			mp->DL_COUNT, dep->de_read_iovec.iod_iovec);
		dep->de_read_iovec.iod_iovec_s = mp->DL_COUNT;
		dep->de_read_iovec.iod_iovec_addr = (vir_bytes) mp->DL_ADDR;
		size = calc_iovec_size(&dep->de_read_iovec);
	} else {
		dep->de_read_iovec.iod_iovec[0].iov_addr = (vir_bytes) mp->DL_ADDR;
		dep->de_read_iovec.iod_iovec[0].iov_size = size = mp->DL_COUNT;
		dep->de_read_iovec.iod_iovec_s = 1;
		dep->de_read_iovec.iod_iovec_addr = 0;
	}
	if (size < ETH_MAX_PACK_SIZE) panic(dep->de_name, SizeErrMsg, size);

	dep->de_flags |= DEF_READING;
	(*dep->de_recvf) (dep, FALSE, size);
#if 0
	if ((dep->de_flags & (DEF_READING | DEF_STOPPED)) == (DEF_READING | DEF_STOPPED))
		/* The chip is stopped, and all arrived packets delivered */
		(*dep->de_resetf) (dep);
	dep->de_flags &= NOT(DEF_STOPPED);
#endif
  }
  reply(dep, OK);
  return;
}
Ejemplo n.º 4
0
/*
**  Name:	void do_vwrite(message *mp, int vectored)
**  Function:
*/
static void do_vwrite(message * mp, int vectored)
{
  int port, size;
  dpeth_t *dep;

  port = mp->DL_PORT;
  if (port < 0 || port >= DE_PORT_NR)	/* Check for illegal port number */
	panic(dep->de_name, PortErrMsg, port);

  dep = &de_table[port];
  dep->de_client = mp->DL_PROC;

  if (dep->de_mode == DEM_ENABLED) {

	if (dep->de_flags & DEF_SENDING)	/* Is sending in progress? */
		panic(dep->de_name, "send already in progress ", NO_NUM);

	dep->de_write_iovec.iod_proc_nr = mp->DL_PROC;
	if (vectored) {
		get_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR,
		       mp->DL_COUNT, dep->de_write_iovec.iod_iovec);
		dep->de_write_iovec.iod_iovec_s = mp->DL_COUNT;
		dep->de_write_iovec.iod_iovec_addr = (vir_bytes) mp->DL_ADDR;
		size = calc_iovec_size(&dep->de_write_iovec);
	} else {
		dep->de_write_iovec.iod_iovec[0].iov_addr = (vir_bytes) mp->DL_ADDR;
		dep->de_write_iovec.iod_iovec[0].iov_size = size = mp->DL_COUNT;
		dep->de_write_iovec.iod_iovec_s = 1;
		dep->de_write_iovec.iod_iovec_addr = 0;
	}
	if (size < ETH_MIN_PACK_SIZE || size > ETH_MAX_PACK_SIZE)
		panic(dep->de_name, SizeErrMsg, size);

	dep->de_flags |= DEF_SENDING;
	(*dep->de_sendf) (dep, FALSE, size);

  } else if (dep->de_mode == DEM_SINK)
	dep->de_flags |= DEF_ACK_SEND;

  reply(dep, OK);
  return;
}
Ejemplo n.º 5
0
/*
**  Name:	void do_vread_s(message *mp, int vectored)
**  Function:
*/
static void do_vread_s(message * mp)
{
  int port, size;
  dpeth_t *dep;

  port = mp->DL_PORT;
  if (port < 0 || port >= DE_PORT_NR)	/* Check for illegal port number */
	panic(__FILE__, PortErrMsg, EINVAL);

  dep = &de_table[port];
  dep->de_client = mp->DL_PROC;

  if (dep->de_mode == DEM_ENABLED) {

	if (dep->de_flags & DEF_READING)	/* Reading in progress */
		panic(dep->de_name, "read already in progress", NO_NUM);

	dep->de_read_iovec.iod_proc_nr = mp->DL_PROC;
	get_userdata_s(mp->DL_PROC, (vir_bytes) mp->DL_GRANT, 0,
		mp->DL_COUNT, dep->de_read_iovec.iod_iovec);
	dep->de_read_iovec.iod_iovec_s = mp->DL_COUNT;
	dep->de_read_iovec.iod_grant = (vir_bytes) mp->DL_GRANT;
	dep->de_read_iovec.iod_iovec_offset = 0;
	size = calc_iovec_size(&dep->de_read_iovec);
	if (size < ETH_MAX_PACK_SIZE) panic(dep->de_name, SizeErrMsg, size);

	dep->de_flags |= DEF_READING;
	(*dep->de_recvf) (dep, FALSE, size);
#if 0
	if ((dep->de_flags & (DEF_READING | DEF_STOPPED)) == (DEF_READING | DEF_STOPPED))
		/* The chip is stopped, and all arrived packets delivered */
		(*dep->de_resetf) (dep);
	dep->de_flags &= NOT(DEF_STOPPED);
#endif
  }
  reply(dep, OK, DL_TASK_REPLY);
  return;
}
Ejemplo n.º 6
0
/*
**  Name:	void do_vwrite_s(message *mp)
**  Function:
*/
static void do_vwrite_s(message * mp)
{
  int port, size;
  dpeth_t *dep;

  port = mp->DL_PORT;
  if (port < 0 || port >= DE_PORT_NR)	/* Check for illegal port number */
	panic(__FILE__, PortErrMsg, EINVAL);

  dep = &de_table[port];
  dep->de_client = mp->DL_PROC;

  if (dep->de_mode == DEM_ENABLED) {

	if (dep->de_flags & DEF_SENDING)	/* Is sending in progress? */
		panic(dep->de_name, "send already in progress ", NO_NUM);

	dep->de_write_iovec.iod_proc_nr = mp->DL_PROC;
	get_userdata_s(mp->DL_PROC, mp->DL_GRANT, 0,
	       mp->DL_COUNT, dep->de_write_iovec.iod_iovec);
	dep->de_write_iovec.iod_iovec_s = mp->DL_COUNT;
	dep->de_write_iovec.iod_grant = (vir_bytes) mp->DL_GRANT;
	dep->de_write_iovec.iod_iovec_offset = 0;
	size = calc_iovec_size(&dep->de_write_iovec);
	if (size < ETH_MIN_PACK_SIZE || size > ETH_MAX_PACK_SIZE)
		panic(dep->de_name, SizeErrMsg, size);

	dep->de_flags |= DEF_SENDING;
	(*dep->de_sendf) (dep, FALSE, size);

  } else if (dep->de_mode == DEM_SINK)
	dep->de_flags |= DEF_ACK_SEND;

  reply(dep, OK, DL_TASK_REPLY);
  return;
}