]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/ntb/ntb_hw.c
Merge tag 'upstream-3.12-rc1' of git://git.infradead.org/linux-ubi
[karo-tx-linux.git] / drivers / ntb / ntb_hw.c
index 784446e1de054b59f91303c8d44805147d2ca780..1cb6e51e6bda97aadb4ba88bd46123544dcc4140 100644 (file)
@@ -57,7 +57,7 @@
 #include "ntb_regs.h"
 
 #define NTB_NAME       "Intel(R) PCI-E Non-Transparent Bridge Driver"
-#define NTB_VER                "0.25"
+#define NTB_VER                "1.0"
 
 MODULE_DESCRIPTION(NTB_NAME);
 MODULE_VERSION(NTB_VER);
@@ -69,7 +69,7 @@ module_param(xeon_errata_workaround, bool, 0644);
 MODULE_PARM_DESC(xeon_errata_workaround, "Workaround for the Xeon Errata");
 
 enum {
-       NTB_CONN_CLASSIC = 0,
+       NTB_CONN_TRANSPARENT = 0,
        NTB_CONN_B2B,
        NTB_CONN_RP,
 };
@@ -145,6 +145,7 @@ void ntb_unregister_event_callback(struct ntb_device *ndev)
  * ntb_register_db_callback() - register a callback for doorbell interrupt
  * @ndev: pointer to ntb_device instance
  * @idx: doorbell index to register callback, zero based
+ * @data: pointer to be returned to caller with every callback
  * @func: callback function to register
  *
  * This function registers a callback function for the doorbell interrupt
@@ -167,9 +168,9 @@ int ntb_register_db_callback(struct ntb_device *ndev, unsigned int idx,
        ndev->db_cb[idx].data = data;
 
        /* unmask interrupt */
-       mask = readw(ndev->reg_ofs.pdb_mask);
+       mask = readw(ndev->reg_ofs.ldb_mask);
        clear_bit(idx * ndev->bits_per_vector, &mask);
-       writew(mask, ndev->reg_ofs.pdb_mask);
+       writew(mask, ndev->reg_ofs.ldb_mask);
 
        return 0;
 }
@@ -189,9 +190,9 @@ void ntb_unregister_db_callback(struct ntb_device *ndev, unsigned int idx)
        if (idx >= ndev->max_cbs || !ndev->db_cb[idx].callback)
                return;
 
-       mask = readw(ndev->reg_ofs.pdb_mask);
+       mask = readw(ndev->reg_ofs.ldb_mask);
        set_bit(idx * ndev->bits_per_vector, &mask);
-       writew(mask, ndev->reg_ofs.pdb_mask);
+       writew(mask, ndev->reg_ofs.ldb_mask);
 
        ndev->db_cb[idx].callback = NULL;
 }
@@ -349,6 +350,23 @@ int ntb_read_remote_spad(struct ntb_device *ndev, unsigned int idx, u32 *val)
        return 0;
 }
 
+/**
+ * ntb_get_mw_base() - get addr for the NTB memory window
+ * @ndev: pointer to ntb_device instance
+ * @mw: memory window number
+ *
+ * This function provides the base address of the memory window specified.
+ *
+ * RETURNS: address, or NULL on error.
+ */
+resource_size_t ntb_get_mw_base(struct ntb_device *ndev, unsigned int mw)
+{
+       if (mw >= ntb_max_mw(ndev))
+               return 0;
+
+       return pci_resource_start(ndev->pdev, MW_TO_BAR(mw));
+}
+
 /**
  * ntb_get_mw_vbase() - get virtual addr for the NTB memory window
  * @ndev: pointer to ntb_device instance
@@ -376,7 +394,7 @@ void __iomem *ntb_get_mw_vbase(struct ntb_device *ndev, unsigned int mw)
  *
  * RETURNS: the size of the memory window or zero on error
  */
-resource_size_t ntb_get_mw_size(struct ntb_device *ndev, unsigned int mw)
+u64 ntb_get_mw_size(struct ntb_device *ndev, unsigned int mw)
 {
        if (mw >= ntb_max_mw(ndev))
                return 0;
@@ -406,16 +424,16 @@ void ntb_set_mw_addr(struct ntb_device *ndev, unsigned int mw, u64 addr)
 
        switch (MW_TO_BAR(mw)) {
        case NTB_BAR_23:
-               writeq(addr, ndev->reg_ofs.sbar2_xlat);
+               writeq(addr, ndev->reg_ofs.bar2_xlat);
                break;
        case NTB_BAR_45:
-               writeq(addr, ndev->reg_ofs.sbar4_xlat);
+               writeq(addr, ndev->reg_ofs.bar4_xlat);
                break;
        }
 }
 
 /**
- * ntb_ring_sdb() - Set the doorbell on the secondary/external side
+ * ntb_ring_doorbell() - Set the doorbell on the secondary/external side
  * @ndev: pointer to ntb_device instance
  * @db: doorbell to ring
  *
@@ -424,15 +442,15 @@ void ntb_set_mw_addr(struct ntb_device *ndev, unsigned int mw, u64 addr)
  *
  * RETURNS: An appropriate -ERRNO error value on error, or zero for success.
  */
-void ntb_ring_sdb(struct ntb_device *ndev, unsigned int db)
+void ntb_ring_doorbell(struct ntb_device *ndev, unsigned int db)
 {
        dev_dbg(&ndev->pdev->dev, "%s: ringing doorbell %d\n", __func__, db);
 
        if (ndev->hw_type == BWD_HW)
-               writeq((u64) 1 << db, ndev->reg_ofs.sdb);
+               writeq((u64) 1 << db, ndev->reg_ofs.rdb);
        else
                writew(((1 << ndev->bits_per_vector) - 1) <<
-                      (db * ndev->bits_per_vector), ndev->reg_ofs.sdb);
+                      (db * ndev->bits_per_vector), ndev->reg_ofs.rdb);
 }
 
 static void bwd_recover_link(struct ntb_device *ndev)
@@ -492,7 +510,8 @@ static void ntb_link_event(struct ntb_device *ndev, int link_state)
                ndev->link_status = NTB_LINK_UP;
                event = NTB_EVENT_HW_LINK_UP;
 
-               if (ndev->hw_type == BWD_HW)
+               if (ndev->hw_type == BWD_HW ||
+                   ndev->conn_type == NTB_CONN_TRANSPARENT)
                        status = readw(ndev->reg_ofs.lnk_stat);
                else {
                        int rc = pci_read_config_word(ndev->pdev,
@@ -632,119 +651,174 @@ static int ntb_xeon_setup(struct ntb_device *ndev)
        if (rc)
                return rc;
 
-       switch (val & SNB_PPD_CONN_TYPE) {
-       case NTB_CONN_B2B:
-               ndev->conn_type = NTB_CONN_B2B;
-               break;
-       case NTB_CONN_CLASSIC:
-       case NTB_CONN_RP:
-       default:
-               dev_err(&ndev->pdev->dev, "Only B2B supported at this time\n");
-               return -EINVAL;
-       }
-
        if (val & SNB_PPD_DEV_TYPE)
                ndev->dev_type = NTB_DEV_USD;
        else
                ndev->dev_type = NTB_DEV_DSD;
 
-       ndev->reg_ofs.pdb = ndev->reg_base + SNB_PDOORBELL_OFFSET;
-       ndev->reg_ofs.pdb_mask = ndev->reg_base + SNB_PDBMSK_OFFSET;
-       ndev->reg_ofs.sbar2_xlat = ndev->reg_base + SNB_SBAR2XLAT_OFFSET;
-       ndev->reg_ofs.sbar4_xlat = ndev->reg_base + SNB_SBAR4XLAT_OFFSET;
-       ndev->reg_ofs.lnk_cntl = ndev->reg_base + SNB_NTBCNTL_OFFSET;
-       ndev->reg_ofs.lnk_stat = ndev->reg_base + SNB_LINK_STATUS_OFFSET;
-       ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET;
-       ndev->reg_ofs.spci_cmd = ndev->reg_base + SNB_PCICMD_OFFSET;
-
-       /* There is a Xeon hardware errata related to writes to
-        * SDOORBELL or B2BDOORBELL in conjunction with inbound access
-        * to NTB MMIO Space, which may hang the system.  To workaround
-        * this use the second memory window to access the interrupt and
-        * scratch pad registers on the remote system.
-        */
-       if (xeon_errata_workaround) {
-               if (!ndev->mw[1].bar_sz)
-                       return -EINVAL;
-
-               ndev->limits.max_mw = SNB_ERRATA_MAX_MW;
-               ndev->reg_ofs.spad_write = ndev->mw[1].vbase +
-                                          SNB_SPAD_OFFSET;
-               ndev->reg_ofs.sdb = ndev->mw[1].vbase +
-                                   SNB_PDOORBELL_OFFSET;
-
-               /* Set the Limit register to 4k, the minimum size, to
-                * prevent an illegal access
+       switch (val & SNB_PPD_CONN_TYPE) {
+       case NTB_CONN_B2B:
+               dev_info(&ndev->pdev->dev, "Conn Type = B2B\n");
+               ndev->conn_type = NTB_CONN_B2B;
+               ndev->reg_ofs.ldb = ndev->reg_base + SNB_PDOORBELL_OFFSET;
+               ndev->reg_ofs.ldb_mask = ndev->reg_base + SNB_PDBMSK_OFFSET;
+               ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET;
+               ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_SBAR2XLAT_OFFSET;
+               ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_SBAR4XLAT_OFFSET;
+               ndev->limits.max_spads = SNB_MAX_B2B_SPADS;
+
+               /* There is a Xeon hardware errata related to writes to
+                * SDOORBELL or B2BDOORBELL in conjunction with inbound access
+                * to NTB MMIO Space, which may hang the system.  To workaround
+                * this use the second memory window to access the interrupt and
+                * scratch pad registers on the remote system.
                 */
-               writeq(ndev->mw[1].bar_sz + 0x1000, ndev->reg_base +
-                      SNB_PBAR4LMT_OFFSET);
-       } else {
-               ndev->limits.max_mw = SNB_MAX_MW;
-               ndev->reg_ofs.spad_write = ndev->reg_base +
-                                          SNB_B2B_SPAD_OFFSET;
-               ndev->reg_ofs.sdb = ndev->reg_base +
-                                   SNB_B2B_DOORBELL_OFFSET;
+               if (xeon_errata_workaround) {
+                       if (!ndev->mw[1].bar_sz)
+                               return -EINVAL;
+
+                       ndev->limits.max_mw = SNB_ERRATA_MAX_MW;
+                       ndev->reg_ofs.spad_write = ndev->mw[1].vbase +
+                                                  SNB_SPAD_OFFSET;
+                       ndev->reg_ofs.rdb = ndev->mw[1].vbase +
+                                           SNB_PDOORBELL_OFFSET;
+
+                       /* Set the Limit register to 4k, the minimum size, to
+                        * prevent an illegal access
+                        */
+                       writeq(ndev->mw[1].bar_sz + 0x1000, ndev->reg_base +
+                              SNB_PBAR4LMT_OFFSET);
+               } else {
+                       ndev->limits.max_mw = SNB_MAX_MW;
+                       ndev->reg_ofs.spad_write = ndev->reg_base +
+                                                  SNB_B2B_SPAD_OFFSET;
+                       ndev->reg_ofs.rdb = ndev->reg_base +
+                                           SNB_B2B_DOORBELL_OFFSET;
+
+                       /* Disable the Limit register, just incase it is set to
+                        * something silly
+                        */
+                       writeq(0, ndev->reg_base + SNB_PBAR4LMT_OFFSET);
+               }
 
-               /* Disable the Limit register, just incase it is set to
-                * something silly
+               /* The Xeon errata workaround requires setting SBAR Base
+                * addresses to known values, so that the PBAR XLAT can be
+                * pointed at SBAR0 of the remote system.
                 */
-               writeq(0, ndev->reg_base + SNB_PBAR4LMT_OFFSET);
-       }
+               if (ndev->dev_type == NTB_DEV_USD) {
+                       writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base +
+                              SNB_PBAR2XLAT_OFFSET);
+                       if (xeon_errata_workaround)
+                               writeq(SNB_MBAR01_DSD_ADDR, ndev->reg_base +
+                                      SNB_PBAR4XLAT_OFFSET);
+                       else {
+                               writeq(SNB_MBAR45_DSD_ADDR, ndev->reg_base +
+                                      SNB_PBAR4XLAT_OFFSET);
+                               /* B2B_XLAT_OFFSET is a 64bit register, but can
+                                * only take 32bit writes
+                                */
+                               writel(SNB_MBAR01_DSD_ADDR & 0xffffffff,
+                                      ndev->reg_base + SNB_B2B_XLAT_OFFSETL);
+                               writel(SNB_MBAR01_DSD_ADDR >> 32,
+                                      ndev->reg_base + SNB_B2B_XLAT_OFFSETU);
+                       }
 
-       /* The Xeon errata workaround requires setting SBAR Base
-        * addresses to known values, so that the PBAR XLAT can be
-        * pointed at SBAR0 of the remote system.
-        */
-       if (ndev->dev_type == NTB_DEV_USD) {
-               writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base +
-                      SNB_PBAR2XLAT_OFFSET);
-               if (xeon_errata_workaround)
+                       writeq(SNB_MBAR01_USD_ADDR, ndev->reg_base +
+                              SNB_SBAR0BASE_OFFSET);
+                       writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base +
+                              SNB_SBAR2BASE_OFFSET);
+                       writeq(SNB_MBAR45_USD_ADDR, ndev->reg_base +
+                              SNB_SBAR4BASE_OFFSET);
+               } else {
+                       writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base +
+                              SNB_PBAR2XLAT_OFFSET);
+                       if (xeon_errata_workaround)
+                               writeq(SNB_MBAR01_USD_ADDR, ndev->reg_base +
+                                      SNB_PBAR4XLAT_OFFSET);
+                       else {
+                               writeq(SNB_MBAR45_USD_ADDR, ndev->reg_base +
+                                      SNB_PBAR4XLAT_OFFSET);
+                               /* B2B_XLAT_OFFSET is a 64bit register, but can
+                                * only take 32bit writes
+                                */
+                               writel(SNB_MBAR01_DSD_ADDR & 0xffffffff,
+                                      ndev->reg_base + SNB_B2B_XLAT_OFFSETL);
+                               writel(SNB_MBAR01_USD_ADDR >> 32,
+                                      ndev->reg_base + SNB_B2B_XLAT_OFFSETU);
+                       }
                        writeq(SNB_MBAR01_DSD_ADDR, ndev->reg_base +
-                              SNB_PBAR4XLAT_OFFSET);
-               else {
+                              SNB_SBAR0BASE_OFFSET);
+                       writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base +
+                              SNB_SBAR2BASE_OFFSET);
                        writeq(SNB_MBAR45_DSD_ADDR, ndev->reg_base +
-                              SNB_PBAR4XLAT_OFFSET);
-                       /* B2B_XLAT_OFFSET is a 64bit register, but can
-                        * only take 32bit writes
-                        */
-                       writel(SNB_MBAR01_USD_ADDR & 0xffffffff,
-                              ndev->reg_base + SNB_B2B_XLAT_OFFSETL);
-                       writel(SNB_MBAR01_DSD_ADDR >> 32,
-                              ndev->reg_base + SNB_B2B_XLAT_OFFSETU);
+                              SNB_SBAR4BASE_OFFSET);
                }
+               break;
+       case NTB_CONN_RP:
+               dev_info(&ndev->pdev->dev, "Conn Type = RP\n");
+               ndev->conn_type = NTB_CONN_RP;
 
-               writeq(SNB_MBAR01_USD_ADDR, ndev->reg_base +
-                      SNB_SBAR0BASE_OFFSET);
-               writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base +
-                      SNB_SBAR2BASE_OFFSET);
-               writeq(SNB_MBAR45_USD_ADDR, ndev->reg_base +
-                      SNB_SBAR4BASE_OFFSET);
-       } else {
-               writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base +
-                      SNB_PBAR2XLAT_OFFSET);
-               if (xeon_errata_workaround)
-                       writeq(SNB_MBAR01_USD_ADDR, ndev->reg_base +
-                              SNB_PBAR4XLAT_OFFSET);
-               else {
-                       writeq(SNB_MBAR45_USD_ADDR, ndev->reg_base +
-                              SNB_PBAR4XLAT_OFFSET);
-                       /* B2B_XLAT_OFFSET is a 64bit register, but can
-                        * only take 32bit writes
-                        */
-                       writel(SNB_MBAR01_USD_ADDR & 0xffffffff,
-                              ndev->reg_base + SNB_B2B_XLAT_OFFSETL);
-                       writel(SNB_MBAR01_USD_ADDR >> 32,
-                              ndev->reg_base + SNB_B2B_XLAT_OFFSETU);
+               if (xeon_errata_workaround) {
+                       dev_err(&ndev->pdev->dev, 
+                               "NTB-RP disabled due to hardware errata.  To disregard this warning and potentially lock-up the system, add the parameter 'xeon_errata_workaround=0'.\n");
+                       return -EINVAL;
                }
-               writeq(SNB_MBAR01_DSD_ADDR, ndev->reg_base +
-                      SNB_SBAR0BASE_OFFSET);
-               writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base +
-                      SNB_SBAR2BASE_OFFSET);
-               writeq(SNB_MBAR45_DSD_ADDR, ndev->reg_base +
-                      SNB_SBAR4BASE_OFFSET);
+
+               /* Scratch pads need to have exclusive access from the primary
+                * or secondary side.  Halve the num spads so that each side can
+                * have an equal amount.
+                */
+               ndev->limits.max_spads = SNB_MAX_COMPAT_SPADS / 2;
+               /* Note: The SDOORBELL is the cause of the errata.  You REALLY
+                * don't want to touch it.
+                */
+               ndev->reg_ofs.rdb = ndev->reg_base + SNB_SDOORBELL_OFFSET;
+               ndev->reg_ofs.ldb = ndev->reg_base + SNB_PDOORBELL_OFFSET;
+               ndev->reg_ofs.ldb_mask = ndev->reg_base + SNB_PDBMSK_OFFSET;
+               /* Offset the start of the spads to correspond to whether it is
+                * primary or secondary
+                */
+               ndev->reg_ofs.spad_write = ndev->reg_base + SNB_SPAD_OFFSET +
+                                          ndev->limits.max_spads * 4;
+               ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET;
+               ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_SBAR2XLAT_OFFSET;
+               ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_SBAR4XLAT_OFFSET;
+               ndev->limits.max_mw = SNB_MAX_MW;
+               break;
+       case NTB_CONN_TRANSPARENT:
+               dev_info(&ndev->pdev->dev, "Conn Type = TRANSPARENT\n");
+               ndev->conn_type = NTB_CONN_TRANSPARENT;
+               /* Scratch pads need to have exclusive access from the primary
+                * or secondary side.  Halve the num spads so that each side can
+                * have an equal amount.
+                */
+               ndev->limits.max_spads = SNB_MAX_COMPAT_SPADS / 2;
+               ndev->reg_ofs.rdb = ndev->reg_base + SNB_PDOORBELL_OFFSET;
+               ndev->reg_ofs.ldb = ndev->reg_base + SNB_SDOORBELL_OFFSET;
+               ndev->reg_ofs.ldb_mask = ndev->reg_base + SNB_SDBMSK_OFFSET;
+               ndev->reg_ofs.spad_write = ndev->reg_base + SNB_SPAD_OFFSET;
+               /* Offset the start of the spads to correspond to whether it is
+                * primary or secondary
+                */
+               ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET +
+                                         ndev->limits.max_spads * 4;
+               ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_PBAR2XLAT_OFFSET;
+               ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_PBAR4XLAT_OFFSET;
+
+               ndev->limits.max_mw = SNB_MAX_MW;
+               break;
+       default:
+               /* Most likely caused by the remote NTB-RP device not being
+                * configured
+                */
+               dev_err(&ndev->pdev->dev, "Unknown PPD %x\n", val);
+               return -EINVAL;
        }
 
-       ndev->limits.max_spads = SNB_MAX_B2B_SPADS;
+       ndev->reg_ofs.lnk_cntl = ndev->reg_base + SNB_NTBCNTL_OFFSET;
+       ndev->reg_ofs.lnk_stat = ndev->reg_base + SNB_SLINK_STATUS_OFFSET;
+       ndev->reg_ofs.spci_cmd = ndev->reg_base + SNB_PCICMD_OFFSET;
+
        ndev->limits.max_db_bits = SNB_MAX_DB_BITS;
        ndev->limits.msix_cnt = SNB_MSIX_CNT;
        ndev->bits_per_vector = SNB_DB_BITS_PER_VEC;
@@ -769,7 +843,7 @@ static int ntb_bwd_setup(struct ntb_device *ndev)
                break;
        case NTB_CONN_RP:
        default:
-               dev_err(&ndev->pdev->dev, "Only B2B supported at this time\n");
+               dev_err(&ndev->pdev->dev, "Unsupported NTB configuration\n");
                return -EINVAL;
        }
 
@@ -784,26 +858,18 @@ static int ntb_bwd_setup(struct ntb_device *ndev)
        if (rc)
                return rc;
 
-       ndev->reg_ofs.pdb = ndev->reg_base + BWD_PDOORBELL_OFFSET;
-       ndev->reg_ofs.pdb_mask = ndev->reg_base + BWD_PDBMSK_OFFSET;
-       ndev->reg_ofs.sbar2_xlat = ndev->reg_base + BWD_SBAR2XLAT_OFFSET;
-       ndev->reg_ofs.sbar4_xlat = ndev->reg_base + BWD_SBAR4XLAT_OFFSET;
+       ndev->reg_ofs.ldb = ndev->reg_base + BWD_PDOORBELL_OFFSET;
+       ndev->reg_ofs.ldb_mask = ndev->reg_base + BWD_PDBMSK_OFFSET;
+       ndev->reg_ofs.rdb = ndev->reg_base + BWD_B2B_DOORBELL_OFFSET;
+       ndev->reg_ofs.bar2_xlat = ndev->reg_base + BWD_SBAR2XLAT_OFFSET;
+       ndev->reg_ofs.bar4_xlat = ndev->reg_base + BWD_SBAR4XLAT_OFFSET;
        ndev->reg_ofs.lnk_cntl = ndev->reg_base + BWD_NTBCNTL_OFFSET;
        ndev->reg_ofs.lnk_stat = ndev->reg_base + BWD_LINK_STATUS_OFFSET;
        ndev->reg_ofs.spad_read = ndev->reg_base + BWD_SPAD_OFFSET;
+       ndev->reg_ofs.spad_write = ndev->reg_base + BWD_B2B_SPAD_OFFSET;
        ndev->reg_ofs.spci_cmd = ndev->reg_base + BWD_PCICMD_OFFSET;
-
-       if (ndev->conn_type == NTB_CONN_B2B) {
-               ndev->reg_ofs.sdb = ndev->reg_base + BWD_B2B_DOORBELL_OFFSET;
-               ndev->reg_ofs.spad_write = ndev->reg_base + BWD_B2B_SPAD_OFFSET;
-               ndev->limits.max_spads = BWD_MAX_SPADS;
-       } else {
-               ndev->reg_ofs.sdb = ndev->reg_base + BWD_PDOORBELL_OFFSET;
-               ndev->reg_ofs.spad_write = ndev->reg_base + BWD_SPAD_OFFSET;
-               ndev->limits.max_spads = BWD_MAX_COMPAT_SPADS;
-       }
-
        ndev->limits.max_mw = BWD_MAX_MW;
+       ndev->limits.max_spads = BWD_MAX_SPADS;
        ndev->limits.max_db_bits = BWD_MAX_DB_BITS;
        ndev->limits.msix_cnt = BWD_MSIX_CNT;
        ndev->bits_per_vector = BWD_DB_BITS_PER_VEC;
@@ -848,8 +914,10 @@ static int ntb_device_setup(struct ntb_device *ndev)
        dev_info(&ndev->pdev->dev, "Device Type = %s\n",
                 ndev->dev_type == NTB_DEV_USD ? "USD/DSP" : "DSD/USP");
 
-       /* Enable Bus Master and Memory Space on the secondary side */
-       writew(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER, ndev->reg_ofs.spci_cmd);
+       if (ndev->conn_type == NTB_CONN_B2B)
+               /* Enable Bus Master and Memory Space on the secondary side */
+               writew(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER,
+                      ndev->reg_ofs.spci_cmd);
 
        return 0;
 }
@@ -878,7 +946,7 @@ static irqreturn_t bwd_callback_msix_irq(int irq, void *data)
         */
        ndev->last_ts = jiffies;
 
-       writeq((u64) 1 << db_cb->db_num, ndev->reg_ofs.pdb);
+       writeq((u64) 1 << db_cb->db_num, ndev->reg_ofs.ldb);
 
        return IRQ_HANDLED;
 }
@@ -900,7 +968,7 @@ static irqreturn_t xeon_callback_msix_irq(int irq, void *data)
         * interrupts.
         */
        writew(((1 << ndev->bits_per_vector) - 1) <<
-              (db_cb->db_num * ndev->bits_per_vector), ndev->reg_ofs.pdb);
+              (db_cb->db_num * ndev->bits_per_vector), ndev->reg_ofs.ldb);
 
        return IRQ_HANDLED;
 }
@@ -918,7 +986,7 @@ static irqreturn_t xeon_event_msix_irq(int irq, void *dev)
                dev_err(&ndev->pdev->dev, "Error determining link status\n");
 
        /* bit 15 is always the link bit */
-       writew(1 << ndev->limits.max_db_bits, ndev->reg_ofs.pdb);
+       writew(1 << ndev->limits.max_db_bits, ndev->reg_ofs.ldb);
 
        return IRQ_HANDLED;
 }
@@ -929,29 +997,28 @@ static irqreturn_t ntb_interrupt(int irq, void *dev)
        unsigned int i = 0;
 
        if (ndev->hw_type == BWD_HW) {
-               u64 pdb = readq(ndev->reg_ofs.pdb);
+               u64 ldb = readq(ndev->reg_ofs.ldb);
 
-               dev_dbg(&ndev->pdev->dev, "irq %d - pdb = %Lx\n", irq, pdb);
+               dev_dbg(&ndev->pdev->dev, "irq %d - ldb = %Lx\n", irq, ldb);
 
-               while (pdb) {
-                       i = __ffs(pdb);
-                       pdb &= pdb - 1;
+               while (ldb) {
+                       i = __ffs(ldb);
+                       ldb &= ldb - 1;
                        bwd_callback_msix_irq(irq, &ndev->db_cb[i]);
                }
        } else {
-               u16 pdb = readw(ndev->reg_ofs.pdb);
+               u16 ldb = readw(ndev->reg_ofs.ldb);
 
-               dev_dbg(&ndev->pdev->dev, "irq %d - pdb = %x sdb %x\n", irq,
-                       pdb, readw(ndev->reg_ofs.sdb));
+               dev_dbg(&ndev->pdev->dev, "irq %d - ldb = %x\n", irq, ldb);
 
-               if (pdb & SNB_DB_HW_LINK) {
+               if (ldb & SNB_DB_HW_LINK) {
                        xeon_event_msix_irq(irq, dev);
-                       pdb &= ~SNB_DB_HW_LINK;
+                       ldb &= ~SNB_DB_HW_LINK;
                }
 
-               while (pdb) {
-                       i = __ffs(pdb);
-                       pdb &= pdb - 1;
+               while (ldb) {
+                       i = __ffs(ldb);
+                       ldb &= ldb - 1;
                        xeon_callback_msix_irq(irq, &ndev->db_cb[i]);
                }
        }
@@ -964,16 +1031,15 @@ static int ntb_setup_msix(struct ntb_device *ndev)
        struct pci_dev *pdev = ndev->pdev;
        struct msix_entry *msix;
        int msix_entries;
-       int rc, i, pos;
+       int rc, i;
        u16 val;
 
-       pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
-       if (!pos) {
+       if (!pdev->msix_cap) {
                rc = -EIO;
                goto err;
        }
 
-       rc = pci_read_config_word(pdev, pos + PCI_MSIX_FLAGS, &val);
+       rc = pci_read_config_word(pdev, pdev->msix_cap + PCI_MSIX_FLAGS, &val);
        if (rc)
                goto err;
 
@@ -1109,10 +1175,10 @@ static int ntb_setup_interrupts(struct ntb_device *ndev)
         * Interrupt.  The rest will be unmasked as callbacks are registered.
         */
        if (ndev->hw_type == BWD_HW)
-               writeq(~0, ndev->reg_ofs.pdb_mask);
+               writeq(~0, ndev->reg_ofs.ldb_mask);
        else
                writew(~(1 << ndev->limits.max_db_bits),
-                      ndev->reg_ofs.pdb_mask);
+                      ndev->reg_ofs.ldb_mask);
 
        rc = ntb_setup_msix(ndev);
        if (!rc)
@@ -1141,9 +1207,9 @@ static void ntb_free_interrupts(struct ntb_device *ndev)
 
        /* mask interrupts */
        if (ndev->hw_type == BWD_HW)
-               writeq(~0, ndev->reg_ofs.pdb_mask);
+               writeq(~0, ndev->reg_ofs.ldb_mask);
        else
-               writew(~0, ndev->reg_ofs.pdb_mask);
+               writew(~0, ndev->reg_ofs.ldb_mask);
 
        if (ndev->num_msix) {
                struct msix_entry *msix;
@@ -1169,9 +1235,9 @@ static int ntb_create_callbacks(struct ntb_device *ndev)
 {
        int i;
 
-       /* Checken-egg issue.  We won't know how many callbacks are necessary
+       /* Chicken-egg issue.  We won't know how many callbacks are necessary
         * until we see how many MSI-X vectors we get, but these pointers need
-        * to be passed into the MSI-X register fucntion.  So, we allocate the
+        * to be passed into the MSI-X register function.  So, we allocate the
         * max, knowing that they might not all be used, to work around this.
         */
        ndev->db_cb = kcalloc(ndev->limits.max_db_bits,
@@ -1257,7 +1323,7 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                    ioremap_wc(pci_resource_start(pdev, MW_TO_BAR(i)),
                               ndev->mw[i].bar_sz);
                dev_info(&pdev->dev, "MW %d size %llu\n", i,
-                        pci_resource_len(pdev, MW_TO_BAR(i)));
+                        (unsigned long long) ndev->mw[i].bar_sz);
                if (!ndev->mw[i].vbase) {
                        dev_warn(&pdev->dev, "Cannot remap BAR %d\n",
                                 MW_TO_BAR(i));
@@ -1344,7 +1410,7 @@ static void ntb_pci_remove(struct pci_dev *pdev)
 
        /* Bring NTB link down */
        ntb_cntl = readl(ndev->reg_ofs.lnk_cntl);
-       ntb_cntl |= NTB_LINK_DISABLE;
+       ntb_cntl |= NTB_CNTL_LINK_DISABLE;
        writel(ntb_cntl, ndev->reg_ofs.lnk_cntl);
 
        ntb_transport_free(ndev->ntb_transport);