/* ** 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; }
/* ** 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; }
/* ** Name: void dp_next_iovec(iovec_dat_t *iovp) ** Function: Retrieves data from next iovec element. */ PUBLIC void dp_next_iovec(iovec_dat_s_t * iovp) { iovp->iod_iovec_s -= IOVEC_NR; iovp->iod_iovec_offset += IOVEC_NR * sizeof(iovec_t); get_userdata_s(iovp->iod_proc_nr, iovp->iod_grant, iovp->iod_iovec_offset, iovp->iod_iovec_s, iovp->iod_iovec); return; }
/* ** 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; }
/* ** 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; }