summaryrefslogtreecommitdiffstats
path: root/drivers/thunderbolt/nhi.c
diff options
context:
space:
mode:
authorMika Westerberg <mika.westerberg@linux.intel.com>2017-06-06 08:25:00 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-06-09 05:42:41 -0400
commit9d3cce0b613689ee849a505ffac179af0ae9fff2 (patch)
treeabe7bda188831abb170c39ebfc4d0765c77f6b02 /drivers/thunderbolt/nhi.c
parentc9843ebbb83a120094aa3a55bc0190d285e8384a (diff)
thunderbolt: Introduce thunderbolt bus and connection manager
Thunderbolt fabric consists of one or more switches. This fabric is called domain and it is controlled by an entity called connection manager. The connection manager can be either internal (driven by a firmware running on the host controller) or external (software driver). This driver currently implements support for the latter. In order to manage switches and their properties more easily we model this domain structure as a Linux bus. Each host controller adds a domain device to this bus, and these devices are named as domainN where N stands for index or id of the current domain. We then abstract connection manager specific operations into a new structure tb_cm_ops and convert the existing tb.c to fill those accordingly. This makes it easier to add support for the internal connection manager in subsequent patches. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Reviewed-by: Yehezkel Bernat <yehezkel.bernat@intel.com> Reviewed-by: Michael Jamet <michael.jamet@intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Andreas Noever <andreas.noever@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/thunderbolt/nhi.c')
-rw-r--r--drivers/thunderbolt/nhi.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
index ed75c49748f5..c1113a3c4128 100644
--- a/drivers/thunderbolt/nhi.c
+++ b/drivers/thunderbolt/nhi.c
@@ -586,16 +586,16 @@ static int nhi_suspend_noirq(struct device *dev)
586{ 586{
587 struct pci_dev *pdev = to_pci_dev(dev); 587 struct pci_dev *pdev = to_pci_dev(dev);
588 struct tb *tb = pci_get_drvdata(pdev); 588 struct tb *tb = pci_get_drvdata(pdev);
589 thunderbolt_suspend(tb); 589
590 return 0; 590 return tb_domain_suspend_noirq(tb);
591} 591}
592 592
593static int nhi_resume_noirq(struct device *dev) 593static int nhi_resume_noirq(struct device *dev)
594{ 594{
595 struct pci_dev *pdev = to_pci_dev(dev); 595 struct pci_dev *pdev = to_pci_dev(dev);
596 struct tb *tb = pci_get_drvdata(pdev); 596 struct tb *tb = pci_get_drvdata(pdev);
597 thunderbolt_resume(tb); 597
598 return 0; 598 return tb_domain_resume_noirq(tb);
599} 599}
600 600
601static void nhi_shutdown(struct tb_nhi *nhi) 601static void nhi_shutdown(struct tb_nhi *nhi)
@@ -715,12 +715,17 @@ static int nhi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
715 iowrite32(3906250 / 10000, nhi->iobase + 0x38c00); 715 iowrite32(3906250 / 10000, nhi->iobase + 0x38c00);
716 716
717 dev_info(&nhi->pdev->dev, "NHI initialized, starting thunderbolt\n"); 717 dev_info(&nhi->pdev->dev, "NHI initialized, starting thunderbolt\n");
718 tb = thunderbolt_alloc_and_start(nhi); 718 tb = tb_probe(nhi);
719 if (!tb) { 719 if (!tb)
720 return -ENODEV;
721
722 res = tb_domain_add(tb);
723 if (res) {
720 /* 724 /*
721 * At this point the RX/TX rings might already have been 725 * At this point the RX/TX rings might already have been
722 * activated. Do a proper shutdown. 726 * activated. Do a proper shutdown.
723 */ 727 */
728 tb_domain_put(tb);
724 nhi_shutdown(nhi); 729 nhi_shutdown(nhi);
725 return -EIO; 730 return -EIO;
726 } 731 }
@@ -733,7 +738,8 @@ static void nhi_remove(struct pci_dev *pdev)
733{ 738{
734 struct tb *tb = pci_get_drvdata(pdev); 739 struct tb *tb = pci_get_drvdata(pdev);
735 struct tb_nhi *nhi = tb->nhi; 740 struct tb_nhi *nhi = tb->nhi;
736 thunderbolt_shutdown_and_free(tb); 741
742 tb_domain_remove(tb);
737 nhi_shutdown(nhi); 743 nhi_shutdown(nhi);
738} 744}
739 745
@@ -797,14 +803,23 @@ static struct pci_driver nhi_driver = {
797 803
798static int __init nhi_init(void) 804static int __init nhi_init(void)
799{ 805{
806 int ret;
807
800 if (!dmi_match(DMI_BOARD_VENDOR, "Apple Inc.")) 808 if (!dmi_match(DMI_BOARD_VENDOR, "Apple Inc."))
801 return -ENOSYS; 809 return -ENOSYS;
802 return pci_register_driver(&nhi_driver); 810 ret = tb_domain_init();
811 if (ret)
812 return ret;
813 ret = pci_register_driver(&nhi_driver);
814 if (ret)
815 tb_domain_exit();
816 return ret;
803} 817}
804 818
805static void __exit nhi_unload(void) 819static void __exit nhi_unload(void)
806{ 820{
807 pci_unregister_driver(&nhi_driver); 821 pci_unregister_driver(&nhi_driver);
822 tb_domain_exit();
808} 823}
809 824
810module_init(nhi_init); 825module_init(nhi_init);