コード例 #1
0
ファイル: disksim_ctlrdumb.c プロジェクト: farshid83/DiskSim
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);
    }
}
コード例 #2
0
ファイル: disksim_ctlrdumb.c プロジェクト: farshid83/DiskSim
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);
}
コード例 #3
0
ファイル: disksim_ctlrdumb.c プロジェクト: farshid83/DiskSim
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);
    }
}
コード例 #4
0
ファイル: disksim_ctlrdumb.c プロジェクト: farshid83/DiskSim
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);
    }
}
コード例 #5
0
ファイル: disksim_ctlrsmart.c プロジェクト: 915086731/disksim
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);
}