diff options
author | Len Brown <len.brown@intel.com> | 2006-12-20 02:53:13 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2006-12-20 02:53:13 -0500 |
commit | 9774f3384125912eb491ca77f77907324db3ed05 (patch) | |
tree | 0bdc7486e911dd9e955b41283ee19ac74521f7bd /drivers/s390 | |
parent | 3be11c8f4f2fa194834c2e83540f34da442b8977 (diff) | |
parent | f238085415c56618e042252894f2fcc971add645 (diff) |
merge linus into test branch
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/char/sclp_cpi.c | 2 | ||||
-rw-r--r-- | drivers/s390/cio/cio.c | 25 | ||||
-rw-r--r-- | drivers/s390/cio/css.c | 3 | ||||
-rw-r--r-- | drivers/s390/cio/qdio.c | 13 | ||||
-rw-r--r-- | drivers/s390/crypto/ap_bus.c | 14 |
5 files changed, 47 insertions, 10 deletions
diff --git a/drivers/s390/char/sclp_cpi.c b/drivers/s390/char/sclp_cpi.c index f7c10d954ec6..4f873ae148b7 100644 --- a/drivers/s390/char/sclp_cpi.c +++ b/drivers/s390/char/sclp_cpi.c | |||
@@ -49,6 +49,8 @@ static struct sclp_register sclp_cpi_event = | |||
49 | .send_mask = EvTyp_CtlProgIdent_Mask | 49 | .send_mask = EvTyp_CtlProgIdent_Mask |
50 | }; | 50 | }; |
51 | 51 | ||
52 | MODULE_LICENSE("GPL"); | ||
53 | |||
52 | MODULE_AUTHOR( | 54 | MODULE_AUTHOR( |
53 | "Martin Peschke, IBM Deutschland Entwicklung GmbH " | 55 | "Martin Peschke, IBM Deutschland Entwicklung GmbH " |
54 | "<mpeschke@de.ibm.com>"); | 56 | "<mpeschke@de.ibm.com>"); |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 7835a714a405..3a403f195cf8 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -871,11 +871,32 @@ __clear_subchannel_easy(struct subchannel_id schid) | |||
871 | return -EBUSY; | 871 | return -EBUSY; |
872 | } | 872 | } |
873 | 873 | ||
874 | static int pgm_check_occured; | ||
875 | |||
876 | static void cio_reset_pgm_check_handler(void) | ||
877 | { | ||
878 | pgm_check_occured = 1; | ||
879 | } | ||
880 | |||
881 | static int stsch_reset(struct subchannel_id schid, volatile struct schib *addr) | ||
882 | { | ||
883 | int rc; | ||
884 | |||
885 | pgm_check_occured = 0; | ||
886 | s390_reset_pgm_handler = cio_reset_pgm_check_handler; | ||
887 | rc = stsch(schid, addr); | ||
888 | s390_reset_pgm_handler = NULL; | ||
889 | if (pgm_check_occured) | ||
890 | return -EIO; | ||
891 | else | ||
892 | return rc; | ||
893 | } | ||
894 | |||
874 | static int __shutdown_subchannel_easy(struct subchannel_id schid, void *data) | 895 | static int __shutdown_subchannel_easy(struct subchannel_id schid, void *data) |
875 | { | 896 | { |
876 | struct schib schib; | 897 | struct schib schib; |
877 | 898 | ||
878 | if (stsch_err(schid, &schib)) | 899 | if (stsch_reset(schid, &schib)) |
879 | return -ENXIO; | 900 | return -ENXIO; |
880 | if (!schib.pmcw.ena) | 901 | if (!schib.pmcw.ena) |
881 | return 0; | 902 | return 0; |
@@ -972,7 +993,7 @@ static int __reipl_subchannel_match(struct subchannel_id schid, void *data) | |||
972 | struct schib schib; | 993 | struct schib schib; |
973 | struct sch_match_id *match_id = data; | 994 | struct sch_match_id *match_id = data; |
974 | 995 | ||
975 | if (stsch_err(schid, &schib)) | 996 | if (stsch_reset(schid, &schib)) |
976 | return -ENXIO; | 997 | return -ENXIO; |
977 | if (schib.pmcw.dnv && | 998 | if (schib.pmcw.dnv && |
978 | (schib.pmcw.dev == match_id->devid.devno) && | 999 | (schib.pmcw.dev == match_id->devid.devno) && |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 4c81d890791e..9d6c02446863 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -139,6 +139,8 @@ css_register_subchannel(struct subchannel *sch) | |||
139 | sch->dev.release = &css_subchannel_release; | 139 | sch->dev.release = &css_subchannel_release; |
140 | sch->dev.groups = subch_attr_groups; | 140 | sch->dev.groups = subch_attr_groups; |
141 | 141 | ||
142 | css_get_ssd_info(sch); | ||
143 | |||
142 | /* make it known to the system */ | 144 | /* make it known to the system */ |
143 | ret = css_sch_device_register(sch); | 145 | ret = css_sch_device_register(sch); |
144 | if (ret) { | 146 | if (ret) { |
@@ -146,7 +148,6 @@ css_register_subchannel(struct subchannel *sch) | |||
146 | __func__, sch->dev.bus_id); | 148 | __func__, sch->dev.bus_id); |
147 | return ret; | 149 | return ret; |
148 | } | 150 | } |
149 | css_get_ssd_info(sch); | ||
150 | return ret; | 151 | return ret; |
151 | } | 152 | } |
152 | 153 | ||
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 9d4ea449a608..6fd1940842eb 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -979,12 +979,11 @@ __qdio_outbound_processing(struct qdio_q *q) | |||
979 | 979 | ||
980 | if (q->is_iqdio_q) { | 980 | if (q->is_iqdio_q) { |
981 | /* | 981 | /* |
982 | * for asynchronous queues, we better check, if the fill | 982 | * for asynchronous queues, we better check, if the sent |
983 | * level is too high. for synchronous queues, the fill | 983 | * buffer is already switched from PRIMED to EMPTY. |
984 | * level will never be that high. | ||
985 | */ | 984 | */ |
986 | if (atomic_read(&q->number_of_buffers_used)> | 985 | if ((q->queue_type == QDIO_IQDIO_QFMT_ASYNCH) && |
987 | IQDIO_FILL_LEVEL_TO_POLL) | 986 | !qdio_is_outbound_q_done(q)) |
988 | qdio_mark_q(q); | 987 | qdio_mark_q(q); |
989 | 988 | ||
990 | } else if (!q->hydra_gives_outbound_pcis) | 989 | } else if (!q->hydra_gives_outbound_pcis) |
@@ -1825,6 +1824,10 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev, | |||
1825 | q->sbal[j]=*(outbound_sbals_array++); | 1824 | q->sbal[j]=*(outbound_sbals_array++); |
1826 | 1825 | ||
1827 | q->queue_type=q_format; | 1826 | q->queue_type=q_format; |
1827 | if ((q->queue_type == QDIO_IQDIO_QFMT) && | ||
1828 | (no_output_qs > 1) && | ||
1829 | (i == no_output_qs-1)) | ||
1830 | q->queue_type = QDIO_IQDIO_QFMT_ASYNCH; | ||
1828 | q->int_parm=int_parm; | 1831 | q->int_parm=int_parm; |
1829 | q->is_input_q=0; | 1832 | q->is_input_q=0; |
1830 | q->schid = irq_ptr->schid; | 1833 | q->schid = irq_ptr->schid; |
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index ad60afe5dd11..81b5899f4010 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -1129,7 +1129,15 @@ static void ap_poll_thread_stop(void) | |||
1129 | mutex_unlock(&ap_poll_thread_mutex); | 1129 | mutex_unlock(&ap_poll_thread_mutex); |
1130 | } | 1130 | } |
1131 | 1131 | ||
1132 | static void ap_reset(void) | 1132 | static void ap_reset_domain(void) |
1133 | { | ||
1134 | int i; | ||
1135 | |||
1136 | for (i = 0; i < AP_DEVICES; i++) | ||
1137 | ap_reset_queue(AP_MKQID(i, ap_domain_index)); | ||
1138 | } | ||
1139 | |||
1140 | static void ap_reset_all(void) | ||
1133 | { | 1141 | { |
1134 | int i, j; | 1142 | int i, j; |
1135 | 1143 | ||
@@ -1139,7 +1147,7 @@ static void ap_reset(void) | |||
1139 | } | 1147 | } |
1140 | 1148 | ||
1141 | static struct reset_call ap_reset_call = { | 1149 | static struct reset_call ap_reset_call = { |
1142 | .fn = ap_reset, | 1150 | .fn = ap_reset_all, |
1143 | }; | 1151 | }; |
1144 | 1152 | ||
1145 | /** | 1153 | /** |
@@ -1229,10 +1237,12 @@ void ap_module_exit(void) | |||
1229 | int i; | 1237 | int i; |
1230 | struct device *dev; | 1238 | struct device *dev; |
1231 | 1239 | ||
1240 | ap_reset_domain(); | ||
1232 | ap_poll_thread_stop(); | 1241 | ap_poll_thread_stop(); |
1233 | del_timer_sync(&ap_config_timer); | 1242 | del_timer_sync(&ap_config_timer); |
1234 | del_timer_sync(&ap_poll_timer); | 1243 | del_timer_sync(&ap_poll_timer); |
1235 | destroy_workqueue(ap_work_queue); | 1244 | destroy_workqueue(ap_work_queue); |
1245 | tasklet_kill(&ap_tasklet); | ||
1236 | s390_root_dev_unregister(ap_root_device); | 1246 | s390_root_dev_unregister(ap_root_device); |
1237 | while ((dev = bus_find_device(&ap_bus_type, NULL, NULL, | 1247 | while ((dev = bus_find_device(&ap_bus_type, NULL, NULL, |
1238 | __ap_match_all))) | 1248 | __ap_match_all))) |