void ata_dpc_DMA(ide_qrequest *qrequest) { ide_device_info *device = qrequest->device; bool dma_success, dev_err; dma_success = finish_dma(device); dev_err = check_rw_error(device, qrequest); if (dma_success && !dev_err) { // reset error count if DMA worked device->DMA_failures = 0; device->CQ_failures = 0; qrequest->request->data_resid = 0; finish_checksense(qrequest); } else { SHOW_ERROR0( 2, "Error in DMA transmission" ); set_sense(device, SCSIS_KEY_HARDWARE_ERROR, SCSIS_ASC_LUN_COM_FAILURE); if (++device->DMA_failures >= MAX_DMA_FAILURES) { SHOW_ERROR0( 2, "Disabled DMA because of too many errors" ); device->DMA_enabled = false; } // reset queue in case queuing is active finish_reset_queue(qrequest); } }
void ata_dpc_DMA( ide_qrequest *qrequest ) { ide_device_info *device = qrequest->device; //ide_bus_info *bus = device->bus; bool dma_err, dev_err; dma_err = finish_dma( device ); dev_err = check_rw_error( device, qrequest ); if( !dma_err && !dev_err ) { device->DMA_failures = 0; device->CQ_failures = 0; qrequest->request->cam_resid = 0; finish_checksense( qrequest ); } else { if( ++device->DMA_failures == MAX_DMA_FAILURES ) { device->DMA_enabled = false; finish_reset_queue( qrequest ); } else { finish_retry( qrequest ); } } }