thunderbolt: Cache adapter specific capability offset into struct port
authorMika Westerberg <mika.westerberg@linux.intel.com>
Sun, 19 Feb 2017 08:39:34 +0000 (10:39 +0200)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 18 Apr 2019 08:18:52 +0000 (11:18 +0300)
The adapter specific capability either is there or not if the port does
not hold an adapter. Instead of always finding it on-demand we read the
offset just once when the port is initialized.

While there we update the struct port documentation to follow kernel-doc
format.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/switch.c
drivers/thunderbolt/tb.c
drivers/thunderbolt/tb.h
drivers/thunderbolt/tunnel_pci.c

index b3f93ebe6e3962c202a0e9fd695cf8e259c647d4..9756e6279dc91f58efafc551214509e9f42a0ae5 100644 (file)
@@ -586,6 +586,10 @@ static int tb_init_port(struct tb_port *port)
                        port->cap_phy = cap;
                else
                        tb_port_WARN(port, "non switch port without a PHY\n");
+       } else if (port->port != 0) {
+               cap = tb_port_find_cap(port, TB_PORT_CAP_ADAP);
+               if (cap > 0)
+                       port->cap_adap = cap;
        }
 
        tb_dump_port(port->sw->tb, &port->config);
index d8f4ed0f2ef8b1c884911dd827f22f542a931064..e71530d0af657153ce760433919acb3aca3ab243 100644 (file)
@@ -151,8 +151,8 @@ static struct tb_port *tb_find_unused_down_port(struct tb_switch *sw)
                        continue;
                if (sw->ports[i].config.type != TB_TYPE_PCIE_DOWN)
                        continue;
-               cap = tb_port_find_cap(&sw->ports[i], TB_PORT_CAP_ADAP);
-               if (cap < 0)
+               cap = sw->ports[i].cap_adap;
+               if (!cap)
                        continue;
                res = tb_port_read(&sw->ports[i], &data, TB_CFG_PORT, cap, 1);
                if (res < 0)
@@ -197,8 +197,8 @@ static void tb_activate_pcie_devices(struct tb *tb)
                }
 
                /* check whether port is already activated */
-               cap = tb_port_find_cap(up_port, TB_PORT_CAP_ADAP);
-               if (cap < 0)
+               cap = up_port->cap_adap;
+               if (!cap)
                        continue;
                if (tb_port_read(up_port, &data, TB_CFG_PORT, cap, 1))
                        continue;
index 985a48a67a437e12a24b055b18c45a9c6ba888dc..b4d7c4d408bd902cc66702fdeff51171bccf675f 100644 (file)
@@ -121,6 +121,7 @@ struct tb_switch {
  * @remote: Remote port (%NULL if not connected)
  * @xdomain: Remote host (%NULL if not connected)
  * @cap_phy: Offset, zero if not found
+ * @cap_adap: Offset of the adapter specific capability (%0 if not present)
  * @port: Port number on switch
  * @disabled: Disabled by eeprom
  * @dual_link_port: If the switch is connected using two ports, points
@@ -133,6 +134,7 @@ struct tb_port {
        struct tb_port *remote;
        struct tb_xdomain *xdomain;
        int cap_phy;
+       int cap_adap;
        u8 port;
        bool disabled;
        struct tb_port *dual_link_port;
index 0637537ea53f0e42238e0600324acd8cc1950476..2de4edccbd6d81579a69c3db6ac91da7c275e924 100644 (file)
@@ -148,12 +148,9 @@ bool tb_pci_is_invalid(struct tb_pci_tunnel *tunnel)
 static int tb_pci_port_active(struct tb_port *port, bool active)
 {
        u32 word = active ? 0x80000000 : 0x0;
-       int cap = tb_port_find_cap(port, TB_PORT_CAP_ADAP);
-       if (cap < 0) {
-               tb_port_warn(port, "TB_PORT_CAP_ADAP not found: %d\n", cap);
-               return cap;
-       }
-       return tb_port_write(port, &word, TB_CFG_PORT, cap, 1);
+       if (!port->cap_adap)
+               return -ENXIO;
+       return tb_port_write(port, &word, TB_CFG_PORT, port->cap_adap, 1);
 }
 
 /**