patch-2.1.106 linux/drivers/scsi/NCR53C9x.c

Next file: linux/drivers/scsi/NCR53C9x.h
Previous file: linux/drivers/scsi/Config.in
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.105/linux/drivers/scsi/NCR53C9x.c linux/drivers/scsi/NCR53C9x.c
@@ -395,12 +395,6 @@
 	esp_cmd(esp, eregs, ESP_CMD_NULL | ESP_CMD_DMA);
 	esp_cmd(esp, eregs, ESP_CMD_NULL | ESP_CMD_DMA);
 
-	/* Reload the configuration registers */
-	eregs->esp_cfact = esp->cfact;
-	eregs->esp_stp   = 0;
-	eregs->esp_soff  = 0;
-	eregs->esp_timeo = esp->neg_defp;
-
 	/* This is the only point at which it is reliable to read
 	 * the ID-code for a fast ESP chip variant.
 	 */
@@ -417,7 +411,10 @@
 		  }
 #endif
 		if(family_code == 0x02)
-			esp->erev = fas236;
+		        if ((version & 7) == 2)
+			        esp->erev = fas216;	
+                        else
+			        esp->erev = fas236;
 		else if(family_code == 0x0a)
 			esp->erev = fashme; /* Version is usually '5'. */
 		else
@@ -425,13 +422,20 @@
 		printk("esp%d: FAST chip is %s (family=%d, version=%d)\n",
 		       esp->esp_id,
 		       (esp->erev == fas236) ? "fas236" :
-		       ((esp->erev == fas100a) ? "fas100a" :
-		       "fasHME"), family_code, (version & 7));
+		       ((esp->erev == fas216) ? "fas216" :		       
+		       (((esp->erev == fas100a) ? "fas100a" :
+		       "fasHME"))), family_code, (version & 7));
 
 		esp->min_period = ((4 * esp->ccycle) / 1000);
 	} else {
 		esp->min_period = ((5 * esp->ccycle) / 1000);
 	}
+
+	/* Reload the configuration registers */
+	eregs->esp_cfact = esp->cfact;
+	eregs->esp_stp   = 0;
+	eregs->esp_soff  = 0;
+	eregs->esp_timeo = esp->neg_defp;
 	esp->max_period = (esp->max_period + 3)>>2;
 	esp->min_period = (esp->min_period + 3)>>2;
 
@@ -451,6 +455,7 @@
 	case fashme:
 		esp->config2 |= (ESP_CONFIG2_HME32 | ESP_CONFIG2_HMEFENAB);
 		/* fallthrough... */
+	case fas216:	    
 	case fas236:
 		/* Fast 236 or HME */
 		eregs->esp_cfg2 = esp->config2;
@@ -630,6 +635,9 @@
 	esp->neg_defp = ESP_NEG_DEFP(fmhz, ccf);
 	esp->sync_defp = SYNC_DEFP_SLOW;
 
+	printk("SCSI ID %d  Clock %d MHz CCF=%d Time-Out %d ",
+	       esp->scsi_id, (esp->cfreq / 1000000),
+	       esp->ccf, (int) esp->neg_defp);
 
 	/* Fill in ehost data */
 	esp->ehost->base = (unsigned char *) eregs;
@@ -707,10 +715,6 @@
 	esp_bootup_reset(esp, eregs);
 	
 	esps_in_use++;
-
-	printk("SCSI ID %d  Clock %d MHz CCF=%d Time-Out %d ",
-	       esp->scsi_id, (esp->cfreq / 1000000),
-	       esp->ccf, (int) esp->neg_defp);
 }
 
 /* The info function will return whatever useful
@@ -724,17 +728,19 @@
 	esp = (struct NCR_ESP *) host->hostdata;
 	switch(esp->erev) {
 	case esp100:
-		return "Sparc ESP100 (NCR53C90)";
+		return "ESP100 (NCR53C90)";
 	case esp100a:
-		return "Sparc ESP100A (NCR53C90A)";
+		return "ESP100A (NCR53C90A)";
 	case esp236:
-		return "Sparc ESP236";
+		return "ESP236";
+	case fas216:
+		return "ESP216-FAST";
 	case fas236:
-		return "Sparc ESP236-FAST";
+		return "ESP236-FAST";
 	case fashme:
-		return "Sparc ESP366-HME";
+		return "ESP366-HME";
 	case fas100a:
-		return "Sparc ESP100A-FAST";
+		return "ESP100A-FAST";
 	default:
 		panic("Bogon ESP revision");
 	};
@@ -807,6 +813,9 @@
 	case esp236:
 		copy_info(&info, "ESP236\n");
 		break;
+	case fas216:
+		copy_info(&info, "FAS216\n");
+		break;
 	case fas236:
 		copy_info(&info, "FAS236\n");
 		break;
@@ -1252,20 +1261,11 @@
 		SCpnt->SCp.buffer           =
 			(struct scatterlist *) SCpnt->request_buffer;
 		SCpnt->SCp.buffers_residual = 0;
-#ifdef CONFIG_SCSI_SUNESP
-		/* Sneaky. */
-		SCpnt->SCp.have_data_in = mmu_get_scsi_one((char *)SCpnt->SCp.buffer,
-							   SCpnt->SCp.this_residual,
-							   ((struct linux_sbus_device*) (esp->edev))->my_bus);
-		/* XXX The casts are extremely gross, but with 64-bit kernel
-		 * XXX and 32-bit SBUS what am I to do? -DaveM
-		 */
-		SCpnt->SCp.ptr = (char *)((unsigned long)SCpnt->SCp.have_data_in);
-#else
-		SCpnt->SCp.have_data_in = (int) SCpnt->SCp.ptr =
-			(char *) VTOP((unsigned long) SCpnt->request_buffer);
-#endif
-
+	        if (esp->dma_mmu_get_scsi_one)
+		        esp->dma_mmu_get_scsi_one (esp, SCpnt);
+	        else
+		        SCpnt->SCp.have_data_in = (int) SCpnt->SCp.ptr =
+		                (char *) virt_to_phys(SCpnt->request_buffer);
 	} else {
 		ESPQUEUE(("use_sg "));
 #ifdef DEBUG_ESP_SG
@@ -1275,16 +1275,11 @@
 		SCpnt->SCp.buffer           = (struct scatterlist *) SCpnt->buffer;
 		SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
 		SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
-#ifdef CONFIG_SCSI_SUNESP
-		mmu_get_scsi_sgl((struct mmu_sglist *) SCpnt->SCp.buffer,
-				 SCpnt->SCp.buffers_residual,
-				 ((struct linux_sbus_device *) (esp->edev))->my_bus);
-		/* XXX Again these casts are sick... -DaveM */
-		SCpnt->SCp.ptr=(char *)((unsigned long)SCpnt->SCp.buffer->dvma_address);
-#else
-		SCpnt->SCp.ptr = 
-		  (char *) VTOP((unsigned long) SCpnt->SCp.buffer->address);
-#endif
+	        if (esp->dma_mmu_get_scsi_sgl)
+		        esp->dma_mmu_get_scsi_sgl (esp, SCpnt);
+	        else
+		        SCpnt->SCp.ptr = 
+		                (char *) virt_to_phys(SCpnt->SCp.buffer->address);
 	}
 	SCpnt->SCp.Status           = CHECK_CONDITION;
 	SCpnt->SCp.Message          = 0xff;
@@ -1481,21 +1476,14 @@
 
 		/* Free dvma entry. */
 		if(!done_SC->use_sg) {
-#ifdef CONFIG_SCSI_SUNESP
-			/* Sneaky. */
-			mmu_release_scsi_one(done_SC->SCp.have_data_in,
-					     done_SC->request_bufflen,
-					     ((struct linux_sbus_device *) (esp->edev))->my_bus);
-#endif
+		        if (esp->dma_mmu_release_scsi_one)
+			        esp->dma_mmu_release_scsi_one (esp, done_SC);
 		} else {
 #ifdef DEBUG_ESP_SG
 			printk("esp%d: unmapping sg ", esp->esp_id);
 #endif
-#ifdef CONFIG_SCSI_SUNESP
-			mmu_release_scsi_sgl((struct mmu_sglist *) done_SC->buffer,
-					     done_SC->use_sg - 1,
-					     ((struct linux_sbus_device *) (esp->edev))->my_bus);
-#endif
+		        if (esp->dma_mmu_release_scsi_sgl)
+			        esp->dma_mmu_release_scsi_sgl (esp, done_SC);
 #ifdef DEBUG_ESP_SG
 			printk("done.\n");
 #endif
@@ -1861,16 +1849,15 @@
 	return do_work_bus;
 }
 
-static inline void advance_sg(Scsi_Cmnd *sp)
+static inline void advance_sg(struct NCR_ESP *esp, Scsi_Cmnd *sp)
 {
 	++sp->SCp.buffer;
 	--sp->SCp.buffers_residual;
 	sp->SCp.this_residual = sp->SCp.buffer->length;
-#ifdef CONFIG_SCSI_SUNESP
-	sp->SCp.ptr = (char *)((unsigned long)sp->SCp.buffer->dvma_address);
-#else
-	sp->SCp.ptr = (char *)VTOP((unsigned long) sp->SCp.buffer->address);
-#endif
+        if (esp->dma_advance_sg)
+	       esp->dma_advance_sg (sp);
+        else
+	       sp->SCp.ptr = (char *)virt_to_phys(sp->SCp.buffer->address);
 }
 
 /* Please note that the way I've coded these routines is that I _always_
@@ -2067,7 +2054,7 @@
 		 * figure this out.
 		 */
 		if(SCptr->use_sg && !SCptr->SCp.this_residual)
-			advance_sg(SCptr);
+			advance_sg(esp, SCptr);
 		if(sreg_datainp(esp->sreg) || sreg_dataoutp(esp->sreg)) {
 			ESPDATA(("to more data\n"));
 			return esp_do_data(esp, eregs);
@@ -2922,6 +2909,7 @@
 			tmp = esp->ccycle / 1000;
 			regval = (((period << 2) + tmp - 1) / tmp);
 			if(regval && ((esp->erev == fas100a ||
+				       esp->erev == fas216 ||				       
 				       esp->erev == fas236 ||
 				       esp->erev == fashme))) {
 				if(period >= 50)
@@ -2934,7 +2922,7 @@
 
 			SDptr->sync_min_period = (regval & 0x1f);
 			SDptr->sync_max_offset = (offset | esp->radelay);
-			if((esp->erev == fas100a || esp->erev == fas236 || esp->erev == fashme)) {
+			if((esp->erev == fas100a || esp->erev == fas216 || esp->erev == fas236 || esp->erev == fashme)) {
 				if((esp->erev == fas100a) || (esp->erev == fashme))
 					bit = ESP_CONFIG3_FAST;
 				else
@@ -2963,7 +2951,7 @@
 			SDptr->sync_min_period = 0;
 			eregs->esp_soff = 0;
 			eregs->esp_stp = 0;
-			if((esp->erev == fas100a || esp->erev == fas236 || esp->erev == fashme)) {
+			if((esp->erev == fas100a || esp->erev == fas216 || esp->erev == fas236 || esp->erev == fashme)) {
 				if((esp->erev == fas100a) || (esp->erev == fashme))
 					bit = ESP_CONFIG3_FAST;
 				else
@@ -3595,17 +3583,13 @@
 		if(esp->current_SC) {
 			Scsi_Cmnd *SCptr = esp->current_SC;
 
-#ifdef CONFIG_SCSI_SUNESP
-			if(!SCptr->use_sg)
-				mmu_release_scsi_one(SCptr->SCp.have_data_in,
-						     SCptr->request_bufflen,
-						     ((struct linux_sbus_device *) (esp->edev))->my_bus);
-			else
-				mmu_release_scsi_sgl((struct mmu_sglist *)
-						     SCptr->buffer,
-						     SCptr->use_sg - 1,
-						     ((struct linux_sbus_device *) (esp->edev))->my_bus);
-#endif
+			if(!SCptr->use_sg) {
+			        if (esp->dma_mmu_release_scsi_one)
+			                esp->dma_mmu_release_scsi_one (esp, SCptr);
+			} else {
+			        if (esp->dma_mmu_release_scsi_sgl)
+			                esp->dma_mmu_release_scsi_sgl (esp, SCptr);
+			}
 			SCptr->result = (DID_RESET << 16);
 
 			SCptr->scsi_done(SCptr);
@@ -3614,17 +3598,13 @@
 		if(esp->disconnected_SC) {
 			Scsi_Cmnd *SCptr;
 			while((SCptr = remove_first_SC(&esp->disconnected_SC))) {
-				if(!SCptr->use_sg)
-#ifdef CONFIG_SCSI_SUNESP
-					mmu_release_scsi_one(SCptr->SCp.have_data_in,
-							     SCptr->request_bufflen,
-							     ((struct linux_sbus_device *) (esp->edev))->my_bus);
-				else
-					mmu_release_scsi_sgl((struct mmu_sglist *)
-							     SCptr->buffer,
-							     SCptr->use_sg - 1,
-							     ((struct linux_sbus_device *) (esp->edev))->my_bus);
-#endif
+				if(!SCptr->use_sg) {
+			                if (esp->dma_mmu_release_scsi_one)
+			                        esp->dma_mmu_release_scsi_one (esp, SCptr);
+				} else {
+			                if (esp->dma_mmu_release_scsi_sgl)
+			                        esp->dma_mmu_release_scsi_sgl (esp, SCptr);
+				}
 				SCptr->result = (DID_RESET << 16);
 
 				SCptr->scsi_done(SCptr);
@@ -3671,7 +3651,9 @@
 repeat:
 	again = 0;
 	for_each_esp(esp) {
+#ifndef __mips__	    
 		if(((esp)->irq & 0xf) == irq) {
+#endif		    
 			if(esp->dma_irq_p(esp)) {
 				again = 1;
 
@@ -3683,7 +3665,9 @@
 
 				esp->dma_ints_on(esp);
 			}
+#ifndef __mips__		    
 		}
+#endif	    
 	}
 	if(again)
 		goto repeat;

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov