aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/cio/qdio_main.c44
1 files changed, 12 insertions, 32 deletions
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
index accd957454e7..ba4facc37011 100644
--- a/drivers/s390/cio/qdio_main.c
+++ b/drivers/s390/cio/qdio_main.c
@@ -881,42 +881,26 @@ no_handler:
881 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED); 881 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED);
882} 882}
883 883
884static int qdio_establish_check_errors(struct ccw_device *cdev, int cstat, 884static void qdio_establish_handle_irq(struct ccw_device *cdev, int cstat,
885 int dstat) 885 int dstat)
886{ 886{
887 struct qdio_irq *irq_ptr = cdev->private->qdio_data; 887 struct qdio_irq *irq_ptr = cdev->private->qdio_data;
888 888
889 if (cstat || (dstat & ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END))) { 889 DBF_DEV_EVENT(DBF_INFO, irq_ptr, "qest irq");
890 DBF_ERROR("EQ:ck con");
891 goto error;
892 }
893 890
894 if (!(dstat & DEV_STAT_DEV_END)) { 891 if (cstat)
895 DBF_ERROR("EQ:no dev");
896 goto error; 892 goto error;
897 } 893 if (dstat & ~(DEV_STAT_DEV_END | DEV_STAT_CHN_END))
898
899 if (dstat & ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END)) {
900 DBF_ERROR("EQ: bad io");
901 goto error; 894 goto error;
902 } 895 if (!(dstat & DEV_STAT_DEV_END))
903 return 0; 896 goto error;
897 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ESTABLISHED);
898 return;
899
904error: 900error:
905 DBF_ERROR("%4x EQ:error", irq_ptr->schid.sch_no); 901 DBF_ERROR("%4x EQ:error", irq_ptr->schid.sch_no);
906 DBF_ERROR("ds: %2x cs:%2x", dstat, cstat); 902 DBF_ERROR("ds: %2x cs:%2x", dstat, cstat);
907
908 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR); 903 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR);
909 return 1;
910}
911
912static void qdio_establish_handle_irq(struct ccw_device *cdev, int cstat,
913 int dstat)
914{
915 struct qdio_irq *irq_ptr = cdev->private->qdio_data;
916
917 DBF_DEV_EVENT(DBF_INFO, irq_ptr, "qest irq");
918 if (!qdio_establish_check_errors(cdev, cstat, dstat))
919 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ESTABLISHED);
920} 904}
921 905
922/* qdio interrupt handler */ 906/* qdio interrupt handler */
@@ -946,7 +930,6 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,
946 } 930 }
947 } 931 }
948 qdio_irq_check_sense(irq_ptr, irb); 932 qdio_irq_check_sense(irq_ptr, irb);
949
950 cstat = irb->scsw.cmd.cstat; 933 cstat = irb->scsw.cmd.cstat;
951 dstat = irb->scsw.cmd.dstat; 934 dstat = irb->scsw.cmd.dstat;
952 935
@@ -954,22 +937,19 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,
954 case QDIO_IRQ_STATE_INACTIVE: 937 case QDIO_IRQ_STATE_INACTIVE:
955 qdio_establish_handle_irq(cdev, cstat, dstat); 938 qdio_establish_handle_irq(cdev, cstat, dstat);
956 break; 939 break;
957
958 case QDIO_IRQ_STATE_CLEANUP: 940 case QDIO_IRQ_STATE_CLEANUP:
959 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE); 941 qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE);
960 break; 942 break;
961
962 case QDIO_IRQ_STATE_ESTABLISHED: 943 case QDIO_IRQ_STATE_ESTABLISHED:
963 case QDIO_IRQ_STATE_ACTIVE: 944 case QDIO_IRQ_STATE_ACTIVE:
964 if (cstat & SCHN_STAT_PCI) { 945 if (cstat & SCHN_STAT_PCI) {
965 qdio_int_handler_pci(irq_ptr); 946 qdio_int_handler_pci(irq_ptr);
966 return; 947 return;
967 } 948 }
968 if ((cstat & ~SCHN_STAT_PCI) || dstat) { 949 if (cstat || dstat)
969 qdio_handle_activate_check(cdev, intparm, cstat, 950 qdio_handle_activate_check(cdev, intparm, cstat,
970 dstat); 951 dstat);
971 break; 952 break;
972 }
973 default: 953 default:
974 WARN_ON(1); 954 WARN_ON(1);
975 } 955 }