mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
net/smc: mark optional smcd_ops and check for support when called
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>
This commit is contained in:
parent
f7a22071db
commit
d1d8d0b6c7
@ -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 {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user