|
21 | 21 |
|
22 | 22 | #define MHI_POST_RESET_DELAY_MS 2000 |
23 | 23 |
|
24 | | -#define HEALTH_CHECK_PERIOD (HZ * 2) |
| 24 | +#define HEALTH_CHECK_PERIOD (HZ / 2) |
25 | 25 |
|
26 | 26 | /* PCI VID definitions */ |
27 | 27 | #define PCI_VENDOR_ID_THALES 0x1269 |
@@ -50,6 +50,36 @@ struct mhi_pci_dev_info { |
50 | 50 | bool sideband_wake; |
51 | 51 | }; |
52 | 52 |
|
| 53 | +#define MHI_CHANNEL_CONFIG_AMSS_SBL_UL(ch_num, ch_name, el_count, ev_ring) \ |
| 54 | + { \ |
| 55 | + .num = ch_num, \ |
| 56 | + .name = ch_name, \ |
| 57 | + .num_elements = el_count, \ |
| 58 | + .event_ring = ev_ring, \ |
| 59 | + .dir = DMA_TO_DEVICE, \ |
| 60 | + .ee_mask = BIT(MHI_EE_SBL) | BIT(MHI_EE_AMSS), \ |
| 61 | + .pollcfg = 0, \ |
| 62 | + .doorbell = MHI_DB_BRST_DISABLE, \ |
| 63 | + .lpm_notify = false, \ |
| 64 | + .offload_channel = false, \ |
| 65 | + .doorbell_mode_switch = false, \ |
| 66 | + } \ |
| 67 | + |
| 68 | +#define MHI_CHANNEL_CONFIG_AMSS_SBL_DL(ch_num, ch_name, el_count, ev_ring) \ |
| 69 | + { \ |
| 70 | + .num = ch_num, \ |
| 71 | + .name = ch_name, \ |
| 72 | + .num_elements = el_count, \ |
| 73 | + .event_ring = ev_ring, \ |
| 74 | + .dir = DMA_FROM_DEVICE, \ |
| 75 | + .ee_mask = BIT(MHI_EE_SBL) | BIT(MHI_EE_AMSS), \ |
| 76 | + .pollcfg = 0, \ |
| 77 | + .doorbell = MHI_DB_BRST_DISABLE, \ |
| 78 | + .lpm_notify = false, \ |
| 79 | + .offload_channel = false, \ |
| 80 | + .doorbell_mode_switch = false, \ |
| 81 | + } |
| 82 | + |
53 | 83 | #define MHI_CHANNEL_CONFIG_UL(ch_num, ch_name, el_count, ev_ring) \ |
54 | 84 | { \ |
55 | 85 | .num = ch_num, \ |
@@ -538,17 +568,69 @@ static const struct mhi_pci_dev_info mhi_telit_fn980_hw_v1_info = { |
538 | 568 | .sideband_wake = false, |
539 | 569 | }; |
540 | 570 |
|
| 571 | +static const struct mhi_channel_config mhi_telit_fn980_hw_v2_channels[] = { |
| 572 | + MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0), |
| 573 | + MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 32, 0), |
| 574 | + MHI_CHANNEL_CONFIG_AMSS_SBL_UL(4, "DIAG", 64, 1), |
| 575 | + MHI_CHANNEL_CONFIG_AMSS_SBL_DL(5, "DIAG", 64, 1), |
| 576 | + MHI_CHANNEL_CONFIG_UL(14, "QMI", 32, 0), |
| 577 | + MHI_CHANNEL_CONFIG_DL(15, "QMI", 32, 0), |
| 578 | + MHI_CHANNEL_CONFIG_UL(18, "IP_CTRL", 8, 1), |
| 579 | + MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(19, "IP_CTRL", 8, 1), |
| 580 | + MHI_CHANNEL_CONFIG_UL(20, "IPCR", 16, 0), |
| 581 | + MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(21, "IPCR", 16, 0), |
| 582 | + MHI_CHANNEL_CONFIG_UL(32, "DUN", 8, 1), |
| 583 | + MHI_CHANNEL_CONFIG_DL(33, "DUN", 8, 1), |
| 584 | + MHI_CHANNEL_CONFIG_UL(92, "DUN2", 8, 1), |
| 585 | + MHI_CHANNEL_CONFIG_DL(93, "DUN2", 8, 1), |
| 586 | + MHI_CHANNEL_CONFIG_UL(94, "NMEA", 8, 1), |
| 587 | + MHI_CHANNEL_CONFIG_DL(95, "NMEA", 8, 1), |
| 588 | + MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 128, 2), |
| 589 | + MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0", 128, 3), |
| 590 | +}; |
| 591 | + |
| 592 | +static struct mhi_event_config mhi_telit_fn980_hw_v2_events[] = { |
| 593 | + MHI_EVENT_CONFIG_CTRL(0, 128), |
| 594 | + MHI_EVENT_CONFIG_DATA(1, 128), |
| 595 | + MHI_EVENT_CONFIG_HW_DATA(2, 1024, 100), |
| 596 | + MHI_EVENT_CONFIG_HW_DATA(3, 2048, 101), |
| 597 | +}; |
| 598 | + |
| 599 | +static struct mhi_controller_config modem_telit_fn980_hw_v2_config = { |
| 600 | + .max_channels = 128, |
| 601 | + .timeout_ms = 20000, |
| 602 | + .num_channels = ARRAY_SIZE(mhi_telit_fn980_hw_v2_channels), |
| 603 | + .ch_cfg = mhi_telit_fn980_hw_v2_channels, |
| 604 | + .num_events = ARRAY_SIZE(mhi_telit_fn980_hw_v2_events), |
| 605 | + .event_cfg = mhi_telit_fn980_hw_v2_events, |
| 606 | +}; |
| 607 | + |
| 608 | +static const struct mhi_pci_dev_info mhi_telit_fn980_hw_v2_info = { |
| 609 | + .name = "telit-fn980", |
| 610 | + .fw = "qcom/sdx55m/sbl1.mbn", |
| 611 | + .edl = "qcom/sdx55m/edl.mbn", |
| 612 | + .config = &modem_telit_fn980_hw_v2_config, |
| 613 | + .bar_num = MHI_PCI_DEFAULT_BAR_NUM, |
| 614 | + .dma_data_width = 32, |
| 615 | + .mru_default = 32768, |
| 616 | + .sideband_wake = false, |
| 617 | +}; |
| 618 | + |
541 | 619 | static const struct mhi_channel_config mhi_telit_fn990_channels[] = { |
542 | 620 | MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0), |
543 | 621 | MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 32, 0), |
544 | | - MHI_CHANNEL_CONFIG_UL(4, "DIAG", 64, 1), |
545 | | - MHI_CHANNEL_CONFIG_DL(5, "DIAG", 64, 1), |
| 622 | + MHI_CHANNEL_CONFIG_AMSS_SBL_UL(4, "DIAG", 64, 1), |
| 623 | + MHI_CHANNEL_CONFIG_AMSS_SBL_DL(5, "DIAG", 64, 1), |
546 | 624 | MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0), |
547 | 625 | MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0), |
| 626 | + MHI_CHANNEL_CONFIG_UL(18, "IP_CTRL", 8, 1), |
| 627 | + MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(19, "IP_CTRL", 8, 1), |
548 | 628 | MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), |
549 | 629 | MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), |
550 | 630 | MHI_CHANNEL_CONFIG_UL(92, "DUN2", 32, 1), |
551 | 631 | MHI_CHANNEL_CONFIG_DL(93, "DUN2", 32, 1), |
| 632 | + MHI_CHANNEL_CONFIG_UL(94, "NMEA", 8, 1), |
| 633 | + MHI_CHANNEL_CONFIG_DL(95, "NMEA", 8, 1), |
552 | 634 | MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2), |
553 | 635 | MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3), |
554 | 636 | }; |
@@ -582,16 +664,15 @@ static const struct mhi_pci_dev_info mhi_telit_fn990_info = { |
582 | 664 | static const struct pci_device_id mhi_pci_id_table[] = { |
583 | 665 | { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0304), |
584 | 666 | .driver_data = (kernel_ulong_t) &mhi_qcom_sdx24_info }, |
585 | | - { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, PCI_VENDOR_ID_QCOM, 0x010c), |
586 | | - .driver_data = (kernel_ulong_t) &mhi_foxconn_sdx55_info }, |
587 | 667 | /* EM919x (sdx55), use the same vid:pid as qcom-sdx55m */ |
588 | 668 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x18d7, 0x0200), |
589 | 669 | .driver_data = (kernel_ulong_t) &mhi_sierra_em919x_info }, |
590 | 670 | /* Telit FN980 hardware revision v1 */ |
591 | 671 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x1C5D, 0x2000), |
592 | 672 | .driver_data = (kernel_ulong_t) &mhi_telit_fn980_hw_v1_info }, |
| 673 | + /* Modified Qualcomm default entry for FN980 firmware release without Telit SSIDs */ |
593 | 674 | { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0306), |
594 | | - .driver_data = (kernel_ulong_t) &mhi_qcom_sdx55_info }, |
| 675 | + .driver_data = (kernel_ulong_t) &mhi_telit_fn980_hw_v2_info }, |
595 | 676 | /* Telit FN990 */ |
596 | 677 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2010), |
597 | 678 | .driver_data = (kernel_ulong_t) &mhi_telit_fn990_info }, |
@@ -859,6 +940,10 @@ static void mhi_pci_recovery_work(struct work_struct *work) |
859 | 940 | mhi_unprepare_after_power_down(mhi_cntrl); |
860 | 941 | } |
861 | 942 |
|
| 943 | + dev_dbg(&pdev->dev, "Waiting 40 seconds for allowing the modem to restore PCIe\n"); |
| 944 | + msleep(40000); |
| 945 | + dev_dbg(&pdev->dev, "Restoring PCI saved state\n"); |
| 946 | + |
862 | 947 | pci_set_power_state(pdev, PCI_D0); |
863 | 948 | pci_load_saved_state(pdev, mhi_pdev->pci_state); |
864 | 949 | pci_restore_state(pdev); |
@@ -896,6 +981,18 @@ static void health_check(struct timer_list *t) |
896 | 981 | test_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status)) |
897 | 982 | return; |
898 | 983 |
|
| 984 | + if (mhi_cntrl->xfp == XFP_STATE_FLASHING) { |
| 985 | + mod_timer(&mhi_pdev->health_check_timer, jiffies + HEALTH_CHECK_PERIOD); |
| 986 | + return; |
| 987 | + } |
| 988 | + |
| 989 | + if (mhi_cntrl->xfp == XFP_STATE_NEED_RESET) { |
| 990 | + mhi_cntrl->xfp = XFP_STATE_IDLE; |
| 991 | + dev_dbg(mhi_cntrl->cntrl_dev, "Device needs to be resetted EE = %d\n", mhi_cntrl->ee); |
| 992 | + queue_work(system_long_wq, &mhi_pdev->recovery_work); |
| 993 | + return; |
| 994 | + } |
| 995 | + |
899 | 996 | if (!mhi_pci_is_alive(mhi_cntrl)) { |
900 | 997 | dev_err(mhi_cntrl->cntrl_dev, "Device died\n"); |
901 | 998 | queue_work(system_long_wq, &mhi_pdev->recovery_work); |
|
0 commit comments