mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 05:31:08 -04:00
macintosh/via-cuda: Don't rely on Cuda to end a transfer
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 <[email protected]> Signed-off-by: Finn Thain <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
1 parent
aefcb7460e
commit
458c77f3de
1 file changed
+5
-3
@@ -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 */
|
||||
|
||||
Reference in new issue
Block a user