|  | @@ -415,7 +415,7 @@ static void rdata_encode_flux(void)
 | 
	
		
			
				|  |  |      IRQ_global_disable();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /* Find out where the DMA engine's producer index has got to. */
 | 
	
		
			
				|  |  | -    prod = ARRAY_SIZE(dma.buf) - dma_rdata.ndtr;
 | 
	
		
			
				|  |  | +    prod = (ARRAY_SIZE(dma.buf) - dma_rdata.ndtr) & buf_mask;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (read.nr_index != index.count) {
 | 
	
		
			
				|  |  |          /* We have just passed the index mark: Record information about 
 | 
	
	
		
			
				|  | @@ -762,7 +762,7 @@ static void wdata_decode_flux(void)
 | 
	
		
			
				|  |  |      uint16_t nr_to_wrap, nr_to_cons, nr, dmacons;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /* Find out where the DMA engine's consumer index has got to. */
 | 
	
		
			
				|  |  | -    dmacons = ARRAY_SIZE(dma.buf) - dma_wdata.ndtr;
 | 
	
		
			
				|  |  | +    dmacons = (ARRAY_SIZE(dma.buf) - dma_wdata.ndtr) & buf_mask;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /* Find largest contiguous stretch of ring buffer we can fill. */
 | 
	
		
			
				|  |  |      nr_to_wrap = ARRAY_SIZE(dma.buf) - dma.prod;
 | 
	
	
		
			
				|  | @@ -914,6 +914,7 @@ static void floppy_write_check_underflow(void)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void floppy_write(void)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    const uint16_t buf_mask = ARRAY_SIZE(dma.buf) - 1;
 | 
	
		
			
				|  |  |      uint16_t dmacons, todo, prev_todo;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      floppy_process_write_packet();
 | 
	
	
		
			
				|  | @@ -938,8 +939,8 @@ static void floppy_write(void)
 | 
	
		
			
				|  |  |              goto terminate;
 | 
	
		
			
				|  |  |          /* Check progress of draining the DMA ring. */
 | 
	
		
			
				|  |  |          prev_todo = todo;
 | 
	
		
			
				|  |  | -        dmacons = ARRAY_SIZE(dma.buf) - dma_wdata.ndtr;
 | 
	
		
			
				|  |  | -        todo = (dma.prod - dmacons) & (ARRAY_SIZE(dma.buf) - 1);
 | 
	
		
			
				|  |  | +        dmacons = (ARRAY_SIZE(dma.buf) - dma_wdata.ndtr) & buf_mask;
 | 
	
		
			
				|  |  | +        todo = (dma.prod - dmacons) & buf_mask;
 | 
	
		
			
				|  |  |      } while ((todo != 0) && (todo <= prev_todo));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  terminate:
 |