diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_driver.c | 18 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_file_ops.c | 11 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_init_chip.c | 7 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_intr.c | 8 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 17 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_stats.c | 11 |
6 files changed, 46 insertions, 26 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index 5a5fbdf66ac..7c69090f6bd 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
@@ -1104,13 +1104,14 @@ static void ipath_rcv_hdrerr(struct ipath_devdata *dd, | |||
1104 | 1104 | ||
1105 | /* | 1105 | /* |
1106 | * ipath_kreceive - receive a packet | 1106 | * ipath_kreceive - receive a packet |
1107 | * @dd: the infinipath device | 1107 | * @pd: the infinipath port |
1108 | * | 1108 | * |
1109 | * called from interrupt handler for errors or receive interrupt | 1109 | * called from interrupt handler for errors or receive interrupt |
1110 | */ | 1110 | */ |
1111 | void ipath_kreceive(struct ipath_devdata *dd) | 1111 | void ipath_kreceive(struct ipath_portdata *pd) |
1112 | { | 1112 | { |
1113 | u64 *rc; | 1113 | u64 *rc; |
1114 | struct ipath_devdata *dd = pd->port_dd; | ||
1114 | void *ebuf; | 1115 | void *ebuf; |
1115 | const u32 rsize = dd->ipath_rcvhdrentsize; /* words */ | 1116 | const u32 rsize = dd->ipath_rcvhdrentsize; /* words */ |
1116 | const u32 maxcnt = dd->ipath_rcvhdrcnt * rsize; /* words */ | 1117 | const u32 maxcnt = dd->ipath_rcvhdrcnt * rsize; /* words */ |
@@ -1125,8 +1126,8 @@ void ipath_kreceive(struct ipath_devdata *dd) | |||
1125 | goto bail; | 1126 | goto bail; |
1126 | } | 1127 | } |
1127 | 1128 | ||
1128 | l = dd->ipath_port0head; | 1129 | l = pd->port_head; |
1129 | hdrqtail = (u32) le64_to_cpu(*dd->ipath_hdrqtailptr); | 1130 | hdrqtail = ipath_get_rcvhdrtail(pd); |
1130 | if (l == hdrqtail) | 1131 | if (l == hdrqtail) |
1131 | goto bail; | 1132 | goto bail; |
1132 | 1133 | ||
@@ -1135,7 +1136,7 @@ reloop: | |||
1135 | u32 qp; | 1136 | u32 qp; |
1136 | u8 *bthbytes; | 1137 | u8 *bthbytes; |
1137 | 1138 | ||
1138 | rc = (u64 *) (dd->ipath_pd[0]->port_rcvhdrq + (l << 2)); | 1139 | rc = (u64 *) (pd->port_rcvhdrq + (l << 2)); |
1139 | hdr = (struct ipath_message_header *)&rc[1]; | 1140 | hdr = (struct ipath_message_header *)&rc[1]; |
1140 | /* | 1141 | /* |
1141 | * could make a network order version of IPATH_KD_QP, and | 1142 | * could make a network order version of IPATH_KD_QP, and |
@@ -1245,7 +1246,7 @@ reloop: | |||
1245 | * earlier packets, we "almost" guarantee we have covered | 1246 | * earlier packets, we "almost" guarantee we have covered |
1246 | * that case. | 1247 | * that case. |
1247 | */ | 1248 | */ |
1248 | u32 hqtail = (u32)le64_to_cpu(*dd->ipath_hdrqtailptr); | 1249 | u32 hqtail = ipath_get_rcvhdrtail(pd); |
1249 | if (hqtail != hdrqtail) { | 1250 | if (hqtail != hdrqtail) { |
1250 | hdrqtail = hqtail; | 1251 | hdrqtail = hqtail; |
1251 | reloop = 1; /* loop 1 extra time at most */ | 1252 | reloop = 1; /* loop 1 extra time at most */ |
@@ -1255,7 +1256,7 @@ reloop: | |||
1255 | 1256 | ||
1256 | pkttot += i; | 1257 | pkttot += i; |
1257 | 1258 | ||
1258 | dd->ipath_port0head = l; | 1259 | pd->port_head = l; |
1259 | 1260 | ||
1260 | if (pkttot > ipath_stats.sps_maxpkts_call) | 1261 | if (pkttot > ipath_stats.sps_maxpkts_call) |
1261 | ipath_stats.sps_maxpkts_call = pkttot; | 1262 | ipath_stats.sps_maxpkts_call = pkttot; |
@@ -1605,7 +1606,8 @@ int ipath_create_rcvhdrq(struct ipath_devdata *dd, | |||
1605 | 1606 | ||
1606 | /* clear for security and sanity on each use */ | 1607 | /* clear for security and sanity on each use */ |
1607 | memset(pd->port_rcvhdrq, 0, pd->port_rcvhdrq_size); | 1608 | memset(pd->port_rcvhdrq, 0, pd->port_rcvhdrq_size); |
1608 | memset(pd->port_rcvhdrtail_kvaddr, 0, PAGE_SIZE); | 1609 | if (pd->port_rcvhdrtail_kvaddr) |
1610 | memset(pd->port_rcvhdrtail_kvaddr, 0, PAGE_SIZE); | ||
1609 | 1611 | ||
1610 | /* | 1612 | /* |
1611 | * tell chip each time we init it, even if we are re-using previous | 1613 | * tell chip each time we init it, even if we are re-using previous |
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c index e7fbb31a48a..4277014d6f8 100644 --- a/drivers/infiniband/hw/ipath/ipath_file_ops.c +++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c | |||
@@ -742,7 +742,8 @@ static int ipath_manage_rcvq(struct ipath_portdata *pd, unsigned subport, | |||
742 | * updated and correct itself, even in the face of software | 742 | * updated and correct itself, even in the face of software |
743 | * bugs. | 743 | * bugs. |
744 | */ | 744 | */ |
745 | *(volatile u64 *)pd->port_rcvhdrtail_kvaddr = 0; | 745 | if (pd->port_rcvhdrtail_kvaddr) |
746 | ipath_clear_rcvhdrtail(pd); | ||
746 | set_bit(INFINIPATH_R_PORTENABLE_SHIFT + pd->port_port, | 747 | set_bit(INFINIPATH_R_PORTENABLE_SHIFT + pd->port_port, |
747 | &dd->ipath_rcvctrl); | 748 | &dd->ipath_rcvctrl); |
748 | } else | 749 | } else |
@@ -1391,7 +1392,10 @@ static unsigned int ipath_poll_next(struct ipath_portdata *pd, | |||
1391 | pollflag = ipath_poll_hdrqfull(pd); | 1392 | pollflag = ipath_poll_hdrqfull(pd); |
1392 | 1393 | ||
1393 | head = ipath_read_ureg32(dd, ur_rcvhdrhead, pd->port_port); | 1394 | head = ipath_read_ureg32(dd, ur_rcvhdrhead, pd->port_port); |
1394 | tail = *(volatile u64 *)pd->port_rcvhdrtail_kvaddr; | 1395 | if (pd->port_rcvhdrtail_kvaddr) |
1396 | tail = ipath_get_rcvhdrtail(pd); | ||
1397 | else | ||
1398 | tail = ipath_read_ureg32(dd, ur_rcvhdrtail, pd->port_port); | ||
1395 | 1399 | ||
1396 | if (head != tail) | 1400 | if (head != tail) |
1397 | pollflag |= POLLIN | POLLRDNORM; | 1401 | pollflag |= POLLIN | POLLRDNORM; |
@@ -1932,7 +1936,8 @@ static int ipath_do_user_init(struct file *fp, | |||
1932 | * We explictly set the in-memory copy to 0 beforehand, so we don't | 1936 | * We explictly set the in-memory copy to 0 beforehand, so we don't |
1933 | * have to wait to be sure the DMA update has happened. | 1937 | * have to wait to be sure the DMA update has happened. |
1934 | */ | 1938 | */ |
1935 | *(volatile u64 *)pd->port_rcvhdrtail_kvaddr = 0ULL; | 1939 | if (pd->port_rcvhdrtail_kvaddr) |
1940 | ipath_clear_rcvhdrtail(pd); | ||
1936 | set_bit(INFINIPATH_R_PORTENABLE_SHIFT + pd->port_port, | 1941 | set_bit(INFINIPATH_R_PORTENABLE_SHIFT + pd->port_port, |
1937 | &dd->ipath_rcvctrl); | 1942 | &dd->ipath_rcvctrl); |
1938 | ipath_write_kreg(dd, dd->ipath_kregs->kr_rcvctrl, | 1943 | ipath_write_kreg(dd, dd->ipath_kregs->kr_rcvctrl, |
diff --git a/drivers/infiniband/hw/ipath/ipath_init_chip.c b/drivers/infiniband/hw/ipath/ipath_init_chip.c index 1c65ab907a3..e161cad21a1 100644 --- a/drivers/infiniband/hw/ipath/ipath_init_chip.c +++ b/drivers/infiniband/hw/ipath/ipath_init_chip.c | |||
@@ -526,12 +526,11 @@ static void enable_chip(struct ipath_devdata *dd, | |||
526 | */ | 526 | */ |
527 | val = ipath_read_ureg32(dd, ur_rcvegrindextail, 0); | 527 | val = ipath_read_ureg32(dd, ur_rcvegrindextail, 0); |
528 | (void)ipath_write_ureg(dd, ur_rcvegrindexhead, val, 0); | 528 | (void)ipath_write_ureg(dd, ur_rcvegrindexhead, val, 0); |
529 | dd->ipath_port0head = ipath_read_ureg32(dd, ur_rcvhdrtail, 0); | ||
530 | 529 | ||
531 | /* Initialize so we interrupt on next packet received */ | 530 | /* Initialize so we interrupt on next packet received */ |
532 | (void)ipath_write_ureg(dd, ur_rcvhdrhead, | 531 | (void)ipath_write_ureg(dd, ur_rcvhdrhead, |
533 | dd->ipath_rhdrhead_intr_off | | 532 | dd->ipath_rhdrhead_intr_off | |
534 | dd->ipath_port0head, 0); | 533 | dd->ipath_pd[0]->port_head, 0); |
535 | 534 | ||
536 | /* | 535 | /* |
537 | * by now pioavail updates to memory should have occurred, so | 536 | * by now pioavail updates to memory should have occurred, so |
@@ -693,7 +692,7 @@ done: | |||
693 | */ | 692 | */ |
694 | int ipath_init_chip(struct ipath_devdata *dd, int reinit) | 693 | int ipath_init_chip(struct ipath_devdata *dd, int reinit) |
695 | { | 694 | { |
696 | int ret = 0, i; | 695 | int ret = 0; |
697 | u32 val32, kpiobufs; | 696 | u32 val32, kpiobufs; |
698 | u32 piobufs, uports; | 697 | u32 piobufs, uports; |
699 | u64 val; | 698 | u64 val; |
@@ -750,7 +749,7 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) | |||
750 | kpiobufs = ipath_kpiobufs; | 749 | kpiobufs = ipath_kpiobufs; |
751 | 750 | ||
752 | if (kpiobufs + (uports * IPATH_MIN_USER_PORT_BUFCNT) > piobufs) { | 751 | if (kpiobufs + (uports * IPATH_MIN_USER_PORT_BUFCNT) > piobufs) { |
753 | i = (int) piobufs - | 752 | int i = (int) piobufs - |
754 | (int) (uports * IPATH_MIN_USER_PORT_BUFCNT); | 753 | (int) (uports * IPATH_MIN_USER_PORT_BUFCNT); |
755 | if (i < 0) | 754 | if (i < 0) |
756 | i = 0; | 755 | i = 0; |
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c index 4795cb895f8..ec18b9b1bb0 100644 --- a/drivers/infiniband/hw/ipath/ipath_intr.c +++ b/drivers/infiniband/hw/ipath/ipath_intr.c | |||
@@ -683,7 +683,7 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs) | |||
683 | for (i = 0; i < dd->ipath_cfgports; i++) { | 683 | for (i = 0; i < dd->ipath_cfgports; i++) { |
684 | struct ipath_portdata *pd = dd->ipath_pd[i]; | 684 | struct ipath_portdata *pd = dd->ipath_pd[i]; |
685 | if (i == 0) { | 685 | if (i == 0) { |
686 | hd = dd->ipath_port0head; | 686 | hd = pd->port_head; |
687 | tl = (u32) le64_to_cpu( | 687 | tl = (u32) le64_to_cpu( |
688 | *dd->ipath_hdrqtailptr); | 688 | *dd->ipath_hdrqtailptr); |
689 | } else if (pd && pd->port_cnt && | 689 | } else if (pd && pd->port_cnt && |
@@ -712,6 +712,8 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs) | |||
712 | } | 712 | } |
713 | } | 713 | } |
714 | if (errs & INFINIPATH_E_RRCVEGRFULL) { | 714 | if (errs & INFINIPATH_E_RRCVEGRFULL) { |
715 | struct ipath_portdata *pd = dd->ipath_pd[0]; | ||
716 | |||
715 | /* | 717 | /* |
716 | * since this is of less importance and not likely to | 718 | * since this is of less importance and not likely to |
717 | * happen without also getting hdrfull, only count | 719 | * happen without also getting hdrfull, only count |
@@ -719,7 +721,7 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs) | |||
719 | * vs user) | 721 | * vs user) |
720 | */ | 722 | */ |
721 | ipath_stats.sps_etidfull++; | 723 | ipath_stats.sps_etidfull++; |
722 | if (dd->ipath_port0head != | 724 | if (pd->port_head != |
723 | (u32) le64_to_cpu(*dd->ipath_hdrqtailptr)) | 725 | (u32) le64_to_cpu(*dd->ipath_hdrqtailptr)) |
724 | chkerrpkts = 1; | 726 | chkerrpkts = 1; |
725 | } | 727 | } |
@@ -1173,7 +1175,7 @@ irqreturn_t ipath_intr(int irq, void *data) | |||
1173 | * for receive are at the bottom. | 1175 | * for receive are at the bottom. |
1174 | */ | 1176 | */ |
1175 | if (chk0rcv) { | 1177 | if (chk0rcv) { |
1176 | ipath_kreceive(dd); | 1178 | ipath_kreceive(dd->ipath_pd[0]); |
1177 | istat &= ~port0rbits; | 1179 | istat &= ~port0rbits; |
1178 | } | 1180 | } |
1179 | 1181 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 81759c2031f..72252349eaa 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
@@ -167,6 +167,8 @@ struct ipath_portdata { | |||
167 | u32 active_slaves; | 167 | u32 active_slaves; |
168 | /* Type of packets or conditions we want to poll for */ | 168 | /* Type of packets or conditions we want to poll for */ |
169 | u16 poll_type; | 169 | u16 poll_type; |
170 | /* port rcvhdrq head offset */ | ||
171 | u32 port_head; | ||
170 | }; | 172 | }; |
171 | 173 | ||
172 | struct sk_buff; | 174 | struct sk_buff; |
@@ -314,8 +316,6 @@ struct ipath_devdata { | |||
314 | * supports, less gives more pio bufs/port, etc. | 316 | * supports, less gives more pio bufs/port, etc. |
315 | */ | 317 | */ |
316 | u32 ipath_cfgports; | 318 | u32 ipath_cfgports; |
317 | /* port0 rcvhdrq head offset */ | ||
318 | u32 ipath_port0head; | ||
319 | /* count of port 0 hdrqfull errors */ | 319 | /* count of port 0 hdrqfull errors */ |
320 | u32 ipath_p0_hdrqfull; | 320 | u32 ipath_p0_hdrqfull; |
321 | 321 | ||
@@ -690,7 +690,7 @@ void ipath_free_pddata(struct ipath_devdata *, struct ipath_portdata *); | |||
690 | 690 | ||
691 | int ipath_parse_ushort(const char *str, unsigned short *valp); | 691 | int ipath_parse_ushort(const char *str, unsigned short *valp); |
692 | 692 | ||
693 | void ipath_kreceive(struct ipath_devdata *); | 693 | void ipath_kreceive(struct ipath_portdata *); |
694 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); | 694 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); |
695 | int ipath_reset_device(int); | 695 | int ipath_reset_device(int); |
696 | void ipath_get_faststats(unsigned long); | 696 | void ipath_get_faststats(unsigned long); |
@@ -928,6 +928,17 @@ static inline u32 ipath_read_creg32(const struct ipath_devdata *dd, | |||
928 | (char __iomem *)dd->ipath_kregbase)); | 928 | (char __iomem *)dd->ipath_kregbase)); |
929 | } | 929 | } |
930 | 930 | ||
931 | static inline void ipath_clear_rcvhdrtail(const struct ipath_portdata *pd) | ||
932 | { | ||
933 | *((u64 *) pd->port_rcvhdrtail_kvaddr) = 0ULL; | ||
934 | } | ||
935 | |||
936 | static inline u32 ipath_get_rcvhdrtail(const struct ipath_portdata *pd) | ||
937 | { | ||
938 | return (u32) le64_to_cpu(*((volatile __le64 *) | ||
939 | pd->port_rcvhdrtail_kvaddr)); | ||
940 | } | ||
941 | |||
931 | /* | 942 | /* |
932 | * sysfs interface. | 943 | * sysfs interface. |
933 | */ | 944 | */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_stats.c b/drivers/infiniband/hw/ipath/ipath_stats.c index f0271415cd5..fd897652da6 100644 --- a/drivers/infiniband/hw/ipath/ipath_stats.c +++ b/drivers/infiniband/hw/ipath/ipath_stats.c | |||
@@ -133,15 +133,16 @@ bail: | |||
133 | static void ipath_qcheck(struct ipath_devdata *dd) | 133 | static void ipath_qcheck(struct ipath_devdata *dd) |
134 | { | 134 | { |
135 | static u64 last_tot_hdrqfull; | 135 | static u64 last_tot_hdrqfull; |
136 | struct ipath_portdata *pd = dd->ipath_pd[0]; | ||
136 | size_t blen = 0; | 137 | size_t blen = 0; |
137 | char buf[128]; | 138 | char buf[128]; |
138 | 139 | ||
139 | *buf = 0; | 140 | *buf = 0; |
140 | if (dd->ipath_pd[0]->port_hdrqfull != dd->ipath_p0_hdrqfull) { | 141 | if (pd->port_hdrqfull != dd->ipath_p0_hdrqfull) { |
141 | blen = snprintf(buf, sizeof buf, "port 0 hdrqfull %u", | 142 | blen = snprintf(buf, sizeof buf, "port 0 hdrqfull %u", |
142 | dd->ipath_pd[0]->port_hdrqfull - | 143 | pd->port_hdrqfull - |
143 | dd->ipath_p0_hdrqfull); | 144 | dd->ipath_p0_hdrqfull); |
144 | dd->ipath_p0_hdrqfull = dd->ipath_pd[0]->port_hdrqfull; | 145 | dd->ipath_p0_hdrqfull = pd->port_hdrqfull; |
145 | } | 146 | } |
146 | if (ipath_stats.sps_etidfull != dd->ipath_last_tidfull) { | 147 | if (ipath_stats.sps_etidfull != dd->ipath_last_tidfull) { |
147 | blen += snprintf(buf + blen, sizeof buf - blen, | 148 | blen += snprintf(buf + blen, sizeof buf - blen, |
@@ -173,7 +174,7 @@ static void ipath_qcheck(struct ipath_devdata *dd) | |||
173 | if (blen) | 174 | if (blen) |
174 | ipath_dbg("%s\n", buf); | 175 | ipath_dbg("%s\n", buf); |
175 | 176 | ||
176 | if (dd->ipath_port0head != (u32) | 177 | if (pd->port_head != (u32) |
177 | le64_to_cpu(*dd->ipath_hdrqtailptr)) { | 178 | le64_to_cpu(*dd->ipath_hdrqtailptr)) { |
178 | if (dd->ipath_lastport0rcv_cnt == | 179 | if (dd->ipath_lastport0rcv_cnt == |
179 | ipath_stats.sps_port0pkts) { | 180 | ipath_stats.sps_port0pkts) { |
@@ -181,7 +182,7 @@ static void ipath_qcheck(struct ipath_devdata *dd) | |||
181 | "port0 hd=%llx tl=%x; port0pkts %llx\n", | 182 | "port0 hd=%llx tl=%x; port0pkts %llx\n", |
182 | (unsigned long long) | 183 | (unsigned long long) |
183 | le64_to_cpu(*dd->ipath_hdrqtailptr), | 184 | le64_to_cpu(*dd->ipath_hdrqtailptr), |
184 | dd->ipath_port0head, | 185 | pd->port_head, |
185 | (unsigned long long) | 186 | (unsigned long long) |
186 | ipath_stats.sps_port0pkts); | 187 | ipath_stats.sps_port0pkts); |
187 | } | 188 | } |