Lines Matching refs:rp
97 static void __raw3270_disconnect(struct raw3270 *rp);
113 static inline int raw3270_state_ready(struct raw3270 *rp)
115 return rp->state == RAW3270_STATE_READY;
118 void raw3270_buffer_address(struct raw3270 *rp, char *cp, int x, int y)
123 x = max_t(int, 0, rp->view->cols + x);
125 y = max_t(int, 0, rp->view->rows + y);
126 addr = (y * rp->view->cols) + x;
127 if (test_bit(RAW3270_FLAGS_14BITADDR, &rp->flags)) {
244 static int __raw3270_start(struct raw3270 *rp, struct raw3270_view *view,
249 if (list_empty(&rp->req_queue) &&
250 !test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) {
252 rq->rc = ccw_device_start(rp->cdev, &rq->ccw,
259 list_add_tail(&rq->list, &rp->req_queue);
265 struct raw3270 *rp = view->dev;
267 return rp && rp->view == view;
273 struct raw3270 *rp;
277 rp = view->dev;
278 if (!rp || rp->view != view)
280 else if (!raw3270_state_ready(rp))
283 rc = __raw3270_start(rp, view, rq);
307 struct raw3270 *rp;
310 rp = view->dev;
311 if (!rp || rp->view != view)
313 else if (!raw3270_state_ready(rp))
316 rc = __raw3270_start(rp, view, rq);
323 struct raw3270 *rp;
325 rp = view->dev;
328 list_add_tail(&rq->list, &rp->req_queue);
338 struct raw3270 *rp;
342 rp = dev_get_drvdata(&cdev->dev);
343 if (!rp)
346 view = rq ? rq->view : rp->view;
351 clear_bit(RAW3270_FLAGS_BUSY, &rp->flags);
355 set_bit(RAW3270_FLAGS_BUSY, &rp->flags);
359 set_bit(RAW3270_FLAGS_BUSY, &rp->flags);
360 if (rp->state > RAW3270_STATE_RESET)
361 __raw3270_disconnect(rp);
368 if (test_bit(RAW3270_FLAGS_BUSY, &rp->flags))
385 while (!list_empty(&rp->req_queue)) {
386 rq = list_entry(rp->req_queue.next, struct raw3270_request, list);
387 rq->rc = ccw_device_start(rp->cdev, &rq->ccw,
444 static void raw3270_size_device_vm(struct raw3270 *rp)
451 ccw_device_get_id(rp->cdev, &dev_id);
454 rp->model = 2;
455 rp->rows = diag8c_data.height;
456 rp->cols = diag8c_data.width;
458 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags);
471 rp->model = model;
472 rp->rows = 24;
473 rp->cols = 80;
476 rp->model = model;
477 rp->rows = 32;
478 rp->cols = 80;
481 rp->model = model;
482 rp->rows = 43;
483 rp->cols = 80;
486 rp->model = model;
487 rp->rows = 27;
488 rp->cols = 132;
493 static void raw3270_size_device(struct raw3270 *rp, char *init_data)
502 rp->model = 2;
503 rp->rows = 24;
504 rp->cols = 80;
508 rp->rows = uap->uab.h;
509 rp->cols = uap->uab.w;
512 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags);
516 rp->rows = uap->aua.hauai;
517 rp->cols = uap->aua.wauai;
520 rp->model = 0;
521 if (rp->rows == 24 && rp->cols == 80)
522 rp->model = 2;
523 if (rp->rows == 32 && rp->cols == 80)
524 rp->model = 3;
525 if (rp->rows == 43 && rp->cols == 80)
526 rp->model = 4;
527 if (rp->rows == 27 && rp->cols == 132)
528 rp->model = 5;
533 struct raw3270 *rp = container_of(work, struct raw3270, resize_work);
537 list_for_each_entry(view, &rp->view_list, list) {
539 view->fn->resize(view, rp->model, rp->rows, rp->cols,
540 rp->old_model, rp->old_rows, rp->old_cols);
542 rp->old_cols = rp->cols;
543 rp->old_rows = rp->rows;
544 rp->old_model = rp->model;
546 list_for_each_entry(view, &rp->view_list, list) {
547 rp->view = view;
550 rp->view = NULL;
554 static void raw3270_size_device_done(struct raw3270 *rp)
556 rp->view = NULL;
557 rp->state = RAW3270_STATE_READY;
558 schedule_work(&rp->resize_work);
563 struct raw3270 *rp = rq->view->dev;
565 raw3270_size_device(rp, data);
566 raw3270_size_device_done(rp);
570 static void raw3270_read_modified(struct raw3270 *rp)
572 if (rp->state != RAW3270_STATE_W4ATTN)
575 memset(&rp->init_readmod, 0, sizeof(rp->init_readmod));
576 memset(&rp->init_data, 0, sizeof(rp->init_data));
577 rp->init_readmod.ccw.cmd_code = TC_READMOD;
578 rp->init_readmod.ccw.flags = CCW_FLAG_SLI;
579 rp->init_readmod.ccw.count = sizeof(rp->init_data);
580 rp->init_readmod.ccw.cda = (__u32)__pa(rp->init_data);
581 rp->init_readmod.callback = raw3270_read_modified_cb;
582 rp->init_readmod.callback_data = rp->init_data;
583 rp->state = RAW3270_STATE_READMOD;
584 raw3270_start_irq(&rp->init_view, &rp->init_readmod);
587 static void raw3270_writesf_readpart(struct raw3270 *rp)
594 memset(&rp->init_readpart, 0, sizeof(rp->init_readpart));
595 memset(&rp->init_data, 0, sizeof(rp->init_data));
596 memcpy(&rp->init_data, wbuf, sizeof(wbuf));
597 rp->init_readpart.ccw.cmd_code = TC_WRITESF;
598 rp->init_readpart.ccw.flags = CCW_FLAG_SLI;
599 rp->init_readpart.ccw.count = sizeof(wbuf);
600 rp->init_readpart.ccw.cda = (__u32)__pa(&rp->init_data);
601 rp->state = RAW3270_STATE_W4ATTN;
602 raw3270_start_irq(&rp->init_view, &rp->init_readpart);
610 struct raw3270 *rp = rq->view->dev;
612 if (rp->state != RAW3270_STATE_RESET)
616 rp->state = RAW3270_STATE_INIT;
618 raw3270_size_device_vm(rp);
619 raw3270_size_device_done(rp);
621 raw3270_writesf_readpart(rp);
623 memset(&rp->init_reset, 0, sizeof(rp->init_reset));
626 static int __raw3270_reset_device(struct raw3270 *rp)
631 if (rp->init_reset.view)
634 rp->init_data[0] = TW_KR;
635 rp->init_reset.ccw.cmd_code = TC_EWRITEA;
636 rp->init_reset.ccw.flags = CCW_FLAG_SLI;
637 rp->init_reset.ccw.count = 1;
638 rp->init_reset.ccw.cda = (__u32)__pa(rp->init_data);
639 rp->init_reset.callback = raw3270_reset_device_cb;
640 rc = __raw3270_start(rp, &rp->init_view, &rp->init_reset);
641 if (rc == 0 && rp->state == RAW3270_STATE_INIT)
642 rp->state = RAW3270_STATE_RESET;
646 static int raw3270_reset_device(struct raw3270 *rp)
651 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
652 rc = __raw3270_reset_device(rp);
653 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
659 struct raw3270 *rp;
662 rp = view->dev;
663 if (!rp || rp->view != view)
665 else if (!raw3270_state_ready(rp))
673 static void __raw3270_disconnect(struct raw3270 *rp)
678 rp->state = RAW3270_STATE_INIT;
679 rp->view = &rp->init_view;
681 while (!list_empty(&rp->req_queue)) {
682 rq = list_entry(rp->req_queue.next, struct raw3270_request, list);
691 __raw3270_reset_device(rp);
697 struct raw3270 *rp;
709 rp = view->dev;
710 raw3270_read_modified(rp);
721 static int raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp,
728 memset(rp, 0, sizeof(struct raw3270));
737 rp->ascebc = ascebc;
740 rp->rows = 24;
741 rp->cols = 80;
742 rp->old_rows = rp->rows;
743 rp->old_cols = rp->cols;
745 INIT_LIST_HEAD(&rp->req_queue);
746 INIT_LIST_HEAD(&rp->view_list);
748 rp->init_view.dev = rp;
749 rp->init_view.fn = &raw3270_init_fn;
750 rp->view = &rp->init_view;
751 INIT_WORK(&rp->resize_work, raw3270_resize_work);
761 rp->minor = -1;
765 rp->minor = minor;
766 __list_add(&rp->list, l->prev, l);
771 if (rp->minor == -1 && minor < RAW3270_MAXDEVS + RAW3270_FIRSTMINOR) {
772 rp->minor = minor;
773 list_add_tail(&rp->list, &raw3270_devices);
777 if (rp->minor == -1)
779 rp->cdev = cdev;
780 dev_set_drvdata(&cdev->dev, rp);
789 static inline int raw3270_state_final(struct raw3270 *rp)
791 return rp->state == RAW3270_STATE_INIT ||
792 rp->state == RAW3270_STATE_READY;
802 struct raw3270 *rp;
810 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA);
812 rc = raw3270_setup_device(cdev, rp, ascebc);
815 set_bit(RAW3270_FLAGS_CONSOLE, &rp->flags);
823 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
825 __raw3270_reset_device(rp);
826 while (!raw3270_state_final(rp)) {
827 ccw_device_wait_idle(rp->cdev);
830 } while (rp->state != RAW3270_STATE_READY);
831 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
832 return rp;
835 void raw3270_wait_cons_dev(struct raw3270 *rp)
839 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
840 ccw_device_wait_idle(rp->cdev);
841 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
851 struct raw3270 *rp;
855 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA);
856 if (!rp)
860 kfree(rp);
863 rc = raw3270_setup_device(cdev, rp, ascebc);
865 kfree(rp->ascebc);
866 kfree(rp);
867 rp = ERR_PTR(rc);
871 return rp;
880 struct raw3270 *rp = view->dev;
882 if (!rp)
884 if (spin_is_locked(get_ccwdev_lock(rp->cdev)))
889 static int raw3270_assign_activate_view(struct raw3270 *rp, struct raw3270_view *view)
891 rp->view = view;
895 static int __raw3270_activate_view(struct raw3270 *rp, struct raw3270_view *view)
900 if (rp->view == view)
903 if (!raw3270_state_ready(rp))
906 if (rp->view && rp->view->fn->deactivate) {
907 oldview = rp->view;
911 rc = raw3270_assign_activate_view(rp, view);
917 rc = raw3270_assign_activate_view(rp, oldview);
923 list_for_each_entry(nv, &rp->view_list, list) {
926 rc = raw3270_assign_activate_view(rp, nv);
929 rp->view = NULL;
939 struct raw3270 *rp;
943 rp = view->dev;
944 if (!rp)
946 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
947 rc = __raw3270_activate_view(rp, view);
948 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
959 struct raw3270 *rp;
961 rp = view->dev;
962 if (!rp)
964 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
965 if (rp->view == view) {
967 rp->view = NULL;
970 list_add_tail(&view->list, &rp->view_list);
972 if (raw3270_state_ready(rp)) {
973 list_for_each_entry(view, &rp->view_list, list) {
974 rp->view = view;
977 rp->view = NULL;
981 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
992 struct raw3270 *rp;
999 list_for_each_entry(rp, &raw3270_devices, list) {
1000 if (rp->minor != minor)
1002 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
1004 view->dev = rp;
1006 view->model = rp->model;
1007 view->rows = rp->rows;
1008 view->cols = rp->cols;
1009 view->ascebc = rp->ascebc;
1012 list_add(&view->list, &rp->view_list);
1014 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
1027 struct raw3270 *rp;
1033 list_for_each_entry(rp, &raw3270_devices, list) {
1034 if (rp->minor != minor)
1036 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
1037 list_for_each_entry(tmp, &rp->view_list, list) {
1044 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
1058 struct raw3270 *rp;
1061 rp = view->dev;
1062 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
1063 if (rp->view == view) {
1065 rp->view = NULL;
1068 if (!rp->view && raw3270_state_ready(rp)) {
1070 list_for_each_entry(nv, &rp->view_list, list) {
1072 rp->view = nv;
1077 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
1089 static void raw3270_delete_device(struct raw3270 *rp)
1095 list_del_init(&rp->list);
1099 cdev = rp->cdev;
1100 rp->cdev = NULL;
1108 kfree(rp->ascebc);
1109 kfree(rp);
1156 static int raw3270_create_attributes(struct raw3270 *rp)
1158 return sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
1168 struct raw3270 *rp;
1172 list_for_each_entry(rp, &raw3270_devices, list)
1173 notifier->create(rp->minor);
1181 struct raw3270 *rp;
1184 list_for_each_entry(rp, &raw3270_devices, list)
1185 notifier->destroy(rp->minor);
1197 struct raw3270 *rp;
1200 rp = raw3270_create_device(cdev);
1201 if (IS_ERR(rp))
1202 return PTR_ERR(rp);
1203 rc = raw3270_create_attributes(rp);
1206 raw3270_reset_device(rp);
1209 np->create(rp->minor);
1214 raw3270_delete_device(rp);
1224 struct raw3270 *rp;
1228 rp = dev_get_drvdata(&cdev->dev);
1231 * should set up rp. raw3270_remove gets entered for
1233 * Thus, rp may validly be NULL here.
1235 if (!rp)
1242 if (rp->view) {
1243 if (rp->view->fn->deactivate)
1244 rp->view->fn->deactivate(rp->view);
1245 rp->view = NULL;
1247 while (!list_empty(&rp->view_list)) {
1248 v = list_entry(rp->view_list.next, struct raw3270_view, list);
1259 np->destroy(rp->minor);
1263 raw3270_reset_device(rp);
1265 raw3270_delete_device(rp);
1273 struct raw3270 *rp;
1275 rp = dev_get_drvdata(&cdev->dev);
1276 if (test_bit(RAW3270_FLAGS_CONSOLE, &rp->flags))
1312 struct raw3270 *rp;
1323 list_for_each_entry(rp, &raw3270_devices, list) {
1324 get_device(&rp->cdev->dev);
1325 raw3270_create_attributes(rp);