28 Apr, 2017

1 commit

  • Many PCI host controller drivers aren't prepared to have their devices
    unbound from them forcefully (e.g., through /sys/...//unbind), as
    they don't provide any driver .remove callback, where they'd detach the
    root bus, release resources, etc. Keeping the driver built in (i.e., not a
    loadable module) is not enough; and providing no .remove callback just
    means we don't do any teardown.

    To rule out the possibility of unbinding a device via sysfs, we need to set
    the ".suppress_bind_attrs" field.

    I found the suspect drivers via the following search:

    git grep -l platform_driver $(git grep -L -e '\.remove' -e suppress_bind_attrs drivers/pci/)

    Then I inspected them to ensure that
    (a) they set up a PCI bus in their probe() and
    (b) they don't have a remove() callback for undoing the setup

    Suggested-by: Bjorn Helgaas
    Signed-off-by: Brian Norris
    Signed-off-by: Bjorn Helgaas

    Brian Norris
     

24 Mar, 2017

1 commit

  • Add a host bridge driver for the Faraday Technology FPPCI100 host bridge,
    used for Cortina Systems Gemini SoC (SL3516) PCI Host Bridge.

    This code is inspired by the out-of-tree OpenWRT patch and then extensively
    rewritten for device tree and using the modern helpers to cut down and
    modernize the code to all new PCI frameworks. A driver exists in U-Boot as
    well.

    Tested on the ITian Square One SQ201 NAS with the following result in the
    boot log (trimmed to relevant parts):

    OF: PCI: host bridge /soc/pci@50000000 ranges:
    OF: PCI: IO 0x50000000..0x500fffff -> 0x00000000
    OF: PCI: MEM 0x58000000..0x5fffffff -> 0x58000000
    ftpci100 50000000.pci: PCI host bridge to bus 0000:00
    pci_bus 0000:00: root bus resource [bus 00-ff]
    pci_bus 0000:00: root bus resource [io 0x0000-0xfffff]
    pci_bus 0000:00: root bus resource [mem 0x58000000-0x5fffffff]
    ftpci100 50000000.pci:
    DMA MEM1 BASE: 0x0000000000000000 -> 0x0000000007ffffff config 00070000
    ftpci100 50000000.pci:
    DMA MEM2 BASE: 0x0000000000000000 -> 0x0000000003ffffff config 00060000
    ftpci100 50000000.pci:
    DMA MEM3 BASE: 0x0000000000000000 -> 0x0000000003ffffff config 00060000
    PCI: bus0: Fast back to back transfers disabled
    pci 0000:00:00.0: of_irq_parse_pci() failed with rc=-22
    pci 0000:00:0c.0: BAR 0: assigned [mem 0x58000000-0x58007fff]
    pci 0000:00:09.2: BAR 0: assigned [mem 0x58008000-0x580080ff]
    pci 0000:00:09.0: BAR 4: assigned [io 0x1000-0x101f]
    pci 0000:00:09.1: BAR 4: assigned [io 0x1020-0x103f]
    pci 0000:00:09.0: enabling device (0140 -> 0141)
    pci 0000:00:09.0: HCRESET not completed yet!
    pci 0000:00:09.1: enabling device (0140 -> 0141)
    pci 0000:00:09.1: HCRESET not completed yet!
    pci 0000:00:09.2: enabling device (0140 -> 0142)
    rt61pci 0000:00:0c.0: enabling device (0140 -> 0142)
    ieee80211 phy0: rt2x00_set_chip: Info - Chipset detected -
    rt: 2561, rf: 0003, rev: 000c
    ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
    ehci-pci: EHCI PCI platform driver
    ehci-pci 0000:00:09.2: EHCI Host Controller
    ehci-pci 0000:00:09.2: new USB bus registered, assigned bus number 1
    ehci-pci 0000:00:09.2: irq 125, io mem 0x58008000
    ehci-pci 0000:00:09.2: USB 2.0 started, EHCI 1.00
    hub 1-0:1.0: USB hub found
    hub 1-0:1.0: 4 ports detected
    uhci_hcd: USB Universal Host Controller Interface driver
    uhci_hcd 0000:00:09.0: UHCI Host Controller
    uhci_hcd 0000:00:09.0: new USB bus registered, assigned bus number 2
    uhci_hcd 0000:00:09.0: HCRESET not completed yet!
    uhci_hcd 0000:00:09.0: irq 123, io base 0x00001000
    hub 2-0:1.0: USB hub found
    hub 2-0:1.0: config failed, hub doesn't have any ports! (err -19)
    uhci_hcd 0000:00:09.1: UHCI Host Controller
    uhci_hcd 0000:00:09.1: new USB bus registered, assigned bus number 3
    uhci_hcd 0000:00:09.1: HCRESET not completed yet!
    uhci_hcd 0000:00:09.1: irq 124, io base 0x00001020
    hub 3-0:1.0: USB hub found
    hub 3-0:1.0: config failed, hub doesn't have any ports! (err -19)
    scsi 0:0:0:0: Direct-Access USB Flash Disk 1.00 PQ: 0 ANSI: 2
    sd 0:0:0:0: [sda] 7900336 512-byte logical blocks: (4.04 GB/3.77 GiB)
    sd 0:0:0:0: [sda] Write Protect is off
    sd 0:0:0:0: [sda] No Caching mode page found
    sd 0:0:0:0: [sda] Assuming drive cache: write through
    sda: sda1 sda2 sda3
    sd 0:0:0:0: [sda] Attached SCSI removable disk
    ieee80211 phy0: rt2x00lib_request_firmware: Info -
    Loading firmware file 'rt2561s.bin'
    ieee80211 phy0: rt2x00lib_request_firmware: Info -
    Firmware detected - version: 0.8
    IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready

    $ lspci
    00:00.0 Class 0600: 159b:4321
    00:09.2 Class 0c03: 1106:3104
    00:09.0 Class 0c03: 1106:3038
    00:09.1 Class 0c03: 1106:3038
    00:0c.0 Class 0280: 1814:0301

    $ cat /proc/interrupts
    CPU0
    123: 0 PCI 0 Edge uhci_hcd:usb2
    124: 0 PCI 1 Edge uhci_hcd:usb3
    125: 159 PCI 2 Edge ehci_hcd:usb1
    126: 1082 PCI 3 Edge rt61pci

    $ cat /proc/iomem
    50000000-500000ff : /soc/pci@50000000
    58000000-5fffffff : Gemini PCI MEM
    58000000-58007fff : 0000:00:0c.0
    58000000-58007fff : 0000:00:0c.0
    58008000-580080ff : 0000:00:09.2
    58008000-580080ff : ehci_hcd

    The EHCI USB hub works fine; I can mount and manage files and the IRQs just
    keep ticking up. I can issue iwlist wlan0 scanning and see all the WLANs
    here. I don't have wpa_supplicant so have not tried connecting to them.

    [bhelgaas: fold in %pap change from Arnd Bergmann ]
    Signed-off-by: Linus Walleij
    Signed-off-by: Bjorn Helgaas
    CC: Janos Laube
    CC: Paulius Zaleckas
    CC: Hans Ulli Kroll
    CC: Florian Fainelli
    CC: Feng-Hsin Chiang
    CC: Greentime Hu

    Linus Walleij