OSDN Git Service

can: xilinx_can: xcan_rx_fifo_get_next_frame(): fix FSR register FL and RI mask value...
authorAppana Durga Kedareswara rao <appana.durga.rao@xilinx.com>
Mon, 12 Aug 2019 10:06:45 +0000 (15:36 +0530)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 13 Aug 2019 15:32:19 +0000 (17:32 +0200)
For CANFD 2.0 IP configuration existing driver is using incorrect mask
values for FSR register FL and RI fields.

Fixes: c223da6 ("can: xilinx_can: Add support for CANFD FD frames")
Signed-off-by: Appana Durga Kedareswara rao <appana.durga.rao@xilinx.com>
Acked-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/xilinx_can.c

index a312fe3..f939f7a 100644 (file)
@@ -123,8 +123,10 @@ enum xcan_reg {
 #define XCAN_IDR_RTR_MASK              0x00000001 /* Remote TX request */
 #define XCAN_DLCR_DLC_MASK             0xF0000000 /* Data length code */
 #define XCAN_FSR_FL_MASK               0x00003F00 /* RX Fill Level */
+#define XCAN_2_FSR_FL_MASK             0x00007F00 /* RX Fill Level */
 #define XCAN_FSR_IRI_MASK              0x00000080 /* RX Increment Read Index */
 #define XCAN_FSR_RI_MASK               0x0000001F /* RX Read Index */
+#define XCAN_2_FSR_RI_MASK             0x0000003F /* RX Read Index */
 #define XCAN_DLCR_EDL_MASK             0x08000000 /* EDL Mask in DLC */
 #define XCAN_DLCR_BRS_MASK             0x04000000 /* BRS Mask in DLC */
 
@@ -1127,7 +1129,7 @@ static int xcan_rx_fifo_get_next_frame(struct xcan_priv *priv)
        int offset;
 
        if (priv->devtype.flags & XCAN_FLAG_RX_FIFO_MULTI) {
-               u32 fsr;
+               u32 fsr, mask;
 
                /* clear RXOK before the is-empty check so that any newly
                 * received frame will reassert it without a race
@@ -1137,12 +1139,17 @@ static int xcan_rx_fifo_get_next_frame(struct xcan_priv *priv)
                fsr = priv->read_reg(priv, XCAN_FSR_OFFSET);
 
                /* check if RX FIFO is empty */
-               if (!(fsr & XCAN_FSR_FL_MASK))
+               if (priv->devtype.flags & XCAN_FLAG_CANFD_2)
+                       mask = XCAN_2_FSR_FL_MASK;
+               else
+                       mask = XCAN_FSR_FL_MASK;
+
+               if (!(fsr & mask))
                        return -ENOENT;
 
                if (priv->devtype.flags & XCAN_FLAG_CANFD_2)
                        offset =
-                         XCAN_RXMSG_2_FRAME_OFFSET(fsr & XCAN_FSR_RI_MASK);
+                         XCAN_RXMSG_2_FRAME_OFFSET(fsr & XCAN_2_FSR_RI_MASK);
                else
                        offset =
                          XCAN_RXMSG_FRAME_OFFSET(fsr & XCAN_FSR_RI_MASK);