static void ssd_reconnect_done (ioreq_event *curr) { ssd_t *currdisk; // fprintf (outputfile, "Entering ssd_reconnect_done for disk %d: %12.6f\n", curr->devno, simtime); currdisk = getssd (curr->devno); ssd_assert_current_activity(currdisk, curr); if (curr->flags & READ) { if (currdisk->neverdisconnect) { /* Just holding on to bus; data transfer will be initiated when */ /* media access is complete. */ addtoextraq((event *) curr); ssd_check_channel_activity (currdisk); } else { /* data transfer: curr->bcount, which is still set to original */ /* requested value, indicates how many blks to transfer. */ curr->type = DEVICE_DATA_TRANSFER_COMPLETE; ssd_send_event_up_path(curr, (double) 0.0); } } else { if (currdisk->reconnect_reason == DEVICE_ACCESS_COMPLETE) { ssd_request_complete (curr); } else { /* data transfer: curr->bcount, which is still set to original */ /* requested value, indicates how many blks to transfer. */ curr->type = DEVICE_DATA_TRANSFER_COMPLETE; ssd_send_event_up_path(curr, (double) 0.0); } } }
static void ssd_check_channel_activity (ssd_t *currdisk) { while (1) { ioreq_event *curr = currdisk->completion_queue; currdisk->channel_activity = curr; if (curr != NULL) { currdisk->completion_queue = curr->next; if (curr->flags & READ) { /* transfer data up the line: curr->bcount, which is still set to */ /* original requested value, indicates how many blks to transfer. */ curr->type = DEVICE_DATA_TRANSFER_COMPLETE; ssd_send_event_up_path(curr, (double) 0.0); } else { ssd_request_complete (curr); } } else { curr = ioqueue_get_next_request(currdisk->queue); currdisk->channel_activity = curr; if (curr != NULL) { if (curr->flags & READ) { ssd_media_access_request(curr); continue; } else { curr->cause = RECONNECT; curr->type = IO_INTERRUPT_ARRIVE; currdisk->reconnect_reason = IO_INTERRUPT_ARRIVE; ssd_send_event_up_path (curr, currdisk->bus_transaction_latency); } } } break; } }
static void ssd_request_arrive (ioreq_event *curr) { ssd_t *currdisk; // fprintf (outputfile, "Entering ssd_request_arrive: %12.6f\n", simtime); // fprintf (outputfile, "ssd = %d, blkno = %d, bcount = %d, read = %d\n",curr->devno, curr->blkno, curr->bcount, (READ & curr->flags)); currdisk = getssd(curr->devno); // verify that request is valid. if ((curr->blkno < 0) || (curr->bcount <= 0) || ((curr->blkno + curr->bcount) > currdisk->numblocks)) { fprintf(outputfile3, "Invalid set of blocks requested from ssd - blkno %d, bcount %d, numblocks %d\n", curr->blkno, curr->bcount, currdisk->numblocks); exit(1); } /* create a new request, set it up for initial interrupt */ ioqueue_add_new_request(currdisk->queue, curr); if (currdisk->channel_activity == NULL) { curr = ioqueue_get_next_request(currdisk->queue); currdisk->busowned = ssd_get_busno(curr); currdisk->channel_activity = curr; currdisk->reconnect_reason = IO_INTERRUPT_ARRIVE; if (curr->flags & READ) { ssd_media_access_request (curr); ssd_check_channel_activity(currdisk); } else { curr->cause = READY_TO_TRANSFER; curr->type = IO_INTERRUPT_ARRIVE; ssd_send_event_up_path(curr, currdisk->bus_transaction_latency); } } }
/* * send completion up the line */ static void ssd_request_complete(ioreq_event *curr) { ssd_t *currdisk; ioreq_event *x; // fprintf (outputfile, "Entering ssd_request_complete: %12.6f\n", simtime); currdisk = getssd (curr->devno); ssd_assert_current_activity(currdisk, curr); if ((x = ioqueue_physical_access_done(currdisk->queue,curr)) == NULL) { fprintf(stderr, "ssd_request_complete: ioreq_event not found by ioqueue_physical_access_done call\n"); exit(1); } /* send completion interrupt */ curr->type = IO_INTERRUPT_ARRIVE; curr->cause = COMPLETION; ssd_send_event_up_path(curr, currdisk->bus_transaction_latency); }
static void ssd_bustransfer_complete (ioreq_event *curr) { // fprintf (outputfile, "Entering ssd_bustransfer_complete for disk %d: %12.6f\n", curr->devno, simtime); if (curr->flags & READ) { ssd_request_complete (curr); } else { ssd_t *currdisk = getssd (curr->devno); ssd_assert_current_activity(currdisk, curr); if (currdisk->neverdisconnect == FALSE) { /* disconnect from bus */ ioreq_event *tmp = ioreq_copy (curr); tmp->type = IO_INTERRUPT_ARRIVE; tmp->cause = DISCONNECT; ssd_send_event_up_path (tmp, currdisk->bus_transaction_latency); ssd_media_access_request (curr); } else { ssd_media_access_request (curr); ssd_check_channel_activity (currdisk); } } }