IB/hfi1: Fix status error code for unsupported packets
authorJakub Pawlak <jakub.pawlak@intel.com>
Tue, 25 Oct 2016 20:12:17 +0000 (13:12 -0700)
committerDoug Ledford <dledford@redhat.com>
Tue, 15 Nov 2016 21:16:45 +0000 (16:16 -0500)
Set the status code BAD_L2 when unsupported type of packet
is received and dropped.

Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jakub Pawlak <jakub.pawlak@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/chip.h
drivers/infiniband/hw/hfi1/driver.c

index 92345259a8f47932faaa45ef16e314c9831fd428..043fd21dc5f3193828ce07da3fa20565c81f8bc0 100644 (file)
 /* DC_DC8051_CFG_MODE.GENERAL bits */
 #define DISABLE_SELF_GUID_CHECK 0x2
 
+/* Bad L2 frame error code */
+#define BAD_L2_ERR      0x6
+
 /*
  * Eager buffer minimum and maximum sizes supported by the hardware.
  * All power-of-two sizes in between are supported as well.
index 6563e4d38b80c141df9d9fd766d5eac9779eb914..dadd35eedc01aa9796c2beca8741eb29e39dc79d 100644 (file)
@@ -1360,12 +1360,25 @@ int process_receive_ib(struct hfi1_packet *packet)
 
 int process_receive_bypass(struct hfi1_packet *packet)
 {
+       struct hfi1_devdata *dd = packet->rcd->dd;
+
        if (unlikely(rhf_err_flags(packet->rhf)))
                handle_eflags(packet);
 
-       dd_dev_err(packet->rcd->dd,
+       dd_dev_err(dd,
                   "Bypass packets are not supported in normal operation. Dropping\n");
-       incr_cntr64(&packet->rcd->dd->sw_rcv_bypass_packet_errors);
+       incr_cntr64(&dd->sw_rcv_bypass_packet_errors);
+       if (!(dd->err_info_rcvport.status_and_code & OPA_EI_STATUS_SMASK)) {
+               u64 *flits = packet->ebuf;
+
+               if (flits && !(packet->rhf & RHF_LEN_ERR)) {
+                       dd->err_info_rcvport.packet_flit1 = flits[0];
+                       dd->err_info_rcvport.packet_flit2 =
+                               packet->tlen > sizeof(flits[0]) ? flits[1] : 0;
+               }
+               dd->err_info_rcvport.status_and_code |=
+                       (OPA_EI_STATUS_SMASK | BAD_L2_ERR);
+       }
        return RHF_RCV_CONTINUE;
 }