hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/ide/ide-probe.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 1994-1998 Linus Torvalds & authors (see below)
34 * Copyright (C) 2005, 2007 Bartlomiej Zolnierkiewicz
....@@ -142,7 +143,7 @@
142143 }
143144 /* Early cdrom models used zero */
144145 type = ide_cdrom;
145
- /* fall through */
146
+ fallthrough;
146147 case ide_cdrom:
147148 drive->dev_flags |= IDE_DFLAG_REMOVABLE;
148149 #ifdef CONFIG_PPC
....@@ -746,9 +747,15 @@
746747 {
747748 struct ide_request *req = blk_mq_rq_to_pdu(rq);
748749
750
+ req->special = NULL;
749751 scsi_req_init(&req->sreq);
750752 req->sreq.sense = req->sense;
751753 }
754
+
755
+static const struct blk_mq_ops ide_mq_ops = {
756
+ .queue_rq = ide_queue_rq,
757
+ .initialize_rq_fn = ide_initialize_rq,
758
+};
752759
753760 /*
754761 * init request queue
....@@ -759,6 +766,7 @@
759766 ide_hwif_t *hwif = drive->hwif;
760767 int max_sectors = 256;
761768 int max_sg_entries = PRD_ENTRIES;
769
+ struct blk_mq_tag_set *set;
762770
763771 /*
764772 * Our default set up assumes the normal IDE case,
....@@ -767,18 +775,25 @@
767775 * limits and LBA48 we could raise it but as yet
768776 * do not.
769777 */
770
- q = blk_alloc_queue_node(GFP_KERNEL, hwif_to_node(hwif), NULL);
771
- if (!q)
778
+
779
+ set = &drive->tag_set;
780
+ set->ops = &ide_mq_ops;
781
+ set->nr_hw_queues = 1;
782
+ set->queue_depth = 32;
783
+ set->reserved_tags = 1;
784
+ set->cmd_size = sizeof(struct ide_request);
785
+ set->numa_node = hwif_to_node(hwif);
786
+ set->flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING;
787
+ if (blk_mq_alloc_tag_set(set))
772788 return 1;
773789
774
- q->request_fn = do_ide_request;
775
- q->initialize_rq_fn = ide_initialize_rq;
776
- q->cmd_size = sizeof(struct ide_request);
777
- blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, q);
778
- if (blk_init_allocated_queue(q) < 0) {
779
- blk_cleanup_queue(q);
790
+ q = blk_mq_init_queue(set);
791
+ if (IS_ERR(q)) {
792
+ blk_mq_free_tag_set(set);
780793 return 1;
781794 }
795
+
796
+ blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, q);
782797
783798 q->queuedata = drive;
784799 blk_queue_segment_boundary(q, 0xffff);
....@@ -965,8 +980,12 @@
965980
966981 ide_proc_unregister_device(drive);
967982
983
+ if (drive->sense_rq)
984
+ blk_mq_free_request(drive->sense_rq);
985
+
968986 blk_cleanup_queue(drive->queue);
969987 drive->queue = NULL;
988
+ blk_mq_free_tag_set(&drive->tag_set);
970989
971990 drive->dev_flags &= ~IDE_DFLAG_PRESENT;
972991
....@@ -1133,6 +1152,37 @@
11331152 }
11341153 }
11351154
1155
+/*
1156
+ * Deferred request list insertion handler
1157
+ */
1158
+static void drive_rq_insert_work(struct work_struct *work)
1159
+{
1160
+ ide_drive_t *drive = container_of(work, ide_drive_t, rq_work);
1161
+ ide_hwif_t *hwif = drive->hwif;
1162
+ struct request *rq;
1163
+ blk_status_t ret;
1164
+ LIST_HEAD(list);
1165
+
1166
+ blk_mq_quiesce_queue(drive->queue);
1167
+
1168
+ ret = BLK_STS_OK;
1169
+ spin_lock_irq(&hwif->lock);
1170
+ while (!list_empty(&drive->rq_list)) {
1171
+ rq = list_first_entry(&drive->rq_list, struct request, queuelist);
1172
+ list_del_init(&rq->queuelist);
1173
+
1174
+ spin_unlock_irq(&hwif->lock);
1175
+ ret = ide_issue_rq(drive, rq, true);
1176
+ spin_lock_irq(&hwif->lock);
1177
+ }
1178
+ spin_unlock_irq(&hwif->lock);
1179
+
1180
+ blk_mq_unquiesce_queue(drive->queue);
1181
+
1182
+ if (ret != BLK_STS_OK)
1183
+ kblockd_schedule_work(&drive->rq_work);
1184
+}
1185
+
11361186 static const u8 ide_hwif_to_major[] =
11371187 { IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR, IDE4_MAJOR,
11381188 IDE5_MAJOR, IDE6_MAJOR, IDE7_MAJOR, IDE8_MAJOR, IDE9_MAJOR };
....@@ -1145,12 +1195,10 @@
11451195 ide_port_for_each_dev(i, drive, hwif) {
11461196 u8 j = (hwif->index * MAX_DRIVES) + i;
11471197 u16 *saved_id = drive->id;
1148
- struct request *saved_sense_rq = drive->sense_rq;
11491198
11501199 memset(drive, 0, sizeof(*drive));
11511200 memset(saved_id, 0, SECTOR_SIZE);
11521201 drive->id = saved_id;
1153
- drive->sense_rq = saved_sense_rq;
11541202
11551203 drive->media = ide_disk;
11561204 drive->select = (i << 4) | ATA_DEVICE_OBS;
....@@ -1166,6 +1214,9 @@
11661214
11671215 INIT_LIST_HEAD(&drive->list);
11681216 init_completion(&drive->gendev_rel_comp);
1217
+
1218
+ INIT_WORK(&drive->rq_work, drive_rq_insert_work);
1219
+ INIT_LIST_HEAD(&drive->rq_list);
11691220 }
11701221 }
11711222
....@@ -1255,7 +1306,6 @@
12551306 int i;
12561307
12571308 ide_port_for_each_dev(i, drive, hwif) {
1258
- kfree(drive->sense_rq);
12591309 kfree(drive->id);
12601310 kfree(drive);
12611311 }
....@@ -1283,17 +1333,10 @@
12831333 if (drive->id == NULL)
12841334 goto out_free_drive;
12851335
1286
- drive->sense_rq = kmalloc(sizeof(struct request) +
1287
- sizeof(struct ide_request), GFP_KERNEL);
1288
- if (!drive->sense_rq)
1289
- goto out_free_id;
1290
-
12911336 hwif->devices[i] = drive;
12921337 }
12931338 return 0;
12941339
1295
-out_free_id:
1296
- kfree(drive->id);
12971340 out_free_drive:
12981341 kfree(drive);
12991342 out_nomem:
....@@ -1395,6 +1438,9 @@
13951438 ide_hwif_t *hwif, *mate = NULL;
13961439 int i, j = 0;
13971440
1441
+ pr_warn("legacy IDE will be removed in 2021, please switch to libata\n"
1442
+ "Report any missing HW support to linux-ide@vger.kernel.org\n");
1443
+
13981444 ide_host_for_each_port(i, hwif, host) {
13991445 if (hwif == NULL) {
14001446 mate = NULL;