--- sbpcd.c.orig        Thu Oct 30 23:59:10 1997
+++ sbpcd.c     Sat Nov  8 20:11:27 1997
@@ -827,11 +827,11 @@
  */
 static void sbp_sleep(u_int time)
 {
-       sti();
+       cli();
        current->state = TASK_INTERRUPTIBLE;
        current->timeout = jiffies + time;
-       schedule();
        sti();
+       schedule();
 }
 /*==========================================================================*/
 #define RETURN_UP(rc) {up(&ioctl_read_sem); return(rc);}
@@ -4377,9 +4377,9 @@
                        response_count=0;
                        i=cmd_out();
                        if (i<0) msg(DBG_INF,"error giving READ AUDIO command: %0d\n", i);
-                       sbp_sleep(0);
                        msg(DBG_AUD,"read_audio: after giving \"read\" command.\n");
-                       for (frame=1;frame<2 && !error_flag; frame++)
+                       p = D_S[d].aud_buf;
+                       for (frame=1;frame<=read_audio.nframes && !error_flag; frame++)
                        {
                                try=maxtim_data;
                                for (timeout=jiffies+9*HZ; ; )
@@ -4394,7 +4394,6 @@
                                        if (try != 0 || timeout <= jiffies) break;
                                        if (data_retrying == 0) data_waits++;
                                        data_retrying = 1;
-                                       sbp_sleep(1);
                                        try = 1;
                                }
                                if (try==0)
@@ -4412,13 +4411,14 @@
                                }
                                msg(DBG_AUD,"read_audio: before reading data.\n");
                                error_flag=0;
-                               p = D_S[d].aud_buf;
                                if (sbpro_type==1) OUT(CDo_sel_i_d,1);
-                               if (do_16bit) insw(CDi_data, p, read_audio.nframes*(CD_FRAMESIZE_RAW>>1));
-                               else insb(CDi_data, p, read_audio.nframes*CD_FRAMESIZE_RAW);
+                               if (do_16bit) insw(CDi_data, p, (CD_FRAMESIZE_RAW>>1));
+                               else insb(CDi_data, p, CD_FRAMESIZE_RAW);
                                if (sbpro_type==1) OUT(CDo_sel_i_d,0);
+                               p = (char*)p + CD_FRAMESIZE_RAW;
                                data_retrying = 0;
                        }
+                       schedule(); /* Possibly let some others in */
                        msg(DBG_AUD,"read_audio: after reading data.\n");
                        if (error_flag)    /* must have been spurious D_RDY or (ATTN&&!D_RDY) */
                        {