diff options
Diffstat (limited to 'drivers/ide')
| -rw-r--r-- | drivers/ide/au1xxx-ide.c | 7 | ||||
| -rw-r--r-- | drivers/ide/icside.c | 6 | ||||
| -rw-r--r-- | drivers/ide/ide-atapi.c | 19 | ||||
| -rw-r--r-- | drivers/ide/ide-dma-sff.c | 4 | ||||
| -rw-r--r-- | drivers/ide/ide-dma.c | 5 | ||||
| -rw-r--r-- | drivers/ide/ide-taskfile.c | 1 | ||||
| -rw-r--r-- | drivers/ide/pmac.c | 7 | ||||
| -rw-r--r-- | drivers/ide/sgiioc4.c | 10 | ||||
| -rw-r--r-- | drivers/ide/tx4939ide.c | 4 | 
9 files changed, 22 insertions, 41 deletions
diff --git a/drivers/ide/au1xxx-ide.c b/drivers/ide/au1xxx-ide.c index 82f153810eb..3fc3ced8192 100644 --- a/drivers/ide/au1xxx-ide.c +++ b/drivers/ide/au1xxx-ide.c @@ -211,21 +211,16 @@ static void auide_set_dma_mode(ide_drive_t *drive, const u8 speed)  #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA  static int auide_build_dmatable(ide_drive_t *drive)  { -	int i, iswrite, count = 0;  	ide_hwif_t *hwif = drive->hwif;  	struct request *rq = hwif->rq;  	_auide_hwif *ahwif = &auide_hwif;  	struct scatterlist *sg; +	int i = hwif->sg_nents, iswrite, count = 0;  	iswrite = (rq_data_dir(rq) == WRITE);  	/* Save for interrupt context */  	ahwif->drive = drive; -	hwif->sg_nents = i = ide_build_sglist(drive, rq); - -	if (!i) -		return 0; -  	/* fill the descriptors */  	sg = hwif->sg_table;  	while (i && sg_dma_len(sg)) { diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c index cf0522f937c..78fc36f98d2 100644 --- a/drivers/ide/icside.c +++ b/drivers/ide/icside.c @@ -325,12 +325,6 @@ static int icside_dma_setup(ide_drive_t *drive)  	 */  	BUG_ON(dma_channel_active(ec->dma)); -	hwif->sg_nents = ide_build_sglist(drive, rq); -	if (hwif->sg_nents == 0) { -		ide_map_sg(drive, rq); -		return 1; -	} -  	/*  	 * Ensure that we have the right interrupt routed.  	 */ diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index f72b5a67543..2b9ac210667 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c @@ -631,18 +631,23 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive)  	struct ide_atapi_pc *pc;  	ide_hwif_t *hwif = drive->hwif;  	ide_expiry_t *expiry = NULL; +	struct request *rq = hwif->rq;  	unsigned int timeout;  	u32 tf_flags;  	u16 bcount;  	if (dev_is_idecd(drive)) {  		tf_flags = IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL; -		bcount = ide_cd_get_xferlen(hwif->rq); +		bcount = ide_cd_get_xferlen(rq);  		expiry = ide_cd_expiry;  		timeout = ATAPI_WAIT_PC; -		if (drive->dma) -			drive->dma = !hwif->dma_ops->dma_setup(drive); +		if (drive->dma) { +			if (ide_build_sglist(drive, rq)) +				drive->dma = !hwif->dma_ops->dma_setup(drive); +			else +				drive->dma = 0; +		}  	} else {  		pc = drive->pc; @@ -661,8 +666,12 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive)  		}  		if ((pc->flags & PC_FLAG_DMA_OK) && -		     (drive->dev_flags & IDE_DFLAG_USING_DMA)) -			drive->dma = !hwif->dma_ops->dma_setup(drive); +		     (drive->dev_flags & IDE_DFLAG_USING_DMA)) { +			if (ide_build_sglist(drive, rq)) +				drive->dma = !hwif->dma_ops->dma_setup(drive); +			else +				drive->dma = 0; +		}  		if (!drive->dma)  			pc->flags &= ~PC_FLAG_DMA_OK; diff --git a/drivers/ide/ide-dma-sff.c b/drivers/ide/ide-dma-sff.c index 123d393658a..22b3e751d19 100644 --- a/drivers/ide/ide-dma-sff.c +++ b/drivers/ide/ide-dma-sff.c @@ -120,10 +120,6 @@ int ide_build_dmatable(ide_drive_t *drive, struct request *rq)  	struct scatterlist *sg;  	u8 is_trm290 = !!(hwif->host_flags & IDE_HFLAG_TRM290); -	hwif->sg_nents = ide_build_sglist(drive, rq); -	if (hwif->sg_nents == 0) -		return 0; -  	for_each_sg(hwif->sg_table, sg, hwif->sg_nents, i) {  		u32 cur_addr, cur_len, xcount, bcount; diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index a878f4734f8..12c11b71402 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c @@ -138,14 +138,15 @@ int ide_build_sglist(ide_drive_t *drive, struct request *rq)  		hwif->sg_dma_direction = DMA_TO_DEVICE;  	i = dma_map_sg(hwif->dev, sg, hwif->sg_nents, hwif->sg_dma_direction); -	if (i) { +	if (i == 0) +		ide_map_sg(drive, rq); +	else {  		hwif->orig_sg_nents = hwif->sg_nents;  		hwif->sg_nents = i;  	}  	return i;  } -EXPORT_SYMBOL_GPL(ide_build_sglist);  /**   *	ide_destroy_dmatable	-	clean up DMA mapping diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 15bbfc1dcd2..925fb924189 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -103,6 +103,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)  		return ide_started;  	default:  		if ((drive->dev_flags & IDE_DFLAG_USING_DMA) == 0 || +		    ide_build_sglist(drive, hwif->rq) == 0 ||  		    dma_ops->dma_setup(drive))  			return ide_stopped;  		dma_ops->dma_exec_cmd(drive, tf->command); diff --git a/drivers/ide/pmac.c b/drivers/ide/pmac.c index 74625e821a4..904fb54668e 100644 --- a/drivers/ide/pmac.c +++ b/drivers/ide/pmac.c @@ -1429,10 +1429,10 @@ pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq)  	pmac_ide_hwif_t *pmif =  		(pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);  	struct dbdma_cmd *table; -	int i, count = 0;  	volatile struct dbdma_regs __iomem *dma = pmif->dma_regs;  	struct scatterlist *sg;  	int wr = (rq_data_dir(rq) == WRITE); +	int i = hwif->sg_nents, count = 0;  	/* DMA table is already aligned */  	table = (struct dbdma_cmd *) pmif->dma_table_cpu; @@ -1442,11 +1442,6 @@ pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq)  	while (readl(&dma->status) & RUN)  		udelay(1); -	hwif->sg_nents = i = ide_build_sglist(drive, rq); - -	if (!i) -		return 0; -  	/* Build DBDMA commands list */  	sg = hwif->sg_table;  	while (i && sg_dma_len(sg)) { diff --git a/drivers/ide/sgiioc4.c b/drivers/ide/sgiioc4.c index 1cffe70f385..ab9433a7ad1 100644 --- a/drivers/ide/sgiioc4.c +++ b/drivers/ide/sgiioc4.c @@ -429,15 +429,9 @@ sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir)  {  	ide_hwif_t *hwif = drive->hwif;  	unsigned int *table = hwif->dmatable_cpu; -	unsigned int count = 0, i = 1; -	struct scatterlist *sg; +	unsigned int count = 0, i = hwif->sg_nents; +	struct scatterlist *sg = hwif->sg_table; -	hwif->sg_nents = i = ide_build_sglist(drive, rq); - -	if (!i) -		return 0;	/* sglist of length Zero */ - -	sg = hwif->sg_table;  	while (i && sg_dma_len(sg)) {  		dma_addr_t cur_addr;  		int cur_len; diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c index f0033eb2e88..ee86688d846 100644 --- a/drivers/ide/tx4939ide.c +++ b/drivers/ide/tx4939ide.c @@ -240,10 +240,6 @@ static int tx4939ide_build_dmatable(ide_drive_t *drive, struct request *rq)  	int i;  	struct scatterlist *sg; -	hwif->sg_nents = ide_build_sglist(drive, rq); -	if (hwif->sg_nents == 0) -		return 0; -  	for_each_sg(hwif->sg_table, sg, hwif->sg_nents, i) {  		u32 cur_addr, cur_len, bcount;  |