gigaset fixes for 2.6.34-rc1
Subsystems (2)
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(-)
PATCH 1/3 gigaset: avoid registering CAPI driver more than once
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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH 2/3 gigaset: correct clearing of at_state strings on RING
In reply to Tilman SchmidtIn 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
@@ -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
PATCH 3/3 gigaset: prune use of tty_buffer_request_room
In reply to Tilman SchmidtCalling 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
@@ -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
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,
TilmanTilman Schmidt (3):
gigaset: avoid registering CAPI driver more than once
gigaset: correct clearing ofat_statestrings on RING
gigaset: prune use oftty_buffer_request_roomdrivers/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(-)
David Miller
maintainerFrom: 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.