Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dibs: Move event handling to dibs layer

Add defines for all event types and subtypes an ism device is known to
produce as it can be helpful for debugging purposes.

Introduces a generic 'struct dibs_event' and adopt ism device driver
and smc-d client accordingly. Tolerate and ignore other type and subtype
values to enable future device extensions.

SMC-D and ISM are now independent.
struct ism_dev can be moved to drivers/s390/net/ism.h.

Note that in smc, the term 'ism' is still used. Future patches could
replace that with 'dibs' or 'smc-d' as appropriate.

Signed-off-by: Julian Ruess <julianr@linux.ibm.com>
Co-developed-by: Alexandra Winter <wintera@linux.ibm.com>
Signed-off-by: Alexandra Winter <wintera@linux.ibm.com>
Link: https://patch.msgid.link/20250918110500.1731261-15-wintera@linux.ibm.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Julian Ruess and committed by
Paolo Abeni
a612dbe8 cc21191b

+208 -239
-2
MAINTAINERS
··· 17580 17580 F: include/linux/hippidevice.h 17581 17581 F: include/linux/if_* 17582 17582 F: include/linux/inetdevice.h 17583 - F: include/linux/ism.h 17584 17583 F: include/linux/netdev* 17585 17584 F: include/linux/platform_data/wiznet.h 17586 17585 F: include/uapi/linux/cn_proc.h ··· 22236 22237 L: netdev@vger.kernel.org 22237 22238 S: Supported 22238 22239 F: drivers/s390/net/ 22239 - F: include/linux/ism.h 22240 22240 22241 22241 S390 PCI SUBSYSTEM 22242 22242 M: Niklas Schnelle <schnelle@linux.ibm.com>
+1
arch/s390/configs/debug_defconfig
··· 122 122 CONFIG_NET_KEY=m 123 123 CONFIG_DIBS=y 124 124 CONFIG_DIBS_LO=y 125 + CONFIG_SMC=m 125 126 CONFIG_SMC_DIAG=m 126 127 CONFIG_INET=y 127 128 CONFIG_IP_MULTICAST=y
+1
arch/s390/configs/defconfig
··· 113 113 CONFIG_NET_KEY=m 114 114 CONFIG_DIBS=y 115 115 CONFIG_DIBS_LO=y 116 + CONFIG_SMC=m 116 117 CONFIG_SMC_DIAG=m 117 118 CONFIG_INET=y 118 119 CONFIG_IP_MULTICAST=y
+1 -1
drivers/dibs/dibs_main.c
··· 98 98 goto err_reg_dmb; 99 99 } 100 100 } 101 - /* Stop forwarding IRQs */ 101 + /* Stop forwarding IRQs and events */ 102 102 dibs->subs[client->id] = NULL; 103 103 spin_unlock_irqrestore(&dibs->lock, flags); 104 104 clients[client->id]->ops->del_dev(dibs);
-1
drivers/s390/net/Kconfig
··· 82 82 config ISM 83 83 tristate "Support for ISM vPCI Adapter" 84 84 depends on PCI && DIBS 85 - imply SMC 86 85 default n 87 86 help 88 87 Select this option if you want to use the Internal Shared Memory
+40 -2
drivers/s390/net/ism.h
··· 6 6 #include <linux/types.h> 7 7 #include <linux/pci.h> 8 8 #include <linux/dibs.h> 9 - #include <linux/ism.h> 10 - #include <net/smc.h> 11 9 #include <asm/pci_insn.h> 12 10 13 11 #define UTIL_STR_LEN 16 14 12 #define ISM_ERROR 0xFFFF 13 + 14 + #define ISM_NR_DMBS 1920 15 15 16 16 /* 17 17 * Do not use the first word of the DMB bits to ensure 8 byte aligned access. ··· 33 33 #define ISM_SIGNAL_IEQ 0xE 34 34 #define ISM_UNREG_SBA 0x11 35 35 #define ISM_UNREG_IEQ 0x12 36 + 37 + enum ism_event_type { 38 + ISM_EVENT_BUF = 0x00, 39 + ISM_EVENT_DEV = 0x01, 40 + ISM_EVENT_SWR = 0x02 41 + }; 42 + 43 + enum ism_event_code { 44 + ISM_BUF_DMB_UNREGISTERED = 0x04, 45 + ISM_BUF_USING_ISM_DEV_DISABLED = 0x08, 46 + ISM_BUF_OWNING_ISM_DEV_IN_ERR_STATE = 0x02, 47 + ISM_BUF_USING_ISM_DEV_IN_ERR_STATE = 0x03, 48 + ISM_BUF_VLAN_MISMATCH_WITH_OWNER = 0x05, 49 + ISM_BUF_VLAN_MISMATCH_WITH_USER = 0x06, 50 + ISM_DEV_GID_DISABLED = 0x07, 51 + ISM_DEV_GID_ERR_STATE = 0x01 52 + }; 36 53 37 54 struct ism_req_hdr { 38 55 u32 cmd; ··· 202 185 u64 : 64; 203 186 }; 204 187 188 + struct ism_event { 189 + u32 type; 190 + u32 code; 191 + u64 tok; 192 + u64 time; 193 + u64 info; 194 + }; 195 + 205 196 struct ism_eq { 206 197 struct ism_eq_header header; 207 198 struct ism_event entry[15]; ··· 222 197 u32 dmb_bits[ISM_NR_DMBS / 32]; 223 198 u32 reserved[3]; 224 199 u16 dmbe_mask[ISM_NR_DMBS]; 200 + }; 201 + 202 + struct ism_dev { 203 + spinlock_t cmd_lock; /* serializes cmds */ 204 + struct dibs_dev *dibs; 205 + struct pci_dev *pdev; 206 + struct ism_sba *sba; 207 + dma_addr_t sba_dma_addr; 208 + DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS); 209 + 210 + struct ism_eq *ieq; 211 + dma_addr_t ieq_dma_addr; 212 + int ieq_idx; 225 213 }; 226 214 227 215 #define ISM_CREATE_REQ(dmb, idx, sf, offset) \
+71 -150
drivers/s390/net/ism_drv.c
··· 31 31 32 32 static debug_info_t *ism_debug_info; 33 33 34 - #define NO_CLIENT 0xff /* must be >= MAX_CLIENTS */ 35 - static struct ism_client *clients[MAX_CLIENTS]; /* use an array rather than */ 36 - /* a list for fast mapping */ 37 - static u8 max_client; 38 - static DEFINE_MUTEX(clients_lock); 39 - struct ism_dev_list { 40 - struct list_head list; 41 - struct mutex mutex; /* protects ism device list */ 42 - }; 43 - 44 - static struct ism_dev_list ism_dev_list = { 45 - .list = LIST_HEAD_INIT(ism_dev_list.list), 46 - .mutex = __MUTEX_INITIALIZER(ism_dev_list.mutex), 47 - }; 48 - 49 - static void ism_setup_forwarding(struct ism_client *client, struct ism_dev *ism) 50 - { 51 - unsigned long flags; 52 - 53 - spin_lock_irqsave(&ism->lock, flags); 54 - ism->subs[client->id] = client; 55 - spin_unlock_irqrestore(&ism->lock, flags); 56 - } 57 - 58 - int ism_register_client(struct ism_client *client) 59 - { 60 - struct ism_dev *ism; 61 - int i, rc = -ENOSPC; 62 - 63 - mutex_lock(&ism_dev_list.mutex); 64 - mutex_lock(&clients_lock); 65 - for (i = 0; i < MAX_CLIENTS; ++i) { 66 - if (!clients[i]) { 67 - clients[i] = client; 68 - client->id = i; 69 - if (i == max_client) 70 - max_client++; 71 - rc = 0; 72 - break; 73 - } 74 - } 75 - mutex_unlock(&clients_lock); 76 - 77 - if (i < MAX_CLIENTS) { 78 - /* initialize with all devices that we got so far */ 79 - list_for_each_entry(ism, &ism_dev_list.list, list) { 80 - ism->priv[i] = NULL; 81 - ism_setup_forwarding(client, ism); 82 - } 83 - } 84 - mutex_unlock(&ism_dev_list.mutex); 85 - 86 - return rc; 87 - } 88 - EXPORT_SYMBOL_GPL(ism_register_client); 89 - 90 - int ism_unregister_client(struct ism_client *client) 91 - { 92 - struct ism_dev *ism; 93 - unsigned long flags; 94 - int rc = 0; 95 - 96 - mutex_lock(&ism_dev_list.mutex); 97 - list_for_each_entry(ism, &ism_dev_list.list, list) { 98 - spin_lock_irqsave(&ism->lock, flags); 99 - /* Stop forwarding IRQs and events */ 100 - ism->subs[client->id] = NULL; 101 - spin_unlock_irqrestore(&ism->lock, flags); 102 - } 103 - mutex_unlock(&ism_dev_list.mutex); 104 - 105 - mutex_lock(&clients_lock); 106 - clients[client->id] = NULL; 107 - if (client->id + 1 == max_client) 108 - max_client--; 109 - mutex_unlock(&clients_lock); 110 - return rc; 111 - } 112 - EXPORT_SYMBOL_GPL(ism_unregister_client); 113 - 114 34 static int ism_cmd(struct ism_dev *ism, void *cmd) 115 35 { 116 36 struct ism_req_hdr *req = cmd; ··· 365 445 return ism_cmd(ism, &cmd); 366 446 } 367 447 448 + static int ism_signal_ieq(struct dibs_dev *dibs, const uuid_t *rgid, 449 + u32 trigger_irq, u32 event_code, u64 info) 450 + { 451 + struct ism_dev *ism = dibs->drv_priv; 452 + union ism_sig_ieq cmd; 453 + 454 + memset(&cmd, 0, sizeof(cmd)); 455 + cmd.request.hdr.cmd = ISM_SIGNAL_IEQ; 456 + cmd.request.hdr.len = sizeof(cmd.request); 457 + 458 + memcpy(&cmd.request.rgid, rgid, sizeof(cmd.request.rgid)); 459 + cmd.request.trigger_irq = trigger_irq; 460 + cmd.request.event_code = event_code; 461 + cmd.request.info = info; 462 + 463 + return ism_cmd(ism, &cmd); 464 + } 465 + 368 466 static unsigned int max_bytes(unsigned int start, unsigned int len, 369 467 unsigned int boundary) 370 468 { ··· 425 487 return to_zpci(ism->pdev)->pchid; 426 488 } 427 489 490 + static int ism_match_event_type(u32 s390_event_type) 491 + { 492 + switch (s390_event_type) { 493 + case ISM_EVENT_BUF: 494 + return DIBS_BUF_EVENT; 495 + case ISM_EVENT_DEV: 496 + return DIBS_DEV_EVENT; 497 + case ISM_EVENT_SWR: 498 + return DIBS_SW_EVENT; 499 + default: 500 + return DIBS_OTHER_TYPE; 501 + } 502 + } 503 + 504 + static int ism_match_event_subtype(u32 s390_event_subtype) 505 + { 506 + switch (s390_event_subtype) { 507 + case ISM_BUF_DMB_UNREGISTERED: 508 + return DIBS_BUF_UNREGISTERED; 509 + case ISM_DEV_GID_DISABLED: 510 + return DIBS_DEV_DISABLED; 511 + case ISM_DEV_GID_ERR_STATE: 512 + return DIBS_DEV_ERR_STATE; 513 + default: 514 + return DIBS_OTHER_SUBTYPE; 515 + } 516 + } 517 + 428 518 static void ism_handle_event(struct ism_dev *ism) 429 519 { 520 + struct dibs_dev *dibs = ism->dibs; 521 + struct dibs_event event; 430 522 struct ism_event *entry; 431 - struct ism_client *clt; 523 + struct dibs_client *clt; 432 524 int i; 433 525 434 526 while ((ism->ieq_idx + 1) != READ_ONCE(ism->ieq->header.idx)) { 435 - if (++(ism->ieq_idx) == ARRAY_SIZE(ism->ieq->entry)) 527 + if (++ism->ieq_idx == ARRAY_SIZE(ism->ieq->entry)) 436 528 ism->ieq_idx = 0; 437 529 438 530 entry = &ism->ieq->entry[ism->ieq_idx]; 439 531 debug_event(ism_debug_info, 2, entry, sizeof(*entry)); 440 - for (i = 0; i < max_client; ++i) { 441 - clt = ism->subs[i]; 532 + __memset(&event, 0, sizeof(event)); 533 + event.type = ism_match_event_type(entry->type); 534 + if (event.type == DIBS_SW_EVENT) 535 + event.subtype = entry->code; 536 + else 537 + event.subtype = ism_match_event_subtype(entry->code); 538 + event.time = entry->time; 539 + event.data = entry->info; 540 + switch (event.type) { 541 + case DIBS_BUF_EVENT: 542 + event.buffer_tok = entry->tok; 543 + break; 544 + case DIBS_DEV_EVENT: 545 + case DIBS_SW_EVENT: 546 + memcpy(&event.gid, &entry->tok, sizeof(u64)); 547 + } 548 + for (i = 0; i < MAX_DIBS_CLIENTS; ++i) { 549 + clt = dibs->subs[i]; 442 550 if (clt) 443 - clt->handle_event(ism, entry); 551 + clt->ops->handle_event(dibs, &event); 444 552 } 445 553 } 446 554 } ··· 544 560 .move_data = ism_move, 545 561 .add_vlan_id = ism_add_vlan_id, 546 562 .del_vlan_id = ism_del_vlan_id, 563 + .signal_event = ism_signal_ieq, 547 564 }; 548 565 549 566 static int ism_dev_init(struct ism_dev *ism) 550 567 { 551 568 struct pci_dev *pdev = ism->pdev; 552 - int i, ret; 569 + int ret; 553 570 554 571 ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI); 555 572 if (ret <= 0) ··· 569 584 if (ret) 570 585 goto unreg_sba; 571 586 572 - mutex_lock(&ism_dev_list.mutex); 573 - mutex_lock(&clients_lock); 574 - for (i = 0; i < max_client; ++i) { 575 - if (clients[i]) { 576 - ism_setup_forwarding(clients[i], ism); 577 - } 578 - } 579 - mutex_unlock(&clients_lock); 580 - 581 - list_add(&ism->list, &ism_dev_list.list); 582 - mutex_unlock(&ism_dev_list.mutex); 583 - 584 587 query_info(ism); 585 588 return 0; 586 589 ··· 585 612 static void ism_dev_exit(struct ism_dev *ism) 586 613 { 587 614 struct pci_dev *pdev = ism->pdev; 588 - unsigned long flags; 589 - int i; 590 - 591 - spin_lock_irqsave(&ism->lock, flags); 592 - for (i = 0; i < max_client; ++i) 593 - ism->subs[i] = NULL; 594 - spin_unlock_irqrestore(&ism->lock, flags); 595 - 596 - mutex_lock(&ism_dev_list.mutex); 597 615 598 616 unregister_ieq(ism); 599 617 unregister_sba(ism); 600 618 free_irq(pci_irq_vector(pdev, 0), ism); 601 619 pci_free_irq_vectors(pdev); 602 - list_del_init(&ism->list); 603 - mutex_unlock(&ism_dev_list.mutex); 604 620 } 605 621 606 622 static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id) ··· 603 641 if (!ism) 604 642 return -ENOMEM; 605 643 606 - spin_lock_init(&ism->lock); 607 644 spin_lock_init(&ism->cmd_lock); 608 645 dev_set_drvdata(&pdev->dev, ism); 609 646 ism->pdev = pdev; ··· 703 742 if (!ism_debug_info) 704 743 return -ENODEV; 705 744 706 - memset(clients, 0, sizeof(clients)); 707 - max_client = 0; 708 745 debug_register_view(ism_debug_info, &debug_hex_ascii_view); 709 746 ret = pci_register_driver(&ism_driver); 710 747 if (ret) ··· 719 760 720 761 module_init(ism_init); 721 762 module_exit(ism_exit); 722 - 723 - /*************************** SMC-D Implementation *****************************/ 724 - 725 - #if IS_ENABLED(CONFIG_SMC) 726 - static int ism_signal_ieq(struct ism_dev *ism, u64 rgid, u32 trigger_irq, 727 - u32 event_code, u64 info) 728 - { 729 - union ism_sig_ieq cmd; 730 - 731 - memset(&cmd, 0, sizeof(cmd)); 732 - cmd.request.hdr.cmd = ISM_SIGNAL_IEQ; 733 - cmd.request.hdr.len = sizeof(cmd.request); 734 - 735 - cmd.request.rgid = rgid; 736 - cmd.request.trigger_irq = trigger_irq; 737 - cmd.request.event_code = event_code; 738 - cmd.request.info = info; 739 - 740 - return ism_cmd(ism, &cmd); 741 - } 742 - 743 - static int smcd_signal_ieq(struct smcd_dev *smcd, struct smcd_gid *rgid, 744 - u32 trigger_irq, u32 event_code, u64 info) 745 - { 746 - return ism_signal_ieq(smcd->priv, rgid->gid, 747 - trigger_irq, event_code, info); 748 - } 749 - 750 - static const struct smcd_ops ism_smcd_ops = { 751 - .signal_event = smcd_signal_ieq, 752 - }; 753 - 754 - const struct smcd_ops *ism_get_smcd_ops(void) 755 - { 756 - return &ism_smcd_ops; 757 - } 758 - EXPORT_SYMBOL_GPL(ism_get_smcd_ops); 759 - #endif
+62
include/linux/dibs.h
··· 67 67 dma_addr_t dma_addr; 68 68 }; 69 69 70 + /* DIBS events 71 + * ----------- 72 + * Dibs devices can optionally notify dibs clients about events that happened 73 + * in the fabric or at the remote device or remote dmb. 74 + */ 75 + enum dibs_event_type { 76 + /* Buffer event, e.g. a remote dmb was unregistered */ 77 + DIBS_BUF_EVENT, 78 + /* Device event, e.g. a remote dibs device was disabled */ 79 + DIBS_DEV_EVENT, 80 + /* Software event, a dibs client can send an event signal to a 81 + * remote dibs device. 82 + */ 83 + DIBS_SW_EVENT, 84 + DIBS_OTHER_TYPE }; 85 + 86 + enum dibs_event_subtype { 87 + DIBS_BUF_UNREGISTERED, 88 + DIBS_DEV_DISABLED, 89 + DIBS_DEV_ERR_STATE, 90 + DIBS_OTHER_SUBTYPE 91 + }; 92 + 93 + struct dibs_event { 94 + u32 type; 95 + u32 subtype; 96 + /* uuid_null if invalid */ 97 + uuid_t gid; 98 + /* zero if invalid */ 99 + u64 buffer_tok; 100 + u64 time; 101 + /* additional data or zero */ 102 + u64 data; 103 + }; 104 + 70 105 struct dibs_dev; 71 106 72 107 /* DIBS client ··· 152 117 */ 153 118 void (*handle_irq)(struct dibs_dev *dev, unsigned int idx, 154 119 u16 dmbemask); 120 + /** 121 + * handle_event() - Handle control information sent by device 122 + * @dev: device reporting the event 123 + * @event: ism event structure 124 + * 125 + * * Context: Called in IRQ context by dibs device driver 126 + */ 127 + void (*handle_event)(struct dibs_dev *dev, 128 + const struct dibs_event *event); 155 129 }; 156 130 157 131 struct dibs_client { ··· 329 285 * Return: zero on success 330 286 */ 331 287 int (*del_vlan_id)(struct dibs_dev *dev, u64 vlan_id); 288 + /** 289 + * signal_event() - trigger an event at a remote dibs device (optional) 290 + * @dev: local dibs device 291 + * @rgid: gid of remote dibs device 292 + * trigger_irq: zero: notification may be coalesced with other events 293 + * non-zero: notify immediately 294 + * @subtype: 4 byte event code, meaning is defined by dibs client 295 + * @data: 8 bytes of additional information, 296 + * meaning is defined by dibs client 297 + * 298 + * dibs devices can offer support for sending a control event of type 299 + * EVENT_SWR to a remote dibs device. 300 + * NOTE: handle_event() will be called for all registered dibs clients 301 + * at the remote device. 302 + * Return: zero on success 303 + */ 304 + int (*signal_event)(struct dibs_dev *dev, const uuid_t *rgid, 305 + u32 trigger_irq, u32 event_code, u64 info); 332 306 /** 333 307 * support_mmapped_rdmb() - can this device provide memory mapped 334 308 * remote dmbs? (optional)
-15
include/net/smc.h
··· 16 16 #include <linux/types.h> 17 17 #include <linux/wait.h> 18 18 #include <linux/dibs.h> 19 - #include "linux/ism.h" 20 19 21 20 struct sock; 22 21 ··· 27 28 }; 28 29 29 30 /* SMCD/ISM device driver interface */ 30 - #define ISM_EVENT_DMB 0 31 - #define ISM_EVENT_GID 1 32 - #define ISM_EVENT_SWR 2 33 - 34 31 #define ISM_RESERVED_VLANID 0x1FFF 35 - 36 - struct smcd_dev; 37 32 38 33 struct smcd_gid { 39 34 u64 gid; 40 35 u64 gid_ext; 41 36 }; 42 37 43 - struct smcd_ops { 44 - /* optional operations */ 45 - int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid, 46 - u32 trigger_irq, u32 event_code, u64 info); 47 - }; 48 - 49 38 struct smcd_dev { 50 - const struct smcd_ops *ops; 51 - void *priv; 52 39 struct dibs_dev *dibs; 53 40 struct list_head list; 54 41 spinlock_t lock;
-1
net/smc/Kconfig
··· 2 2 config SMC 3 3 tristate "SMC socket protocol family" 4 4 depends on INET && INFINIBAND && DIBS 5 - depends on m || ISM != m 6 5 help 7 6 SMC-R provides a "sockets over RDMA" solution making use of 8 7 RDMA over Converged Ethernet (RoCE) technology to upgrade
+32 -67
net/smc/smc_ism.c
··· 17 17 #include "smc_ism.h" 18 18 #include "smc_pnet.h" 19 19 #include "smc_netlink.h" 20 - #include "linux/ism.h" 21 20 #include "linux/dibs.h" 22 21 23 22 struct smcd_dev_list smcd_dev_list = { ··· 29 30 30 31 static void smcd_register_dev(struct dibs_dev *dibs); 31 32 static void smcd_unregister_dev(struct dibs_dev *dibs); 32 - #if IS_ENABLED(CONFIG_ISM) 33 - static void smcd_handle_event(struct ism_dev *ism, struct ism_event *event); 34 - 35 - static struct ism_client smc_ism_client = { 36 - .name = "SMC-D", 37 - .handle_event = smcd_handle_event, 38 - }; 39 - #endif 33 + static void smcd_handle_event(struct dibs_dev *dibs, 34 + const struct dibs_event *event); 40 35 static void smcd_handle_irq(struct dibs_dev *dibs, unsigned int dmbno, 41 36 u16 dmbemask); 42 37 43 38 static struct dibs_client_ops smc_client_ops = { 44 39 .add_dev = smcd_register_dev, 45 40 .del_dev = smcd_unregister_dev, 41 + .handle_event = smcd_handle_event, 46 42 .handle_irq = smcd_handle_irq, 47 43 }; 48 44 ··· 393 399 return skb->len; 394 400 } 395 401 396 - #if IS_ENABLED(CONFIG_ISM) 397 402 struct smc_ism_event_work { 398 403 struct work_struct work; 399 404 struct smcd_dev *smcd; 400 - struct ism_event event; 405 + struct dibs_event event; 401 406 }; 402 407 403 408 #define ISM_EVENT_REQUEST 0x0001 ··· 416 423 417 424 static void smcd_handle_sw_event(struct smc_ism_event_work *wrk) 418 425 { 419 - struct smcd_gid peer_gid = { .gid = wrk->event.tok, 420 - .gid_ext = 0 }; 426 + struct dibs_dev *dibs = wrk->smcd->dibs; 421 427 union smcd_sw_event_info ev_info; 428 + struct smcd_gid peer_gid; 429 + uuid_t ism_rgid; 422 430 423 - ev_info.info = wrk->event.info; 424 - switch (wrk->event.code) { 431 + copy_to_smcdgid(&peer_gid, &wrk->event.gid); 432 + ev_info.info = wrk->event.data; 433 + switch (wrk->event.subtype) { 425 434 case ISM_EVENT_CODE_SHUTDOWN: /* Peer shut down DMBs */ 426 435 smc_smcd_terminate(wrk->smcd, &peer_gid, ev_info.vlan_id); 427 436 break; 428 437 case ISM_EVENT_CODE_TESTLINK: /* Activity timer */ 429 438 if (ev_info.code == ISM_EVENT_REQUEST && 430 - wrk->smcd->ops->signal_event) { 439 + dibs->ops->signal_event) { 431 440 ev_info.code = ISM_EVENT_RESPONSE; 432 - wrk->smcd->ops->signal_event(wrk->smcd, 433 - &peer_gid, 434 - ISM_EVENT_REQUEST_IR, 435 - ISM_EVENT_CODE_TESTLINK, 436 - ev_info.info); 437 - } 441 + copy_to_dibsgid(&ism_rgid, &peer_gid); 442 + dibs->ops->signal_event(dibs, &ism_rgid, 443 + ISM_EVENT_REQUEST_IR, 444 + ISM_EVENT_CODE_TESTLINK, 445 + ev_info.info); 446 + } 438 447 break; 439 448 } 440 449 } ··· 446 451 { 447 452 struct smc_ism_event_work *wrk = 448 453 container_of(work, struct smc_ism_event_work, work); 449 - struct smcd_gid smcd_gid = { .gid = wrk->event.tok, 450 - .gid_ext = 0 }; 454 + struct smcd_gid smcd_gid; 455 + 456 + copy_to_smcdgid(&smcd_gid, &wrk->event.gid); 451 457 452 458 switch (wrk->event.type) { 453 - case ISM_EVENT_GID: /* GID event, token is peer GID */ 459 + case DIBS_DEV_EVENT: /* GID event, token is peer GID */ 454 460 smc_smcd_terminate(wrk->smcd, &smcd_gid, VLAN_VID_MASK); 455 461 break; 456 - case ISM_EVENT_DMB: 462 + case DIBS_BUF_EVENT: 457 463 break; 458 - case ISM_EVENT_SWR: /* Software defined event */ 464 + case DIBS_SW_EVENT: /* Software defined event */ 459 465 smcd_handle_sw_event(wrk); 460 466 break; 461 467 } 462 468 kfree(wrk); 463 469 } 464 - #endif 465 470 466 - static struct smcd_dev *smcd_alloc_dev(const char *name, 467 - const struct smcd_ops *ops, 468 - int max_dmbs) 471 + static struct smcd_dev *smcd_alloc_dev(const char *name, int max_dmbs) 469 472 { 470 473 struct smcd_dev *smcd; 471 474 ··· 479 486 WQ_MEM_RECLAIM, name); 480 487 if (!smcd->event_wq) 481 488 goto free_conn; 482 - 483 - smcd->ops = ops; 484 489 485 490 spin_lock_init(&smcd->lock); 486 491 spin_lock_init(&smcd->lgr_lock); ··· 497 506 static void smcd_register_dev(struct dibs_dev *dibs) 498 507 { 499 508 struct smcd_dev *smcd, *fentry; 500 - const struct smcd_ops *ops; 501 - struct ism_dev *ism; 502 509 int max_dmbs; 503 510 504 511 max_dmbs = dibs->ops->max_dmbs(); 505 512 506 - if (smc_ism_is_loopback(dibs)) { 507 - ops = NULL; 508 - } else { 509 - ism = dibs->drv_priv; 510 - #if IS_ENABLED(CONFIG_ISM) 511 - ops = ism_get_smcd_ops(); 512 - #endif 513 - } 514 - smcd = smcd_alloc_dev(dev_name(&dibs->dev), ops, max_dmbs); 513 + smcd = smcd_alloc_dev(dev_name(&dibs->dev), max_dmbs); 515 514 if (!smcd) 516 515 return; 517 516 518 517 smcd->dibs = dibs; 519 518 dibs_set_priv(dibs, &smc_dibs_client, smcd); 520 - 521 - if (smc_ism_is_loopback(dibs)) { 522 - smcd->priv = NULL; 523 - } else { 524 - smcd->priv = ism; 525 - #if IS_ENABLED(CONFIG_ISM) 526 - ism_set_priv(ism, &smc_ism_client, smcd); 527 - #endif 528 - } 529 519 530 520 if (smc_pnetid_by_dev_port(dibs->dev.parent, 0, smcd->pnetid)) 531 521 smc_pnetid_by_table_smcd(smcd); ··· 562 590 kfree(smcd); 563 591 } 564 592 565 - #if IS_ENABLED(CONFIG_ISM) 566 593 /* SMCD Device event handler. Called from ISM device interrupt handler. 567 594 * Parameters are ism device pointer, 568 595 * - event->type (0 --> DMB, 1 --> GID), ··· 573 602 * Context: 574 603 * - Function called in IRQ context from ISM device driver event handler. 575 604 */ 576 - static void smcd_handle_event(struct ism_dev *ism, struct ism_event *event) 605 + static void smcd_handle_event(struct dibs_dev *dibs, 606 + const struct dibs_event *event) 577 607 { 578 - struct smcd_dev *smcd = ism_get_priv(ism, &smc_ism_client); 608 + struct smcd_dev *smcd = dibs_get_priv(dibs, &smc_dibs_client); 579 609 struct smc_ism_event_work *wrk; 580 610 581 611 if (smcd->going_away) ··· 590 618 wrk->event = *event; 591 619 queue_work(smcd->event_wq, &wrk->work); 592 620 } 593 - #endif 594 621 595 622 /* SMCD Device interrupt handler. Called from ISM device interrupt handler. 596 623 * Parameters are the ism device pointer, DMB number, and the DMBE bitmask. ··· 615 644 int smc_ism_signal_shutdown(struct smc_link_group *lgr) 616 645 { 617 646 int rc = 0; 618 - #if IS_ENABLED(CONFIG_ISM) 619 647 union smcd_sw_event_info ev_info; 648 + uuid_t ism_rgid; 620 649 621 650 if (lgr->peer_shutdown) 622 651 return 0; 623 - if (!lgr->smcd->ops->signal_event) 652 + if (!lgr->smcd->dibs->ops->signal_event) 624 653 return 0; 625 654 626 655 memcpy(ev_info.uid, lgr->id, SMC_LGR_ID_SIZE); 627 656 ev_info.vlan_id = lgr->vlan_id; 628 657 ev_info.code = ISM_EVENT_REQUEST; 629 - rc = lgr->smcd->ops->signal_event(lgr->smcd, &lgr->peer_gid, 658 + copy_to_dibsgid(&ism_rgid, &lgr->peer_gid); 659 + rc = lgr->smcd->dibs->ops->signal_event(lgr->smcd->dibs, &ism_rgid, 630 660 ISM_EVENT_REQUEST_IR, 631 661 ISM_EVENT_CODE_SHUTDOWN, 632 662 ev_info.info); 633 - #endif 634 663 return rc; 635 664 } 636 665 ··· 641 670 smc_ism_v2_capable = false; 642 671 smc_ism_create_system_eid(); 643 672 644 - #if IS_ENABLED(CONFIG_ISM) 645 - rc = ism_register_client(&smc_ism_client); 646 - #endif 647 673 rc = dibs_register_client(&smc_dibs_client); 648 674 return rc; 649 675 } ··· 648 680 void smc_ism_exit(void) 649 681 { 650 682 dibs_unregister_client(&smc_dibs_client); 651 - #if IS_ENABLED(CONFIG_ISM) 652 - ism_unregister_client(&smc_ism_client); 653 - #endif 654 683 }