Lines Matching +full:activate +full:- +full:to +full:- +full:activate

2  * IBM/3270 Driver - core functions.
48 unsigned char *ascebc; /* ascii -> ebcdic table */
49 struct device *clttydev; /* 3270-class tty device ptr */
50 struct device *cltubdev; /* 3270-class tub device ptr */
56 /* raw3270->flags */
57 #define RAW3270_FLAGS_14BITADDR 0 /* 14-bit buffer addresses */
64 /* Semaphore to protect global data of raw3270 (devices, views, etc). */
71 * Flag to indicate if the driver has been registered. Some operations
72 * like waiting for the end of i/o need to be done differently as long
103 if (test_bit(RAW3270_FLAGS_14BITADDR, &rp->flags)) { in raw3270_buffer_address()
123 return ERR_PTR(-ENOMEM); in raw3270_request_alloc()
127 rq->buffer = kmalloc(size, GFP_KERNEL | GFP_DMA); in raw3270_request_alloc()
128 if (!rq->buffer) { in raw3270_request_alloc()
130 return ERR_PTR(-ENOMEM); in raw3270_request_alloc()
133 rq->size = size; in raw3270_request_alloc()
134 INIT_LIST_HEAD(&rq->list); in raw3270_request_alloc()
139 rq->ccw.cda = __pa(rq->buffer); in raw3270_request_alloc()
140 rq->ccw.flags = CCW_FLAG_SLI; in raw3270_request_alloc()
151 kfree(rq->buffer); in raw3270_request_free()
156 * Reset request to initial state.
161 BUG_ON(!list_empty(&rq->list)); in raw3270_request_reset()
162 rq->ccw.cmd_code = 0; in raw3270_request_reset()
163 rq->ccw.count = 0; in raw3270_request_reset()
164 rq->ccw.cda = __pa(rq->buffer); in raw3270_request_reset()
165 rq->ccw.flags = CCW_FLAG_SLI; in raw3270_request_reset()
166 rq->rescnt = 0; in raw3270_request_reset()
167 rq->rc = 0; in raw3270_request_reset()
171 * Set command code to ccw of a request.
176 rq->ccw.cmd_code = cmd; in raw3270_request_set_cmd()
180 * Add data fragment to output buffer.
185 if (size + rq->ccw.count > rq->size) in raw3270_request_add_data()
186 return -E2BIG; in raw3270_request_add_data()
187 memcpy(rq->buffer + rq->ccw.count, data, size); in raw3270_request_add_data()
188 rq->ccw.count += size; in raw3270_request_add_data()
193 * Set address/length pair to ccw of a request.
198 rq->ccw.cda = __pa(data); in raw3270_request_set_data()
199 rq->ccw.count = size; in raw3270_request_set_data()
203 * Set idal buffer to ccw of a request.
208 rq->ccw.cda = __pa(ib->data); in raw3270_request_set_idal()
209 rq->ccw.count = ib->size; in raw3270_request_set_idal()
210 rq->ccw.flags |= CCW_FLAG_IDA; in raw3270_request_set_idal()
227 rc = ccw_device_halt(rp->cdev, (long) rq); in raw3270_halt_io_nolock()
229 rc = ccw_device_clear(rp->cdev, (long) rq); in raw3270_halt_io_nolock()
242 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_halt_io()
244 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_halt_io()
249 * Add the request to the request queue, try to start it if the
256 rq->view = view; in __raw3270_start()
258 if (list_empty(&rp->req_queue) && in __raw3270_start()
259 !test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) { in __raw3270_start()
261 rq->rc = ccw_device_start(rp->cdev, &rq->ccw, in __raw3270_start()
263 if (rq->rc) { in __raw3270_start()
265 return rq->rc; in __raw3270_start()
268 list_add_tail(&rq->list, &rp->req_queue); in __raw3270_start()
279 spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start()
280 rp = view->dev; in raw3270_start()
281 if (!rp || rp->view != view || in raw3270_start()
282 test_bit(RAW3270_FLAGS_FROZEN, &rp->flags)) in raw3270_start()
283 rc = -EACCES; in raw3270_start()
284 else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags)) in raw3270_start()
285 rc = -ENODEV; in raw3270_start()
288 spin_unlock_irqrestore(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start()
298 rp = view->dev; in raw3270_start_locked()
299 if (!rp || rp->view != view || in raw3270_start_locked()
300 test_bit(RAW3270_FLAGS_FROZEN, &rp->flags)) in raw3270_start_locked()
301 rc = -EACCES; in raw3270_start_locked()
302 else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags)) in raw3270_start_locked()
303 rc = -ENODEV; in raw3270_start_locked()
314 rp = view->dev; in raw3270_start_irq()
315 rq->view = view; in raw3270_start_irq()
317 list_add_tail(&rq->list, &rp->req_queue); in raw3270_start_irq()
332 rp = dev_get_drvdata(&cdev->dev); in raw3270_irq()
336 view = rq ? rq->view : rp->view; in raw3270_irq()
340 else if (irb->scsw.cmd.fctl & SCSW_FCTL_HALT_FUNC) { in raw3270_irq()
341 rq->rc = -EIO; in raw3270_irq()
343 } else if (irb->scsw.cmd.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END | in raw3270_irq()
345 /* Handle CE-DE-UE and subsequent UDE */ in raw3270_irq()
346 set_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
348 } else if (test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) { in raw3270_irq()
350 if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) { in raw3270_irq()
351 clear_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
357 rc = view->fn->intv(view, rq, irb); in raw3270_irq()
366 * Intervention required by the operator. We have to wait in raw3270_irq()
373 rq->rc = ccw_device_start(rp->cdev, &rq->ccw, in raw3270_irq()
375 if (rq->rc == 0) in raw3270_irq()
382 rq->rc = -EIO; in raw3270_irq()
388 BUG_ON(list_empty(&rq->list)); in raw3270_irq()
390 list_del_init(&rq->list); in raw3270_irq()
391 if (rq->callback) in raw3270_irq()
392 rq->callback(rq, rq->callback_data); in raw3270_irq()
397 * Try to start each request on request queue until one is in raw3270_irq()
400 while (!list_empty(&rp->req_queue)) { in raw3270_irq()
401 rq = list_entry(rp->req_queue.next,struct raw3270_request,list); in raw3270_irq()
402 rq->rc = ccw_device_start(rp->cdev, &rq->ccw, in raw3270_irq()
404 if (rq->rc == 0) in raw3270_irq()
407 list_del_init(&rq->list); in raw3270_irq()
408 if (rq->callback) in raw3270_irq()
409 rq->callback(rq, rq->callback_data); in raw3270_irq()
439 struct { /* Alternate Usable Area Self-Defining Parameter */
440 char l; /* Length of this Self-Defining Parm */
462 * Unit-Check Processing: in raw3270_init_irq()
465 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) { in raw3270_init_irq()
467 if (irb->ecw[0] & SNS0_INTERVENTION_REQ) { in raw3270_init_irq()
468 set_bit(RAW3270_FLAGS_BUSY, &view->dev->flags); in raw3270_init_irq()
473 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) { in raw3270_init_irq()
474 if (irb->ecw[0] & SNS0_CMD_REJECT) in raw3270_init_irq()
475 rq->rc = -EOPNOTSUPP; in raw3270_init_irq()
477 rq->rc = -EIO; in raw3270_init_irq()
480 rq->rescnt = irb->scsw.cmd.count; in raw3270_init_irq()
482 if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) { in raw3270_init_irq()
483 set_bit(RAW3270_FLAGS_ATTN, &view->dev->flags); in raw3270_init_irq()
521 spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start_init()
522 rq->callback = NULL; in raw3270_start_init()
529 spin_unlock_irqrestore(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start_init()
530 return rq->rc; in raw3270_start_init()
533 rq->callback = raw3270_wake_init; in raw3270_start_init()
534 rq->callback_data = &raw3270_wait_queue; in raw3270_start_init()
535 spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start_init()
537 spin_unlock_irqrestore(get_ccwdev_lock(view->dev->cdev), flags); in raw3270_start_init()
543 if (rc == -ERESTARTSYS) { /* Interrupted by a signal. */ in raw3270_start_init()
544 raw3270_halt_io(view->dev, rq); in raw3270_start_init()
545 /* No wait for the halt to complete. */ in raw3270_start_init()
547 return -ERESTARTSYS; in raw3270_start_init()
549 return rq->rc; in raw3270_start_init()
558 ccw_device_get_id(rp->cdev, &dev_id); in __raw3270_size_device_vm()
567 rp->model = model; in __raw3270_size_device_vm()
568 rp->rows = 24; in __raw3270_size_device_vm()
569 rp->cols = 80; in __raw3270_size_device_vm()
572 rp->model = model; in __raw3270_size_device_vm()
573 rp->rows = 32; in __raw3270_size_device_vm()
574 rp->cols = 80; in __raw3270_size_device_vm()
577 rp->model = model; in __raw3270_size_device_vm()
578 rp->rows = 43; in __raw3270_size_device_vm()
579 rp->cols = 80; in __raw3270_size_device_vm()
582 rp->model = model; in __raw3270_size_device_vm()
583 rp->rows = 27; in __raw3270_size_device_vm()
584 rp->cols = 132; in __raw3270_size_device_vm()
587 rc = -EOPNOTSUPP; in __raw3270_size_device_vm()
602 * To determine the size of the 3270 device we need to do: in __raw3270_size_device()
603 * 1) send a 'read partition' data stream to the device in __raw3270_size_device()
605 * 3) do a read modified to get the query reply in __raw3270_size_device()
606 * To make things worse we have to cope with intervention in __raw3270_size_device()
607 * required (3270 device switched to 'stand-by') and command in __raw3270_size_device()
610 memset(&rp->init_request, 0, sizeof(rp->init_request)); in __raw3270_size_device()
611 memset(&rp->init_data, 0, 256); in __raw3270_size_device()
612 /* Store 'read partition' data stream to init_data */ in __raw3270_size_device()
613 memcpy(&rp->init_data, wbuf, sizeof(wbuf)); in __raw3270_size_device()
614 INIT_LIST_HEAD(&rp->init_request.list); in __raw3270_size_device()
615 rp->init_request.ccw.cmd_code = TC_WRITESF; in __raw3270_size_device()
616 rp->init_request.ccw.flags = CCW_FLAG_SLI; in __raw3270_size_device()
617 rp->init_request.ccw.count = sizeof(wbuf); in __raw3270_size_device()
618 rp->init_request.ccw.cda = (__u32) __pa(&rp->init_data); in __raw3270_size_device()
620 rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); in __raw3270_size_device()
622 /* Check error cases: -ERESTARTSYS, -EIO and -EOPNOTSUPP */ in __raw3270_size_device()
630 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in __raw3270_size_device()
631 while (!test_and_clear_bit(RAW3270_FLAGS_ATTN, &rp->flags)) in __raw3270_size_device()
633 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in __raw3270_size_device()
637 test_and_clear_bit(RAW3270_FLAGS_ATTN, &rp->flags)); in __raw3270_size_device()
645 rp->init_request.ccw.cmd_code = TC_READMOD; in __raw3270_size_device()
646 rp->init_request.ccw.flags = CCW_FLAG_SLI; in __raw3270_size_device()
647 rp->init_request.ccw.count = sizeof(rp->init_data); in __raw3270_size_device()
648 rp->init_request.ccw.cda = (__u32) __pa(rp->init_data); in __raw3270_size_device()
649 rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); in __raw3270_size_device()
653 uap = (struct raw3270_ua *) (rp->init_data + 1); in __raw3270_size_device()
655 if (rp->init_data[0] != 0x88 || uap->uab.qcode != 0x81) in __raw3270_size_device()
656 return -EOPNOTSUPP; in __raw3270_size_device()
658 rp->rows = uap->uab.h; in __raw3270_size_device()
659 rp->cols = uap->uab.w; in __raw3270_size_device()
661 if ((uap->uab.flags0 & 0x0d) == 0x01) in __raw3270_size_device()
662 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags); in __raw3270_size_device()
664 if (uap->uab.l == sizeof(struct raw3270_ua) && in __raw3270_size_device()
665 uap->aua.sdpid == 0x02) { in __raw3270_size_device()
666 rp->rows = uap->aua.hauai; in __raw3270_size_device()
667 rp->cols = uap->aua.wauai; in __raw3270_size_device()
678 rp->view = &raw3270_init_view; in raw3270_size_device()
685 rp->view = NULL; in raw3270_size_device()
688 /* Try to find a model. */ in raw3270_size_device()
689 rp->model = 0; in raw3270_size_device()
690 if (rp->rows == 24 && rp->cols == 80) in raw3270_size_device()
691 rp->model = 2; in raw3270_size_device()
692 if (rp->rows == 32 && rp->cols == 80) in raw3270_size_device()
693 rp->model = 3; in raw3270_size_device()
694 if (rp->rows == 43 && rp->cols == 80) in raw3270_size_device()
695 rp->model = 4; in raw3270_size_device()
696 if (rp->rows == 27 && rp->cols == 132) in raw3270_size_device()
697 rp->model = 5; in raw3270_size_device()
700 rp->model = 2; in raw3270_size_device()
701 rp->rows = 24; in raw3270_size_device()
702 rp->cols = 80; in raw3270_size_device()
714 memset(&rp->init_request, 0, sizeof(rp->init_request)); in raw3270_reset_device()
715 memset(&rp->init_data, 0, sizeof(rp->init_data)); in raw3270_reset_device()
716 /* Store reset data stream to init_data/init_request */ in raw3270_reset_device()
717 rp->init_data[0] = TW_KR; in raw3270_reset_device()
718 INIT_LIST_HEAD(&rp->init_request.list); in raw3270_reset_device()
719 rp->init_request.ccw.cmd_code = TC_EWRITEA; in raw3270_reset_device()
720 rp->init_request.ccw.flags = CCW_FLAG_SLI; in raw3270_reset_device()
721 rp->init_request.ccw.count = 1; in raw3270_reset_device()
722 rp->init_request.ccw.cda = (__u32) __pa(rp->init_data); in raw3270_reset_device()
723 rp->view = &raw3270_init_view; in raw3270_reset_device()
725 rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); in raw3270_reset_device()
727 rp->view = NULL; in raw3270_reset_device()
738 rp = view->dev; in raw3270_reset()
739 if (!rp || rp->view != view || in raw3270_reset()
740 test_bit(RAW3270_FLAGS_FROZEN, &rp->flags)) in raw3270_reset()
741 rc = -EACCES; in raw3270_reset()
742 else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags)) in raw3270_reset()
743 rc = -ENODEV; in raw3270_reset()
745 rc = raw3270_reset_device(view->dev); in raw3270_reset()
760 /* Copy ebcdic -> ascii translation table. */ in raw3270_setup_device()
768 rp->ascebc = ascebc; in raw3270_setup_device()
771 rp->rows = 24; in raw3270_setup_device()
772 rp->cols = 80; in raw3270_setup_device()
774 INIT_LIST_HEAD(&rp->req_queue); in raw3270_setup_device()
775 INIT_LIST_HEAD(&rp->view_list); in raw3270_setup_device()
778 * Add device to list and find the smallest unused minor in raw3270_setup_device()
785 rp->minor = -1; in raw3270_setup_device()
788 if (tmp->minor > minor) { in raw3270_setup_device()
789 rp->minor = minor; in raw3270_setup_device()
790 __list_add(&rp->list, l->prev, l); in raw3270_setup_device()
795 if (rp->minor == -1 && minor < RAW3270_MAXDEVS + RAW3270_FIRSTMINOR) { in raw3270_setup_device()
796 rp->minor = minor; in raw3270_setup_device()
797 list_add_tail(&rp->list, &raw3270_devices); in raw3270_setup_device()
801 if (rp->minor == -1) in raw3270_setup_device()
802 return -EUSERS; in raw3270_setup_device()
803 rp->cdev = cdev; in raw3270_setup_device()
804 dev_set_drvdata(&cdev->dev, rp); in raw3270_setup_device()
805 cdev->handler = raw3270_irq; in raw3270_setup_device()
824 set_bit(RAW3270_FLAGS_CONSOLE, &rp->flags); in raw3270_setup_console()
834 set_bit(RAW3270_FLAGS_READY, &rp->flags); in raw3270_setup_console()
843 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_wait_cons_dev()
845 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_wait_cons_dev()
862 return ERR_PTR(-ENOMEM); in raw3270_create_device()
866 return ERR_PTR(-ENOMEM); in raw3270_create_device()
870 kfree(rp->ascebc); in raw3270_create_device()
874 /* Get reference to ccw_device structure. */ in raw3270_create_device()
875 get_device(&cdev->dev); in raw3270_create_device()
880 * Activate a view.
890 rp = view->dev; in raw3270_activate_view()
892 return -ENODEV; in raw3270_activate_view()
893 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_activate_view()
894 if (rp->view == view) in raw3270_activate_view()
896 else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags)) in raw3270_activate_view()
897 rc = -ENODEV; in raw3270_activate_view()
898 else if (test_bit(RAW3270_FLAGS_FROZEN, &rp->flags)) in raw3270_activate_view()
899 rc = -EACCES; in raw3270_activate_view()
902 if (rp->view) { in raw3270_activate_view()
903 oldview = rp->view; in raw3270_activate_view()
904 oldview->fn->deactivate(oldview); in raw3270_activate_view()
906 rp->view = view; in raw3270_activate_view()
907 rc = view->fn->activate(view); in raw3270_activate_view()
909 /* Didn't work. Try to reactivate the old view. */ in raw3270_activate_view()
910 rp->view = oldview; in raw3270_activate_view()
911 if (!oldview || oldview->fn->activate(oldview) != 0) { in raw3270_activate_view()
913 list_for_each_entry(nv, &rp->view_list, list) in raw3270_activate_view()
915 rp->view = nv; in raw3270_activate_view()
916 if (nv->fn->activate(nv) == 0) in raw3270_activate_view()
918 rp->view = NULL; in raw3270_activate_view()
923 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_activate_view()
936 rp = view->dev; in raw3270_deactivate_view()
939 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_deactivate_view()
940 if (rp->view == view) { in raw3270_deactivate_view()
941 view->fn->deactivate(view); in raw3270_deactivate_view()
942 rp->view = NULL; in raw3270_deactivate_view()
943 /* Move deactivated view to end of list. */ in raw3270_deactivate_view()
944 list_del_init(&view->list); in raw3270_deactivate_view()
945 list_add_tail(&view->list, &rp->view_list); in raw3270_deactivate_view()
946 /* Try to activate another view. */ in raw3270_deactivate_view()
947 if (test_bit(RAW3270_FLAGS_READY, &rp->flags) && in raw3270_deactivate_view()
948 !test_bit(RAW3270_FLAGS_FROZEN, &rp->flags)) { in raw3270_deactivate_view()
949 list_for_each_entry(view, &rp->view_list, list) { in raw3270_deactivate_view()
950 rp->view = view; in raw3270_deactivate_view()
951 if (view->fn->activate(view) == 0) in raw3270_deactivate_view()
953 rp->view = NULL; in raw3270_deactivate_view()
957 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_deactivate_view()
961 * Add view to device with minor "minor".
971 return -ENODEV; in raw3270_add_view()
973 rc = -ENODEV; in raw3270_add_view()
975 if (rp->minor != minor) in raw3270_add_view()
977 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_add_view()
978 if (test_bit(RAW3270_FLAGS_READY, &rp->flags)) { in raw3270_add_view()
979 atomic_set(&view->ref_count, 2); in raw3270_add_view()
980 view->dev = rp; in raw3270_add_view()
981 view->fn = fn; in raw3270_add_view()
982 view->model = rp->model; in raw3270_add_view()
983 view->rows = rp->rows; in raw3270_add_view()
984 view->cols = rp->cols; in raw3270_add_view()
985 view->ascebc = rp->ascebc; in raw3270_add_view()
986 spin_lock_init(&view->lock); in raw3270_add_view()
987 list_add(&view->list, &rp->view_list); in raw3270_add_view()
990 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_add_view()
1008 view = ERR_PTR(-ENODEV); in raw3270_find_view()
1010 if (rp->minor != minor) in raw3270_find_view()
1012 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_find_view()
1013 if (test_bit(RAW3270_FLAGS_READY, &rp->flags)) { in raw3270_find_view()
1014 view = ERR_PTR(-ENOENT); in raw3270_find_view()
1015 list_for_each_entry(tmp, &rp->view_list, list) { in raw3270_find_view()
1016 if (tmp->fn == fn) { in raw3270_find_view()
1023 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_find_view()
1031 * Remove view from device and free view structure via call to view->fn->free.
1040 rp = view->dev; in raw3270_del_view()
1041 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_del_view()
1042 if (rp->view == view) { in raw3270_del_view()
1043 view->fn->deactivate(view); in raw3270_del_view()
1044 rp->view = NULL; in raw3270_del_view()
1046 list_del_init(&view->list); in raw3270_del_view()
1047 if (!rp->view && test_bit(RAW3270_FLAGS_READY, &rp->flags) && in raw3270_del_view()
1048 !test_bit(RAW3270_FLAGS_FROZEN, &rp->flags)) { in raw3270_del_view()
1049 /* Try to activate another view. */ in raw3270_del_view()
1050 list_for_each_entry(nv, &rp->view_list, list) { in raw3270_del_view()
1051 if (nv->fn->activate(nv) == 0) { in raw3270_del_view()
1052 rp->view = nv; in raw3270_del_view()
1057 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_del_view()
1058 /* Wait for reference counter to drop to zero. */ in raw3270_del_view()
1059 atomic_dec(&view->ref_count); in raw3270_del_view()
1060 wait_event(raw3270_wait_queue, atomic_read(&view->ref_count) == 0); in raw3270_del_view()
1061 if (view->fn->free) in raw3270_del_view()
1062 view->fn->free(view); in raw3270_del_view()
1075 if (rp->clttydev && !IS_ERR(rp->clttydev)) in raw3270_delete_device()
1076 device_destroy(class3270, MKDEV(IBM_TTY3270_MAJOR, rp->minor)); in raw3270_delete_device()
1077 if (rp->cltubdev && !IS_ERR(rp->cltubdev)) in raw3270_delete_device()
1078 device_destroy(class3270, MKDEV(IBM_FS3270_MAJOR, rp->minor)); in raw3270_delete_device()
1079 list_del_init(&rp->list); in raw3270_delete_device()
1083 cdev = rp->cdev; in raw3270_delete_device()
1084 rp->cdev = NULL; in raw3270_delete_device()
1085 dev_set_drvdata(&cdev->dev, NULL); in raw3270_delete_device()
1086 cdev->handler = NULL; in raw3270_delete_device()
1089 put_device(&cdev->dev); in raw3270_delete_device()
1092 kfree(rp->ascebc); in raw3270_delete_device()
1109 ((struct raw3270 *) dev_get_drvdata(dev))->model); in raw3270_model_show()
1117 ((struct raw3270 *) dev_get_drvdata(dev))->rows); in raw3270_rows_show()
1125 ((struct raw3270 *) dev_get_drvdata(dev))->cols); in raw3270_columns_show()
1144 rc = sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group); in raw3270_create_attributes()
1148 rp->clttydev = device_create(class3270, &rp->cdev->dev, in raw3270_create_attributes()
1149 MKDEV(IBM_TTY3270_MAJOR, rp->minor), NULL, in raw3270_create_attributes()
1150 "tty%s", dev_name(&rp->cdev->dev)); in raw3270_create_attributes()
1151 if (IS_ERR(rp->clttydev)) { in raw3270_create_attributes()
1152 rc = PTR_ERR(rp->clttydev); in raw3270_create_attributes()
1156 rp->cltubdev = device_create(class3270, &rp->cdev->dev, in raw3270_create_attributes()
1157 MKDEV(IBM_FS3270_MAJOR, rp->minor), NULL, in raw3270_create_attributes()
1158 "tub%s", dev_name(&rp->cdev->dev)); in raw3270_create_attributes()
1159 if (!IS_ERR(rp->cltubdev)) in raw3270_create_attributes()
1162 rc = PTR_ERR(rp->cltubdev); in raw3270_create_attributes()
1163 device_destroy(class3270, MKDEV(IBM_TTY3270_MAJOR, rp->minor)); in raw3270_create_attributes()
1166 sysfs_remove_group(&rp->cdev->dev.kobj, &raw3270_attr_group); in raw3270_create_attributes()
1188 return -ENOMEM; in raw3270_register_notifier()
1189 np->notifier = notifier; in raw3270_register_notifier()
1191 list_add_tail(&np->list, &raw3270_notifier); in raw3270_register_notifier()
1193 get_device(&rp->cdev->dev); in raw3270_register_notifier()
1194 notifier(rp->minor, 1); in raw3270_register_notifier()
1206 if (np->notifier == notifier) { in raw3270_unregister_notifier()
1207 list_del(&np->list); in raw3270_unregister_notifier()
1239 set_bit(RAW3270_FLAGS_READY, &rp->flags); in raw3270_set_online()
1242 np->notifier(rp->minor, 1); in raw3270_set_online()
1262 rp = dev_get_drvdata(&cdev->dev); in raw3270_remove()
1271 clear_bit(RAW3270_FLAGS_READY, &rp->flags); in raw3270_remove()
1273 sysfs_remove_group(&cdev->dev.kobj, &raw3270_attr_group); in raw3270_remove()
1277 if (rp->view) { in raw3270_remove()
1278 rp->view->fn->deactivate(rp->view); in raw3270_remove()
1279 rp->view = NULL; in raw3270_remove()
1281 while (!list_empty(&rp->view_list)) { in raw3270_remove()
1282 v = list_entry(rp->view_list.next, struct raw3270_view, list); in raw3270_remove()
1283 if (v->fn->release) in raw3270_remove()
1284 v->fn->release(v); in raw3270_remove()
1293 np->notifier(rp->minor, 0); in raw3270_remove()
1310 rp = dev_get_drvdata(&cdev->dev); in raw3270_set_offline()
1311 if (test_bit(RAW3270_FLAGS_CONSOLE, &rp->flags)) in raw3270_set_offline()
1312 return -EBUSY; in raw3270_set_offline()
1323 rp = dev_get_drvdata(&cdev->dev); in raw3270_pm_stop()
1326 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_pm_stop()
1327 if (rp->view) in raw3270_pm_stop()
1328 rp->view->fn->deactivate(rp->view); in raw3270_pm_stop()
1329 if (!test_bit(RAW3270_FLAGS_CONSOLE, &rp->flags)) { in raw3270_pm_stop()
1331 * Release tty and fullscreen for all non-console in raw3270_pm_stop()
1334 list_for_each_entry(view, &rp->view_list, list) { in raw3270_pm_stop()
1335 if (view->fn->release) in raw3270_pm_stop()
1336 view->fn->release(view); in raw3270_pm_stop()
1339 set_bit(RAW3270_FLAGS_FROZEN, &rp->flags); in raw3270_pm_stop()
1340 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_pm_stop()
1349 rp = dev_get_drvdata(&cdev->dev); in raw3270_pm_start()
1352 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_pm_start()
1353 clear_bit(RAW3270_FLAGS_FROZEN, &rp->flags); in raw3270_pm_start()
1354 if (rp->view) in raw3270_pm_start()
1355 rp->view->fn->activate(rp->view); in raw3270_pm_start()
1356 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_pm_start()
1365 rp = view->dev; in raw3270_pm_unfreeze()
1366 if (rp && test_bit(RAW3270_FLAGS_FROZEN, &rp->flags)) in raw3270_pm_unfreeze()
1417 get_device(&rp->cdev->dev); in raw3270_init()