diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd_alias.c | 4 | ||||
-rw-r--r-- | drivers/s390/block/dasd_devmap.c | 16 | ||||
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 147 | ||||
-rw-r--r-- | drivers/s390/block/dasd_eckd.h | 184 | ||||
-rw-r--r-- | drivers/s390/block/dasd_int.h | 1 |
5 files changed, 189 insertions, 163 deletions
diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c index 2d8df0b30538..20676cdef4a5 100644 --- a/drivers/s390/block/dasd_alias.c +++ b/drivers/s390/block/dasd_alias.c | |||
@@ -91,7 +91,8 @@ static struct alias_pav_group *_find_group(struct alias_lcu *lcu, | |||
91 | else | 91 | else |
92 | search_unit_addr = uid->base_unit_addr; | 92 | search_unit_addr = uid->base_unit_addr; |
93 | list_for_each_entry(pos, &lcu->grouplist, group) { | 93 | list_for_each_entry(pos, &lcu->grouplist, group) { |
94 | if (pos->uid.base_unit_addr == search_unit_addr) | 94 | if (pos->uid.base_unit_addr == search_unit_addr && |
95 | !strncmp(pos->uid.vduit, uid->vduit, sizeof(uid->vduit))) | ||
95 | return pos; | 96 | return pos; |
96 | }; | 97 | }; |
97 | return NULL; | 98 | return NULL; |
@@ -332,6 +333,7 @@ static int _add_device_to_lcu(struct alias_lcu *lcu, | |||
332 | group->uid.base_unit_addr = uid->real_unit_addr; | 333 | group->uid.base_unit_addr = uid->real_unit_addr; |
333 | else | 334 | else |
334 | group->uid.base_unit_addr = uid->base_unit_addr; | 335 | group->uid.base_unit_addr = uid->base_unit_addr; |
336 | memcpy(group->uid.vduit, uid->vduit, sizeof(uid->vduit)); | ||
335 | INIT_LIST_HEAD(&group->group); | 337 | INIT_LIST_HEAD(&group->group); |
336 | INIT_LIST_HEAD(&group->baselist); | 338 | INIT_LIST_HEAD(&group->baselist); |
337 | INIT_LIST_HEAD(&group->aliaslist); | 339 | INIT_LIST_HEAD(&group->aliaslist); |
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index d774e79476fe..cd3335c1c307 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c | |||
@@ -913,7 +913,8 @@ dasd_vendor_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
913 | static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL); | 913 | static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL); |
914 | 914 | ||
915 | #define UID_STRLEN ( /* vendor */ 3 + 1 + /* serial */ 14 + 1 +\ | 915 | #define UID_STRLEN ( /* vendor */ 3 + 1 + /* serial */ 14 + 1 +\ |
916 | /* SSID */ 4 + 1 + /* unit addr */ 2 + 1) | 916 | /* SSID */ 4 + 1 + /* unit addr */ 2 + 1 +\ |
917 | /* vduit */ 32 + 1) | ||
917 | 918 | ||
918 | static ssize_t | 919 | static ssize_t |
919 | dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf) | 920 | dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf) |
@@ -945,8 +946,17 @@ dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
945 | sprintf(ua_string, "%02x", uid->real_unit_addr); | 946 | sprintf(ua_string, "%02x", uid->real_unit_addr); |
946 | break; | 947 | break; |
947 | } | 948 | } |
948 | snprintf(uid_string, sizeof(uid_string), "%s.%s.%04x.%s", | 949 | if (strlen(uid->vduit) > 0) |
949 | uid->vendor, uid->serial, uid->ssid, ua_string); | 950 | snprintf(uid_string, sizeof(uid_string), |
951 | "%s.%s.%04x.%s.%s", | ||
952 | uid->vendor, uid->serial, | ||
953 | uid->ssid, ua_string, | ||
954 | uid->vduit); | ||
955 | else | ||
956 | snprintf(uid_string, sizeof(uid_string), | ||
957 | "%s.%s.%04x.%s", | ||
958 | uid->vendor, uid->serial, | ||
959 | uid->ssid, ua_string); | ||
950 | spin_unlock(&dasd_devmap_lock); | 960 | spin_unlock(&dasd_devmap_lock); |
951 | return snprintf(buf, PAGE_SIZE, "%s\n", uid_string); | 961 | return snprintf(buf, PAGE_SIZE, "%s\n", uid_string); |
952 | } | 962 | } |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 3590fdb5b2fd..773b3fe275b2 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -313,8 +313,8 @@ static int prefix(struct ccw1 *ccw, struct PFX_eckd_data *pfxdata, int trk, | |||
313 | memset(pfxdata, 0, sizeof(*pfxdata)); | 313 | memset(pfxdata, 0, sizeof(*pfxdata)); |
314 | /* prefix data */ | 314 | /* prefix data */ |
315 | pfxdata->format = 0; | 315 | pfxdata->format = 0; |
316 | pfxdata->base_address = basepriv->conf_data.ned1.unit_addr; | 316 | pfxdata->base_address = basepriv->ned->unit_addr; |
317 | pfxdata->base_lss = basepriv->conf_data.ned1.ID; | 317 | pfxdata->base_lss = basepriv->ned->ID; |
318 | pfxdata->validity.define_extend = 1; | 318 | pfxdata->validity.define_extend = 1; |
319 | 319 | ||
320 | /* private uid is kept up to date, conf_data may be outdated */ | 320 | /* private uid is kept up to date, conf_data may be outdated */ |
@@ -536,36 +536,40 @@ dasd_eckd_cdl_reclen(int recid) | |||
536 | /* | 536 | /* |
537 | * Generate device unique id that specifies the physical device. | 537 | * Generate device unique id that specifies the physical device. |
538 | */ | 538 | */ |
539 | static int | 539 | static int dasd_eckd_generate_uid(struct dasd_device *device, |
540 | dasd_eckd_generate_uid(struct dasd_device *device, struct dasd_uid *uid) | 540 | struct dasd_uid *uid) |
541 | { | 541 | { |
542 | struct dasd_eckd_private *private; | 542 | struct dasd_eckd_private *private; |
543 | struct dasd_eckd_confdata *confdata; | 543 | int count; |
544 | 544 | ||
545 | private = (struct dasd_eckd_private *) device->private; | 545 | private = (struct dasd_eckd_private *) device->private; |
546 | if (!private) | 546 | if (!private) |
547 | return -ENODEV; | 547 | return -ENODEV; |
548 | confdata = &private->conf_data; | 548 | if (!private->ned || !private->gneq) |
549 | if (!confdata) | ||
550 | return -ENODEV; | 549 | return -ENODEV; |
551 | 550 | ||
552 | memset(uid, 0, sizeof(struct dasd_uid)); | 551 | memset(uid, 0, sizeof(struct dasd_uid)); |
553 | memcpy(uid->vendor, confdata->ned1.HDA_manufacturer, | 552 | memcpy(uid->vendor, private->ned->HDA_manufacturer, |
554 | sizeof(uid->vendor) - 1); | 553 | sizeof(uid->vendor) - 1); |
555 | EBCASC(uid->vendor, sizeof(uid->vendor) - 1); | 554 | EBCASC(uid->vendor, sizeof(uid->vendor) - 1); |
556 | memcpy(uid->serial, confdata->ned1.HDA_location, | 555 | memcpy(uid->serial, private->ned->HDA_location, |
557 | sizeof(uid->serial) - 1); | 556 | sizeof(uid->serial) - 1); |
558 | EBCASC(uid->serial, sizeof(uid->serial) - 1); | 557 | EBCASC(uid->serial, sizeof(uid->serial) - 1); |
559 | uid->ssid = confdata->neq.subsystemID; | 558 | uid->ssid = private->gneq->subsystemID; |
560 | uid->real_unit_addr = confdata->ned1.unit_addr; | 559 | uid->real_unit_addr = private->ned->unit_addr;; |
561 | if (confdata->ned2.sneq.flags == 0x40 && | 560 | if (private->sneq) { |
562 | confdata->ned2.sneq.format == 0x0001) { | 561 | uid->type = private->sneq->sua_flags; |
563 | uid->type = confdata->ned2.sneq.sua_flags; | ||
564 | if (uid->type == UA_BASE_PAV_ALIAS) | 562 | if (uid->type == UA_BASE_PAV_ALIAS) |
565 | uid->base_unit_addr = confdata->ned2.sneq.base_unit_addr; | 563 | uid->base_unit_addr = private->sneq->base_unit_addr; |
566 | } else { | 564 | } else { |
567 | uid->type = UA_BASE_DEVICE; | 565 | uid->type = UA_BASE_DEVICE; |
568 | } | 566 | } |
567 | if (private->vdsneq) { | ||
568 | for (count = 0; count < 16; count++) { | ||
569 | sprintf(uid->vduit+2*count, "%02x", | ||
570 | private->vdsneq->uit[count]); | ||
571 | } | ||
572 | } | ||
569 | return 0; | 573 | return 0; |
570 | } | 574 | } |
571 | 575 | ||
@@ -623,6 +627,15 @@ static int dasd_eckd_read_conf_lpm(struct dasd_device *device, | |||
623 | ret = -ENOMEM; | 627 | ret = -ENOMEM; |
624 | goto out_error; | 628 | goto out_error; |
625 | } | 629 | } |
630 | |||
631 | /* | ||
632 | * buffer has to start with EBCDIC "V1.0" to show | ||
633 | * support for virtual device SNEQ | ||
634 | */ | ||
635 | rcd_buf[0] = 0xE5; | ||
636 | rcd_buf[1] = 0xF1; | ||
637 | rcd_buf[2] = 0x4B; | ||
638 | rcd_buf[3] = 0xF0; | ||
626 | cqr = dasd_eckd_build_rcd_lpm(device, rcd_buf, ciw, lpm); | 639 | cqr = dasd_eckd_build_rcd_lpm(device, rcd_buf, ciw, lpm); |
627 | if (IS_ERR(cqr)) { | 640 | if (IS_ERR(cqr)) { |
628 | ret = PTR_ERR(cqr); | 641 | ret = PTR_ERR(cqr); |
@@ -646,8 +659,62 @@ out_error: | |||
646 | return ret; | 659 | return ret; |
647 | } | 660 | } |
648 | 661 | ||
649 | static int | 662 | static int dasd_eckd_identify_conf_parts(struct dasd_eckd_private *private) |
650 | dasd_eckd_read_conf(struct dasd_device *device) | 663 | { |
664 | |||
665 | struct dasd_sneq *sneq; | ||
666 | int i, count; | ||
667 | |||
668 | private->ned = NULL; | ||
669 | private->sneq = NULL; | ||
670 | private->vdsneq = NULL; | ||
671 | private->gneq = NULL; | ||
672 | count = private->conf_len / sizeof(struct dasd_sneq); | ||
673 | sneq = (struct dasd_sneq *)private->conf_data; | ||
674 | for (i = 0; i < count; ++i) { | ||
675 | if (sneq->flags.identifier == 1 && sneq->format == 1) | ||
676 | private->sneq = sneq; | ||
677 | else if (sneq->flags.identifier == 1 && sneq->format == 4) | ||
678 | private->vdsneq = (struct vd_sneq *)sneq; | ||
679 | else if (sneq->flags.identifier == 2) | ||
680 | private->gneq = (struct dasd_gneq *)sneq; | ||
681 | else if (sneq->flags.identifier == 3 && sneq->res1 == 1) | ||
682 | private->ned = (struct dasd_ned *)sneq; | ||
683 | sneq++; | ||
684 | } | ||
685 | if (!private->ned || !private->gneq) { | ||
686 | private->ned = NULL; | ||
687 | private->sneq = NULL; | ||
688 | private->vdsneq = NULL; | ||
689 | private->gneq = NULL; | ||
690 | return -EINVAL; | ||
691 | } | ||
692 | return 0; | ||
693 | |||
694 | }; | ||
695 | |||
696 | static unsigned char dasd_eckd_path_access(void *conf_data, int conf_len) | ||
697 | { | ||
698 | struct dasd_gneq *gneq; | ||
699 | int i, count, found; | ||
700 | |||
701 | count = conf_len / sizeof(*gneq); | ||
702 | gneq = (struct dasd_gneq *)conf_data; | ||
703 | found = 0; | ||
704 | for (i = 0; i < count; ++i) { | ||
705 | if (gneq->flags.identifier == 2) { | ||
706 | found = 1; | ||
707 | break; | ||
708 | } | ||
709 | gneq++; | ||
710 | } | ||
711 | if (found) | ||
712 | return ((char *)gneq)[18] & 0x07; | ||
713 | else | ||
714 | return 0; | ||
715 | } | ||
716 | |||
717 | static int dasd_eckd_read_conf(struct dasd_device *device) | ||
651 | { | 718 | { |
652 | void *conf_data; | 719 | void *conf_data; |
653 | int conf_len, conf_data_saved; | 720 | int conf_len, conf_data_saved; |
@@ -661,7 +728,6 @@ dasd_eckd_read_conf(struct dasd_device *device) | |||
661 | path_data->opm = ccw_device_get_path_mask(device->cdev); | 728 | path_data->opm = ccw_device_get_path_mask(device->cdev); |
662 | lpm = 0x80; | 729 | lpm = 0x80; |
663 | conf_data_saved = 0; | 730 | conf_data_saved = 0; |
664 | |||
665 | /* get configuration data per operational path */ | 731 | /* get configuration data per operational path */ |
666 | for (lpm = 0x80; lpm; lpm>>= 1) { | 732 | for (lpm = 0x80; lpm; lpm>>= 1) { |
667 | if (lpm & path_data->opm){ | 733 | if (lpm & path_data->opm){ |
@@ -678,22 +744,20 @@ dasd_eckd_read_conf(struct dasd_device *device) | |||
678 | "data retrieved"); | 744 | "data retrieved"); |
679 | continue; /* no error */ | 745 | continue; /* no error */ |
680 | } | 746 | } |
681 | if (conf_len != sizeof(struct dasd_eckd_confdata)) { | ||
682 | MESSAGE(KERN_WARNING, | ||
683 | "sizes of configuration data mismatch" | ||
684 | "%d (read) vs %ld (expected)", | ||
685 | conf_len, | ||
686 | sizeof(struct dasd_eckd_confdata)); | ||
687 | kfree(conf_data); | ||
688 | continue; /* no error */ | ||
689 | } | ||
690 | /* save first valid configuration data */ | 747 | /* save first valid configuration data */ |
691 | if (!conf_data_saved){ | 748 | if (!conf_data_saved) { |
692 | memcpy(&private->conf_data, conf_data, | 749 | kfree(private->conf_data); |
693 | sizeof(struct dasd_eckd_confdata)); | 750 | private->conf_data = conf_data; |
751 | private->conf_len = conf_len; | ||
752 | if (dasd_eckd_identify_conf_parts(private)) { | ||
753 | private->conf_data = NULL; | ||
754 | private->conf_len = 0; | ||
755 | kfree(conf_data); | ||
756 | continue; | ||
757 | } | ||
694 | conf_data_saved++; | 758 | conf_data_saved++; |
695 | } | 759 | } |
696 | switch (((char *)conf_data)[242] & 0x07){ | 760 | switch (dasd_eckd_path_access(conf_data, conf_len)) { |
697 | case 0x02: | 761 | case 0x02: |
698 | path_data->npm |= lpm; | 762 | path_data->npm |= lpm; |
699 | break; | 763 | break; |
@@ -701,7 +765,8 @@ dasd_eckd_read_conf(struct dasd_device *device) | |||
701 | path_data->ppm |= lpm; | 765 | path_data->ppm |= lpm; |
702 | break; | 766 | break; |
703 | } | 767 | } |
704 | kfree(conf_data); | 768 | if (conf_data != private->conf_data) |
769 | kfree(conf_data); | ||
705 | } | 770 | } |
706 | } | 771 | } |
707 | return 0; | 772 | return 0; |
@@ -952,6 +1017,7 @@ out_err2: | |||
952 | dasd_free_block(device->block); | 1017 | dasd_free_block(device->block); |
953 | device->block = NULL; | 1018 | device->block = NULL; |
954 | out_err1: | 1019 | out_err1: |
1020 | kfree(private->conf_data); | ||
955 | kfree(device->private); | 1021 | kfree(device->private); |
956 | device->private = NULL; | 1022 | device->private = NULL; |
957 | return rc; | 1023 | return rc; |
@@ -959,7 +1025,17 @@ out_err1: | |||
959 | 1025 | ||
960 | static void dasd_eckd_uncheck_device(struct dasd_device *device) | 1026 | static void dasd_eckd_uncheck_device(struct dasd_device *device) |
961 | { | 1027 | { |
1028 | struct dasd_eckd_private *private; | ||
1029 | |||
1030 | private = (struct dasd_eckd_private *) device->private; | ||
962 | dasd_alias_disconnect_device_from_lcu(device); | 1031 | dasd_alias_disconnect_device_from_lcu(device); |
1032 | private->ned = NULL; | ||
1033 | private->sneq = NULL; | ||
1034 | private->vdsneq = NULL; | ||
1035 | private->gneq = NULL; | ||
1036 | private->conf_len = 0; | ||
1037 | kfree(private->conf_data); | ||
1038 | private->conf_data = NULL; | ||
963 | } | 1039 | } |
964 | 1040 | ||
965 | static struct dasd_ccw_req * | 1041 | static struct dasd_ccw_req * |
@@ -1746,9 +1822,10 @@ dasd_eckd_fill_info(struct dasd_device * device, | |||
1746 | info->characteristics_size = sizeof(struct dasd_eckd_characteristics); | 1822 | info->characteristics_size = sizeof(struct dasd_eckd_characteristics); |
1747 | memcpy(info->characteristics, &private->rdc_data, | 1823 | memcpy(info->characteristics, &private->rdc_data, |
1748 | sizeof(struct dasd_eckd_characteristics)); | 1824 | sizeof(struct dasd_eckd_characteristics)); |
1749 | info->confdata_size = sizeof(struct dasd_eckd_confdata); | 1825 | info->confdata_size = min((unsigned long)private->conf_len, |
1750 | memcpy(info->configuration_data, &private->conf_data, | 1826 | sizeof(info->configuration_data)); |
1751 | sizeof(struct dasd_eckd_confdata)); | 1827 | memcpy(info->configuration_data, private->conf_data, |
1828 | info->confdata_size); | ||
1752 | return 0; | 1829 | return 0; |
1753 | } | 1830 | } |
1754 | 1831 | ||
diff --git a/drivers/s390/block/dasd_eckd.h b/drivers/s390/block/dasd_eckd.h index fc2509c939bc..4bf0aa5112c1 100644 --- a/drivers/s390/block/dasd_eckd.h +++ b/drivers/s390/block/dasd_eckd.h | |||
@@ -231,133 +231,62 @@ struct dasd_eckd_characteristics { | |||
231 | __u8 reserved3[10]; | 231 | __u8 reserved3[10]; |
232 | } __attribute__ ((packed)); | 232 | } __attribute__ ((packed)); |
233 | 233 | ||
234 | struct dasd_eckd_confdata { | 234 | /* elements of the configuration data */ |
235 | struct dasd_ned { | ||
235 | struct { | 236 | struct { |
236 | struct { | 237 | __u8 identifier:2; |
237 | unsigned char identifier:2; | 238 | __u8 token_id:1; |
238 | unsigned char token_id:1; | 239 | __u8 sno_valid:1; |
239 | unsigned char sno_valid:1; | 240 | __u8 subst_sno:1; |
240 | unsigned char subst_sno:1; | 241 | __u8 recNED:1; |
241 | unsigned char recNED:1; | 242 | __u8 emuNED:1; |
242 | unsigned char emuNED:1; | 243 | __u8 reserved:1; |
243 | unsigned char reserved:1; | 244 | } __attribute__ ((packed)) flags; |
244 | } __attribute__ ((packed)) flags; | 245 | __u8 descriptor; |
245 | __u8 descriptor; | 246 | __u8 dev_class; |
246 | __u8 dev_class; | 247 | __u8 reserved; |
247 | __u8 reserved; | 248 | __u8 dev_type[6]; |
248 | unsigned char dev_type[6]; | 249 | __u8 dev_model[3]; |
249 | unsigned char dev_model[3]; | 250 | __u8 HDA_manufacturer[3]; |
250 | unsigned char HDA_manufacturer[3]; | 251 | __u8 HDA_location[2]; |
251 | unsigned char HDA_location[2]; | 252 | __u8 HDA_seqno[12]; |
252 | unsigned char HDA_seqno[12]; | 253 | __u8 ID; |
253 | __u8 ID; | 254 | __u8 unit_addr; |
254 | __u8 unit_addr; | 255 | } __attribute__ ((packed)); |
255 | } __attribute__ ((packed)) ned1; | 256 | |
256 | union { | 257 | struct dasd_sneq { |
257 | struct { | ||
258 | struct { | ||
259 | unsigned char identifier:2; | ||
260 | unsigned char token_id:1; | ||
261 | unsigned char sno_valid:1; | ||
262 | unsigned char subst_sno:1; | ||
263 | unsigned char recNED:1; | ||
264 | unsigned char emuNED:1; | ||
265 | unsigned char reserved:1; | ||
266 | } __attribute__ ((packed)) flags; | ||
267 | __u8 descriptor; | ||
268 | __u8 reserved[2]; | ||
269 | unsigned char dev_type[6]; | ||
270 | unsigned char dev_model[3]; | ||
271 | unsigned char DASD_manufacturer[3]; | ||
272 | unsigned char DASD_location[2]; | ||
273 | unsigned char DASD_seqno[12]; | ||
274 | __u16 ID; | ||
275 | } __attribute__ ((packed)) ned; | ||
276 | struct { | ||
277 | unsigned char flags; /* byte 0 */ | ||
278 | unsigned char res1; /* byte 1 */ | ||
279 | __u16 format; /* byte 2-3 */ | ||
280 | unsigned char res2[4]; /* byte 4-7 */ | ||
281 | unsigned char sua_flags; /* byte 8 */ | ||
282 | __u8 base_unit_addr; /* byte 9 */ | ||
283 | unsigned char res3[22]; /* byte 10-31 */ | ||
284 | } __attribute__ ((packed)) sneq; | ||
285 | } __attribute__ ((packed)) ned2; | ||
286 | struct { | 258 | struct { |
287 | struct { | 259 | __u8 identifier:2; |
288 | unsigned char identifier:2; | 260 | __u8 reserved:6; |
289 | unsigned char token_id:1; | 261 | } __attribute__ ((packed)) flags; |
290 | unsigned char sno_valid:1; | 262 | __u8 res1; |
291 | unsigned char subst_sno:1; | 263 | __u16 format; |
292 | unsigned char recNED:1; | 264 | __u8 res2[4]; /* byte 4- 7 */ |
293 | unsigned char emuNED:1; | 265 | __u8 sua_flags; /* byte 8 */ |
294 | unsigned char reserved:1; | 266 | __u8 base_unit_addr; /* byte 9 */ |
295 | } __attribute__ ((packed)) flags; | 267 | __u8 res3[22]; /* byte 10-31 */ |
296 | __u8 descriptor; | 268 | } __attribute__ ((packed)); |
297 | __u8 reserved[2]; | 269 | |
298 | unsigned char cont_type[6]; | 270 | struct vd_sneq { |
299 | unsigned char cont_model[3]; | ||
300 | unsigned char cont_manufacturer[3]; | ||
301 | unsigned char cont_location[2]; | ||
302 | unsigned char cont_seqno[12]; | ||
303 | __u16 ID; | ||
304 | } __attribute__ ((packed)) ned3; | ||
305 | struct { | 271 | struct { |
306 | struct { | 272 | __u8 identifier:2; |
307 | unsigned char identifier:2; | 273 | __u8 reserved:6; |
308 | unsigned char token_id:1; | 274 | } __attribute__ ((packed)) flags; |
309 | unsigned char sno_valid:1; | 275 | __u8 res1; |
310 | unsigned char subst_sno:1; | 276 | __u16 format; |
311 | unsigned char recNED:1; | 277 | __u8 res2[4]; /* byte 4- 7 */ |
312 | unsigned char emuNED:1; | 278 | __u8 uit[16]; /* byte 8-23 */ |
313 | unsigned char reserved:1; | 279 | __u8 res3[8]; /* byte 24-31 */ |
314 | } __attribute__ ((packed)) flags; | 280 | } __attribute__ ((packed)); |
315 | __u8 descriptor; | 281 | |
316 | __u8 reserved[2]; | 282 | struct dasd_gneq { |
317 | unsigned char cont_type[6]; | ||
318 | unsigned char empty[3]; | ||
319 | unsigned char cont_manufacturer[3]; | ||
320 | unsigned char cont_location[2]; | ||
321 | unsigned char cont_seqno[12]; | ||
322 | __u16 ID; | ||
323 | } __attribute__ ((packed)) ned4; | ||
324 | unsigned char ned5[32]; | ||
325 | unsigned char ned6[32]; | ||
326 | unsigned char ned7[32]; | ||
327 | struct { | 283 | struct { |
328 | struct { | 284 | __u8 identifier:2; |
329 | unsigned char identifier:2; | 285 | __u8 reserved:6; |
330 | unsigned char reserved:6; | 286 | } __attribute__ ((packed)) flags; |
331 | } __attribute__ ((packed)) flags; | 287 | __u8 reserved[7]; |
332 | __u8 selector; | 288 | __u16 subsystemID; |
333 | __u16 interfaceID; | 289 | __u8 reserved2[22]; |
334 | __u32 reserved; | ||
335 | __u16 subsystemID; | ||
336 | struct { | ||
337 | unsigned char sp0:1; | ||
338 | unsigned char sp1:1; | ||
339 | unsigned char reserved:5; | ||
340 | unsigned char scluster:1; | ||
341 | } __attribute__ ((packed)) spathID; | ||
342 | __u8 unit_address; | ||
343 | __u8 dev_ID; | ||
344 | __u8 dev_address; | ||
345 | __u8 adapterID; | ||
346 | __u16 link_address; | ||
347 | struct { | ||
348 | unsigned char parallel:1; | ||
349 | unsigned char escon:1; | ||
350 | unsigned char reserved:1; | ||
351 | unsigned char ficon:1; | ||
352 | unsigned char reserved2:4; | ||
353 | } __attribute__ ((packed)) protocol_type; | ||
354 | struct { | ||
355 | unsigned char PID_in_236:1; | ||
356 | unsigned char reserved:7; | ||
357 | } __attribute__ ((packed)) format_flags; | ||
358 | __u8 log_dev_address; | ||
359 | unsigned char reserved2[12]; | ||
360 | } __attribute__ ((packed)) neq; | ||
361 | } __attribute__ ((packed)); | 290 | } __attribute__ ((packed)); |
362 | 291 | ||
363 | struct dasd_eckd_path { | 292 | struct dasd_eckd_path { |
@@ -463,7 +392,14 @@ struct alias_pav_group { | |||
463 | 392 | ||
464 | struct dasd_eckd_private { | 393 | struct dasd_eckd_private { |
465 | struct dasd_eckd_characteristics rdc_data; | 394 | struct dasd_eckd_characteristics rdc_data; |
466 | struct dasd_eckd_confdata conf_data; | 395 | u8 *conf_data; |
396 | int conf_len; | ||
397 | /* pointers to specific parts in the conf_data */ | ||
398 | struct dasd_ned *ned; | ||
399 | struct dasd_sneq *sneq; | ||
400 | struct vd_sneq *vdsneq; | ||
401 | struct dasd_gneq *gneq; | ||
402 | |||
467 | struct dasd_eckd_path path_data; | 403 | struct dasd_eckd_path path_data; |
468 | struct eckd_count count_area[5]; | 404 | struct eckd_count count_area[5]; |
469 | int init_cqr_status; | 405 | int init_cqr_status; |
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index fb2f931cf844..31ecaa4a40e4 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
@@ -307,6 +307,7 @@ struct dasd_uid { | |||
307 | __u16 ssid; | 307 | __u16 ssid; |
308 | __u8 real_unit_addr; | 308 | __u8 real_unit_addr; |
309 | __u8 base_unit_addr; | 309 | __u8 base_unit_addr; |
310 | char vduit[33]; | ||
310 | }; | 311 | }; |
311 | 312 | ||
312 | /* | 313 | /* |