Lines Matching full:rp

101 static void __raw3270_disconnect(struct raw3270 *rp);
117 static inline int raw3270_state_ready(struct raw3270 *rp)
119 return rp->state == RAW3270_STATE_READY;
122 void raw3270_buffer_address(struct raw3270 *rp, char *cp, int x, int y)
127 x = max_t(int, 0, rp->view->cols + x);
129 y = max_t(int, 0, rp->view->rows + y);
130 addr = (y * rp->view->cols) + x;
131 if (test_bit(RAW3270_FLAGS_14BITADDR, &rp->flags)) {
250 static int __raw3270_start(struct raw3270 *rp, struct raw3270_view *view,
255 if (list_empty(&rp->req_queue) &&
256 !test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) {
258 rq->rc = ccw_device_start(rp->cdev, &rq->ccw,
265 list_add_tail(&rq->list, &rp->req_queue);
271 struct raw3270 *rp = view->dev;
273 return rp && rp->view == view;
279 struct raw3270 *rp;
283 rp = view->dev;
284 if (!rp || rp->view != view)
286 else if (!raw3270_state_ready(rp))
289 rc = __raw3270_start(rp, view, rq);
313 struct raw3270 *rp;
316 rp = view->dev;
317 if (!rp || rp->view != view)
319 else if (!raw3270_state_ready(rp))
322 rc = __raw3270_start(rp, view, rq);
329 struct raw3270 *rp;
331 rp = view->dev;
334 list_add_tail(&rq->list, &rp->req_queue);
344 struct raw3270 *rp;
348 rp = dev_get_drvdata(&cdev->dev);
349 if (!rp)
352 view = rq ? rq->view : rp->view;
357 clear_bit(RAW3270_FLAGS_BUSY, &rp->flags);
361 set_bit(RAW3270_FLAGS_BUSY, &rp->flags);
365 set_bit(RAW3270_FLAGS_BUSY, &rp->flags);
366 if (rp->state > RAW3270_STATE_RESET)
367 __raw3270_disconnect(rp);
374 if (test_bit(RAW3270_FLAGS_BUSY, &rp->flags))
391 while (!list_empty(&rp->req_queue)) {
392 rq = list_entry(rp->req_queue.next, struct raw3270_request, list);
393 rq->rc = ccw_device_start(rp->cdev, &rq->ccw,
450 static void raw3270_size_device_vm(struct raw3270 *rp)
457 ccw_device_get_id(rp->cdev, &dev_id);
460 rp->model = 2;
461 rp->rows = diag8c_data.height;
462 rp->cols = diag8c_data.width;
464 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags);
477 rp->model = model;
478 rp->rows = 24;
479 rp->cols = 80;
482 rp->model = model;
483 rp->rows = 32;
484 rp->cols = 80;
487 rp->model = model;
488 rp->rows = 43;
489 rp->cols = 80;
492 rp->model = model;
493 rp->rows = 27;
494 rp->cols = 132;
499 static void raw3270_size_device(struct raw3270 *rp, char *init_data)
508 rp->model = 2;
509 rp->rows = 24;
510 rp->cols = 80;
514 rp->rows = uap->uab.h;
515 rp->cols = uap->uab.w;
518 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags);
522 rp->rows = uap->aua.hauai;
523 rp->cols = uap->aua.wauai;
526 rp->model = 0;
527 if (rp->rows == 24 && rp->cols == 80)
528 rp->model = 2;
529 if (rp->rows == 32 && rp->cols == 80)
530 rp->model = 3;
531 if (rp->rows == 43 && rp->cols == 80)
532 rp->model = 4;
533 if (rp->rows == 27 && rp->cols == 132)
534 rp->model = 5;
539 struct raw3270 *rp = container_of(work, struct raw3270, resize_work);
543 list_for_each_entry(view, &rp->view_list, list) {
545 view->fn->resize(view, rp->model, rp->rows, rp->cols,
546 rp->old_model, rp->old_rows, rp->old_cols);
548 rp->old_cols = rp->cols;
549 rp->old_rows = rp->rows;
550 rp->old_model = rp->model;
552 list_for_each_entry(view, &rp->view_list, list) {
553 rp->view = view;
556 rp->view = NULL;
560 static void raw3270_size_device_done(struct raw3270 *rp)
562 rp->view = NULL;
563 rp->state = RAW3270_STATE_READY;
564 schedule_work(&rp->resize_work);
569 struct raw3270 *rp = rq->view->dev;
571 raw3270_size_device(rp, data);
572 raw3270_size_device_done(rp);
576 static void raw3270_read_modified(struct raw3270 *rp)
578 if (rp->state != RAW3270_STATE_W4ATTN)
581 memset(&rp->init_readmod, 0, sizeof(rp->init_readmod));
582 memset(&rp->init_data, 0, sizeof(rp->init_data));
583 rp->init_readmod.ccw.cmd_code = TC_READMOD;
584 rp->init_readmod.ccw.flags = CCW_FLAG_SLI;
585 rp->init_readmod.ccw.count = sizeof(rp->init_data);
586 rp->init_readmod.ccw.cda = virt_to_dma32(rp->init_data);
587 rp->init_readmod.callback = raw3270_read_modified_cb;
588 rp->init_readmod.callback_data = rp->init_data;
589 rp->state = RAW3270_STATE_READMOD;
590 raw3270_start_irq(&rp->init_view, &rp->init_readmod);
593 static void raw3270_writesf_readpart(struct raw3270 *rp)
600 memset(&rp->init_readpart, 0, sizeof(rp->init_readpart));
601 memset(&rp->init_data, 0, sizeof(rp->init_data));
602 memcpy(&rp->init_data, wbuf, sizeof(wbuf));
603 rp->init_readpart.ccw.cmd_code = TC_WRITESF;
604 rp->init_readpart.ccw.flags = CCW_FLAG_SLI;
605 rp->init_readpart.ccw.count = sizeof(wbuf);
606 rp->init_readpart.ccw.cda = virt_to_dma32(&rp->init_data);
607 rp->state = RAW3270_STATE_W4ATTN;
608 raw3270_start_irq(&rp->init_view, &rp->init_readpart);
616 struct raw3270 *rp = rq->view->dev;
618 if (rp->state != RAW3270_STATE_RESET)
622 rp->state = RAW3270_STATE_INIT;
624 raw3270_size_device_vm(rp);
625 raw3270_size_device_done(rp);
627 raw3270_writesf_readpart(rp);
629 memset(&rp->init_reset, 0, sizeof(rp->init_reset));
632 static int __raw3270_reset_device(struct raw3270 *rp)
637 if (rp->init_reset.view)
640 rp->init_data[0] = TW_KR;
641 rp->init_reset.ccw.cmd_code = TC_EWRITEA;
642 rp->init_reset.ccw.flags = CCW_FLAG_SLI;
643 rp->init_reset.ccw.count = 1;
644 rp->init_reset.ccw.cda = virt_to_dma32(rp->init_data);
645 rp->init_reset.callback = raw3270_reset_device_cb;
646 rc = __raw3270_start(rp, &rp->init_view, &rp->init_reset);
647 if (rc == 0 && rp->state == RAW3270_STATE_INIT)
648 rp->state = RAW3270_STATE_RESET;
652 static int raw3270_reset_device(struct raw3270 *rp)
657 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
658 rc = __raw3270_reset_device(rp);
659 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
665 struct raw3270 *rp;
668 rp = view->dev;
669 if (!rp || rp->view != view)
671 else if (!raw3270_state_ready(rp))
679 static void __raw3270_disconnect(struct raw3270 *rp)
684 rp->state = RAW3270_STATE_INIT;
685 rp->view = &rp->init_view;
687 while (!list_empty(&rp->req_queue)) {
688 rq = list_entry(rp->req_queue.next, struct raw3270_request, list);
697 __raw3270_reset_device(rp);
703 struct raw3270 *rp;
715 rp = view->dev;
716 raw3270_read_modified(rp);
727 static int raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp,
734 memset(rp, 0, sizeof(struct raw3270));
743 rp->ascebc = ascebc;
746 rp->rows = 24;
747 rp->cols = 80;
748 rp->old_rows = rp->rows;
749 rp->old_cols = rp->cols;
751 INIT_LIST_HEAD(&rp->req_queue);
752 INIT_LIST_HEAD(&rp->view_list);
754 rp->init_view.dev = rp;
755 rp->init_view.fn = &raw3270_init_fn;
756 rp->view = &rp->init_view;
757 INIT_WORK(&rp->resize_work, raw3270_resize_work);
767 rp->minor = -1;
771 rp->minor = minor;
772 __list_add(&rp->list, l->prev, l);
777 if (rp->minor == -1 && minor < RAW3270_MAXDEVS + RAW3270_FIRSTMINOR) {
778 rp->minor = minor;
779 list_add_tail(&rp->list, &raw3270_devices);
783 if (rp->minor == -1)
785 rp->cdev = cdev;
786 dev_set_drvdata(&cdev->dev, rp);
795 static inline int raw3270_state_final(struct raw3270 *rp)
797 return rp->state == RAW3270_STATE_INIT ||
798 rp->state == RAW3270_STATE_READY;
808 struct raw3270 *rp;
816 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA);
818 rc = raw3270_setup_device(cdev, rp, ascebc);
821 set_bit(RAW3270_FLAGS_CONSOLE, &rp->flags);
829 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
831 __raw3270_reset_device(rp);
832 while (!raw3270_state_final(rp)) {
833 ccw_device_wait_idle(rp->cdev);
836 } while (rp->state != RAW3270_STATE_READY);
837 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
838 return rp;
841 void raw3270_wait_cons_dev(struct raw3270 *rp)
845 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
846 ccw_device_wait_idle(rp->cdev);
847 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
857 struct raw3270 *rp;
861 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA);
862 if (!rp)
866 kfree(rp);
869 rc = raw3270_setup_device(cdev, rp, ascebc);
871 kfree(rp->ascebc);
872 kfree(rp);
873 rp = ERR_PTR(rc);
877 return rp;
886 struct raw3270 *rp = view->dev;
888 if (!rp)
890 if (spin_is_locked(get_ccwdev_lock(rp->cdev)))
895 static int raw3270_assign_activate_view(struct raw3270 *rp, struct raw3270_view *view)
897 rp->view = view;
901 static int __raw3270_activate_view(struct raw3270 *rp, struct raw3270_view *view)
906 if (rp->view == view)
909 if (!raw3270_state_ready(rp))
912 if (rp->view && rp->view->fn->deactivate) {
913 oldview = rp->view;
917 rc = raw3270_assign_activate_view(rp, view);
923 rc = raw3270_assign_activate_view(rp, oldview);
929 list_for_each_entry(nv, &rp->view_list, list) {
932 rc = raw3270_assign_activate_view(rp, nv);
935 rp->view = NULL;
945 struct raw3270 *rp;
949 rp = view->dev;
950 if (!rp)
952 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
953 rc = __raw3270_activate_view(rp, view);
954 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
965 struct raw3270 *rp;
967 rp = view->dev;
968 if (!rp)
970 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
971 if (rp->view == view) {
973 rp->view = NULL;
976 list_add_tail(&view->list, &rp->view_list);
978 if (raw3270_state_ready(rp)) {
979 list_for_each_entry(view, &rp->view_list, list) {
980 rp->view = view;
983 rp->view = NULL;
987 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
998 struct raw3270 *rp;
1005 list_for_each_entry(rp, &raw3270_devices, list) {
1006 if (rp->minor != minor)
1008 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
1010 view->dev = rp;
1012 view->model = rp->model;
1013 view->rows = rp->rows;
1014 view->cols = rp->cols;
1015 view->ascebc = rp->ascebc;
1018 list_add(&view->list, &rp->view_list);
1020 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
1033 struct raw3270 *rp;
1039 list_for_each_entry(rp, &raw3270_devices, list) {
1040 if (rp->minor != minor)
1042 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
1043 list_for_each_entry(tmp, &rp->view_list, list) {
1050 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
1064 struct raw3270 *rp;
1067 rp = view->dev;
1068 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
1069 if (rp->view == view) {
1071 rp->view = NULL;
1074 if (!rp->view && raw3270_state_ready(rp)) {
1076 list_for_each_entry(nv, &rp->view_list, list) {
1078 rp->view = nv;
1083 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
1095 static void raw3270_delete_device(struct raw3270 *rp)
1101 list_del_init(&rp->list);
1105 cdev = rp->cdev;
1106 rp->cdev = NULL;
1114 kfree(rp->ascebc);
1115 kfree(rp);
1162 static int raw3270_create_attributes(struct raw3270 *rp)
1164 return sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
1174 struct raw3270 *rp;
1178 list_for_each_entry(rp, &raw3270_devices, list)
1179 notifier->create(rp->minor);
1187 struct raw3270 *rp;
1190 list_for_each_entry(rp, &raw3270_devices, list)
1191 notifier->destroy(rp->minor);
1203 struct raw3270 *rp;
1206 rp = raw3270_create_device(cdev);
1207 if (IS_ERR(rp))
1208 return PTR_ERR(rp);
1209 rc = raw3270_create_attributes(rp);
1212 raw3270_reset_device(rp);
1215 np->create(rp->minor);
1220 raw3270_delete_device(rp);
1230 struct raw3270 *rp;
1234 rp = dev_get_drvdata(&cdev->dev);
1237 * should set up rp. raw3270_remove gets entered for
1239 * Thus, rp may validly be NULL here.
1241 if (!rp)
1248 if (rp->view) {
1249 if (rp->view->fn->deactivate)
1250 rp->view->fn->deactivate(rp->view);
1251 rp->view = NULL;
1253 while (!list_empty(&rp->view_list)) {
1254 v = list_entry(rp->view_list.next, struct raw3270_view, list);
1265 np->destroy(rp->minor);
1269 raw3270_reset_device(rp);
1271 raw3270_delete_device(rp);
1279 struct raw3270 *rp;
1281 rp = dev_get_drvdata(&cdev->dev);
1282 if (test_bit(RAW3270_FLAGS_CONSOLE, &rp->flags))
1318 struct raw3270 *rp;
1332 list_for_each_entry(rp, &raw3270_devices, list) {
1333 get_device(&rp->cdev->dev);
1334 raw3270_create_attributes(rp);