Lines Matching refs:channel

116 lcs_alloc_channel(struct lcs_channel *channel)  in lcs_alloc_channel()  argument
123 channel->iob[cnt].data = in lcs_alloc_channel()
125 if (channel->iob[cnt].data == NULL) in lcs_alloc_channel()
127 channel->iob[cnt].state = LCS_BUF_STATE_EMPTY; in lcs_alloc_channel()
133 kfree(channel->iob[cnt].data); in lcs_alloc_channel()
143 lcs_free_channel(struct lcs_channel *channel) in lcs_free_channel() argument
149 kfree(channel->iob[cnt].data); in lcs_free_channel()
150 channel->iob[cnt].data = NULL; in lcs_free_channel()
158 lcs_cleanup_channel(struct lcs_channel *channel) in lcs_cleanup_channel() argument
162 tasklet_kill(&channel->irq_tasklet); in lcs_cleanup_channel()
164 lcs_free_channel(channel); in lcs_cleanup_channel()
492 lcs_start_channel(struct lcs_channel *channel) in lcs_start_channel() argument
497 LCS_DBF_TEXT_(4, trace,"ssch%s", dev_name(&channel->ccwdev->dev)); in lcs_start_channel()
498 spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); in lcs_start_channel()
499 rc = ccw_device_start(channel->ccwdev, in lcs_start_channel()
500 channel->ccws + channel->io_idx, 0, 0, in lcs_start_channel()
503 channel->state = LCS_CH_STATE_RUNNING; in lcs_start_channel()
504 spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); in lcs_start_channel()
507 dev_name(&channel->ccwdev->dev)); in lcs_start_channel()
508 dev_err(&channel->ccwdev->dev, in lcs_start_channel()
516 lcs_clear_channel(struct lcs_channel *channel) in lcs_clear_channel() argument
522 LCS_DBF_TEXT_(4, trace, "%s", dev_name(&channel->ccwdev->dev)); in lcs_clear_channel()
523 spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); in lcs_clear_channel()
524 rc = ccw_device_clear(channel->ccwdev, (addr_t) channel); in lcs_clear_channel()
525 spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); in lcs_clear_channel()
528 dev_name(&channel->ccwdev->dev)); in lcs_clear_channel()
531 wait_event(channel->wait_q, (channel->state == LCS_CH_STATE_CLEARED)); in lcs_clear_channel()
532 channel->state = LCS_CH_STATE_STOPPED; in lcs_clear_channel()
541 lcs_stop_channel(struct lcs_channel *channel) in lcs_stop_channel() argument
546 if (channel->state == LCS_CH_STATE_STOPPED) in lcs_stop_channel()
549 LCS_DBF_TEXT_(4, trace, "%s", dev_name(&channel->ccwdev->dev)); in lcs_stop_channel()
550 channel->state = LCS_CH_STATE_INIT; in lcs_stop_channel()
551 spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); in lcs_stop_channel()
552 rc = ccw_device_halt(channel->ccwdev, (addr_t) channel); in lcs_stop_channel()
553 spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); in lcs_stop_channel()
556 dev_name(&channel->ccwdev->dev)); in lcs_stop_channel()
560 wait_event(channel->wait_q, (channel->state == LCS_CH_STATE_HALTED)); in lcs_stop_channel()
561 lcs_clear_channel(channel); in lcs_stop_channel()
601 __lcs_get_buffer(struct lcs_channel *channel) in __lcs_get_buffer() argument
606 index = channel->io_idx; in __lcs_get_buffer()
608 if (channel->iob[index].state == LCS_BUF_STATE_EMPTY) { in __lcs_get_buffer()
609 channel->iob[index].state = LCS_BUF_STATE_LOCKED; in __lcs_get_buffer()
610 return channel->iob + index; in __lcs_get_buffer()
613 } while (index != channel->io_idx); in __lcs_get_buffer()
618 lcs_get_buffer(struct lcs_channel *channel) in lcs_get_buffer() argument
624 spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); in lcs_get_buffer()
625 buffer = __lcs_get_buffer(channel); in lcs_get_buffer()
626 spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); in lcs_get_buffer()
634 __lcs_resume_channel(struct lcs_channel *channel) in __lcs_resume_channel() argument
638 if (channel->state != LCS_CH_STATE_SUSPENDED) in __lcs_resume_channel()
640 if (channel->ccws[channel->io_idx].flags & CCW_FLAG_SUSPEND) in __lcs_resume_channel()
642 LCS_DBF_TEXT_(5, trace, "rsch%s", dev_name(&channel->ccwdev->dev)); in __lcs_resume_channel()
643 rc = ccw_device_resume(channel->ccwdev); in __lcs_resume_channel()
646 dev_name(&channel->ccwdev->dev)); in __lcs_resume_channel()
647 dev_err(&channel->ccwdev->dev, in __lcs_resume_channel()
651 channel->state = LCS_CH_STATE_RUNNING; in __lcs_resume_channel()
660 __lcs_ready_buffer_bits(struct lcs_channel *channel, int index) in __lcs_ready_buffer_bits() argument
668 if (channel->ccws[next].flags & CCW_FLAG_SUSPEND) { in __lcs_ready_buffer_bits()
670 if (!(channel->ccws[prev].flags & CCW_FLAG_SUSPEND)) in __lcs_ready_buffer_bits()
672 channel->ccws[index].flags |= CCW_FLAG_PCI; in __lcs_ready_buffer_bits()
674 channel->ccws[index].flags &= ~CCW_FLAG_SUSPEND; in __lcs_ready_buffer_bits()
679 lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) in lcs_ready_buffer() argument
687 spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); in lcs_ready_buffer()
689 index = buffer - channel->iob; in lcs_ready_buffer()
691 channel->ccws[index].count = buffer->count; in lcs_ready_buffer()
693 __lcs_ready_buffer_bits(channel, index); in lcs_ready_buffer()
694 rc = __lcs_resume_channel(channel); in lcs_ready_buffer()
695 spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); in lcs_ready_buffer()
705 __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) in __lcs_processed_buffer() argument
712 index = buffer - channel->iob; in __lcs_processed_buffer()
716 channel->ccws[index].flags |= CCW_FLAG_SUSPEND; in __lcs_processed_buffer()
717 channel->ccws[index].flags &= ~CCW_FLAG_PCI; in __lcs_processed_buffer()
719 if (channel->iob[prev].state == LCS_BUF_STATE_READY) { in __lcs_processed_buffer()
726 __lcs_ready_buffer_bits(channel, prev); in __lcs_processed_buffer()
729 channel->ccws[next].flags &= ~CCW_FLAG_PCI; in __lcs_processed_buffer()
730 return __lcs_resume_channel(channel); in __lcs_processed_buffer()
737 lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) in lcs_release_buffer() argument
744 spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); in lcs_release_buffer()
746 spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); in lcs_release_buffer()
1391 struct lcs_channel *channel; in lcs_irq() local
1400 channel = &card->read; in lcs_irq()
1402 channel = &card->write; in lcs_irq()
1420 channel->state = LCS_CH_STATE_ERROR; in lcs_irq()
1423 if (channel->state == LCS_CH_STATE_ERROR) { in lcs_irq()
1429 if ((channel->state != LCS_CH_STATE_INIT) && in lcs_irq()
1433 - channel->ccws; in lcs_irq()
1438 while (channel->io_idx != index) { in lcs_irq()
1439 __lcs_processed_buffer(channel, in lcs_irq()
1440 channel->iob + channel->io_idx); in lcs_irq()
1441 channel->io_idx = in lcs_irq()
1442 (channel->io_idx + 1) & (LCS_NUM_BUFFS - 1); in lcs_irq()
1450 channel->state = LCS_CH_STATE_STOPPED; in lcs_irq()
1453 channel->state = LCS_CH_STATE_SUSPENDED; in lcs_irq()
1456 ccw_device_halt(channel->ccwdev, (addr_t) channel); in lcs_irq()
1460 channel->state = LCS_CH_STATE_HALTED; in lcs_irq()
1463 channel->state = LCS_CH_STATE_CLEARED; in lcs_irq()
1465 tasklet_schedule(&channel->irq_tasklet); in lcs_irq()
1475 struct lcs_channel *channel; in lcs_tasklet() local
1479 channel = (struct lcs_channel *) data; in lcs_tasklet()
1480 LCS_DBF_TEXT_(5, trace, "tlet%s", dev_name(&channel->ccwdev->dev)); in lcs_tasklet()
1483 iob = channel->iob; in lcs_tasklet()
1484 buf_idx = channel->buf_idx; in lcs_tasklet()
1488 iob[buf_idx].callback(channel, iob + buf_idx); in lcs_tasklet()
1491 channel->buf_idx = buf_idx; in lcs_tasklet()
1493 if (channel->state == LCS_CH_STATE_STOPPED) in lcs_tasklet()
1494 lcs_start_channel(channel); in lcs_tasklet()
1495 spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); in lcs_tasklet()
1496 if (channel->state == LCS_CH_STATE_SUSPENDED && in lcs_tasklet()
1497 channel->iob[channel->io_idx].state == LCS_BUF_STATE_READY) in lcs_tasklet()
1498 __lcs_resume_channel(channel); in lcs_tasklet()
1499 spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); in lcs_tasklet()
1502 wake_up(&channel->wait_q); in lcs_tasklet()
1523 lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer) in lcs_txbuffer_cb() argument
1529 lcs_release_buffer(channel, buffer); in lcs_txbuffer_cb()
1530 card = container_of(channel, struct lcs_card, write); in lcs_txbuffer_cb()
1812 lcs_get_frames_cb(struct lcs_channel *channel, struct lcs_buffer *buffer) in lcs_get_frames_cb() argument
1824 card = container_of(channel, struct lcs_card, read); in lcs_get_frames_cb()