1 /* 2 * IUCV base infrastructure. 3 * 4 * Copyright 2001, 2006 IBM Deutschland Entwicklung GmbH, IBM Corporation 5 * Author(s): 6 * Original source: 7 * Alan Altmark (Alan_Altmark@us.ibm.com) Sept. 2000 8 * Xenia Tkatschow (xenia@us.ibm.com) 9 * 2Gb awareness and general cleanup: 10 * Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com) 11 * Rewritten for af_iucv: 12 * Martin Schwidefsky <schwidefsky@de.ibm.com> 13 * 14 * Documentation used: 15 * The original source 16 * CP Programming Service, IBM document # SC24-5760 17 * 18 * This program is free software; you can redistribute it and/or modify 19 * it under the terms of the GNU General Public License as published by 20 * the Free Software Foundation; either version 2, or (at your option) 21 * any later version. 22 * 23 * This program is distributed in the hope that it will be useful, 24 * but WITHOUT ANY WARRANTY; without even the implied warranty of 25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 * GNU General Public License for more details. 27 * 28 * You should have received a copy of the GNU General Public License 29 * along with this program; if not, write to the Free Software 30 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 31 */ 32 33 #include <linux/module.h> 34 #include <linux/moduleparam.h> 35 #include <linux/spinlock.h> 36 #include <linux/kernel.h> 37 #include <linux/slab.h> 38 #include <linux/init.h> 39 #include <linux/interrupt.h> 40 #include <linux/list.h> 41 #include <linux/errno.h> 42 #include <linux/err.h> 43 #include <linux/device.h> 44 #include <linux/cpu.h> 45 #include <net/iucv/iucv.h> 46 #include <asm/atomic.h> 47 #include <asm/ebcdic.h> 48 #include <asm/io.h> 49 #include <asm/s390_ext.h> 50 #include <asm/s390_rdev.h> 51 #include <asm/smp.h> 52 53 /* 54 * FLAGS: 55 * All flags are defined in the field IPFLAGS1 of each function 56 * and can be found in CP Programming Services. 57 * IPSRCCLS - Indicates you have specified a source class. 58 * IPTRGCLS - Indicates you have specified a target class. 59 * IPFGPID - Indicates you have specified a pathid. 60 * IPFGMID - Indicates you have specified a message ID. 61 * IPNORPY - Indicates a one-way message. No reply expected. 62 * IPALL - Indicates that all paths are affected. 63 */ 64 #define IUCV_IPSRCCLS 0x01 65 #define IUCV_IPTRGCLS 0x01 66 #define IUCV_IPFGPID 0x02 67 #define IUCV_IPFGMID 0x04 68 #define IUCV_IPNORPY 0x10 69 #define IUCV_IPALL 0x80 70 71 static int iucv_bus_match(struct device *dev, struct device_driver *drv) 72 { 73 return 0; 74 } 75 76 struct bus_type iucv_bus = { 77 .name = "iucv", 78 .match = iucv_bus_match, 79 }; 80 EXPORT_SYMBOL(iucv_bus); 81 82 struct device *iucv_root; 83 EXPORT_SYMBOL(iucv_root); 84 85 static int iucv_available; 86 87 /* General IUCV interrupt structure */ 88 struct iucv_irq_data { 89 u16 ippathid; 90 u8 ipflags1; 91 u8 iptype; 92 u32 res2[8]; 93 }; 94 95 struct iucv_irq_list { 96 struct list_head list; 97 struct iucv_irq_data data; 98 }; 99 100 static struct iucv_irq_data *iucv_irq_data[NR_CPUS]; 101 static cpumask_t iucv_buffer_cpumask = CPU_MASK_NONE; 102 static cpumask_t iucv_irq_cpumask = CPU_MASK_NONE; 103 104 /* 105 * Queue of interrupt buffers lock for delivery via the tasklet 106 * (fast but can't call smp_call_function). 107 */ 108 static LIST_HEAD(iucv_task_queue); 109 110 /* 111 * The tasklet for fast delivery of iucv interrupts. 112 */ 113 static void iucv_tasklet_fn(unsigned long); 114 static DECLARE_TASKLET(iucv_tasklet, iucv_tasklet_fn,0); 115 116 /* 117 * Queue of interrupt buffers for delivery via a work queue 118 * (slower but can call smp_call_function). 119 */ 120 static LIST_HEAD(iucv_work_queue); 121 122 /* 123 * The work element to deliver path pending interrupts. 124 */ 125 static void iucv_work_fn(struct work_struct *work); 126 static DECLARE_WORK(iucv_work, iucv_work_fn); 127 128 /* 129 * Spinlock protecting task and work queue. 130 */ 131 static DEFINE_SPINLOCK(iucv_queue_lock); 132 133 enum iucv_command_codes { 134 IUCV_QUERY = 0, 135 IUCV_RETRIEVE_BUFFER = 2, 136 IUCV_SEND = 4, 137 IUCV_RECEIVE = 5, 138 IUCV_REPLY = 6, 139 IUCV_REJECT = 8, 140 IUCV_PURGE = 9, 141 IUCV_ACCEPT = 10, 142 IUCV_CONNECT = 11, 143 IUCV_DECLARE_BUFFER = 12, 144 IUCV_QUIESCE = 13, 145 IUCV_RESUME = 14, 146 IUCV_SEVER = 15, 147 IUCV_SETMASK = 16, 148 }; 149 150 /* 151 * Error messages that are used with the iucv_sever function. They get 152 * converted to EBCDIC. 153 */ 154 static char iucv_error_no_listener[16] = "NO LISTENER"; 155 static char iucv_error_no_memory[16] = "NO MEMORY"; 156 static char iucv_error_pathid[16] = "INVALID PATHID"; 157 158 /* 159 * iucv_handler_list: List of registered handlers. 160 */ 161 static LIST_HEAD(iucv_handler_list); 162 163 /* 164 * iucv_path_table: an array of iucv_path structures. 165 */ 166 static struct iucv_path **iucv_path_table; 167 static unsigned long iucv_max_pathid; 168 169 /* 170 * iucv_lock: spinlock protecting iucv_handler_list and iucv_pathid_table 171 */ 172 static DEFINE_SPINLOCK(iucv_table_lock); 173 174 /* 175 * iucv_active_cpu: contains the number of the cpu executing the tasklet 176 * or the work handler. Needed for iucv_path_sever called from tasklet. 177 */ 178 static int iucv_active_cpu = -1; 179 180 /* 181 * Mutex and wait queue for iucv_register/iucv_unregister. 182 */ 183 static DEFINE_MUTEX(iucv_register_mutex); 184 185 /* 186 * Counter for number of non-smp capable handlers. 187 */ 188 static int iucv_nonsmp_handler; 189 190 /* 191 * IUCV control data structure. Used by iucv_path_accept, iucv_path_connect, 192 * iucv_path_quiesce and iucv_path_sever. 193 */ 194 struct iucv_cmd_control { 195 u16 ippathid; 196 u8 ipflags1; 197 u8 iprcode; 198 u16 ipmsglim; 199 u16 res1; 200 u8 ipvmid[8]; 201 u8 ipuser[16]; 202 u8 iptarget[8]; 203 } __attribute__ ((packed,aligned(8))); 204 205 /* 206 * Data in parameter list iucv structure. Used by iucv_message_send, 207 * iucv_message_send2way and iucv_message_reply. 208 */ 209 struct iucv_cmd_dpl { 210 u16 ippathid; 211 u8 ipflags1; 212 u8 iprcode; 213 u32 ipmsgid; 214 u32 iptrgcls; 215 u8 iprmmsg[8]; 216 u32 ipsrccls; 217 u32 ipmsgtag; 218 u32 ipbfadr2; 219 u32 ipbfln2f; 220 u32 res; 221 } __attribute__ ((packed,aligned(8))); 222 223 /* 224 * Data in buffer iucv structure. Used by iucv_message_receive, 225 * iucv_message_reject, iucv_message_send, iucv_message_send2way 226 * and iucv_declare_cpu. 227 */ 228 struct iucv_cmd_db { 229 u16 ippathid; 230 u8 ipflags1; 231 u8 iprcode; 232 u32 ipmsgid; 233 u32 iptrgcls; 234 u32 ipbfadr1; 235 u32 ipbfln1f; 236 u32 ipsrccls; 237 u32 ipmsgtag; 238 u32 ipbfadr2; 239 u32 ipbfln2f; 240 u32 res; 241 } __attribute__ ((packed,aligned(8))); 242 243 /* 244 * Purge message iucv structure. Used by iucv_message_purge. 245 */ 246 struct iucv_cmd_purge { 247 u16 ippathid; 248 u8 ipflags1; 249 u8 iprcode; 250 u32 ipmsgid; 251 u8 ipaudit[3]; 252 u8 res1[5]; 253 u32 res2; 254 u32 ipsrccls; 255 u32 ipmsgtag; 256 u32 res3[3]; 257 } __attribute__ ((packed,aligned(8))); 258 259 /* 260 * Set mask iucv structure. Used by iucv_enable_cpu. 261 */ 262 struct iucv_cmd_set_mask { 263 u8 ipmask; 264 u8 res1[2]; 265 u8 iprcode; 266 u32 res2[9]; 267 } __attribute__ ((packed,aligned(8))); 268 269 union iucv_param { 270 struct iucv_cmd_control ctrl; 271 struct iucv_cmd_dpl dpl; 272 struct iucv_cmd_db db; 273 struct iucv_cmd_purge purge; 274 struct iucv_cmd_set_mask set_mask; 275 }; 276 277 /* 278 * Anchor for per-cpu IUCV command parameter block. 279 */ 280 static union iucv_param *iucv_param[NR_CPUS]; 281 282 /** 283 * iucv_call_b2f0 284 * @code: identifier of IUCV call to CP. 285 * @parm: pointer to a struct iucv_parm block 286 * 287 * Calls CP to execute IUCV commands. 288 * 289 * Returns the result of the CP IUCV call. 290 */ 291 static inline int iucv_call_b2f0(int command, union iucv_param *parm) 292 { 293 register unsigned long reg0 asm ("0"); 294 register unsigned long reg1 asm ("1"); 295 int ccode; 296 297 reg0 = command; 298 reg1 = virt_to_phys(parm); 299 asm volatile( 300 " .long 0xb2f01000\n" 301 " ipm %0\n" 302 " srl %0,28\n" 303 : "=d" (ccode), "=m" (*parm), "+d" (reg0), "+a" (reg1) 304 : "m" (*parm) : "cc"); 305 return (ccode == 1) ? parm->ctrl.iprcode : ccode; 306 } 307 308 /** 309 * iucv_query_maxconn 310 * 311 * Determines the maximum number of connections that may be established. 312 * 313 * Returns the maximum number of connections or -EPERM is IUCV is not 314 * available. 315 */ 316 static int iucv_query_maxconn(void) 317 { 318 register unsigned long reg0 asm ("0"); 319 register unsigned long reg1 asm ("1"); 320 void *param; 321 int ccode; 322 323 param = kzalloc(sizeof(union iucv_param), GFP_KERNEL|GFP_DMA); 324 if (!param) 325 return -ENOMEM; 326 reg0 = IUCV_QUERY; 327 reg1 = (unsigned long) param; 328 asm volatile ( 329 " .long 0xb2f01000\n" 330 " ipm %0\n" 331 " srl %0,28\n" 332 : "=d" (ccode), "+d" (reg0), "+d" (reg1) : : "cc"); 333 if (ccode == 0) 334 iucv_max_pathid = reg0; 335 kfree(param); 336 return ccode ? -EPERM : 0; 337 } 338 339 /** 340 * iucv_allow_cpu 341 * @data: unused 342 * 343 * Allow iucv interrupts on this cpu. 344 */ 345 static void iucv_allow_cpu(void *data) 346 { 347 int cpu = smp_processor_id(); 348 union iucv_param *parm; 349 350 /* 351 * Enable all iucv interrupts. 352 * ipmask contains bits for the different interrupts 353 * 0x80 - Flag to allow nonpriority message pending interrupts 354 * 0x40 - Flag to allow priority message pending interrupts 355 * 0x20 - Flag to allow nonpriority message completion interrupts 356 * 0x10 - Flag to allow priority message completion interrupts 357 * 0x08 - Flag to allow IUCV control interrupts 358 */ 359 parm = iucv_param[cpu]; 360 memset(parm, 0, sizeof(union iucv_param)); 361 parm->set_mask.ipmask = 0xf8; 362 iucv_call_b2f0(IUCV_SETMASK, parm); 363 364 /* Set indication that iucv interrupts are allowed for this cpu. */ 365 cpu_set(cpu, iucv_irq_cpumask); 366 } 367 368 /** 369 * iucv_block_cpu 370 * @data: unused 371 * 372 * Block iucv interrupts on this cpu. 373 */ 374 static void iucv_block_cpu(void *data) 375 { 376 int cpu = smp_processor_id(); 377 union iucv_param *parm; 378 379 /* Disable all iucv interrupts. */ 380 parm = iucv_param[cpu]; 381 memset(parm, 0, sizeof(union iucv_param)); 382 iucv_call_b2f0(IUCV_SETMASK, parm); 383 384 /* Clear indication that iucv interrupts are allowed for this cpu. */ 385 cpu_clear(cpu, iucv_irq_cpumask); 386 } 387 388 /** 389 * iucv_declare_cpu 390 * @data: unused 391 * 392 * Declare a interrupt buffer on this cpu. 393 */ 394 static void iucv_declare_cpu(void *data) 395 { 396 int cpu = smp_processor_id(); 397 union iucv_param *parm; 398 int rc; 399 400 if (cpu_isset(cpu, iucv_buffer_cpumask)) 401 return; 402 403 /* Declare interrupt buffer. */ 404 parm = iucv_param[cpu]; 405 memset(parm, 0, sizeof(union iucv_param)); 406 parm->db.ipbfadr1 = virt_to_phys(iucv_irq_data[cpu]); 407 rc = iucv_call_b2f0(IUCV_DECLARE_BUFFER, parm); 408 if (rc) { 409 char *err = "Unknown"; 410 switch (rc) { 411 case 0x03: 412 err = "Directory error"; 413 break; 414 case 0x0a: 415 err = "Invalid length"; 416 break; 417 case 0x13: 418 err = "Buffer already exists"; 419 break; 420 case 0x3e: 421 err = "Buffer overlap"; 422 break; 423 case 0x5c: 424 err = "Paging or storage error"; 425 break; 426 } 427 printk(KERN_WARNING "iucv_register: iucv_declare_buffer " 428 "on cpu %i returned error 0x%02x (%s)\n", cpu, rc, err); 429 return; 430 } 431 432 /* Set indication that an iucv buffer exists for this cpu. */ 433 cpu_set(cpu, iucv_buffer_cpumask); 434 435 if (iucv_nonsmp_handler == 0 || cpus_empty(iucv_irq_cpumask)) 436 /* Enable iucv interrupts on this cpu. */ 437 iucv_allow_cpu(NULL); 438 else 439 /* Disable iucv interrupts on this cpu. */ 440 iucv_block_cpu(NULL); 441 } 442 443 /** 444 * iucv_retrieve_cpu 445 * @data: unused 446 * 447 * Retrieve interrupt buffer on this cpu. 448 */ 449 static void iucv_retrieve_cpu(void *data) 450 { 451 int cpu = smp_processor_id(); 452 union iucv_param *parm; 453 454 if (!cpu_isset(cpu, iucv_buffer_cpumask)) 455 return; 456 457 /* Block iucv interrupts. */ 458 iucv_block_cpu(NULL); 459 460 /* Retrieve interrupt buffer. */ 461 parm = iucv_param[cpu]; 462 iucv_call_b2f0(IUCV_RETRIEVE_BUFFER, parm); 463 464 /* Clear indication that an iucv buffer exists for this cpu. */ 465 cpu_clear(cpu, iucv_buffer_cpumask); 466 } 467 468 /** 469 * iucv_setmask_smp 470 * 471 * Allow iucv interrupts on all cpus. 472 */ 473 static void iucv_setmask_mp(void) 474 { 475 int cpu; 476 477 preempt_disable(); 478 for_each_online_cpu(cpu) 479 /* Enable all cpus with a declared buffer. */ 480 if (cpu_isset(cpu, iucv_buffer_cpumask) && 481 !cpu_isset(cpu, iucv_irq_cpumask)) 482 smp_call_function_single(cpu, iucv_allow_cpu, 483 NULL, 0, 1); 484 preempt_enable(); 485 } 486 487 /** 488 * iucv_setmask_up 489 * 490 * Allow iucv interrupts on a single cpu. 491 */ 492 static void iucv_setmask_up(void) 493 { 494 cpumask_t cpumask; 495 int cpu; 496 497 /* Disable all cpu but the first in cpu_irq_cpumask. */ 498 cpumask = iucv_irq_cpumask; 499 cpu_clear(first_cpu(iucv_irq_cpumask), cpumask); 500 for_each_cpu_mask(cpu, cpumask) 501 smp_call_function_single(cpu, iucv_block_cpu, NULL, 0, 1); 502 } 503 504 /** 505 * iucv_enable 506 * 507 * This function makes iucv ready for use. It allocates the pathid 508 * table, declares an iucv interrupt buffer and enables the iucv 509 * interrupts. Called when the first user has registered an iucv 510 * handler. 511 */ 512 static int iucv_enable(void) 513 { 514 size_t alloc_size; 515 int cpu, rc; 516 517 rc = -ENOMEM; 518 alloc_size = iucv_max_pathid * sizeof(struct iucv_path); 519 iucv_path_table = kzalloc(alloc_size, GFP_KERNEL); 520 if (!iucv_path_table) 521 goto out; 522 /* Declare per cpu buffers. */ 523 rc = -EIO; 524 preempt_disable(); 525 for_each_online_cpu(cpu) 526 smp_call_function_single(cpu, iucv_declare_cpu, NULL, 0, 1); 527 preempt_enable(); 528 if (cpus_empty(iucv_buffer_cpumask)) 529 /* No cpu could declare an iucv buffer. */ 530 goto out_path; 531 return 0; 532 533 out_path: 534 kfree(iucv_path_table); 535 out: 536 return rc; 537 } 538 539 /** 540 * iucv_disable 541 * 542 * This function shuts down iucv. It disables iucv interrupts, retrieves 543 * the iucv interrupt buffer and frees the pathid table. Called after the 544 * last user unregister its iucv handler. 545 */ 546 static void iucv_disable(void) 547 { 548 on_each_cpu(iucv_retrieve_cpu, NULL, 0, 1); 549 kfree(iucv_path_table); 550 } 551 552 static int __cpuinit iucv_cpu_notify(struct notifier_block *self, 553 unsigned long action, void *hcpu) 554 { 555 cpumask_t cpumask; 556 long cpu = (long) hcpu; 557 558 switch (action) { 559 case CPU_UP_PREPARE: 560 case CPU_UP_PREPARE_FROZEN: 561 iucv_irq_data[cpu] = kmalloc_node(sizeof(struct iucv_irq_data), 562 GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); 563 if (!iucv_irq_data[cpu]) 564 return NOTIFY_BAD; 565 iucv_param[cpu] = kmalloc_node(sizeof(union iucv_param), 566 GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); 567 if (!iucv_param[cpu]) 568 return NOTIFY_BAD; 569 break; 570 case CPU_UP_CANCELED: 571 case CPU_UP_CANCELED_FROZEN: 572 case CPU_DEAD: 573 case CPU_DEAD_FROZEN: 574 kfree(iucv_param[cpu]); 575 iucv_param[cpu] = NULL; 576 kfree(iucv_irq_data[cpu]); 577 iucv_irq_data[cpu] = NULL; 578 break; 579 case CPU_ONLINE: 580 case CPU_ONLINE_FROZEN: 581 case CPU_DOWN_FAILED: 582 case CPU_DOWN_FAILED_FROZEN: 583 smp_call_function_single(cpu, iucv_declare_cpu, NULL, 0, 1); 584 break; 585 case CPU_DOWN_PREPARE: 586 case CPU_DOWN_PREPARE_FROZEN: 587 cpumask = iucv_buffer_cpumask; 588 cpu_clear(cpu, cpumask); 589 if (cpus_empty(cpumask)) 590 /* Can't offline last IUCV enabled cpu. */ 591 return NOTIFY_BAD; 592 smp_call_function_single(cpu, iucv_retrieve_cpu, NULL, 0, 1); 593 if (cpus_empty(iucv_irq_cpumask)) 594 smp_call_function_single(first_cpu(iucv_buffer_cpumask), 595 iucv_allow_cpu, NULL, 0, 1); 596 break; 597 } 598 return NOTIFY_OK; 599 } 600 601 static struct notifier_block __cpuinitdata iucv_cpu_notifier = { 602 .notifier_call = iucv_cpu_notify, 603 }; 604 605 /** 606 * iucv_sever_pathid 607 * @pathid: path identification number. 608 * @userdata: 16-bytes of user data. 609 * 610 * Sever an iucv path to free up the pathid. Used internally. 611 */ 612 static int iucv_sever_pathid(u16 pathid, u8 userdata[16]) 613 { 614 union iucv_param *parm; 615 616 parm = iucv_param[smp_processor_id()]; 617 memset(parm, 0, sizeof(union iucv_param)); 618 if (userdata) 619 memcpy(parm->ctrl.ipuser, userdata, sizeof(parm->ctrl.ipuser)); 620 parm->ctrl.ippathid = pathid; 621 return iucv_call_b2f0(IUCV_SEVER, parm); 622 } 623 624 /** 625 * __iucv_cleanup_queue 626 * @dummy: unused dummy argument 627 * 628 * Nop function called via smp_call_function to force work items from 629 * pending external iucv interrupts to the work queue. 630 */ 631 static void __iucv_cleanup_queue(void *dummy) 632 { 633 } 634 635 /** 636 * iucv_cleanup_queue 637 * 638 * Function called after a path has been severed to find all remaining 639 * work items for the now stale pathid. The caller needs to hold the 640 * iucv_table_lock. 641 */ 642 static void iucv_cleanup_queue(void) 643 { 644 struct iucv_irq_list *p, *n; 645 646 /* 647 * When a path is severed, the pathid can be reused immediatly 648 * on a iucv connect or a connection pending interrupt. Remove 649 * all entries from the task queue that refer to a stale pathid 650 * (iucv_path_table[ix] == NULL). Only then do the iucv connect 651 * or deliver the connection pending interrupt. To get all the 652 * pending interrupts force them to the work queue by calling 653 * an empty function on all cpus. 654 */ 655 smp_call_function(__iucv_cleanup_queue, NULL, 0, 1); 656 spin_lock_irq(&iucv_queue_lock); 657 list_for_each_entry_safe(p, n, &iucv_task_queue, list) { 658 /* Remove stale work items from the task queue. */ 659 if (iucv_path_table[p->data.ippathid] == NULL) { 660 list_del(&p->list); 661 kfree(p); 662 } 663 } 664 spin_unlock_irq(&iucv_queue_lock); 665 } 666 667 /** 668 * iucv_register: 669 * @handler: address of iucv handler structure 670 * @smp: != 0 indicates that the handler can deal with out of order messages 671 * 672 * Registers a driver with IUCV. 673 * 674 * Returns 0 on success, -ENOMEM if the memory allocation for the pathid 675 * table failed, or -EIO if IUCV_DECLARE_BUFFER failed on all cpus. 676 */ 677 int iucv_register(struct iucv_handler *handler, int smp) 678 { 679 int rc; 680 681 if (!iucv_available) 682 return -ENOSYS; 683 mutex_lock(&iucv_register_mutex); 684 if (!smp) 685 iucv_nonsmp_handler++; 686 if (list_empty(&iucv_handler_list)) { 687 rc = iucv_enable(); 688 if (rc) 689 goto out_mutex; 690 } else if (!smp && iucv_nonsmp_handler == 1) 691 iucv_setmask_up(); 692 INIT_LIST_HEAD(&handler->paths); 693 694 spin_lock_bh(&iucv_table_lock); 695 list_add_tail(&handler->list, &iucv_handler_list); 696 spin_unlock_bh(&iucv_table_lock); 697 rc = 0; 698 out_mutex: 699 mutex_unlock(&iucv_register_mutex); 700 return rc; 701 } 702 EXPORT_SYMBOL(iucv_register); 703 704 /** 705 * iucv_unregister 706 * @handler: address of iucv handler structure 707 * @smp: != 0 indicates that the handler can deal with out of order messages 708 * 709 * Unregister driver from IUCV. 710 */ 711 void iucv_unregister(struct iucv_handler *handler, int smp) 712 { 713 struct iucv_path *p, *n; 714 715 mutex_lock(&iucv_register_mutex); 716 spin_lock_bh(&iucv_table_lock); 717 /* Remove handler from the iucv_handler_list. */ 718 list_del_init(&handler->list); 719 /* Sever all pathids still refering to the handler. */ 720 list_for_each_entry_safe(p, n, &handler->paths, list) { 721 iucv_sever_pathid(p->pathid, NULL); 722 iucv_path_table[p->pathid] = NULL; 723 list_del(&p->list); 724 iucv_path_free(p); 725 } 726 spin_unlock_bh(&iucv_table_lock); 727 if (!smp) 728 iucv_nonsmp_handler--; 729 if (list_empty(&iucv_handler_list)) 730 iucv_disable(); 731 else if (!smp && iucv_nonsmp_handler == 0) 732 iucv_setmask_mp(); 733 mutex_unlock(&iucv_register_mutex); 734 } 735 EXPORT_SYMBOL(iucv_unregister); 736 737 /** 738 * iucv_path_accept 739 * @path: address of iucv path structure 740 * @handler: address of iucv handler structure 741 * @userdata: 16 bytes of data reflected to the communication partner 742 * @private: private data passed to interrupt handlers for this path 743 * 744 * This function is issued after the user received a connection pending 745 * external interrupt and now wishes to complete the IUCV communication path. 746 * 747 * Returns the result of the CP IUCV call. 748 */ 749 int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler, 750 u8 userdata[16], void *private) 751 { 752 union iucv_param *parm; 753 int rc; 754 755 local_bh_disable(); 756 /* Prepare parameter block. */ 757 parm = iucv_param[smp_processor_id()]; 758 memset(parm, 0, sizeof(union iucv_param)); 759 parm->ctrl.ippathid = path->pathid; 760 parm->ctrl.ipmsglim = path->msglim; 761 if (userdata) 762 memcpy(parm->ctrl.ipuser, userdata, sizeof(parm->ctrl.ipuser)); 763 parm->ctrl.ipflags1 = path->flags; 764 765 rc = iucv_call_b2f0(IUCV_ACCEPT, parm); 766 if (!rc) { 767 path->private = private; 768 path->msglim = parm->ctrl.ipmsglim; 769 path->flags = parm->ctrl.ipflags1; 770 } 771 local_bh_enable(); 772 return rc; 773 } 774 EXPORT_SYMBOL(iucv_path_accept); 775 776 /** 777 * iucv_path_connect 778 * @path: address of iucv path structure 779 * @handler: address of iucv handler structure 780 * @userid: 8-byte user identification 781 * @system: 8-byte target system identification 782 * @userdata: 16 bytes of data reflected to the communication partner 783 * @private: private data passed to interrupt handlers for this path 784 * 785 * This function establishes an IUCV path. Although the connect may complete 786 * successfully, you are not able to use the path until you receive an IUCV 787 * Connection Complete external interrupt. 788 * 789 * Returns the result of the CP IUCV call. 790 */ 791 int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler, 792 u8 userid[8], u8 system[8], u8 userdata[16], 793 void *private) 794 { 795 union iucv_param *parm; 796 int rc; 797 798 spin_lock_bh(&iucv_table_lock); 799 iucv_cleanup_queue(); 800 parm = iucv_param[smp_processor_id()]; 801 memset(parm, 0, sizeof(union iucv_param)); 802 parm->ctrl.ipmsglim = path->msglim; 803 parm->ctrl.ipflags1 = path->flags; 804 if (userid) { 805 memcpy(parm->ctrl.ipvmid, userid, sizeof(parm->ctrl.ipvmid)); 806 ASCEBC(parm->ctrl.ipvmid, sizeof(parm->ctrl.ipvmid)); 807 EBC_TOUPPER(parm->ctrl.ipvmid, sizeof(parm->ctrl.ipvmid)); 808 } 809 if (system) { 810 memcpy(parm->ctrl.iptarget, system, 811 sizeof(parm->ctrl.iptarget)); 812 ASCEBC(parm->ctrl.iptarget, sizeof(parm->ctrl.iptarget)); 813 EBC_TOUPPER(parm->ctrl.iptarget, sizeof(parm->ctrl.iptarget)); 814 } 815 if (userdata) 816 memcpy(parm->ctrl.ipuser, userdata, sizeof(parm->ctrl.ipuser)); 817 818 rc = iucv_call_b2f0(IUCV_CONNECT, parm); 819 if (!rc) { 820 if (parm->ctrl.ippathid < iucv_max_pathid) { 821 path->pathid = parm->ctrl.ippathid; 822 path->msglim = parm->ctrl.ipmsglim; 823 path->flags = parm->ctrl.ipflags1; 824 path->handler = handler; 825 path->private = private; 826 list_add_tail(&path->list, &handler->paths); 827 iucv_path_table[path->pathid] = path; 828 } else { 829 iucv_sever_pathid(parm->ctrl.ippathid, 830 iucv_error_pathid); 831 rc = -EIO; 832 } 833 } 834 spin_unlock_bh(&iucv_table_lock); 835 return rc; 836 } 837 EXPORT_SYMBOL(iucv_path_connect); 838 839 /** 840 * iucv_path_quiesce: 841 * @path: address of iucv path structure 842 * @userdata: 16 bytes of data reflected to the communication partner 843 * 844 * This function temporarily suspends incoming messages on an IUCV path. 845 * You can later reactivate the path by invoking the iucv_resume function. 846 * 847 * Returns the result from the CP IUCV call. 848 */ 849 int iucv_path_quiesce(struct iucv_path *path, u8 userdata[16]) 850 { 851 union iucv_param *parm; 852 int rc; 853 854 local_bh_disable(); 855 parm = iucv_param[smp_processor_id()]; 856 memset(parm, 0, sizeof(union iucv_param)); 857 if (userdata) 858 memcpy(parm->ctrl.ipuser, userdata, sizeof(parm->ctrl.ipuser)); 859 parm->ctrl.ippathid = path->pathid; 860 rc = iucv_call_b2f0(IUCV_QUIESCE, parm); 861 local_bh_enable(); 862 return rc; 863 } 864 EXPORT_SYMBOL(iucv_path_quiesce); 865 866 /** 867 * iucv_path_resume: 868 * @path: address of iucv path structure 869 * @userdata: 16 bytes of data reflected to the communication partner 870 * 871 * This function resumes incoming messages on an IUCV path that has 872 * been stopped with iucv_path_quiesce. 873 * 874 * Returns the result from the CP IUCV call. 875 */ 876 int iucv_path_resume(struct iucv_path *path, u8 userdata[16]) 877 { 878 union iucv_param *parm; 879 int rc; 880 881 local_bh_disable(); 882 parm = iucv_param[smp_processor_id()]; 883 memset(parm, 0, sizeof(union iucv_param)); 884 if (userdata) 885 memcpy(parm->ctrl.ipuser, userdata, sizeof(parm->ctrl.ipuser)); 886 parm->ctrl.ippathid = path->pathid; 887 rc = iucv_call_b2f0(IUCV_RESUME, parm); 888 local_bh_enable(); 889 return rc; 890 } 891 892 /** 893 * iucv_path_sever 894 * @path: address of iucv path structure 895 * @userdata: 16 bytes of data reflected to the communication partner 896 * 897 * This function terminates an IUCV path. 898 * 899 * Returns the result from the CP IUCV call. 900 */ 901 int iucv_path_sever(struct iucv_path *path, u8 userdata[16]) 902 { 903 int rc; 904 905 preempt_disable(); 906 if (iucv_active_cpu != smp_processor_id()) 907 spin_lock_bh(&iucv_table_lock); 908 rc = iucv_sever_pathid(path->pathid, userdata); 909 if (!rc) { 910 iucv_path_table[path->pathid] = NULL; 911 list_del_init(&path->list); 912 } 913 if (iucv_active_cpu != smp_processor_id()) 914 spin_unlock_bh(&iucv_table_lock); 915 preempt_enable(); 916 return rc; 917 } 918 EXPORT_SYMBOL(iucv_path_sever); 919 920 /** 921 * iucv_message_purge 922 * @path: address of iucv path structure 923 * @msg: address of iucv msg structure 924 * @srccls: source class of message 925 * 926 * Cancels a message you have sent. 927 * 928 * Returns the result from the CP IUCV call. 929 */ 930 int iucv_message_purge(struct iucv_path *path, struct iucv_message *msg, 931 u32 srccls) 932 { 933 union iucv_param *parm; 934 int rc; 935 936 local_bh_disable(); 937 parm = iucv_param[smp_processor_id()]; 938 memset(parm, 0, sizeof(union iucv_param)); 939 parm->purge.ippathid = path->pathid; 940 parm->purge.ipmsgid = msg->id; 941 parm->purge.ipsrccls = srccls; 942 parm->purge.ipflags1 = IUCV_IPSRCCLS | IUCV_IPFGMID | IUCV_IPFGPID; 943 rc = iucv_call_b2f0(IUCV_PURGE, parm); 944 if (!rc) { 945 msg->audit = (*(u32 *) &parm->purge.ipaudit) >> 8; 946 msg->tag = parm->purge.ipmsgtag; 947 } 948 local_bh_enable(); 949 return rc; 950 } 951 EXPORT_SYMBOL(iucv_message_purge); 952 953 /** 954 * iucv_message_receive 955 * @path: address of iucv path structure 956 * @msg: address of iucv msg structure 957 * @flags: how the message is received (IUCV_IPBUFLST) 958 * @buffer: address of data buffer or address of struct iucv_array 959 * @size: length of data buffer 960 * @residual: 961 * 962 * This function receives messages that are being sent to you over 963 * established paths. This function will deal with RMDATA messages 964 * embedded in struct iucv_message as well. 965 * 966 * Returns the result from the CP IUCV call. 967 */ 968 int iucv_message_receive(struct iucv_path *path, struct iucv_message *msg, 969 u8 flags, void *buffer, size_t size, size_t *residual) 970 { 971 union iucv_param *parm; 972 struct iucv_array *array; 973 u8 *rmmsg; 974 size_t copy; 975 int rc; 976 977 if (msg->flags & IUCV_IPRMDATA) { 978 /* 979 * Message is 8 bytes long and has been stored to the 980 * message descriptor itself. 981 */ 982 rc = (size < 8) ? 5 : 0; 983 if (residual) 984 *residual = abs(size - 8); 985 rmmsg = msg->rmmsg; 986 if (flags & IUCV_IPBUFLST) { 987 /* Copy to struct iucv_array. */ 988 size = (size < 8) ? size : 8; 989 for (array = buffer; size > 0; array++) { 990 copy = min_t(size_t, size, array->length); 991 memcpy((u8 *)(addr_t) array->address, 992 rmmsg, copy); 993 rmmsg += copy; 994 size -= copy; 995 } 996 } else { 997 /* Copy to direct buffer. */ 998 memcpy(buffer, rmmsg, min_t(size_t, size, 8)); 999 } 1000 return 0; 1001 } 1002 1003 local_bh_disable(); 1004 parm = iucv_param[smp_processor_id()]; 1005 memset(parm, 0, sizeof(union iucv_param)); 1006 parm->db.ipbfadr1 = (u32)(addr_t) buffer; 1007 parm->db.ipbfln1f = (u32) size; 1008 parm->db.ipmsgid = msg->id; 1009 parm->db.ippathid = path->pathid; 1010 parm->db.iptrgcls = msg->class; 1011 parm->db.ipflags1 = (flags | IUCV_IPFGPID | 1012 IUCV_IPFGMID | IUCV_IPTRGCLS); 1013 rc = iucv_call_b2f0(IUCV_RECEIVE, parm); 1014 if (!rc || rc == 5) { 1015 msg->flags = parm->db.ipflags1; 1016 if (residual) 1017 *residual = parm->db.ipbfln1f; 1018 } 1019 local_bh_enable(); 1020 return rc; 1021 } 1022 EXPORT_SYMBOL(iucv_message_receive); 1023 1024 /** 1025 * iucv_message_reject 1026 * @path: address of iucv path structure 1027 * @msg: address of iucv msg structure 1028 * 1029 * The reject function refuses a specified message. Between the time you 1030 * are notified of a message and the time that you complete the message, 1031 * the message may be rejected. 1032 * 1033 * Returns the result from the CP IUCV call. 1034 */ 1035 int iucv_message_reject(struct iucv_path *path, struct iucv_message *msg) 1036 { 1037 union iucv_param *parm; 1038 int rc; 1039 1040 local_bh_disable(); 1041 parm = iucv_param[smp_processor_id()]; 1042 memset(parm, 0, sizeof(union iucv_param)); 1043 parm->db.ippathid = path->pathid; 1044 parm->db.ipmsgid = msg->id; 1045 parm->db.iptrgcls = msg->class; 1046 parm->db.ipflags1 = (IUCV_IPTRGCLS | IUCV_IPFGMID | IUCV_IPFGPID); 1047 rc = iucv_call_b2f0(IUCV_REJECT, parm); 1048 local_bh_enable(); 1049 return rc; 1050 } 1051 EXPORT_SYMBOL(iucv_message_reject); 1052 1053 /** 1054 * iucv_message_reply 1055 * @path: address of iucv path structure 1056 * @msg: address of iucv msg structure 1057 * @flags: how the reply is sent (IUCV_IPRMDATA, IUCV_IPPRTY, IUCV_IPBUFLST) 1058 * @reply: address of reply data buffer or address of struct iucv_array 1059 * @size: length of reply data buffer 1060 * 1061 * This function responds to the two-way messages that you receive. You 1062 * must identify completely the message to which you wish to reply. ie, 1063 * pathid, msgid, and trgcls. Prmmsg signifies the data is moved into 1064 * the parameter list. 1065 * 1066 * Returns the result from the CP IUCV call. 1067 */ 1068 int iucv_message_reply(struct iucv_path *path, struct iucv_message *msg, 1069 u8 flags, void *reply, size_t size) 1070 { 1071 union iucv_param *parm; 1072 int rc; 1073 1074 local_bh_disable(); 1075 parm = iucv_param[smp_processor_id()]; 1076 memset(parm, 0, sizeof(union iucv_param)); 1077 if (flags & IUCV_IPRMDATA) { 1078 parm->dpl.ippathid = path->pathid; 1079 parm->dpl.ipflags1 = flags; 1080 parm->dpl.ipmsgid = msg->id; 1081 parm->dpl.iptrgcls = msg->class; 1082 memcpy(parm->dpl.iprmmsg, reply, min_t(size_t, size, 8)); 1083 } else { 1084 parm->db.ipbfadr1 = (u32)(addr_t) reply; 1085 parm->db.ipbfln1f = (u32) size; 1086 parm->db.ippathid = path->pathid; 1087 parm->db.ipflags1 = flags; 1088 parm->db.ipmsgid = msg->id; 1089 parm->db.iptrgcls = msg->class; 1090 } 1091 rc = iucv_call_b2f0(IUCV_REPLY, parm); 1092 local_bh_enable(); 1093 return rc; 1094 } 1095 EXPORT_SYMBOL(iucv_message_reply); 1096 1097 /** 1098 * iucv_message_send 1099 * @path: address of iucv path structure 1100 * @msg: address of iucv msg structure 1101 * @flags: how the message is sent (IUCV_IPRMDATA, IUCV_IPPRTY, IUCV_IPBUFLST) 1102 * @srccls: source class of message 1103 * @buffer: address of send buffer or address of struct iucv_array 1104 * @size: length of send buffer 1105 * 1106 * This function transmits data to another application. Data to be 1107 * transmitted is in a buffer and this is a one-way message and the 1108 * receiver will not reply to the message. 1109 * 1110 * Returns the result from the CP IUCV call. 1111 */ 1112 int iucv_message_send(struct iucv_path *path, struct iucv_message *msg, 1113 u8 flags, u32 srccls, void *buffer, size_t size) 1114 { 1115 union iucv_param *parm; 1116 int rc; 1117 1118 local_bh_disable(); 1119 parm = iucv_param[smp_processor_id()]; 1120 memset(parm, 0, sizeof(union iucv_param)); 1121 if (flags & IUCV_IPRMDATA) { 1122 /* Message of 8 bytes can be placed into the parameter list. */ 1123 parm->dpl.ippathid = path->pathid; 1124 parm->dpl.ipflags1 = flags | IUCV_IPNORPY; 1125 parm->dpl.iptrgcls = msg->class; 1126 parm->dpl.ipsrccls = srccls; 1127 parm->dpl.ipmsgtag = msg->tag; 1128 memcpy(parm->dpl.iprmmsg, buffer, 8); 1129 } else { 1130 parm->db.ipbfadr1 = (u32)(addr_t) buffer; 1131 parm->db.ipbfln1f = (u32) size; 1132 parm->db.ippathid = path->pathid; 1133 parm->db.ipflags1 = flags | IUCV_IPNORPY; 1134 parm->db.iptrgcls = msg->class; 1135 parm->db.ipsrccls = srccls; 1136 parm->db.ipmsgtag = msg->tag; 1137 } 1138 rc = iucv_call_b2f0(IUCV_SEND, parm); 1139 if (!rc) 1140 msg->id = parm->db.ipmsgid; 1141 local_bh_enable(); 1142 return rc; 1143 } 1144 EXPORT_SYMBOL(iucv_message_send); 1145 1146 /** 1147 * iucv_message_send2way 1148 * @path: address of iucv path structure 1149 * @msg: address of iucv msg structure 1150 * @flags: how the message is sent and the reply is received 1151 * (IUCV_IPRMDATA, IUCV_IPBUFLST, IUCV_IPPRTY, IUCV_ANSLST) 1152 * @srccls: source class of message 1153 * @buffer: address of send buffer or address of struct iucv_array 1154 * @size: length of send buffer 1155 * @ansbuf: address of answer buffer or address of struct iucv_array 1156 * @asize: size of reply buffer 1157 * 1158 * This function transmits data to another application. Data to be 1159 * transmitted is in a buffer. The receiver of the send is expected to 1160 * reply to the message and a buffer is provided into which IUCV moves 1161 * the reply to this message. 1162 * 1163 * Returns the result from the CP IUCV call. 1164 */ 1165 int iucv_message_send2way(struct iucv_path *path, struct iucv_message *msg, 1166 u8 flags, u32 srccls, void *buffer, size_t size, 1167 void *answer, size_t asize, size_t *residual) 1168 { 1169 union iucv_param *parm; 1170 int rc; 1171 1172 local_bh_disable(); 1173 parm = iucv_param[smp_processor_id()]; 1174 memset(parm, 0, sizeof(union iucv_param)); 1175 if (flags & IUCV_IPRMDATA) { 1176 parm->dpl.ippathid = path->pathid; 1177 parm->dpl.ipflags1 = path->flags; /* priority message */ 1178 parm->dpl.iptrgcls = msg->class; 1179 parm->dpl.ipsrccls = srccls; 1180 parm->dpl.ipmsgtag = msg->tag; 1181 parm->dpl.ipbfadr2 = (u32)(addr_t) answer; 1182 parm->dpl.ipbfln2f = (u32) asize; 1183 memcpy(parm->dpl.iprmmsg, buffer, 8); 1184 } else { 1185 parm->db.ippathid = path->pathid; 1186 parm->db.ipflags1 = path->flags; /* priority message */ 1187 parm->db.iptrgcls = msg->class; 1188 parm->db.ipsrccls = srccls; 1189 parm->db.ipmsgtag = msg->tag; 1190 parm->db.ipbfadr1 = (u32)(addr_t) buffer; 1191 parm->db.ipbfln1f = (u32) size; 1192 parm->db.ipbfadr2 = (u32)(addr_t) answer; 1193 parm->db.ipbfln2f = (u32) asize; 1194 } 1195 rc = iucv_call_b2f0(IUCV_SEND, parm); 1196 if (!rc) 1197 msg->id = parm->db.ipmsgid; 1198 local_bh_enable(); 1199 return rc; 1200 } 1201 EXPORT_SYMBOL(iucv_message_send2way); 1202 1203 /** 1204 * iucv_path_pending 1205 * @data: Pointer to external interrupt buffer 1206 * 1207 * Process connection pending work item. Called from tasklet while holding 1208 * iucv_table_lock. 1209 */ 1210 struct iucv_path_pending { 1211 u16 ippathid; 1212 u8 ipflags1; 1213 u8 iptype; 1214 u16 ipmsglim; 1215 u16 res1; 1216 u8 ipvmid[8]; 1217 u8 ipuser[16]; 1218 u32 res3; 1219 u8 ippollfg; 1220 u8 res4[3]; 1221 } __attribute__ ((packed)); 1222 1223 static void iucv_path_pending(struct iucv_irq_data *data) 1224 { 1225 struct iucv_path_pending *ipp = (void *) data; 1226 struct iucv_handler *handler; 1227 struct iucv_path *path; 1228 char *error; 1229 1230 BUG_ON(iucv_path_table[ipp->ippathid]); 1231 /* New pathid, handler found. Create a new path struct. */ 1232 error = iucv_error_no_memory; 1233 path = iucv_path_alloc(ipp->ipmsglim, ipp->ipflags1, GFP_ATOMIC); 1234 if (!path) 1235 goto out_sever; 1236 path->pathid = ipp->ippathid; 1237 iucv_path_table[path->pathid] = path; 1238 EBCASC(ipp->ipvmid, 8); 1239 1240 /* Call registered handler until one is found that wants the path. */ 1241 list_for_each_entry(handler, &iucv_handler_list, list) { 1242 if (!handler->path_pending) 1243 continue; 1244 /* 1245 * Add path to handler to allow a call to iucv_path_sever 1246 * inside the path_pending function. If the handler returns 1247 * an error remove the path from the handler again. 1248 */ 1249 list_add(&path->list, &handler->paths); 1250 path->handler = handler; 1251 if (!handler->path_pending(path, ipp->ipvmid, ipp->ipuser)) 1252 return; 1253 list_del(&path->list); 1254 path->handler = NULL; 1255 } 1256 /* No handler wanted the path. */ 1257 iucv_path_table[path->pathid] = NULL; 1258 iucv_path_free(path); 1259 error = iucv_error_no_listener; 1260 out_sever: 1261 iucv_sever_pathid(ipp->ippathid, error); 1262 } 1263 1264 /** 1265 * iucv_path_complete 1266 * @data: Pointer to external interrupt buffer 1267 * 1268 * Process connection complete work item. Called from tasklet while holding 1269 * iucv_table_lock. 1270 */ 1271 struct iucv_path_complete { 1272 u16 ippathid; 1273 u8 ipflags1; 1274 u8 iptype; 1275 u16 ipmsglim; 1276 u16 res1; 1277 u8 res2[8]; 1278 u8 ipuser[16]; 1279 u32 res3; 1280 u8 ippollfg; 1281 u8 res4[3]; 1282 } __attribute__ ((packed)); 1283 1284 static void iucv_path_complete(struct iucv_irq_data *data) 1285 { 1286 struct iucv_path_complete *ipc = (void *) data; 1287 struct iucv_path *path = iucv_path_table[ipc->ippathid]; 1288 1289 if (path && path->handler && path->handler->path_complete) 1290 path->handler->path_complete(path, ipc->ipuser); 1291 } 1292 1293 /** 1294 * iucv_path_severed 1295 * @data: Pointer to external interrupt buffer 1296 * 1297 * Process connection severed work item. Called from tasklet while holding 1298 * iucv_table_lock. 1299 */ 1300 struct iucv_path_severed { 1301 u16 ippathid; 1302 u8 res1; 1303 u8 iptype; 1304 u32 res2; 1305 u8 res3[8]; 1306 u8 ipuser[16]; 1307 u32 res4; 1308 u8 ippollfg; 1309 u8 res5[3]; 1310 } __attribute__ ((packed)); 1311 1312 static void iucv_path_severed(struct iucv_irq_data *data) 1313 { 1314 struct iucv_path_severed *ips = (void *) data; 1315 struct iucv_path *path = iucv_path_table[ips->ippathid]; 1316 1317 if (!path || !path->handler) /* Already severed */ 1318 return; 1319 if (path->handler->path_severed) 1320 path->handler->path_severed(path, ips->ipuser); 1321 else { 1322 iucv_sever_pathid(path->pathid, NULL); 1323 iucv_path_table[path->pathid] = NULL; 1324 list_del_init(&path->list); 1325 iucv_path_free(path); 1326 } 1327 } 1328 1329 /** 1330 * iucv_path_quiesced 1331 * @data: Pointer to external interrupt buffer 1332 * 1333 * Process connection quiesced work item. Called from tasklet while holding 1334 * iucv_table_lock. 1335 */ 1336 struct iucv_path_quiesced { 1337 u16 ippathid; 1338 u8 res1; 1339 u8 iptype; 1340 u32 res2; 1341 u8 res3[8]; 1342 u8 ipuser[16]; 1343 u32 res4; 1344 u8 ippollfg; 1345 u8 res5[3]; 1346 } __attribute__ ((packed)); 1347 1348 static void iucv_path_quiesced(struct iucv_irq_data *data) 1349 { 1350 struct iucv_path_quiesced *ipq = (void *) data; 1351 struct iucv_path *path = iucv_path_table[ipq->ippathid]; 1352 1353 if (path && path->handler && path->handler->path_quiesced) 1354 path->handler->path_quiesced(path, ipq->ipuser); 1355 } 1356 1357 /** 1358 * iucv_path_resumed 1359 * @data: Pointer to external interrupt buffer 1360 * 1361 * Process connection resumed work item. Called from tasklet while holding 1362 * iucv_table_lock. 1363 */ 1364 struct iucv_path_resumed { 1365 u16 ippathid; 1366 u8 res1; 1367 u8 iptype; 1368 u32 res2; 1369 u8 res3[8]; 1370 u8 ipuser[16]; 1371 u32 res4; 1372 u8 ippollfg; 1373 u8 res5[3]; 1374 } __attribute__ ((packed)); 1375 1376 static void iucv_path_resumed(struct iucv_irq_data *data) 1377 { 1378 struct iucv_path_resumed *ipr = (void *) data; 1379 struct iucv_path *path = iucv_path_table[ipr->ippathid]; 1380 1381 if (path && path->handler && path->handler->path_resumed) 1382 path->handler->path_resumed(path, ipr->ipuser); 1383 } 1384 1385 /** 1386 * iucv_message_complete 1387 * @data: Pointer to external interrupt buffer 1388 * 1389 * Process message complete work item. Called from tasklet while holding 1390 * iucv_table_lock. 1391 */ 1392 struct iucv_message_complete { 1393 u16 ippathid; 1394 u8 ipflags1; 1395 u8 iptype; 1396 u32 ipmsgid; 1397 u32 ipaudit; 1398 u8 iprmmsg[8]; 1399 u32 ipsrccls; 1400 u32 ipmsgtag; 1401 u32 res; 1402 u32 ipbfln2f; 1403 u8 ippollfg; 1404 u8 res2[3]; 1405 } __attribute__ ((packed)); 1406 1407 static void iucv_message_complete(struct iucv_irq_data *data) 1408 { 1409 struct iucv_message_complete *imc = (void *) data; 1410 struct iucv_path *path = iucv_path_table[imc->ippathid]; 1411 struct iucv_message msg; 1412 1413 if (path && path->handler && path->handler->message_complete) { 1414 msg.flags = imc->ipflags1; 1415 msg.id = imc->ipmsgid; 1416 msg.audit = imc->ipaudit; 1417 memcpy(msg.rmmsg, imc->iprmmsg, 8); 1418 msg.class = imc->ipsrccls; 1419 msg.tag = imc->ipmsgtag; 1420 msg.length = imc->ipbfln2f; 1421 path->handler->message_complete(path, &msg); 1422 } 1423 } 1424 1425 /** 1426 * iucv_message_pending 1427 * @data: Pointer to external interrupt buffer 1428 * 1429 * Process message pending work item. Called from tasklet while holding 1430 * iucv_table_lock. 1431 */ 1432 struct iucv_message_pending { 1433 u16 ippathid; 1434 u8 ipflags1; 1435 u8 iptype; 1436 u32 ipmsgid; 1437 u32 iptrgcls; 1438 union { 1439 u32 iprmmsg1_u32; 1440 u8 iprmmsg1[4]; 1441 } ln1msg1; 1442 union { 1443 u32 ipbfln1f; 1444 u8 iprmmsg2[4]; 1445 } ln1msg2; 1446 u32 res1[3]; 1447 u32 ipbfln2f; 1448 u8 ippollfg; 1449 u8 res2[3]; 1450 } __attribute__ ((packed)); 1451 1452 static void iucv_message_pending(struct iucv_irq_data *data) 1453 { 1454 struct iucv_message_pending *imp = (void *) data; 1455 struct iucv_path *path = iucv_path_table[imp->ippathid]; 1456 struct iucv_message msg; 1457 1458 if (path && path->handler && path->handler->message_pending) { 1459 msg.flags = imp->ipflags1; 1460 msg.id = imp->ipmsgid; 1461 msg.class = imp->iptrgcls; 1462 if (imp->ipflags1 & IUCV_IPRMDATA) { 1463 memcpy(msg.rmmsg, imp->ln1msg1.iprmmsg1, 8); 1464 msg.length = 8; 1465 } else 1466 msg.length = imp->ln1msg2.ipbfln1f; 1467 msg.reply_size = imp->ipbfln2f; 1468 path->handler->message_pending(path, &msg); 1469 } 1470 } 1471 1472 /** 1473 * iucv_tasklet_fn: 1474 * 1475 * This tasklet loops over the queue of irq buffers created by 1476 * iucv_external_interrupt, calls the appropriate action handler 1477 * and then frees the buffer. 1478 */ 1479 static void iucv_tasklet_fn(unsigned long ignored) 1480 { 1481 typedef void iucv_irq_fn(struct iucv_irq_data *); 1482 static iucv_irq_fn *irq_fn[] = { 1483 [0x02] = iucv_path_complete, 1484 [0x03] = iucv_path_severed, 1485 [0x04] = iucv_path_quiesced, 1486 [0x05] = iucv_path_resumed, 1487 [0x06] = iucv_message_complete, 1488 [0x07] = iucv_message_complete, 1489 [0x08] = iucv_message_pending, 1490 [0x09] = iucv_message_pending, 1491 }; 1492 LIST_HEAD(task_queue); 1493 struct iucv_irq_list *p, *n; 1494 1495 /* Serialize tasklet, iucv_path_sever and iucv_path_connect. */ 1496 if (!spin_trylock(&iucv_table_lock)) { 1497 tasklet_schedule(&iucv_tasklet); 1498 return; 1499 } 1500 iucv_active_cpu = smp_processor_id(); 1501 1502 spin_lock_irq(&iucv_queue_lock); 1503 list_splice_init(&iucv_task_queue, &task_queue); 1504 spin_unlock_irq(&iucv_queue_lock); 1505 1506 list_for_each_entry_safe(p, n, &task_queue, list) { 1507 list_del_init(&p->list); 1508 irq_fn[p->data.iptype](&p->data); 1509 kfree(p); 1510 } 1511 1512 iucv_active_cpu = -1; 1513 spin_unlock(&iucv_table_lock); 1514 } 1515 1516 /** 1517 * iucv_work_fn: 1518 * 1519 * This work function loops over the queue of path pending irq blocks 1520 * created by iucv_external_interrupt, calls the appropriate action 1521 * handler and then frees the buffer. 1522 */ 1523 static void iucv_work_fn(struct work_struct *work) 1524 { 1525 typedef void iucv_irq_fn(struct iucv_irq_data *); 1526 LIST_HEAD(work_queue); 1527 struct iucv_irq_list *p, *n; 1528 1529 /* Serialize tasklet, iucv_path_sever and iucv_path_connect. */ 1530 spin_lock_bh(&iucv_table_lock); 1531 iucv_active_cpu = smp_processor_id(); 1532 1533 spin_lock_irq(&iucv_queue_lock); 1534 list_splice_init(&iucv_work_queue, &work_queue); 1535 spin_unlock_irq(&iucv_queue_lock); 1536 1537 iucv_cleanup_queue(); 1538 list_for_each_entry_safe(p, n, &work_queue, list) { 1539 list_del_init(&p->list); 1540 iucv_path_pending(&p->data); 1541 kfree(p); 1542 } 1543 1544 iucv_active_cpu = -1; 1545 spin_unlock_bh(&iucv_table_lock); 1546 } 1547 1548 /** 1549 * iucv_external_interrupt 1550 * @code: irq code 1551 * 1552 * Handles external interrupts coming in from CP. 1553 * Places the interrupt buffer on a queue and schedules iucv_tasklet_fn(). 1554 */ 1555 static void iucv_external_interrupt(u16 code) 1556 { 1557 struct iucv_irq_data *p; 1558 struct iucv_irq_list *work; 1559 1560 p = iucv_irq_data[smp_processor_id()]; 1561 if (p->ippathid >= iucv_max_pathid) { 1562 printk(KERN_WARNING "iucv_do_int: Got interrupt with " 1563 "pathid %d > max_connections (%ld)\n", 1564 p->ippathid, iucv_max_pathid - 1); 1565 iucv_sever_pathid(p->ippathid, iucv_error_no_listener); 1566 return; 1567 } 1568 if (p->iptype < 0x01 || p->iptype > 0x09) { 1569 printk(KERN_ERR "iucv_do_int: unknown iucv interrupt\n"); 1570 return; 1571 } 1572 work = kmalloc(sizeof(struct iucv_irq_list), GFP_ATOMIC); 1573 if (!work) { 1574 printk(KERN_WARNING "iucv_external_interrupt: out of memory\n"); 1575 return; 1576 } 1577 memcpy(&work->data, p, sizeof(work->data)); 1578 spin_lock(&iucv_queue_lock); 1579 if (p->iptype == 0x01) { 1580 /* Path pending interrupt. */ 1581 list_add_tail(&work->list, &iucv_work_queue); 1582 schedule_work(&iucv_work); 1583 } else { 1584 /* The other interrupts. */ 1585 list_add_tail(&work->list, &iucv_task_queue); 1586 tasklet_schedule(&iucv_tasklet); 1587 } 1588 spin_unlock(&iucv_queue_lock); 1589 } 1590 1591 /** 1592 * iucv_init 1593 * 1594 * Allocates and initializes various data structures. 1595 */ 1596 static int __init iucv_init(void) 1597 { 1598 int rc; 1599 int cpu; 1600 1601 if (!MACHINE_IS_VM) { 1602 rc = -EPROTONOSUPPORT; 1603 goto out; 1604 } 1605 rc = iucv_query_maxconn(); 1606 if (rc) 1607 goto out; 1608 rc = register_external_interrupt(0x4000, iucv_external_interrupt); 1609 if (rc) 1610 goto out; 1611 iucv_root = s390_root_dev_register("iucv"); 1612 if (IS_ERR(iucv_root)) { 1613 rc = PTR_ERR(iucv_root); 1614 goto out_int; 1615 } 1616 1617 for_each_online_cpu(cpu) { 1618 /* Note: GFP_DMA used to get memory below 2G */ 1619 iucv_irq_data[cpu] = kmalloc_node(sizeof(struct iucv_irq_data), 1620 GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); 1621 if (!iucv_irq_data[cpu]) { 1622 rc = -ENOMEM; 1623 goto out_free; 1624 } 1625 1626 /* Allocate parameter blocks. */ 1627 iucv_param[cpu] = kmalloc_node(sizeof(union iucv_param), 1628 GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); 1629 if (!iucv_param[cpu]) { 1630 rc = -ENOMEM; 1631 goto out_free; 1632 } 1633 } 1634 rc = register_hotcpu_notifier(&iucv_cpu_notifier); 1635 if (rc) 1636 goto out_free; 1637 ASCEBC(iucv_error_no_listener, 16); 1638 ASCEBC(iucv_error_no_memory, 16); 1639 ASCEBC(iucv_error_pathid, 16); 1640 iucv_available = 1; 1641 rc = bus_register(&iucv_bus); 1642 if (rc) 1643 goto out_cpu; 1644 return 0; 1645 1646 out_cpu: 1647 unregister_hotcpu_notifier(&iucv_cpu_notifier); 1648 out_free: 1649 for_each_possible_cpu(cpu) { 1650 kfree(iucv_param[cpu]); 1651 iucv_param[cpu] = NULL; 1652 kfree(iucv_irq_data[cpu]); 1653 iucv_irq_data[cpu] = NULL; 1654 } 1655 s390_root_dev_unregister(iucv_root); 1656 out_int: 1657 unregister_external_interrupt(0x4000, iucv_external_interrupt); 1658 out: 1659 return rc; 1660 } 1661 1662 /** 1663 * iucv_exit 1664 * 1665 * Frees everything allocated from iucv_init. 1666 */ 1667 static void __exit iucv_exit(void) 1668 { 1669 struct iucv_irq_list *p, *n; 1670 int cpu; 1671 1672 spin_lock_irq(&iucv_queue_lock); 1673 list_for_each_entry_safe(p, n, &iucv_task_queue, list) 1674 kfree(p); 1675 list_for_each_entry_safe(p, n, &iucv_work_queue, list) 1676 kfree(p); 1677 spin_unlock_irq(&iucv_queue_lock); 1678 unregister_hotcpu_notifier(&iucv_cpu_notifier); 1679 for_each_possible_cpu(cpu) { 1680 kfree(iucv_param[cpu]); 1681 iucv_param[cpu] = NULL; 1682 kfree(iucv_irq_data[cpu]); 1683 iucv_irq_data[cpu] = NULL; 1684 } 1685 s390_root_dev_unregister(iucv_root); 1686 bus_unregister(&iucv_bus); 1687 unregister_external_interrupt(0x4000, iucv_external_interrupt); 1688 } 1689 1690 subsys_initcall(iucv_init); 1691 module_exit(iucv_exit); 1692 1693 MODULE_AUTHOR("(C) 2001 IBM Corp. by Fritz Elfert (felfert@millenux.com)"); 1694 MODULE_DESCRIPTION("Linux for S/390 IUCV lowlevel driver"); 1695 MODULE_LICENSE("GPL"); 1696