• Home
  • Raw
  • Download

Lines Matching +full:ccode +full:- +full:map

1 // SPDX-License-Identifier: GPL-2.0
3 * S/390 common I/O routines -- channel subsystem call
41 * chsc_error_from_response() - convert a chsc response to an error
58 return -EINVAL; in chsc_error_from_response()
61 return -EOPNOTSUPP; in chsc_error_from_response()
64 return -EBUSY; in chsc_error_from_response()
67 return -ENOMEM; in chsc_error_from_response()
69 return -EUSERS; in chsc_error_from_response()
71 return -EIO; in chsc_error_from_response()
96 u8 chpid[8]; /* chpids 0-7 */
97 u16 fla[8]; /* full link addresses 0-7 */
104 int ccode; in chsc_get_ssd_info() local
112 ssd_area->request.length = 0x0010; in chsc_get_ssd_info()
113 ssd_area->request.code = 0x0004; in chsc_get_ssd_info()
114 ssd_area->ssid = schid.ssid; in chsc_get_ssd_info()
115 ssd_area->f_sch = schid.sch_no; in chsc_get_ssd_info()
116 ssd_area->l_sch = schid.sch_no; in chsc_get_ssd_info()
118 ccode = chsc(ssd_area); in chsc_get_ssd_info()
120 if (ccode > 0) { in chsc_get_ssd_info()
121 ret = (ccode == 3) ? -ENODEV : -EBUSY; in chsc_get_ssd_info()
124 ret = chsc_error_from_response(ssd_area->response.code); in chsc_get_ssd_info()
128 ssd_area->response.code); in chsc_get_ssd_info()
131 if (!ssd_area->sch_valid) { in chsc_get_ssd_info()
132 ret = -ENODEV; in chsc_get_ssd_info()
138 if ((ssd_area->st != SUBCHANNEL_TYPE_IO) && in chsc_get_ssd_info()
139 (ssd_area->st != SUBCHANNEL_TYPE_MSG)) in chsc_get_ssd_info()
141 ssd->path_mask = ssd_area->path_mask; in chsc_get_ssd_info()
142 ssd->fla_valid_mask = ssd_area->fla_valid_mask; in chsc_get_ssd_info()
145 if (ssd_area->path_mask & mask) { in chsc_get_ssd_info()
146 chp_id_init(&ssd->chpid[i]); in chsc_get_ssd_info()
147 ssd->chpid[i].id = ssd_area->chpid[i]; in chsc_get_ssd_info()
149 if (ssd_area->fla_valid_mask & mask) in chsc_get_ssd_info()
150 ssd->fla[i] = ssd_area->fla[i]; in chsc_get_ssd_info()
158 * chsc_ssqd() - store subchannel QDIO data (SSQD)
167 ssqd->request.length = 0x0010; in chsc_ssqd()
168 ssqd->request.code = 0x0024; in chsc_ssqd()
169 ssqd->first_sch = schid.sch_no; in chsc_ssqd()
170 ssqd->last_sch = schid.sch_no; in chsc_ssqd()
171 ssqd->ssid = schid.ssid; in chsc_ssqd()
174 return -EIO; in chsc_ssqd()
176 return chsc_error_from_response(ssqd->response.code); in chsc_ssqd()
181 * chsc_sadc() - set adapter device controls (SADC)
194 scssc->request.length = 0x0fe0; in chsc_sadc()
195 scssc->request.code = 0x0021; in chsc_sadc()
196 scssc->operation_code = 0; in chsc_sadc()
198 scssc->summary_indicator_addr = summary_indicator_addr; in chsc_sadc()
199 scssc->subchannel_indicator_addr = subchannel_indicator_addr; in chsc_sadc()
201 scssc->ks = PAGE_DEFAULT_KEY >> 4; in chsc_sadc()
202 scssc->kc = PAGE_DEFAULT_KEY >> 4; in chsc_sadc()
203 scssc->isc = isc; in chsc_sadc()
204 scssc->schid = schid; in chsc_sadc()
208 scssc->word_with_d_bit = 0x10000000; in chsc_sadc()
211 return -EIO; in chsc_sadc()
213 return chsc_error_from_response(scssc->response.code); in chsc_sadc()
219 spin_lock_irq(sch->lock); in s390_subchannel_remove_chpid()
220 if (sch->driver && sch->driver->chp_event) in s390_subchannel_remove_chpid()
221 if (sch->driver->chp_event(sch, data, CHP_OFFLINE) != 0) in s390_subchannel_remove_chpid()
223 spin_unlock_irq(sch->lock); in s390_subchannel_remove_chpid()
227 sch->lpm = 0; in s390_subchannel_remove_chpid()
228 spin_unlock_irq(sch->lock); in s390_subchannel_remove_chpid()
229 css_schedule_eval(sch->schid); in s390_subchannel_remove_chpid()
249 mutex_lock(&chp->lock); in chsc_chp_offline()
251 mutex_unlock(&chp->lock); in chsc_chp_offline()
258 spin_lock_irq(sch->lock); in __s390_process_res_acc()
259 if (sch->driver && sch->driver->chp_event) in __s390_process_res_acc()
260 sch->driver->chp_event(sch, data, CHP_ONLINE); in __s390_process_res_acc()
261 spin_unlock_irq(sch->lock); in __s390_process_res_acc()
270 sprintf(dbf_txt, "accpr%x.%02x", link->chpid.cssid, in s390_process_res_acc()
271 link->chpid.id); in s390_process_res_acc()
273 if (link->fla != 0) { in s390_process_res_acc()
274 sprintf(dbf_txt, "fla%x", link->fla); in s390_process_res_acc()
299 /* ccdf has to be big enough for a link-incident record */
300 u8 ccdf[PAGE_SIZE - 24 - 16]; /* content-code dependent field */
309 u8 ccdf[PAGE_SIZE - 24 - 56]; /* content-code dependent field */
325 u8 nt_area[PAGE_SIZE - 24];
330 * Link Incident Record as defined in SA22-7202, "ESCON I/O Interface"
373 if (nd->validity != ND_VALIDITY_VALID) { in format_node_data()
374 strncpy(params, "n/a", PARAMS_LEN - 1); in format_node_data()
375 strncpy(id, "n/a", NODEID_LEN - 1); in format_node_data()
380 snprintf(params, PARAMS_LEN, "%02x,%06x", nd->byte0, nd->params); in format_node_data()
382 id = store_ebcdic(id, nd->type, sizeof(nd->type), '/'); in format_node_data()
383 id = store_ebcdic(id, nd->model, sizeof(nd->model), ','); in format_node_data()
384 id = store_ebcdic(id, nd->manufacturer, sizeof(nd->manufacturer), '.'); in format_node_data()
385 id = store_ebcdic(id, nd->plant, sizeof(nd->plant), 0); in format_node_data()
386 id = store_ebcdic(id, nd->seq, sizeof(nd->seq), ','); in format_node_data()
387 sprintf(id, "%04X", nd->tag); in format_node_data()
392 struct lir *lir = (struct lir *) &sei_area->ccdf; in chsc_process_sei_link_incident()
397 sei_area->rs, sei_area->rsid, sei_area->ccdf[0]); in chsc_process_sei_link_incident()
400 if (lir->iq.null) in chsc_process_sei_link_incident()
407 format_node_data(iuparams, iunodeid, &lir->incident_node); in chsc_process_sei_link_incident()
408 format_node_data(auparams, aunodeid, &lir->attached_node); in chsc_process_sei_link_incident()
410 switch (lir->iq.class) { in chsc_process_sei_link_incident()
414 sei_area->rs, sei_area->rsid, lir->ic, iuparams, in chsc_process_sei_link_incident()
420 sei_area->rs, sei_area->rsid, lir->ic, iuparams, in chsc_process_sei_link_incident()
436 "rs_id=%04x)\n", sei_area->rs, sei_area->rsid); in chsc_process_sei_res_acc()
437 if (sei_area->rs != 4) in chsc_process_sei_res_acc()
440 chpid.id = sei_area->rsid; in chsc_process_sei_res_acc()
450 mutex_lock(&chp->lock); in chsc_process_sei_res_acc()
452 mutex_unlock(&chp->lock); in chsc_process_sei_res_acc()
456 if ((sei_area->vf & 0xc0) != 0) { in chsc_process_sei_res_acc()
457 link.fla = sei_area->fla; in chsc_process_sei_res_acc()
458 if ((sei_area->vf & 0xc0) == 0xc0) in chsc_process_sei_res_acc()
476 if (sei_area->rs != 0) in chsc_process_sei_chp_avail()
478 data = sei_area->ccdf; in chsc_process_sei_chp_avail()
492 mutex_lock(&chp->lock); in chsc_process_sei_chp_avail()
494 mutex_unlock(&chp->lock); in chsc_process_sei_chp_avail()
499 u8 map[32]; member
511 CIO_CRW_EVENT(4, "chsc: channel-path-configuration notification\n"); in chsc_process_sei_chp_config()
512 if (sei_area->rs != 0) in chsc_process_sei_chp_config()
514 data = (struct chp_config_data *) &(sei_area->ccdf); in chsc_process_sei_chp_config()
517 if (!chp_test_bit(data->map, num)) in chsc_process_sei_chp_config()
521 events[data->op], chpid.cssid, chpid.id); in chsc_process_sei_chp_config()
522 switch (data->op) { in chsc_process_sei_chp_config()
541 if (sei_area->rs != 7) in chsc_process_sei_scm_change()
555 if (sei_area->rs != 7) in chsc_process_sei_scm_avail()
567 if (sei_area->rs != 5) in chsc_process_sei_ap_cfg_chg()
575 switch (sei_area->cc) { in chsc_process_sei_nt2()
577 zpci_event_error(sei_area->ccdf); in chsc_process_sei_nt2()
580 zpci_event_availability(sei_area->ccdf); in chsc_process_sei_nt2()
584 sei_area->cc); in chsc_process_sei_nt2()
592 switch (sei_area->cc) { in chsc_process_sei_nt0()
602 case 7: /* channel-path-availability information */ in chsc_process_sei_nt0()
605 case 8: /* channel-path-configuration notification */ in chsc_process_sei_nt0()
616 sei_area->cc); in chsc_process_sei_nt0()
621 if (sei_area->flags & 0x40) { in chsc_process_sei_nt0()
633 sei->request.length = 0x0010; in chsc_process_event_information()
634 sei->request.code = 0x000e; in chsc_process_event_information()
636 sei->ntsm = ntsm; in chsc_process_event_information()
641 if (sei->response.code != 0x0001) { in chsc_process_event_information()
643 sei->response.code, sei->ntsm); in chsc_process_event_information()
645 if (sei->response.code == 3 && sei->ntsm) { in chsc_process_event_information()
653 CIO_CRW_EVENT(2, "chsc: sei successful (nt=%d)\n", sei->nt); in chsc_process_event_information()
654 switch (sei->nt) { in chsc_process_event_information()
656 chsc_process_sei_nt0(&sei->u.nt0_area); in chsc_process_event_information()
659 chsc_process_sei_nt2(&sei->u.nt2_area); in chsc_process_event_information()
662 CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); in chsc_process_event_information()
666 if (!(sei->u.nt0_area.flags & 0x80)) in chsc_process_event_information()
688 crw0->slct, crw0->oflw, crw0->chn, crw0->rsc, crw0->anc, in chsc_process_crw()
689 crw0->erc, crw0->rsid); in chsc_process_crw()
710 mutex_lock(&chp->lock); in chsc_chp_online()
712 mutex_unlock(&chp->lock); in chsc_chp_online()
728 spin_lock_irqsave(sch->lock, flags); in __s390_subchannel_vary_chpid()
729 if (sch->driver && sch->driver->chp_event) in __s390_subchannel_vary_chpid()
730 sch->driver->chp_event(sch, &link, in __s390_subchannel_vary_chpid()
732 spin_unlock_irqrestore(sch->lock, flags); in __s390_subchannel_vary_chpid()
752 * chsc_chp_vary - propagate channel-path vary operation to subchannels
753 * @chpid: channl-path ID
754 * @on: non-zero for vary online, zero for vary offline
782 if (!css->chps[i]) in chsc_remove_cmg_attr()
784 chp_remove_cmg_attr(css->chps[i]); in chsc_remove_cmg_attr()
795 if (!css->chps[i]) in chsc_add_cmg_attr()
797 ret = chp_add_cmg_attr(css->chps[i]); in chsc_add_cmg_attr()
803 for (--i; i >= 0; i--) { in chsc_add_cmg_attr()
804 if (!css->chps[i]) in chsc_add_cmg_attr()
806 chp_remove_cmg_attr(css->chps[i]); in chsc_add_cmg_attr()
831 int ret, ccode; in __chsc_do_secm() local
836 secm_area->request.length = 0x0050; in __chsc_do_secm()
837 secm_area->request.code = 0x0016; in __chsc_do_secm()
839 secm_area->key = PAGE_DEFAULT_KEY >> 4; in __chsc_do_secm()
840 secm_area->cub_addr1 = (u64)(unsigned long)css->cub_addr1; in __chsc_do_secm()
841 secm_area->cub_addr2 = (u64)(unsigned long)css->cub_addr2; in __chsc_do_secm()
843 secm_area->operation_code = enable ? 0 : 1; in __chsc_do_secm()
845 ccode = chsc(secm_area); in __chsc_do_secm()
846 if (ccode > 0) { in __chsc_do_secm()
847 ret = (ccode == 3) ? -ENODEV : -EBUSY; in __chsc_do_secm()
851 switch (secm_area->response.code) { in __chsc_do_secm()
854 ret = -EINVAL; in __chsc_do_secm()
857 ret = chsc_error_from_response(secm_area->response.code); in __chsc_do_secm()
861 secm_area->response.code); in __chsc_do_secm()
872 if (enable && !css->cm_enabled) { in chsc_secm()
873 css->cub_addr1 = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); in chsc_secm()
874 css->cub_addr2 = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); in chsc_secm()
875 if (!css->cub_addr1 || !css->cub_addr2) { in chsc_secm()
876 free_page((unsigned long)css->cub_addr1); in chsc_secm()
877 free_page((unsigned long)css->cub_addr2); in chsc_secm()
878 return -ENOMEM; in chsc_secm()
883 css->cm_enabled = enable; in chsc_secm()
884 if (css->cm_enabled) { in chsc_secm()
888 css->cm_enabled = 0; in chsc_secm()
893 if (!css->cm_enabled) { in chsc_secm()
894 free_page((unsigned long)css->cub_addr1); in chsc_secm()
895 free_page((unsigned long)css->cub_addr2); in chsc_secm()
904 int ccode, ret; in chsc_determine_channel_path_desc() local
908 return -EINVAL; in chsc_determine_channel_path_desc()
910 return -EINVAL; in chsc_determine_channel_path_desc()
912 return -EINVAL; in chsc_determine_channel_path_desc()
916 scpd_area->request.length = 0x0010; in chsc_determine_channel_path_desc()
917 scpd_area->request.code = 0x0002; in chsc_determine_channel_path_desc()
918 scpd_area->cssid = chpid.cssid; in chsc_determine_channel_path_desc()
919 scpd_area->first_chpid = chpid.id; in chsc_determine_channel_path_desc()
920 scpd_area->last_chpid = chpid.id; in chsc_determine_channel_path_desc()
921 scpd_area->m = m; in chsc_determine_channel_path_desc()
922 scpd_area->c = c; in chsc_determine_channel_path_desc()
923 scpd_area->fmt = fmt; in chsc_determine_channel_path_desc()
924 scpd_area->rfmt = rfmt; in chsc_determine_channel_path_desc()
926 ccode = chsc(scpd_area); in chsc_determine_channel_path_desc()
927 if (ccode > 0) in chsc_determine_channel_path_desc()
928 return (ccode == 3) ? -ENODEV : -EBUSY; in chsc_determine_channel_path_desc()
930 ret = chsc_error_from_response(scpd_area->response.code); in chsc_determine_channel_path_desc()
933 scpd_area->response.code); in chsc_determine_channel_path_desc()
953 memcpy(desc, scpd_area->data, sizeof(*desc)); \
972 chp->cmg_chars.values[i] = chars->values[i]; in chsc_initialize_cmg_chars()
974 chp->cmg_chars.values[i] = 0; in chsc_initialize_cmg_chars()
981 int ccode, ret; in chsc_get_channel_measurement_chars() local
1004 chp->shared = -1; in chsc_get_channel_measurement_chars()
1005 chp->cmg = -1; in chsc_get_channel_measurement_chars()
1008 return -EINVAL; in chsc_get_channel_measurement_chars()
1013 scmc_area->request.length = 0x0010; in chsc_get_channel_measurement_chars()
1014 scmc_area->request.code = 0x0022; in chsc_get_channel_measurement_chars()
1015 scmc_area->first_chpid = chp->chpid.id; in chsc_get_channel_measurement_chars()
1016 scmc_area->last_chpid = chp->chpid.id; in chsc_get_channel_measurement_chars()
1018 ccode = chsc(scmc_area); in chsc_get_channel_measurement_chars()
1019 if (ccode > 0) { in chsc_get_channel_measurement_chars()
1020 ret = (ccode == 3) ? -ENODEV : -EBUSY; in chsc_get_channel_measurement_chars()
1024 ret = chsc_error_from_response(scmc_area->response.code); in chsc_get_channel_measurement_chars()
1027 scmc_area->response.code); in chsc_get_channel_measurement_chars()
1030 if (scmc_area->not_valid) in chsc_get_channel_measurement_chars()
1033 chp->cmg = scmc_area->cmg; in chsc_get_channel_measurement_chars()
1034 chp->shared = scmc_area->shared; in chsc_get_channel_measurement_chars()
1035 if (chp->cmg != 2 && chp->cmg != 3) { in chsc_get_channel_measurement_chars()
1036 /* No cmg-dependent data. */ in chsc_get_channel_measurement_chars()
1039 chsc_initialize_cmg_chars(chp, scmc_area->cmcv, in chsc_get_channel_measurement_chars()
1040 (struct cmg_chars *) &scmc_area->data); in chsc_get_channel_measurement_chars()
1053 ret = -ENOMEM; in chsc_init()
1077 sda_area->request.length = 0x0400; in __chsc_enable_facility()
1078 sda_area->request.code = 0x0031; in __chsc_enable_facility()
1079 sda_area->operation_code = operation_code; in __chsc_enable_facility()
1083 ret = (ret == 3) ? -ENODEV : -EBUSY; in __chsc_enable_facility()
1087 switch (sda_area->response.code) { in __chsc_enable_facility()
1089 ret = -EOPNOTSUPP; in __chsc_enable_facility()
1092 ret = chsc_error_from_response(sda_area->response.code); in __chsc_enable_facility()
1111 operation_code, sda_area->response.code); in chsc_enable_facility()
1137 sdcal_area->request.length = 0x0020; in chsc_get_cssid_iid()
1138 sdcal_area->request.code = 0x0034; in chsc_get_cssid_iid()
1139 sdcal_area->atype = 4; in chsc_get_cssid_iid()
1143 ret = (ret == 3) ? -ENODEV : -EBUSY; in chsc_get_cssid_iid()
1147 ret = chsc_error_from_response(sdcal_area->response.code); in chsc_get_cssid_iid()
1150 sdcal_area->response.code); in chsc_get_cssid_iid()
1154 if ((addr_t) &sdcal_area->list[idx] < in chsc_get_cssid_iid()
1155 (addr_t) &sdcal_area->response + sdcal_area->response.length) { in chsc_get_cssid_iid()
1156 *cssid = sdcal_area->list[idx].cssid; in chsc_get_cssid_iid()
1157 *iid = sdcal_area->list[idx].iid; in chsc_get_cssid_iid()
1160 ret = -ENODEV; in chsc_get_cssid_iid()
1188 scsc_area->request.length = 0x0010; in chsc_determine_css_characteristics()
1189 scsc_area->request.code = 0x0010; in chsc_determine_css_characteristics()
1193 result = (result == 3) ? -ENODEV : -EBUSY; in chsc_determine_css_characteristics()
1197 result = chsc_error_from_response(scsc_area->response.code); in chsc_determine_css_characteristics()
1199 memcpy(&css_general_characteristics, scsc_area->general_char, in chsc_determine_css_characteristics()
1201 memcpy(&css_chsc_characteristics, scsc_area->chsc_char, in chsc_determine_css_characteristics()
1205 scsc_area->response.code); in chsc_determine_css_characteristics()
1232 rr->request.length = 0x0020; in chsc_sstpc()
1233 rr->request.code = 0x0033; in chsc_sstpc()
1234 rr->op = op; in chsc_sstpc()
1235 rr->ctrl = ctrl; in chsc_sstpc()
1238 return -EIO; in chsc_sstpc()
1239 rc = (rr->response.code == 0x0001) ? 0 : -EIO; in chsc_sstpc()
1241 *clock_delta = rr->clock_delta; in chsc_sstpc()
1257 rr->request.length = 0x0010; in chsc_sstpi()
1258 rr->request.code = 0x0038; in chsc_sstpi()
1261 return -EIO; in chsc_sstpi()
1262 memcpy(result, &rr->data, size); in chsc_sstpi()
1263 return (rr->response.code == 0x0001) ? 0 : -EIO; in chsc_sstpi()
1278 rr->request.length = 0x0010; in chsc_stzi()
1279 rr->request.code = 0x003e; in chsc_stzi()
1282 return -EIO; in chsc_stzi()
1283 memcpy(result, &rr->data, size); in chsc_stzi()
1284 return (rr->response.code == 0x0001) ? 0 : -EIO; in chsc_stzi()
1298 int ccode; in chsc_siosl() local
1304 siosl_area->request.length = 0x0010; in chsc_siosl()
1305 siosl_area->request.code = 0x0046; in chsc_siosl()
1306 siosl_area->word1 = 0x80000000; in chsc_siosl()
1307 siosl_area->sid = schid; in chsc_siosl()
1309 ccode = chsc(siosl_area); in chsc_siosl()
1310 if (ccode > 0) { in chsc_siosl()
1311 if (ccode == 3) in chsc_siosl()
1312 rc = -ENODEV; in chsc_siosl()
1314 rc = -EBUSY; in chsc_siosl()
1315 CIO_MSG_EVENT(2, "chsc: chsc failed for 0.%x.%04x (ccode=%d)\n", in chsc_siosl()
1316 schid.ssid, schid.sch_no, ccode); in chsc_siosl()
1319 rc = chsc_error_from_response(siosl_area->response.code); in chsc_siosl()
1323 siosl_area->response.code); in chsc_siosl()
1334 * chsc_scm_info() - store SCM information (SSI)
1342 int ccode, ret; in chsc_scm_info() local
1345 scm_area->request.length = 0x0020; in chsc_scm_info()
1346 scm_area->request.code = 0x004C; in chsc_scm_info()
1347 scm_area->reqtok = token; in chsc_scm_info()
1349 ccode = chsc(scm_area); in chsc_scm_info()
1350 if (ccode > 0) { in chsc_scm_info()
1351 ret = (ccode == 3) ? -ENODEV : -EBUSY; in chsc_scm_info()
1354 ret = chsc_error_from_response(scm_area->response.code); in chsc_scm_info()
1357 scm_area->response.code); in chsc_scm_info()
1364 * chsc_pnso() - Perform Network-Subchannel Operation
1369 * @cnc: Boolean change-notification control
1379 pnso_area->request.length = 0x0030; in chsc_pnso()
1380 pnso_area->request.code = 0x003d; /* network-subchannel operation */ in chsc_pnso()
1381 pnso_area->m = schid.m; in chsc_pnso()
1382 pnso_area->ssid = schid.ssid; in chsc_pnso()
1383 pnso_area->sch = schid.sch_no; in chsc_pnso()
1384 pnso_area->cssid = schid.cssid; in chsc_pnso()
1385 pnso_area->oc = oc; in chsc_pnso()
1386 pnso_area->resume_token = resume_token; in chsc_pnso()
1387 pnso_area->n = (cnc != 0); in chsc_pnso()
1389 return -EIO; in chsc_pnso()
1390 return chsc_error_from_response(pnso_area->response.code); in chsc_pnso()
1416 sgib_area->request.length = 0x0fe0; in chsc_sgib()
1417 sgib_area->request.code = 0x0021; in chsc_sgib()
1418 sgib_area->op = 0x1; in chsc_sgib()
1419 sgib_area->gib_origin = origin; in chsc_sgib()
1423 ret = chsc_error_from_response(sgib_area->response.code); in chsc_sgib()