@@ -660,7 +660,9 @@ BYTE serial[12+1] = {0}; /* Dasd serial number */
660
660
/* Set number of sense bytes according to controller specification */
661
661
dev -> numsense = dev -> ckdcu -> senselength ;
662
662
663
- /* Set flag bit if 3990 controller */
663
+ /* Set flag bit if 3880/3990 controller */
664
+ if (dev -> ckdcu -> devt == 0x3880 )
665
+ dev -> ckd3880 = 1 ;
664
666
if (dev -> ckdcu -> devt == 0x3990 )
665
667
dev -> ckd3990 = 1 ;
666
668
@@ -2276,6 +2278,37 @@ int rc; /* Return code */
2276
2278
return 0 ;
2277
2279
} /* end function ckd_write_data */
2278
2280
2281
+
2282
+ /*-------------------------------------------------------------------*/
2283
+ /* ckd chaining requirement check: returns 0 = okay, -1 = error */
2284
+ /*-------------------------------------------------------------------*/
2285
+ int ckd_chaining_check ( DEVBLK * dev , BYTE * unitstat )
2286
+ {
2287
+ /* For 3990, command reject if not preceded by Seek, Seek Cyl,
2288
+ Locate Record, Read IPL, or Recalibrate command. The same
2289
+ requirement is in place for 3880 with FC 3005. The 2105 and
2290
+ later machines however, are not (yet?) considered.
2291
+ */
2292
+ if (1
2293
+ && (0
2294
+ || dev -> ckd3880
2295
+ || dev -> ckd3990
2296
+ )
2297
+ && !dev -> ckdseek
2298
+ && !dev -> ckdskcyl
2299
+ && !dev -> ckdlocat
2300
+ && !dev -> ckdrdipl
2301
+ && !dev -> ckdrecal
2302
+ )
2303
+ {
2304
+ ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_2 , MESSAGE_2 );
2305
+ * unitstat = CSW_CE | CSW_DE | CSW_UC ;
2306
+ return -1 ;
2307
+ }
2308
+ return 0 ;
2309
+ }
2310
+
2311
+
2279
2312
/*-------------------------------------------------------------------*/
2280
2313
/* Forward references to static helper functions */
2281
2314
/*-------------------------------------------------------------------*/
@@ -2322,6 +2355,7 @@ static bool DefineExtent
2322
2355
U32 * residual
2323
2356
);
2324
2357
2358
+
2325
2359
/*-------------------------------------------------------------------*/
2326
2360
/* Execute a Channel Command Word */
2327
2361
/*-------------------------------------------------------------------*/
@@ -2453,7 +2487,7 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
2453
2487
&& code != 0xDE // READ TRACK
2454
2488
)
2455
2489
{
2456
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 ,FORMAT_0 , MESSAGE_2 );
2490
+ ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
2457
2491
* unitstat = CSW_CE | CSW_DE | CSW_UC ;
2458
2492
return ;
2459
2493
}
@@ -2562,21 +2596,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
2562
2596
/*---------------------------------------------------------------*/
2563
2597
/* READ DATA */
2564
2598
/*---------------------------------------------------------------*/
2565
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
2566
- Locate Record, Read IPL, or Recalibrate command */
2567
- if (1
2568
- && dev -> ckd3990
2569
- && !dev -> ckdseek
2570
- && !dev -> ckdskcyl
2571
- && !dev -> ckdlocat
2572
- && !dev -> ckdrdipl
2573
- && !dev -> ckdrecal
2574
- )
2575
- {
2576
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
2577
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
2599
+
2600
+ /* Check for invalid command sequence */
2601
+ if (ckd_chaining_check ( dev , unitstat ))
2578
2602
break ;
2579
- }
2580
2603
2581
2604
/* Check operation code if within domain of a Locate Record */
2582
2605
if (dev -> ckdlcount > 0 )
@@ -2677,17 +2700,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
2677
2700
/*---------------------------------------------------------------*/
2678
2701
/* READ KEY AND DATA */
2679
2702
/*---------------------------------------------------------------*/
2680
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
2681
- Locate Record, Read IPL, or Recalibrate command */
2682
- if (dev -> ckd3990
2683
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
2684
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
2685
- && dev -> ckdrecal == 0 )
2686
- {
2687
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
2688
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
2703
+
2704
+ /* Check for invalid command sequence */
2705
+ if (ckd_chaining_check ( dev , unitstat ))
2689
2706
break ;
2690
- }
2691
2707
2692
2708
/* Check operation code if within domain of a Locate Record */
2693
2709
if (dev -> ckdlcount > 0 )
@@ -2783,17 +2799,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
2783
2799
/*---------------------------------------------------------------*/
2784
2800
/* READ COUNT */
2785
2801
/*---------------------------------------------------------------*/
2786
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
2787
- Locate Record, Read IPL, or Recalibrate command */
2788
- if (dev -> ckd3990
2789
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
2790
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
2791
- && dev -> ckdrecal == 0 )
2792
- {
2793
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
2794
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
2802
+
2803
+ /* Check for invalid command sequence */
2804
+ if (ckd_chaining_check ( dev , unitstat ))
2795
2805
break ;
2796
- }
2797
2806
2798
2807
/* Check operation code if within domain of a Locate Record */
2799
2808
if (dev -> ckdlcount > 0 )
@@ -2853,17 +2862,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
2853
2862
/*---------------------------------------------------------------*/
2854
2863
/* READ RECORD ZERO */
2855
2864
/*---------------------------------------------------------------*/
2856
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
2857
- Locate Record, Read IPL, or Recalibrate command */
2858
- if (dev -> ckd3990
2859
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
2860
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
2861
- && dev -> ckdrecal == 0 )
2862
- {
2863
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
2864
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
2865
+
2866
+ /* Check for invalid command sequence */
2867
+ if (ckd_chaining_check ( dev , unitstat ))
2865
2868
break ;
2866
- }
2867
2869
2868
2870
/* Check operation code if within domain of a Locate Record */
2869
2871
if (dev -> ckdlcount > 0 )
@@ -2984,20 +2986,9 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
2984
2986
break ;
2985
2987
}
2986
2988
2987
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
2988
- Locate Record, Read IPL, or Recalibrate command. The same
2989
- requirement is in place for 3880 with FC 3005. The 2105 and
2990
- later machines however, are not (yet?) considered.
2991
- */
2992
- if ((dev -> ckd3990 || dev -> ckdcu -> devt == 0x3880 )
2993
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
2994
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
2995
- && dev -> ckdrecal == 0 )
2996
- {
2997
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
2998
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
2989
+ /* Check for invalid command sequence */
2990
+ if (ckd_chaining_check ( dev , unitstat ))
2999
2991
break ;
3000
- }
3001
2992
3002
2993
/* Check operation code if within domain of a Locate Record */
3003
2994
if (dev -> ckdlcount > 0 )
@@ -3091,17 +3082,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
3091
3082
/*---------------------------------------------------------------*/
3092
3083
/* READ HOME ADDRESS */
3093
3084
/*---------------------------------------------------------------*/
3094
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
3095
- Locate Record, Read IPL, or Recalibrate command */
3096
- if (dev -> ckd3990
3097
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
3098
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
3099
- && dev -> ckdrecal == 0 )
3100
- {
3101
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
3102
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3085
+
3086
+ /* Check for invalid command sequence */
3087
+ if (ckd_chaining_check ( dev , unitstat ))
3103
3088
break ;
3104
- }
3105
3089
3106
3090
/* Check operation code if within domain of a Locate Record */
3107
3091
if (dev -> ckdlcount > 0 )
@@ -3164,17 +3148,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
3164
3148
so the IBM HA and Hercules 'track header' have identical
3165
3149
contents.
3166
3150
*/
3167
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
3168
- Locate Record, Read IPL, or Recalibrate command */
3169
- if (dev -> ckd3990
3170
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
3171
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
3172
- && dev -> ckdrecal == 0 )
3173
- {
3174
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
3175
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3151
+
3152
+ /* Check for invalid command sequence */
3153
+ if (ckd_chaining_check ( dev , unitstat ))
3176
3154
break ;
3177
- }
3178
3155
3179
3156
/* Check operation code if within domain of a Locate Record */
3180
3157
if (dev -> ckdlcount > 0 )
@@ -3227,17 +3204,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
3227
3204
/*---------------------------------------------------------------*/
3228
3205
/* READ COUNT KEY AND DATA */
3229
3206
/*---------------------------------------------------------------*/
3230
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
3231
- Locate Record, Read IPL, or Recalibrate command */
3232
- if (dev -> ckd3990
3233
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
3234
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
3235
- && dev -> ckdrecal == 0 )
3236
- {
3237
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
3238
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3207
+
3208
+ /* Check for invalid command sequence */
3209
+ if (ckd_chaining_check ( dev , unitstat ))
3239
3210
break ;
3240
- }
3241
3211
3242
3212
/* Check operation code if within domain of a Locate Record */
3243
3213
if (dev -> ckdlcount > 0 )
@@ -3333,17 +3303,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
3333
3303
/*---------------------------------------------------------------*/
3334
3304
/* READ MULTIPLE COUNT KEY AND DATA */
3335
3305
/*---------------------------------------------------------------*/
3336
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
3337
- Locate Record, Read IPL, or Recalibrate */
3338
- if (dev -> ckd3990
3339
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
3340
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
3341
- && dev -> ckdrecal == 0 )
3342
- {
3343
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
3344
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3306
+
3307
+ /* Check for invalid command sequence */
3308
+ if (ckd_chaining_check ( dev , unitstat ))
3345
3309
break ;
3346
- }
3347
3310
3348
3311
/* Command reject if within the domain of a Locate Record */
3349
3312
if (dev -> ckdlcount > 0 )
@@ -3851,17 +3814,9 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
3851
3814
break ;
3852
3815
}
3853
3816
3854
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
3855
- Locate Record, Read IPL, or Recalibrate command */
3856
- if (dev -> ckd3990
3857
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
3858
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
3859
- && dev -> ckdrecal == 0 )
3860
- {
3861
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
3862
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3817
+ /* Check for invalid command sequence */
3818
+ if (ckd_chaining_check ( dev , unitstat ))
3863
3819
break ;
3864
- }
3865
3820
3866
3821
/* Set residual count */
3867
3822
num = (count < 1 ) ? count : 1 ;
@@ -3885,17 +3840,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
3885
3840
/*---------------------------------------------------------------*/
3886
3841
/* SEARCH KEY */
3887
3842
/*---------------------------------------------------------------*/
3888
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
3889
- Locate Record, Read IPL, or Recalibrate command */
3890
- if (dev -> ckd3990
3891
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
3892
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
3893
- && dev -> ckdrecal == 0 )
3894
- {
3895
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
3896
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3843
+
3844
+ /* Check for invalid command sequence */
3845
+ if (ckd_chaining_check ( dev , unitstat ))
3897
3846
break ;
3898
- }
3899
3847
3900
3848
/* Command reject if within the domain of a Locate Record */
3901
3849
if (dev -> ckdlcount > 0 )
@@ -3968,17 +3916,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
3968
3916
/*---------------------------------------------------------------*/
3969
3917
/* SEARCH ID */
3970
3918
/*---------------------------------------------------------------*/
3971
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
3972
- Locate Record, Read IPL, or Recalibrate command */
3973
- if (dev -> ckd3990
3974
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
3975
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
3976
- && dev -> ckdrecal == 0 )
3977
- {
3978
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
3979
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3919
+
3920
+ /* Check for invalid command sequence */
3921
+ if (ckd_chaining_check ( dev , unitstat ))
3980
3922
break ;
3981
- }
3982
3923
3983
3924
/* Command reject if within the domain of a Locate Record */
3984
3925
if (dev -> ckdlcount > 0 )
@@ -4027,17 +3968,10 @@ BYTE trk_ovfl; /* == 1 if track ovfl write */
4027
3968
/*---------------------------------------------------------------*/
4028
3969
/* SEARCH HOME ADDRESS EQUAL */
4029
3970
/*---------------------------------------------------------------*/
4030
- /* For 3990, command reject if not preceded by Seek, Seek Cyl,
4031
- Locate Record, Read IPL, or Recalibrate command */
4032
- if (dev -> ckd3990
4033
- && dev -> ckdseek == 0 && dev -> ckdskcyl == 0
4034
- && dev -> ckdlocat == 0 && dev -> ckdrdipl == 0
4035
- && dev -> ckdrecal == 0 )
4036
- {
4037
- ckd_build_sense ( dev , SENSE_CR , 0 , 0 , FORMAT_0 , MESSAGE_2 );
4038
- * unitstat = CSW_CE | CSW_DE | CSW_UC ;
3971
+
3972
+ /* Check for invalid command sequence */
3973
+ if (ckd_chaining_check ( dev , unitstat ))
4039
3974
break ;
4040
- }
4041
3975
4042
3976
/* Command reject if within the domain of a Locate Record */
4043
3977
if (dev -> ckdlcount > 0 )
0 commit comments