diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 11:59:37 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 14:20:42 +0200 | 
| commit | dbb6be6d5e974c42bbecd183effaa0df69e1dd8b (patch) | |
| tree | 5735cb47e70853d057a9881dd0ce44b83e88fa63 /drivers/scsi/advansys.c | |
| parent | 6a867a395558a7f882d041783e4cdea6744ca2bf (diff) | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| download | olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.tar.xz olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.zip  | |
Merge branch 'linus' into timers/core
Reason: Further posix_cpu_timer patches depend on mainline changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/scsi/advansys.c')
| -rw-r--r-- | drivers/scsi/advansys.c | 58 | 
1 files changed, 44 insertions, 14 deletions
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 22626abdb63..7f87979da22 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c @@ -4724,6 +4724,10 @@ static ushort AscInitMicroCodeVar(ASC_DVC_VAR *asc_dvc)  	BUG_ON((unsigned long)asc_dvc->overrun_buf & 7);  	asc_dvc->overrun_dma = dma_map_single(board->dev, asc_dvc->overrun_buf,  					ASC_OVERRUN_BSIZE, DMA_FROM_DEVICE); +	if (dma_mapping_error(board->dev, asc_dvc->overrun_dma)) { +		warn_code = -ENOMEM; +		goto err_dma_map; +	}  	phy_addr = cpu_to_le32(asc_dvc->overrun_dma);  	AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_PADDR_D,  				 (uchar *)&phy_addr, 1); @@ -4739,14 +4743,23 @@ static ushort AscInitMicroCodeVar(ASC_DVC_VAR *asc_dvc)  	AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);  	if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {  		asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR; -		return warn_code; +		warn_code = UW_ERR; +		goto err_mcode_start;  	}  	if (AscStartChip(iop_base) != 1) {  		asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP; -		return warn_code; +		warn_code = UW_ERR; +		goto err_mcode_start;  	}  	return warn_code; + +err_mcode_start: +	dma_unmap_single(board->dev, asc_dvc->overrun_dma, +			 ASC_OVERRUN_BSIZE, DMA_FROM_DEVICE); +err_dma_map: +	asc_dvc->overrun_dma = 0; +	return warn_code;  }  static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc) @@ -4781,12 +4794,14 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)  	if (err) {  		printk(KERN_ERR "Failed to load image \"%s\" err %d\n",  		       fwname, err); +		asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;  		return err;  	}  	if (fw->size < 4) {  		printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",  		       fw->size, fwname);  		release_firmware(fw); +		asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;  		return -EINVAL;  	}  	chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | @@ -4800,6 +4815,8 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)  	}  	release_firmware(fw);  	warn_code |= AscInitMicroCodeVar(asc_dvc); +	if (!asc_dvc->overrun_dma) +		return warn_code;  	asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC;  	AscEnableInterrupt(iop_base);  	return warn_code; @@ -5110,12 +5127,14 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)  	if (err) {  		printk(KERN_ERR "Failed to load image \"%s\" err %d\n",  		       fwname, err); +		asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;  		return err;  	}  	if (fw->size < 4) {  		printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",  		       fw->size, fwname);  		release_firmware(fw); +		asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;  		return -EINVAL;  	}  	chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | @@ -5624,12 +5643,14 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)  	if (err) {  		printk(KERN_ERR "Failed to load image \"%s\" err %d\n",  		       fwname, err); +		asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;  		return err;  	}  	if (fw->size < 4) {  		printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",  		       fw->size, fwname);  		release_firmware(fw); +		asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;  		return -EINVAL;  	}  	chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | @@ -6124,12 +6145,14 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)  	if (err) {  		printk(KERN_ERR "Failed to load image \"%s\" err %d\n",  		       fwname, err); +		asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;  		return err;  	}  	if (fw->size < 4) {  		printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",  		       fw->size, fwname);  		release_firmware(fw); +		asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;  		return -EINVAL;  	}  	chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | @@ -7970,9 +7993,10 @@ static int advansys_reset(struct scsi_cmnd *scp)  		status = AscInitAsc1000Driver(asc_dvc);  		/* Refer to ASC_IERR_* definitions for meaning of 'err_code'. */ -		if (asc_dvc->err_code) { +		if (asc_dvc->err_code || !asc_dvc->overrun_dma) {  			scmd_printk(KERN_INFO, scp, "SCSI bus reset error: " -				    "0x%x\n", asc_dvc->err_code); +				    "0x%x, status: 0x%x\n", asc_dvc->err_code, +				    status);  			ret = FAILED;  		} else if (status) {  			scmd_printk(KERN_INFO, scp, "SCSI bus reset warning: " @@ -12303,7 +12327,7 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,  		asc_dvc_varp->overrun_buf = kzalloc(ASC_OVERRUN_BSIZE, GFP_KERNEL);  		if (!asc_dvc_varp->overrun_buf) {  			ret = -ENOMEM; -			goto err_free_wide_mem; +			goto err_free_irq;  		}  		warn_code = AscInitAsc1000Driver(asc_dvc_varp); @@ -12312,30 +12336,36 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,  					"warn 0x%x, error 0x%x\n",  					asc_dvc_varp->init_state, warn_code,  					asc_dvc_varp->err_code); -			if (asc_dvc_varp->err_code) { +			if (!asc_dvc_varp->overrun_dma) {  				ret = -ENODEV; -				kfree(asc_dvc_varp->overrun_buf); +				goto err_free_mem;  			}  		}  	} else { -		if (advansys_wide_init_chip(shost)) +		if (advansys_wide_init_chip(shost)) {  			ret = -ENODEV; +			goto err_free_mem; +		}  	} -	if (ret) -		goto err_free_wide_mem; -  	ASC_DBG_PRT_SCSI_HOST(2, shost);  	ret = scsi_add_host(shost, boardp->dev);  	if (ret) -		goto err_free_wide_mem; +		goto err_free_mem;  	scsi_scan_host(shost);  	return 0; - err_free_wide_mem: -	advansys_wide_free_mem(boardp); + err_free_mem: +	if (ASC_NARROW_BOARD(boardp)) { +		if (asc_dvc_varp->overrun_dma) +			dma_unmap_single(boardp->dev, asc_dvc_varp->overrun_dma, +					 ASC_OVERRUN_BSIZE, DMA_FROM_DEVICE); +		kfree(asc_dvc_varp->overrun_buf); +	} else +		advansys_wide_free_mem(boardp); + err_free_irq:  	free_irq(boardp->irq, shost);   err_free_dma:  #ifdef CONFIG_ISA  |