brasero r1051 - in trunk: . src



Author: philippr
Date: Tue Aug  5 15:48:30 2008
New Revision: 1051
URL: http://svn.gnome.org/viewvc/brasero?rev=1051&view=rev

Log:
	If sizes mismatch in get_performance and if the size of the buffer 
	received is bigger than the one we requested, re-issue the command so
	as to get the full buffer. That way we don\'t miss rates with buggy
	firmwares.
	Fix for #537871 â Burn speed selection does not work

	* src/scsi-get-performance.c (brasero_get_performance_get_buffer),
	(brasero_get_performance):

Modified:
   trunk/ChangeLog
   trunk/src/scsi-get-performance.c

Modified: trunk/src/scsi-get-performance.c
==============================================================================
--- trunk/src/scsi-get-performance.c	(original)
+++ trunk/src/scsi-get-performance.c	Tue Aug  5 15:48:30 2008
@@ -94,38 +94,23 @@
 #define BRASERO_GET_PERFORMANCE_DBI_TYPE		0x04
 #define BRASERO_GET_PERFORMANCE_DBI_CACHE_TYPE		0x05
 
-
-static BraseroScsiResult
-brasero_get_performance (BraseroGetPerformanceCDB *cdb,
-			 gint sizeof_descriptors,
-			 BraseroScsiGetPerfData **data,
-			 int *data_size,
-			 BraseroScsiErrCode *error)
+static BraseroScsiGetPerfData *
+brasero_get_performance_get_buffer (BraseroGetPerformanceCDB *cdb,
+				    gint sizeof_descriptors,
+				    BraseroScsiGetPerfHdr *hdr,
+				    BraseroScsiErrCode *error)
 {
 	BraseroScsiGetPerfData *buffer;
-	BraseroScsiGetPerfHdr hdr;
 	BraseroScsiResult res;
 	int request_size;
-	int buffer_size;
 	int desc_num;
 
-	if (!data || !data_size) {
-		BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_BAD_ARGUMENT);
-		return BRASERO_SCSI_FAILURE;
-	}
-
-	/* Issue the command once to get the size ... */
-	memset (&hdr, 0, sizeof (hdr));
-	BRASERO_SET_16 (cdb->max_desc, 0);
-	res = brasero_scsi_command_issue_sync (cdb, &hdr, sizeof (hdr), error);
-	if (res)
-		return res;
-
 	/* ... check the request size ... */
-	request_size = BRASERO_GET_32 (hdr.len) +
+	request_size = BRASERO_GET_32 (hdr->len) +
 		       G_STRUCT_OFFSET (BraseroScsiGetPerfHdr, len) +
-		       sizeof (hdr.len);
+		       sizeof (hdr->len);
 
+	/* ... check the request size ... */
 	if (request_size > 2048) {
 		BRASERO_BURN_LOG ("Oversized data (%i) setting to max (2048)", request_size);
 		request_size = 2048;
@@ -139,7 +124,7 @@
 		request_size = 2048;
 	}
 
-	desc_num = (request_size - sizeof (hdr)) / sizeof_descriptors;
+	desc_num = (request_size - sizeof (BraseroScsiGetPerfHdr)) / sizeof_descriptors;
 
 	/* ... allocate a buffer and re-issue the command */
 	buffer = (BraseroScsiGetPerfData *) g_new0 (uchar, request_size);
@@ -148,19 +133,82 @@
 	res = brasero_scsi_command_issue_sync (cdb, buffer, request_size, error);
 	if (res) {
 		g_free (buffer);
-		return res;
+		return NULL;
+	}
+
+	return buffer;
+}
+
+static BraseroScsiResult
+brasero_get_performance (BraseroGetPerformanceCDB *cdb,
+			 gint sizeof_descriptors,
+			 BraseroScsiGetPerfData **data,
+			 int *data_size,
+			 BraseroScsiErrCode *error)
+{
+	BraseroScsiGetPerfData *buffer;
+	BraseroScsiGetPerfHdr hdr;
+	BraseroScsiResult res;
+	int request_size;
+	int buffer_size;
+
+	if (!data || !data_size) {
+		BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_BAD_ARGUMENT);
+		return BRASERO_SCSI_FAILURE;
 	}
 
+	/* Issue the command once to get the size ... */
+	memset (&hdr, 0, sizeof (hdr));
+	BRASERO_SET_16 (cdb->max_desc, 0);
+	res = brasero_scsi_command_issue_sync (cdb, &hdr, sizeof (hdr), error);
+	if (res)
+		return res;
+
+	/* ... get the request size ... */
+	request_size = BRASERO_GET_32 (hdr.len) +
+		       G_STRUCT_OFFSET (BraseroScsiGetPerfHdr, len) +
+		       sizeof (hdr.len);
+
+	/* ... get the answer itself. */
+	buffer = brasero_get_performance_get_buffer (cdb,
+						     sizeof_descriptors,
+						     &hdr,
+						     error);
+	if (!buffer)
+		return BRASERO_SCSI_FAILURE;
+
 	/* make sure the response has the requested size */
 	buffer_size = BRASERO_GET_32 (buffer->hdr.len) +
 		      G_STRUCT_OFFSET (BraseroScsiGetPerfHdr, len) +
 		      sizeof (buffer->hdr.len);
 
-	if (request_size != buffer_size)
-		BRASERO_BURN_LOG ("Sizes mismatch asked %i / received %i",
+	if (request_size < buffer_size) {
+		BraseroScsiGetPerfHdr *tmp_hdr;
+
+		/* Strangely some drives returns a buffer size that is bigger
+		 * than the one they returned on the first time. So redo whole
+		 * operation again but this time with the new size we got */
+		BRASERO_BURN_LOG ("Sizes mismatch asked %i / received %i\n"
+				  "Re-issuing the command with received size",
 				  request_size,
 				  buffer_size);
 
+		tmp_hdr = &buffer->hdr;
+		request_size = buffer_size;
+		buffer = brasero_get_performance_get_buffer (cdb,
+							     sizeof_descriptors,
+							     tmp_hdr,
+							     error);
+		buffer_size = BRASERO_GET_32 (buffer->hdr.len) +
+			      G_STRUCT_OFFSET (BraseroScsiGetPerfHdr, len) +
+			      sizeof (buffer->hdr.len);
+		
+		g_free (tmp_hdr);
+	}
+	else if (request_size > buffer_size)
+		BRASERO_BURN_LOG ("Sizes mismatch asked %i / received %i",
+				  request_size,
+				  buffer_size);
 	*data = buffer;
 	*data_size = MIN (buffer_size, request_size);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]