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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  drivers/s390/s390io.c
  3.  *   S/390 common I/O routines
  4.  *
  5.  *  S390 version
  6.  *    Copyright (C) 1999, 2000 IBM Deutschland Entwicklung GmbH,
  7.  *                             IBM Corporation
  8.  *    Author(s): Ingo Adlung (adlung@de.ibm.com)
  9.  *               Cornelia Huck (cohuck@de.ibm.com) 
  10.  *    ChangeLog: 01/07/2001 Blacklist cleanup (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  11.  *               01/04/2001 Holger Smolinski (smolinsk@de.ibm.com)
  12.  *                          Fixed lost interrupts and do_adapter_IO
  13.  *               xx/xx/xxxx nnn          multiple changes not reflected
  14.  *               03/12/2001 Ingo Adlung  blacklist= - changed to cio_ignore=  
  15.  *               03/14/2001 Ingo Adlung  disable interrupts before start_IO
  16.  *                                        in Path Group processing 
  17.  *                                       decrease retry2 on busy while 
  18.  *                                        disabling sync_isc; reset isc_cnt
  19.  *                                        on io error during sync_isc enablement
  20.  *               05/09/2001 Cornelia Huck added exploitation of debug feature
  21.  *               05/16/2001 Cornelia Huck added /proc/deviceinfo/<devno>/
  22.  *               05/22/2001 Cornelia Huck added /proc/cio_ignore
  23.  *                                        un-ignore blacklisted devices by piping 
  24.  *                                        to /proc/cio_ignore
  25.  *               xx/xx/xxxx some bugfixes & cleanups
  26.  *               08/02/2001 Cornelia Huck not already known devices can be blacklisted
  27.  *                                        by piping to /proc/cio_ignore
  28.  *               09/xx/2001 couple more fixes
  29.  *               10/29/2001 Cornelia Huck Blacklisting reworked again
  30.  *               10/29/2001 Cornelia Huck improved utilization of debug feature
  31.  */
  32. #include <linux/module.h>
  33. #include <linux/config.h>
  34. #include <linux/errno.h>
  35. #include <linux/kernel_stat.h>
  36. #include <linux/signal.h>
  37. #include <linux/sched.h>
  38. #include <linux/interrupt.h>
  39. #include <linux/slab.h>
  40. #include <linux/string.h>
  41. #include <linux/smp.h>
  42. #include <linux/threads.h>
  43. #include <linux/smp_lock.h>
  44. #include <linux/init.h>
  45. #include <linux/bootmem.h>
  46. #ifdef CONFIG_PROC_FS
  47. #include <linux/proc_fs.h>
  48. #endif 
  49. #include <asm/system.h>
  50. #include <asm/io.h>
  51. #include <asm/irq.h>
  52. #include <asm/bitops.h>
  53. #include <asm/smp.h>
  54. #include <asm/pgtable.h>
  55. #include <asm/delay.h>
  56. #include <asm/processor.h>
  57. #include <asm/lowcore.h>
  58. #include <asm/idals.h>
  59. #include <asm/uaccess.h> 
  60. #include <asm/cpcmd.h>
  61. #include <asm/s390io.h>
  62. #include <asm/s390dyn.h>
  63. #include <asm/s390mach.h>
  64. #include <asm/debug.h>
  65. #include <asm/queue.h>
  66. #ifndef TRUE
  67. #define TRUE  1
  68. #define FALSE 0
  69. #endif
  70. #define SANITY_CHECK(irq) do { 
  71. if (irq > highest_subchannel || irq < 0) 
  72. return (-ENODEV); 
  73. if (ioinfo[irq] == INVALID_STORAGE_AREA) 
  74. return (-ENODEV); 
  75. } while(0) 
  76. #undef  CONFIG_DEBUG_IO
  77. #define CONFIG_DEBUG_CRW
  78. unsigned int           highest_subchannel;
  79. ioinfo_t              *ioinfo_head = NULL;
  80. ioinfo_t              *ioinfo_tail = NULL;
  81. ioinfo_t              *ioinfo[__MAX_SUBCHANNELS] = {
  82. [0 ... (__MAX_SUBCHANNELS-1)] = INVALID_STORAGE_AREA
  83. };
  84. static atomic_t    sync_isc     = ATOMIC_INIT(-1);
  85. static int         sync_isc_cnt = 0;      // synchronous irq processing lock
  86. static spinlock_t  adapter_lock = SPIN_LOCK_UNLOCKED;
  87.                                           // adapter interrupt lock
  88. static psw_t      io_sync_wait;           // wait PSW for sync IO, prot. by sync_isc
  89. static int        cons_dev          = -1; // identify console device
  90. static int        init_IRQ_complete = 0;
  91. static int        cio_show_msg      = 0;
  92. static schib_t   *p_init_schib      = NULL;
  93. static irb_t     *p_init_irb        = NULL;
  94. static __u64      irq_IPL_TOD;
  95. static adapter_int_handler_t adapter_handler   = NULL;
  96. /* for use of debug feature */
  97. debug_info_t *cio_debug_msg_id = NULL;  
  98. debug_info_t *cio_debug_trace_id = NULL;
  99. debug_info_t *cio_debug_crw_id = NULL;
  100. int cio_debug_initialized = 0;
  101. static void init_IRQ_handler( int irq, void *dev_id, struct pt_regs *regs);
  102. static void s390_process_subchannels( void);
  103. static void s390_device_recognition_all( void);
  104. static void s390_device_recognition_irq( int irq);
  105. #ifdef CONFIG_PROC_FS
  106. static void s390_redo_validation(void);
  107. #endif
  108. static int  s390_validate_subchannel( int irq, int enable);
  109. static int  s390_SenseID( int irq, senseid_t *sid, __u8 lpm);
  110. static int  s390_SetPGID( int irq, __u8 lpm, pgid_t *pgid);
  111. static int  s390_SensePGID( int irq, __u8 lpm, pgid_t *pgid);
  112. static int  s390_process_IRQ( unsigned int irq );
  113. static int  enable_subchannel( unsigned int irq);
  114. static int  disable_subchannel( unsigned int irq);
  115. #ifdef CONFIG_PROC_FS
  116. static int chan_proc_init( void );
  117. #endif 
  118. static inline void do_adapter_IO( __u32 intparm );
  119. int  s390_DevicePathVerification( int irq, __u8 domask );
  120. int  s390_register_adapter_interrupt( adapter_int_handler_t handler );
  121. int  s390_unregister_adapter_interrupt( adapter_int_handler_t handler );
  122. extern int  do_none(unsigned int irq, int cpu, struct pt_regs * regs);
  123. extern int  enable_none(unsigned int irq);
  124. extern int  disable_none(unsigned int irq);
  125. asmlinkage void do_IRQ( struct pt_regs regs );
  126. #ifdef CONFIG_PROC_FS
  127. #define MAX_CIO_PROCFS_ENTRIES 0x300
  128. /* magic number; we want to have some room to spare */
  129. int cio_procfs_device_create(int devno);
  130. int cio_procfs_device_remove(int devno);
  131. int cio_procfs_device_purge(void);
  132. #endif
  133. int cio_notoper_msg = 1;
  134. #ifdef CONFIG_PROC_FS
  135. int cio_proc_devinfo = 0; /* switch off the /proc/deviceinfo/ stuff by default
  136.      until problems are dealt with */
  137. #endif
  138. unsigned long s390_irq_count[NR_CPUS]; /* trace how many irqs have occured per cpu... */
  139. int cio_count_irqs = 1;       /* toggle use here... */
  140. /* 
  141.  * "Blacklisting" of certain devices:
  142.  * Device numbers given in the commandline as cio_ignore=... won't be known to Linux
  143.  * These can be single devices or ranges of devices
  144.  *
  145.  * 10/23/01 reworked to get rid of lists
  146.  */
  147. static unsigned long bl_dev[2048] = {0,};
  148.     
  149. static spinlock_t blacklist_lock = SPIN_LOCK_UNLOCKED;
  150. static int highest_ignored = 0;
  151. static int nr_ignored = 0;
  152. /* 
  153.  * Function: blacklist_range_add
  154.  * Blacklist the devices from-to
  155.  */
  156. static inline void blacklist_range_add( int from, int to,int locked)
  157. {
  158.  
  159.      unsigned long flags;
  160.      int i;
  161.      if (to && (from>to)) {
  162.      printk(KERN_WARNING "Invalid blacklist range %x to %x, skippingn", from, to);
  163.      return;
  164.      }
  165.      if(!locked)
  166.      spin_lock_irqsave( &blacklist_lock, flags );
  167.      if (!to) 
  168.      to = from;
  169.      for (i=from;i<=to;i++) {
  170.      set_bit(i,&bl_dev);
  171.      nr_ignored++;
  172.      }
  173.      if (to>=highest_ignored)
  174.      highest_ignored = to;
  175.      if(!locked)
  176.      spin_unlock_irqrestore( &blacklist_lock, flags );
  177. }
  178. /* 
  179.  * Function: blacklist_range_remove
  180.  * Removes a range from the blacklist chain
  181.  */
  182. static inline void blacklist_range_remove( int from, int to )
  183. {
  184.      long flags;
  185. int i;
  186.      spin_lock_irqsave( &blacklist_lock, flags );
  187.      
  188. for (i=from;i<=to;i++) {
  189. clear_bit(i,&bl_dev);
  190. nr_ignored--;
  191. }
  192. if (to == highest_ignored) 
  193. for (highest_ignored=from;(highest_ignored>0) && (!test_bit(highest_ignored,&bl_dev));highest_ignored--);
  194.      spin_unlock_irqrestore( &blacklist_lock, flags );
  195. }
  196. /* Parsing the commandline for blacklist parameters */
  197. /* 
  198.  * Variable to hold the blacklisted devices given by the parameter line
  199.  * cio_ignore=...
  200.  */
  201. char *blacklist[256] = {NULL, };
  202. /*
  203.  * Get the cio_ignore=... items from the parameter line
  204.  */
  205. static void blacklist_split_parm_string (char *str)
  206. {
  207. char *tmp = str;
  208. int count = 0;
  209. do {
  210. char *end;
  211. int len;
  212. end = strchr (tmp, ',');
  213. if (end == NULL) {
  214. len = strlen (tmp) + 1;
  215. } else {
  216. len = (long) end - (long) tmp + 1;
  217. *end = '';
  218. end++;
  219. }
  220. blacklist[count] = alloc_bootmem (len * sizeof (char) );
  221. if (blacklist == NULL) {
  222. printk (KERN_WARNING "can't store cio_ignore= parameter no %dn", count + 1);
  223. break;
  224. }
  225. memset (blacklist[count], 0, len * sizeof (char));
  226. memcpy (blacklist[count], tmp, len * sizeof (char));
  227. count++;
  228. tmp = end;
  229. } while (tmp != NULL && *tmp != '');
  230. }
  231. /*
  232.  * The blacklist parameters as one concatenated string
  233.  */
  234. static char blacklist_parm_string[1024] __initdata = {0,};
  235. /* 
  236.  * function: blacklist_strtoul
  237.  * Strip leading '0x' and interpret the values as Hex
  238.  */
  239. static inline int blacklist_strtoul (char *str, char **stra)
  240. {
  241. char *temp = str;
  242. int val;
  243. if (*temp == '0') {
  244. temp++;                 /* strip leading zero */
  245. if (*temp == 'x')
  246. temp++;                 /* strip leading x */
  247. }
  248. val = simple_strtoul (temp, &temp, 16); /* interpret anything as hex */
  249. *stra = temp;
  250. return val;
  251. }
  252. /*
  253.  * Function: blacklist_parse
  254.  * Parse the parameters given to cio_ignore=... 
  255.  * Add the blacklisted devices to the blacklist chain
  256.  */
  257. static inline void blacklist_parse( char **str )
  258. {
  259.      char *temp;
  260.      int from, to;
  261.      while (*str) {
  262.   temp = *str;
  263.   from = 0;
  264.   to = 0;
  265.   
  266.   from = blacklist_strtoul( temp, &temp );
  267.   if (*temp == '-') {
  268.        temp++;
  269.        to = blacklist_strtoul( temp, &temp );
  270.   }
  271.   blacklist_range_add( from, to, 0 );
  272. #ifdef CONFIG_DEBUG_IO
  273.   printk( KERN_INFO "Blacklisted range from %X to %Xn", from, to );
  274. #endif
  275.   str++;
  276.      }
  277. }
  278. /*
  279.  * Initialisation of blacklist 
  280.  */
  281. void __init blacklist_init( void )
  282. {
  283. #ifdef CONFIG_DEBUG_IO     
  284.      printk( KERN_DEBUG "Reading blacklist...n");
  285. #endif
  286.      if (cio_debug_initialized)
  287.      debug_sprintf_event(cio_debug_msg_id, 6,
  288.  "Reading blacklistn");
  289.      blacklist_split_parm_string( blacklist_parm_string );
  290.      blacklist_parse( blacklist );
  291. }
  292. /*
  293.  * Get all the blacklist parameters from parameter line
  294.  */
  295. void __init blacklist_setup (char *str, int *ints)
  296. {
  297. int len = strlen (blacklist_parm_string);
  298. if (len != 0) {
  299. strcat (blacklist_parm_string, ",");
  300. }
  301. strcat (blacklist_parm_string, str);
  302. }
  303. int __init blacklist_call_setup (char *str)
  304. {
  305.         int dummy;
  306. #ifdef CONFIG_DEBUG_IO
  307. printk( KERN_DEBUG "Reading blacklist parameters...n" );
  308. #endif
  309. if (cio_debug_initialized)
  310. debug_sprintf_event(cio_debug_msg_id, 6,
  311.     "Reading blacklist parametersn");
  312.         blacklist_setup(str,&dummy);
  313. blacklist_init(); /* Blacklist ranges must be ready when device recognition starts */
  314.        
  315. return 1;
  316. }
  317. __setup ("cio_ignore=", blacklist_call_setup);
  318. /* Checking if devices are blacklisted */
  319. /*
  320.  * Function: is_blacklisted
  321.  * Returns 1 if the given devicenumber can be found in the blacklist, otherwise 0.
  322.  */
  323. static inline int is_blacklisted( int devno )
  324. {
  325.      long flags;
  326.      int retval=0;
  327.      spin_lock_irqsave( &blacklist_lock, flags ); 
  328.      if (test_bit(devno,&bl_dev)) 
  329.      retval=1;
  330.      spin_unlock_irqrestore( &blacklist_lock, flags );
  331.      return retval;
  332. }
  333. /*
  334.  * Function: blacklist_free_all_ranges
  335.  * set all blacklisted devices free...
  336.  */
  337. void blacklist_free_all_ranges(void) 
  338. {
  339. unsigned long flags;
  340. int i;
  341. spin_lock_irqsave( &blacklist_lock, flags ); 
  342. for (i=0;i<=highest_ignored;i++)
  343. clear_bit(i,&bl_dev);
  344. highest_ignored = 0;
  345. nr_ignored = 0;
  346. spin_unlock_irqrestore( &blacklist_lock, flags );
  347. }
  348. #ifdef CONFIG_PROC_FS
  349. /*
  350.  * Function: blacklist_parse_proc_parameters
  351.  * parse the stuff which is piped to /proc/cio_ignore
  352.  */
  353. void blacklist_parse_proc_parameters(char *buf)
  354. {
  355. char *tmp;
  356. int i;
  357. char *end;
  358. int len = -1;
  359. char *param;
  360. int from = 0;
  361. int to = 0;
  362. long flags;
  363. int err = 0;
  364. tmp = buf;
  365. if (strstr(tmp, "free ")) {
  366. for (i=0; i<5; i++) {
  367. tmp++;
  368. }
  369. if (strstr(tmp, "all")) {
  370. blacklist_free_all_ranges();
  371. s390_redo_validation();
  372. } else {
  373. while (tmp != NULL) {
  374. end = strchr(tmp, ',');
  375. if (end == NULL) {
  376. len = strlen(tmp) + 1;
  377. } else {
  378. len = (long)end - (long) tmp + 1;
  379. *end = '';
  380. end++;
  381. }
  382. param =  (char*) kmalloc(len * sizeof(char) + 1, GFP_KERNEL);
  383. strncpy(param, (const char *) tmp, len);
  384. tmp = end;
  385. from = blacklist_strtoul(param, &param);
  386. if (*param == '-') {
  387. param++;
  388. to = blacklist_strtoul(param, &param);
  389. } else {
  390. to = from;
  391. }
  392. blacklist_range_remove( from, to );
  393. kfree(param);
  394. }
  395. s390_redo_validation();
  396. }
  397. } else if (strstr(tmp, "add ")) {
  398. for (i=0;i<4;i++){
  399. tmp++;
  400. }
  401. while (tmp != NULL) {
  402. end = strchr(tmp, ',');
  403. if (end == NULL) {
  404. len = strlen(tmp) + 1;
  405. } else {
  406. len = (long)end - (long) tmp + 1;
  407. *end = '';
  408. end++;
  409. }
  410. param =  (char*) kmalloc(len * sizeof(char) + 1, GFP_KERNEL);
  411. strncpy(param, (const char *) tmp, len);
  412. tmp = end;
  413. from = blacklist_strtoul(param, &param);
  414. if (*param == '-') {
  415. param++;
  416. to = blacklist_strtoul(param, &param);
  417. } else {
  418. to = from;
  419. }
  420. spin_lock_irqsave( &blacklist_lock, flags ); 
  421. /*
  422.  * Don't allow for already known devices to be
  423.  * blacklisted
  424.  * The criterion is a bit dumb, devices which once were
  425.  * there but are already gone are also caught...
  426.  */
  427. err = 0;
  428. for (i=0; i<=highest_subchannel; i++) {
  429. if (ioinfo[i]!=INVALID_STORAGE_AREA) {
  430. if (   (ioinfo[i]->schib.pmcw.dev >= from)
  431.     && (ioinfo[i]->schib.pmcw.dev <= to)  ) {
  432. printk(KERN_WARNING "cio_ignore: Won't blacklist "
  433.        "already known devices, skipping range "
  434.        "%x to %xn", from, to);
  435. err = 1;
  436. break;
  437. }
  438. }
  439. }
  440. if (!err) 
  441. blacklist_range_add(from, to, 1);
  442. spin_unlock_irqrestore( &blacklist_lock, flags );
  443. kfree(param);
  444. }
  445. } else {
  446. printk( KERN_WARNING "cio_ignore: Parse error; try using 'free all|<devno-range>,<devno-range>,...'n");
  447. printk( KERN_WARNING "or 'add <devno-range>,<devno-range>,...'n");
  448. }
  449. }
  450. #endif
  451. /* End of blacklist handling */
  452. void s390_displayhex(char *str,void *ptr,s32 cnt);
  453. void s390_displayhex2(char *str, void *ptr, s32 cnt, int level);
  454. void s390_displayhex(char *str,void *ptr,s32 cnt)
  455. {
  456. s32 cnt1,cnt2,maxcnt2;
  457. u32 *currptr=(__u32 *)ptr;
  458. printk("n%sn",str);
  459. for(cnt1=0;cnt1<cnt;cnt1+=16)
  460. {
  461. printk("%08lX ",(unsigned long)currptr);
  462. maxcnt2=cnt-cnt1;
  463. if(maxcnt2>16)
  464. maxcnt2=16;
  465. for(cnt2=0;cnt2<maxcnt2;cnt2+=4)
  466. printk("%08X ",*currptr++);
  467. printk("n");
  468. }
  469. }
  470. void s390_displayhex2(char *str, void *ptr, s32 cnt, int level)
  471. {
  472. s32 cnt1, cnt2, maxcnt2;
  473. u32 *currptr = (__u32 *)ptr;
  474. char buffer[cnt*12];
  475. debug_sprintf_event(cio_debug_msg_id, level, "%sn", str);
  476. for (cnt1 = 0; cnt1<cnt; cnt1+=16) {
  477. sprintf(buffer, "%08lX ", (unsigned long)currptr);
  478. maxcnt2 = cnt - cnt1;
  479. if (maxcnt2 > 16)
  480. maxcnt2 = 16;
  481. for (cnt2 = 0; cnt2 < maxcnt2; cnt2 += 4)
  482. sprintf(buffer, "%08X ", *currptr++);
  483. }
  484. debug_sprintf_event(cio_debug_msg_id, level, "%sn",buffer);
  485. }
  486. static int __init cio_setup( char *parm )
  487. {
  488. if ( !strcmp( parm, "yes") )
  489. {
  490. cio_show_msg = 1;
  491. }
  492. else if ( !strcmp( parm, "no") )
  493. {
  494. cio_show_msg = 0;
  495. }
  496. else
  497. {
  498. printk( KERN_ERR "cio_setup : invalid cio_msg parameter '%s'", parm);
  499. } /* endif */
  500. return 1;
  501. }
  502. __setup("cio_msg=", cio_setup);
  503. static int __init cio_notoper_setup(char *parm)
  504. {
  505. if (!strcmp(parm, "yes")) {
  506. cio_notoper_msg = 1;
  507. } else if (!strcmp(parm, "no")) {
  508. cio_notoper_msg = 0;
  509. } else {
  510. printk( KERN_ERR "cio_notoper_setup: invalid cio_notoper_msg parameter '%s'", parm);
  511. }
  512. return 1;
  513. }
  514. __setup("cio_notoper_msg=", cio_notoper_setup);
  515. #ifdef CONFIG_PROC_FS
  516. static int __init cio_proc_devinfo_setup(char *parm)
  517. {
  518. if (!strcmp(parm, "yes")) {
  519. cio_proc_devinfo = 1;
  520. } else if (!strcmp(parm, "no")) {
  521. cio_proc_devinfo = 0;
  522. } else {
  523. printk( KERN_ERR "cio_proc_devinfo_setup: invalid parameter '%s'n",parm);
  524. }
  525. return 1;
  526. }
  527. __setup("cio_proc_devinfo=", cio_proc_devinfo_setup);
  528. #endif
  529. /*
  530.  * register for adapter interrupts
  531.  *
  532.  * With HiperSockets the zSeries architecture provides for
  533.  *  means of adapter interrups, pseudo I/O interrupts that are
  534.  *  not tied to an I/O subchannel, but to an adapter. However,
  535.  *  it doesn't disclose the info how to enable/disable them, but
  536.  *  to recognize them only. Perhaps we should consider them
  537.  *  being shared interrupts, and thus build a linked list
  538.  *  of adapter handlers ... to be evaluated ...
  539.  */
  540. int  s390_register_adapter_interrupt( adapter_int_handler_t handler )
  541. {
  542. int ret = 0;
  543. char dbf_txt[15];
  544. if (cio_debug_initialized)
  545. debug_text_event(cio_debug_trace_id, 4, "rgaint");
  546. spin_lock( &adapter_lock );
  547. if ( handler == NULL )
  548. ret = -EINVAL;
  549. else if ( adapter_handler )
  550. ret = -EBUSY;
  551. else
  552. adapter_handler = handler;
  553.   
  554. spin_unlock( &adapter_lock ); 
  555. if (cio_debug_initialized) {
  556. sprintf(dbf_txt,"ret:%d",ret);
  557. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  558. }
  559. return( ret);
  560. }
  561. int  s390_unregister_adapter_interrupt( adapter_int_handler_t handler )
  562. {
  563. int ret = 0;
  564. char dbf_txt[15];
  565. if (cio_debug_initialized)
  566. debug_text_event(cio_debug_trace_id, 4, "urgaint");
  567. spin_lock( &adapter_lock ); 
  568. if ( handler == NULL )
  569. ret = -EINVAL;
  570. else if ( handler != adapter_handler )
  571. ret = -EINVAL;
  572. else
  573. adapter_handler = NULL;
  574.   
  575. spin_unlock( &adapter_lock ); 
  576. if (cio_debug_initialized) {
  577. sprintf(dbf_txt,"ret:%d",ret);
  578. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  579. }
  580. return( ret);
  581. }
  582. static inline void do_adapter_IO( __u32 intparm )
  583. {
  584. if (cio_debug_initialized)
  585. debug_text_event(cio_debug_trace_id, 4, "doaio");
  586. spin_lock( &adapter_lock ); 
  587. if ( adapter_handler )
  588. (*adapter_handler)( intparm );
  589. spin_unlock( &adapter_lock );
  590. return;  
  591. }
  592. /*
  593.  * Note : internal use of irqflags SA_PROBE for NOT path grouping 
  594.  *
  595.  */
  596. int s390_request_irq_special( int                      irq,
  597.                               io_handler_func_t        io_handler,
  598.                               not_oper_handler_func_t  not_oper_handler,
  599.                               unsigned long            irqflags,
  600.                               const char              *devname,
  601.                               void                    *dev_id)
  602. {
  603. int retval = 0;
  604. unsigned long flags;
  605. char            dbf_txt[15];
  606. int             retry;
  607. if (irq >= __MAX_SUBCHANNELS)
  608. return -EINVAL;
  609. if ( !io_handler || !dev_id )
  610. return -EINVAL;
  611. if ( ioinfo[irq] == INVALID_STORAGE_AREA )
  612. return -ENODEV;
  613. if (cio_debug_initialized) {
  614. sprintf(dbf_txt, "reqsp%x", irq);
  615. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  616. }
  617. /*
  618.  * The following block of code has to be executed atomically
  619.  */
  620. s390irq_spin_lock_irqsave( irq, flags);
  621. if ( !ioinfo[irq]->ui.flags.ready )
  622. {
  623. retry = 5;
  624. ioinfo[irq]->irq_desc.handler = io_handler;
  625. ioinfo[irq]->irq_desc.name    = devname;
  626. ioinfo[irq]->irq_desc.dev_id  = dev_id;
  627. ioinfo[irq]->ui.flags.ready   = 1;
  628. do {
  629. retval = enable_subchannel(irq);
  630. if (retval) {
  631. ioinfo[irq]->ui.flags.ready = 0;
  632. break;
  633. }
  634. stsch(irq,&ioinfo[irq]->schib);
  635. if (ioinfo[irq]->schib.pmcw.ena) 
  636. retry = 0;
  637. else
  638. retry--;
  639. } while (retry);
  640. }
  641. else
  642. {
  643. /*
  644.  *  interrupt already owned, and shared interrupts
  645.  *   aren't supported on S/390.
  646.  */
  647. retval = -EBUSY;
  648. } /* endif */
  649. s390irq_spin_unlock_irqrestore(irq,flags);
  650. if ( retval == 0 )
  651. {
  652. if ( !(irqflags & SA_PROBE))
  653. s390_DevicePathVerification( irq, 0 );
  654. ioinfo[irq]->ui.flags.newreq = 1;
  655. ioinfo[irq]->nopfunc         = not_oper_handler;  
  656. }
  657. if (cio_debug_initialized)
  658. debug_int_event(cio_debug_trace_id, 4, retval);
  659. return retval;
  660. }
  661. int s390_request_irq( unsigned int   irq,
  662.                       void           (*handler)(int, void *, struct pt_regs *),
  663.                       unsigned long  irqflags,
  664.                       const char    *devname,
  665.                       void          *dev_id)
  666. {
  667. int ret;
  668. ret = s390_request_irq_special( irq,
  669.                                    (io_handler_func_t)handler,
  670.                                    NULL,
  671.                                    irqflags,
  672.                                    devname,
  673.                                    dev_id);
  674. if ( ret == 0 )
  675. {
  676. ioinfo[irq]->ui.flags.newreq = 0;
  677. } /* endif */
  678. return( ret);
  679. }
  680. void s390_free_irq(unsigned int irq, void *dev_id)
  681. {
  682. unsigned long flags;
  683. int          ret;
  684. char dbf_txt[15];
  685. if ( irq >= __MAX_SUBCHANNELS || ioinfo[irq] == INVALID_STORAGE_AREA )
  686. return;
  687. if (cio_debug_initialized) {
  688. sprintf(dbf_txt, "free%x", irq);
  689. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  690. }
  691. s390irq_spin_lock_irqsave( irq, flags);
  692. #ifdef  CONFIG_KERNEL_DEBUG
  693. if ( irq != cons_dev )
  694. printk( KERN_DEBUG "Trying to free IRQ%dn",irq);
  695. #endif
  696. if (cio_debug_initialized)
  697. debug_sprintf_event(cio_debug_msg_id, 2, "Trying to free IRQ %dn", irq);
  698. /*
  699.  * disable the device and reset all IRQ info if
  700.  *  the IRQ is actually owned by the handler ...
  701.  */
  702. if ( ioinfo[irq]->ui.flags.ready ) {
  703. if ( dev_id == ioinfo[irq]->irq_desc.dev_id ) {
  704. /* start deregister */
  705. ioinfo[irq]->ui.flags.unready = 1;
  706. /*
  707.  * Try to stop IO first...
  708.  * ... it seems disable_subchannel is sometimes
  709.  * successfully called with IO still pending.
  710.  */
  711. halt_IO( irq,
  712.  0xC8C1D3E3,
  713.  DOIO_WAIT_FOR_INTERRUPT );
  714. ret = disable_subchannel( irq);
  715. if ( ret == -EBUSY ) {
  716. /*
  717.  * kill it !
  718.  * ... we first try sync and eventually
  719.  *  try terminating the current I/O by
  720.  *  an async request, twice halt, then
  721.  *  clear.
  722.  */
  723. ret = halt_IO( irq,
  724.                 0xC8C1D3E3,
  725.                 DOIO_WAIT_FOR_INTERRUPT );
  726.    
  727. if ( ret == -EBUSY ) {
  728. halt_IO( irq, 0xC8C1D3E3, 0);
  729. s390irq_spin_unlock_irqrestore( irq, flags);
  730. udelay( 200000 ); /* 200 ms */
  731. s390irq_spin_lock_irqsave( irq, flags);
  732. } /* endif */
  733. ret = disable_subchannel(irq);
  734. if (ret == -EBUSY) {
  735.    
  736. clear_IO( irq, 0x40C3D3D9,0 );
  737. s390irq_spin_unlock_irqrestore( irq, flags);
  738. udelay( 1000000 ); /* 1000 ms */
  739. s390irq_spin_lock_irqsave( irq, flags);
  740. /* give it a very last try ... */
  741. disable_subchannel( irq);
  742. if ( ioinfo[irq]->ui.flags.busy ) {
  743. printk( KERN_CRIT"free_irq(%04X) "
  744.        "- device %04X busy, retry "
  745.        "count exceededn",
  746. irq,
  747. ioinfo[irq]->devstat.devno);
  748. if (cio_debug_initialized)
  749. debug_sprintf_event(cio_debug_msg_id, 0,
  750.     "free_irq(%04X) - device %04X busy, retry count exceededn",
  751.     irq, ioinfo[irq]->devstat.devno);
  752. } /* endif */
  753. } /* endif */
  754. } /* endif */
  755. ioinfo[irq]->ui.flags.ready   = 0;
  756. ioinfo[irq]->ui.flags.unready = 0; /* deregister ended */
  757. ioinfo[irq]->nopfunc = NULL;
  758. s390irq_spin_unlock_irqrestore( irq, flags);
  759. } else {
  760. s390irq_spin_unlock_irqrestore( irq, flags);
  761. printk( KERN_ERR "free_irq(%04X) : error, "
  762.         "dev_id does not match !n", irq);
  763. if (cio_debug_initialized)
  764. debug_sprintf_event(cio_debug_msg_id, 0, 
  765.     "free_irq(%04X) : error, dev_id does not match !n", irq);
  766. } /* endif */
  767. } else {
  768. s390irq_spin_unlock_irqrestore( irq, flags);
  769. printk( KERN_ERR "free_irq(%04X) : error, "
  770.         "no action block ... !n", irq);
  771. if (cio_debug_initialized)
  772. debug_sprintf_event(cio_debug_msg_id, 0,
  773.     "free_irq(%04X) : error, no action block ... !n", irq);
  774. } /* endif */
  775. }
  776. /*
  777.  * Generic enable/disable code
  778.  */
  779. int disable_irq(unsigned int irq)
  780. {
  781. unsigned long flags;
  782. int           ret;
  783. char dbf_txt[15];
  784. SANITY_CHECK(irq);
  785. if ( !ioinfo[irq]->ui.flags.ready )
  786. return -ENODEV;
  787. if (cio_debug_initialized) {
  788. sprintf(dbf_txt, "disirq%x", irq);
  789. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  790. }
  791. s390irq_spin_lock_irqsave(irq, flags);
  792. ret = disable_subchannel(irq);
  793. s390irq_spin_unlock_irqrestore(irq, flags);
  794. synchronize_irq();
  795. if (cio_debug_initialized) 
  796. debug_int_event(cio_debug_trace_id, 4, ret);
  797. return( ret);
  798. }
  799. int enable_irq(unsigned int irq)
  800. {
  801. unsigned long flags;
  802. int           ret;
  803. char dbf_txt[15];
  804. SANITY_CHECK(irq);
  805. if ( !ioinfo[irq]->ui.flags.ready )
  806. return -ENODEV;
  807. if (cio_debug_initialized) {
  808. sprintf(dbf_txt, "enirq%x", irq);
  809. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  810. }
  811. s390irq_spin_lock_irqsave(irq, flags);
  812. ret = enable_subchannel(irq);
  813. s390irq_spin_unlock_irqrestore(irq, flags);
  814. if (cio_debug_initialized) 
  815. debug_int_event(cio_debug_trace_id, 4, ret);
  816. return(ret);
  817. }
  818. /*
  819.  * Enable IRQ by modifying the subchannel
  820.  */
  821. static int enable_subchannel( unsigned int irq)
  822. {
  823. int   ret = 0;
  824. int   ccode;
  825. int   retry = 5;
  826. char dbf_txt[15];
  827. SANITY_CHECK(irq);
  828. if (cio_debug_initialized) {
  829. sprintf(dbf_txt, "ensch%x", irq);
  830. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  831. }
  832. /*
  833.  * If a previous disable request is pending we reset it. However, this
  834.  *  status implies that the device may (still) be not-operational.
  835.  */
  836. if (  ioinfo[irq]->ui.flags.d_disable )
  837. {
  838. ioinfo[irq]->ui.flags.d_disable = 0;
  839. ret                             = 0;
  840. }
  841. else
  842. {
  843. ccode = stsch(irq, &(ioinfo[irq]->schib) );
  844. if ( ccode )
  845. {
  846. ret = -ENODEV;
  847. }
  848. else
  849. {
  850. ioinfo[irq]->schib.pmcw.ena = 1;
  851. if ( irq == cons_dev )
  852. {
  853. ioinfo[irq]->schib.pmcw.isc = 7;
  854. }
  855. else
  856. {
  857. ioinfo[irq]->schib.pmcw.isc = 3;
  858. } /* endif */
  859. do
  860. {
  861. ccode = msch( irq, &(ioinfo[irq]->schib) );
  862. switch (ccode) {
  863. case 0: /* ok */
  864. ret = 0;
  865. retry = 0;
  866. break;
  867. case 1: /* status pending */
  868. ioinfo[irq]->ui.flags.s_pend = 1;
  869. s390_process_IRQ( irq );
  870. ioinfo[irq]->ui.flags.s_pend = 0;
  871. ret = -EIO;    /* might be overwritten */
  872.                /* ... on re-driving    */
  873.                /* ... the msch()       */
  874. retry--;
  875. break;
  876. case 2: /* busy */
  877. udelay(100); /* allow for recovery */
  878. ret = -EBUSY;
  879. retry--;
  880. break;
  881. case 3: /* not oper */
  882. ioinfo[irq]->ui.flags.oper = 0;
  883. retry = 0;
  884. ret = -ENODEV;
  885. break;
  886. }
  887. } while ( retry );
  888. } /* endif */
  889. }  /* endif */
  890. if (cio_debug_initialized) {
  891. sprintf(dbf_txt,"ret:%d",ret);
  892. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  893. }
  894. return( ret );
  895. }
  896. /*
  897.  * Disable IRQ by modifying the subchannel
  898.  */
  899. static int disable_subchannel( unsigned int irq)
  900. {
  901. int  cc;          /* condition code */
  902. int  ret = 0;     /* function return value */
  903. int  retry = 5;
  904. char dbf_txt[15];
  905. SANITY_CHECK(irq);
  906. if ( ioinfo[irq]->ui.flags.busy )
  907. {
  908. /*
  909.  * the disable function must not be called while there are
  910.  *  requests pending for completion !
  911.  */
  912. ret = -EBUSY;
  913. }
  914. else
  915. {
  916. if (cio_debug_initialized) {
  917. sprintf(dbf_txt, "dissch%x", irq);
  918. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  919. }
  920. /*
  921.  * If device isn't operational we have to perform delayed
  922.  *  disabling when the next interrupt occurs - unless the
  923.  *  irq is re-requested prior to the interrupt to occur.
  924.  */
  925. cc = stsch(irq, &(ioinfo[irq]->schib) );
  926. if ( cc == 3 )
  927. {
  928. ioinfo[irq]->ui.flags.oper      = 0;
  929. ioinfo[irq]->ui.flags.d_disable = 1;
  930. ret = 0;
  931. }
  932. else // cc == 0
  933. {
  934. ioinfo[irq]->schib.pmcw.ena = 0;
  935. do
  936. {
  937. cc = msch( irq, &(ioinfo[irq]->schib) );
  938. switch (cc) {
  939. case 0: /* ok */
  940. retry = 0;
  941. ret = 0;   
  942. break;
  943. case 1: /* status pending */
  944. ioinfo[irq]->ui.flags.s_pend = 1;
  945. s390_process_IRQ( irq );
  946. ioinfo[irq]->ui.flags.s_pend = 0;
  947. ret = -EIO; /* might be overwritten  */
  948.             /* ... on re-driving the */
  949.             /* ... msch() call       */
  950. retry--;
  951. break;
  952. case 2: /* busy; this should not happen! */
  953. printk( KERN_CRIT"disable_subchannel(%04X) "
  954.         "- unexpected busy condition for "
  955. "device %04X received !n",
  956.         irq,
  957.         ioinfo[irq]->devstat.devno);
  958. if (cio_debug_initialized)
  959. debug_sprintf_event(cio_debug_msg_id, 0, 
  960.     "disable_subchannel(%04X) - unexpected busy condition for device %04X received !n",
  961.     irq, ioinfo[irq]->devstat.devno);
  962. retry = 0;
  963. ret = -EBUSY;
  964. break;
  965. case 3: /* not oper */
  966. /*
  967.  * should hardly occur ?!
  968.  */
  969. ioinfo[irq]->ui.flags.oper      = 0;
  970. ioinfo[irq]->ui.flags.d_disable = 1;
  971. retry = 0;
  972. ret = 0; /* if the device has gone we */
  973.          /* ... don't need to disable */
  974.          /* ... it anymore !          */
  975. break;
  976. } /* endswitch */
  977. } while ( retry );
  978. } /* endif */
  979. } /* endif */
  980. if (cio_debug_initialized) {
  981. sprintf(dbf_txt, "ret:%d",ret);
  982. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  983. }
  984. return( ret);
  985. }
  986. void s390_init_IRQ( void )
  987. {
  988. unsigned long flags;     /* PSW flags */
  989. long          cr6 __attribute__ ((aligned (8)));
  990. asm volatile ("STCK %0" : "=m" (irq_IPL_TOD));
  991. p_init_schib = alloc_bootmem_low( sizeof(schib_t));
  992. p_init_irb   = alloc_bootmem_low( sizeof(irb_t));
  993. /*
  994.  * As we don't know about the calling environment
  995.  *  we assure running disabled. Before leaving the
  996.  *  function we resestablish the old environment.
  997.  *
  998.  * Note : as we don't need a system wide lock, therefore
  999.  *        we shouldn't use cli(), but __cli() as this
  1000.  *        affects the current CPU only.
  1001.  */
  1002. __save_flags(flags);
  1003. __cli();
  1004. /*
  1005.  * disable all interrupts
  1006.  */
  1007. cr6 = 0;
  1008. __ctl_load( cr6, 6, 6);
  1009. s390_process_subchannels();
  1010. if (cio_count_irqs) {
  1011. int i;
  1012. for (i=0; i<NR_CPUS; i++) 
  1013. s390_irq_count[i]=0;
  1014. }
  1015. /*
  1016.  * enable default I/O-interrupt sublass 3
  1017.  */
  1018. cr6 = 0x10000000;
  1019. __ctl_load( cr6, 6, 6);
  1020. s390_device_recognition_all();
  1021. init_IRQ_complete = 1;
  1022. __restore_flags(flags);
  1023. return;
  1024. }
  1025. /*
  1026.  * dummy handler, used during init_IRQ() processing for compatibility only
  1027.  */
  1028. void  init_IRQ_handler( int irq, void *dev_id, struct pt_regs *regs)
  1029. {
  1030.    /* this is a dummy handler only ... */
  1031. }
  1032. int s390_start_IO( int            irq,      /* IRQ */
  1033.                    ccw1_t        *cpa,      /* logical channel prog addr */
  1034.                    unsigned long  user_intparm,  /* interruption parameter */
  1035.                    __u8           lpm,      /* logical path mask */
  1036.                    unsigned long  flag)     /* flags */
  1037. {
  1038. int            ccode;
  1039. int            ret = 0;
  1040. char buffer[80];
  1041. char dbf_txt[15];
  1042. SANITY_CHECK(irq);
  1043. /*
  1044.  * The flag usage is mutal exclusive ...
  1045.  */
  1046. if (    (flag & DOIO_EARLY_NOTIFICATION)
  1047.      && (flag & DOIO_REPORT_ALL     ) )
  1048. {
  1049. return( -EINVAL );
  1050. } /* endif */
  1051. if (cio_debug_initialized) {
  1052. sprintf(dbf_txt, "stIO%x", irq);
  1053. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1054. }
  1055. /*
  1056.  * setup ORB
  1057.  */
  1058.    ioinfo[irq]->orb.intparm = (__u32)(long)&ioinfo[irq]->u_intparm;
  1059. ioinfo[irq]->orb.fmt     = 1;
  1060. ioinfo[irq]->orb.pfch = !(flag & DOIO_DENY_PREFETCH);
  1061. ioinfo[irq]->orb.spnd =  (flag & DOIO_ALLOW_SUSPEND ? TRUE : FALSE);
  1062. ioinfo[irq]->orb.ssic =  (    (flag & DOIO_ALLOW_SUSPEND )
  1063.                            && (flag & DOIO_SUPPRESS_INTER) );
  1064. if ( flag & DOIO_VALID_LPM )
  1065. {
  1066. ioinfo[irq]->orb.lpm = lpm;
  1067. }
  1068. else
  1069. {
  1070. ioinfo[irq]->orb.lpm = ioinfo[irq]->opm;
  1071. } /* endif */
  1072. #ifdef CONFIG_ARCH_S390X
  1073. /* 
  1074.  * for 64 bit we always support 64 bit IDAWs with 4k page size only
  1075.  */
  1076. ioinfo[irq]->orb.c64 = 1;
  1077. ioinfo[irq]->orb.i2k = 0;
  1078. #endif
  1079. ioinfo[irq]->orb.cpa = (__u32)virt_to_phys( cpa);
  1080. /*
  1081.  * If sync processing was requested we lock the sync ISC, modify the
  1082.  *  device to present interrupts for this ISC only and switch the
  1083.  *  CPU to handle this ISC + the console ISC exclusively.
  1084.  */
  1085. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1086. {
  1087. ret = enable_cpu_sync_isc( irq);
  1088. if ( ret )
  1089. {
  1090. return( ret);
  1091. }
  1092. } /* endif */
  1093. if ( flag & DOIO_DONT_CALL_INTHDLR )
  1094. {
  1095. ioinfo[irq]->ui.flags.repnone = 1;
  1096. } /* endif */
  1097. /*
  1098.  * Issue "Start subchannel" and process condition code
  1099.  */
  1100. ccode = ssch( irq, &(ioinfo[irq]->orb) );
  1101. if (cio_debug_initialized) {
  1102. sprintf(dbf_txt, "ccode:%d", ccode);
  1103. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1104. }
  1105. switch ( ccode ) {
  1106. case 0:
  1107. if ( !ioinfo[irq]->ui.flags.w4sense )
  1108. {
  1109. /*
  1110.  * init the device driver specific devstat irb area
  1111.  *
  1112.  * Note : don磘 clear saved irb info in case of sense !
  1113.  */
  1114. memset( &((devstat_t *)ioinfo[irq]->irq_desc.dev_id)->ii.irb,
  1115. '', sizeof( irb_t) );
  1116. } /* endif */
  1117. memset( &ioinfo[irq]->devstat.ii.irb,
  1118.         '',
  1119.         sizeof( irb_t) );
  1120. /*
  1121.  * initialize device status information
  1122.  */
  1123. ioinfo[irq]->ui.flags.busy   = 1;
  1124. ioinfo[irq]->ui.flags.doio   = 1;
  1125. ioinfo[irq]->u_intparm       = user_intparm;
  1126. ioinfo[irq]->devstat.cstat   = 0;
  1127. ioinfo[irq]->devstat.dstat   = 0;
  1128. ioinfo[irq]->devstat.lpum    = 0;
  1129. ioinfo[irq]->devstat.flag    = DEVSTAT_START_FUNCTION;
  1130. ioinfo[irq]->devstat.scnt    = 0;
  1131. ioinfo[irq]->ui.flags.fast   = 0;
  1132. ioinfo[irq]->ui.flags.repall = 0;
  1133. /*
  1134.  * Check for either early (FAST) notification requests
  1135.  *  or if we are to return all interrupt info.
  1136.  * Default is to call IRQ handler at secondary status only
  1137.  */
  1138. if ( flag & DOIO_EARLY_NOTIFICATION )
  1139. {
  1140. ioinfo[irq]->ui.flags.fast = 1;
  1141. }
  1142. else if ( flag & DOIO_REPORT_ALL )
  1143. {
  1144. ioinfo[irq]->ui.flags.repall = 1;
  1145. } /* endif */
  1146. ioinfo[irq]->ulpm = ioinfo[irq]->orb.lpm;
  1147. /*
  1148.  * If synchronous I/O processing is requested, we have
  1149.  *  to wait for the corresponding interrupt to occur by
  1150.  *  polling the interrupt condition. However, as multiple
  1151.  *  interrupts may be outstanding, we must not just wait
  1152.  *  for the first interrupt, but must poll until ours
  1153.  *  pops up.
  1154.  */
  1155. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1156. {
  1157. psw_t            io_new_psw;
  1158. int              ccode;
  1159. uint64_t         time_start;    
  1160. uint64_t         time_curr;    
  1161. int              ready    = 0;
  1162. int              io_sub   = -1;
  1163. struct _lowcore *lc       = NULL;
  1164. int              do_retry = 1;
  1165. /*
  1166.  * We shouldn't perform a TPI loop, waiting for an
  1167.  *  interrupt to occur, but should load a WAIT PSW
  1168.  *  instead. Otherwise we may keep the channel subsystem
  1169.  *  busy, not able to present the interrupt. When our
  1170.  *  sync. interrupt arrived we reset the I/O old PSW to
  1171.  *  its original value.
  1172.  */
  1173. memcpy( &io_new_psw, &lc->io_new_psw, sizeof(psw_t));
  1174. ccode = iac();
  1175. switch (ccode) {
  1176. case 0:   // primary-space
  1177. io_sync_wait.mask =   _IO_PSW_MASK
  1178.                     | _PSW_PRIM_SPACE_MODE
  1179.                     | _PSW_IO_WAIT;
  1180. break;
  1181. case 1: // secondary-space
  1182. io_sync_wait.mask =   _IO_PSW_MASK
  1183.                     | _PSW_SEC_SPACE_MODE
  1184.                     | _PSW_IO_WAIT;
  1185. break;
  1186. case 2: // access-register
  1187. io_sync_wait.mask =   _IO_PSW_MASK
  1188.                     | _PSW_ACC_REG_MODE
  1189.                     | _PSW_IO_WAIT;
  1190. break;
  1191. case 3: // home-space
  1192. io_sync_wait.mask =   _IO_PSW_MASK
  1193.                     | _PSW_HOME_SPACE_MODE
  1194.                     | _PSW_IO_WAIT;
  1195. break;
  1196. default:
  1197. panic( "start_IO() : unexpected "
  1198.        "address-space-control %dn",
  1199.        ccode);
  1200. break;
  1201. } /* endswitch */
  1202. io_sync_wait.addr = FIX_PSW(&&io_wakeup);
  1203. /*
  1204.  * Martin didn't like modifying the new PSW, now we take
  1205.  *  a fast exit in do_IRQ() instead
  1206.  */
  1207. *(__u32 *)__LC_SYNC_IO_WORD  = 1;
  1208. asm volatile ("STCK %0" : "=m" (time_start));
  1209. time_start = time_start >> 32;
  1210. do
  1211. {
  1212. if ( flag & DOIO_TIMEOUT )
  1213. {
  1214. tpi_info_t tpi_info={0,};
  1215. do
  1216. {
  1217. if ( tpi(&tpi_info) == 1 )
  1218. {
  1219. io_sub = tpi_info.irq;
  1220. break;
  1221. }
  1222. else
  1223. {
  1224. udelay(100); /* usecs */
  1225. asm volatile ("STCK %0" : "=m" (time_curr));
  1226. if ( ((time_curr >> 32) - time_start ) >= 3 )
  1227. do_retry = 0;          
  1228. } /* endif */
  1229. } while ( do_retry );
  1230. }
  1231. else
  1232. {
  1233. __load_psw( io_sync_wait );
  1234. io_wakeup:
  1235. io_sub  = (__u32)*(__u16 *)__LC_SUBCHANNEL_NR;
  1236. } /* endif */
  1237.   if ( do_retry )
  1238. ready = s390_process_IRQ( io_sub );
  1239. /*
  1240.  * surrender when retry count's exceeded ...
  1241.  */
  1242. } while ( !(     ( io_sub == irq )
  1243.               && ( ready  == 1   ))
  1244.             && do_retry             );
  1245. *(__u32 *)__LC_SYNC_IO_WORD = 0;
  1246. if ( !do_retry )
  1247. ret = -ETIMEDOUT;
  1248. } /* endif */
  1249. break;
  1250. case 1 :            /* status pending */
  1251. ioinfo[irq]->devstat.flag =   DEVSTAT_START_FUNCTION
  1252.                             | DEVSTAT_STATUS_PENDING;
  1253. /*
  1254.  * initialize the device driver specific devstat irb area
  1255.  */
  1256. memset( &((devstat_t *) ioinfo[irq]->irq_desc.dev_id)->ii.irb,
  1257.         '', sizeof( irb_t) );
  1258. /*
  1259.  * Let the common interrupt handler process the pending status.
  1260.  *  However, we must avoid calling the user action handler, as
  1261.  *  it won't be prepared to handle a pending status during
  1262.  *  do_IO() processing inline. This also implies that process_IRQ
  1263.  *  must terminate synchronously - especially if device sensing
  1264.  *  is required.
  1265.  */
  1266. ioinfo[irq]->ui.flags.s_pend   = 1;
  1267. ioinfo[irq]->ui.flags.busy     = 1;
  1268. ioinfo[irq]->ui.flags.doio     = 1;
  1269. s390_process_IRQ( irq );
  1270. ioinfo[irq]->ui.flags.s_pend   = 0;
  1271. ioinfo[irq]->ui.flags.busy     = 0;
  1272. ioinfo[irq]->ui.flags.doio     = 0;
  1273. ioinfo[irq]->ui.flags.repall   = 0;
  1274. ioinfo[irq]->ui.flags.w4final  = 0;
  1275. ioinfo[irq]->devstat.flag     |= DEVSTAT_FINAL_STATUS;
  1276. /*
  1277.  * In multipath mode a condition code 3 implies the last path
  1278.  *  has gone, except we have previously restricted the I/O to
  1279.  *  a particular path. A condition code 1 (0 won't occur)
  1280.  *  results in return code EIO as well as 3 with another path
  1281.  *  than the one used (i.e. path available mask is non-zero).
  1282.  */
  1283. if ( ioinfo[irq]->devstat.ii.irb.scsw.cc == 3 )
  1284. {
  1285. if ( flag & DOIO_VALID_LPM )
  1286. {
  1287. ioinfo[irq]->opm &= ~(ioinfo[irq]->devstat.ii.irb.esw.esw1.lpum);
  1288. }
  1289. else
  1290. {
  1291. ioinfo[irq]->opm = 0;
  1292. } /* endif */
  1293. if ( ioinfo[irq]->opm == 0 ) 
  1294. {
  1295. ret                         = -ENODEV;
  1296. ioinfo[irq]->ui.flags.oper  = 0;
  1297. }
  1298. else
  1299. {
  1300. ret = -EIO;
  1301. } /* endif */
  1302. ioinfo[irq]->devstat.flag  |= DEVSTAT_NOT_OPER;
  1303. #ifdef CONFIG_DEBUG_IO
  1304. {
  1305. stsch(irq, &(ioinfo[irq]->schib) );
  1306. sprintf( buffer, "s390_start_IO(%04X) - irb for "
  1307.          "device %04X, after status pendingn",
  1308.          irq,
  1309.          ioinfo[irq]->devstat.devno );
  1310. s390_displayhex( buffer,
  1311.                  &(ioinfo[irq]->devstat.ii.irb) ,
  1312.                  sizeof(irb_t));
  1313. sprintf( buffer, "s390_start_IO(%04X) - schib for "
  1314.          "device %04X, after status pendingn",
  1315.          irq,
  1316.          ioinfo[irq]->devstat.devno );
  1317. s390_displayhex( buffer,
  1318.                  &(ioinfo[irq]->schib) ,
  1319.                  sizeof(schib_t));
  1320. if (ioinfo[irq]->devstat.flag & DEVSTAT_FLAG_SENSE_AVAIL)
  1321. {
  1322. sprintf( buffer, "s390_start_IO(%04X) - sense "
  1323.          "data for "
  1324.          "device %04X, after status pendingn",
  1325.          irq,
  1326.          ioinfo[irq]->devstat.devno );
  1327. s390_displayhex( buffer,
  1328. ioinfo[irq]->irq_desc.dev_id->ii.sense.data,
  1329. ioinfo[irq]->irq_desc.dev_id->rescnt);
  1330. } /* endif */
  1331. }
  1332. #endif
  1333. if (cio_debug_initialized) {
  1334. stsch(irq, &(ioinfo[irq]->schib) );
  1335. sprintf( buffer, "s390_start_IO(%04X) - irb for "
  1336.  "device %04X, after status pendingn",
  1337.  irq,
  1338.  ioinfo[irq]->devstat.devno );
  1339. s390_displayhex2( buffer,
  1340.  &(ioinfo[irq]->devstat.ii.irb) ,
  1341.  sizeof(irb_t), 2);
  1342. sprintf( buffer, "s390_start_IO(%04X) - schib for "
  1343.  "device %04X, after status pendingn",
  1344.  irq,
  1345.  ioinfo[irq]->devstat.devno );
  1346. s390_displayhex2( buffer,
  1347.  &(ioinfo[irq]->schib) ,
  1348.  sizeof(schib_t), 2);
  1349. if (ioinfo[irq]->devstat.flag & DEVSTAT_FLAG_SENSE_AVAIL) {
  1350. sprintf( buffer, "s390_start_IO(%04X) - sense "
  1351.  "data for "
  1352.  "device %04X, after status pendingn",
  1353.  irq,
  1354.  ioinfo[irq]->devstat.devno );
  1355. s390_displayhex2( buffer,
  1356.   ioinfo[irq]->irq_desc.dev_id->ii.sense.data,
  1357.   ioinfo[irq]->irq_desc.dev_id->rescnt, 2);
  1358. } /* endif */
  1359. }
  1360. }
  1361. else
  1362. {
  1363. ret                         = -EIO;
  1364. ioinfo[irq]->devstat.flag  &= ~DEVSTAT_NOT_OPER;
  1365. ioinfo[irq]->ui.flags.oper  = 1;
  1366. } /* endif */
  1367. break;
  1368. case 2 :            /* busy */
  1369. ret = -EBUSY;
  1370. break;
  1371. default:            /* device/path not operational */
  1372. if ( flag & DOIO_VALID_LPM )
  1373. {
  1374. ioinfo[irq]->opm &= ~lpm;
  1375. }
  1376. else
  1377. {
  1378. ioinfo[irq]->opm = 0;
  1379. } /* endif */
  1380. if ( ioinfo[irq]->opm == 0 ) 
  1381. {
  1382. ioinfo[irq]->ui.flags.oper  = 0;
  1383. ioinfo[irq]->devstat.flag  |= DEVSTAT_NOT_OPER;
  1384. } /* endif */
  1385. ret = -ENODEV;
  1386. memcpy( ioinfo[irq]->irq_desc.dev_id,
  1387.         &(ioinfo[irq]->devstat),
  1388.         sizeof( devstat_t) );
  1389. #ifdef CONFIG_DEBUG_IO
  1390.     stsch(irq, &(ioinfo[irq]->schib) );
  1391. sprintf( buffer, "s390_start_IO(%04X) - schib for "
  1392.          "device %04X, after 'not oper' statusn",
  1393.          irq,
  1394.          ioinfo[irq]->devstat.devno );
  1395. s390_displayhex( buffer,
  1396.                  &(ioinfo[irq]->schib),
  1397.                  sizeof(schib_t));
  1398. #endif
  1399. if (cio_debug_initialized) {
  1400. stsch(irq, &(ioinfo[irq]->schib) );
  1401. sprintf( buffer, "s390_start_IO(%04X) - schib for "
  1402.          "device %04X, after 'not oper' statusn",
  1403.          irq,
  1404.          ioinfo[irq]->devstat.devno );
  1405. s390_displayhex2( buffer,
  1406.                  &(ioinfo[irq]->schib),
  1407.                  sizeof(schib_t), 2);
  1408. }
  1409. break;
  1410. } /* endswitch */
  1411. if ( flag & DOIO_WAIT_FOR_INTERRUPT)
  1412. {
  1413. disable_cpu_sync_isc( irq );
  1414. } /* endif */
  1415. if ( flag & DOIO_DONT_CALL_INTHDLR )
  1416. {
  1417. ioinfo[irq]->ui.flags.repnone = 0;
  1418.    } /* endif */
  1419. return( ret);
  1420. }
  1421. int do_IO( int            irq,          /* IRQ */
  1422.            ccw1_t        *cpa,          /* channel program address */
  1423.            unsigned long  user_intparm, /* interruption parameter */
  1424.            __u8           lpm,          /* logical path mask */
  1425.            unsigned long  flag)         /* flags : see above */
  1426. {
  1427. int ret = 0;
  1428. char dbf_txt[15];
  1429. SANITY_CHECK(irq);
  1430. /* handler registered ? or free_irq() in process already ? */
  1431. if ( !ioinfo[irq]->ui.flags.ready || ioinfo[irq]->ui.flags.unready )
  1432. {
  1433. return( -ENODEV );
  1434. } /* endif */
  1435. if (cio_debug_initialized) {
  1436. sprintf(dbf_txt, "doIO%x", irq);
  1437. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1438. }
  1439. /*
  1440.  * Note: We ignore the device operational status - if not operational,
  1441.  *        the SSCH will lead to an -ENODEV condition ...
  1442.  */
  1443. if ( !ioinfo[irq]->ui.flags.busy )         /* last I/O completed ? */
  1444. {
  1445. ret = s390_start_IO( irq, cpa, user_intparm, lpm, flag);
  1446. }
  1447. else if ( ioinfo[irq]->ui.flags.fast )
  1448. {
  1449. /*
  1450.  * If primary status was received and ending status is missing,
  1451.  *  the device driver won't be notified on the ending status
  1452.  *  if early (fast) interrupt notification was requested.
  1453.  *  Therefore we have to queue the next incoming request. If
  1454.  *  halt_IO() is issued while there is a request queued, a HSCH
  1455.  *  needs to be issued and the queued request must be deleted
  1456.  *  but its intparm must be returned (see halt_IO() processing)
  1457.  */
  1458. if (     ioinfo[irq]->ui.flags.w4final
  1459.       && !ioinfo[irq]->ui.flags.doio_q )
  1460. {
  1461. ioinfo[irq]->qflag    = flag;
  1462. ioinfo[irq]->qcpa     = cpa;
  1463. ioinfo[irq]->qintparm = user_intparm;
  1464. ioinfo[irq]->qlpm     = lpm;
  1465. }
  1466. else
  1467. {
  1468. ret = -EBUSY;
  1469. } /* endif */
  1470. }
  1471. else
  1472. {
  1473. ret = -EBUSY;
  1474. } /* endif */
  1475. return( ret );
  1476. }
  1477. /*
  1478.  * resume suspended I/O operation
  1479.  */
  1480. int resume_IO( int irq)
  1481. {
  1482. int ret = 0;
  1483. char dbf_txt[15];
  1484. SANITY_CHECK(irq);
  1485. if (cio_debug_initialized) {
  1486. sprintf(dbf_txt, "resIO%x", irq);
  1487. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1488. }
  1489. /*
  1490.  * We allow for 'resume' requests only for active I/O operations
  1491.  */
  1492. if ( ioinfo[irq]->ui.flags.busy )
  1493. {
  1494. int ccode;
  1495. ccode = rsch( irq);
  1496. if (cio_debug_initialized) {
  1497. sprintf(dbf_txt, "ccode:%d",ccode);
  1498. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  1499. }
  1500. switch (ccode) {
  1501. case 0 :
  1502. break;
  1503. case 1 :
  1504.    s390_process_IRQ( irq );
  1505. ret = -EBUSY;
  1506. break;
  1507. case 2 :
  1508. ret = -EINVAL;
  1509. break;
  1510. case 3 :
  1511. /*
  1512.  * useless to wait for request completion
  1513.  *  as device is no longer operational !
  1514.  */
  1515. ioinfo[irq]->ui.flags.oper = 0;
  1516. ioinfo[irq]->ui.flags.busy = 0;
  1517. ret                        = -ENODEV;
  1518. break;
  1519. } /* endswitch */          
  1520. }
  1521. else
  1522. {
  1523. ret = -ENOTCONN;
  1524. } /* endif  */
  1525. return( ret);
  1526. }
  1527. /*
  1528.  * Note: The "intparm" parameter is not used by the halt_IO() function
  1529.  *       itself, as no ORB is built for the HSCH instruction. However,
  1530.  *       it allows the device interrupt handler to associate the upcoming
  1531.  *       interrupt with the halt_IO() request.
  1532.  */
  1533. int halt_IO( int           irq,
  1534.              unsigned long user_intparm,
  1535.              unsigned long flag)  /* possible DOIO_WAIT_FOR_INTERRUPT */
  1536. {
  1537. int            ret;
  1538. int            ccode;
  1539. char dbf_txt[15];
  1540. SANITY_CHECK(irq);
  1541. /*
  1542.  * we only allow for halt_IO if the device has an I/O handler associated
  1543.  */
  1544. if ( !ioinfo[irq]->ui.flags.ready )
  1545. {
  1546. ret = -ENODEV;
  1547. }
  1548. /*
  1549.  * we ignore the halt_io() request if ending_status was received but
  1550.  *  a SENSE operation is waiting for completion.
  1551.  */
  1552. else if ( ioinfo[irq]->ui.flags.w4sense )
  1553. {
  1554. ret = 0;
  1555. }
  1556. else
  1557. {
  1558. if (cio_debug_initialized) {
  1559. sprintf(dbf_txt, "haltIO%x", irq);
  1560. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  1561. }
  1562. /*
  1563.  * If sync processing was requested we lock the sync ISC,
  1564.  *  modify the device to present interrupts for this ISC only
  1565.  *  and switch the CPU to handle this ISC + the console ISC
  1566.  *  exclusively.
  1567.  */
  1568. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1569. {
  1570. ret = enable_cpu_sync_isc( irq);
  1571. if ( ret )
  1572. {
  1573. return( ret);
  1574.   
  1575. } /* endif */
  1576. } /* endif */
  1577. /*
  1578.  * Issue "Halt subchannel" and process condition code
  1579.  */
  1580. ccode = hsch( irq );
  1581. if (cio_debug_initialized) {
  1582. sprintf(dbf_txt, "ccode:%d",ccode);
  1583. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  1584. }
  1585. switch ( ccode ) {
  1586. case 0:
  1587. ioinfo[irq]->ui.flags.haltio = 1;
  1588. if ( !ioinfo[irq]->ui.flags.doio )
  1589. {
  1590. ioinfo[irq]->ui.flags.busy   = 1;
  1591. ioinfo[irq]->u_intparm       = user_intparm;
  1592. ioinfo[irq]->devstat.cstat   = 0;
  1593. ioinfo[irq]->devstat.dstat   = 0;
  1594. ioinfo[irq]->devstat.lpum    = 0;
  1595. ioinfo[irq]->devstat.flag    = DEVSTAT_HALT_FUNCTION;
  1596. ioinfo[irq]->devstat.scnt    = 0;
  1597. }
  1598. else
  1599. {
  1600. ioinfo[irq]->devstat.flag   |= DEVSTAT_HALT_FUNCTION;
  1601. } /* endif */
  1602. /*
  1603.  * If synchronous I/O processing is requested, we have
  1604.  *  to wait for the corresponding interrupt to occur by
  1605.  *  polling the interrupt condition. However, as multiple
  1606.  *  interrupts may be outstanding, we must not just wait
  1607.  *  for the first interrupt, but must poll until ours
  1608.  *  pops up.
  1609.  */
  1610. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1611. {
  1612. int              io_sub;
  1613. __u32            io_parm;
  1614. psw_t            io_new_psw;
  1615. int              ccode;
  1616.   
  1617. int              ready = 0;
  1618. struct _lowcore *lc    = NULL;
  1619. /*
  1620.  * We shouldn't perform a TPI loop, waiting for
  1621.  *  an interrupt to occur, but should load a
  1622.  *  WAIT PSW instead. Otherwise we may keep the
  1623.  *  channel subsystem busy, not able to present
  1624.  *  the interrupt. When our sync. interrupt
  1625.  *  arrived we reset the I/O old PSW to its
  1626.  *  original value.
  1627.  */
  1628. memcpy( &io_new_psw,
  1629.         &lc->io_new_psw,
  1630.         sizeof(psw_t));
  1631. ccode = iac();
  1632. switch (ccode) {
  1633. case 0:   // primary-space
  1634. io_sync_wait.mask =   _IO_PSW_MASK
  1635.                     | _PSW_PRIM_SPACE_MODE
  1636.                     | _PSW_IO_WAIT;
  1637. break;
  1638. case 1: // secondary-space
  1639. io_sync_wait.mask =   _IO_PSW_MASK
  1640.                     | _PSW_SEC_SPACE_MODE
  1641.                     | _PSW_IO_WAIT;
  1642. break;
  1643. case 2: // access-register
  1644. io_sync_wait.mask =   _IO_PSW_MASK
  1645.                     | _PSW_ACC_REG_MODE
  1646.                     | _PSW_IO_WAIT;
  1647. break;
  1648. case 3: // home-space
  1649. io_sync_wait.mask =   _IO_PSW_MASK
  1650.                     | _PSW_HOME_SPACE_MODE
  1651.                     | _PSW_IO_WAIT;
  1652. break;
  1653. default:
  1654. panic( "halt_IO() : unexpected "
  1655.        "address-space-control %dn",
  1656.        ccode);
  1657. break;
  1658. } /* endswitch */
  1659. io_sync_wait.addr = FIX_PSW(&&hio_wakeup);
  1660. /*
  1661.  * Martin didn't like modifying the new PSW, now we take
  1662.  *  a fast exit in do_IRQ() instead
  1663.  */
  1664. *(__u32 *)__LC_SYNC_IO_WORD  = 1;
  1665. do
  1666. {
  1667. __load_psw( io_sync_wait );
  1668. hio_wakeup:
  1669.    io_parm = *(__u32 *)__LC_IO_INT_PARM;
  1670.    io_sub  = (__u32)*(__u16 *)__LC_SUBCHANNEL_NR;
  1671.    ready = s390_process_IRQ( io_sub );
  1672. } while ( !((io_sub == irq) && (ready == 1)) );
  1673. *(__u32 *)__LC_SYNC_IO_WORD = 0;
  1674. } /* endif */
  1675. ret = 0;
  1676. break;
  1677. case 1 :            /* status pending */
  1678. ioinfo[irq]->devstat.flag |= DEVSTAT_STATUS_PENDING;
  1679. /*
  1680.  * initialize the device driver specific devstat irb area
  1681.  */
  1682. memset( &ioinfo[irq]->irq_desc.dev_id->ii.irb,
  1683.         '', sizeof( irb_t) );
  1684. /*
  1685.  * Let the common interrupt handler process the pending
  1686.  *  status. However, we must avoid calling the user
  1687.  *  action handler, as it won't be prepared to handle
  1688.  *  a pending status during do_IO() processing inline.
  1689.  *  This also implies that s390_process_IRQ must
  1690.  *  terminate synchronously - especially if device
  1691.  *  sensing is required.
  1692.  */
  1693. ioinfo[irq]->ui.flags.s_pend   = 1;
  1694. ioinfo[irq]->ui.flags.busy     = 1;
  1695. ioinfo[irq]->ui.flags.doio     = 1;
  1696. s390_process_IRQ( irq );
  1697. ioinfo[irq]->ui.flags.s_pend   = 0;
  1698. ioinfo[irq]->ui.flags.busy     = 0;
  1699. ioinfo[irq]->ui.flags.doio     = 0;
  1700. ioinfo[irq]->ui.flags.repall   = 0;
  1701. ioinfo[irq]->ui.flags.w4final  = 0;
  1702. ioinfo[irq]->devstat.flag     |= DEVSTAT_FINAL_STATUS;
  1703. /*
  1704.  * In multipath mode a condition code 3 implies the last
  1705.  *  path has gone, except we have previously restricted
  1706.  *  the I/O to a particular path. A condition code 1
  1707.  *  (0 won't occur) results in return code EIO as well
  1708.  *  as 3 with another path than the one used (i.e. path available mask is non-zero).
  1709.  */
  1710. if ( ioinfo[irq]->devstat.ii.irb.scsw.cc == 3 )
  1711. {
  1712. ret                         = -ENODEV;
  1713. ioinfo[irq]->devstat.flag  |= DEVSTAT_NOT_OPER;
  1714. ioinfo[irq]->ui.flags.oper  = 0;
  1715. }
  1716. else
  1717. {
  1718. ret                         = -EIO;
  1719. ioinfo[irq]->devstat.flag  &= ~DEVSTAT_NOT_OPER;
  1720. ioinfo[irq]->ui.flags.oper  = 1;
  1721. } /* endif */
  1722. break;
  1723. case 2 :            /* busy */
  1724. ret = -EBUSY;
  1725. break;
  1726. default:            /* device not operational */
  1727. ret = -ENODEV;
  1728. break;
  1729. } /* endswitch */
  1730. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1731. {
  1732. disable_cpu_sync_isc( irq );
  1733. } /* endif */
  1734. } /* endif */
  1735. return( ret );
  1736. }
  1737. /*
  1738.  * Note: The "intparm" parameter is not used by the clear_IO() function
  1739.  *       itself, as no ORB is built for the CSCH instruction. However,
  1740.  *       it allows the device interrupt handler to associate the upcoming
  1741.  *       interrupt with the clear_IO() request.
  1742.  */
  1743. int clear_IO( int           irq,
  1744.               unsigned long user_intparm,
  1745.               unsigned long flag)  /* possible DOIO_WAIT_FOR_INTERRUPT */
  1746. {
  1747. int            ret = 0;
  1748. int            ccode;
  1749. char dbf_txt[15];
  1750. SANITY_CHECK(irq);
  1751. if ( ioinfo[irq] == INVALID_STORAGE_AREA )
  1752. {
  1753. return( -ENODEV);
  1754.    }
  1755. /*
  1756.  * we only allow for clear_IO if the device has an I/O handler associated
  1757.  */
  1758. if ( !ioinfo[irq]->ui.flags.ready )
  1759. {
  1760. ret = -ENODEV;
  1761. }
  1762. /*
  1763.  * we ignore the clear_io() request if ending_status was received but
  1764.  *  a SENSE operation is waiting for completion.
  1765.  */
  1766. else if ( ioinfo[irq]->ui.flags.w4sense )
  1767. {
  1768. ret = 0;
  1769. }
  1770. else
  1771. {
  1772. if (cio_debug_initialized) {
  1773. sprintf(dbf_txt, "clearIO%x", irq);
  1774. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  1775. }
  1776. /*
  1777.  * If sync processing was requested we lock the sync ISC,
  1778.  *  modify the device to present interrupts for this ISC only
  1779.  *  and switch the CPU to handle this ISC + the console ISC
  1780.  *  exclusively.
  1781.  */
  1782. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1783. {
  1784. ret = enable_cpu_sync_isc( irq);
  1785. if ( ret )
  1786. {
  1787. return( ret);
  1788.   
  1789. } /* endif */
  1790. } /* endif */
  1791. /*
  1792.  * Issue "Clear subchannel" and process condition code
  1793.  */
  1794. ccode = csch( irq );
  1795. if (cio_debug_initialized) {
  1796. sprintf(dbf_txt, "ccode:%d",ccode);
  1797. debug_text_event(cio_debug_trace_id, 2, dbf_txt);
  1798. }
  1799. switch ( ccode ) {
  1800. case 0:
  1801. ioinfo[irq]->ui.flags.haltio = 1;
  1802. if ( !ioinfo[irq]->ui.flags.doio )
  1803. {
  1804. ioinfo[irq]->ui.flags.busy   = 1;
  1805. ioinfo[irq]->u_intparm       = user_intparm;
  1806. ioinfo[irq]->devstat.cstat   = 0;
  1807. ioinfo[irq]->devstat.dstat   = 0;
  1808. ioinfo[irq]->devstat.lpum    = 0;
  1809. ioinfo[irq]->devstat.flag    = DEVSTAT_CLEAR_FUNCTION;
  1810. ioinfo[irq]->devstat.scnt    = 0;
  1811. }
  1812. else
  1813. {
  1814. ioinfo[irq]->devstat.flag   |= DEVSTAT_CLEAR_FUNCTION;
  1815. } /* endif */
  1816. /*
  1817.  * If synchronous I/O processing is requested, we have
  1818.  *  to wait for the corresponding interrupt to occur by
  1819.  *  polling the interrupt condition. However, as multiple
  1820.  *  interrupts may be outstanding, we must not just wait
  1821.  *  for the first interrupt, but must poll until ours
  1822.  *  pops up.
  1823.  */
  1824. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1825. {
  1826. int              io_sub;
  1827. __u32            io_parm;
  1828. psw_t            io_new_psw;
  1829. int              ccode;
  1830.   
  1831. int              ready = 0;
  1832. struct _lowcore *lc    = NULL;
  1833. /*
  1834.  * We shouldn't perform a TPI loop, waiting for
  1835.  *  an interrupt to occur, but should load a
  1836.  *  WAIT PSW instead. Otherwise we may keep the
  1837.  *  channel subsystem busy, not able to present
  1838.  *  the interrupt. When our sync. interrupt
  1839.  *  arrived we reset the I/O old PSW to its
  1840.  *  original value.
  1841.  */
  1842. memcpy( &io_new_psw,
  1843.         &lc->io_new_psw,
  1844.         sizeof(psw_t));
  1845. ccode = iac();
  1846. switch (ccode) {
  1847. case 0:   // primary-space
  1848. io_sync_wait.mask =   _IO_PSW_MASK
  1849.                     | _PSW_PRIM_SPACE_MODE
  1850.                     | _PSW_IO_WAIT;
  1851. break;
  1852. case 1: // secondary-space
  1853. io_sync_wait.mask =   _IO_PSW_MASK
  1854.                     | _PSW_SEC_SPACE_MODE
  1855.                     | _PSW_IO_WAIT;
  1856. break;
  1857. case 2: // access-register
  1858. io_sync_wait.mask =   _IO_PSW_MASK
  1859.                     | _PSW_ACC_REG_MODE
  1860.                     | _PSW_IO_WAIT;
  1861. break;
  1862. case 3: // home-space
  1863. io_sync_wait.mask =   _IO_PSW_MASK
  1864.                     | _PSW_HOME_SPACE_MODE
  1865.                     | _PSW_IO_WAIT;
  1866. break;
  1867. default:
  1868. panic( "clear_IO() : unexpected "
  1869.        "address-space-control %dn",
  1870.        ccode);
  1871. break;
  1872. } /* endswitch */
  1873. io_sync_wait.addr = FIX_PSW(&&cio_wakeup);
  1874. /*
  1875.  * Martin didn't like modifying the new PSW, now we take
  1876.  *  a fast exit in do_IRQ() instead
  1877.  */
  1878. *(__u32 *)__LC_SYNC_IO_WORD  = 1;
  1879. do
  1880. {
  1881. __load_psw( io_sync_wait );
  1882. cio_wakeup:
  1883.    io_parm = *(__u32 *)__LC_IO_INT_PARM;
  1884.    io_sub  = (__u32)*(__u16 *)__LC_SUBCHANNEL_NR;
  1885.    ready = s390_process_IRQ( io_sub );
  1886. } while ( !((io_sub == irq) && (ready == 1)) );
  1887. *(__u32 *)__LC_SYNC_IO_WORD = 0;
  1888. } /* endif */
  1889. ret = 0;
  1890. break;
  1891. case 1 :            /* no status pending for csh */
  1892. BUG();
  1893. break;
  1894. case 2 :            /* no busy for csh*/
  1895. BUG();
  1896. break;
  1897. default:            /* device not operational */
  1898. ret = -ENODEV;
  1899. break;
  1900. } /* endswitch */
  1901. if ( flag & DOIO_WAIT_FOR_INTERRUPT )
  1902. {
  1903. disable_cpu_sync_isc( irq );
  1904. } /* endif */
  1905. } /* endif */
  1906. return( ret );
  1907. }
  1908. /*
  1909.  * do_IRQ() handles all normal I/O device IRQ's (the special
  1910.  *          SMP cross-CPU interrupts have their own specific
  1911.  *          handlers).
  1912.  *
  1913.  */
  1914. asmlinkage void do_IRQ( struct pt_regs regs )
  1915. {
  1916. /*
  1917.  * Get interrupt info from lowcore
  1918.  */
  1919. volatile tpi_info_t *tpi_info = (tpi_info_t*)(__LC_SUBCHANNEL_ID);
  1920. int cpu = smp_processor_id();
  1921. /*
  1922.  * take fast exit if CPU is in sync. I/O state
  1923.  *
  1924.  * Note: we have to turn off the WAIT bit and re-disable
  1925.  *       interrupts prior to return as this was the initial
  1926.  *       entry condition to synchronous I/O.
  1927.  */
  1928.   if (    *(__u32 *)__LC_SYNC_IO_WORD )
  1929. {
  1930. regs.psw.mask &= ~(_PSW_WAIT_MASK_BIT | _PSW_IO_MASK_BIT);
  1931. return;
  1932. } /* endif */
  1933. #ifdef CONFIG_FAST_IRQ
  1934. do {
  1935. #endif /*  CONFIG_FAST_IRQ */
  1936. /*
  1937.  * Non I/O-subchannel thin interrupts are processed differently
  1938.  */
  1939. if ( tpi_info->adapter_IO == 1 &&
  1940.      tpi_info->int_type == IO_INTERRUPT_TYPE )
  1941. {
  1942. irq_enter(cpu, -1);
  1943. do_adapter_IO( tpi_info->intparm );
  1944. irq_exit(cpu, -1);
  1945. else 
  1946. {
  1947. unsigned int irq = tpi_info->irq;
  1948. /*
  1949.  * fix me !!!
  1950.  *
  1951.  * instead of boxing the device, we need to schedule device
  1952.  * recognition, the interrupt stays pending. We need to
  1953.  * dynamically allocate an ioinfo structure, etc..
  1954.  */
  1955. if ( ioinfo[irq] == INVALID_STORAGE_AREA )
  1956. {
  1957. return; /* this keeps the device boxed ... */
  1958. }
  1959. irq_enter(cpu, irq);
  1960. s390irq_spin_lock( irq );
  1961. s390_process_IRQ( irq );
  1962. s390irq_spin_unlock( irq );
  1963. irq_exit(cpu, irq);
  1964. }
  1965. #ifdef CONFIG_FAST_IRQ
  1966. /*
  1967.  * Are more interrupts pending?
  1968.  * If so, the tpi instruction will update the lowcore 
  1969.  * to hold the info for the next interrupt.
  1970.  */
  1971. } while ( tpi( NULL ) != 0 );
  1972. #endif /*  CONFIG_FAST_IRQ */
  1973. return;
  1974. }
  1975. /*
  1976.  * s390_process_IRQ() handles status pending situations and interrupts
  1977.  *
  1978.  * Called by : do_IRQ()             - for "real" interrupts
  1979.  *             s390_start_IO, halt_IO()
  1980.  *                                  - status pending cond. after SSCH, or HSCH
  1981.  *             disable_subchannel() - status pending conditions (after MSCH)
  1982.  *
  1983.  * Returns: 0 - no ending status received, no further action taken
  1984.  *          1 - interrupt handler was called with ending status
  1985.  */
  1986. int s390_process_IRQ( unsigned int irq )
  1987. {
  1988. int                    ccode;      /* cond code from tsch() operation */
  1989. int                    irb_cc;     /* cond code from irb */
  1990. int                    sdevstat;   /* struct devstat size to copy */
  1991. unsigned int           fctl;       /* function control */
  1992. unsigned int           stctl;      /* status   control */
  1993. unsigned int           actl;       /* activity control */
  1994. int               issense         = 0;
  1995. int               ending_status   = 0;
  1996. int               allow4handler   = 1;
  1997. int               chnchk          = 0;
  1998. devstat_t        *dp;
  1999. devstat_t        *udp;
  2000. char dbf_txt[15];
  2001. char buffer[80];
  2002. if (cio_count_irqs) {
  2003. int cpu = smp_processor_id();
  2004. s390_irq_count[cpu]++;
  2005. }
  2006. if (cio_debug_initialized) {
  2007. sprintf(dbf_txt, "procIRQ%x", irq);
  2008. debug_text_event(cio_debug_trace_id, 3, dbf_txt);
  2009. }
  2010. if ( ioinfo[irq] == INVALID_STORAGE_AREA )
  2011. {
  2012. /* we can't properly process the interrupt ... */
  2013. tsch( irq, p_init_irb );
  2014. return( 1 );
  2015. } /* endif */
  2016. dp  = &ioinfo[irq]->devstat;
  2017. udp = ioinfo[irq]->irq_desc.dev_id;
  2018. /*
  2019.  * It might be possible that a device was not-oper. at the time
  2020.  *  of free_irq() processing. This means the handler is no longer
  2021.  *  available when the device possibly becomes ready again. In
  2022.  *  this case we perform delayed disable_subchannel() processing.
  2023.  */
  2024. if ( !ioinfo[irq]->ui.flags.ready )
  2025. {
  2026. if ( !ioinfo[irq]->ui.flags.d_disable )
  2027. {
  2028. #ifdef CONFIG_DEBUG_IO
  2029. printk( KERN_CRIT"s390_process_IRQ(%04X) "
  2030.         "- no interrupt handler registered "
  2031.   "for device %04X !n",
  2032.         irq,
  2033.         ioinfo[irq]->devstat.devno);
  2034. #endif /* CONFIG_DEBUG_IO */
  2035. if (cio_debug_initialized)
  2036. debug_sprintf_event(cio_debug_msg_id, 0,
  2037.     "s390_process_IRQ(%04X) - no interrupt handler registered for device %04X !n",
  2038.     irq, ioinfo[irq]->devstat.devno);
  2039. } /* endif */
  2040. } /* endif */
  2041. /*
  2042.  * retrieve the i/o interrupt information (irb),
  2043.  *  update the device specific status information
  2044.  *  and possibly call the interrupt handler.
  2045.  *
  2046.  * Note 1: At this time we don't process the resulting
  2047.  *         condition code (ccode) from tsch(), although
  2048.  *         we probably should.
  2049.  *
  2050.  * Note 2: Here we will have to check for channel
  2051.  *         check conditions and call a channel check
  2052.  *         handler.
  2053.  *
  2054.  * Note 3: If a start function was issued, the interruption
  2055.  *         parameter relates to it. If a halt function was
  2056.  *         issued for an idle device, the intparm must not
  2057.  *         be taken from lowcore, but from the devstat area.
  2058.  */
  2059. ccode = tsch( irq, &(dp->ii.irb) );
  2060. if (cio_debug_initialized) {
  2061. sprintf(dbf_txt, "ccode:%d", ccode);
  2062. debug_text_event(cio_debug_trace_id, 3, dbf_txt);
  2063. }
  2064. //
  2065. // We must only accumulate the status if the device is busy already
  2066. //
  2067. if ( ioinfo[irq]->ui.flags.busy )
  2068. {
  2069. dp->dstat   |= dp->ii.irb.scsw.dstat;
  2070. dp->cstat   |= dp->ii.irb.scsw.cstat;
  2071.                 dp->intparm  = ioinfo[irq]->u_intparm;
  2072. }
  2073. else
  2074. {
  2075. dp->dstat    = dp->ii.irb.scsw.dstat;
  2076. dp->cstat    = dp->ii.irb.scsw.cstat;
  2077. dp->flag     = 0;   // reset status flags
  2078. dp->intparm  = 0;
  2079. } /* endif */
  2080. dp->lpum = dp->ii.irb.esw.esw1.lpum;
  2081. /*
  2082.  * reset device-busy bit if no longer set in irb
  2083.  */
  2084. if (    (dp->dstat & DEV_STAT_BUSY                   ) 
  2085.      && ((dp->ii.irb.scsw.dstat & DEV_STAT_BUSY) == 0))
  2086. {
  2087. dp->dstat &= ~DEV_STAT_BUSY;
  2088. } /* endif */
  2089. /*
  2090.  * Save residual count and CCW information in case primary and
  2091.  *  secondary status are presented with different interrupts.
  2092.  */
  2093. if ( dp->ii.irb.scsw.stctl
  2094.      & ( SCSW_STCTL_PRIM_STATUS | SCSW_STCTL_INTER_STATUS ) ) {
  2095. /*
  2096.  * If the subchannel status shows status pending
  2097.  * and we received a check condition, the count
  2098.  * information is not meaningful.
  2099.  */
  2100.  if ( !(    (dp->ii.irb.scsw.stctl & SCSW_STCTL_STATUS_PEND) 
  2101.  && (   dp->ii.irb.scsw.cstat 
  2102.       & (   SCHN_STAT_CHN_DATA_CHK
  2103.   | SCHN_STAT_CHN_CTRL_CHK
  2104.   | SCHN_STAT_INTF_CTRL_CHK
  2105.   | SCHN_STAT_PROG_CHECK
  2106.   | SCHN_STAT_PROT_CHECK
  2107.   | SCHN_STAT_CHAIN_CHECK )))) {
  2108.  dp->rescnt = dp->ii.irb.scsw.count;
  2109.  } else {
  2110.  dp->rescnt = SENSE_MAX_COUNT;
  2111.  }
  2112. dp->cpa    = dp->ii.irb.scsw.cpa;
  2113. #ifdef CONFIG_DEBUG_IO
  2114. if ( irq != cons_dev )
  2115. printk( KERN_DEBUG "s390_process_IRQ( %04X ) : "
  2116.         "residual count from irb after tsch() %dn",
  2117.         irq, dp->rescnt );
  2118. #endif
  2119. if (cio_debug_initialized)
  2120. debug_sprintf_event(cio_debug_msg_id, 6,
  2121.     "s390_process_IRQ( %04X ) : residual count from irq after tsch() %dn",
  2122.     irq, dp->rescnt);
  2123. } /* endif */
  2124. irb_cc = dp->ii.irb.scsw.cc;
  2125. //
  2126. // check for any kind of channel or interface control check but don't
  2127. //  issue the message for the console device
  2128. //
  2129. if (    (dp->ii.irb.scsw.cstat
  2130.             & (  SCHN_STAT_CHN_DATA_CHK
  2131.                | SCHN_STAT_CHN_CTRL_CHK
  2132.  | SCHN_STAT_INTF_CTRL_CHK )))
  2133. {
  2134. if (irq != cons_dev)
  2135. printk( KERN_WARNING "Channel-Check or Interface-Control-Check "
  2136. "receivedn"
  2137. " ... device %04X on subchannel %04X, dev_stat "
  2138. ": %02X sch_stat : %02Xn",
  2139. ioinfo[irq]->devstat.devno,
  2140. irq,
  2141. dp->dstat,
  2142. dp->cstat);
  2143. if (cio_debug_initialized) {
  2144. debug_sprintf_event(cio_debug_msg_id, 0,
  2145.     "Channel-Check or Interface-Control-Check receivedn");
  2146. debug_sprintf_event(cio_debug_msg_id, 0,
  2147.     "... device %04X on subchannel %04X, dev_stat: %02X sch_stat: %02Xn",
  2148.     ioinfo[irq]->devstat.devno, irq, dp->dstat, dp->cstat);
  2149. }
  2150. chnchk = 1;
  2151. } /* endif */
  2152. if( dp->ii.irb.scsw.ectl==0)
  2153. {
  2154. issense=0;
  2155. }
  2156. else if (    (dp->ii.irb.scsw.stctl == SCSW_STCTL_STATUS_PEND)
  2157.           && (dp->ii.irb.scsw.eswf  == 0                     ))
  2158. {
  2159. issense = 0;
  2160. }
  2161. else if (   (dp->ii.irb.scsw.stctl ==
  2162.       (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_INTER_STATUS)) 
  2163.  && ((dp->ii.irb.scsw.actl & SCSW_ACTL_SUSPENDED) == 0)  )
  2164. {
  2165. issense = 0;
  2166. }
  2167. else
  2168. {
  2169. issense = dp->ii.irb.esw.esw0.erw.cons;
  2170. } /* endif */
  2171. if ( issense )
  2172. {
  2173. dp->scnt  = dp->ii.irb.esw.esw0.erw.scnt;
  2174. dp->flag |= DEVSTAT_FLAG_SENSE_AVAIL;
  2175.                   
  2176. sdevstat = sizeof( devstat_t);
  2177. #ifdef CONFIG_DEBUG_IO
  2178. if ( irq != cons_dev )
  2179. printk( KERN_DEBUG "s390_process_IRQ( %04X ) : "
  2180.         "concurrent sense bytes avail %dn",
  2181.         irq, dp->scnt );
  2182. #endif
  2183. if (cio_debug_initialized)
  2184. debug_sprintf_event(cio_debug_msg_id, 4,
  2185.     "s390_process_IRQ( %04X ): concurrent sense bytes avail %dn",
  2186.     irq, dp->scnt);
  2187. }
  2188. else
  2189. {
  2190. /* don't copy the sense data area ! */
  2191. sdevstat = sizeof( devstat_t) - SENSE_MAX_COUNT;
  2192. } /* endif */
  2193. switch ( irb_cc ) {
  2194. case 1:      /* status pending */
  2195. dp->flag |= DEVSTAT_STATUS_PENDING;
  2196. case 0:      /* normal i/o interruption */
  2197. fctl  = dp->ii.irb.scsw.fctl;
  2198. stctl = dp->ii.irb.scsw.stctl;
  2199. actl  = dp->ii.irb.scsw.actl;
  2200. if ( chnchk )
  2201. {
  2202. sprintf( buffer, "s390_process_IRQ(%04X) - irb for "
  2203.          "device %04X after channel checkn",
  2204.          irq,
  2205.          dp->devno );
  2206. s390_displayhex( buffer,
  2207.                  &(dp->ii.irb) ,
  2208.                  sizeof(irb_t));
  2209. if (cio_debug_initialized) {
  2210. sprintf( buffer, "s390_process_IRQ(%04X) - irb for "
  2211.          "device %04X after channel checkn",
  2212.          irq,
  2213.          dp->devno );
  2214. s390_displayhex2( buffer,
  2215.   &(dp->ii.irb) ,
  2216.   sizeof(irb_t), 0);
  2217. }
  2218. } /* endif */
  2219. ioinfo[irq]->stctl |= stctl;
  2220. ending_status =    ( stctl & SCSW_STCTL_SEC_STATUS )
  2221.         || ( stctl == (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND) )
  2222.         || ( stctl == SCSW_STCTL_STATUS_PEND);
  2223. /*
  2224.  * Check for unsolicited interrupts - for debug purposes only
  2225.  *
  2226.  * We only consider an interrupt as unsolicited, if the device was not
  2227.  *  actively in use (busy) and an interrupt other than an ALERT status
  2228.  *  was received.
  2229.  *
  2230.  * Note: We must not issue a message to the console, if the
  2231.  *       unsolicited interrupt applies to the console device
  2232.  *       itself !
  2233.  */
  2234. if (    !( stctl & SCSW_STCTL_ALERT_STATUS )
  2235.      &&  ( ioinfo[irq]->ui.flags.busy == 0 ) )
  2236. {
  2237. #ifdef CONFIG_DEBUG_IO
  2238. if (irq != cons_dev)
  2239. printk( KERN_INFO "Unsolicited interrupt received for device %04X on subchannel %04Xn"
  2240. " ... device status : %02X subchannel status : %02Xn",
  2241. dp->devno,
  2242. irq,
  2243. dp->dstat,
  2244. dp->cstat);
  2245. sprintf( buffer, "s390_process_IRQ(%04X) - irb for "
  2246.          "device %04X, ending_status %dn",
  2247.          irq,
  2248.          dp->devno,
  2249.          ending_status);
  2250. s390_displayhex( buffer,
  2251.                  &(dp->ii.irb) ,
  2252.                  sizeof(irb_t));
  2253. #endif
  2254. if (cio_debug_initialized) {
  2255. debug_sprintf_event(cio_debug_msg_id, 2, 
  2256.     "Unsolicited interrupt received for device %04X on subchannel %04Xn"
  2257.     " ... device status : %02X subchannel status : %02Xn",
  2258.     dp->devno,
  2259.     irq,
  2260.     dp->dstat,
  2261.     dp->cstat);
  2262. sprintf( buffer, "s390_process_IRQ(%04X) - irb for "
  2263.  "device %04X, ending_status %dn",
  2264.  irq,
  2265.  dp->devno,
  2266.  ending_status);
  2267. s390_displayhex2( buffer,
  2268.  &(dp->ii.irb) ,
  2269.  sizeof(irb_t), 2);
  2270. }
  2271. } /* endif */
  2272. /*
  2273.  * take fast exit if no handler is available
  2274.  */
  2275. if ( !ioinfo[irq]->ui.flags.ready )
  2276. return( ending_status );     
  2277. /*
  2278.  * Check whether we must issue a SENSE CCW ourselves if there is no
  2279.  *  concurrent sense facility installed for the subchannel.
  2280.  *
  2281.  * Note: We should check for ioinfo[irq]->ui.flags.consns but VM
  2282.  *       violates the ESA/390 architecture and doesn't present an
  2283.  *       operand exception for virtual devices without concurrent
  2284.  *       sense facility available/supported when enabling the
  2285.  *       concurrent sense facility.
  2286.  */
  2287. if (    (    (dp->ii.irb.scsw.dstat & DEV_STAT_UNIT_CHECK )
  2288.           && (!issense                                    ) )
  2289.      || (ioinfo[irq]->ui.flags.delsense && ending_status    ) )
  2290. {
  2291. int            ret_io;
  2292. ccw1_t        *s_ccw  = &ioinfo[irq]->senseccw;
  2293. unsigned long  s_flag = 0;
  2294. if ( ending_status )
  2295. {
  2296. /*
  2297.  * We copy the current status information into the device driver
  2298.  *  status area. Then we can use the local devstat area for device
  2299.  *  sensing. When finally calling the IRQ handler we must not overlay
  2300.  *  the original device status but copy the sense data only.
  2301.  */
  2302. memcpy( udp, dp, sizeof( devstat_t) );
  2303. s_ccw->cmd_code = CCW_CMD_BASIC_SENSE;
  2304. s_ccw->cda      = (__u32)virt_to_phys( ioinfo[irq]->sense_data );
  2305. s_ccw->count    = SENSE_MAX_COUNT;
  2306. s_ccw->flags    = CCW_FLAG_SLI;
  2307. /*
  2308.  * If free_irq() or a sync do_IO/s390_start_IO() is in
  2309.  *  process we have to sense synchronously
  2310.  */
  2311. if ( ioinfo[irq]->ui.flags.unready || ioinfo[irq]->ui.flags.syncio )
  2312. {
  2313. s_flag = DOIO_WAIT_FOR_INTERRUPT;
  2314. } /* endif */
  2315. /*
  2316.  * Reset status info
  2317.  *
  2318.  * It does not matter whether this is a sync. or async.
  2319.  *  SENSE request, but we have to assure we don't call
  2320.  *  the irq handler now, but keep the irq in busy state.
  2321.  *  In sync. mode s390_process_IRQ() is called recursively,
  2322.  *  while in async. mode we re-enter do_IRQ() with the
  2323.  *  next interrupt.
  2324.  *
  2325.  * Note : this may be a delayed sense request !
  2326.  */
  2327. allow4handler                  = 0;
  2328. ioinfo[irq]->ui.flags.fast     = 0;
  2329. ioinfo[irq]->ui.flags.repall   = 0;
  2330. ioinfo[irq]->ui.flags.w4final  = 0;
  2331. ioinfo[irq]->ui.flags.delsense = 0;
  2332. dp->cstat     = 0;
  2333. dp->dstat     = 0;
  2334. dp->rescnt    = SENSE_MAX_COUNT;
  2335. ioinfo[irq]->ui.flags.w4sense  = 1;
  2336. ret_io = s390_start_IO( irq,
  2337.                         s_ccw,
  2338.                         0xE2C5D5E2,  // = SENSe
  2339.                         0,           // n/a
  2340.                         s_flag);
  2341. }
  2342. else
  2343. {
  2344. /*
  2345.  * we received an Unit Check but we have no final
  2346.  *  status yet, therefore we must delay the SENSE
  2347.  *  processing. However, we must not report this
  2348.  *  intermediate status to the device interrupt
  2349.  *  handler.
  2350.  */
  2351. ioinfo[irq]->ui.flags.fast     = 0;
  2352. ioinfo[irq]->ui.flags.repall   = 0;
  2353. ioinfo[irq]->ui.flags.delsense = 1;
  2354. allow4handler                  = 0;
  2355. } /* endif */
  2356. } /* endif */
  2357. /*
  2358.  * we allow for the device action handler if .
  2359.  *  - we received ending status
  2360.  *  - the action handler requested to see all interrupts
  2361.  *  - we received an intermediate status
  2362.  *  - fast notification was requested (primary status)
  2363.  *  - unsollicited interrupts
  2364.  *
  2365.  */
  2366. if ( allow4handler )
  2367. {
  2368. allow4handler =    ending_status
  2369. || ( ioinfo[irq]->ui.flags.repall                                      )
  2370. || ( stctl & SCSW_STCTL_INTER_STATUS                                   )
  2371. || ( (ioinfo[irq]->ui.flags.fast ) && (stctl & SCSW_STCTL_PRIM_STATUS) )
  2372. || ( ioinfo[irq]->ui.flags.oper == 0                                   );
  2373. } /* endif */
  2374. /*
  2375.  * We used to copy the device status information right before
  2376.  *  calling the device action handler. However, in status
  2377.  *  pending situations during do_IO() or halt_IO(), as well as
  2378.  *  enable_subchannel/disable_subchannel processing we must
  2379.  *  synchronously return the status information and must not
  2380.  *  call the device action handler.
  2381.  *
  2382.  */
  2383. if ( allow4handler )
  2384. {
  2385. /*
  2386.  * if we were waiting for sense data we copy the sense
  2387.  *  bytes only as the original status information was
  2388.  *  saved prior to sense already.
  2389.  */
  2390. if ( ioinfo[irq]->ui.flags.w4sense )
  2391. {
  2392. int sense_count = SENSE_MAX_COUNT-ioinfo[irq]->devstat.rescnt;
  2393. #ifdef CONFIG_DEBUG_IO
  2394. if ( irq != cons_dev )
  2395. printk( KERN_DEBUG "s390_process_IRQ( %04X ) : "
  2396. "BASIC SENSE bytes avail %dn",
  2397. irq, sense_count );
  2398. #endif
  2399. if (cio_debug_initialized)
  2400. debug_sprintf_event(cio_debug_msg_id, 4,
  2401.     "s390_process_IRQ( %04X ): BASIC SENSE bytes avail %dn",
  2402.     irq, sense_count);
  2403. ioinfo[irq]->ui.flags.w4sense = 0;
  2404. udp->flag |= DEVSTAT_FLAG_SENSE_AVAIL;
  2405. udp->scnt  = sense_count;
  2406. if ( sense_count >= 0 )
  2407. {
  2408. memcpy( udp->ii.sense.data,
  2409.         ioinfo[irq]->sense_data,
  2410.         sense_count);
  2411. }
  2412. else
  2413. {
  2414. panic( "s390_process_IRQ(%04x) encountered "
  2415.        "negative sense countn",
  2416.        irq);
  2417. } /* endif */
  2418. }
  2419. else
  2420. {
  2421. memcpy( udp, dp, sdevstat );
  2422. }  /* endif */
  2423. } /* endif */
  2424. /*
  2425.  * for status pending situations other than deferred interrupt
  2426.  *  conditions detected by s390_process_IRQ() itself we must not
  2427.  *  call the handler. This will synchronously be reported back
  2428.  *  to the caller instead, e.g. when detected during do_IO().
  2429.  */
  2430. if (    ioinfo[irq]->ui.flags.s_pend
  2431.      || ioinfo[irq]->ui.flags.unready
  2432.      || ioinfo[irq]->ui.flags.repnone )
  2433. {
  2434. if ( ending_status )
  2435. {
  2436. ioinfo[irq]->ui.flags.busy     = 0;
  2437. ioinfo[irq]->ui.flags.doio     = 0;
  2438. ioinfo[irq]->ui.flags.haltio   = 0;
  2439. ioinfo[irq]->ui.flags.fast     = 0;
  2440. ioinfo[irq]->ui.flags.repall   = 0;
  2441. ioinfo[irq]->ui.flags.w4final  = 0;
  2442. dp->flag  |= DEVSTAT_FINAL_STATUS;
  2443. udp->flag |= DEVSTAT_FINAL_STATUS;
  2444. } /* endif */
  2445. allow4handler = 0;
  2446. } /* endif */
  2447. /*
  2448.  * Call device action handler if applicable
  2449.  */
  2450. if ( allow4handler )
  2451. {
  2452. /*
  2453.  *  We only reset the busy condition when we are sure that no further
  2454.  *   interrupt is pending for the current I/O request (ending_status).
  2455.  */
  2456. if ( ending_status || !ioinfo[irq]->ui.flags.oper )
  2457. {
  2458. ioinfo[irq]->ui.flags.oper     = 1;  /* dev IS oper */
  2459. ioinfo[irq]->ui.flags.busy     = 0;
  2460. ioinfo[irq]->ui.flags.doio     = 0;
  2461. ioinfo[irq]->ui.flags.haltio   = 0;
  2462. ioinfo[irq]->ui.flags.fast     = 0;
  2463. ioinfo[irq]->ui.flags.repall   = 0;
  2464. ioinfo[irq]->ui.flags.w4final  = 0;
  2465. dp->flag  |= DEVSTAT_FINAL_STATUS;
  2466. udp->flag |= DEVSTAT_FINAL_STATUS;
  2467. ioinfo[irq]->irq_desc.handler( irq, udp, NULL );
  2468. //
  2469. // reset intparm after final status or we will badly present unsolicited
  2470. //  interrupts with a intparm value possibly no longer valid.
  2471. //
  2472. dp->intparm   = 0;
  2473. //
  2474. // Was there anything queued ? Start the pending channel program
  2475. //  if there is one.
  2476. //
  2477. if ( ioinfo[irq]->ui.flags.doio_q )
  2478. {
  2479. int ret;
  2480. ret = s390_start_IO( irq,
  2481.                      ioinfo[irq]->qcpa,
  2482.                      ioinfo[irq]->qintparm,
  2483.              ioinfo[irq]->qlpm,
  2484.                      ioinfo[irq]->qflag);
  2485. ioinfo[irq]->ui.flags.doio_q = 0;
  2486. /*
  2487.  * If s390_start_IO() failed call the device's interrupt
  2488.  *  handler, the IRQ related devstat area was setup by
  2489.  *  s390_start_IO() accordingly already (status pending
  2490.  *  condition).
  2491.  */
  2492. if ( ret )
  2493. {
  2494. ioinfo[irq]->irq_desc.handler( irq, udp, NULL );
  2495. } /* endif */
  2496. } /* endif */
  2497. }
  2498. else
  2499. {
  2500. ioinfo[irq]->ui.flags.w4final = 1;
  2501. /*
  2502.  * Eventually reset subchannel PCI status and
  2503.  *  set the PCI or SUSPENDED flag in the user
  2504.  *  device status block if appropriate.
  2505.  */
  2506. if ( dp->cstat & SCHN_STAT_PCI )
  2507. {
  2508. udp->flag |= DEVSTAT_PCI;
  2509. dp->cstat &= ~SCHN_STAT_PCI;
  2510. }
  2511. if ( actl & SCSW_ACTL_SUSPENDED )
  2512. {
  2513. udp->flag |= DEVSTAT_SUSPENDED;
  2514. } /* endif */
  2515. ioinfo[irq]->irq_desc.handler( irq, udp, NULL );
  2516. } /* endif */
  2517. } /* endif */
  2518. break;
  2519. case 3:      /* device/path not operational */
  2520. ioinfo[irq]->ui.flags.busy    = 0;
  2521. ioinfo[irq]->ui.flags.doio    = 0;
  2522. ioinfo[irq]->ui.flags.haltio  = 0;
  2523. dp->cstat    = 0;
  2524. dp->dstat    = 0;
  2525. if ( ioinfo[irq]->ulpm != ioinfo[irq]->opm )
  2526. {
  2527. /*
  2528.  * either it was the only path or it was restricted ...
  2529.  */
  2530. ioinfo[irq]->opm &= ~(ioinfo[irq]->devstat.ii.irb.esw.esw1.lpum);
  2531. }
  2532. else
  2533. {
  2534. ioinfo[irq]->opm = 0;
  2535. } /* endif */
  2536. if ( ioinfo[irq]->opm == 0 ) 
  2537. {
  2538. ioinfo[irq]->ui.flags.oper  = 0;
  2539. } /* endif */
  2540. ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER;
  2541. ioinfo[irq]->devstat.flag |= DEVSTAT_FINAL_STATUS;
  2542. /*
  2543.  * When we find a device "not oper" we save the status
  2544.  *  information into the device status area and call the
  2545.  *  device specific interrupt handler.
  2546.  *
  2547.  * Note: currently we don't have any way to reenable
  2548.  *       the device unless an unsolicited interrupt
  2549.  *       is presented. We don't check for spurious
  2550.  *       interrupts on "not oper" conditions.
  2551.  */
  2552. if (    ( ioinfo[irq]->ui.flags.fast    )
  2553.      && ( ioinfo[irq]->ui.flags.w4final ) )
  2554. {
  2555. /*
  2556.  * If a new request was queued already, we have
  2557.  *  to simulate the "not oper" status for the
  2558.  *  queued request by switching the "intparm" value
  2559.  *  and notify the interrupt handler.
  2560.  */
  2561. if ( ioinfo[irq]->ui.flags.doio_q )
  2562. {
  2563. ioinfo[irq]->devstat.intparm = ioinfo[irq]->qintparm;
  2564. } /* endif */
  2565. } /* endif */
  2566. ioinfo[irq]->ui.flags.fast    = 0;
  2567. ioinfo[irq]->ui.flags.repall  = 0;
  2568. ioinfo[irq]->ui.flags.w4final = 0;
  2569. /*
  2570.  * take fast exit if no handler is available
  2571.  */
  2572. if ( !ioinfo[irq]->ui.flags.ready )
  2573. return( ending_status );     
  2574. memcpy( udp, &(ioinfo[irq]->devstat), sdevstat );
  2575. ioinfo[irq]->devstat.intparm  = 0;
  2576. if ( !ioinfo[irq]->ui.flags.s_pend )
  2577. {
  2578. ioinfo[irq]->irq_desc.handler( irq, udp, NULL );
  2579. } /* endif */
  2580. ending_status    = 1;
  2581. break;
  2582. } /* endswitch */
  2583. return( ending_status );
  2584. }
  2585. /*
  2586.  * Set the special i/o-interruption sublass 7 for the
  2587.  *  device specified by parameter irq. There can only
  2588.  *  be a single device been operated on this special
  2589.  *  isc. This function is aimed being able to check
  2590.  *  on special device interrupts in disabled state,
  2591.  *  without having to delay I/O processing (by queueing)
  2592.  *  for non-console devices.
  2593.  *
  2594.  * Setting of this isc is done by set_cons_dev(), while
  2595.  *  reset_cons_dev() resets this isc and re-enables the
  2596.  *  default isc3 for this device. wait_cons_dev() allows
  2597.  *  to actively wait on an interrupt for this device in
  2598.  *  disabed state. When the interrupt condition is
  2599.  *  encountered, wait_cons_dev(9 calls do_IRQ() to have
  2600.  *  the console device driver processing the interrupt.
  2601.  */
  2602. int set_cons_dev( int irq )
  2603. {
  2604. int           ccode;
  2605. unsigned long cr6 __attribute__ ((aligned (8)));
  2606. int           rc = 0;
  2607. char dbf_txt[15];
  2608. SANITY_CHECK(irq);
  2609. if ( cons_dev != -1  )
  2610. {
  2611. rc = -EBUSY;
  2612. }
  2613. else
  2614. {
  2615. if (cio_debug_initialized) {
  2616. sprintf(dbf_txt, "scons%x", irq);
  2617. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  2618. }
  2619. /*
  2620.  * modify the indicated console device to operate
  2621.  *  on special console interrupt sublass 7
  2622.  */
  2623. ccode = stsch( irq, &(ioinfo[irq]->schib) );
  2624. if (ccode)
  2625. {
  2626. rc                         = -ENODEV;
  2627. ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER;
  2628. }
  2629. else
  2630. {
  2631. ioinfo[irq]->schib.pmcw.isc = 7;
  2632. ccode = msch( irq, &(ioinfo[irq]->schib) );
  2633. if (ccode)
  2634. {
  2635. rc = -EIO;
  2636. }
  2637. else
  2638. {
  2639. cons_dev = irq;
  2640. /*
  2641.  * enable console I/O-interrupt sublass 7
  2642.  */
  2643. __ctl_store( cr6, 6, 6);
  2644. cr6 |= 0x01000000;
  2645. __ctl_load( cr6, 6, 6);
  2646. } /* endif */
  2647. } /* endif */
  2648. } /* endif */
  2649. return( rc);
  2650. }
  2651. int reset_cons_dev( int irq)
  2652. {
  2653. int     rc = 0;
  2654. int     ccode;
  2655. long    cr6 __attribute__ ((aligned (8)));
  2656. char dbf_txt[15];
  2657. SANITY_CHECK(irq);
  2658. if ( cons_dev != -1  )
  2659. {
  2660. rc = -EBUSY;
  2661. }
  2662. else
  2663. {
  2664. if (cio_debug_initialized) {
  2665. sprintf(dbf_txt, "rcons%x", irq);
  2666. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  2667. }
  2668. /*
  2669.  * reset the indicated console device to operate
  2670.  *  on default console interrupt sublass 3
  2671.  */
  2672. ccode = stsch( irq, &(ioinfo[irq]->schib) );
  2673. if (ccode)
  2674. {
  2675. rc                         = -ENODEV;
  2676. ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER;
  2677. }
  2678. else
  2679. {
  2680. ioinfo[irq]->schib.pmcw.isc = 3;
  2681. ccode = msch( irq, &(ioinfo[irq]->schib) );
  2682. if (ccode)
  2683. {
  2684. rc = -EIO;
  2685. }
  2686. else
  2687. {
  2688. cons_dev = -1;
  2689. /*
  2690.  * disable special console I/O-interrupt sublass 7
  2691.  */
  2692. __ctl_store( cr6, 6, 6);
  2693. cr6 &= 0xFEFFFFFF;
  2694. __ctl_load( cr6, 6, 6);
  2695. } /* endif */
  2696. } /* endif */
  2697. } /* endif */
  2698. return( rc);
  2699. }
  2700. int wait_cons_dev( int irq )
  2701. {
  2702. int              rc = 0;
  2703. long             save_cr6;
  2704. char dbf_txt[15];
  2705. if ( irq == cons_dev )
  2706. {
  2707. if (cio_debug_initialized) {
  2708. sprintf(dbf_txt, "wcons%x", irq);
  2709. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  2710. }
  2711. /*
  2712.  * before entering the spinlock we may already have
  2713.  *  processed the interrupt on a different CPU ...
  2714.  */
  2715. if ( ioinfo[irq]->ui.flags.busy == 1 )
  2716. {
  2717. long cr6 __attribute__ ((aligned (8)));
  2718. /*
  2719.  * disable all, but isc 7 (console device)
  2720.  */
  2721. __ctl_store( cr6, 6, 6);
  2722. save_cr6  = cr6;
  2723. cr6      &= 0x01FFFFFF;
  2724. __ctl_load( cr6, 6, 6);
  2725. do {
  2726. tpi_info_t tpi_info = {0,};
  2727. if (tpi(&tpi_info) == 1) {
  2728. s390_process_IRQ( tpi_info.irq );
  2729. } else {
  2730. s390irq_spin_unlock(irq);
  2731. udelay(100);
  2732. s390irq_spin_lock(irq);
  2733. }
  2734. eieio();
  2735. } while (ioinfo[irq]->ui.flags.busy == 1);
  2736. /*
  2737.  * restore previous isc value
  2738.  */
  2739. cr6 = save_cr6;
  2740. __ctl_load( cr6, 6, 6);
  2741. } /* endif */
  2742. }
  2743. else
  2744. {
  2745. rc = EINVAL;
  2746. } /* endif */
  2747. return(rc);
  2748. }
  2749. int enable_cpu_sync_isc( int irq )
  2750. {
  2751. int             ccode;
  2752. long            cr6 __attribute__ ((aligned (8)));
  2753. int             retry = 3;
  2754. int             rc    = 0;
  2755. char dbf_txt[15];
  2756. if (cio_debug_initialized) {
  2757. sprintf(dbf_txt, "enisc%x", irq);
  2758. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  2759. }
  2760. /* This one spins until it can get the sync_isc lock for irq# irq */
  2761. if ( irq <= highest_subchannel && ioinfo[irq] != INVALID_STORAGE_AREA )
  2762. {
  2763. if ( atomic_read( &sync_isc ) != irq )
  2764. atomic_compare_and_swap_spin( -1, irq, &sync_isc );
  2765. sync_isc_cnt++;
  2766. if ( sync_isc_cnt > 255 ) /* fixme : magic number */
  2767. {
  2768. panic("Too many recursive calls to enable_sync_isc");
  2769. }
  2770. /*
  2771.  * we only run the STSCH/MSCH path for the first enablement
  2772.  */
  2773. else if ( sync_isc_cnt == 1 )
  2774. {
  2775. ioinfo[irq]->ui.flags.syncio = 1;
  2776. ccode = stsch( irq, &(ioinfo[irq]->schib) );
  2777. if ( !ccode )
  2778. {
  2779. ioinfo[irq]->schib.pmcw.isc = 5;
  2780. do
  2781. {
  2782. ccode = msch( irq,
  2783.               &(ioinfo[irq]->schib) );
  2784. switch (ccode) {
  2785. case 0: 
  2786. /*
  2787.  * enable special isc
  2788.  */
  2789. __ctl_store( cr6, 6, 6);
  2790. cr6 |= 0x04000000;  // enable sync isc 5
  2791. cr6 &= 0xEFFFFFFF;  // disable standard isc 3
  2792. __ctl_load( cr6, 6, 6);
  2793. retry = 0;
  2794. break;
  2795. case 1:
  2796. //
  2797. // process pending status
  2798. //
  2799. ioinfo[irq]->ui.flags.s_pend = 1;
  2800. s390_process_IRQ( irq );
  2801. ioinfo[irq]->ui.flags.s_pend = 0;
  2802. rc = -EIO;  /* might be overwritten... */
  2803. retry--;
  2804. break;
  2805. case 2: /* busy */
  2806. retry = 0;
  2807. rc = -EBUSY; 
  2808. break;
  2809. case 3: /* not oper*/
  2810. retry = 0;
  2811. rc = -ENODEV; 
  2812. break;
  2813. }
  2814. } while ( retry );
  2815. }
  2816. else
  2817. {
  2818. rc = -ENODEV;     // device is not-operational
  2819. } /* endif */
  2820. } /* endif */
  2821. if ( rc ) /* can only happen if stsch/msch fails */
  2822. {
  2823. sync_isc_cnt = 0;
  2824. atomic_set( &sync_isc, -1);
  2825. }
  2826. }
  2827. else
  2828. {
  2829. #ifdef CONFIG_SYNC_ISC_PARANOIA
  2830. panic( "enable_sync_isc: called with invalid %xn", irq );
  2831. #endif
  2832. rc = -EINVAL;
  2833. } /* endif */
  2834. return( rc);
  2835. }
  2836. int disable_cpu_sync_isc( int irq)
  2837. {
  2838. int     rc         = 0;
  2839. int     retry1     = 5;
  2840. int     retry2     = 5;
  2841. int     clear_pend = 0;
  2842. int     ccode;
  2843. long    cr6 __attribute__ ((aligned (8)));
  2844. char dbf_txt[15];
  2845. if (cio_debug_initialized) {
  2846. sprintf(dbf_txt, "disisc%x", irq);
  2847. debug_text_event(cio_debug_trace_id, 4, dbf_txt);
  2848. }
  2849. if ( irq <= highest_subchannel && ioinfo[irq] != INVALID_STORAGE_AREA )
  2850. {
  2851. /*
  2852.  * We disable if we're the top user only, as we may
  2853.  *  run recursively ...
  2854.  * We must not decrease the count immediately; during
  2855.  *  msch() processing we may face another pending
  2856.  *  status we have to process recursively (sync).
  2857.  */
  2858. #ifdef CONFIG_SYNC_ISC_PARANOIA
  2859. if ( atomic_read( &sync_isc ) != irq )
  2860. panic( "disable_sync_isc: called for %x while %x lockedn",
  2861. irq, atomic_read( &sync_isc ) );
  2862. #endif
  2863. if ( sync_isc_cnt == 1 )
  2864. {
  2865. ccode = stsch( irq, &(ioinfo[irq]->schib) );
  2866. ioinfo[irq]->schib.pmcw.isc = 3;
  2867. do
  2868. {
  2869.         retry2 = 5;
  2870. do
  2871. {
  2872. ccode = msch( irq, &(ioinfo[irq]->schib) );
  2873. switch ( ccode ) {
  2874. case 0:
  2875. /*
  2876.  * disable special interrupt subclass in CPU
  2877.  */
  2878. __ctl_store( cr6, 6, 6);
  2879. cr6 &= 0xFBFFFFFF; // disable sync isc 5
  2880. cr6 |= 0x10000000; // enable standard isc 3
  2881. __ctl_load( cr6, 6, 6);
  2882. retry2 = 0;
  2883. break;
  2884. case 1: /* status pending */
  2885. ioinfo[irq]->ui.flags.s_pend = 1;
  2886. s390_process_IRQ( irq );
  2887. ioinfo[irq]->ui.flags.s_pend = 0;
  2888. retry2--;
  2889. break;
  2890. case 2: /* busy */
  2891.         retry2--;
  2892. udelay( 100); // give it time
  2893. break;
  2894. default: /* not oper */
  2895. retry2 = 0;
  2896. break;
  2897. } /* endswitch */
  2898. } while ( retry2 );
  2899. retry1--;
  2900. /* try stopping it ... */
  2901. if ( (ccode) && !clear_pend )
  2902. {
  2903. clear_IO( irq, 0x00004711, 0 );
  2904. clear_pend = 1;
  2905.                
  2906. } /* endif */
  2907. udelay( 100);
  2908. } while ( retry1 && ccode );
  2909. ioinfo[irq]->ui.flags.syncio = 0;
  2910. sync_isc_cnt = 0;
  2911. atomic_set( &sync_isc, -1);
  2912. }
  2913. else
  2914. {
  2915. sync_isc_cnt--;
  2916. } /* endif */
  2917. }
  2918. else
  2919. {
  2920. #ifdef CONFIG_SYNC_ISC_PARANOIA
  2921. if ( atomic_read( &sync_isc ) != -1 )
  2922. panic( "disable_sync_isc: called with invalid %x while %x lockedn", 
  2923. irq, atomic_read( &sync_isc ) );
  2924. #endif
  2925. rc = -EINVAL;
  2926. } /* endif */
  2927. return( rc);
  2928. }
  2929. //
  2930. // Input :
  2931. //   devno - device number
  2932. //   ps    - pointer to sense ID data area
  2933. //
  2934. // Output : none
  2935. //
  2936. void VM_virtual_device_info( __u16      devno,
  2937.                              senseid_t *ps )
  2938. {
  2939. diag210_t  *p_diag_data;
  2940. int        ccode;
  2941. int        error = 0;
  2942. if (cio_debug_initialized) 
  2943. debug_text_event(cio_debug_trace_id, 4, "VMvdinf");
  2944. if ( init_IRQ_complete )
  2945. {
  2946. p_diag_data = kmalloc( sizeof( diag210_t), GFP_DMA );
  2947. }
  2948. else
  2949. {
  2950. p_diag_data = alloc_bootmem_low( sizeof( diag210_t));
  2951. } /* endif */
  2952. p_diag_data->vrdcdvno = devno;
  2953. p_diag_data->vrdclen  = sizeof( diag210_t);
  2954. ccode                 = diag210( (diag210_t *)virt_to_phys( p_diag_data ) );
  2955. ps->reserved          = 0xff;
  2956. switch (p_diag_data->vrdcvcla) {
  2957. case 0x80:
  2958. switch (p_diag_data->vrdcvtyp) {
  2959. case 00:
  2960. ps->cu_type   = 0x3215;
  2961. break;
  2962. default:
  2963. error = 1;
  2964. break;
  2965. } /* endswitch */
  2966. break;
  2967. case 0x40:
  2968. switch (p_diag_data->vrdcvtyp) {
  2969. case 0xC0:
  2970. ps->cu_type   = 0x5080;
  2971. break;
  2972. case 0x80:
  2973. ps->cu_type   = 0x2250;
  2974. break;
  2975. case 0x04:
  2976. ps->cu_type   = 0x3277;
  2977. break;
  2978. case 0x01:
  2979. ps->cu_type   = 0x3278;
  2980. break;
  2981. default:
  2982. error = 1;
  2983. break;
  2984. } /* endswitch */
  2985. break;
  2986. case 0x20:
  2987. switch (p_diag_data->vrdcvtyp) {
  2988. case 0x84:
  2989. ps->cu_type   = 0x3505;
  2990. break;
  2991. case 0x82:
  2992. ps->cu_type   = 0x2540;
  2993. break;
  2994. case 0x81:
  2995. ps->cu_type   = 0x2501;
  2996. break;
  2997. default:
  2998. error = 1;
  2999. break;
  3000. } /* endswitch */
  3001. break;
  3002. case 0x10:
  3003. switch (p_diag_data->vrdcvtyp) {
  3004. case 0x84:
  3005. ps->cu_type   = 0x3525;
  3006. break;
  3007. case 0x82:
  3008. ps->cu_type   = 0x2540;
  3009. break;
  3010. case 0x4F: