All of lore.kernel.org
 help / color / mirror / Atom feed
* Patch to fix HP Colorado in 2.4 (RH #36628)
@ 2001-09-27 22:11 Pete Zaitcev
  0 siblings, 0 replies; 2+ messages in thread
From: Pete Zaitcev @ 2001-09-27 22:11 UTC (permalink / raw)
  To: alan; +Cc: linux-kernel

Alan,

would you please to take this patch in. I am not sure it's 100% ok
for Linus tree, but I want as many people as possible to test it,
especially OnStream owners.

Thanks,
-- Pete

ide-tape-03x.diff --------------------------------------

Removes extra buffer flush from read_position(), which confuses
all versions of the HP Colorado.

Also touches up on insane logging.

--- linux-2.4.9/drivers/ide/ide-tape.c	Mon Aug 13 14:56:19 2001
+++ linux-2.4.9-tape/drivers/ide/ide-tape.c	Wed Sep 26 16:18:11 2001
@@ -429,8 +429,6 @@
 #include <asm/bitops.h>
 
 
-#define NO_LONGER_REQUIRED	(1)
-
 /*
  *	OnStream support
  */
@@ -2101,10 +2099,6 @@
 		if (status.b.check && pc->c[0] == IDETAPE_REQUEST_SENSE_CMD)
 			status.b.check = 0;
 		if (status.b.check || test_bit (PC_DMA_ERROR, &pc->flags)) {	/* Error detected */
-#if IDETAPE_DEBUG_LOG
-			if (tape->debug_level >= 1)
-				printk (KERN_INFO "ide-tape: %s: I/O error, ",tape->name);
-#endif /* IDETAPE_DEBUG_LOG */
 			if (pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) {
 				printk (KERN_ERR "ide-tape: I/O error in request sense command\n");
 				return ide_do_reset (drive);
@@ -2178,7 +2172,7 @@
 	pc->current_position+=bcount.all;
 #if IDETAPE_DEBUG_LOG
 	if (tape->debug_level >= 2)
-		printk(KERN_INFO "ide-tape: [cmd %x] transferred %d bytes on that interrupt\n", pc->c[0], bcount.all);
+		printk(KERN_INFO "ide-tape: [cmd %x] done %d\n", pc->c[0], bcount.all);
 #endif
 	ide_set_handler (drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL);	/* And set the interrupt handler again */
 	return ide_started;
@@ -2297,7 +2291,7 @@
 	}
 #if IDETAPE_DEBUG_LOG
 	if (tape->debug_level >= 2)
-		printk (KERN_INFO "ide-tape: Retry number - %d\n", pc->retries);
+		printk (KERN_INFO "ide-tape: Retry number - %d, [cmd %x]\n", pc->retries, pc->c[0]);
 #endif /* IDETAPE_DEBUG_LOG */
 
 	pc->retries++;
@@ -2472,7 +2466,8 @@
 	status.all = GET_STAT();
 	if (status.b.dsc) {
 		if (status.b.check) {					/* Error detected */
-			printk (KERN_ERR "ide-tape: %s: I/O error, ",tape->name);
+			printk (KERN_ERR "ide-tape: %s: I/O error: pc = %2x, key = %2x, asc = %2x, ascq = %2x\n",
+					tape->name, pc->c[0], tape->sense_key, tape->asc, tape->ascq);
 			return idetape_retry_pc (drive);			/* Retry operation */
 		}
 		pc->error = 0;
@@ -3096,10 +3091,10 @@
 	idetape_tape_t *tape = drive->driver_data;
 	idetape_read_position_result_t *result;
 	
-//#if IDETAPE_DEBUG_LOG
-//	if (tape->debug_level >= 4)
+#if IDETAPE_DEBUG_LOG
+	if (tape->debug_level >= 4)
 		printk (KERN_INFO "ide-tape: Reached idetape_read_position_callback\n");
-//#endif /* IDETAPE_DEBUG_LOG */
+#endif /* IDETAPE_DEBUG_LOG */
 
 	if (!tape->pc->error) {
 		result = (idetape_read_position_result_t *) tape->pc->buffer;
@@ -3273,30 +3268,15 @@
 	idetape_pc_t pc;
 	int position;
 
-//#if IDETAPE_DEBUG_LOG
-//        if (tape->debug_level >= 4)
-	printk (KERN_INFO "ide-tape: Reached idetape_read_position\n");
-//#endif /* IDETAPE_DEBUG_LOG */
+#if IDETAPE_DEBUG_LOG
+	if (tape->debug_level >= 4)
+		printk (KERN_INFO "ide-tape: Reached idetape_read_position\n");
+#endif /* IDETAPE_DEBUG_LOG */
 
-#ifdef NO_LONGER_REQUIRED
-	idetape_flush_tape_buffers(drive);
-#endif
 	idetape_create_read_position_cmd(&pc);
 	if (idetape_queue_pc_tail (drive, &pc))
 		return -1;
 	position = tape->first_frame_position;
-#ifdef NO_LONGER_REQUIRED
-	if (tape->onstream) {
-		if ((position != tape->last_frame_position - tape->blocks_in_buffer) &&
-		    (position != tape->last_frame_position + tape->blocks_in_buffer)) {
-			if (tape->blocks_in_buffer == 0) {
-				printk("ide-tape: %s: correcting read position %d, %d, %d\n", tape->name, position, tape->last_frame_position, tape->blocks_in_buffer);
-				position = tape->last_frame_position;
-				tape->first_frame_position = position;
-			}
-		}
-	}
-#endif
 	return position;
 }
 

^ permalink raw reply	[flat|nested] 2+ messages in thread
* Re: Patch to fix HP Colorado in 2.4 (RH #36628)
@ 2001-09-28 20:31 Ed Tomlinson
  0 siblings, 0 replies; 2+ messages in thread
From: Ed Tomlinson @ 2001-09-28 20:31 UTC (permalink / raw)
  To: linux-kernel; +Cc: Pete Zaitcev, Alan Cox

Hi,

This does seem to fix things for 2.4.10 too.  If the ide device for the
tape is using DMA your backups may not work correctly (last block incomplete).
This problem is documented in redhat bug 38404 where the problem is fixed
for PIO mode.  In my case the default (ie. no hdparm) results in DMA on... 

Ed Tomlinson

(HP Colorado 10/20G on hdd of a via MVP3 based board)

Pete Zaitcev wrote:

> Alan,
> 
> would you please to take this patch in. I am not sure it's 100% ok
> for Linus tree, but I want as many people as possible to test it,
> especially OnStream owners.
> 
> Thanks,
> -- Pete
> 
> ide-tape-03x.diff --------------------------------------
> 
> Removes extra buffer flush from read_position(), which confuses
> all versions of the HP Colorado.
> 
> Also touches up on insane logging.
> 
> --- linux-2.4.9/drivers/ide/ide-tape.c	Mon Aug 13 14:56:19 2001
> +++ linux-2.4.9-tape/drivers/ide/ide-tape.c	Wed Sep 26 16:18:11 2001
> @@ -429,8 +429,6 @@
>  #include <asm/bitops.h>
>  
>  
> -#define NO_LONGER_REQUIRED	(1)
> -
>  /*
>   *	OnStream support
>   */
> @@ -2101,10 +2099,6 @@
>  if (status.b.check && pc->c[0] == IDETAPE_REQUEST_SENSE_CMD)
>  status.b.check = 0;
>  if (status.b.check || test_bit (PC_DMA_ERROR, &pc->flags)) {	/* Error detected */
> -#if IDETAPE_DEBUG_LOG
> -			if (tape->debug_level >= 1)
> -				printk (KERN_INFO "ide-tape: %s: I/O error, ",tape->name);
> -#endif /* IDETAPE_DEBUG_LOG */
>  if (pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) {
>  printk (KERN_ERR "ide-tape: I/O error in request sense command\n");
>  return ide_do_reset (drive);
> @@ -2178,7 +2172,7 @@
>  pc->current_position+=bcount.all;
>  #if IDETAPE_DEBUG_LOG
>  if (tape->debug_level >= 2)
> -		printk(KERN_INFO "ide-tape: [cmd %x] transferred %d bytes on that interrupt\n",
> pc->c[0], bcount.all);
> +		printk(KERN_INFO "ide-tape: [cmd %x] done %d\n", pc->c[0], bcount.all);
>  #endif
>  ide_set_handler (drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL);	/* And set the
>  interrupt handler again */ return ide_started;
> @@ -2297,7 +2291,7 @@
>  }
>  #if IDETAPE_DEBUG_LOG
>  if (tape->debug_level >= 2)
> -		printk (KERN_INFO "ide-tape: Retry number - %d\n", pc->retries);
> +		printk (KERN_INFO "ide-tape: Retry number - %d, [cmd %x]\n", pc->retries, pc->c[0]);
>  #endif /* IDETAPE_DEBUG_LOG */
>  
>  pc->retries++;
> @@ -2472,7 +2466,8 @@
>  status.all = GET_STAT();
>  if (status.b.dsc) {
>  if (status.b.check) {					/* Error detected */
> -			printk (KERN_ERR "ide-tape: %s: I/O error, ",tape->name);
> +			printk (KERN_ERR "ide-tape: %s: I/O error: pc = %2x, key = %2x, asc = %2x, ascq =
> %2x\n",
> +					tape->name, pc->c[0], tape->sense_key, tape->asc, tape->ascq);
>  return idetape_retry_pc (drive);			/* Retry operation */
>  }
>  pc->error = 0;
> @@ -3096,10 +3091,10 @@
>  idetape_tape_t *tape = drive->driver_data;
>  idetape_read_position_result_t *result;
>  
> -//#if IDETAPE_DEBUG_LOG
> -//	if (tape->debug_level >= 4)
> +#if IDETAPE_DEBUG_LOG
> +	if (tape->debug_level >= 4)
>  printk (KERN_INFO "ide-tape: Reached idetape_read_position_callback\n");
> -//#endif /* IDETAPE_DEBUG_LOG */
> +#endif /* IDETAPE_DEBUG_LOG */
>  
>  if (!tape->pc->error) {
>  result = (idetape_read_position_result_t *) tape->pc->buffer;
> @@ -3273,30 +3268,15 @@
>  idetape_pc_t pc;
>  int position;
>  
> -//#if IDETAPE_DEBUG_LOG
> -//        if (tape->debug_level >= 4)
> -	printk (KERN_INFO "ide-tape: Reached idetape_read_position\n");
> -//#endif /* IDETAPE_DEBUG_LOG */
> +#if IDETAPE_DEBUG_LOG
> +	if (tape->debug_level >= 4)
> +		printk (KERN_INFO "ide-tape: Reached idetape_read_position\n");
> +#endif /* IDETAPE_DEBUG_LOG */
>  
> -#ifdef NO_LONGER_REQUIRED
> -	idetape_flush_tape_buffers(drive);
> -#endif
>  idetape_create_read_position_cmd(&pc);
>  if (idetape_queue_pc_tail (drive, &pc))
>  return -1;
>  position = tape->first_frame_position;
> -#ifdef NO_LONGER_REQUIRED
> -	if (tape->onstream) {
> -		if ((position != tape->last_frame_position - tape->blocks_in_buffer) &&
> -		    (position != tape->last_frame_position + tape->blocks_in_buffer)) {
> -			if (tape->blocks_in_buffer == 0) {
> -				printk("ide-tape: %s: correcting read position %d, %d, %d\n", tape->name, position,
> tape->last_frame_position, tape->blocks_in_buffer);
> -				position = tape->last_frame_position;
> -				tape->first_frame_position = position;
> -			}
> -		}
> -	}
> -#endif
>  return position;
>  }


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2001-09-28 20:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-09-27 22:11 Patch to fix HP Colorado in 2.4 (RH #36628) Pete Zaitcev
  -- strict thread matches above, loose matches on Subject: below --
2001-09-28 20:31 Ed Tomlinson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.