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