]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net/smc: mark optional smcd_ops and check for support when called
authorWen Gu <guwen@linux.alibaba.com>
Sun, 28 Apr 2024 06:07:32 +0000 (14:07 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 30 Apr 2024 11:24:48 +0000 (13:24 +0200)
Some operations are not supported by new introduced Emulated-ISM, so
mark them as optional and check if the device supports them when called.

Signed-off-by: Wen Gu <guwen@linux.alibaba.com>
Reviewed-by: Wenjia Zhang <wenjia@linux.ibm.com>
Reviewed-and-tested-by: Jan Karcher <jaka@linux.ibm.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/net/smc.h
net/smc/smc_ism.c

index 542d12372c180ea2a0eb323e209c7c25867c8ba0..33b753115e439e0e8a681419a1f65ef9c959c58c 100644 (file)
@@ -59,12 +59,6 @@ struct smcd_ops {
        int (*register_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb,
                            void *client);
        int (*unregister_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb);
-       int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
-       int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
-       int (*set_vlan_required)(struct smcd_dev *dev);
-       int (*reset_vlan_required)(struct smcd_dev *dev);
-       int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
-                           u32 trigger_irq, u32 event_code, u64 info);
        int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx,
                         bool sf, unsigned int offset, void *data,
                         unsigned int size);
@@ -72,6 +66,14 @@ struct smcd_ops {
        void (*get_local_gid)(struct smcd_dev *dev, struct smcd_gid *gid);
        u16 (*get_chid)(struct smcd_dev *dev);
        struct device* (*get_dev)(struct smcd_dev *dev);
+
+       /* optional operations */
+       int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
+       int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
+       int (*set_vlan_required)(struct smcd_dev *dev);
+       int (*reset_vlan_required)(struct smcd_dev *dev);
+       int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
+                           u32 trigger_irq, u32 event_code, u64 info);
 };
 
 struct smcd_dev {
index 05172658673000bfe82d5091bfdeed68cfdc16ee..36459a3c739da78fa49d87d08a66a92c52c62a50 100644 (file)
@@ -126,6 +126,8 @@ int smc_ism_get_vlan(struct smcd_dev *smcd, unsigned short vlanid)
 
        if (!vlanid)                    /* No valid vlan id */
                return -EINVAL;
+       if (!smcd->ops->add_vlan_id)
+               return -EOPNOTSUPP;
 
        /* create new vlan entry, in case we need it */
        new_vlan = kzalloc(sizeof(*new_vlan), GFP_KERNEL);
@@ -171,6 +173,8 @@ int smc_ism_put_vlan(struct smcd_dev *smcd, unsigned short vlanid)
 
        if (!vlanid)                    /* No valid vlan id */
                return -EINVAL;
+       if (!smcd->ops->del_vlan_id)
+               return -EOPNOTSUPP;
 
        spin_lock_irqsave(&smcd->lock, flags);
        list_for_each_entry(vlan, &smcd->vlan, list) {
@@ -368,7 +372,8 @@ static void smcd_handle_sw_event(struct smc_ism_event_work *wrk)
                smc_smcd_terminate(wrk->smcd, &peer_gid, ev_info.vlan_id);
                break;
        case ISM_EVENT_CODE_TESTLINK:   /* Activity timer */
-               if (ev_info.code == ISM_EVENT_REQUEST) {
+               if (ev_info.code == ISM_EVENT_REQUEST &&
+                   wrk->smcd->ops->signal_event) {
                        ev_info.code = ISM_EVENT_RESPONSE;
                        wrk->smcd->ops->signal_event(wrk->smcd,
                                                     &peer_gid,
@@ -538,6 +543,8 @@ int smc_ism_signal_shutdown(struct smc_link_group *lgr)
 
        if (lgr->peer_shutdown)
                return 0;
+       if (!lgr->smcd->ops->signal_event)
+               return 0;
 
        memcpy(ev_info.uid, lgr->id, SMC_LGR_ID_SIZE);
        ev_info.vlan_id = lgr->vlan_id;