Message ID | 20090608210333.11295srly8te8xog@lidskialf.net (mailing list archive) |
---|---|
State | Awaiting Upstream, archived |
Headers | show |
* Andrew de Quincey <adq_dvb@lidskialf.net> [090608 13:04]: > The brf6150 driver is missing several necessary cleanup steps to allow > module unloading. Add them. I've removed the brf6150 from linux-omap as this should get merged into the mainline kernel via bt list. Ville & Andrew, can you guys please coordinate on the bt list to get the driver merged in? I believe there were some changes needed for passing the hw address as a module option and for loading the firmware or something.. Thanks, Tony > Signed-off-by: Andrew de Quincey <adq@lidskialf.net> > > commit bf0e4cba53819df5590a88d551b35a2e79f4de75 > Author: Andrew de Quincey <adq@lidskialf.net> > Date: Sat May 30 18:01:58 2009 +0100 > > Fix brf6150 init/shutdown cleanup > > diff --git a/drivers/bluetooth/brf6150.c b/drivers/bluetooth/brf6150.c > index f29caf5..4f0112a 100644 > --- a/drivers/bluetooth/brf6150.c > +++ b/drivers/bluetooth/brf6150.c > @@ -312,7 +312,7 @@ static int brf6150_send_negotiation(struct brf6150_info *info) > skb = brf6150_read_fw_cmd(info, GFP_KERNEL); > > if (!skb) { > - printk(KERN_WARNING "Cannot read negoatiation message"); > + printk(KERN_WARNING "Cannot read negotiation message"); > return -1; > } > > @@ -873,6 +873,7 @@ static int brf6150_register_hdev(struct brf6150_info *info) > hdev->owner = THIS_MODULE; > > if (hci_register_dev(hdev) < 0) { > + hci_free_dev(hdev); > printk(KERN_WARNING "brf6150: Can't register HCI device %s.\n", hdev->name); > return -ENODEV; > } > @@ -885,10 +886,9 @@ static int __init brf6150_init(void) > struct brf6150_info *info; > int irq, err; > > - info = kmalloc(sizeof(struct brf6150_info), GFP_KERNEL); > + info = kzalloc(sizeof(struct brf6150_info), GFP_KERNEL); > if (!info) > return -ENOMEM; > - memset(info, 0, sizeof(struct brf6150_info)); > > brf6150_device.dev.driver_data = info; > init_completion(&info->init_completion); > @@ -906,8 +906,11 @@ static int __init brf6150_init(void) > exit_info = NULL; > > info->btinfo = omap_get_config(OMAP_TAG_NOKIA_BT, struct omap_bluetooth_config); > - if (info->btinfo == NULL) > + if (info->btinfo == NULL) { > + tasklet_kill(&info->tx_task); > + kfree(info); > return -1; > + } > > NBT_DBG("RESET gpio: %d\n", info->btinfo->reset_gpio); > NBT_DBG("BTWU gpio: %d\n", info->btinfo->bt_wakeup_gpio); > @@ -920,6 +923,7 @@ static int __init brf6150_init(void) > { > printk(KERN_WARNING "Cannot get GPIO line %d", > info->btinfo->reset_gpio); > + tasklet_kill(&info->tx_task); > kfree(info); > return err; > } > @@ -930,6 +934,7 @@ static int __init brf6150_init(void) > printk(KERN_WARNING "Cannot get GPIO line 0x%d", > info->btinfo->bt_wakeup_gpio); > gpio_free(info->btinfo->reset_gpio); > + tasklet_kill(&info->tx_task); > kfree(info); > return err; > } > @@ -941,6 +946,7 @@ static int __init brf6150_init(void) > info->btinfo->host_wakeup_gpio); > gpio_free(info->btinfo->reset_gpio); > gpio_free(info->btinfo->bt_wakeup_gpio); > + tasklet_kill(&info->tx_task); > kfree(info); > return err; > } > @@ -1027,6 +1033,7 @@ cleanup: > gpio_free(info->btinfo->reset_gpio); > gpio_free(info->btinfo->bt_wakeup_gpio); > gpio_free(info->btinfo->host_wakeup_gpio); > + tasklet_kill(&info->tx_task); > kfree(info); > > return err; > @@ -1035,12 +1042,16 @@ cleanup: > static void __exit brf6150_exit(void) > { > brf6150_hci_close(exit_info->hdev); > + hci_unregister_dev(exit_info->hdev); > hci_free_dev(exit_info->hdev); > gpio_free(exit_info->btinfo->reset_gpio); > gpio_free(exit_info->btinfo->bt_wakeup_gpio); > gpio_free(exit_info->btinfo->host_wakeup_gpio); > free_irq(exit_info->irq, (void *)exit_info); > free_irq(gpio_to_irq(exit_info->btinfo->host_wakeup_gpio), (void *)exit_info); > + tasklet_kill(&exit_info->tx_task); > + platform_device_unregister(&brf6150_device); > + platform_driver_unregister(&brf6150_driver); > kfree(exit_info); > } > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Andrew, ext Tony Lindgren wrote: > * Andrew de Quincey <adq_dvb@lidskialf.net> [090608 13:04]: >> The brf6150 driver is missing several necessary cleanup steps to allow >> module unloading. Add them. Yes. This driver was used as compiled in driver and seems to be missing cleanups. As you may have noticed this brf6150 driver has been replaced by hci_h4p drier in later tablets and the easiest way to maintain support for Nokia 770 bluetooth would be to make sure that also brf6150 works with the current driver. AFAIK it should work with quite little modifications. The settings negotiation is a little bit different. > > I've removed the brf6150 from linux-omap as this should get merged into > the mainline kernel via bt list. > > Ville & Andrew, can you guys please coordinate on the bt list to get > the driver merged in? I believe there were some changes needed for > passing the hw address as a module option and for loading the firmware > or something.. Is 2.6.30 booting in Nokia 770/N800/N810? If so then I guess this should be quite easy task.
* Ville Tervo <ville.tervo@nokia.com> [090615 01:39]: > Hi Andrew, > > ext Tony Lindgren wrote: >> * Andrew de Quincey <adq_dvb@lidskialf.net> [090608 13:04]: >>> The brf6150 driver is missing several necessary cleanup steps to >>> allow module unloading. Add them. > > Yes. This driver was used as compiled in driver and seems to be missing > cleanups. > > As you may have noticed this brf6150 driver has been replaced by hci_h4p > drier in later tablets and the easiest way to maintain support for Nokia > 770 bluetooth would be to make sure that also brf6150 works with the > current driver. AFAIK it should work with quite little modifications. > The settings negotiation is a little bit different. > >> >> I've removed the brf6150 from linux-omap as this should get merged into >> the mainline kernel via bt list. >> >> Ville & Andrew, can you guys please coordinate on the bt list to get >> the driver merged in? I believe there were some changes needed for >> passing the hw address as a module option and for loading the firmware >> or something.. > > Is 2.6.30 booting in Nokia 770/N800/N810? If so then I guess this should > be quite easy task. No.. The board files are missing, drivers/cbus is missing, and the code depends on omap specific ATAGs. Hopefully we can get the minimal support into 2.6.31 though. Tony -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
* Tony Lindgren <tony@atomide.com> [090615 02:00]: > * Ville Tervo <ville.tervo@nokia.com> [090615 01:39]: > > Hi Andrew, > > > > ext Tony Lindgren wrote: > >> * Andrew de Quincey <adq_dvb@lidskialf.net> [090608 13:04]: > >>> The brf6150 driver is missing several necessary cleanup steps to > >>> allow module unloading. Add them. > > > > Yes. This driver was used as compiled in driver and seems to be missing > > cleanups. > > > > As you may have noticed this brf6150 driver has been replaced by hci_h4p > > drier in later tablets and the easiest way to maintain support for Nokia > > 770 bluetooth would be to make sure that also brf6150 works with the > > current driver. AFAIK it should work with quite little modifications. > > The settings negotiation is a little bit different. > > > >> > >> I've removed the brf6150 from linux-omap as this should get merged into > >> the mainline kernel via bt list. > >> > >> Ville & Andrew, can you guys please coordinate on the bt list to get > >> the driver merged in? I believe there were some changes needed for > >> passing the hw address as a module option and for loading the firmware > >> or something.. > > > > Is 2.6.30 booting in Nokia 770/N800/N810? If so then I guess this should > > be quite easy task. > > No.. The board files are missing, drivers/cbus is missing, and the code > depends on omap specific ATAGs. Hopefully we can get the minimal support > into 2.6.31 though. Correction, hopefully we'll get the minimal support into 2.6.32, not 31. > Tony > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
commit bf0e4cba53819df5590a88d551b35a2e79f4de75 Author: Andrew de Quincey <adq@lidskialf.net> Date: Sat May 30 18:01:58 2009 +0100 Fix brf6150 init/shutdown cleanup diff --git a/drivers/bluetooth/brf6150.c b/drivers/bluetooth/brf6150.c index f29caf5..4f0112a 100644 --- a/drivers/bluetooth/brf6150.c +++ b/drivers/bluetooth/brf6150.c @@ -312,7 +312,7 @@ static int brf6150_send_negotiation(struct brf6150_info *info) skb = brf6150_read_fw_cmd(info, GFP_KERNEL); if (!skb) { - printk(KERN_WARNING "Cannot read negoatiation message"); + printk(KERN_WARNING "Cannot read negotiation message"); return -1; } @@ -873,6 +873,7 @@ static int brf6150_register_hdev(struct brf6150_info *info) hdev->owner = THIS_MODULE; if (hci_register_dev(hdev) < 0) { + hci_free_dev(hdev); printk(KERN_WARNING "brf6150: Can't register HCI device %s.\n", hdev->name); return -ENODEV; } @@ -885,10 +886,9 @@ static int __init brf6150_init(void) struct brf6150_info *info; int irq, err; - info = kmalloc(sizeof(struct brf6150_info), GFP_KERNEL); + info = kzalloc(sizeof(struct brf6150_info), GFP_KERNEL); if (!info) return -ENOMEM; - memset(info, 0, sizeof(struct brf6150_info)); brf6150_device.dev.driver_data = info; init_completion(&info->init_completion); @@ -906,8 +906,11 @@ static int __init brf6150_init(void) exit_info = NULL; info->btinfo = omap_get_config(OMAP_TAG_NOKIA_BT, struct omap_bluetooth_config); - if (info->btinfo == NULL) + if (info->btinfo == NULL) { + tasklet_kill(&info->tx_task); + kfree(info); return -1; + } NBT_DBG("RESET gpio: %d\n", info->btinfo->reset_gpio); NBT_DBG("BTWU gpio: %d\n", info->btinfo->bt_wakeup_gpio); @@ -920,6 +923,7 @@ static int __init brf6150_init(void) { printk(KERN_WARNING "Cannot get GPIO line %d", info->btinfo->reset_gpio); + tasklet_kill(&info->tx_task); kfree(info); return err; } @@ -930,6 +934,7 @@ static int __init brf6150_init(void) printk(KERN_WARNING "Cannot get GPIO line 0x%d", info->btinfo->bt_wakeup_gpio); gpio_free(info->btinfo->reset_gpio); + tasklet_kill(&info->tx_task); kfree(info); return err; } @@ -941,6 +946,7 @@ static int __init brf6150_init(void) info->btinfo->host_wakeup_gpio); gpio_free(info->btinfo->reset_gpio); gpio_free(info->btinfo->bt_wakeup_gpio); + tasklet_kill(&info->tx_task); kfree(info); return err; } @@ -1027,6 +1033,7 @@ cleanup: gpio_free(info->btinfo->reset_gpio); gpio_free(info->btinfo->bt_wakeup_gpio); gpio_free(info->btinfo->host_wakeup_gpio); + tasklet_kill(&info->tx_task); kfree(info); return err; @@ -1035,12 +1042,16 @@ cleanup: static void __exit brf6150_exit(void) { brf6150_hci_close(exit_info->hdev); + hci_unregister_dev(exit_info->hdev); hci_free_dev(exit_info->hdev); gpio_free(exit_info->btinfo->reset_gpio); gpio_free(exit_info->btinfo->bt_wakeup_gpio); gpio_free(exit_info->btinfo->host_wakeup_gpio); free_irq(exit_info->irq, (void *)exit_info); free_irq(gpio_to_irq(exit_info->btinfo->host_wakeup_gpio), (void *)exit_info); + tasklet_kill(&exit_info->tx_task); + platform_device_unregister(&brf6150_device); + platform_driver_unregister(&brf6150_driver); kfree(exit_info); }
The brf6150 driver is missing several necessary cleanup steps to allow module unloading. Add them. Signed-off-by: Andrew de Quincey <adq@lidskialf.net>