Lines Matching +full:y +full:- +full:rp
1 // SPDX-License-Identifier: GPL-2.0
3 * IBM/3270 Driver - core functions.
55 unsigned char *ascebc; /* ascii -> ebcdic table */
65 /* raw3270->state */
72 /* raw3270->flags */
73 #define RAW3270_FLAGS_14BITADDR 0 /* 14-bit buffer addresses */
100 static void __raw3270_disconnect(struct raw3270 *rp);
116 static inline int raw3270_state_ready(struct raw3270 *rp) in raw3270_state_ready() argument
118 return rp->state == RAW3270_STATE_READY; in raw3270_state_ready()
121 void raw3270_buffer_address(struct raw3270 *rp, char *cp, int x, int y) in raw3270_buffer_address() argument
126 x = max_t(int, 0, rp->view->cols + x); in raw3270_buffer_address()
127 if (y < 0) in raw3270_buffer_address()
128 y = max_t(int, 0, rp->view->rows + y); in raw3270_buffer_address()
129 addr = (y * rp->view->cols) + x; in raw3270_buffer_address()
130 if (test_bit(RAW3270_FLAGS_14BITADDR, &rp->flags)) { in raw3270_buffer_address()
150 return ERR_PTR(-ENOMEM); in raw3270_request_alloc()
154 rq->buffer = kmalloc(size, GFP_KERNEL | GFP_DMA); in raw3270_request_alloc()
155 if (!rq->buffer) { in raw3270_request_alloc()
157 return ERR_PTR(-ENOMEM); in raw3270_request_alloc()
160 rq->size = size; in raw3270_request_alloc()
161 INIT_LIST_HEAD(&rq->list); in raw3270_request_alloc()
166 if (rq->buffer) in raw3270_request_alloc()
167 rq->ccw.cda = virt_to_dma32(rq->buffer); in raw3270_request_alloc()
168 rq->ccw.flags = CCW_FLAG_SLI; in raw3270_request_alloc()
179 kfree(rq->buffer); in raw3270_request_free()
189 if (WARN_ON_ONCE(!list_empty(&rq->list))) in raw3270_request_reset()
190 return -EBUSY; in raw3270_request_reset()
191 rq->ccw.cmd_code = 0; in raw3270_request_reset()
192 rq->ccw.count = 0; in raw3270_request_reset()
193 if (rq->buffer) in raw3270_request_reset()
194 rq->ccw.cda = virt_to_dma32(rq->buffer); in raw3270_request_reset()
195 rq->ccw.flags = CCW_FLAG_SLI; in raw3270_request_reset()
196 rq->rescnt = 0; in raw3270_request_reset()
197 rq->rc = 0; in raw3270_request_reset()
207 rq->ccw.cmd_code = cmd; in raw3270_request_set_cmd()
216 if (size + rq->ccw.count > rq->size) in raw3270_request_add_data()
217 return -E2BIG; in raw3270_request_add_data()
218 memcpy(rq->buffer + rq->ccw.count, data, size); in raw3270_request_add_data()
219 rq->ccw.count += size; in raw3270_request_add_data()
229 rq->ccw.cda = virt_to_dma32(data); in raw3270_request_set_data()
230 rq->ccw.count = size; in raw3270_request_set_data()
239 rq->ccw.cda = virt_to_dma32(ib->data); in raw3270_request_set_idal()
240 rq->ccw.count = ib->size; in raw3270_request_set_idal()
241 rq->ccw.flags |= CCW_FLAG_IDA; in raw3270_request_set_idal()
249 static int __raw3270_start(struct raw3270 *rp, struct raw3270_view *view, in __raw3270_start() argument
252 rq->view = view; in __raw3270_start()
254 if (list_empty(&rp->req_queue) && in __raw3270_start()
255 !test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) { in __raw3270_start()
257 rq->rc = ccw_device_start(rp->cdev, &rq->ccw, in __raw3270_start()
259 if (rq->rc) { in __raw3270_start()
261 return rq->rc; in __raw3270_start()
264 list_add_tail(&rq->list, &rp->req_queue); in __raw3270_start()
270 struct raw3270 *rp = view->dev; in raw3270_view_active() local
272 return rp && rp->view == view; in raw3270_view_active()
278 struct raw3270 *rp; in raw3270_start() local
281 spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start()
282 rp = view->dev; in raw3270_start()
283 if (!rp || rp->view != view) in raw3270_start()
284 rc = -EACCES; in raw3270_start()
285 else if (!raw3270_state_ready(rp)) in raw3270_start()
286 rc = -EBUSY; in raw3270_start()
288 rc = __raw3270_start(rp, view, rq); in raw3270_start()
289 spin_unlock_irqrestore(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start()
312 struct raw3270 *rp; in raw3270_start_locked() local
315 rp = view->dev; in raw3270_start_locked()
316 if (!rp || rp->view != view) in raw3270_start_locked()
317 rc = -EACCES; in raw3270_start_locked()
318 else if (!raw3270_state_ready(rp)) in raw3270_start_locked()
319 rc = -EBUSY; in raw3270_start_locked()
321 rc = __raw3270_start(rp, view, rq); in raw3270_start_locked()
328 struct raw3270 *rp; in raw3270_start_irq() local
330 rp = view->dev; in raw3270_start_irq()
331 rq->view = view; in raw3270_start_irq()
333 list_add_tail(&rq->list, &rp->req_queue); in raw3270_start_irq()
343 struct raw3270 *rp; in raw3270_irq() local
347 rp = dev_get_drvdata(&cdev->dev); in raw3270_irq()
348 if (!rp) in raw3270_irq()
351 view = rq ? rq->view : rp->view; in raw3270_irq()
354 /* Handle CE-DE-UE and subsequent UDE */ in raw3270_irq()
355 if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) in raw3270_irq()
356 clear_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
357 if (irb->scsw.cmd.dstat == (DEV_STAT_CHN_END | in raw3270_irq()
360 set_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
362 if ((irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) && in raw3270_irq()
363 (irb->ecw[0] & SNS0_INTERVENTION_REQ)) { in raw3270_irq()
364 set_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
365 if (rp->state > RAW3270_STATE_RESET) in raw3270_irq()
366 __raw3270_disconnect(rp); in raw3270_irq()
370 view->fn->intv(view, rq, irb); in raw3270_irq()
373 if (test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) in raw3270_irq()
377 if (rq && !list_empty(&rq->list)) { in raw3270_irq()
379 list_del_init(&rq->list); in raw3270_irq()
380 if (rq->callback) in raw3270_irq()
381 rq->callback(rq, rq->callback_data); in raw3270_irq()
390 while (!list_empty(&rp->req_queue)) { in raw3270_irq()
391 rq = list_entry(rp->req_queue.next, struct raw3270_request, list); in raw3270_irq()
392 rq->rc = ccw_device_start(rp->cdev, &rq->ccw, in raw3270_irq()
394 if (rq->rc == 0) in raw3270_irq()
397 list_del_init(&rq->list); in raw3270_irq()
398 if (rq->callback) in raw3270_irq()
399 rq->callback(rq, rq->callback_data); in raw3270_irq()
411 * required (3270 device switched to 'stand-by') and command
434 struct { /* Alternate Usable Area Self-Defining Parameter */
435 char l; /* Length of this Self-Defining Parm */
449 static void raw3270_size_device_vm(struct raw3270 *rp) in raw3270_size_device_vm() argument
456 ccw_device_get_id(rp->cdev, &dev_id); in raw3270_size_device_vm()
459 rp->model = 2; in raw3270_size_device_vm()
460 rp->rows = diag8c_data.height; in raw3270_size_device_vm()
461 rp->cols = diag8c_data.width; in raw3270_size_device_vm()
463 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags); in raw3270_size_device_vm()
476 rp->model = model; in raw3270_size_device_vm()
477 rp->rows = 24; in raw3270_size_device_vm()
478 rp->cols = 80; in raw3270_size_device_vm()
481 rp->model = model; in raw3270_size_device_vm()
482 rp->rows = 32; in raw3270_size_device_vm()
483 rp->cols = 80; in raw3270_size_device_vm()
486 rp->model = model; in raw3270_size_device_vm()
487 rp->rows = 43; in raw3270_size_device_vm()
488 rp->cols = 80; in raw3270_size_device_vm()
491 rp->model = model; in raw3270_size_device_vm()
492 rp->rows = 27; in raw3270_size_device_vm()
493 rp->cols = 132; in raw3270_size_device_vm()
498 static void raw3270_size_device(struct raw3270 *rp, char *init_data) in raw3270_size_device() argument
505 if (init_data[0] != 0x88 || uap->uab.qcode != 0x81) { in raw3270_size_device()
507 rp->model = 2; in raw3270_size_device()
508 rp->rows = 24; in raw3270_size_device()
509 rp->cols = 80; in raw3270_size_device()
513 rp->rows = uap->uab.h; in raw3270_size_device()
514 rp->cols = uap->uab.w; in raw3270_size_device()
516 if ((uap->uab.flags0 & 0x0d) == 0x01) in raw3270_size_device()
517 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags); in raw3270_size_device()
519 if (uap->uab.l == sizeof(struct raw3270_ua) && in raw3270_size_device()
520 uap->aua.sdpid == 0x02) { in raw3270_size_device()
521 rp->rows = uap->aua.hauai; in raw3270_size_device()
522 rp->cols = uap->aua.wauai; in raw3270_size_device()
525 rp->model = 0; in raw3270_size_device()
526 if (rp->rows == 24 && rp->cols == 80) in raw3270_size_device()
527 rp->model = 2; in raw3270_size_device()
528 if (rp->rows == 32 && rp->cols == 80) in raw3270_size_device()
529 rp->model = 3; in raw3270_size_device()
530 if (rp->rows == 43 && rp->cols == 80) in raw3270_size_device()
531 rp->model = 4; in raw3270_size_device()
532 if (rp->rows == 27 && rp->cols == 132) in raw3270_size_device()
533 rp->model = 5; in raw3270_size_device()
538 struct raw3270 *rp = container_of(work, struct raw3270, resize_work); in raw3270_resize_work() local
542 list_for_each_entry(view, &rp->view_list, list) { in raw3270_resize_work()
543 if (view->fn->resize) in raw3270_resize_work()
544 view->fn->resize(view, rp->model, rp->rows, rp->cols, in raw3270_resize_work()
545 rp->old_model, rp->old_rows, rp->old_cols); in raw3270_resize_work()
547 rp->old_cols = rp->cols; in raw3270_resize_work()
548 rp->old_rows = rp->rows; in raw3270_resize_work()
549 rp->old_model = rp->model; in raw3270_resize_work()
551 list_for_each_entry(view, &rp->view_list, list) { in raw3270_resize_work()
552 rp->view = view; in raw3270_resize_work()
553 if (view->fn->activate(view) == 0) in raw3270_resize_work()
555 rp->view = NULL; in raw3270_resize_work()
559 static void raw3270_size_device_done(struct raw3270 *rp) in raw3270_size_device_done() argument
561 rp->view = NULL; in raw3270_size_device_done()
562 rp->state = RAW3270_STATE_READY; in raw3270_size_device_done()
563 schedule_work(&rp->resize_work); in raw3270_size_device_done()
568 struct raw3270 *rp = rq->view->dev; in raw3270_read_modified_cb() local
570 raw3270_size_device(rp, data); in raw3270_read_modified_cb()
571 raw3270_size_device_done(rp); in raw3270_read_modified_cb()
575 static void raw3270_read_modified(struct raw3270 *rp) in raw3270_read_modified() argument
577 if (rp->state != RAW3270_STATE_W4ATTN) in raw3270_read_modified()
580 memset(&rp->init_readmod, 0, sizeof(rp->init_readmod)); in raw3270_read_modified()
581 memset(&rp->init_data, 0, sizeof(rp->init_data)); in raw3270_read_modified()
582 rp->init_readmod.ccw.cmd_code = TC_READMOD; in raw3270_read_modified()
583 rp->init_readmod.ccw.flags = CCW_FLAG_SLI; in raw3270_read_modified()
584 rp->init_readmod.ccw.count = sizeof(rp->init_data); in raw3270_read_modified()
585 rp->init_readmod.ccw.cda = virt_to_dma32(rp->init_data); in raw3270_read_modified()
586 rp->init_readmod.callback = raw3270_read_modified_cb; in raw3270_read_modified()
587 rp->init_readmod.callback_data = rp->init_data; in raw3270_read_modified()
588 rp->state = RAW3270_STATE_READMOD; in raw3270_read_modified()
589 raw3270_start_irq(&rp->init_view, &rp->init_readmod); in raw3270_read_modified()
592 static void raw3270_writesf_readpart(struct raw3270 *rp) in raw3270_writesf_readpart() argument
599 memset(&rp->init_readpart, 0, sizeof(rp->init_readpart)); in raw3270_writesf_readpart()
600 memset(&rp->init_data, 0, sizeof(rp->init_data)); in raw3270_writesf_readpart()
601 memcpy(&rp->init_data, wbuf, sizeof(wbuf)); in raw3270_writesf_readpart()
602 rp->init_readpart.ccw.cmd_code = TC_WRITESF; in raw3270_writesf_readpart()
603 rp->init_readpart.ccw.flags = CCW_FLAG_SLI; in raw3270_writesf_readpart()
604 rp->init_readpart.ccw.count = sizeof(wbuf); in raw3270_writesf_readpart()
605 rp->init_readpart.ccw.cda = virt_to_dma32(&rp->init_data); in raw3270_writesf_readpart()
606 rp->state = RAW3270_STATE_W4ATTN; in raw3270_writesf_readpart()
607 raw3270_start_irq(&rp->init_view, &rp->init_readpart); in raw3270_writesf_readpart()
615 struct raw3270 *rp = rq->view->dev; in raw3270_reset_device_cb() local
617 if (rp->state != RAW3270_STATE_RESET) in raw3270_reset_device_cb()
619 if (rq->rc) { in raw3270_reset_device_cb()
621 rp->state = RAW3270_STATE_INIT; in raw3270_reset_device_cb()
623 raw3270_size_device_vm(rp); in raw3270_reset_device_cb()
624 raw3270_size_device_done(rp); in raw3270_reset_device_cb()
626 raw3270_writesf_readpart(rp); in raw3270_reset_device_cb()
628 memset(&rp->init_reset, 0, sizeof(rp->init_reset)); in raw3270_reset_device_cb()
631 static int __raw3270_reset_device(struct raw3270 *rp) in __raw3270_reset_device() argument
636 if (rp->init_reset.view) in __raw3270_reset_device()
637 return -EBUSY; in __raw3270_reset_device()
639 rp->init_data[0] = TW_KR; in __raw3270_reset_device()
640 rp->init_reset.ccw.cmd_code = TC_EWRITEA; in __raw3270_reset_device()
641 rp->init_reset.ccw.flags = CCW_FLAG_SLI; in __raw3270_reset_device()
642 rp->init_reset.ccw.count = 1; in __raw3270_reset_device()
643 rp->init_reset.ccw.cda = virt_to_dma32(rp->init_data); in __raw3270_reset_device()
644 rp->init_reset.callback = raw3270_reset_device_cb; in __raw3270_reset_device()
645 rc = __raw3270_start(rp, &rp->init_view, &rp->init_reset); in __raw3270_reset_device()
646 if (rc == 0 && rp->state == RAW3270_STATE_INIT) in __raw3270_reset_device()
647 rp->state = RAW3270_STATE_RESET; in __raw3270_reset_device()
651 static int raw3270_reset_device(struct raw3270 *rp) in raw3270_reset_device() argument
656 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_reset_device()
657 rc = __raw3270_reset_device(rp); in raw3270_reset_device()
658 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_reset_device()
664 struct raw3270 *rp; in raw3270_reset() local
667 rp = view->dev; in raw3270_reset()
668 if (!rp || rp->view != view) in raw3270_reset()
669 rc = -EACCES; in raw3270_reset()
670 else if (!raw3270_state_ready(rp)) in raw3270_reset()
671 rc = -EBUSY; in raw3270_reset()
673 rc = raw3270_reset_device(view->dev); in raw3270_reset()
678 static void __raw3270_disconnect(struct raw3270 *rp) in __raw3270_disconnect() argument
683 rp->state = RAW3270_STATE_INIT; in __raw3270_disconnect()
684 rp->view = &rp->init_view; in __raw3270_disconnect()
686 while (!list_empty(&rp->req_queue)) { in __raw3270_disconnect()
687 rq = list_entry(rp->req_queue.next, struct raw3270_request, list); in __raw3270_disconnect()
688 view = rq->view; in __raw3270_disconnect()
689 rq->rc = -EACCES; in __raw3270_disconnect()
690 list_del_init(&rq->list); in __raw3270_disconnect()
691 if (rq->callback) in __raw3270_disconnect()
692 rq->callback(rq, rq->callback_data); in __raw3270_disconnect()
696 __raw3270_reset_device(rp); in __raw3270_disconnect()
702 struct raw3270 *rp; in raw3270_init_irq() local
705 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) { in raw3270_init_irq()
706 if (irb->ecw[0] & SNS0_CMD_REJECT) in raw3270_init_irq()
707 rq->rc = -EOPNOTSUPP; in raw3270_init_irq()
709 rq->rc = -EIO; in raw3270_init_irq()
712 if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) { in raw3270_init_irq()
714 rp = view->dev; in raw3270_init_irq()
715 raw3270_read_modified(rp); in raw3270_init_irq()
726 static int raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, in raw3270_setup_device() argument
733 memset(rp, 0, sizeof(struct raw3270)); in raw3270_setup_device()
734 /* Copy ebcdic -> ascii translation table. */ in raw3270_setup_device()
742 rp->ascebc = ascebc; in raw3270_setup_device()
745 rp->rows = 24; in raw3270_setup_device()
746 rp->cols = 80; in raw3270_setup_device()
747 rp->old_rows = rp->rows; in raw3270_setup_device()
748 rp->old_cols = rp->cols; in raw3270_setup_device()
750 INIT_LIST_HEAD(&rp->req_queue); in raw3270_setup_device()
751 INIT_LIST_HEAD(&rp->view_list); in raw3270_setup_device()
753 rp->init_view.dev = rp; in raw3270_setup_device()
754 rp->init_view.fn = &raw3270_init_fn; in raw3270_setup_device()
755 rp->view = &rp->init_view; in raw3270_setup_device()
756 INIT_WORK(&rp->resize_work, raw3270_resize_work); in raw3270_setup_device()
766 rp->minor = -1; in raw3270_setup_device()
769 if (tmp->minor > minor) { in raw3270_setup_device()
770 rp->minor = minor; in raw3270_setup_device()
771 __list_add(&rp->list, l->prev, l); in raw3270_setup_device()
776 if (rp->minor == -1 && minor < RAW3270_MAXDEVS + RAW3270_FIRSTMINOR) { in raw3270_setup_device()
777 rp->minor = minor; in raw3270_setup_device()
778 list_add_tail(&rp->list, &raw3270_devices); in raw3270_setup_device()
782 if (rp->minor == -1) in raw3270_setup_device()
783 return -EUSERS; in raw3270_setup_device()
784 rp->cdev = cdev; in raw3270_setup_device()
785 dev_set_drvdata(&cdev->dev, rp); in raw3270_setup_device()
786 cdev->handler = raw3270_irq; in raw3270_setup_device()
791 /* Tentative definition - see below for actual definition. */
794 static inline int raw3270_state_final(struct raw3270 *rp) in raw3270_state_final() argument
796 return rp->state == RAW3270_STATE_INIT || in raw3270_state_final()
797 rp->state == RAW3270_STATE_READY; in raw3270_state_final()
807 struct raw3270 *rp; in raw3270_setup_console() local
815 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA); in raw3270_setup_console()
817 rc = raw3270_setup_device(cdev, rp, ascebc); in raw3270_setup_console()
820 set_bit(RAW3270_FLAGS_CONSOLE, &rp->flags); in raw3270_setup_console()
828 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_setup_console()
830 __raw3270_reset_device(rp); in raw3270_setup_console()
831 while (!raw3270_state_final(rp)) { in raw3270_setup_console()
832 ccw_device_wait_idle(rp->cdev); in raw3270_setup_console()
835 } while (rp->state != RAW3270_STATE_READY); in raw3270_setup_console()
836 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_setup_console()
837 return rp; in raw3270_setup_console()
840 void raw3270_wait_cons_dev(struct raw3270 *rp) in raw3270_wait_cons_dev() argument
844 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_wait_cons_dev()
845 ccw_device_wait_idle(rp->cdev); in raw3270_wait_cons_dev()
846 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_wait_cons_dev()
856 struct raw3270 *rp; in raw3270_create_device() local
860 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA); in raw3270_create_device()
861 if (!rp) in raw3270_create_device()
862 return ERR_PTR(-ENOMEM); in raw3270_create_device()
865 kfree(rp); in raw3270_create_device()
866 return ERR_PTR(-ENOMEM); in raw3270_create_device()
868 rc = raw3270_setup_device(cdev, rp, ascebc); in raw3270_create_device()
870 kfree(rp->ascebc); in raw3270_create_device()
871 kfree(rp); in raw3270_create_device()
872 rp = ERR_PTR(rc); in raw3270_create_device()
875 get_device(&cdev->dev); in raw3270_create_device()
876 return rp; in raw3270_create_device()
885 struct raw3270 *rp = view->dev; in raw3270_view_lock_unavailable() local
887 if (!rp) in raw3270_view_lock_unavailable()
888 return -ENODEV; in raw3270_view_lock_unavailable()
889 if (spin_is_locked(get_ccwdev_lock(rp->cdev))) in raw3270_view_lock_unavailable()
890 return -EBUSY; in raw3270_view_lock_unavailable()
894 static int raw3270_assign_activate_view(struct raw3270 *rp, struct raw3270_view *view) in raw3270_assign_activate_view() argument
896 rp->view = view; in raw3270_assign_activate_view()
897 return view->fn->activate(view); in raw3270_assign_activate_view()
900 static int __raw3270_activate_view(struct raw3270 *rp, struct raw3270_view *view) in __raw3270_activate_view() argument
905 if (rp->view == view) in __raw3270_activate_view()
908 if (!raw3270_state_ready(rp)) in __raw3270_activate_view()
909 return -EBUSY; in __raw3270_activate_view()
911 if (rp->view && rp->view->fn->deactivate) { in __raw3270_activate_view()
912 oldview = rp->view; in __raw3270_activate_view()
913 oldview->fn->deactivate(oldview); in __raw3270_activate_view()
916 rc = raw3270_assign_activate_view(rp, view); in __raw3270_activate_view()
922 rc = raw3270_assign_activate_view(rp, oldview); in __raw3270_activate_view()
928 list_for_each_entry(nv, &rp->view_list, list) { in __raw3270_activate_view()
931 rc = raw3270_assign_activate_view(rp, nv); in __raw3270_activate_view()
934 rp->view = NULL; in __raw3270_activate_view()
944 struct raw3270 *rp; in raw3270_activate_view() local
948 rp = view->dev; in raw3270_activate_view()
949 if (!rp) in raw3270_activate_view()
950 return -ENODEV; in raw3270_activate_view()
951 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_activate_view()
952 rc = __raw3270_activate_view(rp, view); in raw3270_activate_view()
953 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_activate_view()
964 struct raw3270 *rp; in raw3270_deactivate_view() local
966 rp = view->dev; in raw3270_deactivate_view()
967 if (!rp) in raw3270_deactivate_view()
969 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_deactivate_view()
970 if (rp->view == view) { in raw3270_deactivate_view()
971 view->fn->deactivate(view); in raw3270_deactivate_view()
972 rp->view = NULL; in raw3270_deactivate_view()
974 list_del_init(&view->list); in raw3270_deactivate_view()
975 list_add_tail(&view->list, &rp->view_list); in raw3270_deactivate_view()
977 if (raw3270_state_ready(rp)) { in raw3270_deactivate_view()
978 list_for_each_entry(view, &rp->view_list, list) { in raw3270_deactivate_view()
979 rp->view = view; in raw3270_deactivate_view()
980 if (view->fn->activate(view) == 0) in raw3270_deactivate_view()
982 rp->view = NULL; in raw3270_deactivate_view()
986 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_deactivate_view()
997 struct raw3270 *rp; in raw3270_add_view() local
1001 return -ENODEV; in raw3270_add_view()
1003 rc = -ENODEV; in raw3270_add_view()
1004 list_for_each_entry(rp, &raw3270_devices, list) { in raw3270_add_view()
1005 if (rp->minor != minor) in raw3270_add_view()
1007 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_add_view()
1008 atomic_set(&view->ref_count, 2); in raw3270_add_view()
1009 view->dev = rp; in raw3270_add_view()
1010 view->fn = fn; in raw3270_add_view()
1011 view->model = rp->model; in raw3270_add_view()
1012 view->rows = rp->rows; in raw3270_add_view()
1013 view->cols = rp->cols; in raw3270_add_view()
1014 view->ascebc = rp->ascebc; in raw3270_add_view()
1015 spin_lock_init(&view->lock); in raw3270_add_view()
1016 lockdep_set_subclass(&view->lock, subclass); in raw3270_add_view()
1017 list_add(&view->list, &rp->view_list); in raw3270_add_view()
1019 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_add_view()
1032 struct raw3270 *rp; in raw3270_find_view() local
1037 view = ERR_PTR(-ENODEV); in raw3270_find_view()
1038 list_for_each_entry(rp, &raw3270_devices, list) { in raw3270_find_view()
1039 if (rp->minor != minor) in raw3270_find_view()
1041 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_find_view()
1042 list_for_each_entry(tmp, &rp->view_list, list) { in raw3270_find_view()
1043 if (tmp->fn == fn) { in raw3270_find_view()
1049 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_find_view()
1058 * Remove view from device and free view structure via call to view->fn->free.
1063 struct raw3270 *rp; in raw3270_del_view() local
1066 rp = view->dev; in raw3270_del_view()
1067 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_del_view()
1068 if (rp->view == view) { in raw3270_del_view()
1069 view->fn->deactivate(view); in raw3270_del_view()
1070 rp->view = NULL; in raw3270_del_view()
1072 list_del_init(&view->list); in raw3270_del_view()
1073 if (!rp->view && raw3270_state_ready(rp)) { in raw3270_del_view()
1075 list_for_each_entry(nv, &rp->view_list, list) { in raw3270_del_view()
1076 if (nv->fn->activate(nv) == 0) { in raw3270_del_view()
1077 rp->view = nv; in raw3270_del_view()
1082 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_del_view()
1084 atomic_dec(&view->ref_count); in raw3270_del_view()
1085 wait_event(raw3270_wait_queue, atomic_read(&view->ref_count) == 0); in raw3270_del_view()
1086 if (view->fn->free) in raw3270_del_view()
1087 view->fn->free(view); in raw3270_del_view()
1094 static void raw3270_delete_device(struct raw3270 *rp) in raw3270_delete_device() argument
1100 list_del_init(&rp->list); in raw3270_delete_device()
1104 cdev = rp->cdev; in raw3270_delete_device()
1105 rp->cdev = NULL; in raw3270_delete_device()
1106 dev_set_drvdata(&cdev->dev, NULL); in raw3270_delete_device()
1107 cdev->handler = NULL; in raw3270_delete_device()
1110 put_device(&cdev->dev); in raw3270_delete_device()
1113 kfree(rp->ascebc); in raw3270_delete_device()
1114 kfree(rp); in raw3270_delete_device()
1129 ((struct raw3270 *)dev_get_drvdata(dev))->model); in model_show()
1137 ((struct raw3270 *)dev_get_drvdata(dev))->rows); in rows_show()
1146 ((struct raw3270 *)dev_get_drvdata(dev))->cols); in columns_show()
1161 static int raw3270_create_attributes(struct raw3270 *rp) in raw3270_create_attributes() argument
1163 return sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group); in raw3270_create_attributes()
1173 struct raw3270 *rp; in raw3270_register_notifier() local
1176 list_add_tail(¬ifier->list, &raw3270_notifier); in raw3270_register_notifier()
1177 list_for_each_entry(rp, &raw3270_devices, list) in raw3270_register_notifier()
1178 notifier->create(rp->minor); in raw3270_register_notifier()
1186 struct raw3270 *rp; in raw3270_unregister_notifier() local
1189 list_for_each_entry(rp, &raw3270_devices, list) in raw3270_unregister_notifier()
1190 notifier->destroy(rp->minor); in raw3270_unregister_notifier()
1191 list_del(¬ifier->list); in raw3270_unregister_notifier()
1202 struct raw3270 *rp; in raw3270_set_online() local
1205 rp = raw3270_create_device(cdev); in raw3270_set_online()
1206 if (IS_ERR(rp)) in raw3270_set_online()
1207 return PTR_ERR(rp); in raw3270_set_online()
1208 rc = raw3270_create_attributes(rp); in raw3270_set_online()
1211 raw3270_reset_device(rp); in raw3270_set_online()
1214 np->create(rp->minor); in raw3270_set_online()
1219 raw3270_delete_device(rp); in raw3270_set_online()
1229 struct raw3270 *rp; in raw3270_remove() local
1233 rp = dev_get_drvdata(&cdev->dev); in raw3270_remove()
1236 * should set up rp. raw3270_remove gets entered for in raw3270_remove()
1238 * Thus, rp may validly be NULL here. in raw3270_remove()
1240 if (!rp) in raw3270_remove()
1243 sysfs_remove_group(&cdev->dev.kobj, &raw3270_attr_group); in raw3270_remove()
1247 if (rp->view) { in raw3270_remove()
1248 if (rp->view->fn->deactivate) in raw3270_remove()
1249 rp->view->fn->deactivate(rp->view); in raw3270_remove()
1250 rp->view = NULL; in raw3270_remove()
1252 while (!list_empty(&rp->view_list)) { in raw3270_remove()
1253 v = list_entry(rp->view_list.next, struct raw3270_view, list); in raw3270_remove()
1254 if (v->fn->release) in raw3270_remove()
1255 v->fn->release(v); in raw3270_remove()
1264 np->destroy(rp->minor); in raw3270_remove()
1268 raw3270_reset_device(rp); in raw3270_remove()
1270 raw3270_delete_device(rp); in raw3270_remove()
1278 struct raw3270 *rp; in raw3270_set_offline() local
1280 rp = dev_get_drvdata(&cdev->dev); in raw3270_set_offline()
1281 if (test_bit(RAW3270_FLAGS_CONSOLE, &rp->flags)) in raw3270_set_offline()
1282 return -EBUSY; in raw3270_set_offline()
1317 struct raw3270 *rp; in raw3270_init() local
1331 list_for_each_entry(rp, &raw3270_devices, list) { in raw3270_init()
1332 get_device(&rp->cdev->dev); in raw3270_init()
1333 raw3270_create_attributes(rp); in raw3270_init()
1345 MODULE_DESCRIPTION("IBM/3270 Driver - core functions");