@@ -2277,37 +2277,62 @@ int found_buff = 0; /* Found primed o/p buffer */
2277
2277
/*-------------------------------------------------------------------*/
2278
2278
/* Halt device related functions... */
2279
2279
/*-------------------------------------------------------------------*/
2280
- static void qeth_signal_halt (OSA_GRP * grp )
2280
+ static void qeth_halt_read_device (DEVBLK * dev , OSA_GRP * grp )
2281
+ {
2282
+ if (dev -> qdio .idxstate == MPC_IDX_STATE_ACTIVE )
2283
+ {
2284
+ DBGTRC ( dev , "Halting read device\n" );
2285
+
2286
+ /* Ask, then wait for, the READ CCW loop to exit */
2287
+ obtain_lock ( & grp -> qlock );
2288
+ PTT_QETH_TRACE ( "b4 halt read" , 0 ,0 ,0 );
2289
+ dev -> qdio .idxstate = MPC_IDX_STATE_HALTING ;
2290
+ signal_condition ( & grp -> qcond );
2291
+ wait_condition ( & grp -> qcond , & grp -> qlock );
2292
+ PTT_QETH_TRACE ( "af halt read" , 0 ,0 ,0 );
2293
+ release_lock ( & grp -> qlock );
2294
+
2295
+ DBGTRC ( dev , "Read device halted\n" );
2296
+ }
2297
+ }
2298
+
2299
+ static void qeth_halt_data_device (DEVBLK * dev , OSA_GRP * grp )
2281
2300
{
2282
2301
fd_set readset ;
2283
2302
BYTE sig = QDSIG_HALT ;
2284
2303
2285
- /* Send signal */
2286
- qeth_write_pipe ( grp -> ppfd [1 ], & sig );
2304
+ UNREFERENCED (dev ); /* (unreferenced for non-DEBUG builds) */
2287
2305
2288
- /* Wait for reply */
2289
- FD_ZERO ( & readset );
2290
- FD_SET ( grp -> ppfd [0 ], & readset );
2291
- qeth_select ( grp -> ppfd [0 ]+ 1 , & readset , NULL );
2292
- qeth_read_pipe ( grp -> ppfd [0 ], & sig );
2306
+ if (dev -> scsw .flag2 & SCSW2_Q )
2307
+ {
2308
+ DBGTRC ( dev , "Halting data device\n" );
2309
+
2310
+ /* Indicate QDIO no longer active, write halt request to
2311
+ signalling pipe, then wait for and read the halt reply. */
2312
+ dev -> scsw .flag2 &= ~SCSW2_Q ;
2313
+ qeth_write_pipe ( grp -> ppfd [1 ], & sig );
2314
+ FD_ZERO ( & readset );
2315
+ FD_SET ( grp -> ppfd [0 ], & readset );
2316
+ qeth_select ( grp -> ppfd [0 ]+ 1 , & readset , NULL );
2317
+ qeth_read_pipe ( grp -> ppfd [0 ], & sig );
2318
+
2319
+ DBGTRC ( dev , "Data device halted\n" );
2320
+ }
2293
2321
}
2294
2322
2295
2323
static void qeth_halt_device (DEVBLK * dev )
2296
2324
{
2297
2325
OSA_GRP * grp = (OSA_GRP * )dev -> group -> grp_data ;
2298
2326
2299
- /* Signal ACTIVATE QUEUES loop to exit if QDIO is active */
2300
- if (dev -> scsw .flag2 & SCSW2_Q )
2301
- {
2302
- dev -> scsw .flag2 &= ~SCSW2_Q ;
2303
- qeth_signal_halt (grp );
2304
- }
2327
+ if (dev == dev -> group -> memdev [2 ])
2328
+ qeth_halt_data_device ( dev , grp );
2305
2329
else
2306
- if (dev -> group -> acount == OSA_GROUP_SIZE )
2330
+ if (dev == dev -> group -> memdev [0 ])
2331
+ qeth_halt_read_device ( dev , grp );
2332
+ else
2307
2333
{
2308
- /* Tell READ loop to not wait for IDX response */
2309
- dev -> qdio .idxstate = MPC_IDX_STATE_INACTIVE ;
2310
- signal_condition (& grp -> qcond );
2334
+ DBGTRC ( dev , "qeth_halt_device: noop!\n" );
2335
+ PTT_QETH_TRACE ( "*halt noop" , dev -> devnum , 0 ,0 );
2311
2336
}
2312
2337
}
2313
2338
@@ -2591,6 +2616,11 @@ int i;
2591
2616
}
2592
2617
}
2593
2618
2619
+
2620
+ // warn if ttnetmask/ttpfxlen discrepency
2621
+ // build default ttnetmask/ttpfxlen if undefined
2622
+
2623
+
2594
2624
#if defined(ENABLE_IPV6 )
2595
2625
/* Check the grp->ttipaddr6 and grp->ttpfxlen6 values */
2596
2626
if (grp -> ttipaddr6 )
@@ -2748,19 +2778,19 @@ static int qeth_close_device ( DEVBLK *dev )
2748
2778
{
2749
2779
OSA_GRP * grp = (OSA_GRP * )dev -> group -> grp_data ;
2750
2780
2751
- if (!dev -> member && dev -> group -> grp_data )
2781
+ if (!dev -> member && dev -> group -> grp_data )
2752
2782
{
2753
2783
int ttfd = grp -> ttfd ;
2754
2784
2755
2785
PTT_QETH_TRACE ( "b4 clos halt" , 0 ,0 ,0 );
2756
- qeth_halt_device (dev );
2786
+ qeth_halt_read_device ( dev -> group -> memdev [0 ], grp );
2787
+ qeth_halt_data_device ( dev -> group -> memdev [2 ], grp );
2757
2788
PTT_QETH_TRACE ( "af clos halt" , 0 ,0 ,0 );
2758
2789
2759
2790
PTT_QETH_TRACE ( "b4 clos ttfd" , 0 ,0 ,0 );
2760
2791
grp -> ttfd = -1 ;
2761
2792
dev -> fd = -1 ;
2762
-
2763
- if (ttfd )
2793
+ if (ttfd > 0 )
2764
2794
TUNTAP_Close (ttfd );
2765
2795
PTT_QETH_TRACE ( "af clos ttfd" , 0 ,0 ,0 );
2766
2796
@@ -3141,6 +3171,15 @@ int num; /* Number of bytes to move */
3141
3171
3142
3172
} /* end while (dev->qdio.idxstate == MPC_IDX_STATE_ACTIVE) */
3143
3173
3174
+ if (dev -> qdio .idxstate == MPC_IDX_STATE_HALTING )
3175
+ {
3176
+ obtain_lock ( & grp -> qlock );
3177
+ PTT_QETH_TRACE ( "read hlt ack" , 0 ,0 ,0 );
3178
+ dev -> qdio .idxstate = MPC_IDX_STATE_INACTIVE ;
3179
+ signal_condition ( & grp -> qcond );
3180
+ release_lock ( & grp -> qlock );
3181
+ }
3182
+
3144
3183
PTT_QETH_TRACE ( "read exit" , 0 ,0 ,0 );
3145
3184
3146
3185
break ; /*switch*/
0 commit comments