aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/ivtv/ivtv-queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-queue.c')
-rw-r--r--drivers/media/video/ivtv/ivtv-queue.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/drivers/media/video/ivtv/ivtv-queue.c b/drivers/media/video/ivtv/ivtv-queue.c
index bff75aeee0a0..d9a1478ca1f7 100644
--- a/drivers/media/video/ivtv/ivtv-queue.c
+++ b/drivers/media/video/ivtv/ivtv-queue.c
@@ -195,7 +195,7 @@ void ivtv_flush_queues(struct ivtv_stream *s)
195int ivtv_stream_alloc(struct ivtv_stream *s) 195int ivtv_stream_alloc(struct ivtv_stream *s)
196{ 196{
197 struct ivtv *itv = s->itv; 197 struct ivtv *itv = s->itv;
198 int SGsize = sizeof(struct ivtv_SG_element) * s->buffers; 198 int SGsize = sizeof(struct ivtv_sg_element) * s->buffers;
199 int i; 199 int i;
200 200
201 if (s->buffers == 0) 201 if (s->buffers == 0)
@@ -205,27 +205,33 @@ int ivtv_stream_alloc(struct ivtv_stream *s)
205 s->dma != PCI_DMA_NONE ? "DMA " : "", 205 s->dma != PCI_DMA_NONE ? "DMA " : "",
206 s->name, s->buffers, s->buf_size, s->buffers * s->buf_size / 1024); 206 s->name, s->buffers, s->buf_size, s->buffers * s->buf_size / 1024);
207 207
208 if (ivtv_might_use_pio(s)) { 208 s->sg_pending = (struct ivtv_sg_element *)kzalloc(SGsize, GFP_KERNEL);
209 s->PIOarray = (struct ivtv_SG_element *)kzalloc(SGsize, GFP_KERNEL); 209 if (s->sg_pending == NULL) {
210 if (s->PIOarray == NULL) { 210 IVTV_ERR("Could not allocate sg_pending for %s stream\n", s->name);
211 IVTV_ERR("Could not allocate PIOarray for %s stream\n", s->name); 211 return -ENOMEM;
212 return -ENOMEM;
213 }
214 } 212 }
213 s->sg_pending_size = 0;
215 214
216 /* Allocate DMA SG Arrays */ 215 s->sg_processing = (struct ivtv_sg_element *)kzalloc(SGsize, GFP_KERNEL);
217 s->SGarray = (struct ivtv_SG_element *)kzalloc(SGsize, GFP_KERNEL); 216 if (s->sg_processing == NULL) {
218 if (s->SGarray == NULL) { 217 IVTV_ERR("Could not allocate sg_processing for %s stream\n", s->name);
219 IVTV_ERR("Could not allocate SGarray for %s stream\n", s->name); 218 kfree(s->sg_pending);
220 if (ivtv_might_use_pio(s)) { 219 s->sg_pending = NULL;
221 kfree(s->PIOarray); 220 return -ENOMEM;
222 s->PIOarray = NULL; 221 }
223 } 222 s->sg_processing_size = 0;
223
224 s->sg_dma = (struct ivtv_sg_element *)kzalloc(sizeof(struct ivtv_sg_element), GFP_KERNEL);
225 if (s->sg_dma == NULL) {
226 IVTV_ERR("Could not allocate sg_dma for %s stream\n", s->name);
227 kfree(s->sg_pending);
228 s->sg_pending = NULL;
229 kfree(s->sg_processing);
230 s->sg_processing = NULL;
224 return -ENOMEM; 231 return -ENOMEM;
225 } 232 }
226 s->SG_length = 0;
227 if (ivtv_might_use_dma(s)) { 233 if (ivtv_might_use_dma(s)) {
228 s->SG_handle = pci_map_single(itv->dev, s->SGarray, SGsize, s->dma); 234 s->sg_handle = pci_map_single(itv->dev, s->sg_dma, sizeof(struct ivtv_sg_element), s->dma);
229 ivtv_stream_sync_for_cpu(s); 235 ivtv_stream_sync_for_cpu(s);
230 } 236 }
231 237
@@ -272,16 +278,19 @@ void ivtv_stream_free(struct ivtv_stream *s)
272 } 278 }
273 279
274 /* Free SG Array/Lists */ 280 /* Free SG Array/Lists */
275 if (s->SGarray != NULL) { 281 if (s->sg_dma != NULL) {
276 if (s->SG_handle != IVTV_DMA_UNMAPPED) { 282 if (s->sg_handle != IVTV_DMA_UNMAPPED) {
277 pci_unmap_single(s->itv->dev, s->SG_handle, 283 pci_unmap_single(s->itv->dev, s->sg_handle,
278 sizeof(struct ivtv_SG_element) * s->buffers, PCI_DMA_TODEVICE); 284 sizeof(struct ivtv_sg_element), PCI_DMA_TODEVICE);
279 s->SG_handle = IVTV_DMA_UNMAPPED; 285 s->sg_handle = IVTV_DMA_UNMAPPED;
280 } 286 }
281 kfree(s->SGarray); 287 kfree(s->sg_pending);
282 kfree(s->PIOarray); 288 kfree(s->sg_processing);
283 s->PIOarray = NULL; 289 kfree(s->sg_dma);
284 s->SGarray = NULL; 290 s->sg_pending = NULL;
285 s->SG_length = 0; 291 s->sg_processing = NULL;
292 s->sg_dma = NULL;
293 s->sg_pending_size = 0;
294 s->sg_processing_size = 0;
286 } 295 }
287} 296}