diff options
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_intr.c | 15 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 10 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_pe800.c | 4 |
3 files changed, 23 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c index 0bcb428041f3..8e3b95b2928b 100644 --- a/drivers/infiniband/hw/ipath/ipath_intr.c +++ b/drivers/infiniband/hw/ipath/ipath_intr.c | |||
| @@ -719,11 +719,24 @@ static void handle_rcv(struct ipath_devdata *dd, u32 istat) | |||
| 719 | irqreturn_t ipath_intr(int irq, void *data, struct pt_regs *regs) | 719 | irqreturn_t ipath_intr(int irq, void *data, struct pt_regs *regs) |
| 720 | { | 720 | { |
| 721 | struct ipath_devdata *dd = data; | 721 | struct ipath_devdata *dd = data; |
| 722 | u32 istat = ipath_read_kreg32(dd, dd->ipath_kregs->kr_intstatus); | 722 | u32 istat; |
| 723 | ipath_err_t estat = 0; | 723 | ipath_err_t estat = 0; |
| 724 | static unsigned unexpected = 0; | 724 | static unsigned unexpected = 0; |
| 725 | irqreturn_t ret; | 725 | irqreturn_t ret; |
| 726 | 726 | ||
| 727 | if(!(dd->ipath_flags & IPATH_PRESENT)) { | ||
| 728 | /* this is mostly so we don't try to touch the chip while | ||
| 729 | * it is being reset */ | ||
| 730 | /* | ||
| 731 | * This return value is perhaps odd, but we do not want the | ||
| 732 | * interrupt core code to remove our interrupt handler | ||
| 733 | * because we don't appear to be handling an interrupt | ||
| 734 | * during a chip reset. | ||
| 735 | */ | ||
| 736 | return IRQ_HANDLED; | ||
| 737 | } | ||
| 738 | |||
| 739 | istat = ipath_read_kreg32(dd, dd->ipath_kregs->kr_intstatus); | ||
| 727 | if (unlikely(!istat)) { | 740 | if (unlikely(!istat)) { |
| 728 | ipath_stats.sps_nullintr++; | 741 | ipath_stats.sps_nullintr++; |
| 729 | ret = IRQ_NONE; /* not our interrupt, or already handled */ | 742 | ret = IRQ_NONE; /* not our interrupt, or already handled */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 0ce5f19c9d62..e6507f8115bc 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
| @@ -731,7 +731,7 @@ u64 ipath_read_kreg64_port(const struct ipath_devdata *, ipath_kreg, | |||
| 731 | static inline u32 ipath_read_ureg32(const struct ipath_devdata *dd, | 731 | static inline u32 ipath_read_ureg32(const struct ipath_devdata *dd, |
| 732 | ipath_ureg regno, int port) | 732 | ipath_ureg regno, int port) |
| 733 | { | 733 | { |
| 734 | if (!dd->ipath_kregbase) | 734 | if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT)) |
| 735 | return 0; | 735 | return 0; |
| 736 | 736 | ||
| 737 | return readl(regno + (u64 __iomem *) | 737 | return readl(regno + (u64 __iomem *) |
| @@ -762,7 +762,7 @@ static inline void ipath_write_ureg(const struct ipath_devdata *dd, | |||
| 762 | static inline u32 ipath_read_kreg32(const struct ipath_devdata *dd, | 762 | static inline u32 ipath_read_kreg32(const struct ipath_devdata *dd, |
| 763 | ipath_kreg regno) | 763 | ipath_kreg regno) |
| 764 | { | 764 | { |
| 765 | if (!dd->ipath_kregbase) | 765 | if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT)) |
| 766 | return -1; | 766 | return -1; |
| 767 | return readl((u32 __iomem *) & dd->ipath_kregbase[regno]); | 767 | return readl((u32 __iomem *) & dd->ipath_kregbase[regno]); |
| 768 | } | 768 | } |
| @@ -770,7 +770,7 @@ static inline u32 ipath_read_kreg32(const struct ipath_devdata *dd, | |||
| 770 | static inline u64 ipath_read_kreg64(const struct ipath_devdata *dd, | 770 | static inline u64 ipath_read_kreg64(const struct ipath_devdata *dd, |
| 771 | ipath_kreg regno) | 771 | ipath_kreg regno) |
| 772 | { | 772 | { |
| 773 | if (!dd->ipath_kregbase) | 773 | if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT)) |
| 774 | return -1; | 774 | return -1; |
| 775 | 775 | ||
| 776 | return readq(&dd->ipath_kregbase[regno]); | 776 | return readq(&dd->ipath_kregbase[regno]); |
| @@ -786,7 +786,7 @@ static inline void ipath_write_kreg(const struct ipath_devdata *dd, | |||
| 786 | static inline u64 ipath_read_creg(const struct ipath_devdata *dd, | 786 | static inline u64 ipath_read_creg(const struct ipath_devdata *dd, |
| 787 | ipath_sreg regno) | 787 | ipath_sreg regno) |
| 788 | { | 788 | { |
| 789 | if (!dd->ipath_kregbase) | 789 | if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT)) |
| 790 | return 0; | 790 | return 0; |
| 791 | 791 | ||
| 792 | return readq(regno + (u64 __iomem *) | 792 | return readq(regno + (u64 __iomem *) |
| @@ -797,7 +797,7 @@ static inline u64 ipath_read_creg(const struct ipath_devdata *dd, | |||
| 797 | static inline u32 ipath_read_creg32(const struct ipath_devdata *dd, | 797 | static inline u32 ipath_read_creg32(const struct ipath_devdata *dd, |
| 798 | ipath_sreg regno) | 798 | ipath_sreg regno) |
| 799 | { | 799 | { |
| 800 | if (!dd->ipath_kregbase) | 800 | if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT)) |
| 801 | return 0; | 801 | return 0; |
| 802 | return readl(regno + (u64 __iomem *) | 802 | return readl(regno + (u64 __iomem *) |
| 803 | (dd->ipath_cregbase + | 803 | (dd->ipath_cregbase + |
diff --git a/drivers/infiniband/hw/ipath/ipath_pe800.c b/drivers/infiniband/hw/ipath/ipath_pe800.c index e1dc4f757062..6318067ab5ec 100644 --- a/drivers/infiniband/hw/ipath/ipath_pe800.c +++ b/drivers/infiniband/hw/ipath/ipath_pe800.c | |||
| @@ -972,6 +972,8 @@ static int ipath_setup_pe_reset(struct ipath_devdata *dd) | |||
| 972 | /* Use ERROR so it shows up in logs, etc. */ | 972 | /* Use ERROR so it shows up in logs, etc. */ |
| 973 | ipath_dev_err(dd, "Resetting PE-800 unit %u\n", | 973 | ipath_dev_err(dd, "Resetting PE-800 unit %u\n", |
| 974 | dd->ipath_unit); | 974 | dd->ipath_unit); |
| 975 | /* keep chip from being accessed in a few places */ | ||
| 976 | dd->ipath_flags &= ~(IPATH_INITTED|IPATH_PRESENT); | ||
| 975 | val = dd->ipath_control | INFINIPATH_C_RESET; | 977 | val = dd->ipath_control | INFINIPATH_C_RESET; |
| 976 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, val); | 978 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, val); |
| 977 | mb(); | 979 | mb(); |
| @@ -997,6 +999,8 @@ static int ipath_setup_pe_reset(struct ipath_devdata *dd) | |||
| 997 | if ((r = pci_enable_device(dd->pcidev))) | 999 | if ((r = pci_enable_device(dd->pcidev))) |
| 998 | ipath_dev_err(dd, "pci_enable_device failed after " | 1000 | ipath_dev_err(dd, "pci_enable_device failed after " |
| 999 | "reset: %d\n", r); | 1001 | "reset: %d\n", r); |
| 1002 | /* whether it worked or not, mark as present, again */ | ||
| 1003 | dd->ipath_flags |= IPATH_PRESENT; | ||
| 1000 | val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_revision); | 1004 | val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_revision); |
| 1001 | if (val == dd->ipath_revision) { | 1005 | if (val == dd->ipath_revision) { |
| 1002 | ipath_cdbg(VERBOSE, "Got matching revision " | 1006 | ipath_cdbg(VERBOSE, "Got matching revision " |
