hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/ata/ahci.c
....@@ -50,7 +50,8 @@
5050 /* board IDs by feature in alphabetical order */
5151 board_ahci,
5252 board_ahci_ign_iferr,
53
- board_ahci_mobile,
53
+ board_ahci_low_power,
54
+ board_ahci_no_debounce_delay,
5455 board_ahci_nomsi,
5556 board_ahci_noncq,
5657 board_ahci_nosntf,
....@@ -83,6 +84,7 @@
8384 static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
8485 static void ahci_remove_one(struct pci_dev *dev);
8586 static void ahci_shutdown_one(struct pci_dev *dev);
87
+static void ahci_intel_pcs_quirk(struct pci_dev *pdev, struct ahci_host_priv *hpriv);
8688 static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
8789 unsigned long deadline);
8890 static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
....@@ -134,9 +136,16 @@
134136 .udma_mask = ATA_UDMA6,
135137 .port_ops = &ahci_ops,
136138 },
137
- [board_ahci_mobile] = {
139
+ [board_ahci_low_power] = {
138140 AHCI_HFLAGS (AHCI_HFLAG_IS_MOBILE),
139141 .flags = AHCI_FLAG_COMMON,
142
+ .pio_mask = ATA_PIO4,
143
+ .udma_mask = ATA_UDMA6,
144
+ .port_ops = &ahci_ops,
145
+ },
146
+ [board_ahci_no_debounce_delay] = {
147
+ .flags = AHCI_FLAG_COMMON,
148
+ .link_flags = ATA_LFLAG_NO_DEBOUNCE_DELAY,
140149 .pio_mask = ATA_PIO4,
141150 .udma_mask = ATA_UDMA6,
142151 .port_ops = &ahci_ops,
....@@ -267,13 +276,13 @@
267276 { PCI_VDEVICE(INTEL, 0x2924), board_ahci }, /* ICH9 */
268277 { PCI_VDEVICE(INTEL, 0x2925), board_ahci }, /* ICH9 */
269278 { PCI_VDEVICE(INTEL, 0x2927), board_ahci }, /* ICH9 */
270
- { PCI_VDEVICE(INTEL, 0x2929), board_ahci_mobile }, /* ICH9M */
271
- { PCI_VDEVICE(INTEL, 0x292a), board_ahci_mobile }, /* ICH9M */
272
- { PCI_VDEVICE(INTEL, 0x292b), board_ahci_mobile }, /* ICH9M */
273
- { PCI_VDEVICE(INTEL, 0x292c), board_ahci_mobile }, /* ICH9M */
274
- { PCI_VDEVICE(INTEL, 0x292f), board_ahci_mobile }, /* ICH9M */
279
+ { PCI_VDEVICE(INTEL, 0x2929), board_ahci_low_power }, /* ICH9M */
280
+ { PCI_VDEVICE(INTEL, 0x292a), board_ahci_low_power }, /* ICH9M */
281
+ { PCI_VDEVICE(INTEL, 0x292b), board_ahci_low_power }, /* ICH9M */
282
+ { PCI_VDEVICE(INTEL, 0x292c), board_ahci_low_power }, /* ICH9M */
283
+ { PCI_VDEVICE(INTEL, 0x292f), board_ahci_low_power }, /* ICH9M */
275284 { PCI_VDEVICE(INTEL, 0x294d), board_ahci }, /* ICH9 */
276
- { PCI_VDEVICE(INTEL, 0x294e), board_ahci_mobile }, /* ICH9M */
285
+ { PCI_VDEVICE(INTEL, 0x294e), board_ahci_low_power }, /* ICH9M */
277286 { PCI_VDEVICE(INTEL, 0x502a), board_ahci }, /* Tolapai */
278287 { PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */
279288 { PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
....@@ -283,9 +292,9 @@
283292 { PCI_VDEVICE(INTEL, 0x3b23), board_ahci }, /* PCH AHCI */
284293 { PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
285294 { PCI_VDEVICE(INTEL, 0x3b25), board_ahci }, /* PCH RAID */
286
- { PCI_VDEVICE(INTEL, 0x3b29), board_ahci_mobile }, /* PCH M AHCI */
295
+ { PCI_VDEVICE(INTEL, 0x3b29), board_ahci_low_power }, /* PCH M AHCI */
287296 { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
288
- { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci_mobile }, /* PCH M RAID */
297
+ { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci_low_power }, /* PCH M RAID */
289298 { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci }, /* PCH AHCI */
290299 { PCI_VDEVICE(INTEL, 0x19b0), board_ahci_pcs7 }, /* DNV AHCI */
291300 { PCI_VDEVICE(INTEL, 0x19b1), board_ahci_pcs7 }, /* DNV AHCI */
....@@ -308,9 +317,9 @@
308317 { PCI_VDEVICE(INTEL, 0x19cE), board_ahci_pcs7 }, /* DNV AHCI */
309318 { PCI_VDEVICE(INTEL, 0x19cF), board_ahci_pcs7 }, /* DNV AHCI */
310319 { PCI_VDEVICE(INTEL, 0x1c02), board_ahci }, /* CPT AHCI */
311
- { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_mobile }, /* CPT M AHCI */
320
+ { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_low_power }, /* CPT M AHCI */
312321 { PCI_VDEVICE(INTEL, 0x1c04), board_ahci }, /* CPT RAID */
313
- { PCI_VDEVICE(INTEL, 0x1c05), board_ahci_mobile }, /* CPT M RAID */
322
+ { PCI_VDEVICE(INTEL, 0x1c05), board_ahci_low_power }, /* CPT M RAID */
314323 { PCI_VDEVICE(INTEL, 0x1c06), board_ahci }, /* CPT RAID */
315324 { PCI_VDEVICE(INTEL, 0x1c07), board_ahci }, /* CPT RAID */
316325 { PCI_VDEVICE(INTEL, 0x1d02), board_ahci }, /* PBG AHCI */
....@@ -319,29 +328,29 @@
319328 { PCI_VDEVICE(INTEL, 0x2826), board_ahci }, /* PBG RAID */
320329 { PCI_VDEVICE(INTEL, 0x2323), board_ahci }, /* DH89xxCC AHCI */
321330 { PCI_VDEVICE(INTEL, 0x1e02), board_ahci }, /* Panther Point AHCI */
322
- { PCI_VDEVICE(INTEL, 0x1e03), board_ahci_mobile }, /* Panther M AHCI */
331
+ { PCI_VDEVICE(INTEL, 0x1e03), board_ahci_low_power }, /* Panther M AHCI */
323332 { PCI_VDEVICE(INTEL, 0x1e04), board_ahci }, /* Panther Point RAID */
324333 { PCI_VDEVICE(INTEL, 0x1e05), board_ahci }, /* Panther Point RAID */
325334 { PCI_VDEVICE(INTEL, 0x1e06), board_ahci }, /* Panther Point RAID */
326
- { PCI_VDEVICE(INTEL, 0x1e07), board_ahci_mobile }, /* Panther M RAID */
335
+ { PCI_VDEVICE(INTEL, 0x1e07), board_ahci_low_power }, /* Panther M RAID */
327336 { PCI_VDEVICE(INTEL, 0x1e0e), board_ahci }, /* Panther Point RAID */
328337 { PCI_VDEVICE(INTEL, 0x8c02), board_ahci }, /* Lynx Point AHCI */
329
- { PCI_VDEVICE(INTEL, 0x8c03), board_ahci_mobile }, /* Lynx M AHCI */
338
+ { PCI_VDEVICE(INTEL, 0x8c03), board_ahci_low_power }, /* Lynx M AHCI */
330339 { PCI_VDEVICE(INTEL, 0x8c04), board_ahci }, /* Lynx Point RAID */
331
- { PCI_VDEVICE(INTEL, 0x8c05), board_ahci_mobile }, /* Lynx M RAID */
340
+ { PCI_VDEVICE(INTEL, 0x8c05), board_ahci_low_power }, /* Lynx M RAID */
332341 { PCI_VDEVICE(INTEL, 0x8c06), board_ahci }, /* Lynx Point RAID */
333
- { PCI_VDEVICE(INTEL, 0x8c07), board_ahci_mobile }, /* Lynx M RAID */
342
+ { PCI_VDEVICE(INTEL, 0x8c07), board_ahci_low_power }, /* Lynx M RAID */
334343 { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci }, /* Lynx Point RAID */
335
- { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci_mobile }, /* Lynx M RAID */
336
- { PCI_VDEVICE(INTEL, 0x9c02), board_ahci_mobile }, /* Lynx LP AHCI */
337
- { PCI_VDEVICE(INTEL, 0x9c03), board_ahci_mobile }, /* Lynx LP AHCI */
338
- { PCI_VDEVICE(INTEL, 0x9c04), board_ahci_mobile }, /* Lynx LP RAID */
339
- { PCI_VDEVICE(INTEL, 0x9c05), board_ahci_mobile }, /* Lynx LP RAID */
340
- { PCI_VDEVICE(INTEL, 0x9c06), board_ahci_mobile }, /* Lynx LP RAID */
341
- { PCI_VDEVICE(INTEL, 0x9c07), board_ahci_mobile }, /* Lynx LP RAID */
342
- { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci_mobile }, /* Lynx LP RAID */
343
- { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci_mobile }, /* Lynx LP RAID */
344
- { PCI_VDEVICE(INTEL, 0x9dd3), board_ahci_mobile }, /* Cannon Lake PCH-LP AHCI */
344
+ { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci_low_power }, /* Lynx M RAID */
345
+ { PCI_VDEVICE(INTEL, 0x9c02), board_ahci_low_power }, /* Lynx LP AHCI */
346
+ { PCI_VDEVICE(INTEL, 0x9c03), board_ahci_low_power }, /* Lynx LP AHCI */
347
+ { PCI_VDEVICE(INTEL, 0x9c04), board_ahci_low_power }, /* Lynx LP RAID */
348
+ { PCI_VDEVICE(INTEL, 0x9c05), board_ahci_low_power }, /* Lynx LP RAID */
349
+ { PCI_VDEVICE(INTEL, 0x9c06), board_ahci_low_power }, /* Lynx LP RAID */
350
+ { PCI_VDEVICE(INTEL, 0x9c07), board_ahci_low_power }, /* Lynx LP RAID */
351
+ { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci_low_power }, /* Lynx LP RAID */
352
+ { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci_low_power }, /* Lynx LP RAID */
353
+ { PCI_VDEVICE(INTEL, 0x9dd3), board_ahci_low_power }, /* Cannon Lake PCH-LP AHCI */
345354 { PCI_VDEVICE(INTEL, 0x1f22), board_ahci }, /* Avoton AHCI */
346355 { PCI_VDEVICE(INTEL, 0x1f23), board_ahci }, /* Avoton AHCI */
347356 { PCI_VDEVICE(INTEL, 0x1f24), board_ahci }, /* Avoton RAID */
....@@ -373,26 +382,26 @@
373382 { PCI_VDEVICE(INTEL, 0x8d66), board_ahci }, /* Wellsburg RAID */
374383 { PCI_VDEVICE(INTEL, 0x8d6e), board_ahci }, /* Wellsburg RAID */
375384 { PCI_VDEVICE(INTEL, 0x23a3), board_ahci }, /* Coleto Creek AHCI */
376
- { PCI_VDEVICE(INTEL, 0x9c83), board_ahci_mobile }, /* Wildcat LP AHCI */
377
- { PCI_VDEVICE(INTEL, 0x9c85), board_ahci_mobile }, /* Wildcat LP RAID */
378
- { PCI_VDEVICE(INTEL, 0x9c87), board_ahci_mobile }, /* Wildcat LP RAID */
379
- { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci_mobile }, /* Wildcat LP RAID */
385
+ { PCI_VDEVICE(INTEL, 0x9c83), board_ahci_low_power }, /* Wildcat LP AHCI */
386
+ { PCI_VDEVICE(INTEL, 0x9c85), board_ahci_low_power }, /* Wildcat LP RAID */
387
+ { PCI_VDEVICE(INTEL, 0x9c87), board_ahci_low_power }, /* Wildcat LP RAID */
388
+ { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci_low_power }, /* Wildcat LP RAID */
380389 { PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */
381
- { PCI_VDEVICE(INTEL, 0x8c83), board_ahci_mobile }, /* 9 Series M AHCI */
390
+ { PCI_VDEVICE(INTEL, 0x8c83), board_ahci_low_power }, /* 9 Series M AHCI */
382391 { PCI_VDEVICE(INTEL, 0x8c84), board_ahci }, /* 9 Series RAID */
383
- { PCI_VDEVICE(INTEL, 0x8c85), board_ahci_mobile }, /* 9 Series M RAID */
392
+ { PCI_VDEVICE(INTEL, 0x8c85), board_ahci_low_power }, /* 9 Series M RAID */
384393 { PCI_VDEVICE(INTEL, 0x8c86), board_ahci }, /* 9 Series RAID */
385
- { PCI_VDEVICE(INTEL, 0x8c87), board_ahci_mobile }, /* 9 Series M RAID */
394
+ { PCI_VDEVICE(INTEL, 0x8c87), board_ahci_low_power }, /* 9 Series M RAID */
386395 { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
387
- { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci_mobile }, /* 9 Series M RAID */
388
- { PCI_VDEVICE(INTEL, 0x9d03), board_ahci_mobile }, /* Sunrise LP AHCI */
389
- { PCI_VDEVICE(INTEL, 0x9d05), board_ahci_mobile }, /* Sunrise LP RAID */
390
- { PCI_VDEVICE(INTEL, 0x9d07), board_ahci_mobile }, /* Sunrise LP RAID */
396
+ { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci_low_power }, /* 9 Series M RAID */
397
+ { PCI_VDEVICE(INTEL, 0x9d03), board_ahci_low_power }, /* Sunrise LP AHCI */
398
+ { PCI_VDEVICE(INTEL, 0x9d05), board_ahci_low_power }, /* Sunrise LP RAID */
399
+ { PCI_VDEVICE(INTEL, 0x9d07), board_ahci_low_power }, /* Sunrise LP RAID */
391400 { PCI_VDEVICE(INTEL, 0xa102), board_ahci }, /* Sunrise Point-H AHCI */
392
- { PCI_VDEVICE(INTEL, 0xa103), board_ahci_mobile }, /* Sunrise M AHCI */
401
+ { PCI_VDEVICE(INTEL, 0xa103), board_ahci_low_power }, /* Sunrise M AHCI */
393402 { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
394403 { PCI_VDEVICE(INTEL, 0xa106), board_ahci }, /* Sunrise Point-H RAID */
395
- { PCI_VDEVICE(INTEL, 0xa107), board_ahci_mobile }, /* Sunrise M RAID */
404
+ { PCI_VDEVICE(INTEL, 0xa107), board_ahci_low_power }, /* Sunrise M RAID */
396405 { PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */
397406 { PCI_VDEVICE(INTEL, 0x2822), board_ahci }, /* Lewisburg RAID*/
398407 { PCI_VDEVICE(INTEL, 0x2823), board_ahci }, /* Lewisburg AHCI*/
....@@ -409,13 +418,15 @@
409418 { PCI_VDEVICE(INTEL, 0xa356), board_ahci }, /* Cannon Lake PCH-H RAID */
410419 { PCI_VDEVICE(INTEL, 0x06d7), board_ahci }, /* Comet Lake-H RAID */
411420 { PCI_VDEVICE(INTEL, 0xa386), board_ahci }, /* Comet Lake PCH-V RAID */
412
- { PCI_VDEVICE(INTEL, 0x0f22), board_ahci_mobile }, /* Bay Trail AHCI */
413
- { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_mobile }, /* Bay Trail AHCI */
414
- { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_mobile }, /* Cherry Tr. AHCI */
415
- { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_mobile }, /* ApolloLake AHCI */
416
- { PCI_VDEVICE(INTEL, 0x34d3), board_ahci_mobile }, /* Ice Lake LP AHCI */
417
- { PCI_VDEVICE(INTEL, 0x02d3), board_ahci_mobile }, /* Comet Lake PCH-U AHCI */
418
- { PCI_VDEVICE(INTEL, 0x02d7), board_ahci_mobile }, /* Comet Lake PCH RAID */
421
+ { PCI_VDEVICE(INTEL, 0x0f22), board_ahci_low_power }, /* Bay Trail AHCI */
422
+ { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_low_power }, /* Bay Trail AHCI */
423
+ { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_low_power }, /* Cherry Tr. AHCI */
424
+ { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_low_power }, /* ApolloLake AHCI */
425
+ { PCI_VDEVICE(INTEL, 0x34d3), board_ahci_low_power }, /* Ice Lake LP AHCI */
426
+ { PCI_VDEVICE(INTEL, 0x02d3), board_ahci_low_power }, /* Comet Lake PCH-U AHCI */
427
+ { PCI_VDEVICE(INTEL, 0x02d7), board_ahci_low_power }, /* Comet Lake PCH RAID */
428
+ /* Elkhart Lake IDs 0x4b60 & 0x4b62 https://sata-io.org/product/8803 not tested yet */
429
+ { PCI_VDEVICE(INTEL, 0x4b63), board_ahci_low_power }, /* Elkhart Lake AHCI */
419430
420431 /* JMicron 360/1/3/5/6, match class to avoid IDE function */
421432 { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
....@@ -441,8 +452,9 @@
441452 board_ahci_al },
442453 /* AMD */
443454 { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */
455
+ { PCI_VDEVICE(AMD, 0x7801), board_ahci_no_debounce_delay }, /* AMD Hudson-2 (AHCI mode) */
444456 { PCI_VDEVICE(AMD, 0x7900), board_ahci }, /* AMD CZ */
445
- { PCI_VDEVICE(AMD, 0x7901), board_ahci_mobile }, /* AMD Green Sardine */
457
+ { PCI_VDEVICE(AMD, 0x7901), board_ahci_low_power }, /* AMD Green Sardine */
446458 /* AMD is using RAID class only for ahci controllers */
447459 { PCI_VENDOR_ID_AMD, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
448460 PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci },
....@@ -664,6 +676,25 @@
664676 ahci_save_initial_config(&pdev->dev, hpriv);
665677 }
666678
679
+static int ahci_pci_reset_controller(struct ata_host *host)
680
+{
681
+ struct pci_dev *pdev = to_pci_dev(host->dev);
682
+ struct ahci_host_priv *hpriv = host->private_data;
683
+ int rc;
684
+
685
+ rc = ahci_reset_controller(host);
686
+ if (rc)
687
+ return rc;
688
+
689
+ /*
690
+ * If platform firmware failed to enable ports, try to enable
691
+ * them here.
692
+ */
693
+ ahci_intel_pcs_quirk(pdev, hpriv);
694
+
695
+ return 0;
696
+}
697
+
667698 static void ahci_pci_init_controller(struct ata_host *host)
668699 {
669700 struct ahci_host_priv *hpriv = host->private_data;
....@@ -683,7 +714,7 @@
683714
684715 /* clear port IRQ */
685716 tmp = readl(port_mmio + PORT_IRQ_STAT);
686
- VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
717
+ dev_dbg(&pdev->dev, "PORT_IRQ_STAT 0x%x\n", tmp);
687718 if (tmp)
688719 writel(tmp, port_mmio + PORT_IRQ_STAT);
689720 }
....@@ -865,7 +896,7 @@
865896 struct ata_host *host = pci_get_drvdata(pdev);
866897 int rc;
867898
868
- rc = ahci_reset_controller(host);
899
+ rc = ahci_pci_reset_controller(host);
869900 if (rc)
870901 return rc;
871902 ahci_pci_init_controller(host);
....@@ -900,7 +931,7 @@
900931 ahci_mcp89_apple_enable(pdev);
901932
902933 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
903
- rc = ahci_reset_controller(host);
934
+ rc = ahci_pci_reset_controller(host);
904935 if (rc)
905936 return rc;
906937
....@@ -1475,7 +1506,6 @@
14751506 u32 irq_stat, irq_masked;
14761507 unsigned int handled = 1;
14771508
1478
- VPRINTK("ENTER\n");
14791509 hpriv = host->private_data;
14801510 mmio = hpriv->mmio;
14811511 irq_stat = readl(mmio + HOST_IRQ_STAT);
....@@ -1492,7 +1522,6 @@
14921522 irq_stat = readl(mmio + HOST_IRQ_STAT);
14931523 spin_unlock(&host->lock);
14941524 } while (irq_stat);
1495
- VPRINTK("EXIT\n");
14961525
14971526 return IRQ_RETVAL(handled);
14981527 }
....@@ -1785,12 +1814,6 @@
17851814 /* save initial config */
17861815 ahci_pci_save_initial_config(pdev, hpriv);
17871816
1788
- /*
1789
- * If platform firmware failed to enable ports, try to enable
1790
- * them here.
1791
- */
1792
- ahci_intel_pcs_quirk(pdev, hpriv);
1793
-
17941817 /* prepare host */
17951818 if (hpriv->cap & HOST_CAP_NCQ) {
17961819 pi.flags |= ATA_FLAG_NCQ;
....@@ -1868,6 +1891,15 @@
18681891 else
18691892 dev_info(&pdev->dev, "SSS flag set, parallel bus scan disabled\n");
18701893
1894
+ if (!(hpriv->cap & HOST_CAP_PART))
1895
+ host->flags |= ATA_HOST_NO_PART;
1896
+
1897
+ if (!(hpriv->cap & HOST_CAP_SSC))
1898
+ host->flags |= ATA_HOST_NO_SSC;
1899
+
1900
+ if (!(hpriv->cap2 & HOST_CAP2_SDS))
1901
+ host->flags |= ATA_HOST_NO_DEVSLP;
1902
+
18711903 if (pi.flags & ATA_FLAG_EM)
18721904 ahci_reset_em(host);
18731905
....@@ -1900,7 +1932,7 @@
19001932 if (rc)
19011933 return rc;
19021934
1903
- rc = ahci_reset_controller(host);
1935
+ rc = ahci_pci_reset_controller(host);
19041936 if (rc)
19051937 return rc;
19061938