ehci: rework frame skipping
Move the framecount check out of the loop and use the new ehci_update_frindex function to skip frames if needed. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									3a21532626
								
							
						
					
					
						commit
						f020ed36fe
					
				| 
						 | 
					@ -2315,9 +2315,8 @@ static void ehci_frame_timer(void *opaque)
 | 
				
			||||||
    int schedules = 0;
 | 
					    int schedules = 0;
 | 
				
			||||||
    int64_t expire_time, t_now;
 | 
					    int64_t expire_time, t_now;
 | 
				
			||||||
    uint64_t ns_elapsed;
 | 
					    uint64_t ns_elapsed;
 | 
				
			||||||
    int frames;
 | 
					    int frames, skipped_frames;
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
    int skipped_frames = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    t_now = qemu_get_clock_ns(vm_clock);
 | 
					    t_now = qemu_get_clock_ns(vm_clock);
 | 
				
			||||||
    ns_elapsed = t_now - ehci->last_run_ns;
 | 
					    ns_elapsed = t_now - ehci->last_run_ns;
 | 
				
			||||||
| 
						 | 
					@ -2327,15 +2326,17 @@ static void ehci_frame_timer(void *opaque)
 | 
				
			||||||
        schedules++;
 | 
					        schedules++;
 | 
				
			||||||
        expire_time = t_now + (get_ticks_per_sec() / FRAME_TIMER_FREQ);
 | 
					        expire_time = t_now + (get_ticks_per_sec() / FRAME_TIMER_FREQ);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (frames > ehci->maxframes) {
 | 
				
			||||||
 | 
					            skipped_frames = frames - ehci->maxframes;
 | 
				
			||||||
 | 
					            ehci_update_frindex(ehci, skipped_frames);
 | 
				
			||||||
 | 
					            ehci->last_run_ns += FRAME_TIMER_NS * skipped_frames;
 | 
				
			||||||
 | 
					            frames -= skipped_frames;
 | 
				
			||||||
 | 
					            DPRINTF("WARNING - EHCI skipped %d frames\n", skipped_frames);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i = 0; i < frames; i++) {
 | 
					        for (i = 0; i < frames; i++) {
 | 
				
			||||||
            ehci_update_frindex(ehci, 1);
 | 
					            ehci_update_frindex(ehci, 1);
 | 
				
			||||||
 | 
					            ehci_advance_periodic_state(ehci);
 | 
				
			||||||
            if (frames - i > ehci->maxframes) {
 | 
					 | 
				
			||||||
                skipped_frames++;
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                ehci_advance_periodic_state(ehci);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            ehci->last_run_ns += FRAME_TIMER_NS;
 | 
					            ehci->last_run_ns += FRAME_TIMER_NS;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
| 
						 | 
					@ -2348,12 +2349,6 @@ static void ehci_frame_timer(void *opaque)
 | 
				
			||||||
        ehci->last_run_ns += FRAME_TIMER_NS * frames;
 | 
					        ehci->last_run_ns += FRAME_TIMER_NS * frames;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
    if (skipped_frames) {
 | 
					 | 
				
			||||||
        DPRINTF("WARNING - EHCI skipped %d frames\n", skipped_frames);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /*  Async is not inside loop since it executes everything it can once
 | 
					    /*  Async is not inside loop since it executes everything it can once
 | 
				
			||||||
     *  called
 | 
					     *  called
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue