679 int compat_negot;
680
681 compat_negot = 0;
682 if (!(pp->flags & PP_CLAIMED) && pp->pdev &&
683 (pp->state.mode != IEEE1284_MODE_COMPAT)) {
684 struct ieee1284_info *info;
685
686
687 parport_claim_or_block (pp->pdev);
688 pp->flags |= PP_CLAIMED;
689 info = &pp->pdev->port->ieee1284;
690 pp->saved_state.mode = info->mode;
691 pp->saved_state.phase = info->phase;
692 info->mode = pp->state.mode;
693 info->phase = pp->state.phase;
694 compat_negot = 1;
695 } else if ((pp->flags & PP_CLAIMED) && pp->pdev &&
696 (pp->pdev->port->ieee1284.mode != IEEE1284_MODE_COMPAT)) {
697 compat_negot = 2;
698 }
699 if (compat_negot) {
700 parport_negotiate (pp->pdev->port, IEEE1284_MODE_COMPAT);
701 printk (KERN_DEBUG CHRDEV
702 "%x: negotiated back to compatibility mode because "
703 "user-space forgot\n", minor);
704 }
705
706 if (pp->flags & PP_CLAIMED) {
707 struct ieee1284_info *info;
708
709 info = &pp->pdev->port->ieee1284;
710 pp->state.mode = info->mode;
711 pp->state.phase = info->phase;
712 info->mode = pp->saved_state.mode;
713 info->phase = pp->saved_state.phase;
714 parport_release (pp->pdev);
715 if (compat_negot != 1) {
716 printk (KERN_DEBUG CHRDEV "%x: released pardevice "
717 "because user-space forgot\n", minor);
718 }
719 }