staging/rdma/hfi1: Add one-time LCB reset
authorDean Luick <dean.luick@intel.com>
Tue, 1 Dec 2015 20:38:15 +0000 (15:38 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Dec 2015 21:51:55 +0000 (13:51 -0800)
Add one-time LCB reset on driver load to pre-emptively work
around any LCB power cycle issues.

Reviewed-by: Easwar Hariharan <easwar.hariharan@intel.com>
Signed-off-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Jubin John <jubin.john@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rdma/hfi1/chip.c
drivers/staging/rdma/hfi1/chip_registers.h

index bcbd831..6281305 100644 (file)
@@ -5896,6 +5896,23 @@ void init_qsfp(struct hfi1_pportdata *ppd)
        }
 }
 
+/*
+ * Do a one-time initialize of the LCB block.
+ */
+static void init_lcb(struct hfi1_devdata *dd)
+{
+       /* the DC has been reset earlier in the driver load */
+
+       /* set LCB for cclk loopback on the port */
+       write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0x01);
+       write_csr(dd, DC_LCB_CFG_LANE_WIDTH, 0x00);
+       write_csr(dd, DC_LCB_CFG_REINIT_AS_SLAVE, 0x00);
+       write_csr(dd, DC_LCB_CFG_CNT_FOR_SKIP_STALL, 0x110);
+       write_csr(dd, DC_LCB_CFG_CLK_CNTR, 0x08);
+       write_csr(dd, DC_LCB_CFG_LOOPBACK, 0x02);
+       write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0x00);
+}
+
 int bringup_serdes(struct hfi1_pportdata *ppd)
 {
        struct hfi1_devdata *dd = ppd->dd;
@@ -5917,6 +5934,9 @@ int bringup_serdes(struct hfi1_pportdata *ppd)
        /* Set linkinit_reason on power up per OPA spec */
        ppd->linkinit_reason = OPA_LINKINIT_REASON_LINKUP;
 
+       /* one-time init of the LCB */
+       init_lcb(dd);
+
        if (loopback) {
                ret = init_loopback(dd);
                if (ret < 0)
index 5056c84..701e9e1 100644 (file)
 #define DC_LCB_CFG_TX_FIFOS_RADR_RST_VAL_SHIFT 0
 #define DC_LCB_CFG_TX_FIFOS_RESET (DC_LCB_CSRS + 0x000000000008)
 #define DC_LCB_CFG_TX_FIFOS_RESET_VAL_SHIFT 0
+#define DC_LCB_CFG_REINIT_AS_SLAVE (DC_LCB_CSRS + 0x000000000030)
+#define DC_LCB_CFG_CNT_FOR_SKIP_STALL (DC_LCB_CSRS + 0x000000000040)
+#define DC_LCB_CFG_CLK_CNTR (DC_LCB_CSRS + 0x000000000110)
 #define DC_LCB_ERR_CLR (DC_LCB_CSRS + 0x000000000308)
 #define DC_LCB_ERR_EN (DC_LCB_CSRS + 0x000000000310)
 #define DC_LCB_ERR_FLG (DC_LCB_CSRS + 0x000000000300)