OSDN Git Service

macintosh/via-cuda: Don't rely on Cuda to end a transfer
authorFinn Thain <fthain@telegraphics.com.au>
Tue, 15 Jan 2019 04:18:56 +0000 (15:18 +1100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 22 Jan 2019 09:21:45 +0000 (10:21 +0100)
Certain Cuda transfers have to be ended by the driver. According
to Apple's open source Cuda driver, as found in mkLinux and XNU, this
applies to any "open ended request such as PRAM read". This fixes an
infinite polling loop in cuda_pram_read_byte().

Tested-by: Stan Johnson <userm57@yahoo.com>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/macintosh/via-cuda.c

index bbec6ac..3581abf 100644 (file)
@@ -569,6 +569,7 @@ cuda_interrupt(int irq, void *arg)
     unsigned char ibuf[16];
     int ibuf_len = 0;
     int complete = 0;
+    bool full;
     
     spin_lock_irqsave(&cuda_lock, flags);
 
@@ -656,12 +657,13 @@ idle_state:
        break;
 
     case reading:
-       if (reading_reply ? ARRAY_FULL(current_req->reply, reply_ptr)
-                         : ARRAY_FULL(cuda_rbuf, reply_ptr))
+       full = reading_reply ? ARRAY_FULL(current_req->reply, reply_ptr)
+                            : ARRAY_FULL(cuda_rbuf, reply_ptr);
+       if (full)
            (void)in_8(&via[SR]);
        else
            *reply_ptr++ = in_8(&via[SR]);
-       if (!TREQ_asserted(status)) {
+       if (!TREQ_asserted(status) || full) {
            if (mcu_is_egret)
                assert_TACK();
            /* that's all folks */