diff --git a/src/mesa/drivers/dri/r300/r300_texmem.c b/src/mesa/drivers/dri/r300/r300_texmem.c
index c527677..241ec1f 100644
--- a/src/mesa/drivers/dri/r300/r300_texmem.c
+++ b/src/mesa/drivers/dri/r300/r300_texmem.c
@@ -43,7 +43,6 @@ SOFTWARE.
 #include "colormac.h"
 #include "macros.h"
 #include "simple_list.h"
-#include "radeon_reg.h"		/* gets definition for usleep */
 #include "r300_context.h"
 #include "r300_state.h"
 #include "r300_cmdbuf.h"
@@ -464,18 +463,22 @@ static void uploadSubImage( r300ContextPtr rmesa, r300TexObjPtr t,
 	}
 
 	LOCK_HARDWARE( &rmesa->radeon );
+	int retries = 3;
 	do {
 		ret = drmCommandWriteRead( rmesa->radeon.dri.fd, DRM_RADEON_TEXTURE,
 		                           &tex, sizeof(drm_radeon_texture_t) );
 		if (ret) {
-		if (RADEON_DEBUG & DEBUG_IOCTL)
-		fprintf(stderr, "DRM_RADEON_TEXTURE:  again!\n");
-		usleep(1);
+			if (RADEON_DEBUG & DEBUG_IOCTL)
+				fprintf(stderr, "DRM_RADEON_TEXTURE:  again!\n");
+			usleep(1);
 		}
-	} while ( ret == -EAGAIN );
+	} while (ret == -EAGAIN && --retries);
 
 	UNLOCK_HARDWARE( &rmesa->radeon );
 
+	if (ret == -EAGAIN)
+		return;
+
 	if ( ret ) {
 		fprintf( stderr, "DRM_RADEON_TEXTURE: return = %d\n", ret );
 		fprintf( stderr, "   offset=0x%08x\n",
