Example #1
0
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);
	}
}
Example #2
0
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 );
		}
	}
}