diff -r e63eda5bc85d linux/drivers/media/dvb/dvb-usb/pctv452e.c
--- a/linux/drivers/media/dvb/dvb-usb/pctv452e.c	Tue Apr 26 11:02:32 2011 +0100
+++ b/linux/drivers/media/dvb/dvb-usb/pctv452e.c	Sun May 15 20:36:37 2011 +0100
@@ -98,6 +98,8 @@
 
 	u8 c;	   /* transaction counter, wraps around...  */
 	u8 initialized; /* set to 1 if 0x15 has been sent */
+        u8 rc_repeat;
+        u8 rc_counter;
 };
 
 static int
@@ -607,6 +609,20 @@
 	{0x153f, KEY_FORWARD}
 };
 
+/* Number of keypresses to ignore before detect repeating */
+#define RC_REPEAT_DELAY 3
+
+static int repeatable_keys[] = {
+        KEY_UP,
+        KEY_DOWN,
+        KEY_LEFT,
+        KEY_RIGHT,
+        KEY_VOLUMEUP,
+        KEY_VOLUMEDOWN,
+        KEY_CHANNELUP,
+        KEY_CHANNELDOWN
+};
+
 static int pctv452e_rc_query(struct dvb_usb_device *d, u32 *keyevent, int *keystate) {
 	struct pctv452e_state *state = (struct pctv452e_state *)d->priv;
 	u8 b[CMD_BUFFER_SIZE];
@@ -629,7 +645,7 @@
 
 	if (debug > 3) {
 		printk("%s: read: %2d: %02x %02x %02x: ", __func__, ret, rx[0], rx[1], rx[2]);
-		for (i = 0; (i < rx[3]) && ((i+3) < PCTV_ANSWER_LEN); i++) {
+		for (i = 0; (i < rx[3]) && ((i+3) <= PCTV_ANSWER_LEN); i++) {
 			printk(" %02x", rx[i+3]);
 		}
 		printk("\n");
@@ -640,13 +656,37 @@
 		if (debug > 2) {
 	 		printk("%s: cmd=0x%02x sys=0x%02x\n", __func__, rx[6], rx[7]);
 		}
-		keybuf[0] = 0x01;// DVB_USB_RC_NEC_KEY_PRESSED; why is this #define'd privately?
-		keybuf[1] = rx[7];
-		keybuf[2] = ~keybuf[1]; // fake checksum
-		keybuf[3] = rx[6];
-		keybuf[4] = ~keybuf[3]; // fake checksum
-		dvb_usb_nec_rc_key_to_event(d, keybuf, keyevent, keystate);
-
+		/* press or repeat */
+                if( rx[5] != state->rc_repeat ) {
+			keybuf[0] = 0x01;// DVB_USB_RC_NEC_KEY_PRESSED; why is this #define'd privately?
+			keybuf[1] = rx[7];
+			keybuf[2] = ~keybuf[1]; // fake checksum
+			keybuf[3] = rx[6];
+			keybuf[4] = ~keybuf[3]; // fake checksum
+			dvb_usb_nec_rc_key_to_event(d, keybuf, keyevent, keystate);
+			state->rc_counter = 0;
+			state->rc_repeat = rx[5];
+                }
+		else {
+			/* key repeat */
+			state->rc_counter++;
+			if (state->rc_counter > RC_REPEAT_DELAY) {
+				for (i = 0; i < ARRAY_SIZE(repeatable_keys); i++) {
+					if (d->last_event == repeatable_keys[i]) {
+						*keystate = REMOTE_KEY_REPEAT;
+						*keyevent = d->last_event;
+						if (debug > 2) {
+							printk("%s: repeat key, event %x\n", __func__,
+							   *keyevent);
+						}
+						return 0;
+					}
+				}
+				if (debug > 2) {
+					printk("%s: repeated key (non repeatable)\n", __func__);
+				}
+			}
+                }
 	}
 
 	return 0;
@@ -751,14 +791,14 @@
 
 
 static const struct stb0899_s1_reg pctv452e_init_dev [] = {
-	{ STB0899_DISCNTRL1	, 0x26 },
+	{ STB0899_DISCNTRL1	, 0x32 },
 	{ STB0899_DISCNTRL2	, 0x80 },
 	{ STB0899_DISRX_ST0	, 0x04 },
 	{ STB0899_DISRX_ST1	, 0x20 },
 	{ STB0899_DISPARITY	, 0x00 },
-	{ STB0899_DISFIFO	, 0x00 },
-	{ STB0899_DISF22	, 0x99 },
-	{ STB0899_DISF22RX	, 0x85 }, // 0xa8
+	/*{ STB0899_DISFIFO	, 0x00 }, don't fill fifo with garbage */
+	{ STB0899_DISF22	, 0x8c }, // 22 Khz Diseqc TX
+	{ STB0899_DISF22RX	, 0x9a }, // 20 Khz Diseqc RX
 	{ STB0899_ACRPRESC	, 0x11 },
 	{ STB0899_ACRDIV1	, 0x0a },
 	{ STB0899_ACRDIV2	, 0x05 },
@@ -1353,7 +1393,7 @@
 	.rc_key_map		= tt_connect_s2_3600_rc_key,
 	.rc_key_map_size	= ARRAY_SIZE(tt_connect_s2_3600_rc_key),
 	.rc_query		= pctv452e_rc_query,
-	.rc_interval		= 500,
+	.rc_interval		= 100,
 
 	.num_adapters		= 1,
 	.adapter = {{
@@ -1368,11 +1408,11 @@
 		/* parameter for the MPEG2-data transfer */
 		.stream = {
 			.type = USB_ISOC,
-			.count = 7,
+			.count = 4,
 			.endpoint = 0x02,
 			.u = {
 				.isoc = {
-					.framesperurb = 4,
+					.framesperurb = 64,
 					.framesize = 940,
 					.interval = 1
 				}

