diff options
Diffstat (limited to 'drivers/isdn/gigaset/bas-gigaset.c')
-rw-r--r-- | drivers/isdn/gigaset/bas-gigaset.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index 0302c40a27ea..d60a6510e92b 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c | |||
@@ -938,15 +938,15 @@ static int starturbs(struct bc_state *bcs) | |||
938 | ubc->isoouturbs[k].limit = -1; | 938 | ubc->isoouturbs[k].limit = -1; |
939 | } | 939 | } |
940 | 940 | ||
941 | /* submit two URBs, keep third one */ | 941 | /* keep one URB free, submit the others */ |
942 | for (k = 0; k < 2; ++k) { | 942 | for (k = 0; k < BAS_OUTURBS-1; ++k) { |
943 | dump_urb(DEBUG_ISO, "Initial isoc write", urb); | 943 | dump_urb(DEBUG_ISO, "Initial isoc write", urb); |
944 | rc = usb_submit_urb(ubc->isoouturbs[k].urb, GFP_ATOMIC); | 944 | rc = usb_submit_urb(ubc->isoouturbs[k].urb, GFP_ATOMIC); |
945 | if (rc != 0) | 945 | if (rc != 0) |
946 | goto error; | 946 | goto error; |
947 | } | 947 | } |
948 | dump_urb(DEBUG_ISO, "Initial isoc write (free)", urb); | 948 | dump_urb(DEBUG_ISO, "Initial isoc write (free)", urb); |
949 | ubc->isooutfree = &ubc->isoouturbs[2]; | 949 | ubc->isooutfree = &ubc->isoouturbs[BAS_OUTURBS-1]; |
950 | ubc->isooutdone = ubc->isooutovfl = NULL; | 950 | ubc->isooutdone = ubc->isooutovfl = NULL; |
951 | return 0; | 951 | return 0; |
952 | error: | 952 | error: |
@@ -1559,37 +1559,38 @@ static int req_submit(struct bc_state *bcs, int req, int val, int timeout) | |||
1559 | */ | 1559 | */ |
1560 | static int gigaset_init_bchannel(struct bc_state *bcs) | 1560 | static int gigaset_init_bchannel(struct bc_state *bcs) |
1561 | { | 1561 | { |
1562 | struct cardstate *cs = bcs->cs; | ||
1562 | int req, ret; | 1563 | int req, ret; |
1563 | unsigned long flags; | 1564 | unsigned long flags; |
1564 | 1565 | ||
1565 | spin_lock_irqsave(&bcs->cs->lock, flags); | 1566 | spin_lock_irqsave(&cs->lock, flags); |
1566 | if (unlikely(!bcs->cs->connected)) { | 1567 | if (unlikely(!cs->connected)) { |
1567 | gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__); | 1568 | gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__); |
1568 | spin_unlock_irqrestore(&bcs->cs->lock, flags); | 1569 | spin_unlock_irqrestore(&cs->lock, flags); |
1569 | return -ENODEV; | 1570 | return -ENODEV; |
1570 | } | 1571 | } |
1571 | 1572 | ||
1572 | if ((ret = starturbs(bcs)) < 0) { | 1573 | if ((ret = starturbs(bcs)) < 0) { |
1573 | dev_err(bcs->cs->dev, | 1574 | dev_err(cs->dev, |
1574 | "could not start isochronous I/O for channel B%d: %s\n", | 1575 | "could not start isochronous I/O for channel B%d: %s\n", |
1575 | bcs->channel + 1, | 1576 | bcs->channel + 1, |
1576 | ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret)); | 1577 | ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret)); |
1577 | if (ret != -ENODEV) | 1578 | if (ret != -ENODEV) |
1578 | error_hangup(bcs); | 1579 | error_hangup(bcs); |
1579 | spin_unlock_irqrestore(&bcs->cs->lock, flags); | 1580 | spin_unlock_irqrestore(&cs->lock, flags); |
1580 | return ret; | 1581 | return ret; |
1581 | } | 1582 | } |
1582 | 1583 | ||
1583 | req = bcs->channel ? HD_OPEN_B2CHANNEL : HD_OPEN_B1CHANNEL; | 1584 | req = bcs->channel ? HD_OPEN_B2CHANNEL : HD_OPEN_B1CHANNEL; |
1584 | if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0) { | 1585 | if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0) { |
1585 | dev_err(bcs->cs->dev, "could not open channel B%d\n", | 1586 | dev_err(cs->dev, "could not open channel B%d\n", |
1586 | bcs->channel + 1); | 1587 | bcs->channel + 1); |
1587 | stopurbs(bcs->hw.bas); | 1588 | stopurbs(bcs->hw.bas); |
1588 | if (ret != -ENODEV) | 1589 | if (ret != -ENODEV) |
1589 | error_hangup(bcs); | 1590 | error_hangup(bcs); |
1590 | } | 1591 | } |
1591 | 1592 | ||
1592 | spin_unlock_irqrestore(&bcs->cs->lock, flags); | 1593 | spin_unlock_irqrestore(&cs->lock, flags); |
1593 | return ret; | 1594 | return ret; |
1594 | } | 1595 | } |
1595 | 1596 | ||
@@ -1605,20 +1606,21 @@ static int gigaset_init_bchannel(struct bc_state *bcs) | |||
1605 | */ | 1606 | */ |
1606 | static int gigaset_close_bchannel(struct bc_state *bcs) | 1607 | static int gigaset_close_bchannel(struct bc_state *bcs) |
1607 | { | 1608 | { |
1609 | struct cardstate *cs = bcs->cs; | ||
1608 | int req, ret; | 1610 | int req, ret; |
1609 | unsigned long flags; | 1611 | unsigned long flags; |
1610 | 1612 | ||
1611 | spin_lock_irqsave(&bcs->cs->lock, flags); | 1613 | spin_lock_irqsave(&cs->lock, flags); |
1612 | if (unlikely(!bcs->cs->connected)) { | 1614 | if (unlikely(!cs->connected)) { |
1613 | spin_unlock_irqrestore(&bcs->cs->lock, flags); | 1615 | spin_unlock_irqrestore(&cs->lock, flags); |
1614 | gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__); | 1616 | gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__); |
1615 | return -ENODEV; | 1617 | return -ENODEV; |
1616 | } | 1618 | } |
1617 | 1619 | ||
1618 | if (!(atomic_read(&bcs->cs->hw.bas->basstate) & | 1620 | if (!(atomic_read(&cs->hw.bas->basstate) & |
1619 | (bcs->channel ? BS_B2OPEN : BS_B1OPEN))) { | 1621 | (bcs->channel ? BS_B2OPEN : BS_B1OPEN))) { |
1620 | /* channel not running: just signal common.c */ | 1622 | /* channel not running: just signal common.c */ |
1621 | spin_unlock_irqrestore(&bcs->cs->lock, flags); | 1623 | spin_unlock_irqrestore(&cs->lock, flags); |
1622 | gigaset_bchannel_down(bcs); | 1624 | gigaset_bchannel_down(bcs); |
1623 | return 0; | 1625 | return 0; |
1624 | } | 1626 | } |
@@ -1626,10 +1628,10 @@ static int gigaset_close_bchannel(struct bc_state *bcs) | |||
1626 | /* channel running: tell device to close it */ | 1628 | /* channel running: tell device to close it */ |
1627 | req = bcs->channel ? HD_CLOSE_B2CHANNEL : HD_CLOSE_B1CHANNEL; | 1629 | req = bcs->channel ? HD_CLOSE_B2CHANNEL : HD_CLOSE_B1CHANNEL; |
1628 | if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0) | 1630 | if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0) |
1629 | dev_err(bcs->cs->dev, "closing channel B%d failed\n", | 1631 | dev_err(cs->dev, "closing channel B%d failed\n", |
1630 | bcs->channel + 1); | 1632 | bcs->channel + 1); |
1631 | 1633 | ||
1632 | spin_unlock_irqrestore(&bcs->cs->lock, flags); | 1634 | spin_unlock_irqrestore(&cs->lock, flags); |
1633 | return ret; | 1635 | return ret; |
1634 | } | 1636 | } |
1635 | 1637 | ||
@@ -2114,7 +2116,7 @@ static void freeurbs(struct cardstate *cs) | |||
2114 | int i, j; | 2116 | int i, j; |
2115 | 2117 | ||
2116 | gig_dbg(DEBUG_INIT, "%s: killing URBs", __func__); | 2118 | gig_dbg(DEBUG_INIT, "%s: killing URBs", __func__); |
2117 | for (j = 0; j < 2; ++j) { | 2119 | for (j = 0; j < BAS_CHANNELS; ++j) { |
2118 | ubc = cs->bcs[j].hw.bas; | 2120 | ubc = cs->bcs[j].hw.bas; |
2119 | for (i = 0; i < BAS_OUTURBS; ++i) { | 2121 | for (i = 0; i < BAS_OUTURBS; ++i) { |
2120 | usb_kill_urb(ubc->isoouturbs[i].urb); | 2122 | usb_kill_urb(ubc->isoouturbs[i].urb); |
@@ -2215,7 +2217,7 @@ static int gigaset_probe(struct usb_interface *interface, | |||
2215 | !(ucs->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL))) | 2217 | !(ucs->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL))) |
2216 | goto allocerr; | 2218 | goto allocerr; |
2217 | 2219 | ||
2218 | for (j = 0; j < 2; ++j) { | 2220 | for (j = 0; j < BAS_CHANNELS; ++j) { |
2219 | ubc = cs->bcs[j].hw.bas; | 2221 | ubc = cs->bcs[j].hw.bas; |
2220 | for (i = 0; i < BAS_OUTURBS; ++i) | 2222 | for (i = 0; i < BAS_OUTURBS; ++i) |
2221 | if (!(ubc->isoouturbs[i].urb = | 2223 | if (!(ubc->isoouturbs[i].urb = |
@@ -2287,8 +2289,7 @@ static void gigaset_disconnect(struct usb_interface *interface) | |||
2287 | atomic_set(&ucs->basstate, 0); | 2289 | atomic_set(&ucs->basstate, 0); |
2288 | 2290 | ||
2289 | /* tell LL all channels are down */ | 2291 | /* tell LL all channels are down */ |
2290 | //FIXME shouldn't gigaset_stop() do this? | 2292 | for (j = 0; j < BAS_CHANNELS; ++j) |
2291 | for (j = 0; j < 2; ++j) | ||
2292 | gigaset_bchannel_down(cs->bcs + j); | 2293 | gigaset_bchannel_down(cs->bcs + j); |
2293 | 2294 | ||
2294 | /* stop driver (common part) */ | 2295 | /* stop driver (common part) */ |
@@ -2343,7 +2344,7 @@ static int __init bas_gigaset_init(void) | |||
2343 | goto error; | 2344 | goto error; |
2344 | 2345 | ||
2345 | /* allocate memory for our device state and intialize it */ | 2346 | /* allocate memory for our device state and intialize it */ |
2346 | cardstate = gigaset_initcs(driver, 2, 0, 0, cidmode, | 2347 | cardstate = gigaset_initcs(driver, BAS_CHANNELS, 0, 0, cidmode, |
2347 | GIGASET_MODULENAME); | 2348 | GIGASET_MODULENAME); |
2348 | if (!cardstate) | 2349 | if (!cardstate) |
2349 | goto error; | 2350 | goto error; |