s390io.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:198k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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