Adding support for MosChip 9912 PCIe (serial/parallel) cards

Andre Albsmeier Andre.Albsmeier at siemens.com
Sat Mar 3 20:40:16 UTC 2018


On Sat, 03-Mar-2018 at 14:41:58 -0500, Daniel Eischen wrote:
> On Sat, 3 Mar 2018, Andre Albsmeier wrote:
> 
> > On Sat, 03-Mar-2018 at 10:53:20 -0500, Daniel Eischen wrote:
> >> On Sat, 3 Mar 2018, Andre Albsmeier wrote:
> >>
> >>> On Fri, 02-Mar-2018 at 08:36:40 -0500, Daniel Eischen wrote:
> >>>> On Fri, 2 Mar 2018, Andre Albsmeier wrote:
> >>>>
> >>>>> I have a MosChip 9912 card (PCIe card with 1 parallel and 2 serial
> >>>>> ports) sitting here which does not get detected on 11.1. I tried
> >>>>> to simply add it to the uart and ppc drivers with
> >>>>>
> >>>> [ ... ]
> >>>>
> >>>> Do you try adding similar support to puc_pci_devices[] in
> >>>> sys/dev/puc/pucdata.c?
> >>>
> >>> Just tried that:
> >>>
> >>> @@ -1204,6 +1204,11 @@
> >>>            PUC_PORT_1S1P, 0x10, 4, 0,
> >>>        },
> >>>
> >>> +{   0x9710, 0x9912, 0xa000, 0x3012,
> >>> +    "NetMos NM9912 Dual UART and 1284 Printer port",
> >>> +    DEFAULT_RCLK,
> >>> +    PUC_PORT_2S1P, 0x10, 4, 0,
> >>> +},
> >>>        {   0x9710, 0x9865, 0xa000, 0x3012,
> >>>            "NetMos NM9865 Dual UART and 1284 Printer port",
> >>>            DEFAULT_RCLK,
> >>>
> >>> But the results are exactly the same. It also doesn't
> >>> matter if puc.ko is loaded at all.
> >>
> >> Are you sure your subvendor and subdevice are correct?  I would
> >
> > No ;-). I have to use: 0x9710, 0x9912, 0xa000, 0x2000,
> >
> > Now I have the following behaviour:
> >
> > When I load puc.ko I get:
> > puc0: <NetMos NM9912 Dual UART and 1284 Printer port> at device 0.2 on pci9
> >
> > If I load ppc.ko now, I get:
> > ppc0: parallel port not found.
> >
> > But if I unload puc and ppc and load ppc again, I get:
> >
> > ppc0: <MosChip MCS9912 PCIe to Peripheral Controller> port 0xd000-0xd007,0xd008-0xd00f mem 0x89200000-0x89200fff irq 20 at device 0.2 on pci9
> > ppc0: Generic chipset (EPP/NIBBLE) in COMPATIBLE mode
> > ppbus0: <Parallel port bus> on ppc0
> > lpt0: <Printer> on ppbus0
> > lpt0: Interrupt-driven port
> >
> > For all this I have to disable /boot/device.hints -- otherwise
> > the messages "driver bug: Unable to set devclass" comes back.
> >
> > So I think there are two problems:
> >
> > First the settings of the ISA stuff in /boot/device.hints conflicted
> > with the settings the driver probed. This would be easy to solve --
> > just disable them in /boot/device.hints.
> >
> > Second it appears that ppc only attaches if puc did some kind of
> > initialisation first. But we have to detach puc so the ppc can attach.
> 
> Strange.  Did you try setting puc_load="YES" in /boot/loader.conf
> and rebooting?  Or are you just loading and unloading modules
> for now?

The latter. After each successful try I reboot to get rid of that
magic initialisation puc does.

But maybe I am getting closer: The card has 2 serial and 1 parallel
port. But these 3 ports appear in pciconf as 3 seperate devices:

none7 at pci0:9:0:0:       class=0x070002 card=0x1000a000 chip=0x99129710 rev=0x00 hdr=0x00
    vendor     = 'MosChip Semiconductor Technology Ltd.'
    device     = 'PCIe 9912 Multi-I/O Controller'
    class      = simple comms
    subclass   = UART
none8 at pci0:9:0:1:       class=0x070002 card=0x1000a000 chip=0x99129710 rev=0x00 hdr=0x00
    vendor     = 'MosChip Semiconductor Technology Ltd.'
    device     = 'PCIe 9912 Multi-I/O Controller'
    class      = simple comms
    subclass   = UART
none9 at pci0:9:0:2:       class=0x070103 card=0x2000a000 chip=0x99129710 rev=0x00 hdr=0x00
    vendor     = 'MosChip Semiconductor Technology Ltd.'
    device     = 'PCIe 9912 Multi-I/O Controller'
    class      = simple comms
    subclass   = parallel port

Looking at the source code of puc, I find a place where it checks
the number of ports a device provides and aborts if it has only
one port. This would match my understanding that puc only exists
in order to help uart and ppc to work with multi-port devices
where all ports are handled by a single device in pciconf.

Until now, I used PUC_PORT_2S1P in my puc entry. So puc assumes
that the card 0x2000a000 has 2 serial and 1 parallel port but
this is probably wrong as this 0x2000a000 card only has one
parallel port and the serials are handled by other devices.
So the correct entry would be PUC_PORT_1P but with one single
port puc does not attach.

If all this is correct, I assume that puc should be left alone
and ppc_pci.c is the thing I have to look at.

This also matches the fact that uart attaches well to these two
serial ports without the need of loading and unloading puc first
so there is probably some kind of device specific initialisation
missing in ppc_pci.c...

	-Andre


More information about the freebsd-hackers mailing list