aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorDan Carpenter <error27@gmail.com>2010-05-04 08:14:29 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-19 11:59:05 -0400
commit32ec4576c3fb37316b1d11a04b220527822f3f0d (patch)
treeb6e8d8e6574cca08c6f19e29bcaca6b8af1aa830 /drivers/media
parent9723dbb034e45775037c5dd098652e1628a1c9ef (diff)
V4L/DVB: media/az6027: doing dma on the stack
I changed the dma buffers to use allocated memory instead of stack memory. The reason for this is documented in Documentation/DMA-API-HOWTO.txt under the section: "What memory is DMA'able?" That document was only added a couple weeks ago and there are still lots of modules which haven't been corrected yet. Btw. Smatch includes a pretty good test to find places which use stack memory as a dma buffer. That's how I found these. (http://smatch.sf.net). Signed-off-by: Dan Carpenter <error27@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/dvb/dvb-usb/az6027.c50
1 files changed, 41 insertions, 9 deletions
diff --git a/drivers/media/dvb/dvb-usb/az6027.c b/drivers/media/dvb/dvb-usb/az6027.c
index 8934788bd83b..baaa301c5768 100644
--- a/drivers/media/dvb/dvb-usb/az6027.c
+++ b/drivers/media/dvb/dvb-usb/az6027.c
@@ -417,11 +417,15 @@ static int az6027_ci_read_attribute_mem(struct dvb_ca_en50221 *ca,
417 u16 value; 417 u16 value;
418 u16 index; 418 u16 index;
419 int blen; 419 int blen;
420 u8 b[12]; 420 u8 *b;
421 421
422 if (slot != 0) 422 if (slot != 0)
423 return -EINVAL; 423 return -EINVAL;
424 424
425 b = kmalloc(12, GFP_KERNEL);
426 if (!b)
427 return -ENOMEM;
428
425 mutex_lock(&state->ca_mutex); 429 mutex_lock(&state->ca_mutex);
426 430
427 req = 0xC1; 431 req = 0xC1;
@@ -438,6 +442,7 @@ static int az6027_ci_read_attribute_mem(struct dvb_ca_en50221 *ca,
438 } 442 }
439 443
440 mutex_unlock(&state->ca_mutex); 444 mutex_unlock(&state->ca_mutex);
445 kfree(b);
441 return ret; 446 return ret;
442} 447}
443 448
@@ -485,11 +490,15 @@ static int az6027_ci_read_cam_control(struct dvb_ca_en50221 *ca,
485 u16 value; 490 u16 value;
486 u16 index; 491 u16 index;
487 int blen; 492 int blen;
488 u8 b[12]; 493 u8 *b;
489 494
490 if (slot != 0) 495 if (slot != 0)
491 return -EINVAL; 496 return -EINVAL;
492 497
498 b = kmalloc(12, GFP_KERNEL);
499 if (!b)
500 return -ENOMEM;
501
493 mutex_lock(&state->ca_mutex); 502 mutex_lock(&state->ca_mutex);
494 503
495 req = 0xC3; 504 req = 0xC3;
@@ -510,6 +519,7 @@ static int az6027_ci_read_cam_control(struct dvb_ca_en50221 *ca,
510 } 519 }
511 520
512 mutex_unlock(&state->ca_mutex); 521 mutex_unlock(&state->ca_mutex);
522 kfree(b);
513 return ret; 523 return ret;
514} 524}
515 525
@@ -556,7 +566,11 @@ static int CI_CamReady(struct dvb_ca_en50221 *ca, int slot)
556 u16 value; 566 u16 value;
557 u16 index; 567 u16 index;
558 int blen; 568 int blen;
559 u8 b[12]; 569 u8 *b;
570
571 b = kmalloc(12, GFP_KERNEL);
572 if (!b)
573 return -ENOMEM;
560 574
561 req = 0xC8; 575 req = 0xC8;
562 value = 0; 576 value = 0;
@@ -570,6 +584,7 @@ static int CI_CamReady(struct dvb_ca_en50221 *ca, int slot)
570 } else{ 584 } else{
571 ret = b[0]; 585 ret = b[0];
572 } 586 }
587 kfree(b);
573 return ret; 588 return ret;
574} 589}
575 590
@@ -667,8 +682,11 @@ static int az6027_ci_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int o
667 u16 value; 682 u16 value;
668 u16 index; 683 u16 index;
669 int blen; 684 int blen;
670 u8 b[12]; 685 u8 *b;
671 686
687 b = kmalloc(12, GFP_KERNEL);
688 if (!b)
689 return -ENOMEM;
672 mutex_lock(&state->ca_mutex); 690 mutex_lock(&state->ca_mutex);
673 691
674 req = 0xC5; 692 req = 0xC5;
@@ -692,6 +710,7 @@ static int az6027_ci_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int o
692 } 710 }
693 711
694 mutex_unlock(&state->ca_mutex); 712 mutex_unlock(&state->ca_mutex);
713 kfree(b);
695 return ret; 714 return ret;
696} 715}
697 716
@@ -943,10 +962,16 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n
943 u16 value; 962 u16 value;
944 int length; 963 int length;
945 u8 req; 964 u8 req;
946 u8 data[256]; 965 u8 *data;
966
967 data = kmalloc(256, GFP_KERNEL);
968 if (!data)
969 return -ENOMEM;
947 970
948 if (mutex_lock_interruptible(&d->i2c_mutex) < 0) 971 if (mutex_lock_interruptible(&d->i2c_mutex) < 0) {
972 kfree(data);
949 return -EAGAIN; 973 return -EAGAIN;
974 }
950 975
951 if (num > 2) 976 if (num > 2)
952 warn("more than 2 i2c messages at a time is not handled yet. TODO."); 977 warn("more than 2 i2c messages at a time is not handled yet. TODO.");
@@ -1016,6 +1041,7 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n
1016 } 1041 }
1017 } 1042 }
1018 mutex_unlock(&d->i2c_mutex); 1043 mutex_unlock(&d->i2c_mutex);
1044 kfree(data);
1019 1045
1020 return i; 1046 return i;
1021} 1047}
@@ -1036,8 +1062,14 @@ int az6027_identify_state(struct usb_device *udev,
1036 struct dvb_usb_device_description **desc, 1062 struct dvb_usb_device_description **desc,
1037 int *cold) 1063 int *cold)
1038{ 1064{
1039 u8 b[16]; 1065 u8 *b;
1040 s16 ret = usb_control_msg(udev, 1066 s16 ret;
1067
1068 b = kmalloc(16, GFP_KERNEL);
1069 if (!b)
1070 return -ENOMEM;
1071
1072 ret = usb_control_msg(udev,
1041 usb_rcvctrlpipe(udev, 0), 1073 usb_rcvctrlpipe(udev, 0),
1042 0xb7, 1074 0xb7,
1043 USB_TYPE_VENDOR | USB_DIR_IN, 1075 USB_TYPE_VENDOR | USB_DIR_IN,
@@ -1048,7 +1080,7 @@ int az6027_identify_state(struct usb_device *udev,
1048 USB_CTRL_GET_TIMEOUT); 1080 USB_CTRL_GET_TIMEOUT);
1049 1081
1050 *cold = ret <= 0; 1082 *cold = ret <= 0;
1051 1083 kfree(b);
1052 deb_info("cold: %d\n", *cold); 1084 deb_info("cold: %d\n", *cold);
1053 return 0; 1085 return 0;
1054} 1086}