Драйвер последовательного порта Pericom для CentOS / Red Hat 7.8 (правильная baud_base) - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно перенести последовательный драйвер, поставляемый с CentOS 8.2, на CentOS 7.8 и, если возможно, немного улучшить * его (если только это не единственное решение).

Аппаратное обеспечение - CompactP CIe компьютер, который состоит из:

  • карты ЦП + боковой карты SCZ-NVM (2 x RS-232, последовательный контроллер: Pericom Semiconductor Device 7954, подсистема: Pericom Semiconductor Device 7954)
  • периферийная карта SU2-BALLAD (4 x RS-232, последовательный контроллер: Pericom Semiconductor Device 7954, подсистема: EKF Elektronik GmbH Device e224)

В CentOS 7.8 ни один из 6 последовательные порты работают; в CentOS 8.2 все последовательные порты работают нормально *, поэтому я полагаю, что драйвер, поставляемый с CentOS 7.8, неверен. Причина проблемы - неверный параметр "baud_base" (115200), и временное решение - установить его на 921600 (с помощью setserial).

* Драйверы последовательного порта, поставляемые с CentOS 7.8 / 8.2, имеют общие, а не очень существенный недостаток:

  • они обнаруживают в два раза больше последовательных портов, чем существующие (4 вместо 2 и 8 вместо 4).

Было бы здорово, чтобы есть драйвер, который устанавливает правильную "baud_base" и определяет правильное количество последовательных портов.

Где в исходном коде ядра я могу найти часть, отвечающую за установку "baud_base" для упомянутого выше оборудования? (и часть, отвечающая за определение количества последовательных портов, но это не критично) Будет ли это завершаться компиляцией модуля ядра или компиляцией всего ядра?

lspci -vvv

08:00.0 Serial controller: Pericom Semiconductor Device 7954 (prog-if 02 [16550])
    Subsystem: EKF Elektronik GmbH Device e224
    Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Interrupt: pin A routed to IRQ 19
    Region 0: I/O ports at a000 [size=64]
    Region 1: Memory at d1100000 (32-bit, non-prefetchable) [size=4K]
    Capabilities: [80] Power Management version 3
        Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
        Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
    Capabilities: [8c] MSI: Enable- Count=1/1 Maskable- 64bit+
        Address: 0000000000000000  Data: 0000
    Capabilities: [9c] Vital Product Data
        Not readable
    Capabilities: [a4] Vendor Specific Information: Len=28 <?>
    Capabilities: [e0] Express (v1) Legacy Endpoint, MSI 00
        DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
            ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
        DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
            RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
            MaxPayload 128 bytes, MaxReadReq 128 bytes
        DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq+ AuxPwr+ TransPend-
        LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <512ns, L1 <1us
            ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
        LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk-
            ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
        LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
    Capabilities: [100 v1] Advanced Error Reporting
        UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
        UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
        UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
        CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
        CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
        AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
    Kernel driver in use: serial

09:00.0 Serial controller: Pericom Semiconductor Device 7954 (prog-if 02 [16550])
    Subsystem: Pericom Semiconductor Device 7954
    Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Interrupt: pin A routed to IRQ 18
    Region 0: I/O ports at 9000 [size=64]
    Region 1: Memory at d1000000 (32-bit, non-prefetchable) [size=4K]
    Capabilities: [80] Power Management version 3
        Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
        Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
    Capabilities: [8c] MSI: Enable- Count=1/1 Maskable- 64bit+
        Address: 0000000000000000  Data: 0000
    Capabilities: [9c] Vital Product Data
        Not readable
    Capabilities: [a4] Vendor Specific Information: Len=28 <?>
    Capabilities: [e0] Express (v1) Legacy Endpoint, MSI 00
        DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
            ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
        DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
            RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
            MaxPayload 128 bytes, MaxReadReq 128 bytes
        DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq+ AuxPwr+ TransPend-
        LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <512ns, L1 <1us
            ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
        LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
            ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
        LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
    Capabilities: [100 v1] Advanced Error Reporting
        UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
        UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
        UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
        CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
        CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
        AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
    Kernel driver in use: serial

1 Ответ

0 голосов
/ 04 августа 2020

В ядре 3.10 таблица baud_table находится в драйверах / tty / tty_ioctl. c. Вы заметите, что он поддерживает 921600 Гц. https://elixir.bootlin.com/linux/v3.10/source/drivers/tty/tty_ioctl.c#L263

В более позднем ядре 4.12 добавлен новый файл tty_baudrate. c. Похоже, этот файл был перенесен в CentOS 7.

...