static void controller_53c700_reconnect_to_transfer (controller *currctlr, ioreq_event *curr) { #ifdef DEBUG_CTLRDUMB fprintf (outputfile, "*** %f: controller_53c700_reconnect_to_transfer - devno %d, blkno %d\n, bcount %d, flags 0x%x\n", simtime, curr->devno, curr->blkno, curr->bcount, curr->flags ); fflush( outputfile ); #endif switch (currctlr->state) { case COMPLETION_PENDING: case DISCONNECT_PENDING: curr->next = currctlr->connections; currctlr->connections = curr; break; case REQUEST_PENDING: controller_remove_type_from_buswait(currctlr, IO_ACCESS_ARRIVE); case FREE: currctlr->state = RECONNECTING; controller_send_event_up_path(currctlr, curr, currctlr->ovrhd_reconnect); break; default: fprintf(stderr, "Received reconnection request in invalid state - ctlno %d, state %d\n", currctlr->ctlno, currctlr->state); exit(1); } }
static void controller_53c700_disconnect (controller *currctlr, ioreq_event *curr) { ioreq_event *ret; #ifdef DEBUG_CTLRDUMB fprintf (outputfile, "*** %f: controller_53c700_disconnect - devno %d, blkno %d\n, bcount %d, flags 0x%x\n", simtime, curr->devno, curr->blkno, curr->bcount, curr->flags ); #endif switch (currctlr->state) { case READ_DATA_TRANSFER: case WRITE_DATA_TRANSFER: case REQUEST_PENDING: break; default: fprintf(stderr, "Completing request not transfering in controller_53c700_request_complete\n"); exit(1); } ret = ioreq_copy(curr); ret->type = IO_INTERRUPT_COMPLETE; currctlr->outbusowned = controller_get_downward_busno(currctlr, curr, NULL); controller_send_event_down_path(currctlr, ret, currctlr->ovrhd_disk_disconnect); currctlr->outbusowned = -1; currctlr->state = DISCONNECT_PENDING; controller_send_event_up_path(currctlr, curr, currctlr->ovrhd_disconnect); }
static void controller_53c700_reset_complete (controller *currctlr, ioreq_event *curr) { ioreq_event *tmp; #ifdef DEBUG_CTLRDUMB fprintf (outputfile, "*** %f: controller_53c700_reset_complete - devno %d, blkno %d, bcount %d, flags %X\n", simtime, curr->devno, curr->blkno, curr->bcount, curr->flags ); fflush( outputfile); #endif switch (currctlr->state) { case COMPLETION_PENDING: case DISCONNECT_PENDING: break; default: fprintf(stderr, "Controller not in appropriate state for reset completion\n"); exit(1); } currctlr->state = FREE; addtoextraq((event *) curr); if (currctlr->connections != NULL) { /* fprintf (outputfile, "Pending reconnection for controller %d\n", ctlno); */ tmp = currctlr->connections; currctlr->connections = tmp->next; currctlr->state = RECONNECTING; controller_send_event_up_path(currctlr, tmp, currctlr->ovrhd_reset); } }
void controller_passthru_event_arrive (controller *currctlr, ioreq_event *curr) { int busno; int slotno; #ifdef DEBUG_CTLRDUMB dumpIOReq("controller_passthru_event_arrive", curr ); fflush(outputfile ); #endif switch (curr->type) { case IO_INTERRUPT_COMPLETE: currctlr->outbusowned = controller_get_downward_busno(currctlr, curr, NULL); controller_send_event_down_path(currctlr, curr, PASSTHRU_DELAY); currctlr->outbusowned = -1; break; case IO_ACCESS_ARRIVE: /* fprintf (outputfile, "Following passthru_event path, and passing access down\n"); */ controller_send_event_down_path(currctlr, curr, PASSTHRU_DELAY); break; case IO_INTERRUPT_ARRIVE: if (curr->cause == READY_TO_TRANSFER) { curr->cause = RECONNECT; } controller_send_event_up_path(currctlr, curr, PASSTHRU_DELAY); break; case DEVICE_DATA_TRANSFER_COMPLETE: controller_send_event_up_path(currctlr, curr, (double) 0.0); break; case IO_QLEN_MAXCHECK: busno = controller_get_downward_busno(currctlr, curr, &slotno); bus_deliver_event(busno, slotno, curr); break; default: fprintf(stderr, "Unknown event type arriving at passthru controller: %d\n", curr->type); exit(1); } }
static void controller_smart_request_complete (void *donefuncparam, ioreq_event *curr) { controller *currctlr = donefuncparam; /* fprintf (outputfile, "Request completed at smart controller: devno %d, blkno %d\n", curr->devno, curr->blkno); */ curr->type = IO_INTERRUPT_ARRIVE; curr->cause = COMPLETION; controller_send_event_up_path(currctlr, curr, currctlr->ovrhd_complete); }