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 <userm57@yahoo.com> Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
aefcb7460e
Коммит
458c77f3de
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче