thunderbolt: Rework NFC credits handling
authorMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 11 Oct 2018 08:38:22 +0000 (11:38 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 18 Apr 2019 08:18:53 +0000 (11:18 +0300)
NFC (non flow control) credits is actually 20-bit field so update
tb_port_add_nfc_credits() to handle this properly. This allows us to set
NFC credits for Display Port path in subsequent patches.

Also make sure the function does not update the hardware if the
underlying switch is already unplugged.

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

index 028e9a2933826a4b1d7a546e681b36369d4d81cf..9462e6982061d8b3fbe77edf697e69e1bb69d343 100644 (file)
@@ -537,14 +537,20 @@ int tb_wait_for_port(struct tb_port *port, bool wait_if_unplugged)
  */
 int tb_port_add_nfc_credits(struct tb_port *port, int credits)
 {
-       if (credits == 0)
+       u32 nfc_credits;
+
+       if (credits == 0 || port->sw->is_unplugged)
                return 0;
-       tb_port_info(port,
-                    "adding %#x NFC credits (%#x -> %#x)",
-                    credits,
-                    port->config.nfc_credits,
-                    port->config.nfc_credits + credits);
-       port->config.nfc_credits += credits;
+
+       nfc_credits = port->config.nfc_credits & TB_PORT_NFC_CREDITS_MASK;
+       nfc_credits += credits;
+
+       tb_port_dbg(port, "adding %d NFC credits to %lu",
+                   credits, port->config.nfc_credits & TB_PORT_NFC_CREDITS_MASK);
+
+       port->config.nfc_credits &= ~TB_PORT_NFC_CREDITS_MASK;
+       port->config.nfc_credits |= nfc_credits;
+
        return tb_port_write(port, &port->config.nfc_credits,
                             TB_CFG_PORT, 4, 1);
 }
index 75e935acade56881cf7a787567ca92e4ecc1b60b..74c0f4a5606d6ea963e1d639fb5fb79e18690a48 100644 (file)
@@ -211,6 +211,9 @@ struct tb_regs_port_header {
 
 } __packed;
 
+/* DWORD 4 */
+#define TB_PORT_NFC_CREDITS_MASK       GENMASK(19, 0)
+
 /* PCIe adapter registers */
 
 #define TB_PCI_EN                      BIT(31)