Author: cem
Date: Mon May 23 19:46:58 2016
New Revision: 300531
URL: https://svnweb.freebsd.org/changeset/base/300531

Log:
  ntb_hw(4): Only record the first three MSIX vectors
  
  Don't overrun the msix_data array by reading the (unused) link state
  interrupt information.
  
  Reported by:  mav (earlier version)
  Sponsored by: EMC / Isilon Storage Division
  Differential Revision:        https://reviews.freebsd.org/D6489

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    Mon May 23 18:20:15 2016        
(r300530)
+++ head/sys/dev/ntb/ntb_hw/ntb_hw.c    Mon May 23 19:46:58 2016        
(r300531)
@@ -333,7 +333,7 @@ static inline void db_iowrite(struct ntb
 static inline void db_iowrite_raw(struct ntb_softc *, uint64_t regoff, 
uint64_t);
 static int ntb_create_msix_vec(struct ntb_softc *ntb, uint32_t num_vectors);
 static void ntb_free_msix_vec(struct ntb_softc *ntb);
-static void ntb_get_msix_info(struct ntb_softc *ntb, uint32_t num_vectors);
+static void ntb_get_msix_info(struct ntb_softc *ntb);
 static void ntb_exchange_msix(void *);
 static struct ntb_hw_info *ntb_get_device_info(uint32_t device_id);
 static void ntb_detect_max_mw(struct ntb_softc *ntb);
@@ -1067,10 +1067,18 @@ ntb_init_isr(struct ntb_softc *ntb)
                ntb->db_vec_shift = XEON_DB_TOTAL_SHIFT;
                rc = ntb_setup_legacy_interrupt(ntb);
        } else {
+               if (num_vectors - 1 != XEON_NONLINK_DB_MSIX_BITS &&
+                   HAS_FEATURE(NTB_SB01BASE_LOCKUP)) {
+                       device_printf(ntb->device,
+                           "Errata workaround expects %d doorbell bits\n",
+                           XEON_NONLINK_DB_MSIX_BITS);
+                       return (EINVAL);
+               }
+
                ntb_create_msix_vec(ntb, num_vectors);
                rc = ntb_setup_msix(ntb, num_vectors);
                if (rc == 0 && HAS_FEATURE(NTB_SB01BASE_LOCKUP))
-                       ntb_get_msix_info(ntb, num_vectors);
+                       ntb_get_msix_info(ntb);
        }
        if (rc != 0) {
                device_printf(ntb->device,
@@ -1335,7 +1343,7 @@ ntb_free_msix_vec(struct ntb_softc *ntb)
 }
 
 static void
-ntb_get_msix_info(struct ntb_softc *ntb, uint32_t num_vectors)
+ntb_get_msix_info(struct ntb_softc *ntb)
 {
        struct pci_devinfo *dinfo;
        struct pcicfg_msix *msix;
@@ -1346,7 +1354,9 @@ ntb_get_msix_info(struct ntb_softc *ntb,
 
        laddr = data = 0;
 
-       for (i = 0; i < num_vectors; i++) {
+       CTASSERT(XEON_NONLINK_DB_MSIX_BITS == nitems(ntb->msix_data));
+
+       for (i = 0; i < XEON_NONLINK_DB_MSIX_BITS; i++) {
                offset = msix->msix_table_offset + i * PCI_MSIX_ENTRY_SIZE;
 
                laddr = bus_read_4(msix->msix_table_res, offset +
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to