speedtch: don't abuse struct delayed_work
speedtch directly uses the internal timer and work members of a struct delayed_work. Use a separate work item and timer instead. * Nicolas Kaiser discovered that timer init was missing. Fixed. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Greg Kroah-Hartman <gregkh@suse.de> Tested-by: Nicolas Kaiser <nikai@nikai.net> Cc: Duncan Sands <duncan.sands@free.fr> Cc: linux-usb@vger.kernel.org
This commit is contained in:
parent
8c71778cbf
commit
37c95bfe94
|
@ -139,7 +139,8 @@ struct speedtch_instance_data {
|
||||||
|
|
||||||
struct speedtch_params params; /* set in probe, constant afterwards */
|
struct speedtch_params params; /* set in probe, constant afterwards */
|
||||||
|
|
||||||
struct delayed_work status_checker;
|
struct timer_list status_check_timer;
|
||||||
|
struct work_struct status_check_work;
|
||||||
|
|
||||||
unsigned char last_status;
|
unsigned char last_status;
|
||||||
|
|
||||||
|
@ -498,7 +499,7 @@ static void speedtch_check_status(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct speedtch_instance_data *instance =
|
struct speedtch_instance_data *instance =
|
||||||
container_of(work, struct speedtch_instance_data,
|
container_of(work, struct speedtch_instance_data,
|
||||||
status_checker.work);
|
status_check_work);
|
||||||
struct usbatm_data *usbatm = instance->usbatm;
|
struct usbatm_data *usbatm = instance->usbatm;
|
||||||
struct atm_dev *atm_dev = usbatm->atm_dev;
|
struct atm_dev *atm_dev = usbatm->atm_dev;
|
||||||
unsigned char *buf = instance->scratch_buffer;
|
unsigned char *buf = instance->scratch_buffer;
|
||||||
|
@ -575,11 +576,11 @@ static void speedtch_status_poll(unsigned long data)
|
||||||
{
|
{
|
||||||
struct speedtch_instance_data *instance = (void *)data;
|
struct speedtch_instance_data *instance = (void *)data;
|
||||||
|
|
||||||
schedule_delayed_work(&instance->status_checker, 0);
|
schedule_work(&instance->status_check_work);
|
||||||
|
|
||||||
/* The following check is racy, but the race is harmless */
|
/* The following check is racy, but the race is harmless */
|
||||||
if (instance->poll_delay < MAX_POLL_DELAY)
|
if (instance->poll_delay < MAX_POLL_DELAY)
|
||||||
mod_timer(&instance->status_checker.timer, jiffies + msecs_to_jiffies(instance->poll_delay));
|
mod_timer(&instance->status_check_timer, jiffies + msecs_to_jiffies(instance->poll_delay));
|
||||||
else
|
else
|
||||||
atm_warn(instance->usbatm, "Too many failures - disabling line status polling\n");
|
atm_warn(instance->usbatm, "Too many failures - disabling line status polling\n");
|
||||||
}
|
}
|
||||||
|
@ -595,7 +596,7 @@ static void speedtch_resubmit_int(unsigned long data)
|
||||||
if (int_urb) {
|
if (int_urb) {
|
||||||
ret = usb_submit_urb(int_urb, GFP_ATOMIC);
|
ret = usb_submit_urb(int_urb, GFP_ATOMIC);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
schedule_delayed_work(&instance->status_checker, 0);
|
schedule_work(&instance->status_check_work);
|
||||||
else {
|
else {
|
||||||
atm_dbg(instance->usbatm, "%s: usb_submit_urb failed with result %d\n", __func__, ret);
|
atm_dbg(instance->usbatm, "%s: usb_submit_urb failed with result %d\n", __func__, ret);
|
||||||
mod_timer(&instance->resubmit_timer, jiffies + msecs_to_jiffies(RESUBMIT_DELAY));
|
mod_timer(&instance->resubmit_timer, jiffies + msecs_to_jiffies(RESUBMIT_DELAY));
|
||||||
|
@ -624,7 +625,7 @@ static void speedtch_handle_int(struct urb *int_urb)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((count == 6) && !memcmp(up_int, instance->int_data, 6)) {
|
if ((count == 6) && !memcmp(up_int, instance->int_data, 6)) {
|
||||||
del_timer(&instance->status_checker.timer);
|
del_timer(&instance->status_check_timer);
|
||||||
atm_info(usbatm, "DSL line goes up\n");
|
atm_info(usbatm, "DSL line goes up\n");
|
||||||
} else if ((count == 6) && !memcmp(down_int, instance->int_data, 6)) {
|
} else if ((count == 6) && !memcmp(down_int, instance->int_data, 6)) {
|
||||||
atm_info(usbatm, "DSL line goes down\n");
|
atm_info(usbatm, "DSL line goes down\n");
|
||||||
|
@ -640,7 +641,7 @@ static void speedtch_handle_int(struct urb *int_urb)
|
||||||
|
|
||||||
if ((int_urb = instance->int_urb)) {
|
if ((int_urb = instance->int_urb)) {
|
||||||
ret = usb_submit_urb(int_urb, GFP_ATOMIC);
|
ret = usb_submit_urb(int_urb, GFP_ATOMIC);
|
||||||
schedule_delayed_work(&instance->status_checker, 0);
|
schedule_work(&instance->status_check_work);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
atm_dbg(usbatm, "%s: usb_submit_urb failed with result %d\n", __func__, ret);
|
atm_dbg(usbatm, "%s: usb_submit_urb failed with result %d\n", __func__, ret);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -686,7 +687,7 @@ static int speedtch_atm_start(struct usbatm_data *usbatm, struct atm_dev *atm_de
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start status polling */
|
/* Start status polling */
|
||||||
mod_timer(&instance->status_checker.timer, jiffies + msecs_to_jiffies(1000));
|
mod_timer(&instance->status_check_timer, jiffies + msecs_to_jiffies(1000));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -698,7 +699,7 @@ static void speedtch_atm_stop(struct usbatm_data *usbatm, struct atm_dev *atm_de
|
||||||
|
|
||||||
atm_dbg(usbatm, "%s entered\n", __func__);
|
atm_dbg(usbatm, "%s entered\n", __func__);
|
||||||
|
|
||||||
del_timer_sync(&instance->status_checker.timer);
|
del_timer_sync(&instance->status_check_timer);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since resubmit_timer and int_urb can schedule themselves and
|
* Since resubmit_timer and int_urb can schedule themselves and
|
||||||
|
@ -869,10 +870,11 @@ static int speedtch_bind(struct usbatm_data *usbatm,
|
||||||
|
|
||||||
usbatm->flags |= (use_isoc ? UDSL_USE_ISOC : 0);
|
usbatm->flags |= (use_isoc ? UDSL_USE_ISOC : 0);
|
||||||
|
|
||||||
INIT_DELAYED_WORK(&instance->status_checker, speedtch_check_status);
|
INIT_WORK(&instance->status_check_work, speedtch_check_status);
|
||||||
|
init_timer(&instance->status_check_timer);
|
||||||
|
|
||||||
instance->status_checker.timer.function = speedtch_status_poll;
|
instance->status_check_timer.function = speedtch_status_poll;
|
||||||
instance->status_checker.timer.data = (unsigned long)instance;
|
instance->status_check_timer.data = (unsigned long)instance;
|
||||||
instance->last_status = 0xff;
|
instance->last_status = 0xff;
|
||||||
instance->poll_delay = MIN_POLL_DELAY;
|
instance->poll_delay = MIN_POLL_DELAY;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue