forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-02-20 e636c8d336489bf3eed5878299e6cc045bbad077
kernel/drivers/target/iscsi/cxgbit/cxgbit_target.c
....@@ -1,9 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (c) 2016 Chelsio Communications, Inc.
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
74 */
85
96 #include <linux/workqueue.h>
....@@ -286,18 +283,6 @@
286283 }
287284 }
288285
289
-static bool cxgbit_lock_sock(struct cxgbit_sock *csk)
290
-{
291
- spin_lock_bh(&csk->lock);
292
-
293
- if (before(csk->write_seq, csk->snd_una + csk->snd_win))
294
- csk->lock_owner = true;
295
-
296
- spin_unlock_bh(&csk->lock);
297
-
298
- return csk->lock_owner;
299
-}
300
-
301286 static void cxgbit_unlock_sock(struct cxgbit_sock *csk)
302287 {
303288 struct sk_buff_head backlogq;
....@@ -327,20 +312,16 @@
327312 {
328313 int ret = 0;
329314
330
- wait_event_interruptible(csk->ack_waitq, cxgbit_lock_sock(csk));
315
+ spin_lock_bh(&csk->lock);
316
+ csk->lock_owner = true;
317
+ spin_unlock_bh(&csk->lock);
331318
332319 if (unlikely((csk->com.state != CSK_STATE_ESTABLISHED) ||
333320 signal_pending(current))) {
334321 __kfree_skb(skb);
335322 __skb_queue_purge(&csk->ppodq);
336323 ret = -1;
337
- spin_lock_bh(&csk->lock);
338
- if (csk->lock_owner) {
339
- spin_unlock_bh(&csk->lock);
340
- goto unlock;
341
- }
342
- spin_unlock_bh(&csk->lock);
343
- return ret;
324
+ goto unlock;
344325 }
345326
346327 csk->write_seq += skb->len +
....@@ -901,9 +882,9 @@
901882 skb_frag_t *dfrag = &ssi->frags[pdu_cb->dfrag_idx];
902883
903884 sg_init_table(&ccmd->sg, 1);
904
- sg_set_page(&ccmd->sg, dfrag->page.p, skb_frag_size(dfrag),
905
- dfrag->page_offset);
906
- get_page(dfrag->page.p);
885
+ sg_set_page(&ccmd->sg, skb_frag_page(dfrag),
886
+ skb_frag_size(dfrag), skb_frag_off(dfrag));
887
+ get_page(skb_frag_page(dfrag));
907888
908889 cmd->se_cmd.t_data_sg = &ccmd->sg;
909890 cmd->se_cmd.t_data_nents = 1;
....@@ -959,7 +940,7 @@
959940 target_put_sess_cmd(&cmd->se_cmd);
960941 return 0;
961942 } else if (cmd->unsolicited_data) {
962
- iscsit_set_unsoliticed_dataout(cmd);
943
+ iscsit_set_unsolicited_dataout(cmd);
963944 }
964945
965946 } else if (immed_ret == IMMEDIATE_DATA_ERL1_CRC_FAILURE) {
....@@ -1016,17 +997,18 @@
1016997 struct scatterlist *sg_start;
1017998 struct iscsi_conn *conn = csk->conn;
1018999 struct iscsi_cmd *cmd = NULL;
1000
+ struct cxgbit_cmd *ccmd;
1001
+ struct cxgbi_task_tag_info *ttinfo;
10191002 struct cxgbit_lro_pdu_cb *pdu_cb = cxgbit_rx_pdu_cb(csk->skb);
10201003 struct iscsi_data *hdr = (struct iscsi_data *)pdu_cb->hdr;
10211004 u32 data_offset = be32_to_cpu(hdr->offset);
1022
- u32 data_len = pdu_cb->dlen;
1005
+ u32 data_len = ntoh24(hdr->dlength);
10231006 int rc, sg_nents, sg_off;
10241007 bool dcrc_err = false;
10251008
10261009 if (pdu_cb->flags & PDUCBF_RX_DDP_CMP) {
10271010 u32 offset = be32_to_cpu(hdr->offset);
10281011 u32 ddp_data_len;
1029
- u32 payload_length = ntoh24(hdr->dlength);
10301012 bool success = false;
10311013
10321014 cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, 0);
....@@ -1041,7 +1023,7 @@
10411023 cmd->data_sn = be32_to_cpu(hdr->datasn);
10421024
10431025 rc = __iscsit_check_dataout_hdr(conn, (unsigned char *)hdr,
1044
- cmd, payload_length, &success);
1026
+ cmd, data_len, &success);
10451027 if (rc < 0)
10461028 return rc;
10471029 else if (!success)
....@@ -1077,6 +1059,20 @@
10771059 sg_nents = max(1UL, DIV_ROUND_UP(skip + data_len, PAGE_SIZE));
10781060
10791061 cxgbit_skb_copy_to_sg(csk->skb, sg_start, sg_nents, skip);
1062
+ }
1063
+
1064
+ ccmd = iscsit_priv_cmd(cmd);
1065
+ ttinfo = &ccmd->ttinfo;
1066
+
1067
+ if (ccmd->release && ttinfo->sgl &&
1068
+ (cmd->se_cmd.data_length == (cmd->write_data_done + data_len))) {
1069
+ struct cxgbit_device *cdev = csk->com.cdev;
1070
+ struct cxgbi_ppm *ppm = cdev2ppm(cdev);
1071
+
1072
+ dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl, ttinfo->nents,
1073
+ DMA_FROM_DEVICE);
1074
+ ttinfo->nents = 0;
1075
+ ttinfo->sgl = NULL;
10801076 }
10811077
10821078 check_payload:
....@@ -1405,7 +1401,8 @@
14051401 pdu_cb->ddigest, pdu_cb->frags);
14061402 for (i = 0; i < ssi->nr_frags; i++)
14071403 pr_info("skb 0x%p, frag %d, off %u, sz %u.\n",
1408
- skb, i, ssi->frags[i].page_offset, ssi->frags[i].size);
1404
+ skb, i, skb_frag_off(&ssi->frags[i]),
1405
+ skb_frag_size(&ssi->frags[i]));
14091406 }
14101407
14111408 static void cxgbit_lro_hskb_reset(struct cxgbit_sock *csk)
....@@ -1449,7 +1446,7 @@
14491446 hpdu_cb->frags++;
14501447 hpdu_cb->hfrag_idx = hfrag_idx;
14511448
1452
- len = hssi->frags[hfrag_idx].size;
1449
+ len = skb_frag_size(&hssi->frags[hfrag_idx]);
14531450 hskb->len += len;
14541451 hskb->data_len += len;
14551452 hskb->truesize += len;
....@@ -1469,7 +1466,7 @@
14691466
14701467 get_page(skb_frag_page(&hssi->frags[dfrag_idx]));
14711468
1472
- len += hssi->frags[dfrag_idx].size;
1469
+ len += skb_frag_size(&hssi->frags[dfrag_idx]);
14731470
14741471 hssi->nr_frags++;
14751472 hpdu_cb->frags++;