diff options
author | Tilman Schmidt <tilman@imap.cc> | 2010-09-30 09:35:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-01 03:33:34 -0400 |
commit | 1d5a9edcd5f1fe6483afca33294ed0ebab793ebf (patch) | |
tree | bfdcb39a7590ca2bcd2f350d5f8eaec816c1c285 | |
parent | befba36ab942c44ba1d3761a7439324fff83638f (diff) |
isdn/gigaset: bas_gigaset timer cleanup
Use setup_timer() and mod_timer() instead of direct assignment to
timer structure members, simplify the argument of one timer routine,
and make extra sure all timers are stopped during suspend.
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/isdn/gigaset/bas-gigaset.c | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index 131976d880d0..e865c5dc0282 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c | |||
@@ -588,10 +588,7 @@ static int atread_submit(struct cardstate *cs, int timeout) | |||
588 | 588 | ||
589 | if (timeout > 0) { | 589 | if (timeout > 0) { |
590 | gig_dbg(DEBUG_USBREQ, "setting timeout of %d/10 secs", timeout); | 590 | gig_dbg(DEBUG_USBREQ, "setting timeout of %d/10 secs", timeout); |
591 | ucs->timer_cmd_in.expires = jiffies + timeout * HZ / 10; | 591 | mod_timer(&ucs->timer_cmd_in, jiffies + timeout * HZ / 10); |
592 | ucs->timer_cmd_in.data = (unsigned long) cs; | ||
593 | ucs->timer_cmd_in.function = cmd_in_timeout; | ||
594 | add_timer(&ucs->timer_cmd_in); | ||
595 | } | 592 | } |
596 | return 0; | 593 | return 0; |
597 | } | 594 | } |
@@ -1356,12 +1353,12 @@ error: | |||
1356 | /* req_timeout | 1353 | /* req_timeout |
1357 | * timeout routine for control output request | 1354 | * timeout routine for control output request |
1358 | * argument: | 1355 | * argument: |
1359 | * B channel control structure | 1356 | * controller state structure |
1360 | */ | 1357 | */ |
1361 | static void req_timeout(unsigned long data) | 1358 | static void req_timeout(unsigned long data) |
1362 | { | 1359 | { |
1363 | struct bc_state *bcs = (struct bc_state *) data; | 1360 | struct cardstate *cs = (struct cardstate *) data; |
1364 | struct bas_cardstate *ucs = bcs->cs->hw.bas; | 1361 | struct bas_cardstate *ucs = cs->hw.bas; |
1365 | int pending; | 1362 | int pending; |
1366 | unsigned long flags; | 1363 | unsigned long flags; |
1367 | 1364 | ||
@@ -1378,38 +1375,44 @@ static void req_timeout(unsigned long data) | |||
1378 | break; | 1375 | break; |
1379 | 1376 | ||
1380 | case HD_OPEN_ATCHANNEL: | 1377 | case HD_OPEN_ATCHANNEL: |
1381 | dev_err(bcs->cs->dev, "timeout opening AT channel\n"); | 1378 | dev_err(cs->dev, "timeout opening AT channel\n"); |
1382 | error_reset(bcs->cs); | 1379 | error_reset(cs); |
1383 | break; | 1380 | break; |
1384 | 1381 | ||
1385 | case HD_OPEN_B2CHANNEL: | ||
1386 | case HD_OPEN_B1CHANNEL: | 1382 | case HD_OPEN_B1CHANNEL: |
1387 | dev_err(bcs->cs->dev, "timeout opening channel %d\n", | 1383 | dev_err(cs->dev, "timeout opening channel 1\n"); |
1388 | bcs->channel + 1); | 1384 | error_hangup(&cs->bcs[0]); |
1389 | error_hangup(bcs); | 1385 | break; |
1386 | |||
1387 | case HD_OPEN_B2CHANNEL: | ||
1388 | dev_err(cs->dev, "timeout opening channel 2\n"); | ||
1389 | error_hangup(&cs->bcs[1]); | ||
1390 | break; | 1390 | break; |
1391 | 1391 | ||
1392 | case HD_CLOSE_ATCHANNEL: | 1392 | case HD_CLOSE_ATCHANNEL: |
1393 | dev_err(bcs->cs->dev, "timeout closing AT channel\n"); | 1393 | dev_err(cs->dev, "timeout closing AT channel\n"); |
1394 | error_reset(bcs->cs); | 1394 | error_reset(cs); |
1395 | break; | 1395 | break; |
1396 | 1396 | ||
1397 | case HD_CLOSE_B2CHANNEL: | ||
1398 | case HD_CLOSE_B1CHANNEL: | 1397 | case HD_CLOSE_B1CHANNEL: |
1399 | dev_err(bcs->cs->dev, "timeout closing channel %d\n", | 1398 | dev_err(cs->dev, "timeout closing channel 1\n"); |
1400 | bcs->channel + 1); | 1399 | error_reset(cs); |
1401 | error_reset(bcs->cs); | 1400 | break; |
1401 | |||
1402 | case HD_CLOSE_B2CHANNEL: | ||
1403 | dev_err(cs->dev, "timeout closing channel 2\n"); | ||
1404 | error_reset(cs); | ||
1402 | break; | 1405 | break; |
1403 | 1406 | ||
1404 | case HD_RESET_INTERRUPT_PIPE: | 1407 | case HD_RESET_INTERRUPT_PIPE: |
1405 | /* error recovery escalation */ | 1408 | /* error recovery escalation */ |
1406 | dev_err(bcs->cs->dev, | 1409 | dev_err(cs->dev, |
1407 | "reset interrupt pipe timeout, attempting USB reset\n"); | 1410 | "reset interrupt pipe timeout, attempting USB reset\n"); |
1408 | usb_queue_reset_device(bcs->cs->hw.bas->interface); | 1411 | usb_queue_reset_device(ucs->interface); |
1409 | break; | 1412 | break; |
1410 | 1413 | ||
1411 | default: | 1414 | default: |
1412 | dev_warn(bcs->cs->dev, "request 0x%02x timed out, clearing\n", | 1415 | dev_warn(cs->dev, "request 0x%02x timed out, clearing\n", |
1413 | pending); | 1416 | pending); |
1414 | } | 1417 | } |
1415 | 1418 | ||
@@ -1540,10 +1543,7 @@ static int req_submit(struct bc_state *bcs, int req, int val, int timeout) | |||
1540 | 1543 | ||
1541 | if (timeout > 0) { | 1544 | if (timeout > 0) { |
1542 | gig_dbg(DEBUG_USBREQ, "setting timeout of %d/10 secs", timeout); | 1545 | gig_dbg(DEBUG_USBREQ, "setting timeout of %d/10 secs", timeout); |
1543 | ucs->timer_ctrl.expires = jiffies + timeout * HZ / 10; | 1546 | mod_timer(&ucs->timer_ctrl, jiffies + timeout * HZ / 10); |
1544 | ucs->timer_ctrl.data = (unsigned long) bcs; | ||
1545 | ucs->timer_ctrl.function = req_timeout; | ||
1546 | add_timer(&ucs->timer_ctrl); | ||
1547 | } | 1547 | } |
1548 | 1548 | ||
1549 | spin_unlock_irqrestore(&ucs->lock, flags); | 1549 | spin_unlock_irqrestore(&ucs->lock, flags); |
@@ -1809,10 +1809,7 @@ static int atwrite_submit(struct cardstate *cs, unsigned char *buf, int len) | |||
1809 | if (!(update_basstate(ucs, BS_ATTIMER, BS_ATREADY) & BS_ATTIMER)) { | 1809 | if (!(update_basstate(ucs, BS_ATTIMER, BS_ATREADY) & BS_ATTIMER)) { |
1810 | gig_dbg(DEBUG_OUTPUT, "setting ATREADY timeout of %d/10 secs", | 1810 | gig_dbg(DEBUG_OUTPUT, "setting ATREADY timeout of %d/10 secs", |
1811 | ATRDY_TIMEOUT); | 1811 | ATRDY_TIMEOUT); |
1812 | ucs->timer_atrdy.expires = jiffies + ATRDY_TIMEOUT * HZ / 10; | 1812 | mod_timer(&ucs->timer_atrdy, jiffies + ATRDY_TIMEOUT * HZ / 10); |
1813 | ucs->timer_atrdy.data = (unsigned long) cs; | ||
1814 | ucs->timer_atrdy.function = atrdy_timeout; | ||
1815 | add_timer(&ucs->timer_atrdy); | ||
1816 | } | 1813 | } |
1817 | return 0; | 1814 | return 0; |
1818 | } | 1815 | } |
@@ -2114,9 +2111,9 @@ static int gigaset_initcshw(struct cardstate *cs) | |||
2114 | ucs->pending = 0; | 2111 | ucs->pending = 0; |
2115 | 2112 | ||
2116 | ucs->basstate = 0; | 2113 | ucs->basstate = 0; |
2117 | init_timer(&ucs->timer_ctrl); | 2114 | setup_timer(&ucs->timer_ctrl, req_timeout, (unsigned long) cs); |
2118 | init_timer(&ucs->timer_atrdy); | 2115 | setup_timer(&ucs->timer_atrdy, atrdy_timeout, (unsigned long) cs); |
2119 | init_timer(&ucs->timer_cmd_in); | 2116 | setup_timer(&ucs->timer_cmd_in, cmd_in_timeout, (unsigned long) cs); |
2120 | init_waitqueue_head(&ucs->waitqueue); | 2117 | init_waitqueue_head(&ucs->waitqueue); |
2121 | 2118 | ||
2122 | return 1; | 2119 | return 1; |
@@ -2387,6 +2384,8 @@ static int gigaset_suspend(struct usb_interface *intf, pm_message_t message) | |||
2387 | usb_kill_urb(ucs->urb_ctrl); | 2384 | usb_kill_urb(ucs->urb_ctrl); |
2388 | usb_kill_urb(ucs->urb_int_in); | 2385 | usb_kill_urb(ucs->urb_int_in); |
2389 | del_timer_sync(&ucs->timer_ctrl); | 2386 | del_timer_sync(&ucs->timer_ctrl); |
2387 | del_timer_sync(&ucs->timer_atrdy); | ||
2388 | del_timer_sync(&ucs->timer_cmd_in); | ||
2390 | 2389 | ||
2391 | gig_dbg(DEBUG_SUSPEND, "suspend complete"); | 2390 | gig_dbg(DEBUG_SUSPEND, "suspend complete"); |
2392 | return 0; | 2391 | return 0; |