hc
2024-02-20 e636c8d336489bf3eed5878299e6cc045bbad077
kernel/drivers/block/skd_main.c
....@@ -1,12 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Driver for sTec s1120 PCIe SSDs. sTec was acquired in 2013 by HGST and HGST
34 * was acquired by Western Digital in 2012.
45 *
56 * Copyright 2012 sTec, Inc.
67 * Copyright (c) 2017 Western Digital Corporation or its affiliates.
7
- *
8
- * This file is part of the Linux kernel, and is made available under
9
- * the terms of the GNU General Public License version 2.
108 */
119
1210 #include <linux/kernel.h>
....@@ -27,7 +25,6 @@
2725 #include <linux/dma-mapping.h>
2826 #include <linux/completion.h>
2927 #include <linux/scatterlist.h>
30
-#include <linux/version.h>
3128 #include <linux/err.h>
3229 #include <linux/aer.h>
3330 #include <linux/wait.h>
....@@ -181,6 +178,7 @@
181178 struct fit_completion_entry_v1 completion;
182179
183180 struct fit_comp_error_info err_info;
181
+ int retries;
184182
185183 blk_status_t status;
186184 };
....@@ -382,11 +380,12 @@
382380 * READ/WRITE REQUESTS
383381 *****************************************************************************
384382 */
385
-static void skd_inc_in_flight(struct request *rq, void *data, bool reserved)
383
+static bool skd_inc_in_flight(struct request *rq, void *data, bool reserved)
386384 {
387385 int *count = data;
388386
389387 count++;
388
+ return true;
390389 }
391390
392391 static int skd_in_flight(struct skd_device *skdev)
....@@ -493,6 +492,11 @@
493492
494493 if (unlikely(skdev->state != SKD_DRVR_STATE_ONLINE))
495494 return skd_fail_all(q) ? BLK_STS_IOERR : BLK_STS_RESOURCE;
495
+
496
+ if (!(req->rq_flags & RQF_DONTPREP)) {
497
+ skreq->retries = 0;
498
+ req->rq_flags |= RQF_DONTPREP;
499
+ }
496500
497501 blk_mq_start_request(req);
498502
....@@ -632,7 +636,7 @@
632636 * Map scatterlist to PCI bus addresses.
633637 * Note PCI might change the number of entries.
634638 */
635
- n_sg = pci_map_sg(skdev->pdev, sgl, n_sg, skreq->data_dir);
639
+ n_sg = dma_map_sg(&skdev->pdev->dev, sgl, n_sg, skreq->data_dir);
636640 if (n_sg <= 0)
637641 return false;
638642
....@@ -682,7 +686,8 @@
682686 skreq->sksg_list[skreq->n_sg - 1].next_desc_ptr =
683687 skreq->sksg_dma_address +
684688 ((skreq->n_sg) * sizeof(struct fit_sg_descriptor));
685
- pci_unmap_sg(skdev->pdev, &skreq->sg[0], skreq->n_sg, skreq->data_dir);
689
+ dma_unmap_sg(&skdev->pdev->dev, &skreq->sg[0], skreq->n_sg,
690
+ skreq->data_dir);
686691 }
687692
688693 /*
....@@ -1411,7 +1416,8 @@
14111416 case SKD_CHECK_STATUS_REPORT_GOOD:
14121417 case SKD_CHECK_STATUS_REPORT_SMART_ALERT:
14131418 skreq->status = BLK_STS_OK;
1414
- blk_mq_complete_request(req);
1419
+ if (likely(!blk_should_fake_timeout(req->q)))
1420
+ blk_mq_complete_request(req);
14151421 break;
14161422
14171423 case SKD_CHECK_STATUS_BUSY_IMMINENT:
....@@ -1424,17 +1430,18 @@
14241430 break;
14251431
14261432 case SKD_CHECK_STATUS_REQUEUE_REQUEST:
1427
- if ((unsigned long) ++req->special < SKD_MAX_RETRIES) {
1433
+ if (++skreq->retries < SKD_MAX_RETRIES) {
14281434 skd_log_skreq(skdev, skreq, "retry");
14291435 blk_mq_requeue_request(req, true);
14301436 break;
14311437 }
1432
- /* fall through */
1438
+ fallthrough;
14331439
14341440 case SKD_CHECK_STATUS_REPORT_ERROR:
14351441 default:
14361442 skreq->status = BLK_STS_IOERR;
1437
- blk_mq_complete_request(req);
1443
+ if (likely(!blk_should_fake_timeout(req->q)))
1444
+ blk_mq_complete_request(req);
14381445 break;
14391446 }
14401447 }
....@@ -1554,7 +1561,8 @@
15541561 */
15551562 if (likely(cmp_status == SAM_STAT_GOOD)) {
15561563 skreq->status = BLK_STS_OK;
1557
- blk_mq_complete_request(rq);
1564
+ if (likely(!blk_should_fake_timeout(rq->q)))
1565
+ blk_mq_complete_request(rq);
15581566 } else {
15591567 skd_resolve_req_exception(skdev, skreq, rq);
15601568 }
....@@ -1886,13 +1894,13 @@
18861894 skd_skdev_state_to_str(skdev->state), skdev->state);
18871895 }
18881896
1889
-static void skd_recover_request(struct request *req, void *data, bool reserved)
1897
+static bool skd_recover_request(struct request *req, void *data, bool reserved)
18901898 {
18911899 struct skd_device *const skdev = data;
18921900 struct skd_request_context *skreq = blk_mq_rq_to_pdu(req);
18931901
18941902 if (skreq->state != SKD_REQ_STATE_BUSY)
1895
- return;
1903
+ return true;
18961904
18971905 skd_log_skreq(skdev, skreq, "recover");
18981906
....@@ -1903,6 +1911,7 @@
19031911 skreq->state = SKD_REQ_STATE_IDLE;
19041912 skreq->status = BLK_STS_IOERR;
19051913 blk_mq_complete_request(req);
1914
+ return true;
19061915 }
19071916
19081917 static void skd_recover_requests(struct skd_device *skdev)
....@@ -2632,8 +2641,8 @@
26322641 "comp pci_alloc, total bytes %zd entries %d\n",
26332642 SKD_SKCOMP_SIZE, SKD_N_COMPLETION_ENTRY);
26342643
2635
- skcomp = pci_zalloc_consistent(skdev->pdev, SKD_SKCOMP_SIZE,
2636
- &skdev->cq_dma_address);
2644
+ skcomp = dma_alloc_coherent(&skdev->pdev->dev, SKD_SKCOMP_SIZE,
2645
+ &skdev->cq_dma_address, GFP_KERNEL);
26372646
26382647 if (skcomp == NULL) {
26392648 rc = -ENOMEM;
....@@ -2674,10 +2683,10 @@
26742683
26752684 skmsg->id = i + SKD_ID_FIT_MSG;
26762685
2677
- skmsg->msg_buf = pci_alloc_consistent(skdev->pdev,
2678
- SKD_N_FITMSG_BYTES,
2679
- &skmsg->mb_dma_address);
2680
-
2686
+ skmsg->msg_buf = dma_alloc_coherent(&skdev->pdev->dev,
2687
+ SKD_N_FITMSG_BYTES,
2688
+ &skmsg->mb_dma_address,
2689
+ GFP_KERNEL);
26812690 if (skmsg->msg_buf == NULL) {
26822691 rc = -ENOMEM;
26832692 goto err_out;
....@@ -2687,7 +2696,6 @@
26872696 (FIT_QCMD_ALIGN - 1),
26882697 "not aligned: msg_buf %p mb_dma_address %pad\n",
26892698 skmsg->msg_buf, &skmsg->mb_dma_address);
2690
- memset(skmsg->msg_buf, 0, SKD_N_FITMSG_BYTES);
26912699 }
26922700
26932701 err_out:
....@@ -2834,7 +2842,6 @@
28342842 skdev->sgs_per_request * sizeof(struct scatterlist);
28352843 skdev->tag_set.numa_node = NUMA_NO_NODE;
28362844 skdev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE |
2837
- BLK_MQ_F_SG_MERGE |
28382845 BLK_ALLOC_POLICY_TO_MQ_FLAG(BLK_TAG_ALLOC_FIFO);
28392846 skdev->tag_set.driver_data = skdev;
28402847 rc = blk_mq_alloc_tag_set(&skdev->tag_set);
....@@ -2971,8 +2978,8 @@
29712978 static void skd_free_skcomp(struct skd_device *skdev)
29722979 {
29732980 if (skdev->skcomp_table)
2974
- pci_free_consistent(skdev->pdev, SKD_SKCOMP_SIZE,
2975
- skdev->skcomp_table, skdev->cq_dma_address);
2981
+ dma_free_coherent(&skdev->pdev->dev, SKD_SKCOMP_SIZE,
2982
+ skdev->skcomp_table, skdev->cq_dma_address);
29762983
29772984 skdev->skcomp_table = NULL;
29782985 skdev->cq_dma_address = 0;
....@@ -2991,8 +2998,8 @@
29912998 skmsg = &skdev->skmsg_table[i];
29922999
29933000 if (skmsg->msg_buf != NULL) {
2994
- pci_free_consistent(skdev->pdev, SKD_N_FITMSG_BYTES,
2995
- skmsg->msg_buf,
3001
+ dma_free_coherent(&skdev->pdev->dev, SKD_N_FITMSG_BYTES,
3002
+ skmsg->msg_buf,
29963003 skmsg->mb_dma_address);
29973004 }
29983005 skmsg->msg_buf = NULL;
....@@ -3104,7 +3111,7 @@
31043111 static int skd_bdev_attach(struct device *parent, struct skd_device *skdev)
31053112 {
31063113 dev_dbg(&skdev->pdev->dev, "add_disk\n");
3107
- device_add_disk(parent, skdev->disk);
3114
+ device_add_disk(parent, skdev->disk, NULL);
31083115 return 0;
31093116 }
31103117
....@@ -3172,18 +3179,12 @@
31723179 rc = pci_request_regions(pdev, DRV_NAME);
31733180 if (rc)
31743181 goto err_out;
3175
- rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
3176
- if (!rc) {
3177
- if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
3178
- dev_err(&pdev->dev, "consistent DMA mask error %d\n",
3179
- rc);
3180
- }
3181
- } else {
3182
- rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
3183
- if (rc) {
3184
- dev_err(&pdev->dev, "DMA mask error %d\n", rc);
3185
- goto err_out_regions;
3186
- }
3182
+ rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
3183
+ if (rc)
3184
+ rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
3185
+ if (rc) {
3186
+ dev_err(&pdev->dev, "DMA mask error %d\n", rc);
3187
+ goto err_out_regions;
31873188 }
31883189
31893190 if (!skd_major) {
....@@ -3367,20 +3368,12 @@
33673368 rc = pci_request_regions(pdev, DRV_NAME);
33683369 if (rc)
33693370 goto err_out;
3370
- rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
3371
- if (!rc) {
3372
- if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
3373
-
3374
- dev_err(&pdev->dev, "consistent DMA mask error %d\n",
3375
- rc);
3376
- }
3377
- } else {
3378
- rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
3379
- if (rc) {
3380
-
3381
- dev_err(&pdev->dev, "DMA mask error %d\n", rc);
3382
- goto err_out_regions;
3383
- }
3371
+ rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
3372
+ if (rc)
3373
+ rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
3374
+ if (rc) {
3375
+ dev_err(&pdev->dev, "DMA mask error %d\n", rc);
3376
+ goto err_out_regions;
33843377 }
33853378
33863379 pci_set_master(pdev);