Skip to contentSkip to conversation

gigaset fixes for 2.6.34-rc1

PATCH In review Tilman Schmidt 3 participants 6 messages Mar 14, 2010 – Mar 15, 2010

Subsystems (2)
lore
Share & tools
lore
#2 lore raw

PATCH 2/3 gigaset: correct clearing of at_state strings on RING

In reply to Tilman Schmidt

In RING handling, clear the table of received parameter strings in a loop like everywhere else, instead of by enumeration which had already gotten out of sync.

Impact: minor bugfix

---
Note to -stable: applies correctly to 2.6.33.

 drivers/isdn/gigaset/ev-layer.c |   12 ++++--------
 1 files changed, 4 insertions(+), 8 deletions(-)
drivers/isdn/gigaset/ev-layer.c +4 -8
index c8f89b7..206c380 100644
@@ -1258,14 +1258,10 @@ static void do_action(int action, struct cardstate *cs,
 		 * note that bcs may be NULL if no B channel is free
 		 */
 		at_state2->ConState = 700;
-		kfree(at_state2->str_var[STR_NMBR]);
-		at_state2->str_var[STR_NMBR] = NULL;
-		kfree(at_state2->str_var[STR_ZCPN]);
-		at_state2->str_var[STR_ZCPN] = NULL;
-		kfree(at_state2->str_var[STR_ZBC]);
-		at_state2->str_var[STR_ZBC] = NULL;
-		kfree(at_state2->str_var[STR_ZHLC]);
-		at_state2->str_var[STR_ZHLC] = NULL;
+		for (i = 0; i < STR_NUM; ++i) {
+			kfree(at_state2->str_var[i]);
+			at_state2->str_var[i] = NULL;
+		}
 		at_state2->int_var[VAR_ZCTP] = -1;
 
 		spin_lock_irqsave(&cs->lock, flags);
Signature · 1 line
1.6.5.3.298.g39add
#3 lore raw

PATCH 3/3 gigaset: prune use of tty_buffer_request_room

In reply to Tilman Schmidt

Calling tty_buffer_request_room() before tty_insert_flip_string() is unnecessary, costs CPU and for big buffers can mess up the multi-page allocation avoidance.

---
Note to -stable: applies correctly to 2.6.33 with fuzz 2.

 drivers/isdn/gigaset/interface.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)
drivers/isdn/gigaset/interface.c +0 -1
index a1bcbc2..f0dc6c9 100644
@@ -628,7 +628,6 @@ void gigaset_if_receive(struct cardstate *cs,
 	if (tty == NULL)
 		gig_dbg(DEBUG_IF, "receive on closed device");
 	else {
-		tty_buffer_request_room(tty, len);
 		tty_insert_flip_string(tty, buffer, len);
 		tty_flip_buffer_push(tty);
 	}
Signature · 1 line
1.6.5.3.298.g39add
#1 lore raw

PATCH 1/3 gigaset: avoid registering CAPI driver more than once

In reply to Tilman Schmidt

Registering/unregistering the Gigaset CAPI driver when a device is connected/disconnected causes an Oops when disconnecting two Gigaset devices in a row, because the same capi_driver structure gets unregistered twice. Fix by making driver registration/unregistration a separate operation (empty in the ISDN4Linux case) called when the main module is loaded/unloaded.

Impact: bugfix

---
Note to -stable: applies correctly to 2.6.33 with fuzz 2 in capi.c.

 drivers/isdn/gigaset/capi.c    |   44 ++++++++++++++++++++++-----------------
 drivers/isdn/gigaset/common.c  |    6 +++-
 drivers/isdn/gigaset/gigaset.h |    6 +++-
 drivers/isdn/gigaset/i4l.c     |   28 ++++++++++++++++++-------
 4 files changed, 53 insertions(+), 31 deletions(-)
drivers/isdn/gigaset/capi.c +25 -19
index 6643d65..4a31962 100644
@@ -2191,36 +2191,24 @@ static const struct file_operations gigaset_proc_fops = {
 	.release	= single_release,
 };
 
-static struct capi_driver capi_driver_gigaset = {
-	.name		= "gigaset",
-	.revision	= "1.0",
-};
-
 /**
- * gigaset_isdn_register() - register to LL
+ * gigaset_isdn_regdev() - register device to LL
  * @cs:		device descriptor structure.
  * @isdnid:	device name.
  *
- * Called by main module to register the device with the LL.
- *
  * Return value: 1 for success, 0 for failure
  */
-int gigaset_isdn_register(struct cardstate *cs, const char *isdnid)
+int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid)
 {
 	struct gigaset_capi_ctr *iif;
 	int rc;
 
-	pr_info("Kernel CAPI interface\n");
-
 	iif = kmalloc(sizeof(*iif), GFP_KERNEL);
 	if (!iif) {
 		pr_err("%s: out of memory\n", __func__);
 		return 0;
 	}
 
-	/* register driver with CAPI (ToDo: what for?) */
-	register_capi_driver(&capi_driver_gigaset);
-
 	/* prepare controller structure */
 	iif->ctr.owner         = THIS_MODULE;
 	iif->ctr.driverdata    = cs;
@@ -2241,7 +2229,6 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid)
 	rc = attach_capi_ctr(&iif->ctr);
 	if (rc) {
 		pr_err("attach_capi_ctr failed (%d)\n", rc);
-		unregister_capi_driver(&capi_driver_gigaset);
 		kfree(iif);
 		return 0;
 	}
@@ -2252,17 +2239,36 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid)
 }
 
 /**
- * gigaset_isdn_unregister() - unregister from LL
+ * gigaset_isdn_unregdev() - unregister device from LL
  * @cs:		device descriptor structure.
- *
- * Called by main module to unregister the device from the LL.
  */
-void gigaset_isdn_unregister(struct cardstate *cs)
+void gigaset_isdn_unregdev(struct cardstate *cs)
 {
 	struct gigaset_capi_ctr *iif = cs->iif;
 
 	detach_capi_ctr(&iif->ctr);
 	kfree(iif);
 	cs->iif = NULL;
+}
+
+static struct capi_driver capi_driver_gigaset = {
+	.name		= "gigaset",
+	.revision	= "1.0",
+};
+
+/**
+ * gigaset_isdn_regdrv() - register driver to LL
+ */
+void gigaset_isdn_regdrv(void)
+{
+	pr_info("Kernel CAPI interface\n");
+	register_capi_driver(&capi_driver_gigaset);
+}
+
+/**
+ * gigaset_isdn_unregdrv() - unregister driver from LL
+ */
+void gigaset_isdn_unregdrv(void)
+{
 	unregister_capi_driver(&capi_driver_gigaset);
 }
drivers/isdn/gigaset/common.c +4 -2
index 85de339..bdc01cb 100644
@@ -507,7 +507,7 @@ void gigaset_freecs(struct cardstate *cs)
 	case 2: /* error in initcshw */
 		/* Deregister from LL */
 		make_invalid(cs, VALID_ID);
-		gigaset_isdn_unregister(cs);
+		gigaset_isdn_unregdev(cs);
 
 		/* fall through */
 	case 1: /* error when registering to LL */
@@ -769,7 +769,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
 	cs->cmdbytes = 0;
 
 	gig_dbg(DEBUG_INIT, "setting up iif");
-	if (!gigaset_isdn_register(cs, modulename)) {
+	if (!gigaset_isdn_regdev(cs, modulename)) {
 		pr_err("error registering ISDN device\n");
 		goto error;
 	}
@@ -1205,11 +1205,13 @@ static int __init gigaset_init_module(void)
 		gigaset_debuglevel = DEBUG_DEFAULT;
 
 	pr_info(DRIVER_DESC DRIVER_DESC_DEBUG "\n");
+	gigaset_isdn_regdrv();
 	return 0;
 }
 
 static void __exit gigaset_exit_module(void)
 {
+	gigaset_isdn_unregdrv();
 }
 
 module_init(gigaset_init_module);
drivers/isdn/gigaset/gigaset.h +4 -2
index 1875ab8..cdd144e 100644
@@ -675,8 +675,10 @@ int gigaset_isowbuf_getbytes(struct isowbuf_t *iwb, int size);
  */
 
 /* Called from common.c for setting up/shutting down with the ISDN subsystem */
-int gigaset_isdn_register(struct cardstate *cs, const char *isdnid);
-void gigaset_isdn_unregister(struct cardstate *cs);
+void gigaset_isdn_regdrv(void);
+void gigaset_isdn_unregdrv(void);
+int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid);
+void gigaset_isdn_unregdev(struct cardstate *cs);
 
 /* Called from hardware module to indicate completion of an skb */
 void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb);
drivers/isdn/gigaset/i4l.c +20 -8
index f0acb9d..c22e5ac 100644
@@ -592,15 +592,13 @@ void gigaset_isdn_stop(struct cardstate *cs)
 }
 
 /**
- * gigaset_isdn_register() - register to LL
+ * gigaset_isdn_regdev() - register to LL
  * @cs:		device descriptor structure.
  * @isdnid:	device name.
  *
- * Called by main module to register the device with the LL.
- *
  * Return value: 1 for success, 0 for failure
  */
-int gigaset_isdn_register(struct cardstate *cs, const char *isdnid)
+int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid)
 {
 	isdn_if *iif;
 
@@ -650,15 +648,29 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid)
 }
 
 /**
- * gigaset_isdn_unregister() - unregister from LL
+ * gigaset_isdn_unregdev() - unregister device from LL
  * @cs:		device descriptor structure.
- *
- * Called by main module to unregister the device from the LL.
  */
-void gigaset_isdn_unregister(struct cardstate *cs)
+void gigaset_isdn_unregdev(struct cardstate *cs)
 {
 	gig_dbg(DEBUG_CMD, "sending UNLOAD");
 	gigaset_i4l_cmd(cs, ISDN_STAT_UNLOAD);
 	kfree(cs->iif);
 	cs->iif = NULL;
 }
+
+/**
+ * gigaset_isdn_regdrv() - register driver to LL
+ */
+void gigaset_isdn_regdrv(void)
+{
+	/* nothing to do */
+}
+
+/**
+ * gigaset_isdn_unregdrv() - unregister driver from LL
+ */
+void gigaset_isdn_unregdrv(void)
+{
+	/* nothing to do */
+}
Signature · 1 line
1.6.5.3.298.g39add
#0 lore raw

cover gigaset fixes for 2.6.34-rc1

Karsten, David,

following are three bugfix patches to the Gigaset driver which should still go into 2.6.34 if possible, and also into the 2.6.33 stable branch.

Thanks,
Tilman

Tilman Schmidt (3):
gigaset: avoid registering CAPI driver more than once
gigaset: correct clearing of at_state strings on RING
gigaset: prune use of tty_buffer_request_room

 drivers/isdn/gigaset/capi.c      |   44 +++++++++++++++++++++----------------
 drivers/isdn/gigaset/common.c    |    6 +++-
 drivers/isdn/gigaset/ev-layer.c  |   12 +++-------
 drivers/isdn/gigaset/gigaset.h   |    6 +++-
 drivers/isdn/gigaset/i4l.c       |   28 +++++++++++++++++-------
 drivers/isdn/gigaset/interface.c |    1 -
 6 files changed, 57 insertions(+), 40 deletions(-)
#4 lore raw
Quoted 4 lines · On Sonntag, 14. März 2010 23:58:05 Tilman Schmidt wrote:

Karsten, David,

following are three bugfix patches to the Gigaset driver which should still go into 2.6.34 if possible, and also into the 2.6.33 stable branch.

Ack for all

Quoted 18 lines

Thanks,
Tilman

Tilman Schmidt (3):
gigaset: avoid registering CAPI driver more than once
gigaset: correct clearing of at_state strings on RING
gigaset: prune use of tty_buffer_request_room

 drivers/isdn/gigaset/capi.c      |   44
 +++++++++++++++++++++---------------- drivers/isdn/gigaset/common.c    |  
  6 +++-
 drivers/isdn/gigaset/ev-layer.c  |   12 +++-------
 drivers/isdn/gigaset/gigaset.h   |    6 +++-
 drivers/isdn/gigaset/i4l.c       |   28 +++++++++++++++++-------
 drivers/isdn/gigaset/interface.c |    1 -
 6 files changed, 57 insertions(+), 40 deletions(-)
maintainer
#5 lore raw
In reply to Tilman Schmidt

From: Tilman Schmidt <[email protected]>
Date: Sun, 14 Mar 2010 23:58:05 +0100 (CET)

Quoted 2 lines

following are three bugfix patches to the Gigaset driver which should still go into 2.6.34 if possible, and also into the 2.6.33 stable branch.

All applied, thanks Tilman.