Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Oct 2015 23:41:40 +0000 (UTC)
From:      "Conrad E. Meyer" <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r289272 - head/sys/dev/ntb/ntb_hw
Message-ID:  <201510132341.t9DNfeGr015047@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cem
Date: Tue Oct 13 23:41:40 2015
New Revision: 289272
URL: https://svnweb.freebsd.org/changeset/base/289272

Log:
  NTB: MFV 9fec60c4: Fix NTB-RP Link Up
  
  The Xeon NTB-RP setup, the transparent side does not get a link up/down
  interrupt.  Since the presence of a NTB device on the transparent side
  means that we have a NTB link up, we can work around the lack of an
  interrupt by simply calling the link up function to notify the upper
  layers.
  
  Authored by:	Jon Mason
  Obtained from:	Linux (Dual BSD/GPL driver)
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/sys/dev/ntb/ntb_hw/ntb_hw.c

Modified: head/sys/dev/ntb/ntb_hw/ntb_hw.c
==============================================================================
--- head/sys/dev/ntb/ntb_hw/ntb_hw.c	Tue Oct 13 23:41:06 2015	(r289271)
+++ head/sys/dev/ntb/ntb_hw/ntb_hw.c	Tue Oct 13 23:41:40 2015	(r289272)
@@ -207,13 +207,15 @@ static void ntb_handle_legacy_interrupt(
 static int ntb_create_callbacks(struct ntb_softc *ntb, int num_vectors);
 static void ntb_free_callbacks(struct ntb_softc *ntb);
 static struct ntb_hw_info *ntb_get_device_info(uint32_t device_id);
-static int ntb_initialize_hw(struct ntb_softc *ntb);
 static int ntb_setup_xeon(struct ntb_softc *ntb);
 static int ntb_setup_soc(struct ntb_softc *ntb);
+static void ntb_teardown_xeon(struct ntb_softc *ntb);
 static void configure_soc_secondary_side_bars(struct ntb_softc *ntb);
 static void configure_xeon_secondary_side_bars(struct ntb_softc *ntb);
 static void ntb_handle_heartbeat(void *arg);
 static void ntb_handle_link_event(struct ntb_softc *ntb, int link_state);
+static void ntb_hw_link_down(struct ntb_softc *ntb);
+static void ntb_hw_link_up(struct ntb_softc *ntb);
 static void recover_soc_link(void *arg);
 static int ntb_check_link_status(struct ntb_softc *ntb);
 static void save_bar_parameters(struct ntb_pci_bar_info *bar);
@@ -301,7 +303,10 @@ ntb_attach(device_t device)
 	error = ntb_map_pci_bars(ntb);
 	if (error)
 		goto out;
-	error = ntb_initialize_hw(ntb);
+	if (ntb->type == NTB_SOC)
+		error = ntb_setup_soc(ntb);
+	else
+		error = ntb_setup_xeon(ntb);
 	if (error)
 		goto out;
 	error = ntb_setup_interrupts(ntb);
@@ -324,6 +329,8 @@ ntb_detach(device_t device)
 	ntb = DEVICE2SOFTC(device);
 	callout_drain(&ntb->heartbeat_timer);
 	callout_drain(&ntb->lr_timer);
+	if (ntb->type == NTB_XEON)
+		ntb_teardown_xeon(ntb);
 	ntb_teardown_interrupts(ntb);
 	ntb_unmap_pci_bar(ntb);
 
@@ -691,14 +698,11 @@ ntb_get_device_info(uint32_t device_id)
 	return (NULL);
 }
 
-static int
-ntb_initialize_hw(struct ntb_softc *ntb)
+static void
+ntb_teardown_xeon(struct ntb_softc *ntb)
 {
 
-	if (ntb->type == NTB_SOC)
-		return (ntb_setup_soc(ntb));
-	else
-		return (ntb_setup_xeon(ntb));
+	ntb_hw_link_down(ntb);
 }
 
 static int
@@ -805,8 +809,7 @@ ntb_setup_xeon(struct ntb_softc *ntb)
 		    PCIM_CMD_MEMEN | PCIM_CMD_BUSMASTEREN);
 
 	/* Enable link training */
-	ntb_reg_write(4, ntb->reg_ofs.lnk_cntl,
-	    NTB_CNTL_BAR23_SNOOP | NTB_CNTL_BAR45_SNOOP);
+	ntb_hw_link_up(ntb);
 
 	return (0);
 }
@@ -1040,6 +1043,33 @@ ntb_handle_link_event(struct ntb_softc *
 }
 
 static void
+ntb_hw_link_up(struct ntb_softc *ntb)
+{
+
+	if (ntb->conn_type == NTB_CONN_TRANSPARENT)
+		ntb_handle_link_event(ntb, NTB_LINK_UP);
+	else
+		ntb_reg_write(4, ntb->reg_ofs.lnk_cntl,
+		    NTB_CNTL_BAR23_SNOOP | NTB_CNTL_BAR45_SNOOP);
+}
+
+static void
+ntb_hw_link_down(struct ntb_softc *ntb)
+{
+	uint32_t cntl;
+
+	if (ntb->conn_type == NTB_CONN_TRANSPARENT) {
+		ntb_handle_link_event(ntb, NTB_LINK_DOWN);
+		return;
+	}
+
+	cntl = ntb_reg_read(4, ntb->reg_ofs.lnk_cntl);
+	cntl &= ~(NTB_CNTL_BAR23_SNOOP | NTB_CNTL_BAR45_SNOOP);
+	cntl |= NTB_CNTL_LINK_DISABLE;
+	ntb_reg_write(4, ntb->reg_ofs.lnk_cntl, cntl);
+}
+
+static void
 recover_soc_link(void *arg)
 {
 	struct ntb_softc *ntb = arg;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510132341.t9DNfeGr015047>