aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2014-04-08 10:58:34 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-05-06 10:55:27 -0400
commitf13dbe1e97b98c5d2c315b8e3d21e04fa49937d1 (patch)
tree389fdebe52ec3a7381890dab2890dfb6bead0d16
parent4ce77a7a6cc45d0733521dfa16e9259f29e21faf (diff)
ALSA: ice1712: Fix boundary checks in PCM pointer ops
commit 4f8e940095536bc002a81666a4107a581c84e9b9 upstream. PCM pointer callbacks in ice1712 driver check the buffer size boundary wrongly between bytes and frames. This leads to PCM core warnings like: snd_pcm_update_hw_ptr0: 105 callbacks suppressed ALSA pcm_lib.c:352 BUG: pcmC3D0c:0, pos = 5461, buffer size = 5461, period size = 2730 This patch fixes these checks to be placed after the proper unit conversions. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--sound/pci/ice1712/ice1712.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
index 806407a3973e..e6b70e35f628 100644
--- a/sound/pci/ice1712/ice1712.c
+++ b/sound/pci/ice1712/ice1712.c
@@ -685,9 +685,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pointer(struct snd_pcm_substream *
685 if (!(snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL) & 1)) 685 if (!(snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL) & 1))
686 return 0; 686 return 0;
687 ptr = runtime->buffer_size - inw(ice->ddma_port + 4); 687 ptr = runtime->buffer_size - inw(ice->ddma_port + 4);
688 ptr = bytes_to_frames(substream->runtime, ptr);
688 if (ptr == runtime->buffer_size) 689 if (ptr == runtime->buffer_size)
689 ptr = 0; 690 ptr = 0;
690 return bytes_to_frames(substream->runtime, ptr); 691 return ptr;
691} 692}
692 693
693static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substream *substream) 694static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substream *substream)
@@ -704,9 +705,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substrea
704 addr = ICE1712_DSC_ADDR0; 705 addr = ICE1712_DSC_ADDR0;
705 ptr = snd_ice1712_ds_read(ice, substream->number * 2, addr) - 706 ptr = snd_ice1712_ds_read(ice, substream->number * 2, addr) -
706 ice->playback_con_virt_addr[substream->number]; 707 ice->playback_con_virt_addr[substream->number];
708 ptr = bytes_to_frames(substream->runtime, ptr);
707 if (ptr == substream->runtime->buffer_size) 709 if (ptr == substream->runtime->buffer_size)
708 ptr = 0; 710 ptr = 0;
709 return bytes_to_frames(substream->runtime, ptr); 711 return ptr;
710} 712}
711 713
712static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *substream) 714static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *substream)
@@ -717,9 +719,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *s
717 if (!(snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL) & 1)) 719 if (!(snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL) & 1))
718 return 0; 720 return 0;
719 ptr = inl(ICEREG(ice, CONCAP_ADDR)) - ice->capture_con_virt_addr; 721 ptr = inl(ICEREG(ice, CONCAP_ADDR)) - ice->capture_con_virt_addr;
722 ptr = bytes_to_frames(substream->runtime, ptr);
720 if (ptr == substream->runtime->buffer_size) 723 if (ptr == substream->runtime->buffer_size)
721 ptr = 0; 724 ptr = 0;
722 return bytes_to_frames(substream->runtime, ptr); 725 return ptr;
723} 726}
724 727
725static const struct snd_pcm_hardware snd_ice1712_playback = { 728static const struct snd_pcm_hardware snd_ice1712_playback = {
@@ -1113,9 +1116,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pro_pointer(struct snd_pcm_substre
1113 if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_PLAYBACK_START)) 1116 if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_PLAYBACK_START))
1114 return 0; 1117 return 0;
1115 ptr = ice->playback_pro_size - (inw(ICEMT(ice, PLAYBACK_SIZE)) << 2); 1118 ptr = ice->playback_pro_size - (inw(ICEMT(ice, PLAYBACK_SIZE)) << 2);
1119 ptr = bytes_to_frames(substream->runtime, ptr);
1116 if (ptr == substream->runtime->buffer_size) 1120 if (ptr == substream->runtime->buffer_size)
1117 ptr = 0; 1121 ptr = 0;
1118 return bytes_to_frames(substream->runtime, ptr); 1122 return ptr;
1119} 1123}
1120 1124
1121static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substream *substream) 1125static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substream *substream)
@@ -1126,9 +1130,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substrea
1126 if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_CAPTURE_START_SHADOW)) 1130 if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_CAPTURE_START_SHADOW))
1127 return 0; 1131 return 0;
1128 ptr = ice->capture_pro_size - (inw(ICEMT(ice, CAPTURE_SIZE)) << 2); 1132 ptr = ice->capture_pro_size - (inw(ICEMT(ice, CAPTURE_SIZE)) << 2);
1133 ptr = bytes_to_frames(substream->runtime, ptr);
1129 if (ptr == substream->runtime->buffer_size) 1134 if (ptr == substream->runtime->buffer_size)
1130 ptr = 0; 1135 ptr = 0;
1131 return bytes_to_frames(substream->runtime, ptr); 1136 return ptr;
1132} 1137}
1133 1138
1134static const struct snd_pcm_hardware snd_ice1712_playback_pro = { 1139static const struct snd_pcm_hardware snd_ice1712_playback_pro = {