s390io.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:171k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. case 0x4E:
  2. case 0x48:
  3. ps->cu_type   = 0x3820;
  4. break;
  5. case 0x4D:
  6. case 0x49:
  7. case 0x45:
  8. ps->cu_type   = 0x3800;
  9. break;
  10. case 0x4B:
  11. ps->cu_type   = 0x4248;
  12. break;
  13. case 0x4A:
  14. ps->cu_type   = 0x4245;
  15. break;
  16. case 0x47:
  17. ps->cu_type   = 0x3262;
  18. break;
  19. case 0x43:
  20. ps->cu_type   = 0x3203;
  21. break;
  22. case 0x42:
  23. ps->cu_type   = 0x3211;
  24. break;
  25. case 0x41:
  26. ps->cu_type   = 0x1403;
  27. break;
  28. default:
  29. error = 1;
  30. break;
  31. } /* endswitch */
  32. break;
  33. case 0x08:
  34. switch (p_diag_data->vrdcvtyp) {
  35. case 0x82:
  36. ps->cu_type   = 0x3422;
  37. break;
  38. case 0x81:
  39. ps->cu_type   = 0x3490;
  40. break;
  41. case 0x10:
  42. ps->cu_type   = 0x3420;
  43. break;
  44. case 0x02:
  45. ps->cu_type   = 0x3430;
  46. break;
  47. case 0x01:
  48. ps->cu_type   = 0x3480;
  49. break;
  50. case 0x42:
  51. ps->cu_type   = 0x3424;
  52. break;
  53. case 0x44:
  54. ps->cu_type   = 0x9348;
  55. break;
  56. default:
  57. error = 1;
  58. break;
  59. } /* endswitch */
  60. break;
  61. case 02: /* special device class ... */
  62. switch (p_diag_data->vrdcvtyp) {
  63. case 0x20: /* OSA */
  64. ps->cu_type   = 0x3088;
  65. ps->cu_model  = 0x60;
  66. break;
  67. default:
  68. error = 1;
  69.        break;
  70. } /* endswitch */
  71. break;
  72. default:
  73. error = 1;
  74. break;
  75. } /* endswitch */
  76. if ( init_IRQ_complete )
  77. {
  78. kfree( p_diag_data );
  79. }
  80. else
  81. {
  82. free_bootmem( (unsigned long)p_diag_data, sizeof( diag210_t) );
  83. } /* endif */
  84. if ( error )
  85. {
  86. printk( KERN_ERR "DIAG X'210' for "
  87.         "device %04X returned "
  88.         "(cc = %d): vdev class : %02X, "
  89. "vdev type : %04X n ...  rdev class : %02X, rdev type : %04X, rdev model: %02Xn",
  90. devno,
  91. ccode,
  92. p_diag_data->vrdcvcla,
  93. p_diag_data->vrdcvtyp,
  94. p_diag_data->vrdcrccl,
  95. p_diag_data->vrdccrty,
  96. p_diag_data->vrdccrmd );
  97. if (cio_debug_initialized)
  98. debug_sprintf_event( cio_debug_msg_id, 0,
  99.      "DIAG X'210' for "
  100.      "device %04X returned "
  101.      "(cc = %d): vdev class : %02X, "
  102.      "vdev type : %04X n ...  rdev class : %02X, rdev type : %04X, rdev model: %02Xn",
  103.      devno,
  104.      ccode,
  105.      p_diag_data->vrdcvcla,
  106.      p_diag_data->vrdcvtyp,
  107.      p_diag_data->vrdcrccl,
  108.      p_diag_data->vrdccrty,
  109.      p_diag_data->vrdccrmd );
  110. } /* endif */
  111. }
  112. /*
  113.  * This routine returns the characteristics for the device
  114.  *  specified. Some old devices might not provide the necessary
  115.  *  command code information during SenseID processing. In this
  116.  *  case the function returns -EINVAL. Otherwise the function
  117.  *  allocates a decice specific data buffer and provides the
  118.  *  device characteristics together with the buffer size. Its
  119.  *  the callers responability to release the kernel memory if
  120.  *  not longer needed. In case of persistent I/O problems -EBUSY
  121.  *  is returned.
  122.  *
  123.  *  The function may be called enabled or disabled. However, the
  124.  *   caller must have locked the irq it is requesting data for.
  125.  *
  126.  * Note : It would have been nice to collect this information
  127.  *         during init_IRQ() processing but this is not possible
  128.  *
  129.  *         a) without statically pre-allocation fixed size buffers
  130.  *            as virtual memory management isn't available yet.
  131.  *
  132.  *         b) without unnecessarily increase system startup by
  133.  *            evaluating devices eventually not used at all.
  134.  */
  135. int read_dev_chars( int irq, void **buffer, int length )
  136. {
  137. unsigned int  flags;
  138. ccw1_t       *rdc_ccw;
  139. devstat_t     devstat;
  140. char         *rdc_buf;
  141. int           devflag = 0;
  142. int           ret      = 0;
  143. int           emulated = 0;
  144. int           retry    = 5;
  145. char dbf_txt[15];
  146. if ( !buffer || !length )
  147. {
  148. return( -EINVAL );
  149. } /* endif */
  150. SANITY_CHECK(irq);
  151. if ( ioinfo[irq]->ui.flags.oper == 0 )
  152. {
  153. return( -ENODEV );
  154. } /* endif */
  155. if (cio_debug_initialized) {
  156. sprintf(dbf_txt, "rddevch%x", irq);
  157. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  158. }
  159. /*
  160.  * Before playing around with irq locks we should assure
  161.  *   running disabled on (just) our CPU. Sync. I/O requests
  162.  *   also require to run disabled.
  163.  *
  164.  * Note : as no global lock is required, we must not use
  165.  *        cli(), but __cli() instead.  
  166.  */
  167. __save_flags(flags);
  168. __cli();
  169. rdc_ccw = &ioinfo[irq]->senseccw;
  170. if ( !ioinfo[irq]->ui.flags.ready )
  171. {
  172. ret = request_irq( irq,
  173.                    init_IRQ_handler,
  174.                    SA_PROBE, "RDC", &devstat );
  175. if ( !ret )
  176. {
  177. emulated = 1;
  178. } /* endif */
  179. } /* endif */
  180. if ( !ret )
  181. {
  182. if ( ! *buffer )
  183. {
  184. rdc_buf  = kmalloc( length, GFP_KERNEL);
  185. }
  186. else
  187. {
  188. rdc_buf = *buffer;
  189. } /* endif */
  190. if ( !rdc_buf )
  191. {
  192. ret = -ENOMEM;
  193. }
  194. else
  195. {
  196. do
  197. {
  198. rdc_ccw->cmd_code = CCW_CMD_RDC;
  199. rdc_ccw->count    = length;
  200. rdc_ccw->flags    = CCW_FLAG_SLI;
  201. ret = set_normalized_cda( rdc_ccw, (unsigned long)rdc_buf );
  202. if (!ret) {
  203. memset( ioinfo[irq]->irq_desc.dev_id,
  204. '',
  205. sizeof( devstat_t));
  206. ret = s390_start_IO( irq,
  207.      rdc_ccw,
  208.      0x00524443, // RDC
  209.      0,          // n/a
  210.      DOIO_WAIT_FOR_INTERRUPT
  211.      | DOIO_DONT_CALL_INTHDLR );
  212. retry--;
  213. devflag = ioinfo[irq]->irq_desc.dev_id->flag;   
  214. clear_normalized_cda( rdc_ccw);  
  215. } else {
  216. udelay(100);  //wait for recovery
  217. retry--;
  218. }
  219. } while (    ( retry                                     )
  220.           && ( ret || (devflag & DEVSTAT_STATUS_PENDING) ) );
  221. } /* endif */
  222. if ( !retry )
  223. {
  224. ret = (ret==-ENOMEM)?-ENOMEM:-EBUSY;
  225. } /* endif */
  226. __restore_flags(flags);
  227. /*
  228.  * on success we update the user input parms
  229.  */
  230. if ( !ret )
  231. {
  232. *buffer = rdc_buf;
  233. } /* endif */
  234. if ( emulated )
  235. {
  236. free_irq( irq, &devstat);
  237. } /* endif */
  238. } /* endif */
  239. return( ret );
  240. }
  241. /*
  242.  *  Read Configuration data
  243.  */
  244. int read_conf_data( int irq, void **buffer, int *length, __u8 lpm )
  245. {
  246. unsigned long flags;
  247. int           ciw_cnt;
  248. int           found  = 0; // RCD CIW found
  249. int           ret    = 0; // return code
  250. char dbf_txt[15];
  251. SANITY_CHECK(irq);
  252. if ( !buffer || !length )
  253. {
  254. return( -EINVAL);
  255. }
  256. else if ( ioinfo[irq]->ui.flags.oper == 0 )
  257. {
  258. return( -ENODEV );
  259. }
  260. else if ( ioinfo[irq]->ui.flags.esid == 0 )
  261. {
  262. return( -EOPNOTSUPP );
  263. } /* endif */
  264. if (cio_debug_initialized) {
  265. sprintf(dbf_txt, "rdconf%x", irq);
  266. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  267. }
  268. /*
  269.  * scan for RCD command in extended SenseID data
  270.  */
  271. for ( ciw_cnt = 0; (found == 0) && (ciw_cnt < 62); ciw_cnt++ )
  272. {
  273. if ( ioinfo[irq]->senseid.ciw[ciw_cnt].ct == CIW_TYPE_RCD )
  274. {
  275. /*
  276.  * paranoia check ...
  277.  */
  278. if ( ioinfo[irq]->senseid.ciw[ciw_cnt].cmd != 0 )
  279. {
  280. found = 1;
  281. } /* endif */
  282. break;
  283. } /* endif */
  284. } /* endfor */
  285. if ( found )
  286. {
  287. devstat_t  devstat;  /* inline device status area */
  288. devstat_t *pdevstat;
  289. int        ioflags;
  290. ccw1_t    *rcd_ccw  = &ioinfo[irq]->senseccw;
  291. char      *rcd_buf  = NULL;
  292. int        emulated = 0; /* no i/O handler installed */
  293. int        retry    = 5; /* retry count */
  294. __save_flags(flags);
  295. __cli();
  296. if ( !ioinfo[irq]->ui.flags.ready )
  297. {
  298. pdevstat = &devstat;
  299. ret      = request_irq( irq,
  300.                         init_IRQ_handler,
  301.                         SA_PROBE, "RCD", pdevstat );
  302. if ( !ret )
  303. {
  304. emulated = 1;
  305. } /* endif */
  306. }
  307. else
  308. {
  309. pdevstat = ioinfo[irq]->irq_desc.dev_id;
  310. } /* endif */
  311. if ( !ret )
  312. {
  313. if ( init_IRQ_complete )
  314. {
  315. rcd_buf = kmalloc( ioinfo[irq]->senseid.ciw[ciw_cnt].count,
  316.                    GFP_DMA);
  317. }
  318. else
  319. {
  320. rcd_buf = alloc_bootmem_low( ioinfo[irq]->senseid.ciw[ciw_cnt].count);
  321.     } /* endif */
  322. if ( rcd_buf == NULL )
  323. {
  324. ret = -ENOMEM;
  325. } /* endif */
  326. if ( !ret )
  327. {
  328. memset( rcd_buf,
  329.         '',
  330.         ioinfo[irq]->senseid.ciw[ciw_cnt].count);
  331.        
  332. do
  333. {
  334. rcd_ccw->cmd_code = ioinfo[irq]->senseid.ciw[ciw_cnt].cmd;
  335. rcd_ccw->cda      = (__u32)virt_to_phys( rcd_buf );
  336. rcd_ccw->count    = ioinfo[irq]->senseid.ciw[ciw_cnt].count;
  337. rcd_ccw->flags    = CCW_FLAG_SLI;
  338. memset( pdevstat, '', sizeof( devstat_t));
  339. if ( lpm )
  340. {
  341. ioflags = DOIO_WAIT_FOR_INTERRUPT
  342.           | DOIO_VALID_LPM    
  343.           | DOIO_DONT_CALL_INTHDLR;
  344. }
  345. else
  346. {
  347. ioflags =   DOIO_WAIT_FOR_INTERRUPT
  348.           | DOIO_DONT_CALL_INTHDLR;
  349.              
  350. } /* endif */
  351. ret = s390_start_IO( irq,
  352.                      rcd_ccw,
  353.                      0x00524344,  // == RCD
  354.                      lpm,
  355.                      ioflags );
  356. switch ( ret ) {
  357. case 0:
  358. case -EIO:
  359. if ( !(pdevstat->flag & (   DEVSTAT_STATUS_PENDING
  360.     | DEVSTAT_NOT_OPER
  361.     | DEVSTAT_FLAG_SENSE_AVAIL ) ) )
  362. {
  363. retry = 0;  // we got it ...
  364. }
  365. else
  366. {
  367. retry--;    // try again ...
  368. } /* endif */
  369. break;
  370. default:   // -EBUSY, -ENODEV, ???
  371. retry = 0;
  372. } /* endswitch */
  373. } while ( retry );
  374. } /* endif */
  375. __restore_flags( flags );
  376. } /* endif */
  377. /*
  378.  * on success we update the user input parms
  379.  */
  380. if ( ret == 0 )
  381. {
  382. *length = ioinfo[irq]->senseid.ciw[ciw_cnt].count;
  383. *buffer = rcd_buf;
  384. }
  385. else
  386. {
  387. if ( rcd_buf != NULL )
  388. {
  389. if ( init_IRQ_complete )
  390. {
  391. kfree( rcd_buf );
  392. }
  393. else
  394. {
  395. free_bootmem( (unsigned long)rcd_buf,
  396.               ioinfo[irq]->senseid.ciw[ciw_cnt].count);
  397.     } /* endif */
  398. } /* endif */
  399. *buffer = NULL;
  400. *length = 0;
  401.     
  402. } /* endif */
  403. if ( emulated )
  404. free_irq( irq, pdevstat);
  405. }
  406. else
  407. {
  408. ret = -EOPNOTSUPP;
  409. } /* endif */
  410. return( ret );
  411. }
  412. int get_dev_info( int irq, s390_dev_info_t * pdi)
  413. {
  414. return( get_dev_info_by_irq( irq, pdi));
  415. }
  416. static int __inline__ get_next_available_irq( ioinfo_t *pi)
  417. {
  418. int ret_val = -ENODEV;
  419. while ( pi!=NULL ) {
  420. if ( pi->ui.flags.oper ) {
  421. ret_val = pi->irq;
  422. break;
  423. } else {
  424. pi = pi->next;
  425. }
  426. }
  427. return ret_val;
  428. }
  429. int get_irq_first( void )
  430. {
  431.    int ret_irq;
  432. if ( ioinfo_head )
  433. {
  434. if ( ioinfo_head->ui.flags.oper )
  435. {
  436. ret_irq = ioinfo_head->irq;
  437. }
  438. else if ( ioinfo_head->next )
  439. {
  440. ret_irq = get_next_available_irq( ioinfo_head->next );
  441. }
  442. else
  443. {
  444. ret_irq = -ENODEV;
  445.    
  446. } /* endif */
  447. }
  448. else
  449. {
  450. ret_irq = -ENODEV;
  451. } /* endif */
  452. return ret_irq;
  453. }
  454. int get_irq_next( int irq )
  455. {
  456. int ret_irq;
  457. if ( ioinfo[irq] != INVALID_STORAGE_AREA )
  458. {
  459. if ( ioinfo[irq]->next )
  460. {
  461. if ( ioinfo[irq]->next->ui.flags.oper )
  462. {
  463. ret_irq = ioinfo[irq]->next->irq;
  464. }
  465. else
  466. {
  467. ret_irq = get_next_available_irq( ioinfo[irq]->next );
  468. } /* endif */
  469. }
  470. else
  471. {
  472. ret_irq = -ENODEV;     
  473. } /* endif */
  474. }
  475. else
  476. {
  477. ret_irq = -EINVAL;
  478. } /* endif */
  479. return ret_irq;
  480. }
  481. int get_dev_info_by_irq( int irq, s390_dev_info_t *pdi)
  482. {
  483. SANITY_CHECK(irq);
  484. if ( pdi == NULL )
  485. return -EINVAL;
  486. pdi->devno = ioinfo[irq]->schib.pmcw.dev;
  487. pdi->irq   = irq;
  488. if (   ioinfo[irq]->ui.flags.oper
  489.     && !ioinfo[irq]->ui.flags.unknown ) 
  490. {
  491. pdi->status = 0;
  492. memcpy( &(pdi->sid_data),
  493. &ioinfo[irq]->senseid,
  494. sizeof( senseid_t));
  495. }
  496. else if ( ioinfo[irq]->ui.flags.unknown )
  497. {
  498. pdi->status = DEVSTAT_UNKNOWN_DEV;
  499. memset( &(pdi->sid_data),
  500. '',
  501. sizeof( senseid_t));
  502. pdi->sid_data.cu_type = 0xFFFF;
  503. }
  504. else
  505. {
  506. pdi->status = DEVSTAT_NOT_OPER;
  507. memset( &(pdi->sid_data),
  508. '',
  509. sizeof( senseid_t));
  510. pdi->sid_data.cu_type = 0xFFFF;
  511. } /* endif */
  512. if ( ioinfo[irq]->ui.flags.ready )
  513. pdi->status |= DEVSTAT_DEVICE_OWNED;
  514. return 0;
  515. }
  516. int get_dev_info_by_devno( __u16 devno, s390_dev_info_t *pdi)
  517. {
  518. int i;
  519. int rc = -ENODEV;
  520. if ( devno > 0x0000ffff )
  521. return -ENODEV;
  522.         if ( pdi == NULL )
  523. return -EINVAL;
  524. for ( i=0; i <= highest_subchannel; i++ ) {
  525. if (    ioinfo[i] != INVALID_STORAGE_AREA
  526.      && ioinfo[i]->schib.pmcw.dev == devno )
  527. {
  528. pdi->irq   = i;
  529. pdi->devno = devno;
  530. if (    ioinfo[i]->ui.flags.oper
  531.      && !ioinfo[i]->ui.flags.unknown )
  532. {
  533. pdi->status = 0;
  534. memcpy( &(pdi->sid_data),
  535. &ioinfo[i]->senseid,
  536. sizeof( senseid_t));
  537. }
  538. else if ( ioinfo[i]->ui.flags.unknown )
  539. {
  540. pdi->status = DEVSTAT_UNKNOWN_DEV;
  541. memset( &(pdi->sid_data),
  542. '',
  543. sizeof( senseid_t));
  544. pdi->sid_data.cu_type = 0xFFFF;
  545. }
  546. else
  547. {
  548. pdi->status = DEVSTAT_NOT_OPER;
  549. memset( &(pdi->sid_data),
  550. '',
  551. sizeof( senseid_t));
  552. pdi->sid_data.cu_type = 0xFFFF;
  553. } /* endif */
  554. if ( ioinfo[i]->ui.flags.ready )
  555. pdi->status |= DEVSTAT_DEVICE_OWNED;
  556. rc = 0; /* found */
  557. break;
  558. } /* endif */
  559. } /* endfor */
  560. return( rc);
  561. }
  562. int get_irq_by_devno( __u16 devno )
  563. {
  564. int i;
  565. int rc = -1;
  566. if ( devno <= 0x0000ffff )
  567. {
  568. for ( i=0; i <= highest_subchannel; i++ )
  569. {
  570. if (    (ioinfo[i] != INVALID_STORAGE_AREA )
  571.      && (ioinfo[i]->schib.pmcw.dev == devno)
  572.      && (ioinfo[i]->schib.pmcw.dnv == 1    ) )
  573. {
  574. rc = i;
  575. break;
  576. } /* endif */
  577. } /* endfor */
  578. } /* endif */
  579. return( rc);
  580. }
  581. unsigned int get_devno_by_irq( int irq )
  582. {
  583. if (    ( irq > highest_subchannel            )
  584.      || ( irq < 0                             )
  585.      || ( ioinfo[irq] == INVALID_STORAGE_AREA ) )
  586. {
  587. return -1;
  588. } /* endif */
  589. /*
  590.  * we don't need to check for the device be operational
  591.  *  as the initial STSCH will always present the device
  592.  *  number defined by the IOCDS regardless of the device
  593.  *  existing or not. However, there could be subchannels
  594.  *  defined who's device number isn't valid ...
  595.  */
  596. if ( ioinfo[irq]->schib.pmcw.dnv )
  597. return( ioinfo[irq]->schib.pmcw.dev );
  598. else
  599. return -1;
  600. }
  601. /*
  602.  * s390_device_recognition_irq
  603.  *
  604.  * Used for individual device recognition. Issues the device
  605.  *  independant SenseID command to obtain info the device type.
  606.  *
  607.  */
  608. void s390_device_recognition_irq( int irq )
  609. {
  610. int           ret;
  611. char dbf_txt[15];
  612. if (cio_debug_initialized) {
  613. sprintf(dbf_txt, "devrec%x", irq);
  614. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  615. }
  616. /*
  617.  * We issue the SenseID command on I/O subchannels we think are
  618.  *  operational only.
  619.  */
  620. if (    ( ioinfo[irq] != INVALID_STORAGE_AREA )
  621.      && ( ioinfo[irq]->schib.pmcw.st == 0     )
  622.      && ( ioinfo[irq]->ui.flags.oper == 1     ) )
  623. {
  624. int       irq_ret;
  625. devstat_t devstat;
  626. irq_ret = request_irq( irq,
  627.                        init_IRQ_handler,
  628.                        SA_PROBE,
  629.                        "INIT",
  630.                        &devstat);
  631. if ( !irq_ret )
  632. {
  633. ret = enable_cpu_sync_isc( irq );
  634. if ( !ret ) 
  635. {
  636. ioinfo[irq]->ui.flags.unknown = 0;
  637. memset( &ioinfo[irq]->senseid, '', sizeof( senseid_t));
  638. s390_SenseID( irq, &ioinfo[irq]->senseid, 0xff );
  639. #if 0 /* FIXME */
  640. /*
  641.  * We initially check the configuration data for
  642.  *  those devices with more than a single path
  643.  */
  644. if ( ioinfo[irq]->schib.pmcw.pim != 0x80 )
  645. {
  646. char     *prcd;
  647. int       lrcd;
  648. ret = read_conf_data( irq, (void **)&prcd, &lrcd, 0 );
  649. if ( !ret ) // on success only ...
  650. {
  651. char buffer[80];
  652. #ifdef CONFIG_DEBUG_IO
  653. sprintf( buffer,
  654.          "RCD for device(%04X)/"
  655.          "subchannel(%04X) returns :n",
  656.          ioinfo[irq]->schib.pmcw.dev,
  657.          irq );
  658. s390_displayhex( buffer, prcd, lrcd );
  659. #endif      
  660. if (cio_debug_initialized) {
  661. sprintf( buffer,
  662.  "RCD for device(%04X)/"
  663.  "subchannel(%04X) returns :n",
  664.  ioinfo[irq]->schib.pmcw.dev,
  665.  irq );
  666. s390_displayhex2( buffer, prcd, lrcd, 2);
  667. }
  668. if ( init_IRQ_complete )
  669. {
  670. kfree( prcd );
  671. }
  672. else
  673. {
  674. free_bootmem( (unsigned long)prcd, lrcd );
  675.      } /* endif */
  676. } /* endif */
  677. } /* endif */
  678. #endif
  679. disable_cpu_sync_isc( irq );
  680. } /* endif */  
  681. free_irq( irq, &devstat );
  682. } /* endif */
  683. } /* endif */
  684. }
  685. /*
  686.  * s390_device_recognition_all
  687.  *
  688.  * Used for system wide device recognition.
  689.  *
  690.  */
  691. void s390_device_recognition_all( void)
  692. {
  693. int irq = 0; /* let's start with subchannel 0 ... */
  694. do
  695. {
  696. s390_device_recognition_irq( irq );
  697. irq ++;
  698. } while ( irq <= highest_subchannel );
  699. }
  700. /*
  701.  * Function: s390_redo_validation
  702.  * Look for no longer blacklisted devices
  703.  * FIXME: there must be a better way to do this...
  704.  */
  705. void s390_redo_validation(void) 
  706. {
  707. int irq = 0;
  708. int ret;
  709. if (cio_debug_initialized) {
  710. debug_text_event(cio_debug_trace_id, 0, "redoval");
  711. }
  712. do {
  713. if (ioinfo[irq] == INVALID_STORAGE_AREA) {
  714. ret = s390_validate_subchannel(irq, 0);
  715. if (!ret) {
  716. s390_device_recognition_irq(irq);
  717. if (ioinfo[irq]->ui.flags.oper) {
  718. devreg_t *pdevreg;
  719. pdevreg = s390_search_devreg( ioinfo[irq] );
  720. if ( pdevreg != NULL ) {
  721. if ( pdevreg->oper_func != NULL )
  722. pdevreg->oper_func( irq, pdevreg );
  723. }
  724. #ifdef CONFIG_PROC_FS
  725. if (cio_proc_devinfo) 
  726. if (irq < MAX_CIO_PROCFS_ENTRIES) {
  727. cio_procfs_device_create(ioinfo[irq]->devno);
  728. }
  729. #endif
  730. }
  731. }
  732. irq++;
  733. } while (irq<=highest_subchannel);
  734. }
  735. /*
  736.  * s390_search_devices
  737.  *
  738.  * Determines all subchannels available to the system.
  739.  *
  740.  */
  741. void s390_process_subchannels( void)
  742. {
  743. int   ret;
  744. int   irq = 0;   /* Evaluate all subchannels starting with 0 ... */
  745. do
  746. {
  747. ret = s390_validate_subchannel( irq, 0);
  748. if ( ret != -ENXIO)
  749. irq++;
  750.    } while ( (ret != -ENXIO) && (irq < __MAX_SUBCHANNELS) );
  751. highest_subchannel = (--irq);
  752. printk( KERN_INFO "Highest subchannel number detected (hex) : %04Xn",
  753.         highest_subchannel);
  754. if (cio_debug_initialized)
  755. debug_sprintf_event(cio_debug_msg_id, 0, 
  756.     "Highest subchannel number detected (hex) : %04Xn",
  757.     highest_subchannel);
  758. }
  759. /*
  760.  * s390_validate_subchannel()
  761.  *
  762.  * Process the subchannel for the requested irq. Returns 1 for valid
  763.  *  subchannels, otherwise 0.
  764.  */
  765. int s390_validate_subchannel( int irq, int enable )
  766. {
  767. int      retry;     /* retry count for status pending conditions */
  768. int      ccode;     /* condition code for stsch() only */
  769. int      ccode2;    /* condition code for other I/O routines */
  770. schib_t *p_schib;
  771. int      ret;
  772. char dbf_txt[15];
  773. if (cio_debug_initialized) {
  774. sprintf(dbf_txt, "valsch%x", irq);
  775. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  776. }
  777. /*
  778.  * The first subchannel that is not-operational (ccode==3)
  779.  *  indicates that there aren't any more devices available.
  780.  */
  781. if (    ( init_IRQ_complete                   )
  782.      && ( ioinfo[irq] != INVALID_STORAGE_AREA ) )
  783. {
  784. p_schib = &ioinfo[irq]->schib;
  785. }
  786. else
  787. {
  788. p_schib = p_init_schib;
  789. } /* endif */
  790. /*
  791.  * If we knew the device before we assume the worst case ... 
  792.  */
  793. if ( ioinfo[irq] != INVALID_STORAGE_AREA )
  794. {
  795. ioinfo[irq]->ui.flags.oper = 0;
  796. ioinfo[irq]->ui.flags.dval = 0;
  797. } /* endif */
  798. ccode = stsch( irq, p_schib);
  799. if ( !ccode )
  800. {
  801. /*
  802.  * ... just being curious we check for non I/O subchannels
  803.  */
  804. if ( p_schib->pmcw.st )
  805. {
  806. printk( KERN_INFO "Subchannel %04X reports "
  807.         "non-I/O subchannel type %04Xn",
  808.         irq,
  809.         p_schib->pmcw.st);
  810. if (cio_debug_initialized)
  811. debug_sprintf_event(cio_debug_msg_id, 0,
  812.     "Subchannel %04X reports non-I/O subchannel type %04Xn",
  813.     irq, p_schib->pmcw.st);
  814. if ( ioinfo[irq] != INVALID_STORAGE_AREA )
  815. ioinfo[irq]->ui.flags.oper = 0;
  816. } /* endif */
  817. if ( p_schib->pmcw.dnv )
  818. {
  819.      if ( is_blacklisted( p_schib->pmcw.dev )) {
  820.   /* 
  821.    * This device must not be known to Linux. So we simply say that 
  822.    * there is no device and return ENODEV.
  823.    */
  824. #ifdef CONFIG_DEBUG_IO
  825.   printk( KERN_DEBUG "Blacklisted device detected at devno %04Xn", p_schib->pmcw.dev );
  826. #endif
  827.   if (cio_debug_initialized)
  828.   debug_sprintf_event(cio_debug_msg_id, 0,
  829.       "Blacklisted device detected at devno %04Xn",
  830.       p_schib->pmcw.dev);
  831.   ret = -ENODEV;
  832.      } else {
  833.         if ( ioinfo[irq] == INVALID_STORAGE_AREA )
  834. {
  835. if ( !init_IRQ_complete )
  836. {
  837. ioinfo[irq] =
  838.    (ioinfo_t *)alloc_bootmem_low( sizeof(ioinfo_t));
  839. }
  840. else
  841. {
  842. ioinfo[irq] =
  843.    (ioinfo_t *)kmalloc( sizeof(ioinfo_t),
  844.                            GFP_DMA );
  845. } /* endif */
  846. memset( ioinfo[irq], '', sizeof( ioinfo_t));
  847. memcpy( &ioinfo[irq]->schib,
  848.            p_init_schib,
  849.            sizeof( schib_t));
  850. /*
  851.  * We have to insert the new ioinfo element
  852.  *  into the linked list, either at its head,
  853.  *  its tail or insert it.
  854.  */
  855. if ( ioinfo_head == NULL )  /* first element */
  856. {
  857. ioinfo_head = ioinfo[irq];
  858. ioinfo_tail = ioinfo[irq];
  859. }
  860. else if ( irq < ioinfo_head->irq ) /* new head */
  861. {
  862. ioinfo[irq]->next = ioinfo_head;
  863. ioinfo_head->prev = ioinfo[irq];
  864. ioinfo_head       = ioinfo[irq];
  865. }
  866. else if ( irq > ioinfo_tail->irq ) /* new tail */
  867. {
  868. ioinfo_tail->next = ioinfo[irq];
  869. ioinfo[irq]->prev = ioinfo_tail;
  870. ioinfo_tail       = ioinfo[irq];
  871. }
  872. else /* insert element */
  873. {
  874. ioinfo_t *pi = ioinfo_head;
  875. for (pi=ioinfo_head; pi!=NULL; pi=pi->next) {
  876. if ( irq < pi->next->irq )
  877. {
  878. ioinfo[irq]->next = pi->next;
  879. ioinfo[irq]->prev = pi;
  880. pi->next->prev    = ioinfo[irq];
  881. pi->next          = ioinfo[irq];
  882. break;
  883. } /* endif */
  884. }
  885. } /* endif */
  886. } /* endif */
  887. // initialize some values ...
  888. ioinfo[irq]->ui.flags.pgid_supp = 1;
  889. ioinfo[irq]->opm =   ioinfo[irq]->schib.pmcw.pim
  890.                    & ioinfo[irq]->schib.pmcw.pam
  891.                    & ioinfo[irq]->schib.pmcw.pom;
  892. if ( cio_show_msg )
  893. {
  894. printk( KERN_INFO"Detected device %04X "
  895.         "on subchannel %04X"
  896.         " - PIM = %02X, PAM = %02X, POM = %02Xn",
  897.         ioinfo[irq]->schib.pmcw.dev,
  898.         irq,
  899.          ioinfo[irq]->schib.pmcw.pim,
  900.          ioinfo[irq]->schib.pmcw.pam,
  901.          ioinfo[irq]->schib.pmcw.pom);
  902. } /* endif */
  903. if (cio_debug_initialized)
  904. debug_sprintf_event(cio_debug_msg_id, 0,
  905.     "Detected device %04X "
  906.     "on subchannel %04X"
  907.     " - PIM = %02X, PAM = %02X, POM = %02Xn",
  908.     ioinfo[irq]->schib.pmcw.dev,
  909.     irq,
  910.     ioinfo[irq]->schib.pmcw.pim,
  911.     ioinfo[irq]->schib.pmcw.pam,
  912.     ioinfo[irq]->schib.pmcw.pom);
  913. /*
  914.  * initialize ioinfo structure
  915.  */
  916. ioinfo[irq]->irq             = irq;
  917. if(!ioinfo[irq]->ui.flags.ready)
  918. {
  919. ioinfo[irq]->nopfunc         = NULL;
  920. ioinfo[irq]->ui.flags.busy   = 0;
  921. ioinfo[irq]->ui.flags.dval   = 1;
  922. ioinfo[irq]->devstat.intparm = 0;
  923. }
  924. ioinfo[irq]->devstat.devno   = ioinfo[irq]->schib.pmcw.dev;
  925. ioinfo[irq]->devno           = ioinfo[irq]->schib.pmcw.dev;
  926. /*
  927.  * We should have at least one CHPID ...
  928.  */
  929. if ( ioinfo[irq]->opm )
  930. {
  931. /*
  932.  * We now have to initially ...
  933.  *  ... set "interruption sublass"
  934.  *  ... enable "concurrent sense"
  935.  *  ... enable "multipath mode" if more than one
  936.  *        CHPID is available. This is done regardless
  937.  *        whether multiple paths are available for us.
  938.  *
  939.  * Note : we don't enable the device here, this is temporarily
  940.  *        done during device sensing below.
  941.  */
  942. ioinfo[irq]->schib.pmcw.isc     = 3; /* could be smth. else */
  943. ioinfo[irq]->schib.pmcw.csense  = 1; /* concurrent sense */
  944. ioinfo[irq]->schib.pmcw.ena     = enable;
  945. ioinfo[irq]->schib.pmcw.intparm =
  946.                      ioinfo[irq]->schib.pmcw.dev;
  947. if (    ( ioinfo[irq]->opm != 0x80 )
  948.      && ( ioinfo[irq]->opm != 0x40 )
  949.      && ( ioinfo[irq]->opm != 0x20 )
  950.      && ( ioinfo[irq]->opm != 0x10 )
  951.      && ( ioinfo[irq]->opm != 0x08 )
  952.      && ( ioinfo[irq]->opm != 0x04 )
  953.      && ( ioinfo[irq]->opm != 0x02 )
  954.      && ( ioinfo[irq]->opm != 0x01 ) )
  955. {
  956. ioinfo[irq]->schib.pmcw.mp = 1; /* multipath mode */
  957. } /* endif */
  958. retry = 5;
  959. do
  960. {
  961. ccode2 = msch_err( irq, &ioinfo[irq]->schib);
  962. switch (ccode2) {
  963. case 0:  // successful completion
  964. //
  965. // concurrent sense facility available ...
  966. //
  967. ioinfo[irq]->ui.flags.oper   = 1;
  968. ioinfo[irq]->ui.flags.consns = 1;
  969. ret                          = 0;
  970. break;
  971.       
  972. case 1:  // status pending
  973. //
  974. // How can we have a pending status as
  975. //  device is disabled for interrupts ?
  976. //  Anyway, process it ...
  977. //
  978. ioinfo[irq]->ui.flags.s_pend = 1;
  979. s390_process_IRQ( irq);
  980. ioinfo[irq]->ui.flags.s_pend = 0;
  981. retry--;
  982. ret = -EIO;
  983. break;
  984.    
  985. case 2:  // busy
  986. /*
  987.  * we mark it not-oper as we can't
  988.  *  properly operate it !
  989.  */
  990. ioinfo[irq]->ui.flags.oper = 0;
  991. udelay( 100); /* allow for recovery */
  992. retry--;
  993. ret = -EBUSY;
  994. break;
  995. case 3:  // not operational
  996. ioinfo[irq]->ui.flags.oper = 0;
  997. retry                      = 0;
  998. ret = -ENODEV;
  999. break;
  1000. default:
  1001. #define PGMCHK_OPERAND_EXC      0x15
  1002. if ( (ccode2 & PGMCHK_OPERAND_EXC) == PGMCHK_OPERAND_EXC )
  1003. {
  1004. /*
  1005.  * re-issue the modify subchannel without trying to
  1006.  *  enable the concurrent sense facility
  1007.  */
  1008. ioinfo[irq]->schib.pmcw.csense = 0;
  1009.    
  1010. ccode2 = msch_err( irq, &ioinfo[irq]->schib);
  1011. if ( ccode2 != 0 )
  1012. {
  1013. printk( KERN_ERR " ... msch() (2) failed with CC = %Xn",
  1014.         ccode2 );
  1015. if (cio_debug_initialized)
  1016. debug_sprintf_event(cio_debug_msg_id, 0,
  1017.     "msch() (2) failed with CC=%Xn",
  1018.     ccode2);
  1019. ioinfo[irq]->ui.flags.oper = 0;
  1020. ret                        = -EIO;
  1021. }
  1022. else
  1023. {
  1024. ioinfo[irq]->ui.flags.oper   = 1;
  1025. ioinfo[irq]->ui.flags.consns = 0;
  1026. ret                          = 0;
  1027. } /* endif */
  1028. }
  1029. else
  1030. {
  1031. printk( KERN_ERR " ... msch() (1) failed with CC = %Xn",
  1032.         ccode2);
  1033. if (cio_debug_initialized)
  1034. debug_sprintf_event(cio_debug_msg_id, 0,
  1035.     "msch() (1) failed with CC = %Xn",
  1036.     ccode2);
  1037. ioinfo[irq]->ui.flags.oper = 0;
  1038. ret                        = -EIO;
  1039. } /* endif */
  1040.    
  1041. retry  = 0;
  1042. break;
  1043. } /* endswitch */
  1044. } while ( ccode2 && retry );
  1045. if ( (ccode2 != 0) && (ccode2 != 3) && (!retry) )
  1046. {
  1047. printk( KERN_ERR " ... msch() retry count for "
  1048.         "subchannel %04X exceeded, CC = %dn",
  1049.         irq,
  1050.         ccode2);
  1051. if (cio_debug_initialized)
  1052. debug_sprintf_event(cio_debug_msg_id, 0,
  1053.     " ... msch() retry count for "
  1054.     "subchannel %04X exceeded, CC = %dn",
  1055.     irq, ccode2);     
  1056. } /* endif */
  1057. }
  1058. else
  1059. {
  1060. /* no path available ... */
  1061. ioinfo[irq]->ui.flags.oper = 0;
  1062. ret                        = -ENODEV;    
  1063. } /* endif */
  1064.      }
  1065. }
  1066. else
  1067. {
  1068. ret = -ENODEV;
  1069. } /* endif */
  1070. }
  1071. else
  1072. {
  1073. ret = -ENXIO;
  1074. } /* endif */
  1075. return( ret );
  1076. }
  1077. /*
  1078.  * s390_SenseID
  1079.  *
  1080.  * Try to obtain the 'control unit'/'device type' information
  1081.  *  associated with the subchannel.
  1082.  *
  1083.  * The function is primarily meant to be called without irq
  1084.  *  action handler in place. However, it also allows for
  1085.  *  use with an action handler in place. If there is already
  1086.  *  an action handler registered assure it can handle the
  1087.  *  s390_SenseID() related device interrupts - interruption
  1088.  *  parameter used is 0x00E2C9C4 ( SID ).
  1089.  */
  1090. int s390_SenseID( int irq, senseid_t *sid, __u8 lpm )
  1091. {
  1092. ccw1_t    *sense_ccw;     /* ccw area for SenseID command */
  1093. senseid_t  isid;          /* internal sid */
  1094. devstat_t  devstat;       /* required by request_irq() */
  1095. __u8       pathmask;      /* calulate path mask */
  1096. __u8       domask;        /* path mask to use */
  1097. int        inlreq;        /* inline request_irq() */
  1098. int        irq_ret;       /* return code */
  1099. devstat_t *pdevstat;      /* ptr to devstat in use */
  1100. int        retry;         /* retry count */
  1101. int        io_retry;      /* retry indicator */
  1102. senseid_t *psid     = sid;/* start with the external buffer */
  1103. int        sbuffer  = 0;  /* switch SID data buffer */
  1104. char dbf_txt[15];
  1105. int failure = 0;          /* nothing went wrong yet */
  1106. SANITY_CHECK(irq);
  1107. if ( ioinfo[irq]->ui.flags.oper == 0 )
  1108. {
  1109. return( -ENODEV );
  1110. } /* endif */
  1111. if (cio_debug_initialized) {
  1112. sprintf(dbf_txt, "snsID%x", irq);
  1113. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1114. }
  1115. inlreq = 0; /* to make the compiler quiet... */
  1116. if ( !ioinfo[irq]->ui.flags.ready )
  1117. {
  1118. pdevstat = &devstat;
  1119. /*
  1120.  * Perform SENSE ID command processing. We have to request device
  1121.  *  ownership and provide a dummy I/O handler. We issue sync. I/O
  1122.  *  requests and evaluate the devstat area on return therefore
  1123.  *  we don't need a real I/O handler in place.
  1124.  */
  1125. irq_ret = request_irq( irq, init_IRQ_handler, SA_PROBE, "SID", &devstat);
  1126. if ( irq_ret == 0 )
  1127. inlreq = 1;
  1128. }
  1129. else
  1130. {
  1131. inlreq   = 0;
  1132. irq_ret  = 0;
  1133. pdevstat = ioinfo[irq]->irq_desc.dev_id;
  1134.    } /* endif */
  1135. if ( irq_ret == 0 )
  1136. {
  1137. int i;
  1138. s390irq_spin_lock( irq);
  1139. if ( init_IRQ_complete )
  1140. {
  1141. sense_ccw = kmalloc( 2*sizeof( ccw1_t), GFP_DMA);
  1142. }
  1143. else
  1144. {
  1145. sense_ccw = alloc_bootmem_low( 2*sizeof( ccw1_t));
  1146. } /* endif */
  1147. // more than one path installed ?
  1148. if ( ioinfo[irq]->schib.pmcw.pim != 0x80 )
  1149. {
  1150. sense_ccw[0].cmd_code = CCW_CMD_SUSPEND_RECONN;
  1151. sense_ccw[0].cda      = 0;
  1152. sense_ccw[0].count    = 0;
  1153. sense_ccw[0].flags    = CCW_FLAG_SLI | CCW_FLAG_CC;
  1154. sense_ccw[1].cmd_code = CCW_CMD_SENSE_ID;
  1155. sense_ccw[1].cda      = (__u32)virt_to_phys( sid );
  1156. sense_ccw[1].count    = sizeof( senseid_t);
  1157. sense_ccw[1].flags    = CCW_FLAG_SLI;
  1158. }
  1159. else
  1160. {
  1161. sense_ccw[0].cmd_code = CCW_CMD_SENSE_ID;
  1162. sense_ccw[0].cda      = (__u32)virt_to_phys( sid );
  1163. sense_ccw[0].count    = sizeof( senseid_t);
  1164. sense_ccw[0].flags    = CCW_FLAG_SLI;
  1165. } /* endif */
  1166. for ( i = 0 ; (i < 8) ; i++ )
  1167. {
  1168. pathmask = 0x80 >> i;
  1169. domask = ioinfo[irq]->opm & pathmask;
  1170. if ( lpm )
  1171. domask &= lpm;
  1172. if ( domask )
  1173. {
  1174. failure = 0;
  1175. psid->reserved   = 0;
  1176. psid->cu_type    = 0xFFFF;  /* initialize fields ... */
  1177. psid->cu_model   = 0;
  1178. psid->dev_type   = 0;
  1179. psid->dev_model  = 0;
  1180. retry            = 5;  /* retry count    */
  1181. io_retry         = 1;  /* enable retries */
  1182. /*
  1183.  * We now issue a SenseID request. In case of BUSY,
  1184.  *  STATUS PENDING or non-CMD_REJECT error conditions
  1185.  *  we run simple retries.
  1186.  */
  1187. do
  1188. {
  1189. memset( pdevstat, '', sizeof( devstat_t) );
  1190. irq_ret = s390_start_IO( irq,
  1191.                          sense_ccw,
  1192.                          0x00E2C9C4,  // == SID
  1193.  domask,
  1194.                          DOIO_WAIT_FOR_INTERRUPT
  1195.                           | DOIO_TIMEOUT
  1196.                           | DOIO_VALID_LPM
  1197.                           | DOIO_DONT_CALL_INTHDLR );
  1198. if ( psid->cu_type  == 0xFFFF )
  1199. {
  1200. failure = 1;
  1201. if ( pdevstat->flag & DEVSTAT_STATUS_PENDING )
  1202. {
  1203. #ifdef CONFIG_DEBUG_IO
  1204. printk( KERN_DEBUG "SenseID : device %04X on "
  1205.         "Subchannel %04X "
  1206.         "reports pending status, "
  1207.         "retry : %dn",
  1208.         ioinfo[irq]->schib.pmcw.dev,
  1209. irq,
  1210.         retry);
  1211. #endif
  1212. if (cio_debug_initialized)
  1213. debug_sprintf_event(cio_debug_msg_id, 2,
  1214.     "SenseID : device %04X on "
  1215.     "Subchannel %04X "
  1216.     "reports pending status, "
  1217.     "retry : %dn",
  1218.     ioinfo[irq]->schib.pmcw.dev,
  1219.     irq,
  1220.     retry);     
  1221. } /* endif */
  1222. else if ( pdevstat->flag & DEVSTAT_FLAG_SENSE_AVAIL )
  1223. {
  1224. /*
  1225.  * if the device doesn't support the SenseID
  1226.  *  command further retries wouldn't help ...
  1227.  */
  1228. if (  pdevstat->ii.sense.data[0]
  1229.     & (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ) )
  1230. {
  1231. #ifdef CONFIG_DEBUG_IO
  1232. printk( KERN_ERR "SenseID : device %04X on "
  1233.         "Subchannel %04X "
  1234.         "reports cmd reject or "
  1235.         "intervention requiredn",
  1236.         ioinfo[irq]->schib.pmcw.dev,
  1237.         irq);
  1238. #endif
  1239. if (cio_debug_initialized)
  1240. debug_sprintf_event(cio_debug_msg_id, 2,
  1241.     "SenseID : device %04X on "
  1242.     "Subchannel %04X "
  1243.     "reports cmd reject or "
  1244.     "intervention requiredn",
  1245.     ioinfo[irq]->schib.pmcw.dev,
  1246.     irq);     
  1247. io_retry = 0;
  1248. }
  1249. else
  1250. {
  1251. #ifdef CONFIG_DEBUG_IO
  1252. printk( KERN_WARNING "SenseID : UC on "
  1253.         "dev %04X, "
  1254.         "retry %d, "
  1255.         "lpum %02X, "
  1256.         "cnt %02d, "
  1257.         "sns :"
  1258.         " %02X%02X%02X%02X "
  1259.         "%02X%02X%02X%02X ...n",
  1260.         ioinfo[irq]->schib.pmcw.dev,
  1261.         retry,
  1262.         pdevstat->lpum,
  1263.         pdevstat->scnt,
  1264.         pdevstat->ii.sense.data[0],
  1265.         pdevstat->ii.sense.data[1],
  1266.         pdevstat->ii.sense.data[2],
  1267.         pdevstat->ii.sense.data[3],
  1268.         pdevstat->ii.sense.data[4],
  1269.         pdevstat->ii.sense.data[5],
  1270.         pdevstat->ii.sense.data[6],
  1271.         pdevstat->ii.sense.data[7]);
  1272. #endif
  1273. if (cio_debug_initialized) {
  1274. debug_sprintf_event(cio_debug_msg_id, 2,
  1275.     "SenseID : UC on "
  1276.     "dev %04X, "
  1277.     "retry %d, "
  1278.     "lpum %02X, "
  1279.     "cnt %02d, "
  1280.     "sns :"
  1281.     " %02X%02X%02X%02X "
  1282.     "%02X%02X%02X%02X ...n",
  1283.     ioinfo[irq]->schib.pmcw.dev,
  1284.     retry,
  1285.     pdevstat->lpum,
  1286.     pdevstat->scnt,
  1287.     pdevstat->ii.sense.data[0],
  1288.     pdevstat->ii.sense.data[1],
  1289.     pdevstat->ii.sense.data[2],
  1290.     pdevstat->ii.sense.data[3],
  1291.     pdevstat->ii.sense.data[4],
  1292.     pdevstat->ii.sense.data[5],
  1293.     pdevstat->ii.sense.data[6],
  1294.     pdevstat->ii.sense.data[7]);     
  1295. if (psid->reserved != 0xFF) 
  1296. debug_sprintf_event(cio_debug_msg_id, 2,
  1297.     "SenseID was not properly "
  1298.     "executed!n");
  1299. }
  1300. } /* endif */
  1301. }
  1302. else if (    ( pdevstat->flag & DEVSTAT_NOT_OPER )
  1303.   || ( irq_ret        == -ENODEV         ) )
  1304. {
  1305. #ifdef CONFIG_DEBUG_IO
  1306. printk( KERN_ERR "SenseID : path %02X for "
  1307.         "device %04X on "
  1308.         "subchannel %04X "
  1309.         "is 'not operational'n",
  1310.         domask,
  1311.         ioinfo[irq]->schib.pmcw.dev,
  1312.         irq);
  1313. #endif
  1314. if (cio_debug_initialized)
  1315. debug_sprintf_event(cio_debug_msg_id, 2, 
  1316.     "SenseID : path %02X for "
  1317.     "device %04X on "
  1318.     "subchannel %04X "
  1319.     "is 'not operational'n",
  1320.     domask,
  1321.     ioinfo[irq]->schib.pmcw.dev,
  1322.     irq);     
  1323. io_retry          = 0;
  1324. ioinfo[irq]->opm &= ~domask;
  1325.       
  1326. }
  1327. else if (     ( pdevstat->flag !=
  1328.        (   DEVSTAT_START_FUNCTION
  1329.  | DEVSTAT_FINAL_STATUS    ) )
  1330.    && !( pdevstat->flag &
  1331. DEVSTAT_STATUS_PENDING       ) )
  1332. {
  1333. #ifdef CONFIG_DEBUG_IO
  1334. printk( KERN_INFO "SenseID : start_IO() for "
  1335.         "device %04X on "
  1336.         "subchannel %04X "
  1337.         "returns %d, retry %d, "
  1338.         "status %04Xn",
  1339.         ioinfo[irq]->schib.pmcw.dev,
  1340.         irq,
  1341.         irq_ret,
  1342.         retry,
  1343.         pdevstat->flag);
  1344. #endif
  1345. if (cio_debug_initialized)
  1346. debug_sprintf_event(cio_debug_msg_id, 2,
  1347.     "SenseID : start_IO() for "
  1348.     "device %04X on "
  1349.     "subchannel %04X "
  1350.     "returns %d, retry %d, "
  1351.     "status %04Xn",
  1352.     ioinfo[irq]->schib.pmcw.dev,
  1353.     irq,
  1354.     irq_ret,
  1355.     retry,
  1356.     pdevstat->flag);     
  1357. } /* endif */
  1358. }
  1359. else   // we got it ...
  1360. {
  1361. if (psid->reserved != 0xFF) {
  1362. /* No, we failed after all... */
  1363. failure = 1;
  1364. retry--;
  1365. } else {
  1366.        
  1367. if ( !sbuffer ) // switch buffers
  1368. {
  1369. /*
  1370.  * we report back the
  1371.  *  first hit only
  1372.  */
  1373. psid = &isid;
  1374. if ( ioinfo[irq]->schib.pmcw.pim != 0x80 )
  1375. {
  1376. sense_ccw[1].cda = (__u32)virt_to_phys( psid );
  1377. }
  1378. else
  1379. {
  1380. sense_ccw[0].cda = (__u32)virt_to_phys( psid );
  1381. } /* endif */
  1382. /*
  1383.  * if just the very first
  1384.  *  was requested to be
  1385.  *  sensed disable further
  1386.  *  scans.
  1387.  */
  1388. if ( !lpm )
  1389. lpm = domask;
  1390. sbuffer = 1;
  1391. } /* endif */
  1392. if ( pdevstat->rescnt < (sizeof( senseid_t) - 8) )
  1393. {
  1394. ioinfo[irq]->ui.flags.esid = 1;
  1395.        
  1396. } /* endif */
  1397. io_retry = 0;
  1398. }
  1399. } /* endif */
  1400. if ( io_retry )
  1401. {
  1402. retry--;
  1403. if ( retry == 0 )
  1404. {
  1405. io_retry = 0;
  1406. } /* endif */
  1407.       
  1408. } /* endif */
  1409. if ((failure) && (io_retry)) {
  1410. /* reset fields... */
  1411. failure = 0;
  1412. psid->reserved   = 0;
  1413. psid->cu_type    = 0xFFFF;  
  1414. psid->cu_model   = 0;
  1415. psid->dev_type   = 0;
  1416. psid->dev_model  = 0;
  1417. }
  1418. } while ( (io_retry) );
  1419.   } /* endif - domask */
  1420. } /* endfor */
  1421. if ( init_IRQ_complete )
  1422. {
  1423. kfree( sense_ccw );
  1424. }
  1425. else
  1426. {
  1427. free_bootmem( (unsigned long)sense_ccw, 2*sizeof(ccw1_t) );
  1428. } /* endif */
  1429. s390irq_spin_unlock( irq);
  1430. /*
  1431.  * If we installed the irq action handler we have to
  1432.  *  release it too.
  1433.  */
  1434. if ( inlreq )
  1435. free_irq( irq, pdevstat);
  1436. /*
  1437.  * if running under VM check there ... perhaps we should do
  1438.  *  only if we suffered a command reject, but it doesn't harm
  1439.  */
  1440. if (    ( sid->cu_type == 0xFFFF    )
  1441.      && ( MACHINE_IS_VM             ) )
  1442. {
  1443. VM_virtual_device_info( ioinfo[irq]->schib.pmcw.dev,
  1444.                         sid );
  1445. } /* endif */
  1446. if ( sid->cu_type == 0xFFFF )
  1447. {
  1448. /*
  1449.  * SenseID CU-type of 0xffff indicates that no device
  1450.  *  information could be retrieved (pre-init value).
  1451.  *
  1452.  * If we can't couldn't identify the device type we
  1453.  *  consider the device "not operational".
  1454.  */
  1455. #ifdef CONFIG_DEBUG_IO
  1456. printk( KERN_WARNING "SenseID : unknown device %04X on subchannel %04Xn",
  1457.         ioinfo[irq]->schib.pmcw.dev,
  1458.         irq);
  1459. #endif
  1460. if (cio_debug_initialized)
  1461. debug_sprintf_event(cio_debug_msg_id, 2,
  1462.     "SenseID : unknown device %04X on subchannel %04Xn",
  1463.     ioinfo[irq]->schib.pmcw.dev,
  1464.     irq);     
  1465. ioinfo[irq]->ui.flags.unknown = 1;
  1466. } /* endif */
  1467. /*
  1468.  * Issue device info message if unit was operational .
  1469.  */
  1470. if ( !ioinfo[irq]->ui.flags.unknown ) {
  1471. if ( sid->dev_type != 0 ) {
  1472. if ( cio_show_msg ) 
  1473. printk( KERN_INFO"SenseID : device %04X reports: "
  1474. "CU  Type/Mod = %04X/%02X,"
  1475. " Dev Type/Mod = %04X/%02Xn",
  1476. ioinfo[irq]->schib.pmcw.dev,
  1477. sid->cu_type,
  1478. sid->cu_model,
  1479. sid->dev_type,
  1480. sid->dev_model);
  1481. if (cio_debug_initialized)
  1482. debug_sprintf_event(cio_debug_msg_id, 2,
  1483.     "SenseID : device %04X reports: "
  1484.     "CU  Type/Mod = %04X/%02X,"
  1485.     " Dev Type/Mod = %04X/%02Xn",
  1486.     ioinfo[irq]->schib.pmcw.dev,
  1487.     sid->cu_type,
  1488.     sid->cu_model,
  1489.     sid->dev_type,
  1490.     sid->dev_model);
  1491. } else {
  1492. if ( cio_show_msg ) 
  1493. printk( KERN_INFO"SenseID : device %04X reports:"
  1494. " Dev Type/Mod = %04X/%02Xn",
  1495. ioinfo[irq]->schib.pmcw.dev,
  1496. sid->cu_type,
  1497. sid->cu_model);
  1498. if (cio_debug_initialized)
  1499. debug_sprintf_event(cio_debug_msg_id, 2,
  1500.     "SenseID : device %04X reports:"
  1501.     " Dev Type/Mod = %04X/%02Xn",
  1502.     ioinfo[irq]->schib.pmcw.dev,
  1503.     sid->cu_type,
  1504.     sid->cu_model);     
  1505. } /* endif */
  1506. } /* endif */
  1507. if ( !ioinfo[irq]->ui.flags.unknown )
  1508. irq_ret = 0;
  1509. else
  1510. irq_ret = -ENODEV;
  1511. } /* endif */
  1512.    return( irq_ret );
  1513. }
  1514. static int __inline__ s390_SetMultiPath( int irq )
  1515. {
  1516. int cc;
  1517. cc = stsch( irq, &ioinfo[irq]->schib );
  1518. if ( !cc )
  1519. {
  1520. ioinfo[irq]->schib.pmcw.mp = 1;     /* multipath mode */
  1521. cc = msch( irq, &ioinfo[irq]->schib );
  1522. } /* endif */
  1523. return( cc);
  1524. }
  1525. /*
  1526.  * Device Path Verification
  1527.  *
  1528.  * Path verification is accomplished by checking which paths (CHPIDs) are
  1529.  *  available. Further, a path group ID is set, if possible in multipath
  1530.  *  mode, otherwise in single path mode.
  1531.  *
  1532.  * Note : This function must not be called during normal device recognition,
  1533.  *         but during device driver initiated request_irq() processing only.
  1534.  */
  1535. int s390_DevicePathVerification( int irq, __u8 usermask )
  1536. {
  1537. int  ccode;
  1538. __u8 pathmask;
  1539. __u8 domask;
  1540. int ret = 0;
  1541. char dbf_txt[15];
  1542. if (cio_debug_initialized) {
  1543. sprintf(dbf_txt, "dpver%x", irq);
  1544. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1545. }
  1546. if ( ioinfo[irq]->ui.flags.pgid_supp == 0 )
  1547. {
  1548. return( 0); // just exit ...
  1549. } /* endif */
  1550. ccode = stsch( irq, &(ioinfo[irq]->schib) );
  1551. if ( ccode )
  1552. {
  1553. ret = -ENODEV;
  1554. }
  1555. else if ( ioinfo[irq]->schib.pmcw.pim == 0x80 )
  1556. {
  1557. /*
  1558.  * no error, just not required for single path only devices
  1559.  */
  1560. ioinfo[irq]->ui.flags.pgid_supp = 0;
  1561. ret = 0;
  1562. }
  1563. else
  1564. {
  1565. int    i;
  1566. pgid_t pgid;
  1567. __u8   dev_path;
  1568. int    first  = 1;
  1569. ioinfo[irq]->opm =   ioinfo[irq]->schib.pmcw.pim
  1570.                    & ioinfo[irq]->schib.pmcw.pam
  1571.                    & ioinfo[irq]->schib.pmcw.pom;
  1572. if ( usermask )
  1573. {
  1574. dev_path = usermask;
  1575. }
  1576. else
  1577. {
  1578. dev_path = ioinfo[irq]->opm;
  1579. } /* endif */
  1580. /*
  1581.  * let's build a path group ID if we don't have one yet
  1582.  */
  1583. if ( ioinfo[irq]->ui.flags.pgid == 0)
  1584. {
  1585. ioinfo[irq]->pgid.cpu_addr  = *(__u16 *)__LC_CPUADDR;
  1586. ioinfo[irq]->pgid.cpu_id    = ((cpuid_t *)__LC_CPUID)->ident;
  1587. ioinfo[irq]->pgid.cpu_model = ((cpuid_t *)__LC_CPUID)->machine;
  1588. ioinfo[irq]->pgid.tod_high  = *(__u32 *)&irq_IPL_TOD;
  1589. ioinfo[irq]->ui.flags.pgid  = 1;
  1590. } /* endif */     
  1591. memcpy( &pgid, &ioinfo[irq]->pgid, sizeof(pgid_t));
  1592. for ( i = 0; i < 8 && !ret ; i++)
  1593. {
  1594. pathmask = 0x80 >> i;
  1595. domask = dev_path & pathmask;
  1596. if ( domask )
  1597. {
  1598. ret = s390_SetPGID( irq, domask, &pgid );
  1599. /*
  1600.  * For the *first* path we are prepared
  1601.  *  for recovery
  1602.  *
  1603.  *  - If we fail setting the PGID we assume its
  1604.  *     using  a different PGID already (VM) we
  1605.  *     try to sense.
  1606.  */
  1607. if ( ret == -EOPNOTSUPP && first )
  1608. {
  1609. *(int *)&pgid = 0;
  1610. ret   = s390_SensePGID( irq, domask, &pgid);
  1611. first = 0;
  1612. if ( ret == 0 )
  1613. {
  1614. /*
  1615.  * Check whether we retrieved
  1616.  *  a reasonable PGID ...
  1617.  */
  1618. if ( pgid.inf.ps.state1 == SNID_STATE1_GROUPED )
  1619. {
  1620. memcpy( &(ioinfo[irq]->pgid),
  1621.         &pgid,
  1622.         sizeof(pgid_t) );
  1623. }
  1624. else // ungrouped or garbage ...
  1625. {
  1626. ret = -EOPNOTSUPP;
  1627. } /* endif */
  1628. }
  1629. else
  1630. {
  1631. ioinfo[irq]->ui.flags.pgid_supp = 0;
  1632. #ifdef CONFIG_DEBUG_IO
  1633. printk( KERN_WARNING "PathVerification(%04X) "
  1634.         "- Device %04X doesn't "
  1635.         " support path groupingn",
  1636.         irq,
  1637.         ioinfo[irq]->schib.pmcw.dev);
  1638. #endif
  1639. if (cio_debug_initialized)
  1640. debug_sprintf_event(cio_debug_msg_id, 2,
  1641.     "PathVerification(%04X) "
  1642.     "- Device %04X doesn't "
  1643.     " support path groupingn",
  1644.     irq,
  1645.     ioinfo[irq]->schib.pmcw.dev);     
  1646. } /* endif */
  1647. }
  1648. else if ( ret == -EIO ) 
  1649. {
  1650. #ifdef CONFIG_DEBUG_IO
  1651. printk( KERN_ERR "PathVerification(%04X) - I/O error "
  1652.        "on device %04Xn", irq,
  1653.        ioinfo[irq]->schib.pmcw.dev);
  1654. #endif
  1655. if (cio_debug_initialized)
  1656. debug_sprintf_event(cio_debug_msg_id, 2,
  1657.     "PathVerification(%04X) - I/O error "
  1658.     "on device %04Xn", irq,
  1659.     ioinfo[irq]->schib.pmcw.dev);
  1660. ioinfo[irq]->ui.flags.pgid_supp = 0;
  1661.     
  1662. } else {
  1663. #ifdef CONFIG_DEBUG_IO
  1664. printk( KERN_ERR "PathVerification(%04X) "
  1665. "- Unexpected error on device %04Xn",
  1666. irq,
  1667. ioinfo[irq]->schib.pmcw.dev);
  1668. #endif
  1669. if (cio_debug_initialized)
  1670. debug_sprintf_event(cio_debug_msg_id, 2,
  1671.     "PathVerification(%04X) - "
  1672.     "Unexpected error on device %04Xn",
  1673.     irq,
  1674.     ioinfo[irq]->schib.pmcw.dev);     
  1675. ioinfo[irq]->ui.flags.pgid_supp = 0;
  1676. } /* endif */
  1677. } /* endif */
  1678. } /* endfor */
  1679. } /* endif */
  1680. return ret;
  1681. }
  1682. /*
  1683.  * s390_SetPGID
  1684.  *
  1685.  * Set Path Group ID
  1686.  *
  1687.  */
  1688. int s390_SetPGID( int irq, __u8 lpm, pgid_t *pgid )
  1689. {
  1690. ccw1_t    *spid_ccw;    /* ccw area for SPID command */
  1691. devstat_t  devstat;     /* required by request_irq() */
  1692. devstat_t *pdevstat = &devstat;
  1693.         unsigned long flags;
  1694. char dbf_txt[15];
  1695. int        irq_ret = 0; /* return code */
  1696. int        retry   = 5; /* retry count */
  1697. int        inlreq  = 0; /* inline request_irq() */
  1698. int        mpath   = 1; /* try multi-path first */
  1699. SANITY_CHECK(irq);
  1700. if ( ioinfo[irq]->ui.flags.oper == 0 )
  1701. {
  1702. return( -ENODEV );
  1703. } /* endif */
  1704. if (cio_debug_initialized) {
  1705. sprintf(dbf_txt,"SPID%x",irq);
  1706. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1707. }
  1708. if ( !ioinfo[irq]->ui.flags.ready )
  1709. {
  1710. /*
  1711.  * Perform SetPGID command processing. We have to request device
  1712.  *  ownership and provide a dummy I/O handler. We issue sync. I/O
  1713.  *  requests and evaluate the devstat area on return therefore
  1714.  *  we don't need a real I/O handler in place.
  1715.  */
  1716. irq_ret = request_irq( irq,
  1717.                        init_IRQ_handler,
  1718.                        SA_PROBE,
  1719.                        "SPID",
  1720.                        pdevstat);
  1721. if ( irq_ret == 0 )
  1722. inlreq = 1;
  1723. }
  1724. else
  1725. {
  1726. pdevstat = ioinfo[irq]->irq_desc.dev_id;
  1727. } /* endif */
  1728. if ( irq_ret == 0 )
  1729. {
  1730. s390irq_spin_lock_irqsave( irq, flags);
  1731. if ( init_IRQ_complete )
  1732. {
  1733. spid_ccw = kmalloc( 2*sizeof( ccw1_t), GFP_DMA);
  1734. }
  1735. else
  1736. {
  1737. spid_ccw = alloc_bootmem_low( 2*sizeof( ccw1_t));
  1738. } /* endif */
  1739. spid_ccw[0].cmd_code = CCW_CMD_SUSPEND_RECONN;
  1740. spid_ccw[0].cda      = 0;
  1741. spid_ccw[0].count    = 0;
  1742. spid_ccw[0].flags    = CCW_FLAG_SLI | CCW_FLAG_CC;
  1743. spid_ccw[1].cmd_code = CCW_CMD_SET_PGID;
  1744. spid_ccw[1].cda      = (__u32)virt_to_phys( pgid );
  1745. spid_ccw[1].count    = sizeof( pgid_t);
  1746. spid_ccw[1].flags    = CCW_FLAG_SLI;
  1747. pgid->inf.fc = SPID_FUNC_MULTI_PATH | SPID_FUNC_ESTABLISH;
  1748. /*
  1749.  * We now issue a SetPGID request. In case of BUSY
  1750.  *  or STATUS PENDING conditions we retry 5 times.
  1751.  */
  1752. do
  1753. {
  1754. memset( pdevstat, '', sizeof( devstat_t) );
  1755. irq_ret = s390_start_IO( irq,
  1756.                          spid_ccw,
  1757.                          0xE2D7C9C4,  // == SPID
  1758.                          lpm,         // n/a
  1759.                          DOIO_WAIT_FOR_INTERRUPT
  1760.                           | DOIO_VALID_LPM
  1761.                           | DOIO_DONT_CALL_INTHDLR );
  1762. if ( !irq_ret )
  1763. {
  1764. if ( pdevstat->flag & DEVSTAT_STATUS_PENDING )
  1765. {
  1766. #ifdef CONFIG_DEBUG_IO
  1767. printk( KERN_DEBUG "SPID - Device %04X "
  1768.         "on Subchannel %04X "
  1769.         "reports pending status, "
  1770.         "retry : %dn",
  1771.         ioinfo[irq]->schib.pmcw.dev,
  1772.         irq,
  1773.         retry);
  1774. #endif
  1775. if (cio_debug_initialized)
  1776. debug_sprintf_event(cio_debug_msg_id, 2,
  1777.     "SPID - Device %04X "
  1778.     "on Subchannel %04X "
  1779.     "reports pending status, "
  1780.     "retry : %dn",
  1781.     ioinfo[irq]->schib.pmcw.dev,
  1782.     irq,
  1783.     retry);     
  1784. retry--;
  1785. irq_ret = -EIO;
  1786. } /* endif */
  1787. if ( pdevstat->flag == (   DEVSTAT_START_FUNCTION
  1788.                          | DEVSTAT_FINAL_STATUS   ) )
  1789. {
  1790. retry = 0; // successfully set ...
  1791. irq_ret = 0;
  1792. }
  1793. else if ( pdevstat->flag & DEVSTAT_FLAG_SENSE_AVAIL )
  1794. {
  1795. /*
  1796.  * If the device doesn't support the
  1797.  *  Sense Path Group ID command
  1798.  *  further retries wouldn't help ...
  1799.  */
  1800. if ( pdevstat->ii.sense.data[0] & SNS0_CMD_REJECT )
  1801. {
  1802. if ( mpath )
  1803. {
  1804. /*
  1805.  * We now try single path mode.
  1806.  * Note we must not issue the suspend
  1807.  * multipath reconnect, or we will get
  1808.  * a command reject by tapes.
  1809.  */
  1810. spid_ccw[0].cmd_code = CCW_CMD_SET_PGID;
  1811. spid_ccw[0].cda      = (__u32)virt_to_phys( pgid );
  1812. spid_ccw[0].count    = sizeof( pgid_t);
  1813. spid_ccw[0].flags    = CCW_FLAG_SLI;
  1814. pgid->inf.fc =   SPID_FUNC_SINGLE_PATH
  1815.                | SPID_FUNC_ESTABLISH;
  1816. mpath        = 0;
  1817. retry--;
  1818. irq_ret = -EIO;
  1819. }
  1820. else
  1821. {
  1822. irq_ret = -EOPNOTSUPP;
  1823. retry   = 0;
  1824. } /* endif */
  1825. }
  1826. else
  1827. {
  1828. #ifdef CONFIG_DEBUG_IO
  1829. printk( KERN_WARNING "SPID - device %04X,"
  1830.         " unit check,"
  1831.         " retry %d, cnt %02d,"
  1832.         " sns :"
  1833.         " %02X%02X%02X%02X %02X%02X%02X%02X ...n",
  1834.         ioinfo[irq]->schib.pmcw.dev,
  1835.         retry,
  1836.         pdevstat->scnt,
  1837.         pdevstat->ii.sense.data[0],
  1838.         pdevstat->ii.sense.data[1],
  1839.         pdevstat->ii.sense.data[2],
  1840.         pdevstat->ii.sense.data[3],
  1841.         pdevstat->ii.sense.data[4],
  1842.         pdevstat->ii.sense.data[5],
  1843.         pdevstat->ii.sense.data[6],
  1844.         pdevstat->ii.sense.data[7]);
  1845. #endif
  1846. if (cio_debug_initialized)
  1847. debug_sprintf_event(cio_debug_msg_id, 2,
  1848.     "SPID - device %04X,"
  1849.     " unit check,"
  1850.     " retry %d, cnt %02d,"
  1851.     " sns :"
  1852.     " %02X%02X%02X%02X %02X%02X%02X%02X ...n",
  1853.     ioinfo[irq]->schib.pmcw.dev,
  1854.     retry,
  1855.     pdevstat->scnt,
  1856.     pdevstat->ii.sense.data[0],
  1857.     pdevstat->ii.sense.data[1],
  1858.     pdevstat->ii.sense.data[2],
  1859.     pdevstat->ii.sense.data[3],
  1860.     pdevstat->ii.sense.data[4],
  1861.     pdevstat->ii.sense.data[5],
  1862.     pdevstat->ii.sense.data[6],
  1863.     pdevstat->ii.sense.data[7]);
  1864. retry--;
  1865. irq_ret = -EIO;
  1866.     
  1867. } /* endif */
  1868. }
  1869. else if ( pdevstat->flag & DEVSTAT_NOT_OPER )
  1870. {
  1871. /* don't issue warnings during startup unless requested*/
  1872. if (init_IRQ_complete || cio_notoper_msg) {   
  1873. printk( KERN_WARNING "SPID - Device %04X "
  1874. "on Subchannel %04X "
  1875. "became 'not operational'n",
  1876. ioinfo[irq]->schib.pmcw.dev,
  1877. irq);
  1878. if (cio_debug_initialized)
  1879. debug_sprintf_event(cio_debug_msg_id, 2,
  1880.     "SPID - Device %04X "
  1881.     "on Subchannel %04X "
  1882.     "became 'not operational'n",
  1883.     ioinfo[irq]->schib.pmcw.dev,
  1884.     irq);     
  1885. }
  1886. retry = 0;
  1887. irq_ret = -EIO;
  1888. } /* endif */
  1889. }
  1890. else if ( irq_ret != -ENODEV )
  1891. {
  1892. retry--;
  1893. irq_ret = -EIO;
  1894. }
  1895. else
  1896. {
  1897. retry = 0;
  1898. irq_ret = -ENODEV;
  1899. } /* endif */
  1900. } while ( retry > 0 );
  1901. if ( init_IRQ_complete )
  1902. {
  1903. kfree( spid_ccw );
  1904. }
  1905. else
  1906. {
  1907. free_bootmem( (unsigned long)spid_ccw, 2*sizeof(ccw1_t) );
  1908. } /* endif */
  1909. s390irq_spin_unlock_irqrestore( irq, flags);
  1910. /*
  1911.  * If we installed the irq action handler we have to
  1912.  *  release it too.
  1913.  */
  1914. if ( inlreq )
  1915. free_irq( irq, pdevstat);
  1916. } /* endif */
  1917.    return( irq_ret );
  1918. }
  1919. /*
  1920.  * s390_SensePGID
  1921.  *
  1922.  * Sense Path Group ID
  1923.  *
  1924.  */
  1925. int s390_SensePGID( int irq, __u8 lpm, pgid_t *pgid )
  1926. {
  1927. ccw1_t    *snid_ccw;    /* ccw area for SNID command */
  1928. devstat_t  devstat;     /* required by request_irq() */
  1929. devstat_t *pdevstat = &devstat;
  1930. char dbf_txt[15];
  1931. int        irq_ret = 0; /* return code */
  1932. int        retry   = 5; /* retry count */
  1933. int        inlreq  = 0; /* inline request_irq() */
  1934. unsigned long flags;
  1935. SANITY_CHECK(irq);
  1936. if ( ioinfo[irq]->ui.flags.oper == 0 )
  1937. {
  1938. return( -ENODEV );
  1939. } /* endif */
  1940. if (cio_debug_initialized) {
  1941. sprintf(dbf_txt,"SNID%x",irq);
  1942. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1943. }
  1944. if ( !ioinfo[irq]->ui.flags.ready )
  1945. {
  1946. /*
  1947.  * Perform SENSE PGID command processing. We have to request device
  1948.  *  ownership and provide a dummy I/O handler. We issue sync. I/O
  1949.  *  requests and evaluate the devstat area on return therefore
  1950.  *  we don't need a real I/O handler in place.
  1951.  */
  1952. irq_ret = request_irq( irq,
  1953.                        init_IRQ_handler,
  1954.                        SA_PROBE,
  1955.                        "SNID",
  1956.                        pdevstat);
  1957. if ( irq_ret == 0 )
  1958. inlreq = 1;
  1959.    }
  1960. else
  1961. {
  1962. pdevstat = ioinfo[irq]->irq_desc.dev_id;
  1963. } /* endif */
  1964. if ( irq_ret == 0 )
  1965. {
  1966. s390irq_spin_lock_irqsave( irq, flags);
  1967. if ( init_IRQ_complete )
  1968. {
  1969. snid_ccw = kmalloc( sizeof( ccw1_t), GFP_DMA);
  1970. }
  1971. else
  1972. {
  1973. snid_ccw = alloc_bootmem_low( sizeof( ccw1_t));
  1974. } /* endif */
  1975. snid_ccw->cmd_code = CCW_CMD_SENSE_PGID;
  1976. snid_ccw->cda      = (__u32)virt_to_phys( pgid );
  1977. snid_ccw->count    = sizeof( pgid_t);
  1978. snid_ccw->flags    = CCW_FLAG_SLI;
  1979. /*
  1980.  * We now issue a SensePGID request. In case of BUSY
  1981.  *  or STATUS PENDING conditions we retry 5 times.
  1982.  */
  1983. do
  1984. {
  1985. memset( pdevstat, '', sizeof( devstat_t) );
  1986. irq_ret = s390_start_IO( irq,
  1987.                          snid_ccw,
  1988.                          0xE2D5C9C4,  // == SNID
  1989.                          lpm,         // n/a
  1990.                          DOIO_WAIT_FOR_INTERRUPT
  1991.                           | DOIO_VALID_LPM
  1992.                           | DOIO_DONT_CALL_INTHDLR );
  1993. if ( irq_ret == 0 )
  1994. {
  1995. if ( pdevstat->flag & DEVSTAT_FLAG_SENSE_AVAIL )
  1996. {
  1997. /*
  1998.  * If the device doesn't support the
  1999.  *  Sense Path Group ID command
  2000.  *  further retries wouldn't help ...
  2001.  */
  2002. if ( pdevstat->ii.sense.data[0] & SNS0_CMD_REJECT )
  2003. {
  2004. retry   = 0;
  2005. irq_ret = -EOPNOTSUPP;
  2006. }
  2007. else
  2008. {
  2009. #ifdef CONFIG_DEBUG_IO
  2010. printk( KERN_WARNING "SNID - device %04X,"
  2011.         " unit check,"
  2012.         " flag %04X, "
  2013.         " retry %d, cnt %02d,"
  2014.         " sns :"
  2015.         " %02X%02X%02X%02X %02X%02X%02X%02X ...n",
  2016.         ioinfo[irq]->schib.pmcw.dev,
  2017.         pdevstat->flag,
  2018.         retry,
  2019.         pdevstat->scnt,
  2020.         pdevstat->ii.sense.data[0],
  2021.         pdevstat->ii.sense.data[1],
  2022.         pdevstat->ii.sense.data[2],
  2023.         pdevstat->ii.sense.data[3],
  2024.         pdevstat->ii.sense.data[4],
  2025.         pdevstat->ii.sense.data[5],
  2026.         pdevstat->ii.sense.data[6],
  2027.         pdevstat->ii.sense.data[7]);
  2028. #endif
  2029. if (cio_debug_initialized)
  2030. debug_sprintf_event(cio_debug_msg_id, 2,
  2031.     "SNID - device %04X,"
  2032.     " unit check,"
  2033.     " flag %04X, "
  2034.     " retry %d, cnt %02d,"
  2035.     " sns :"
  2036.     " %02X%02X%02X%02X %02X%02X%02X%02X ...n",
  2037.     ioinfo[irq]->schib.pmcw.dev,
  2038.     pdevstat->flag,
  2039.     retry,
  2040.     pdevstat->scnt,
  2041.     pdevstat->ii.sense.data[0],
  2042.     pdevstat->ii.sense.data[1],
  2043.     pdevstat->ii.sense.data[2],
  2044.     pdevstat->ii.sense.data[3],
  2045.     pdevstat->ii.sense.data[4],
  2046.     pdevstat->ii.sense.data[5],
  2047.     pdevstat->ii.sense.data[6],
  2048.     pdevstat->ii.sense.data[7]);     
  2049. retry--;
  2050. irq_ret = -EIO;
  2051. } /* endif */
  2052. }
  2053. else if ( pdevstat->flag & DEVSTAT_NOT_OPER )
  2054. {
  2055. /* don't issue warnings during startup unless requested*/
  2056. if (init_IRQ_complete || cio_notoper_msg) {  
  2057. printk( KERN_WARNING "SNID - Device %04X "
  2058. "on Subchannel %04X "
  2059. "became 'not operational'n",
  2060. ioinfo[irq]->schib.pmcw.dev,
  2061. irq);
  2062. if (cio_debug_initialized)
  2063. debug_sprintf_event(cio_debug_msg_id, 2,
  2064.     "SNID - Device %04X "
  2065.     "on Subchannel %04X "
  2066.     "became 'not operational'n",
  2067.     ioinfo[irq]->schib.pmcw.dev,
  2068.     irq);     
  2069. }
  2070. retry = 0;
  2071. irq_ret = -EIO;
  2072. }
  2073. else
  2074. {
  2075. retry = 0; // success ...
  2076. irq_ret = 0;
  2077. } /* endif */
  2078. }
  2079. else if ( irq_ret != -ENODEV ) // -EIO, or -EBUSY
  2080. {
  2081. if ( pdevstat->flag & DEVSTAT_STATUS_PENDING )
  2082. {
  2083. #ifdef CONFIG_DEBUG_IO
  2084. printk( KERN_INFO "SNID - Device %04X "
  2085.         "on Subchannel %04X "
  2086.         "reports pending status, "
  2087.         "retry : %dn",
  2088.         ioinfo[irq]->schib.pmcw.dev,
  2089.         irq,
  2090.         retry);
  2091. #endif
  2092. if (cio_debug_initialized)
  2093. debug_sprintf_event(cio_debug_msg_id, 2,
  2094.     "SNID - Device %04X "
  2095.     "on Subchannel %04X "
  2096.     "reports pending status, "
  2097.     "retry : %dn",
  2098.     ioinfo[irq]->schib.pmcw.dev,
  2099.     irq,
  2100.     retry);     
  2101. } /* endif */
  2102. printk( KERN_WARNING "SNID - device %04X,"
  2103.         " start_io() reports rc : %d, retrying ...n",
  2104.         ioinfo[irq]->schib.pmcw.dev,
  2105.         irq_ret);
  2106. if (cio_debug_initialized)
  2107. debug_sprintf_event(cio_debug_msg_id, 2, 
  2108.     "SNID - device %04X,"
  2109.     " start_io() reports rc : %d, retrying ...n",
  2110.     ioinfo[irq]->schib.pmcw.dev,
  2111.     irq_ret);
  2112. retry--;
  2113. irq_ret = -EIO;
  2114. }
  2115. else // -ENODEV ...
  2116. {
  2117. retry = 0;
  2118. irq_ret = -ENODEV;
  2119. } /* endif */
  2120. } while ( retry > 0 );
  2121. if ( init_IRQ_complete )
  2122. {
  2123. kfree( snid_ccw );
  2124. }
  2125. else
  2126. {
  2127. free_bootmem( (unsigned long)snid_ccw, sizeof(ccw1_t) );
  2128. } /* endif */
  2129. s390irq_spin_unlock_irqrestore( irq, flags);
  2130. /*
  2131.  * If we installed the irq action handler we have to
  2132.  *  release it too.
  2133.  */
  2134. if ( inlreq )
  2135. free_irq( irq, pdevstat);
  2136. } /* endif */
  2137.    return( irq_ret );
  2138. }
  2139. /*
  2140.  * s390_do_crw_pending
  2141.  *
  2142.  * Called by the machine check handler to process CRW pending
  2143.  *  conditions. It may be a single CRW, or CRWs may be chained.
  2144.  *
  2145.  * Note : we currently process CRWs for subchannel source only
  2146.  */
  2147. void s390_do_crw_pending( crwe_t *pcrwe )
  2148. {
  2149. int irq;
  2150. int chpid;
  2151. int dev_oper = 0;
  2152. int dev_no   = -1;
  2153. int lock     = 0;
  2154. #ifdef CONFIG_DEBUG_CRW
  2155. printk( KERN_DEBUG "do_crw_pending : starting ...n");
  2156. #endif
  2157. if (cio_debug_initialized) 
  2158. debug_sprintf_event(cio_debug_crw_id, 2, 
  2159.     "do_crw_pending: startingn");
  2160. while ( pcrwe != NULL )
  2161. {
  2162. int is_owned = 0;
  2163. switch ( pcrwe->crw.rsc ) {
  2164. case CRW_RSC_SCH :
  2165. irq = pcrwe->crw.rsid;
  2166. #ifdef CONFIG_DEBUG_CRW
  2167. printk( KERN_NOTICE"do_crw_pending : source is "
  2168.         "subchannel %04Xn", irq);
  2169. #endif
  2170. if (cio_debug_initialized)
  2171. debug_sprintf_event(cio_debug_crw_id, 2,
  2172.     "source is subchannel %04Xn", irq);
  2173. /*
  2174.  * If the device isn't known yet
  2175.  *   we can't lock it ...
  2176.  */
  2177. if ( ioinfo[irq] != INVALID_STORAGE_AREA )
  2178. {
  2179. s390irq_spin_lock( irq );
  2180. lock = 1;
  2181. dev_oper = ioinfo[irq]->ui.flags.oper;
  2182. if ( ioinfo[irq]->ui.flags.dval )
  2183. dev_no = ioinfo[irq]->devno;
  2184. is_owned = ioinfo[irq]->ui.flags.ready;
  2185. } /* endif */
  2186. #ifdef CONFIG_DEBUG_CRW
  2187. printk( KERN_DEBUG "do_crw_pending : subchannel validation - start ...n");
  2188. #endif
  2189. if (cio_debug_initialized)
  2190. debug_sprintf_event(cio_debug_crw_id, 4,
  2191.     "subchannel validation - startn");
  2192. s390_validate_subchannel( irq, is_owned );
  2193. if ( irq > highest_subchannel )
  2194. highest_subchannel = irq;
  2195. #ifdef CONFIG_DEBUG_CRW
  2196. printk( KERN_DEBUG "do_crw_pending : subchannel validation - donen");
  2197. #endif
  2198. if (cio_debug_initialized)
  2199. debug_sprintf_event(cio_debug_crw_id, 4,
  2200.     "subchannel validation - donen");
  2201. /*
  2202.  * After the validate processing
  2203.  *   the ioinfo control block
  2204.  *   should be allocated ...
  2205.  */
  2206. if ( lock )
  2207. {
  2208. s390irq_spin_unlock( irq );
  2209. } /* endif */
  2210. if ( ioinfo[irq] != INVALID_STORAGE_AREA )
  2211. {
  2212. #ifdef CONFIG_DEBUG_CRW
  2213. printk( KERN_DEBUG "do_crw_pending : ioinfo at "
  2214. #ifdef CONFIG_ARCH_S390X
  2215. "%08lXn",
  2216. (unsigned long)ioinfo[irq]);
  2217. #else /* CONFIG_ARCH_S390X */
  2218. "%08Xn",
  2219.         (unsigned)ioinfo[irq]);
  2220. #endif /* CONFIG_ARCH_S390X */
  2221. #endif
  2222. if (cio_debug_initialized)
  2223. debug_sprintf_event(cio_debug_crw_id, 4,
  2224.     "ioinfo at "
  2225. #ifdef CONFIG_ARCH_S390X
  2226.     "%08lXn",
  2227.     (unsigned long)ioinfo[irq]);
  2228. #else /* CONFIG_ARCH_S390X */
  2229.                             "%08Xn",
  2230.     (unsigned)ioinfo[irq]);
  2231. #endif /* CONFIG_ARCH_S390X */
  2232. } /* endif */
  2233. if ( ioinfo[irq] != INVALID_STORAGE_AREA )
  2234. {
  2235. if ( ioinfo[irq]->ui.flags.oper == 0 )
  2236. {
  2237.  not_oper_handler_func_t nopfunc=ioinfo[irq]->nopfunc;
  2238. #ifdef CONFIG_PROC_FS  
  2239.  /* remove procfs entry */
  2240.  if (cio_proc_devinfo)
  2241.  cio_procfs_device_remove(dev_no);
  2242. #endif
  2243. /*
  2244.  * If the device has gone
  2245.  *  call not oper handler        
  2246.  */       
  2247.  if (( dev_oper == 1 )
  2248.      && ( nopfunc != NULL))
  2249. {
  2250. free_irq( irq,ioinfo[irq]->irq_desc.dev_id );
  2251. nopfunc( irq,DEVSTAT_DEVICE_GONE );
  2252. } /* endif */
  2253. }
  2254. else
  2255. {
  2256. #ifdef CONFIG_DEBUG_CRW
  2257. printk( KERN_DEBUG "do_crw_pending : device "
  2258.         "recognition - start ...n");
  2259. #endif
  2260. if (cio_debug_initialized)
  2261. debug_sprintf_event(cio_debug_crw_id, 4,
  2262.     "device recognition - startn");
  2263. s390_device_recognition_irq( irq );
  2264. #ifdef CONFIG_DEBUG_CRW
  2265. printk( KERN_DEBUG "do_crw_pending : device "
  2266.         "recognition - donen");
  2267. #endif
  2268. if (cio_debug_initialized)
  2269. debug_sprintf_event(cio_debug_crw_id, 4,
  2270.     "device recognition - donen");
  2271. /*
  2272.  * the device became operational
  2273.  */
  2274. if ( dev_oper == 0 )
  2275. {
  2276. devreg_t *pdevreg;
  2277. pdevreg = s390_search_devreg( ioinfo[irq] );
  2278. if ( pdevreg != NULL )
  2279. {
  2280. if ( pdevreg->oper_func != NULL )
  2281. pdevreg->oper_func( irq, pdevreg );
  2282. } /* endif */
  2283. #ifdef CONFIG_PROC_FS
  2284. /* add new procfs entry */
  2285. if (cio_proc_devinfo) 
  2286. if (highest_subchannel < MAX_CIO_PROCFS_ENTRIES) {
  2287. cio_procfs_device_create(ioinfo[irq]->devno);
  2288. }
  2289. #endif
  2290. }
  2291. /*
  2292.  * ... it is and was operational, but
  2293.  *      the devno may have changed
  2294.  */
  2295. else if ((ioinfo[irq]->devno != dev_no) && ( ioinfo[irq]->nopfunc != NULL ))   
  2296. {
  2297. #ifdef CONFIG_PROC_FS
  2298. int devno_old = ioinfo[irq]->devno;
  2299. #endif
  2300. ioinfo[irq]->nopfunc( irq,
  2301.                       DEVSTAT_REVALIDATE );
  2302. #ifdef CONFIG_PROC_FS
  2303. /* remove old entry, add new */
  2304. if (cio_proc_devinfo) {
  2305. cio_procfs_device_remove(devno_old);
  2306. cio_procfs_device_create(ioinfo[irq]->devno);
  2307. }
  2308. #endif
  2309. } /* endif */
  2310. } /* endif */
  2311. #ifdef CONFIG_PROC_FS
  2312. /* get rid of dead procfs entries */
  2313. if (cio_proc_devinfo) 
  2314. cio_procfs_device_purge();
  2315. #endif
  2316. } /* endif */
  2317. break;
  2318. case CRW_RSC_MONITOR :
  2319. #ifdef CONFIG_DEBUG_CRW
  2320. printk( KERN_NOTICE "do_crw_pending : source is "
  2321.         "monitoring facilityn");
  2322. #endif
  2323. if (cio_debug_initialized)
  2324. debug_sprintf_event(cio_debug_crw_id, 2,
  2325.     "source is monitoring facilityn");
  2326. break;
  2327. case CRW_RSC_CPATH :   
  2328. chpid = pcrwe->crw.rsid;
  2329. #ifdef CONFIG_DEBUG_CRW
  2330. printk( KERN_NOTICE "do_crw_pending : source is "
  2331.         "channel path %02Xn", chpid);
  2332. #endif
  2333. if (cio_debug_initialized)
  2334. debug_sprintf_event(cio_debug_crw_id, 2,
  2335.     "source is channel path %02Xn");
  2336. break;
  2337. case CRW_RSC_CONFIG : 
  2338. #ifdef CONFIG_DEBUG_CRW
  2339. printk( KERN_NOTICE "do_crw_pending : source is "
  2340.         "configuration-alert facilityn");
  2341. #endif
  2342. if (cio_debug_initialized)
  2343. debug_sprintf_event(cio_debug_crw_id, 2,
  2344.     "source is configuration-alert facilityn");
  2345. break;
  2346. case CRW_RSC_CSS :
  2347. #ifdef CONFIG_DEBUG_CRW
  2348. printk( KERN_NOTICE "do_crw_pending : source is "
  2349.         "channel subsystemn");
  2350. #endif
  2351. if (cio_debug_initialized)
  2352. debug_sprintf_event(cio_debug_crw_id, 2,
  2353.     "source is channel subsystemn");
  2354. break;
  2355. default :
  2356. #ifdef CONFIG_DEBUG_CRW
  2357. printk( KERN_NOTICE "do_crw_pending : unknown sourcen");
  2358. #endif
  2359. if (cio_debug_initialized)
  2360. debug_sprintf_event(cio_debug_crw_id, 2,
  2361.     "unknown sourcen");
  2362. break;
  2363. } /* endswitch */
  2364. pcrwe = pcrwe->crwe_next;
  2365. } /* endwhile */
  2366. #ifdef CONFIG_DEBUG_CRW
  2367. printk( KERN_DEBUG "do_crw_pending : donen");
  2368. #endif
  2369. if (cio_debug_initialized)
  2370. debug_sprintf_event(cio_debug_crw_id, 2,
  2371.     "do_crw_pending: donen");
  2372.    return;
  2373. }
  2374. /* added by Holger Smolinski for reipl support in reipl.S */
  2375. extern void do_reipl (int);
  2376. void
  2377. reipl ( int sch )
  2378. {
  2379. int i;
  2380. s390_dev_info_t dev_info;
  2381. for ( i = 0; i <= highest_subchannel; i ++ ) 
  2382. {
  2383. if (    get_dev_info_by_irq( i, &dev_info ) == 0
  2384.                     && (dev_info.status & DEVSTAT_DEVICE_OWNED) )
  2385. {
  2386. free_irq ( i, ioinfo[i]->irq_desc.dev_id );
  2387. }
  2388. }
  2389. if (MACHINE_IS_VM)
  2390. cpcmd("IPL", NULL, 0);
  2391. else
  2392. do_reipl( 0x10000 | sch );
  2393. }
  2394. /*
  2395.  * Function: cio_debug_init
  2396.  * Initializes three debug logs (under /proc/s390dbf) for common I/O:
  2397.  * - cio_msg logs the messages which are printk'ed when CONFIG_DEBUG_IO is on
  2398.  * - cio_trace logs the calling of different functions
  2399.  * - cio_crw logs the messages which are printk'ed when CONFIG_DEBUG_CRW is on
  2400.  * debug levels depend on CONFIG_DEBUG_IO resp. CONFIG_DEBUG_CRW
  2401.  */
  2402. int cio_debug_init( void )
  2403. {
  2404. int ret = 0;
  2405. cio_debug_msg_id = debug_register("cio_msg",4,4,16*sizeof(long));
  2406. if (cio_debug_msg_id != NULL) {
  2407. debug_register_view(cio_debug_msg_id, &debug_sprintf_view);
  2408. #ifdef CONFIG_DEBUG_IO
  2409. debug_set_level(cio_debug_msg_id, 6);
  2410. #else /* CONFIG_DEBUG_IO */
  2411. debug_set_level(cio_debug_msg_id, 2);
  2412. #endif /* CONFIG_DEBUG_IO */
  2413. } else {
  2414. ret = -1;
  2415. }
  2416. cio_debug_trace_id = debug_register("cio_trace",4,4,8);
  2417. if (cio_debug_trace_id != NULL) {
  2418. debug_register_view(cio_debug_trace_id, &debug_hex_ascii_view);
  2419. #ifdef CONFIG_DEBUG_IO
  2420. debug_set_level(cio_debug_trace_id, 6);
  2421. #else /* CONFIG_DEBUG_IO */
  2422. debug_set_level(cio_debug_trace_id, 2);
  2423. #endif /* CONFIG_DEBUG_IO */
  2424. } else {
  2425. ret = -1;
  2426. }
  2427. cio_debug_crw_id = debug_register("cio_crw",2,4,16*sizeof(long));
  2428. if (cio_debug_crw_id != NULL) {
  2429. debug_register_view(cio_debug_crw_id, &debug_sprintf_view);
  2430. #ifdef CONFIG_DEBUG_CRW
  2431. debug_set_level(cio_debug_crw_id, 6);
  2432. #else /* CONFIG_DEBUG_CRW */
  2433. debug_set_level(cio_debug_crw_id, 2);
  2434. #endif /* CONFIG_DEBUG_CRW */
  2435. } else {
  2436. ret = -1;
  2437. }
  2438. if (ret)
  2439. return ret;
  2440. cio_debug_initialized = 1;
  2441. return 0;
  2442. }
  2443. __initcall(cio_debug_init);
  2444. #ifdef CONFIG_PROC_FS
  2445. /* 
  2446.  * Display info on subchannels in /proc/subchannels. 
  2447.  * Adapted from procfs stuff in dasd.c by Cornelia Huck, 02/28/01.      
  2448.  */
  2449. typedef struct {
  2450.      char *data;
  2451.      int len;
  2452. } tempinfo_t;
  2453. #define MIN(a,b) ((a)<(b)?(a):(b))
  2454. static struct proc_dir_entry *chan_subch_entry;
  2455. static int chan_subch_open( struct inode *inode, struct file *file)
  2456. {
  2457.      int rc = 0;
  2458.      int size = 1;
  2459.      int len = 0;
  2460.      int i = 0;
  2461.      int j = 0;
  2462.      tempinfo_t *info;
  2463.      
  2464.      info = (tempinfo_t *) vmalloc( sizeof (tempinfo_t));
  2465.      if (info == NULL) {
  2466.   printk( KERN_WARNING "No memory available for datan");
  2467.   return -ENOMEM;
  2468.      } else {
  2469.   file->private_data = ( void * ) info;
  2470.      }
  2471.      size += (highest_subchannel+1) * 128;
  2472.      info->data = (char *) vmalloc( size );
  2473.      
  2474.      if (size && info->data == NULL) {
  2475. printk (KERN_WARNING "No memory available for datan");
  2476. vfree (info);
  2477. return -ENOMEM;
  2478. }
  2479.      
  2480.      len += sprintf( info->data+len, 
  2481.      "Device sch.  Dev Type/Model CU  in use  PIM PAM POM LPUM CHPIDsn");
  2482.      len += sprintf( info->data+len, 
  2483.      "--------------------------------------------------------------------------n");
  2484.      for ( i=0; i <= highest_subchannel; i++) {
  2485.   if ( !((ioinfo[i] == NULL) || (ioinfo[i] == INVALID_STORAGE_AREA) || !(ioinfo[i]->ui.flags.oper)) ) {
  2486.        len += sprintf( info->data+len, 
  2487.        "%04X   %04X  ", 
  2488.        ioinfo[i]->schib.pmcw.dev, 
  2489.        i );
  2490.        if ( ioinfo[i]->senseid.dev_type != 0 ) {
  2491.     len += sprintf( info->data+len, 
  2492.     "%04X/%02X   %04X/%02X", 
  2493.     ioinfo[i]->senseid.dev_type,
  2494.     ioinfo[i]->senseid.dev_model, 
  2495.     ioinfo[i]->senseid.cu_type,
  2496.     ioinfo[i]->senseid.cu_model );
  2497.        } else {
  2498.     len += sprintf( info->data+len, 
  2499.     "          %04X/%02X", 
  2500.     ioinfo[i]->senseid.cu_type, 
  2501.     ioinfo[i]->senseid.cu_model );
  2502.        }
  2503.        if (ioinfo[i]->ui.flags.ready) {
  2504.     len += sprintf( info->data+len, "  yes " );
  2505.        } else {
  2506.     len += sprintf( info->data+len, "      " );
  2507.        }
  2508.        len += sprintf( info->data+len,
  2509.        "    %02X  %02X  %02X  %02X   ",
  2510.        ioinfo[i]->schib.pmcw.pim,
  2511.        ioinfo[i]->schib.pmcw.pam,
  2512.        ioinfo[i]->schib.pmcw.pom,
  2513.        ioinfo[i]->schib.pmcw.lpum );
  2514.        for ( j=0; j < 8; j++ ) {
  2515.     len += sprintf( info->data+len,
  2516.     "%02X",
  2517.     ioinfo[i]->schib.pmcw.chpid[j] );
  2518.     if (j==3) {
  2519.  len += sprintf( info->data+len, " " );
  2520.     }
  2521.        }
  2522.        len += sprintf( info->data+len, "n" );
  2523.   }
  2524.      }
  2525.      info->len = len;
  2526.      return rc;
  2527. }
  2528. static int chan_subch_close( struct inode *inode, struct file *file)
  2529. {
  2530.      int rc = 0;
  2531.      tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  2532.      if (p_info) {
  2533.   if (p_info->data)
  2534.        vfree( p_info->data );
  2535.   vfree( p_info );
  2536.      }
  2537.      
  2538.      return rc;
  2539. }
  2540. static ssize_t chan_subch_read( struct file *file, char *user_buf, size_t user_len, loff_t * offset)
  2541. {
  2542.      loff_t len;
  2543.      tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  2544.      
  2545.      if ( *offset>=p_info->len) {
  2546.   return 0;
  2547.      } else {
  2548.   len = MIN(user_len, (p_info->len - *offset));
  2549.   if (copy_to_user( user_buf, &(p_info->data[*offset]), len))
  2550.        return -EFAULT; 
  2551.   (* offset) += len;
  2552.   return len;
  2553.      }
  2554. }
  2555. static struct file_operations chan_subch_file_ops =
  2556. {
  2557.      read:chan_subch_read,
  2558.      open:chan_subch_open,
  2559.      release:chan_subch_close,
  2560. };
  2561. static int chan_proc_init( void )
  2562. {
  2563.      chan_subch_entry = create_proc_entry( "subchannels", S_IFREG|S_IRUGO, &proc_root);
  2564.      chan_subch_entry->proc_fops = &chan_subch_file_ops;
  2565.      return 1;
  2566. }
  2567. __initcall(chan_proc_init);
  2568. void chan_proc_cleanup( void )
  2569. {
  2570.      remove_proc_entry( "subchannels", &proc_root);
  2571. }
  2572. /* 
  2573.  * Display device specific information under /proc/deviceinfo/<devno>
  2574.  */
  2575. static struct proc_dir_entry *cio_procfs_deviceinfo_root = NULL;
  2576. /* 
  2577.  * cio_procfs_device_list holds all devno-specific procfs directories
  2578.  */
  2579. typedef struct {
  2580. int devno;
  2581. struct proc_dir_entry *cio_device_entry;
  2582. struct proc_dir_entry *cio_sensedata_entry;
  2583. struct proc_dir_entry *cio_in_use_entry;
  2584. struct proc_dir_entry *cio_chpid_entry;
  2585. } cio_procfs_entry_t;
  2586. typedef struct _cio_procfs_device{
  2587. struct _cio_procfs_device *next;
  2588. cio_procfs_entry_t *entry;
  2589. } cio_procfs_device_t;
  2590. cio_procfs_device_t *cio_procfs_device_list = NULL;
  2591. /*
  2592.  * File operations
  2593.  */
  2594. static int cio_device_entry_close( struct inode *inode, struct file *file)
  2595. {
  2596.      int rc = 0;
  2597.      tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  2598.      if (p_info) {
  2599.   if (p_info->data)
  2600.        vfree( p_info->data );
  2601.   vfree( p_info );
  2602.      }
  2603.      
  2604.      return rc;
  2605. }
  2606. static ssize_t cio_device_entry_read( struct file *file, char *user_buf, size_t user_len, loff_t * offset)
  2607. {
  2608.      loff_t len;
  2609.      tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  2610.      
  2611.      if ( *offset>=p_info->len) {
  2612.   return 0;
  2613.      } else {
  2614.   len = MIN(user_len, (p_info->len - *offset));
  2615.   if (copy_to_user( user_buf, &(p_info->data[*offset]), len))
  2616.        return -EFAULT; 
  2617.   (* offset) += len;
  2618.   return len;
  2619.      }
  2620. }
  2621. static int cio_sensedata_entry_open( struct inode *inode, struct file *file)
  2622. {
  2623. int rc = 0;
  2624. int size = 1;
  2625. int len = 0;
  2626. tempinfo_t *info;
  2627. int irq;
  2628. int devno;
  2629. char * devno_str;
  2630. info = (tempinfo_t *) vmalloc(sizeof(tempinfo_t));
  2631. if (info == NULL) {
  2632. printk( KERN_WARNING "No memory available for datan");
  2633. rc = -ENOMEM;
  2634. } else {
  2635. file->private_data = (void *) info;
  2636. size += 2 * 32;
  2637. info->data = (char *) vmalloc(size);
  2638. if (size && info->data == NULL) {
  2639. printk(KERN_WARNING "No memory available for datan");
  2640. vfree(info);
  2641. rc = -ENOMEM;
  2642. } else {
  2643. devno_str = kmalloc(6*sizeof(char), GFP_KERNEL);
  2644. memset(devno_str, 0, 6*sizeof(char));
  2645. memcpy(devno_str,file->f_dentry->d_parent->d_name.name, strlen(file->f_dentry->d_parent->d_name.name)+1);
  2646. devno = simple_strtoul(devno_str, &devno_str, 16);
  2647. irq = get_irq_by_devno(devno);
  2648. if (irq != -1) {
  2649. len += sprintf(info->data+len, "Dev Type/Mod: ");
  2650. if (ioinfo[irq]->senseid.dev_type == 0) {
  2651. len += sprintf(info->data+len, "%04X/%02Xn",
  2652.        ioinfo[irq]->senseid.cu_type,
  2653.        ioinfo[irq]->senseid.cu_model);
  2654. } else {
  2655. len += sprintf(info->data+len, "%04X/%02Xn",
  2656.        ioinfo[irq]->senseid.dev_type,
  2657.        ioinfo[irq]->senseid.dev_model);
  2658. len+= sprintf(info->data+len, "CU Type/Mod:  %04X/%02Xn",
  2659.       ioinfo[irq]->senseid.cu_type,
  2660.       ioinfo[irq]->senseid.cu_model);
  2661. }
  2662. }
  2663. info->len = len;
  2664. }
  2665. }
  2666. return rc;
  2667. }
  2668. static int cio_in_use_entry_open( struct inode *inode, struct file *file)
  2669. {
  2670. int rc = 0;
  2671. int size = 1;
  2672. int len = 0;
  2673. tempinfo_t *info;
  2674. int irq;
  2675. int devno;
  2676. char * devno_str;
  2677. info = (tempinfo_t *) vmalloc(sizeof(tempinfo_t));
  2678. if (info == NULL) {
  2679. printk( KERN_WARNING "No memory available for datan");
  2680. rc = -ENOMEM;
  2681. } else {
  2682. file->private_data = (void *) info;
  2683. size += 8;
  2684. info->data = (char *) vmalloc(size);
  2685. if (size && info->data == NULL) {
  2686. printk(KERN_WARNING "No memory available for datan");
  2687. vfree(info);
  2688. rc = -ENOMEM;
  2689. } else {
  2690. devno_str = kmalloc(6*sizeof(char), GFP_KERNEL);
  2691. memset(devno_str, 0, 6*sizeof(char));
  2692. memcpy(devno_str,file->f_dentry->d_parent->d_name.name, strlen(file->f_dentry->d_parent->d_name.name)+1);
  2693. devno = simple_strtoul(devno_str, &devno_str, 16);
  2694. irq = get_irq_by_devno(devno);
  2695. if (irq != -1) {
  2696. len += sprintf(info->data+len, "%sn", ioinfo[irq]->ui.flags.ready?"yes":"no");
  2697. }
  2698. info->len = len;
  2699. }
  2700. }
  2701. return rc;
  2702. }
  2703. static int cio_chpid_entry_open( struct inode *inode, struct file *file)
  2704. {
  2705. int rc = 0;
  2706. int size = 1;
  2707. int len = 0;
  2708. tempinfo_t *info;
  2709. int irq;
  2710. int devno;
  2711. int i;
  2712. char * devno_str;
  2713. info = (tempinfo_t *) vmalloc(sizeof(tempinfo_t));
  2714. if (info == NULL) {
  2715. printk( KERN_WARNING "No memory available for datan");
  2716. rc = -ENOMEM;
  2717. } else {
  2718. file->private_data = (void *) info;
  2719. size += 8*16;
  2720. info->data = (char *) vmalloc(size);
  2721. if (size && info->data == NULL) {
  2722. printk(KERN_WARNING "No memory available for datan");
  2723. vfree(info);
  2724. rc = -ENOMEM;
  2725. } else {
  2726. devno_str = kmalloc(6*sizeof(char), GFP_KERNEL);
  2727. memset(devno_str, 0, 6*sizeof(char));
  2728. memcpy(devno_str,file->f_dentry->d_parent->d_name.name, strlen(file->f_dentry->d_parent->d_name.name)+1);
  2729. devno = simple_strtoul(devno_str, &devno_str, 16);
  2730. irq = get_irq_by_devno(devno);
  2731. if (irq != -1) {
  2732. for (i=0; i<8; i++) {
  2733. len += sprintf(info->data+len, "CHPID[%d]: ", i);
  2734. len += sprintf(info->data+len, "%02Xn", ioinfo[irq]->schib.pmcw.chpid[i]);
  2735. }
  2736. }
  2737. info->len = len;
  2738. }
  2739. }
  2740. return rc;
  2741. }
  2742. static struct file_operations cio_sensedata_entry_file_ops =
  2743. {
  2744.      read:cio_device_entry_read,
  2745.      open:cio_sensedata_entry_open,
  2746.      release:cio_device_entry_close,
  2747. };
  2748. static struct file_operations cio_in_use_entry_file_ops =
  2749. {
  2750.      read:cio_device_entry_read,
  2751.      open:cio_in_use_entry_open,
  2752.      release:cio_device_entry_close,
  2753. };
  2754. static struct file_operations cio_chpid_entry_file_ops =
  2755. {
  2756.      read:cio_device_entry_read,
  2757.      open:cio_chpid_entry_open,
  2758.      release:cio_device_entry_close,
  2759. };
  2760. /*
  2761.  * Function: cio_procfs_device_create
  2762.  * create procfs entry for given device number
  2763.  * and insert it into list
  2764.  */
  2765. int cio_procfs_device_create(int devno)
  2766. {
  2767. cio_procfs_entry_t *entry;
  2768. cio_procfs_device_t *tmp;
  2769. cio_procfs_device_t *where;
  2770. char buf[8];
  2771. int i;
  2772. int rc = 0;
  2773. /* create the directory entry */
  2774. entry = (cio_procfs_entry_t *)kmalloc(sizeof(cio_procfs_entry_t), GFP_KERNEL);
  2775. if (entry) {
  2776. entry->devno = devno;
  2777. sprintf(buf, "%x", devno);
  2778. entry->cio_device_entry = proc_mkdir(buf, cio_procfs_deviceinfo_root);
  2779. if (entry->cio_device_entry) {
  2780. tmp = (cio_procfs_device_t *)kmalloc(sizeof(cio_procfs_device_t), GFP_KERNEL);
  2781. if (tmp) {
  2782. tmp->entry = entry;
  2783. if (cio_procfs_device_list == NULL) {
  2784. cio_procfs_device_list = tmp;
  2785. tmp->next = NULL;
  2786. } else {
  2787. where = cio_procfs_device_list;
  2788. i = where->entry->devno;
  2789. while ((devno>i) && (where->next != NULL)) {
  2790. where = where->next;
  2791. i = where->entry->devno;
  2792. }
  2793. if (where->next == NULL) {
  2794. where->next = tmp;
  2795. tmp->next = NULL;
  2796. } else {
  2797. tmp->next = where->next;
  2798. where->next = tmp;
  2799. }
  2800. }
  2801. /* create the different entries */
  2802. entry->cio_sensedata_entry = create_proc_entry( "sensedata", S_IFREG|S_IRUGO, entry->cio_device_entry);
  2803. entry->cio_sensedata_entry->proc_fops = &cio_sensedata_entry_file_ops;
  2804. entry->cio_in_use_entry = create_proc_entry( "in_use", S_IFREG|S_IRUGO, entry->cio_device_entry);
  2805. entry->cio_in_use_entry->proc_fops = &cio_in_use_entry_file_ops;
  2806. entry->cio_chpid_entry = create_proc_entry( "chpids", S_IFREG|S_IRUGO, entry->cio_device_entry);
  2807. entry->cio_chpid_entry->proc_fops = &cio_chpid_entry_file_ops;
  2808. } else {
  2809. printk( KERN_WARNING "Error, could not allocate procfs structure!n");
  2810. remove_proc_entry(buf, cio_procfs_deviceinfo_root);
  2811. kfree(entry);
  2812. rc = -ENOMEM;
  2813. }
  2814. } else {
  2815. printk( KERN_WARNING "Error, could not allocate procfs structure!n");
  2816. kfree(entry);
  2817. rc = -ENOMEM;
  2818. }
  2819. } else {
  2820. printk( KERN_WARNING "Error, could not allocate procfs structure!n");
  2821. rc = -ENOMEM;
  2822. }
  2823. return rc;
  2824. }
  2825. /*
  2826.  * Function: cio_procfs_device_remove
  2827.  * remove procfs entry for given device number
  2828.  */
  2829. int cio_procfs_device_remove(int devno)
  2830. {
  2831. int rc = 0;
  2832. cio_procfs_device_t *tmp;
  2833. cio_procfs_device_t *prev = NULL;
  2834. tmp=cio_procfs_device_list;
  2835. while (tmp) {
  2836. if (tmp->entry->devno == devno)
  2837. break;
  2838. prev = tmp;
  2839. tmp = tmp->next;
  2840. }
  2841. if (tmp) {
  2842. char buf[8];
  2843. remove_proc_entry("sensedata", tmp->entry->cio_device_entry);
  2844. remove_proc_entry("in_use", tmp->entry->cio_device_entry);
  2845. remove_proc_entry("chpid", tmp->entry->cio_device_entry);
  2846. sprintf(buf, "%x", devno);
  2847. remove_proc_entry(buf, cio_procfs_deviceinfo_root);
  2848. if (tmp == cio_procfs_device_list) {
  2849. cio_procfs_device_list = tmp->next;
  2850. } else {
  2851. prev->next = tmp->next;
  2852. }
  2853. kfree(tmp->entry);
  2854. kfree(tmp);
  2855. } else {
  2856. rc = -ENODEV;
  2857. }
  2858. return rc;
  2859. }
  2860. /*
  2861.  * Function: cio_procfs_purge
  2862.  * purge /proc/deviceinfo of entries for gone devices
  2863.  */
  2864. int cio_procfs_device_purge(void) 
  2865. {
  2866. int i;
  2867. for (i=0; i<=highest_subchannel; i++) {
  2868. if (ioinfo[i] != INVALID_STORAGE_AREA) {
  2869. if (!ioinfo[i]->ui.flags.oper) 
  2870. cio_procfs_device_remove(ioinfo[i]->devno);
  2871. }
  2872. }
  2873. return 0;
  2874. }
  2875. /*
  2876.  * Function: cio_procfs_create
  2877.  * create /proc/deviceinfo/ and subdirs for the devices
  2878.  */
  2879. static int cio_procfs_create( void )
  2880. {
  2881. int irq;
  2882. if (cio_proc_devinfo) {
  2883. cio_procfs_deviceinfo_root = proc_mkdir( "deviceinfo", &proc_root);
  2884. if (highest_subchannel >= MAX_CIO_PROCFS_ENTRIES) {
  2885. printk(KERN_ALERT "Warning: Not enough inodes for creating all entries under /proc/deviceinfo/. "
  2886.        "Not every device will get an entry.n");
  2887. }
  2888. for (irq=0; irq<=highest_subchannel; irq++) {
  2889. if (irq >= MAX_CIO_PROCFS_ENTRIES)
  2890. break;
  2891. if (ioinfo[irq] != INVALID_STORAGE_AREA) {
  2892. if (ioinfo[irq]->ui.flags.oper) 
  2893. if (cio_procfs_device_create(ioinfo[irq]->devno) == -ENOMEM) {
  2894. printk(KERN_CRIT "Out of memory while creating entries in /proc/deviceinfo/, "
  2895.        "not all devices might show upn");
  2896. break;
  2897. }
  2898. }
  2899. }
  2900. }
  2901. return 1;
  2902. }
  2903. __initcall(cio_procfs_create);
  2904. /*
  2905.  * Entry /proc/cio_ignore to display blacklisted ranges of devices.
  2906.  * un-ignore devices by piping to /proc/cio_ignore:
  2907.  * free all frees all blacklisted devices, free <range>,<range>,...
  2908.  * frees specified ranges of devnos
  2909.  * add <range>,<range>,... will add a range of devices to blacklist -
  2910.  * but only for devices not already known
  2911.  */
  2912. static struct proc_dir_entry *cio_ignore_proc_entry;
  2913. static int cio_ignore_proc_open(struct inode *inode, struct file *file)
  2914. {
  2915. int rc = 0;
  2916. int size = 1;
  2917. int len = 0;
  2918. tempinfo_t *info;
  2919. long flags;
  2920. int i, j;
  2921. info = (tempinfo_t *) vmalloc(sizeof(tempinfo_t));
  2922. if (info == NULL) {
  2923. printk( KERN_WARNING "No memory available for datan");
  2924. rc = -ENOMEM;
  2925. } else {
  2926. file->private_data = (void *) info;
  2927. size += nr_ignored * 6;
  2928. info->data = (char *) vmalloc(size);
  2929. if (size && info->data == NULL) {
  2930. printk( KERN_WARNING "No memory available for datan");
  2931. vfree (info);
  2932. rc = -ENOMEM;
  2933. } else {
  2934. spin_lock_irqsave( &blacklist_lock, flags ); 
  2935. for (i=0;i<=highest_ignored;i++) 
  2936. if (test_bit(i,&bl_dev)) {
  2937. len += sprintf(info->data+len, "%04x ", i);
  2938. for (j=i;(j<=highest_ignored) && (test_bit(j,&bl_dev));j++);
  2939. j--;
  2940. if (i != j) 
  2941. len += sprintf(info->data+len, "- %04x", j);
  2942. len += sprintf(info->data+len, "n");
  2943. i=j;
  2944. }
  2945. spin_unlock_irqrestore( &blacklist_lock, flags );
  2946. info->len = len;
  2947. }
  2948. }
  2949. return rc;
  2950. }
  2951. static int cio_ignore_proc_close(struct inode *inode, struct file *file)
  2952. {
  2953. int rc = 0;
  2954. tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  2955.      if (p_info) {
  2956.   if (p_info->data)
  2957.        vfree( p_info->data );
  2958.   vfree( p_info );
  2959.      }
  2960.      
  2961.      return rc;
  2962. }
  2963. static ssize_t cio_ignore_proc_read( struct file *file, char *user_buf, size_t user_len, loff_t * offset)
  2964. {
  2965.      loff_t len;
  2966.      tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  2967.      
  2968.      if ( *offset>=p_info->len) {
  2969.   return 0;
  2970.      } else {
  2971.   len = MIN(user_len, (p_info->len - *offset));
  2972.   if (copy_to_user( user_buf, &(p_info->data[*offset]), len))
  2973.        return -EFAULT; 
  2974.   (* offset) += len;
  2975.   return len;
  2976.      }
  2977. }
  2978. static ssize_t cio_ignore_proc_write (struct file *file, const char *user_buf,
  2979.       size_t user_len, loff_t * offset)
  2980. {
  2981. char *buffer = vmalloc (user_len);
  2982. if (buffer == NULL)
  2983. return -ENOMEM;
  2984. if (copy_from_user (buffer, user_buf, user_len)) {
  2985. vfree (buffer);
  2986. return -EFAULT;
  2987. }
  2988. buffer[user_len]='';
  2989. #ifdef CIO_DEBUG_IO
  2990. printk ( KERN_DEBUG "/proc/cio_ignore: '%s'n", buffer);
  2991. #endif /* CIO_DEBUG_IO */
  2992. if (cio_debug_initialized)
  2993. debug_sprintf_event(cio_debug_msg_id, 2, "/proc/cio_ignore: '%s'n",buffer);
  2994. blacklist_parse_proc_parameters(buffer);
  2995. return user_len;
  2996. }
  2997. static struct file_operations cio_ignore_proc_file_ops =
  2998. {
  2999. read:cio_ignore_proc_read,
  3000. open:cio_ignore_proc_open,
  3001. write:cio_ignore_proc_write,
  3002. release:cio_ignore_proc_close,
  3003. };
  3004. static int cio_ignore_proc_init(void)
  3005. {
  3006. cio_ignore_proc_entry = create_proc_entry("cio_ignore", S_IFREG|S_IRUGO|S_IWUSR, &proc_root);
  3007. cio_ignore_proc_entry->proc_fops = &cio_ignore_proc_file_ops;
  3008. return 1;
  3009. }
  3010. __initcall(cio_ignore_proc_init);
  3011. /*
  3012.  * Entry /proc/irq_count
  3013.  * display how many irqs have occured per cpu...
  3014.  */
  3015. static struct proc_dir_entry *cio_irq_proc_entry;
  3016. static int cio_irq_proc_open(struct inode *inode, struct file *file)
  3017. {
  3018. int rc = 0;
  3019. int size = 1;
  3020. int len = 0;
  3021. tempinfo_t *info;
  3022. int i;
  3023. info = (tempinfo_t *) vmalloc(sizeof(tempinfo_t));
  3024. if (info == NULL) {
  3025. printk( KERN_WARNING "No memory available for datan");
  3026. rc = -ENOMEM;
  3027. } else {
  3028. file->private_data = (void *) info;
  3029. size += NR_CPUS * 16;
  3030. info->data = (char *) vmalloc(size);
  3031. if (size && info->data == NULL) {
  3032. printk( KERN_WARNING "No memory available for datan");
  3033. vfree (info);
  3034. rc = -ENOMEM;
  3035. } else {
  3036. for (i=0; i< NR_CPUS; i++) {
  3037. if (s390_irq_count[i] != 0) 
  3038. len += sprintf(info->data+len, "%lxn", s390_irq_count[i]);
  3039. }
  3040. info->len = len;
  3041. }
  3042. }
  3043. return rc;
  3044. }
  3045. static int cio_irq_proc_close(struct inode *inode, struct file *file)
  3046. {
  3047. int rc = 0;
  3048. tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  3049. if (p_info) {
  3050. if (p_info->data) 
  3051. vfree(p_info->data);
  3052. vfree(p_info);
  3053. }
  3054. return rc;
  3055. }
  3056. static ssize_t cio_irq_proc_read( struct file *file, char *user_buf, size_t user_len, loff_t * offset)
  3057. {
  3058. loff_t len;
  3059. tempinfo_t *p_info = (tempinfo_t *) file->private_data;
  3060. if ( *offset>=p_info->len) {
  3061. return 0;
  3062. } else {
  3063. len = MIN(user_len, (p_info->len - *offset));
  3064. if (copy_to_user( user_buf, &(p_info->data[*offset]), len))
  3065. return -EFAULT; 
  3066. (* offset) += len;
  3067. return len;
  3068. }
  3069. }
  3070. static struct file_operations cio_irq_proc_file_ops = 
  3071. {
  3072. read:    cio_irq_proc_read,
  3073. open:    cio_irq_proc_open,
  3074. release: cio_irq_proc_close,
  3075. };
  3076. static int cio_irq_proc_init(void)
  3077. {
  3078. int i;
  3079. if (cio_count_irqs) {
  3080. for (i=0; i<NR_CPUS; i++) 
  3081. s390_irq_count[i]=0;
  3082. cio_irq_proc_entry = create_proc_entry("irq_count", S_IFREG|S_IRUGO, &proc_root);
  3083. cio_irq_proc_entry->proc_fops = &cio_irq_proc_file_ops;
  3084. }
  3085. return 1;
  3086. }
  3087. __initcall(cio_irq_proc_init);
  3088. /* end of procfs stuff */
  3089. #endif
  3090. schib_t *s390_get_schib( int irq )
  3091. {
  3092. if ( (irq > highest_subchannel) || (irq < 0) )
  3093. return NULL;
  3094. if ( ioinfo[irq] == INVALID_STORAGE_AREA )
  3095. return NULL;
  3096. return &ioinfo[irq]->schib;
  3097. }
  3098. EXPORT_SYMBOL(halt_IO);
  3099. EXPORT_SYMBOL(clear_IO);
  3100. EXPORT_SYMBOL(do_IO);
  3101. EXPORT_SYMBOL(resume_IO);
  3102. EXPORT_SYMBOL(ioinfo);
  3103. EXPORT_SYMBOL(get_dev_info_by_irq);
  3104. EXPORT_SYMBOL(get_dev_info_by_devno);
  3105. EXPORT_SYMBOL(get_irq_by_devno);
  3106. EXPORT_SYMBOL(get_devno_by_irq);
  3107. EXPORT_SYMBOL(get_irq_first);
  3108. EXPORT_SYMBOL(get_irq_next);
  3109. EXPORT_SYMBOL(read_conf_data);
  3110. EXPORT_SYMBOL(read_dev_chars);
  3111. EXPORT_SYMBOL(s390_request_irq_special);
  3112. EXPORT_SYMBOL(s390_get_schib);
  3113. EXPORT_SYMBOL(s390_register_adapter_interrupt);
  3114. EXPORT_SYMBOL(s390_unregister_adapter_interrupt);