hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/ntb/ntb_transport.c
....@@ -412,7 +412,7 @@
412412
413413 rc = device_register(dev);
414414 if (rc) {
415
- kfree(client_dev);
415
+ put_device(dev);
416416 goto err;
417417 }
418418
....@@ -911,7 +911,7 @@
911911 return 0;
912912 }
913913
914
-static void ntb_qp_link_down_reset(struct ntb_transport_qp *qp)
914
+static void ntb_qp_link_context_reset(struct ntb_transport_qp *qp)
915915 {
916916 qp->link_is_up = false;
917917 qp->active = false;
....@@ -932,6 +932,13 @@
932932 qp->tx_err_no_buf = 0;
933933 qp->tx_memcpy = 0;
934934 qp->tx_async = 0;
935
+}
936
+
937
+static void ntb_qp_link_down_reset(struct ntb_transport_qp *qp)
938
+{
939
+ ntb_qp_link_context_reset(qp);
940
+ if (qp->remote_rx_info)
941
+ qp->remote_rx_info->entry = qp->rx_max_entry - 1;
935942 }
936943
937944 static void ntb_qp_link_cleanup(struct ntb_transport_qp *qp)
....@@ -1176,7 +1183,7 @@
11761183 qp->ndev = nt->ndev;
11771184 qp->client_ready = false;
11781185 qp->event_handler = NULL;
1179
- ntb_qp_link_down_reset(qp);
1186
+ ntb_qp_link_context_reset(qp);
11801187
11811188 if (mw_num < qp_count % mw_count)
11821189 num_qps_mw = qp_count / mw_count + 1;
....@@ -2278,8 +2285,12 @@
22782285 struct ntb_queue_entry *entry;
22792286 int rc;
22802287
2281
- if (!qp || !qp->link_is_up || !len)
2288
+ if (!qp || !len)
22822289 return -EINVAL;
2290
+
2291
+ /* If the qp link is down already, just ignore. */
2292
+ if (!qp->link_is_up)
2293
+ return 0;
22832294
22842295 entry = ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q);
22852296 if (!entry) {
....@@ -2420,7 +2431,7 @@
24202431 unsigned int head = qp->tx_index;
24212432 unsigned int tail = qp->remote_rx_info->entry;
24222433
2423
- return tail > head ? tail - head : qp->tx_max_entry + tail - head;
2434
+ return tail >= head ? tail - head : qp->tx_max_entry + tail - head;
24242435 }
24252436 EXPORT_SYMBOL_GPL(ntb_transport_tx_free_entry);
24262437