Lines Matching +full:device +full:- +full:id

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
16 * - Redistributions of source code must retain the above
20 * - Redistributions in binary form must reproduce the above
34 * $Id$
53 sdp_dbg(sk, "QP Event: %s (%d)", ib_event_msg(event->event), in sdp_qp_event_handler()
54 event->event); in sdp_qp_event_handler()
61 static int max_sges = -1; in sdp_get_max_dev_sge()
66 device_attr = &dev->attrs; in sdp_get_max_dev_sge()
67 max_sges = device_attr->max_sge; in sdp_get_max_dev_sge()
74 sdp_init_qp(struct socket *sk, struct rdma_cm_id *id) in sdp_init_qp() argument
84 struct ib_device *device = id->device; in sdp_init_qp() local
91 ssk->max_sge = sdp_get_max_dev_sge(device); in sdp_init_qp()
92 sdp_dbg(sk, "Max sges: %d\n", ssk->max_sge); in sdp_init_qp()
94 qp_init_attr.cap.max_send_sge = MIN(ssk->max_sge, SDP_MAX_SEND_SGES); in sdp_init_qp()
98 qp_init_attr.cap.max_recv_sge = MIN(ssk->max_sge, SDP_MAX_RECV_SGES); in sdp_init_qp()
102 ssk->sdp_dev = ib_get_client_data(device, &sdp_client); in sdp_init_qp()
103 if (!ssk->sdp_dev) { in sdp_init_qp()
104 sdp_warn(sk, "SDP not available on device %s\n", device->name); in sdp_init_qp()
105 rc = -ENODEV; in sdp_init_qp()
109 rc = sdp_rx_ring_create(ssk, device); in sdp_init_qp()
113 rc = sdp_tx_ring_create(ssk, device); in sdp_init_qp()
117 qp_init_attr.recv_cq = ssk->rx_ring.cq; in sdp_init_qp()
118 qp_init_attr.send_cq = ssk->tx_ring.cq; in sdp_init_qp()
120 rc = rdma_create_qp(id, ssk->sdp_dev->pd, &qp_init_attr); in sdp_init_qp()
125 ssk->qp = id->qp; in sdp_init_qp()
126 ssk->ib_device = device; in sdp_init_qp()
127 ssk->qp_active = 1; in sdp_init_qp()
128 ssk->context.device = device; in sdp_init_qp()
142 sdp_connect_handler(struct socket *sk, struct rdma_cm_id *id, in sdp_connect_handler() argument
152 sdp_dbg(sk, "%s %p -> %p\n", __func__, sdp_sk(sk)->id, id); in sdp_connect_handler()
154 h = event->param.conn.private_data; in sdp_connect_handler()
155 SDP_DUMP_PACKET(sk, "RX", NULL, &h->bsdh); in sdp_connect_handler()
157 if (!h->max_adverts) in sdp_connect_handler()
158 return -EINVAL; in sdp_connect_handler()
162 return -ENOMEM; in sdp_connect_handler()
165 rc = sdp_init_qp(child, id); in sdp_connect_handler()
169 id->context = ssk; in sdp_connect_handler()
170 ssk->id = id; in sdp_connect_handler()
171 ssk->socket = child; in sdp_connect_handler()
172 ssk->cred = crhold(child->so_cred); in sdp_connect_handler()
173 dst_addr = (struct sockaddr_in *)&id->route.addr.dst_addr; in sdp_connect_handler()
174 src_addr = (struct sockaddr_in *)&id->route.addr.src_addr; in sdp_connect_handler()
175 ssk->fport = dst_addr->sin_port; in sdp_connect_handler()
176 ssk->faddr = dst_addr->sin_addr.s_addr; in sdp_connect_handler()
177 ssk->lport = src_addr->sin_port; in sdp_connect_handler()
178 ssk->max_bufs = ntohs(h->bsdh.bufs); in sdp_connect_handler()
179 atomic_set(&ssk->tx_ring.credits, ssk->max_bufs); in sdp_connect_handler()
180 ssk->min_bufs = tx_credits(ssk) / 4; in sdp_connect_handler()
181 ssk->xmit_size_goal = ntohl(h->localrcvsz) - sizeof(struct sdp_bsdh); in sdp_connect_handler()
183 ssk->state = TCPS_SYN_RECEIVED; in sdp_connect_handler()
190 sdp_response_handler(struct socket *sk, struct rdma_cm_id *id, in sdp_response_handler() argument
200 ssk->state = TCPS_ESTABLISHED; in sdp_response_handler()
202 if (ssk->flags & SDP_DROPPED) { in sdp_response_handler()
206 if (sk->so_options & SO_KEEPALIVE) in sdp_response_handler()
208 h = event->param.conn.private_data; in sdp_response_handler()
209 SDP_DUMP_PACKET(sk, "RX", NULL, &h->bsdh); in sdp_response_handler()
210 ssk->max_bufs = ntohs(h->bsdh.bufs); in sdp_response_handler()
211 atomic_set(&ssk->tx_ring.credits, ssk->max_bufs); in sdp_response_handler()
212 ssk->min_bufs = tx_credits(ssk) / 4; in sdp_response_handler()
213 ssk->xmit_size_goal = in sdp_response_handler()
214 ntohl(h->actrcvsz) - sizeof(struct sdp_bsdh); in sdp_response_handler()
215 ssk->poll_cq = 1; in sdp_response_handler()
217 dst_addr = (struct sockaddr_in *)&id->route.addr.dst_addr; in sdp_response_handler()
218 ssk->fport = dst_addr->sin_port; in sdp_response_handler()
219 ssk->faddr = dst_addr->sin_addr.s_addr; in sdp_response_handler()
235 ssk->state = TCPS_ESTABLISHED; in sdp_connected_handler()
239 if (sk->so_options & SO_KEEPALIVE) in sdp_connected_handler()
242 if ((ssk->flags & SDP_DROPPED) == 0) in sdp_connected_handler()
257 if (sdp_sk(sk)->state == TCPS_SYN_RECEIVED) { in sdp_disconnected_handler()
264 return -ECONNRESET; in sdp_disconnected_handler()
268 sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) in sdp_cma_handler() argument
278 ssk = id->context; in sdp_cma_handler()
281 sk = ssk->socket; in sdp_cma_handler()
282 if (!ssk || !sk || !ssk->id) { in sdp_cma_handler()
284 "cm_id is being torn down, event %d, ssk %p, sk %p, id %p\n", in sdp_cma_handler()
285 event->event, ssk, sk, id); in sdp_cma_handler()
286 return event->event == RDMA_CM_EVENT_CONNECT_REQUEST ? in sdp_cma_handler()
287 -EINVAL : 0; in sdp_cma_handler()
290 sdp_dbg(sk, "%s event %d id %p\n", __func__, event->event, id); in sdp_cma_handler()
291 switch (event->event) { in sdp_cma_handler()
296 rdma_node_get_transport(id->device->node_type) == in sdp_cma_handler()
298 rdma_port_get_link_layer(id->device, id->port_num) != in sdp_cma_handler()
302 rdma_port_get_link_layer(id->device, id->port_num)); in sdp_cma_handler()
303 rc = -ENETUNREACH; in sdp_cma_handler()
307 rc = rdma_resolve_route(id, SDP_ROUTE_TIMEOUT); in sdp_cma_handler()
311 rc = -ENETUNREACH; in sdp_cma_handler()
314 sdp_dbg(sk, "RDMA_CM_EVENT_ROUTE_RESOLVED : %p\n", id); in sdp_cma_handler()
315 rc = sdp_init_qp(sk, id); in sdp_cma_handler()
318 atomic_set(&sdp_sk(sk)->remote_credits, in sdp_cma_handler()
328 hh.localrcvsz = hh.desremrcvsz = htonl(sdp_sk(sk)->recv_bytes); in sdp_cma_handler()
330 sdp_sk(sk)->laddr = in sdp_cma_handler()
331 ((struct sockaddr_in *)&id->route.addr.src_addr)->sin_addr.s_addr; in sdp_cma_handler()
339 rc = rdma_connect(id, &conn_param); in sdp_cma_handler()
342 sdp_dbg(sk, "RDMA_CM_EVENT_ROUTE_ERROR : %p\n", id); in sdp_cma_handler()
343 rc = -ETIMEDOUT; in sdp_cma_handler()
347 rc = sdp_connect_handler(sk, id, event); in sdp_cma_handler()
350 rdma_reject(id, NULL, 0); in sdp_cma_handler()
353 ssk = id->context; in sdp_cma_handler()
354 atomic_set(&ssk->remote_credits, rx_ring_posted(ssk)); in sdp_cma_handler()
362 hah.actrcvsz = htonl(ssk->recv_bytes); in sdp_cma_handler()
370 rc = rdma_accept(id, &conn_param); in sdp_cma_handler()
372 ssk->id = NULL; in sdp_cma_handler()
373 id->qp = NULL; in sdp_cma_handler()
374 id->context = NULL; in sdp_cma_handler()
379 rc = sdp_response_handler(sk, id, event); in sdp_cma_handler()
382 rdma_reject(id, NULL, 0); in sdp_cma_handler()
384 rc = rdma_accept(id, NULL); in sdp_cma_handler()
388 rc = -ETIMEDOUT; in sdp_cma_handler()
392 rc = -ENETUNREACH; in sdp_cma_handler()
396 rc = -ECONNREFUSED; in sdp_cma_handler()
400 sdp_sk(sk)->laddr = in sdp_cma_handler()
401 ((struct sockaddr_in *)&id->route.addr.src_addr)->sin_addr.s_addr; in sdp_cma_handler()
408 if (ssk->state == TCPS_LAST_ACK) { in sdp_cma_handler()
414 ssk->qp_active = 0; in sdp_cma_handler()
416 rdma_disconnect(id); in sdp_cma_handler()
418 if (ssk->state != TCPS_TIME_WAIT) { in sdp_cma_handler()
419 if (ssk->state == TCPS_CLOSE_WAIT) { in sdp_cma_handler()
426 rc = -EPIPE; in sdp_cma_handler()
438 rc = -ENETRESET; in sdp_cma_handler()
442 event->event); in sdp_cma_handler()
443 rc = -ECONNABORTED; in sdp_cma_handler()
448 rdma_event_msg(event->event), event->event, rc); in sdp_cma_handler()
452 if (ssk->id == id) { in sdp_cma_handler()
453 ssk->id = NULL; in sdp_cma_handler()
454 id->qp = NULL; in sdp_cma_handler()
455 id->context = NULL; in sdp_cma_handler()
456 if (sdp_notify(ssk, -rc)) in sdp_cma_handler()