forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-09 244b2c5ca8b14627e4a17755e5922221e121c771
kernel/drivers/infiniband/core/iwcm.c
....@@ -87,7 +87,8 @@
8787 [RDMA_NL_IWPM_REMOTE_INFO] = {.dump = iwpm_remote_info_cb},
8888 [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb},
8989 [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb},
90
- [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb}
90
+ [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb},
91
+ [RDMA_NL_IWPM_HELLO] = {.dump = iwpm_hello_cb}
9192 };
9293
9394 static struct workqueue_struct *iwcm_wq;
....@@ -373,6 +374,7 @@
373374 static void destroy_cm_id(struct iw_cm_id *cm_id)
374375 {
375376 struct iwcm_id_private *cm_id_priv;
377
+ struct ib_qp *qp;
376378 unsigned long flags;
377379
378380 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
....@@ -390,19 +392,22 @@
390392 set_bit(IWCM_F_DROP_EVENTS, &cm_id_priv->flags);
391393
392394 spin_lock_irqsave(&cm_id_priv->lock, flags);
395
+ qp = cm_id_priv->qp;
396
+ cm_id_priv->qp = NULL;
397
+
393398 switch (cm_id_priv->state) {
394399 case IW_CM_STATE_LISTEN:
395400 cm_id_priv->state = IW_CM_STATE_DESTROYING;
396401 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
397402 /* destroy the listening endpoint */
398
- cm_id->device->iwcm->destroy_listen(cm_id);
403
+ cm_id->device->ops.iw_destroy_listen(cm_id);
399404 spin_lock_irqsave(&cm_id_priv->lock, flags);
400405 break;
401406 case IW_CM_STATE_ESTABLISHED:
402407 cm_id_priv->state = IW_CM_STATE_DESTROYING;
403408 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
404409 /* Abrupt close of the connection */
405
- (void)iwcm_modify_qp_err(cm_id_priv->qp);
410
+ (void)iwcm_modify_qp_err(qp);
406411 spin_lock_irqsave(&cm_id_priv->lock, flags);
407412 break;
408413 case IW_CM_STATE_IDLE:
....@@ -418,7 +423,7 @@
418423 */
419424 cm_id_priv->state = IW_CM_STATE_DESTROYING;
420425 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
421
- cm_id->device->iwcm->reject(cm_id, NULL, 0);
426
+ cm_id->device->ops.iw_reject(cm_id, NULL, 0);
422427 spin_lock_irqsave(&cm_id_priv->lock, flags);
423428 break;
424429 case IW_CM_STATE_CONN_SENT:
....@@ -427,11 +432,9 @@
427432 BUG();
428433 break;
429434 }
430
- if (cm_id_priv->qp) {
431
- cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
432
- cm_id_priv->qp = NULL;
433
- }
434435 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
436
+ if (qp)
437
+ cm_id_priv->id.device->ops.iw_rem_ref(qp);
435438
436439 if (cm_id->mapped) {
437440 iwpm_remove_mapinfo(&cm_id->local_addr, &cm_id->m_local_addr);
....@@ -504,17 +507,21 @@
504507 */
505508 static int iw_cm_map(struct iw_cm_id *cm_id, bool active)
506509 {
507
- struct iwpm_dev_data pm_reg_msg;
510
+ const char *devname = dev_name(&cm_id->device->dev);
511
+ const char *ifname = cm_id->device->iw_ifname;
512
+ struct iwpm_dev_data pm_reg_msg = {};
508513 struct iwpm_sa_data pm_msg;
509514 int status;
515
+
516
+ if (strlen(devname) >= sizeof(pm_reg_msg.dev_name) ||
517
+ strlen(ifname) >= sizeof(pm_reg_msg.if_name))
518
+ return -EINVAL;
510519
511520 cm_id->m_local_addr = cm_id->local_addr;
512521 cm_id->m_remote_addr = cm_id->remote_addr;
513522
514
- memcpy(pm_reg_msg.dev_name, cm_id->device->name,
515
- sizeof(pm_reg_msg.dev_name));
516
- memcpy(pm_reg_msg.if_name, cm_id->device->iwcm->ifname,
517
- sizeof(pm_reg_msg.if_name));
523
+ strcpy(pm_reg_msg.dev_name, devname);
524
+ strcpy(pm_reg_msg.if_name, ifname);
518525
519526 if (iwpm_register_pid(&pm_reg_msg, RDMA_NL_IWCM) ||
520527 !iwpm_valid_pid())
....@@ -523,6 +530,8 @@
523530 cm_id->mapped = true;
524531 pm_msg.loc_addr = cm_id->local_addr;
525532 pm_msg.rem_addr = cm_id->remote_addr;
533
+ pm_msg.flags = (cm_id->device->iw_driver_flags & IW_F_NO_PORT_MAP) ?
534
+ IWPM_FLAGS_NO_PORT_MAP : 0;
526535 if (active)
527536 status = iwpm_add_and_query_mapping(&pm_msg,
528537 RDMA_NL_IWCM);
....@@ -541,7 +550,7 @@
541550
542551 return iwpm_create_mapinfo(&cm_id->local_addr,
543552 &cm_id->m_local_addr,
544
- RDMA_NL_IWCM);
553
+ RDMA_NL_IWCM, pm_msg.flags);
545554 }
546555
547556 /*
....@@ -572,7 +581,8 @@
572581 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
573582 ret = iw_cm_map(cm_id, false);
574583 if (!ret)
575
- ret = cm_id->device->iwcm->create_listen(cm_id, backlog);
584
+ ret = cm_id->device->ops.iw_create_listen(cm_id,
585
+ backlog);
576586 if (ret)
577587 cm_id_priv->state = IW_CM_STATE_IDLE;
578588 spin_lock_irqsave(&cm_id_priv->lock, flags);
....@@ -612,7 +622,7 @@
612622 cm_id_priv->state = IW_CM_STATE_IDLE;
613623 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
614624
615
- ret = cm_id->device->iwcm->reject(cm_id, private_data,
625
+ ret = cm_id->device->ops.iw_reject(cm_id, private_data,
616626 private_data_len);
617627
618628 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
....@@ -648,28 +658,28 @@
648658 return -EINVAL;
649659 }
650660 /* Get the ib_qp given the QPN */
651
- qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn);
661
+ qp = cm_id->device->ops.iw_get_qp(cm_id->device, iw_param->qpn);
652662 if (!qp) {
653663 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
654664 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
655665 wake_up_all(&cm_id_priv->connect_wait);
656666 return -EINVAL;
657667 }
658
- cm_id->device->iwcm->add_ref(qp);
668
+ cm_id->device->ops.iw_add_ref(qp);
659669 cm_id_priv->qp = qp;
660670 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
661671
662
- ret = cm_id->device->iwcm->accept(cm_id, iw_param);
672
+ ret = cm_id->device->ops.iw_accept(cm_id, iw_param);
663673 if (ret) {
664674 /* An error on accept precludes provider events */
665675 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
666676 cm_id_priv->state = IW_CM_STATE_IDLE;
667677 spin_lock_irqsave(&cm_id_priv->lock, flags);
668
- if (cm_id_priv->qp) {
669
- cm_id->device->iwcm->rem_ref(qp);
670
- cm_id_priv->qp = NULL;
671
- }
678
+ qp = cm_id_priv->qp;
679
+ cm_id_priv->qp = NULL;
672680 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
681
+ if (qp)
682
+ cm_id->device->ops.iw_rem_ref(qp);
673683 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
674684 wake_up_all(&cm_id_priv->connect_wait);
675685 }
....@@ -690,7 +700,7 @@
690700 struct iwcm_id_private *cm_id_priv;
691701 int ret;
692702 unsigned long flags;
693
- struct ib_qp *qp;
703
+ struct ib_qp *qp = NULL;
694704
695705 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
696706
....@@ -707,30 +717,30 @@
707717 }
708718
709719 /* Get the ib_qp given the QPN */
710
- qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn);
720
+ qp = cm_id->device->ops.iw_get_qp(cm_id->device, iw_param->qpn);
711721 if (!qp) {
712722 ret = -EINVAL;
713723 goto err;
714724 }
715
- cm_id->device->iwcm->add_ref(qp);
725
+ cm_id->device->ops.iw_add_ref(qp);
716726 cm_id_priv->qp = qp;
717727 cm_id_priv->state = IW_CM_STATE_CONN_SENT;
718728 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
719729
720730 ret = iw_cm_map(cm_id, true);
721731 if (!ret)
722
- ret = cm_id->device->iwcm->connect(cm_id, iw_param);
732
+ ret = cm_id->device->ops.iw_connect(cm_id, iw_param);
723733 if (!ret)
724734 return 0; /* success */
725735
726736 spin_lock_irqsave(&cm_id_priv->lock, flags);
727
- if (cm_id_priv->qp) {
728
- cm_id->device->iwcm->rem_ref(qp);
729
- cm_id_priv->qp = NULL;
730
- }
737
+ qp = cm_id_priv->qp;
738
+ cm_id_priv->qp = NULL;
731739 cm_id_priv->state = IW_CM_STATE_IDLE;
732740 err:
733741 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
742
+ if (qp)
743
+ cm_id->device->ops.iw_rem_ref(qp);
734744 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
735745 wake_up_all(&cm_id_priv->connect_wait);
736746 return ret;
....@@ -872,6 +882,7 @@
872882 static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv,
873883 struct iw_cm_event *iw_event)
874884 {
885
+ struct ib_qp *qp = NULL;
875886 unsigned long flags;
876887 int ret;
877888
....@@ -890,11 +901,13 @@
890901 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
891902 } else {
892903 /* REJECTED or RESET */
893
- cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
904
+ qp = cm_id_priv->qp;
894905 cm_id_priv->qp = NULL;
895906 cm_id_priv->state = IW_CM_STATE_IDLE;
896907 }
897908 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
909
+ if (qp)
910
+ cm_id_priv->id.device->ops.iw_rem_ref(qp);
898911 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
899912
900913 if (iw_event->private_data_len)
....@@ -936,21 +949,18 @@
936949 static int cm_close_handler(struct iwcm_id_private *cm_id_priv,
937950 struct iw_cm_event *iw_event)
938951 {
952
+ struct ib_qp *qp;
939953 unsigned long flags;
940
- int ret = 0;
954
+ int ret = 0, notify_event = 0;
941955 spin_lock_irqsave(&cm_id_priv->lock, flags);
956
+ qp = cm_id_priv->qp;
957
+ cm_id_priv->qp = NULL;
942958
943
- if (cm_id_priv->qp) {
944
- cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
945
- cm_id_priv->qp = NULL;
946
- }
947959 switch (cm_id_priv->state) {
948960 case IW_CM_STATE_ESTABLISHED:
949961 case IW_CM_STATE_CLOSING:
950962 cm_id_priv->state = IW_CM_STATE_IDLE;
951
- spin_unlock_irqrestore(&cm_id_priv->lock, flags);
952
- ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
953
- spin_lock_irqsave(&cm_id_priv->lock, flags);
963
+ notify_event = 1;
954964 break;
955965 case IW_CM_STATE_DESTROYING:
956966 break;
....@@ -959,6 +969,10 @@
959969 }
960970 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
961971
972
+ if (qp)
973
+ cm_id_priv->id.device->ops.iw_rem_ref(qp);
974
+ if (notify_event)
975
+ ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
962976 return ret;
963977 }
964978