diff options
Diffstat (limited to 'drivers/s390/block/dasd_eckd.c')
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 196 |
1 files changed, 124 insertions, 72 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 1e4c89b8b304..21254793c604 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -11,6 +11,8 @@ | |||
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #define KMSG_COMPONENT "dasd" | ||
15 | |||
14 | #include <linux/stddef.h> | 16 | #include <linux/stddef.h> |
15 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
16 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
@@ -87,7 +89,7 @@ dasd_eckd_probe (struct ccw_device *cdev) | |||
87 | /* set ECKD specific ccw-device options */ | 89 | /* set ECKD specific ccw-device options */ |
88 | ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE); | 90 | ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE); |
89 | if (ret) { | 91 | if (ret) { |
90 | printk(KERN_WARNING | 92 | DBF_EVENT(DBF_WARNING, |
91 | "dasd_eckd_probe: could not set ccw-device options " | 93 | "dasd_eckd_probe: could not set ccw-device options " |
92 | "for %s\n", dev_name(&cdev->dev)); | 94 | "for %s\n", dev_name(&cdev->dev)); |
93 | return ret; | 95 | return ret; |
@@ -248,8 +250,8 @@ define_extent(struct ccw1 *ccw, struct DE_eckd_data *data, unsigned int trk, | |||
248 | rc = check_XRC (ccw, data, device); | 250 | rc = check_XRC (ccw, data, device); |
249 | break; | 251 | break; |
250 | default: | 252 | default: |
251 | DBF_DEV_EVENT(DBF_ERR, device, | 253 | dev_err(&device->cdev->dev, |
252 | "PFX LRE unknown opcode 0x%x", cmd); | 254 | "0x%x is not a known command\n", cmd); |
253 | break; | 255 | break; |
254 | } | 256 | } |
255 | 257 | ||
@@ -647,7 +649,8 @@ locate_record(struct ccw1 *ccw, struct LO_eckd_data *data, unsigned int trk, | |||
647 | data->operation.operation = 0x0b; | 649 | data->operation.operation = 0x0b; |
648 | break; | 650 | break; |
649 | default: | 651 | default: |
650 | DEV_MESSAGE(KERN_ERR, device, "unknown opcode 0x%x", cmd); | 652 | DBF_DEV_EVENT(DBF_ERR, device, "unknown locate record " |
653 | "opcode 0x%x", cmd); | ||
651 | } | 654 | } |
652 | set_ch_t(&data->seek_addr, | 655 | set_ch_t(&data->seek_addr, |
653 | trk / private->rdc_data.trk_per_cyl, | 656 | trk / private->rdc_data.trk_per_cyl, |
@@ -742,8 +745,8 @@ static struct dasd_ccw_req *dasd_eckd_build_rcd_lpm(struct dasd_device *device, | |||
742 | cqr = dasd_smalloc_request("ECKD", 1 /* RCD */, ciw->count, device); | 745 | cqr = dasd_smalloc_request("ECKD", 1 /* RCD */, ciw->count, device); |
743 | 746 | ||
744 | if (IS_ERR(cqr)) { | 747 | if (IS_ERR(cqr)) { |
745 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 748 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
746 | "Could not allocate RCD request"); | 749 | "Could not allocate RCD request"); |
747 | return cqr; | 750 | return cqr; |
748 | } | 751 | } |
749 | 752 | ||
@@ -893,14 +896,16 @@ static int dasd_eckd_read_conf(struct dasd_device *device) | |||
893 | rc = dasd_eckd_read_conf_lpm(device, &conf_data, | 896 | rc = dasd_eckd_read_conf_lpm(device, &conf_data, |
894 | &conf_len, lpm); | 897 | &conf_len, lpm); |
895 | if (rc && rc != -EOPNOTSUPP) { /* -EOPNOTSUPP is ok */ | 898 | if (rc && rc != -EOPNOTSUPP) { /* -EOPNOTSUPP is ok */ |
896 | MESSAGE(KERN_WARNING, | 899 | DBF_EVENT(DBF_WARNING, |
897 | "Read configuration data returned " | 900 | "Read configuration data returned " |
898 | "error %d", rc); | 901 | "error %d for device: %s", rc, |
902 | dev_name(&device->cdev->dev)); | ||
899 | return rc; | 903 | return rc; |
900 | } | 904 | } |
901 | if (conf_data == NULL) { | 905 | if (conf_data == NULL) { |
902 | MESSAGE(KERN_WARNING, "%s", "No configuration " | 906 | DBF_EVENT(DBF_WARNING, "No configuration " |
903 | "data retrieved"); | 907 | "data retrieved for device: %s", |
908 | dev_name(&device->cdev->dev)); | ||
904 | continue; /* no error */ | 909 | continue; /* no error */ |
905 | } | 910 | } |
906 | /* save first valid configuration data */ | 911 | /* save first valid configuration data */ |
@@ -947,8 +952,9 @@ static int dasd_eckd_read_features(struct dasd_device *device) | |||
947 | sizeof(struct dasd_rssd_features)), | 952 | sizeof(struct dasd_rssd_features)), |
948 | device); | 953 | device); |
949 | if (IS_ERR(cqr)) { | 954 | if (IS_ERR(cqr)) { |
950 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 955 | DBF_EVENT(DBF_WARNING, "Could not allocate initialization " |
951 | "Could not allocate initialization request"); | 956 | "request for device: %s", |
957 | dev_name(&device->cdev->dev)); | ||
952 | return PTR_ERR(cqr); | 958 | return PTR_ERR(cqr); |
953 | } | 959 | } |
954 | cqr->startdev = device; | 960 | cqr->startdev = device; |
@@ -1009,7 +1015,7 @@ static struct dasd_ccw_req *dasd_eckd_build_psf_ssc(struct dasd_device *device, | |||
1009 | device); | 1015 | device); |
1010 | 1016 | ||
1011 | if (IS_ERR(cqr)) { | 1017 | if (IS_ERR(cqr)) { |
1012 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1018 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
1013 | "Could not allocate PSF-SSC request"); | 1019 | "Could not allocate PSF-SSC request"); |
1014 | return cqr; | 1020 | return cqr; |
1015 | } | 1021 | } |
@@ -1074,10 +1080,10 @@ static int dasd_eckd_validate_server(struct dasd_device *device) | |||
1074 | /* may be requested feature is not available on server, | 1080 | /* may be requested feature is not available on server, |
1075 | * therefore just report error and go ahead */ | 1081 | * therefore just report error and go ahead */ |
1076 | private = (struct dasd_eckd_private *) device->private; | 1082 | private = (struct dasd_eckd_private *) device->private; |
1077 | DEV_MESSAGE(KERN_INFO, device, | 1083 | DBF_EVENT(DBF_WARNING, "PSF-SSC on storage subsystem %s.%s.%04x " |
1078 | "PSF-SSC on storage subsystem %s.%s.%04x returned rc=%d", | 1084 | "returned rc=%d for device: %s", |
1079 | private->uid.vendor, private->uid.serial, | 1085 | private->uid.vendor, private->uid.serial, |
1080 | private->uid.ssid, rc); | 1086 | private->uid.ssid, rc, dev_name(&device->cdev->dev)); |
1081 | /* RE-Read Configuration Data */ | 1087 | /* RE-Read Configuration Data */ |
1082 | return dasd_eckd_read_conf(device); | 1088 | return dasd_eckd_read_conf(device); |
1083 | } | 1089 | } |
@@ -1099,9 +1105,9 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
1099 | private = kzalloc(sizeof(struct dasd_eckd_private), | 1105 | private = kzalloc(sizeof(struct dasd_eckd_private), |
1100 | GFP_KERNEL | GFP_DMA); | 1106 | GFP_KERNEL | GFP_DMA); |
1101 | if (private == NULL) { | 1107 | if (private == NULL) { |
1102 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1108 | dev_warn(&device->cdev->dev, |
1103 | "memory allocation failed for private " | 1109 | "Allocating memory for private DASD data " |
1104 | "data"); | 1110 | "failed\n"); |
1105 | return -ENOMEM; | 1111 | return -ENOMEM; |
1106 | } | 1112 | } |
1107 | device->private = (void *) private; | 1113 | device->private = (void *) private; |
@@ -1126,8 +1132,9 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
1126 | if (private->uid.type == UA_BASE_DEVICE) { | 1132 | if (private->uid.type == UA_BASE_DEVICE) { |
1127 | block = dasd_alloc_block(); | 1133 | block = dasd_alloc_block(); |
1128 | if (IS_ERR(block)) { | 1134 | if (IS_ERR(block)) { |
1129 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1135 | DBF_EVENT(DBF_WARNING, "could not allocate dasd " |
1130 | "could not allocate dasd block structure"); | 1136 | "block structure for device: %s", |
1137 | dev_name(&device->cdev->dev)); | ||
1131 | rc = PTR_ERR(block); | 1138 | rc = PTR_ERR(block); |
1132 | goto out_err1; | 1139 | goto out_err1; |
1133 | } | 1140 | } |
@@ -1158,9 +1165,9 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
1158 | memset(rdc_data, 0, sizeof(rdc_data)); | 1165 | memset(rdc_data, 0, sizeof(rdc_data)); |
1159 | rc = dasd_generic_read_dev_chars(device, "ECKD", &rdc_data, 64); | 1166 | rc = dasd_generic_read_dev_chars(device, "ECKD", &rdc_data, 64); |
1160 | if (rc) { | 1167 | if (rc) { |
1161 | DEV_MESSAGE(KERN_WARNING, device, | 1168 | DBF_EVENT(DBF_WARNING, |
1162 | "Read device characteristics returned " | 1169 | "Read device characteristics failed, rc=%d for " |
1163 | "rc=%d", rc); | 1170 | "device: %s", rc, dev_name(&device->cdev->dev)); |
1164 | goto out_err3; | 1171 | goto out_err3; |
1165 | } | 1172 | } |
1166 | /* find the vaild cylinder size */ | 1173 | /* find the vaild cylinder size */ |
@@ -1170,15 +1177,15 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
1170 | else | 1177 | else |
1171 | private->real_cyl = private->rdc_data.no_cyl; | 1178 | private->real_cyl = private->rdc_data.no_cyl; |
1172 | 1179 | ||
1173 | DEV_MESSAGE(KERN_INFO, device, | 1180 | dev_info(&device->cdev->dev, "New DASD %04X/%02X (CU %04X/%02X) " |
1174 | "%04X/%02X(CU:%04X/%02X) Cyl:%d Head:%d Sec:%d", | 1181 | "with %d cylinders, %d heads, %d sectors\n", |
1175 | private->rdc_data.dev_type, | 1182 | private->rdc_data.dev_type, |
1176 | private->rdc_data.dev_model, | 1183 | private->rdc_data.dev_model, |
1177 | private->rdc_data.cu_type, | 1184 | private->rdc_data.cu_type, |
1178 | private->rdc_data.cu_model.model, | 1185 | private->rdc_data.cu_model.model, |
1179 | private->real_cyl, | 1186 | private->real_cyl, |
1180 | private->rdc_data.trk_per_cyl, | 1187 | private->rdc_data.trk_per_cyl, |
1181 | private->rdc_data.sec_per_trk); | 1188 | private->rdc_data.sec_per_trk); |
1182 | return 0; | 1189 | return 0; |
1183 | 1190 | ||
1184 | out_err3: | 1191 | out_err3: |
@@ -1319,8 +1326,8 @@ dasd_eckd_end_analysis(struct dasd_block *block) | |||
1319 | status = private->init_cqr_status; | 1326 | status = private->init_cqr_status; |
1320 | private->init_cqr_status = -1; | 1327 | private->init_cqr_status = -1; |
1321 | if (status != DASD_CQR_DONE) { | 1328 | if (status != DASD_CQR_DONE) { |
1322 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1329 | dev_warn(&device->cdev->dev, |
1323 | "volume analysis returned unformatted disk"); | 1330 | "The DASD is not formatted\n"); |
1324 | return -EMEDIUMTYPE; | 1331 | return -EMEDIUMTYPE; |
1325 | } | 1332 | } |
1326 | 1333 | ||
@@ -1348,8 +1355,8 @@ dasd_eckd_end_analysis(struct dasd_block *block) | |||
1348 | count_area = &private->count_area[0]; | 1355 | count_area = &private->count_area[0]; |
1349 | } else { | 1356 | } else { |
1350 | if (private->count_area[3].record == 1) | 1357 | if (private->count_area[3].record == 1) |
1351 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1358 | dev_warn(&device->cdev->dev, |
1352 | "Trk 0: no records after VTOC!"); | 1359 | "Track 0 has no records following the VTOC\n"); |
1353 | } | 1360 | } |
1354 | if (count_area != NULL && count_area->kl == 0) { | 1361 | if (count_area != NULL && count_area->kl == 0) { |
1355 | /* we found notthing violating our disk layout */ | 1362 | /* we found notthing violating our disk layout */ |
@@ -1357,8 +1364,8 @@ dasd_eckd_end_analysis(struct dasd_block *block) | |||
1357 | block->bp_block = count_area->dl; | 1364 | block->bp_block = count_area->dl; |
1358 | } | 1365 | } |
1359 | if (block->bp_block == 0) { | 1366 | if (block->bp_block == 0) { |
1360 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1367 | dev_warn(&device->cdev->dev, |
1361 | "Volume has incompatible disk layout"); | 1368 | "The disk layout of the DASD is not supported\n"); |
1362 | return -EMEDIUMTYPE; | 1369 | return -EMEDIUMTYPE; |
1363 | } | 1370 | } |
1364 | block->s2b_shift = 0; /* bits to shift 512 to get a block */ | 1371 | block->s2b_shift = 0; /* bits to shift 512 to get a block */ |
@@ -1370,15 +1377,15 @@ dasd_eckd_end_analysis(struct dasd_block *block) | |||
1370 | private->rdc_data.trk_per_cyl * | 1377 | private->rdc_data.trk_per_cyl * |
1371 | blk_per_trk); | 1378 | blk_per_trk); |
1372 | 1379 | ||
1373 | DEV_MESSAGE(KERN_INFO, device, | 1380 | dev_info(&device->cdev->dev, |
1374 | "(%dkB blks): %dkB at %dkB/trk %s", | 1381 | "DASD with %d KB/block, %d KB total size, %d KB/track, " |
1375 | (block->bp_block >> 10), | 1382 | "%s\n", (block->bp_block >> 10), |
1376 | ((private->real_cyl * | 1383 | ((private->real_cyl * |
1377 | private->rdc_data.trk_per_cyl * | 1384 | private->rdc_data.trk_per_cyl * |
1378 | blk_per_trk * (block->bp_block >> 9)) >> 1), | 1385 | blk_per_trk * (block->bp_block >> 9)) >> 1), |
1379 | ((blk_per_trk * block->bp_block) >> 10), | 1386 | ((blk_per_trk * block->bp_block) >> 10), |
1380 | private->uses_cdl ? | 1387 | private->uses_cdl ? |
1381 | "compatible disk layout" : "linux disk layout"); | 1388 | "compatible disk layout" : "linux disk layout"); |
1382 | 1389 | ||
1383 | return 0; | 1390 | return 0; |
1384 | } | 1391 | } |
@@ -1444,19 +1451,19 @@ dasd_eckd_format_device(struct dasd_device * device, | |||
1444 | /* Sanity checks. */ | 1451 | /* Sanity checks. */ |
1445 | if (fdata->start_unit >= | 1452 | if (fdata->start_unit >= |
1446 | (private->real_cyl * private->rdc_data.trk_per_cyl)) { | 1453 | (private->real_cyl * private->rdc_data.trk_per_cyl)) { |
1447 | DEV_MESSAGE(KERN_INFO, device, "Track no %u too big!", | 1454 | dev_warn(&device->cdev->dev, "Start track number %d used in " |
1448 | fdata->start_unit); | 1455 | "formatting is too big\n", fdata->start_unit); |
1449 | return ERR_PTR(-EINVAL); | 1456 | return ERR_PTR(-EINVAL); |
1450 | } | 1457 | } |
1451 | if (fdata->start_unit > fdata->stop_unit) { | 1458 | if (fdata->start_unit > fdata->stop_unit) { |
1452 | DEV_MESSAGE(KERN_INFO, device, "Track %u reached! ending.", | 1459 | dev_warn(&device->cdev->dev, "Start track %d used in " |
1453 | fdata->start_unit); | 1460 | "formatting exceeds end track\n", fdata->start_unit); |
1454 | return ERR_PTR(-EINVAL); | 1461 | return ERR_PTR(-EINVAL); |
1455 | } | 1462 | } |
1456 | if (dasd_check_blocksize(fdata->blksize) != 0) { | 1463 | if (dasd_check_blocksize(fdata->blksize) != 0) { |
1457 | DEV_MESSAGE(KERN_WARNING, device, | 1464 | dev_warn(&device->cdev->dev, |
1458 | "Invalid blocksize %u...terminating!", | 1465 | "The DASD cannot be formatted with block size %d\n", |
1459 | fdata->blksize); | 1466 | fdata->blksize); |
1460 | return ERR_PTR(-EINVAL); | 1467 | return ERR_PTR(-EINVAL); |
1461 | } | 1468 | } |
1462 | 1469 | ||
@@ -1500,8 +1507,8 @@ dasd_eckd_format_device(struct dasd_device * device, | |||
1500 | sizeof(struct eckd_count); | 1507 | sizeof(struct eckd_count); |
1501 | break; | 1508 | break; |
1502 | default: | 1509 | default: |
1503 | DEV_MESSAGE(KERN_WARNING, device, "Invalid flags 0x%x.", | 1510 | dev_warn(&device->cdev->dev, "An I/O control call used " |
1504 | fdata->intensity); | 1511 | "incorrect flags 0x%x\n", fdata->intensity); |
1505 | return ERR_PTR(-EINVAL); | 1512 | return ERR_PTR(-EINVAL); |
1506 | } | 1513 | } |
1507 | /* Allocate the format ccw request. */ | 1514 | /* Allocate the format ccw request. */ |
@@ -1696,13 +1703,14 @@ static void dasd_eckd_handle_unsolicited_interrupt(struct dasd_device *device, | |||
1696 | 1703 | ||
1697 | if (!sense) { | 1704 | if (!sense) { |
1698 | /* just report other unsolicited interrupts */ | 1705 | /* just report other unsolicited interrupts */ |
1699 | DEV_MESSAGE(KERN_ERR, device, "%s", | 1706 | DBF_DEV_EVENT(DBF_ERR, device, "%s", |
1700 | "unsolicited interrupt received"); | 1707 | "unsolicited interrupt received"); |
1701 | } else { | 1708 | } else { |
1702 | DEV_MESSAGE(KERN_ERR, device, "%s", | 1709 | DBF_DEV_EVENT(DBF_ERR, device, "%s", |
1703 | "unsolicited interrupt received " | 1710 | "unsolicited interrupt received " |
1704 | "(sense available)"); | 1711 | "(sense available)"); |
1705 | device->discipline->dump_sense(device, NULL, irb); | 1712 | device->discipline->dump_sense_dbf(device, NULL, irb, |
1713 | "unsolicited"); | ||
1706 | } | 1714 | } |
1707 | 1715 | ||
1708 | dasd_schedule_device_bh(device); | 1716 | dasd_schedule_device_bh(device); |
@@ -2553,7 +2561,7 @@ dasd_eckd_release(struct dasd_device *device) | |||
2553 | cqr = dasd_smalloc_request(dasd_eckd_discipline.name, | 2561 | cqr = dasd_smalloc_request(dasd_eckd_discipline.name, |
2554 | 1, 32, device); | 2562 | 1, 32, device); |
2555 | if (IS_ERR(cqr)) { | 2563 | if (IS_ERR(cqr)) { |
2556 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 2564 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
2557 | "Could not allocate initialization request"); | 2565 | "Could not allocate initialization request"); |
2558 | return PTR_ERR(cqr); | 2566 | return PTR_ERR(cqr); |
2559 | } | 2567 | } |
@@ -2596,7 +2604,7 @@ dasd_eckd_reserve(struct dasd_device *device) | |||
2596 | cqr = dasd_smalloc_request(dasd_eckd_discipline.name, | 2604 | cqr = dasd_smalloc_request(dasd_eckd_discipline.name, |
2597 | 1, 32, device); | 2605 | 1, 32, device); |
2598 | if (IS_ERR(cqr)) { | 2606 | if (IS_ERR(cqr)) { |
2599 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 2607 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
2600 | "Could not allocate initialization request"); | 2608 | "Could not allocate initialization request"); |
2601 | return PTR_ERR(cqr); | 2609 | return PTR_ERR(cqr); |
2602 | } | 2610 | } |
@@ -2638,7 +2646,7 @@ dasd_eckd_steal_lock(struct dasd_device *device) | |||
2638 | cqr = dasd_smalloc_request(dasd_eckd_discipline.name, | 2646 | cqr = dasd_smalloc_request(dasd_eckd_discipline.name, |
2639 | 1, 32, device); | 2647 | 1, 32, device); |
2640 | if (IS_ERR(cqr)) { | 2648 | if (IS_ERR(cqr)) { |
2641 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 2649 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
2642 | "Could not allocate initialization request"); | 2650 | "Could not allocate initialization request"); |
2643 | return PTR_ERR(cqr); | 2651 | return PTR_ERR(cqr); |
2644 | } | 2652 | } |
@@ -2680,7 +2688,7 @@ dasd_eckd_performance(struct dasd_device *device, void __user *argp) | |||
2680 | sizeof(struct dasd_rssd_perf_stats_t)), | 2688 | sizeof(struct dasd_rssd_perf_stats_t)), |
2681 | device); | 2689 | device); |
2682 | if (IS_ERR(cqr)) { | 2690 | if (IS_ERR(cqr)) { |
2683 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 2691 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
2684 | "Could not allocate initialization request"); | 2692 | "Could not allocate initialization request"); |
2685 | return PTR_ERR(cqr); | 2693 | return PTR_ERR(cqr); |
2686 | } | 2694 | } |
@@ -2770,9 +2778,9 @@ dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp) | |||
2770 | return -EFAULT; | 2778 | return -EFAULT; |
2771 | private->attrib = attrib; | 2779 | private->attrib = attrib; |
2772 | 2780 | ||
2773 | DEV_MESSAGE(KERN_INFO, device, | 2781 | dev_info(&device->cdev->dev, |
2774 | "cache operation mode set to %x (%i cylinder prestage)", | 2782 | "The DASD cache mode was set to %x (%i cylinder prestage)\n", |
2775 | private->attrib.operation, private->attrib.nr_cyl); | 2783 | private->attrib.operation, private->attrib.nr_cyl); |
2776 | return 0; | 2784 | return 0; |
2777 | } | 2785 | } |
2778 | 2786 | ||
@@ -2823,7 +2831,7 @@ static int dasd_symm_io(struct dasd_device *device, void __user *argp) | |||
2823 | /* setup CCWs for PSF + RSSD */ | 2831 | /* setup CCWs for PSF + RSSD */ |
2824 | cqr = dasd_smalloc_request("ECKD", 2 , 0, device); | 2832 | cqr = dasd_smalloc_request("ECKD", 2 , 0, device); |
2825 | if (IS_ERR(cqr)) { | 2833 | if (IS_ERR(cqr)) { |
2826 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 2834 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
2827 | "Could not allocate initialization request"); | 2835 | "Could not allocate initialization request"); |
2828 | rc = PTR_ERR(cqr); | 2836 | rc = PTR_ERR(cqr); |
2829 | goto out_free; | 2837 | goto out_free; |
@@ -2932,6 +2940,49 @@ dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page) | |||
2932 | return len; | 2940 | return len; |
2933 | } | 2941 | } |
2934 | 2942 | ||
2943 | static void | ||
2944 | dasd_eckd_dump_sense_dbf(struct dasd_device *device, struct dasd_ccw_req *req, | ||
2945 | struct irb *irb, char *reason) | ||
2946 | { | ||
2947 | u64 *sense; | ||
2948 | int sl; | ||
2949 | struct tsb *tsb; | ||
2950 | |||
2951 | sense = NULL; | ||
2952 | tsb = NULL; | ||
2953 | if (req && scsw_is_tm(&req->irb.scsw)) { | ||
2954 | if (irb->scsw.tm.tcw) | ||
2955 | tsb = tcw_get_tsb( | ||
2956 | (struct tcw *)(unsigned long)irb->scsw.tm.tcw); | ||
2957 | if (tsb && (irb->scsw.tm.fcxs == 0x01)) { | ||
2958 | switch (tsb->flags & 0x07) { | ||
2959 | case 1: /* tsa_iostat */ | ||
2960 | sense = (u64 *)tsb->tsa.iostat.sense; | ||
2961 | break; | ||
2962 | case 2: /* ts_ddpc */ | ||
2963 | sense = (u64 *)tsb->tsa.ddpc.sense; | ||
2964 | break; | ||
2965 | case 3: /* tsa_intrg */ | ||
2966 | break; | ||
2967 | } | ||
2968 | } | ||
2969 | } else { | ||
2970 | if (irb->esw.esw0.erw.cons) | ||
2971 | sense = (u64 *)irb->ecw; | ||
2972 | } | ||
2973 | if (sense) { | ||
2974 | for (sl = 0; sl < 4; sl++) { | ||
2975 | DBF_DEV_EVENT(DBF_EMERG, device, | ||
2976 | "%s: %016llx %016llx %016llx %016llx", | ||
2977 | reason, sense[0], sense[1], sense[2], | ||
2978 | sense[3]); | ||
2979 | } | ||
2980 | } else { | ||
2981 | DBF_DEV_EVENT(DBF_EMERG, device, "%s", | ||
2982 | "SORRY - NO VALID SENSE AVAILABLE\n"); | ||
2983 | } | ||
2984 | } | ||
2985 | |||
2935 | /* | 2986 | /* |
2936 | * Print sense data and related channel program. | 2987 | * Print sense data and related channel program. |
2937 | * Parts are printed because printk buffer is only 1024 bytes. | 2988 | * Parts are printed because printk buffer is only 1024 bytes. |
@@ -2945,8 +2996,8 @@ static void dasd_eckd_dump_sense_ccw(struct dasd_device *device, | |||
2945 | 2996 | ||
2946 | page = (char *) get_zeroed_page(GFP_ATOMIC); | 2997 | page = (char *) get_zeroed_page(GFP_ATOMIC); |
2947 | if (page == NULL) { | 2998 | if (page == NULL) { |
2948 | DEV_MESSAGE(KERN_ERR, device, " %s", | 2999 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
2949 | "No memory to dump sense data"); | 3000 | "No memory to dump sense data\n"); |
2950 | return; | 3001 | return; |
2951 | } | 3002 | } |
2952 | /* dump the sense data */ | 3003 | /* dump the sense data */ |
@@ -3047,7 +3098,7 @@ static void dasd_eckd_dump_sense_tcw(struct dasd_device *device, | |||
3047 | 3098 | ||
3048 | page = (char *) get_zeroed_page(GFP_ATOMIC); | 3099 | page = (char *) get_zeroed_page(GFP_ATOMIC); |
3049 | if (page == NULL) { | 3100 | if (page == NULL) { |
3050 | DEV_MESSAGE(KERN_ERR, device, " %s", | 3101 | DBF_DEV_EVENT(DBF_WARNING, device, " %s", |
3051 | "No memory to dump sense data"); | 3102 | "No memory to dump sense data"); |
3052 | return; | 3103 | return; |
3053 | } | 3104 | } |
@@ -3206,6 +3257,7 @@ static struct dasd_discipline dasd_eckd_discipline = { | |||
3206 | .build_cp = dasd_eckd_build_alias_cp, | 3257 | .build_cp = dasd_eckd_build_alias_cp, |
3207 | .free_cp = dasd_eckd_free_alias_cp, | 3258 | .free_cp = dasd_eckd_free_alias_cp, |
3208 | .dump_sense = dasd_eckd_dump_sense, | 3259 | .dump_sense = dasd_eckd_dump_sense, |
3260 | .dump_sense_dbf = dasd_eckd_dump_sense_dbf, | ||
3209 | .fill_info = dasd_eckd_fill_info, | 3261 | .fill_info = dasd_eckd_fill_info, |
3210 | .ioctl = dasd_eckd_ioctl, | 3262 | .ioctl = dasd_eckd_ioctl, |
3211 | }; | 3263 | }; |