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