blob: cc00a2ec4e92e8060bce1926169832f7f7d96eb2 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Ursula Braun9bf9abe2017-01-09 16:55:21 +01002/*
3 * Shared Memory Communications over RDMA (SMC-R) and RoCE
4 *
5 * Definitions for LLC (link layer control) message handling
6 *
7 * Copyright IBM Corp. 2016
8 *
9 * Author(s): Klaus Wacker <Klaus.Wacker@de.ibm.com>
10 * Ursula Braun <ubraun@linux.vnet.ibm.com>
11 */
12
13#ifndef SMC_LLC_H
14#define SMC_LLC_H
15
16#include "smc_wr.h"
17
18#define SMC_LLC_FLAG_RESP 0x80
19
20#define SMC_LLC_WAIT_FIRST_TIME (5 * HZ)
Karsten Graul52bedf32018-03-01 13:51:32 +010021#define SMC_LLC_WAIT_TIME (2 * HZ)
Ursula Braun9bf9abe2017-01-09 16:55:21 +010022
23enum smc_llc_reqresp {
24 SMC_LLC_REQ,
25 SMC_LLC_RESP
26};
27
28enum smc_llc_msg_type {
29 SMC_LLC_CONFIRM_LINK = 0x01,
Karsten Graul52bedf32018-03-01 13:51:32 +010030 SMC_LLC_ADD_LINK = 0x02,
Karsten Graul87f88cd2020-05-03 14:38:41 +020031 SMC_LLC_ADD_LINK_CONT = 0x03,
Karsten Graul52bedf32018-03-01 13:51:32 +010032 SMC_LLC_DELETE_LINK = 0x04,
Karsten Graul4ed75de2018-03-01 13:51:30 +010033 SMC_LLC_CONFIRM_RKEY = 0x06,
Karsten Graul313164d2018-03-01 13:51:29 +010034 SMC_LLC_TEST_LINK = 0x07,
Karsten Graul4ed75de2018-03-01 13:51:30 +010035 SMC_LLC_CONFIRM_RKEY_CONT = 0x08,
36 SMC_LLC_DELETE_RKEY = 0x09,
Ursula Braun9bf9abe2017-01-09 16:55:21 +010037};
38
Karsten Graul541afa12020-05-01 12:48:08 +020039#define smc_link_downing(state) \
40 (cmpxchg(state, SMC_LNK_ACTIVE, SMC_LNK_INACTIVE) == SMC_LNK_ACTIVE)
41
Karsten Graulfbed3b32020-05-01 12:48:04 +020042/* LLC DELETE LINK Request Reason Codes */
43#define SMC_LLC_DEL_LOST_PATH 0x00010000
44#define SMC_LLC_DEL_OP_INIT_TERM 0x00020000
45#define SMC_LLC_DEL_PROG_INIT_TERM 0x00030000
46#define SMC_LLC_DEL_PROT_VIOL 0x00040000
47#define SMC_LLC_DEL_NO_ASYM_NEEDED 0x00050000
48/* LLC DELETE LINK Response Reason Codes */
49#define SMC_LLC_DEL_NOLNK 0x00100000 /* Unknown Link ID (no link) */
50#define SMC_LLC_DEL_NOLGR 0x00200000 /* Unknown Link Group */
51
Karsten Grauld854fcb2020-04-29 17:10:43 +020052/* returns a usable link of the link group, or NULL */
53static inline struct smc_link *smc_llc_usable_link(struct smc_link_group *lgr)
54{
55 int i;
56
57 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++)
58 if (smc_link_usable(&lgr->lnk[i]))
59 return &lgr->lnk[i];
60 return NULL;
61}
62
Karsten Graul3e0c40a2020-05-04 14:18:45 +020063/* set the termination reason code for the link group */
64static inline void smc_llc_set_termination_rsn(struct smc_link_group *lgr,
65 u32 rsn)
66{
67 if (!lgr->llc_termination_rsn)
68 lgr->llc_termination_rsn = rsn;
69}
70
Ursula Braun9bf9abe2017-01-09 16:55:21 +010071/* transmit */
Ursula Braun947541f2018-07-25 16:35:30 +020072int smc_llc_send_confirm_link(struct smc_link *lnk,
Ursula Braun9bf9abe2017-01-09 16:55:21 +010073 enum smc_llc_reqresp reqresp);
Ursula Braun7005ada2018-07-25 16:35:31 +020074int smc_llc_send_add_link(struct smc_link *link, u8 mac[], u8 gid[],
Karsten Graulfbed3b32020-05-01 12:48:04 +020075 struct smc_link *link_new,
Karsten Graul52bedf32018-03-01 13:51:32 +010076 enum smc_llc_reqresp reqresp);
Karsten Graulfbed3b32020-05-01 12:48:04 +020077int smc_llc_send_delete_link(struct smc_link *link, u8 link_del_id,
78 enum smc_llc_reqresp reqresp, bool orderly,
79 u32 reason);
Karsten Graul4dadd152020-05-03 14:38:50 +020080void smc_llc_srv_delete_link_local(struct smc_link *link, u8 del_link_id);
Karsten Graul00a049c2020-04-29 17:10:49 +020081void smc_llc_lgr_init(struct smc_link_group *lgr, struct smc_sock *smc);
82void smc_llc_lgr_clear(struct smc_link_group *lgr);
Karsten Graul2a4c57a2018-05-15 17:04:59 +020083int smc_llc_link_init(struct smc_link *link);
Karsten Graul00a049c2020-04-29 17:10:49 +020084void smc_llc_link_active(struct smc_link *link);
Karsten Graul0a99be42020-05-05 15:01:20 +020085void smc_llc_link_clear(struct smc_link *link, bool log);
Karsten Graul3d88a212020-04-30 15:55:44 +020086int smc_llc_do_confirm_rkey(struct smc_link *send_link,
Karsten Graul44aa81c2018-05-15 17:04:55 +020087 struct smc_buf_desc *rmb_desc);
Karsten Graul6d74c3a2020-04-30 15:55:45 +020088int smc_llc_do_delete_rkey(struct smc_link_group *lgr,
Karsten Graul60e03c62018-11-22 10:26:42 +010089 struct smc_buf_desc *rmb_desc);
Karsten Graul555da9a2020-04-30 15:55:38 +020090int smc_llc_flow_initiate(struct smc_link_group *lgr,
91 enum smc_llc_flowtype type);
92void smc_llc_flow_stop(struct smc_link_group *lgr, struct smc_llc_flow *flow);
Karsten Graul92334cf2020-04-30 15:55:41 +020093int smc_llc_eval_conf_link(struct smc_llc_qentry *qentry,
94 enum smc_llc_reqresp type);
Karsten Graul45fa8da2020-05-04 14:18:47 +020095void smc_llc_link_set_uid(struct smc_link *link);
Karsten Graul649758f2020-05-04 14:18:48 +020096void smc_llc_save_peer_uid(struct smc_llc_qentry *qentry);
Karsten Graul555da9a2020-04-30 15:55:38 +020097struct smc_llc_qentry *smc_llc_wait(struct smc_link_group *lgr,
98 struct smc_link *lnk,
99 int time_out, u8 exp_msg);
100struct smc_llc_qentry *smc_llc_flow_qentry_clr(struct smc_llc_flow *flow);
101void smc_llc_flow_qentry_del(struct smc_llc_flow *flow);
Karsten Graulf3811fd2020-05-04 14:18:42 +0200102void smc_llc_send_link_delete_all(struct smc_link_group *lgr, bool ord,
103 u32 rsn);
Karsten Graulb1570a82020-05-03 14:38:42 +0200104int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry);
Karsten Graul2d2209f2020-05-03 14:38:43 +0200105int smc_llc_srv_add_link(struct smc_link *link);
Karsten Graulc48254f2020-07-18 15:06:14 +0200106void smc_llc_add_link_local(struct smc_link *link);
Ursula Braun9bf9abe2017-01-09 16:55:21 +0100107int smc_llc_init(void) __init;
108
109#endif /* SMC_LLC_H */