staging: vchi: Get rid of vchi_bulk_queue_transmit()
[linux-2.6-microblaze.git] / drivers / staging / vc04_services / interface / vchiq_arm / vchiq_arm.c
index 1165824..98d6fa8 100644 (file)
@@ -355,19 +355,31 @@ vchiq_bulk_transmit(unsigned int handle, const void *data,
 {
        enum vchiq_status status;
 
-       switch (mode) {
-       case VCHIQ_BULK_MODE_NOCALLBACK:
-       case VCHIQ_BULK_MODE_CALLBACK:
-               status = vchiq_bulk_transfer(handle, (void *)data, size,
-                                            userdata, mode,
-                                            VCHIQ_BULK_TRANSMIT);
-               break;
-       case VCHIQ_BULK_MODE_BLOCKING:
-               status = vchiq_blocking_bulk_transfer(handle,
-                       (void *)data, size, VCHIQ_BULK_TRANSMIT);
-               break;
-       default:
-               return VCHIQ_ERROR;
+       while (1) {
+               switch (mode) {
+               case VCHIQ_BULK_MODE_NOCALLBACK:
+               case VCHIQ_BULK_MODE_CALLBACK:
+                       status = vchiq_bulk_transfer(handle, (void *)data, size,
+                                                    userdata, mode,
+                                                    VCHIQ_BULK_TRANSMIT);
+                       break;
+               case VCHIQ_BULK_MODE_BLOCKING:
+                       status = vchiq_blocking_bulk_transfer(handle,
+                               (void *)data, size, VCHIQ_BULK_TRANSMIT);
+                       break;
+               default:
+                       return VCHIQ_ERROR;
+               }
+
+               /*
+                * vchiq_*_bulk_transfer() may return VCHIQ_RETRY, so we need
+                * to implement a retry mechanism since this function is
+                * supposed to block until queued
+                */
+               if (status != VCHIQ_RETRY)
+                       break;
+
+               msleep(1);
        }
 
        return status;