mctp: serial: Fix starting value for frame check sequence
authorJeremy Kerr <jk@codeconstruct.com.au>
Fri, 16 Dec 2022 03:44:09 +0000 (11:44 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:32:56 +0000 (13:32 +0100)
[ Upstream commit 2856a62762c8409e360d4fd452194c8e57ba1058 ]

RFC1662 defines the start state for the crc16 FCS to be 0xffff, but
we're currently starting at zero.

This change uses the correct start state. We're only early in the
adoption for the serial binding, so there aren't yet any other users to
interface to.

Fixes: a0c2ccd9b5ad ("mctp: Add MCTP-over-serial transport binding")
Reported-by: Harsh Tyagi <harshtya@google.com>
Tested-by: Harsh Tyagi <harshtya@google.com>
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/mctp/mctp-serial.c

index 7cd103f..9f9eaf8 100644 (file)
@@ -35,6 +35,8 @@
 #define BYTE_FRAME             0x7e
 #define BYTE_ESC               0x7d
 
+#define FCS_INIT               0xffff
+
 static DEFINE_IDA(mctp_serial_ida);
 
 enum mctp_serial_state {
@@ -123,7 +125,7 @@ static void mctp_serial_tx_work(struct work_struct *work)
                buf[2] = dev->txlen;
 
                if (!dev->txpos)
-                       dev->txfcs = crc_ccitt(0, buf + 1, 2);
+                       dev->txfcs = crc_ccitt(FCS_INIT, buf + 1, 2);
 
                txlen = write_chunk(dev, buf + dev->txpos, 3 - dev->txpos);
                if (txlen <= 0) {
@@ -303,7 +305,7 @@ static void mctp_serial_push_header(struct mctp_serial *dev, unsigned char c)
        case 1:
                if (c == MCTP_SERIAL_VERSION) {
                        dev->rxpos++;
-                       dev->rxfcs = crc_ccitt_byte(0, c);
+                       dev->rxfcs = crc_ccitt_byte(FCS_INIT, c);
                } else {
                        dev->rxstate = STATE_ERR;
                }