--- usbatm.c-orig 2005-10-30 12:20:55.000000000 +0100 +++ usbatm.c 2005-10-30 16:42:15.000000000 +0100 @@ -293,6 +293,16 @@ static inline struct usbatm_vcc_data *us return NULL; } +static void usbatm_close_all_vcc(struct usbatm_data *instance) +{ + struct usbatm_vcc_data *vcc_data; + + list_for_each_entry(vcc_data, &instance->vcc_list, list) { + struct atm_vcc *vcc = vcc_data->vcc; + vcc->push(vcc, NULL); + } +} + static void usbatm_extract_cells(struct usbatm_data *instance, unsigned char *source, unsigned int avail_data) { @@ -780,6 +790,12 @@ static int usbatm_atm_open(struct atm_vc goto fail; } + if (!try_module_get(instance->driver->owner)) { + atm_dbg(instance, "%s: can't get subdriver module\n", __func__); + ret = -ENODEV; + goto fail_subdriver_get; + } + vcc->dev_data = new; tasklet_disable(&instance->rx_channel.tasklet); @@ -796,6 +812,8 @@ static int usbatm_atm_open(struct atm_vc return 0; +fail_subdriver_get: + kfree_skb(new->sarb); fail: kfree(new); up(&instance->serialize); @@ -837,6 +855,7 @@ static void usbatm_atm_close(struct atm_ clear_bit(ATM_VF_PARTIAL, &vcc->flags); clear_bit(ATM_VF_ADDR, &vcc->flags); + module_put(instance->driver->owner); up(&instance->serialize); atm_dbg(instance, "%s successful\n", __func__); @@ -1183,6 +1202,7 @@ void usbatm_usb_disconnect(struct usb_in } /* ATM finalize */ + usbatm_close_all_vcc(instance); if (instance->atm_dev) shutdown_atm_dev(instance->atm_dev);