diff --git a/drivers/media/video/tuner-xc2028.c b/drivers/media/video/tuner-xc2028.c
index c921d6009a8b68bc4d59d73d4ebbf95425ce3815..e19449603d73b559ec9bed35fd5e063e3a5da9f5 100644
--- a/drivers/media/video/tuner-xc2028.c
+++ b/drivers/media/video/tuner-xc2028.c
@@ -75,9 +75,6 @@ struct xc2028_data {
 							      6M, 7M or 8M */
 	int			need_load_generic; /* The generic firmware
 							      were loaded? */
-
-	int			max_len;	/* Max firmware chunk */
-
 	enum tuner_mode	mode;
 	struct i2c_client	*i2c_client;
 
@@ -426,7 +423,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type,
 {
 	struct xc2028_data *priv = fe->tuner_priv;
 	int                pos, rc;
-	unsigned char      *p, *endp, buf[priv->max_len];
+	unsigned char      *p, *endp, buf[priv->ctrl.max_len];
 
 	tuner_dbg("%s called\n", __FUNCTION__);
 
@@ -505,8 +502,8 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type,
 
 		/* Sends message chunks */
 		while (size > 0) {
-			int len = (size < priv->max_len - 1) ?
-				   size : priv->max_len - 1;
+			int len = (size < priv->ctrl.max_len - 1) ?
+				   size : priv->ctrl.max_len - 1;
 
 			memcpy(buf + 1, p, len);
 
@@ -881,32 +878,30 @@ static int xc2028_set_config(struct dvb_frontend *fe, void *priv_cfg)
 {
 	struct xc2028_data *priv = fe->tuner_priv;
 	struct xc2028_ctrl *p    = priv_cfg;
+	int                 rc   = 0;
 
 	tuner_dbg("%s called\n", __FUNCTION__);
 
 	mutex_lock(&priv->lock);
 
-	priv->ctrl.type = p->type;
-
-	if (p->fname) {
-		kfree(priv->ctrl.fname);
+	kfree(priv->ctrl.fname);
+	free_firmware(priv);
 
-		priv->ctrl.fname = kmalloc(strlen(p->fname) + 1, GFP_KERNEL);
-		if (priv->ctrl.fname == NULL) {
-			mutex_unlock(&priv->lock);
-			return -ENOMEM;
-		}
+	memcpy(&priv->ctrl, p, sizeof(priv->ctrl));
+	priv->ctrl.fname = NULL;
 
-		free_firmware(priv);
-		strcpy(priv->ctrl.fname, p->fname);
+	if (p->fname) {
+		priv->ctrl.fname = kstrdup(p->fname, GFP_KERNEL);
+		if (priv->ctrl.fname == NULL)
+			rc = -ENOMEM;
 	}
 
-	if (p->max_len > 0)
-		priv->max_len = p->max_len;
+	if (priv->ctrl.max_len < 9)
+		priv->ctrl.max_len = 13;
 
 	mutex_unlock(&priv->lock);
 
-	return 0;
+	return rc;
 }
 
 static const struct dvb_tuner_ops xc2028_dvb_tuner_ops = {
@@ -967,7 +962,7 @@ void *xc2028_attach(struct dvb_frontend *fe, struct xc2028_config *cfg)
 		priv->i2c_props.adap = cfg->i2c_adap;
 		priv->video_dev = video_dev;
 		priv->tuner_callback = cfg->callback;
-		priv->max_len = 13;
+		priv->ctrl.max_len = 13;
 
 		mutex_init(&priv->lock);