Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

watchdog: ziirave_wdt: Fix DOWNLOAD_START payload

Bootloader firmware expects the following traffic for DOWNLOAD_END:

S Addr Wr [A] 0x10 [A] P

using ziirave_firm_write_byte() will result in

S Addr Wr [A] 0x10 [A] 0x01 [A] 0x01 [A] P

which happens to work because firmware will ignore any extra bytes
sent. Fix this by converting the code to use i2c_smbus_write_byte()
instead.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: Rick Ramstetter <rick@anteaterllc.com>
Cc: linux-watchdog@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20190812200906.31344-21-andrew.smirnov@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>

authored by

Andrey Smirnov and committed by
Wim Van Sebroeck
fa0d2f44 fe05178c

+7 -8
+7 -8
drivers/watchdog/ziirave_wdt.c
··· 217 217 return ret; 218 218 } 219 219 220 - static int ziirave_firm_write_byte(struct watchdog_device *wdd, u8 command, 221 - u8 byte, bool wait_for_ack) 222 - { 223 - return ziirave_firm_write_block_data(wdd, command, 1, &byte, 224 - wait_for_ack); 225 - } 226 - 227 220 static bool ziirave_firm_addr_readonly(u32 addr) 228 221 { 229 222 return addr < ZIIRAVE_FIRM_FLASH_MEMORY_START || ··· 368 375 369 376 msleep(500); 370 377 371 - ret = ziirave_firm_write_byte(wdd, ZIIRAVE_CMD_DOWNLOAD_START, 1, true); 378 + ret = i2c_smbus_write_byte(client, ZIIRAVE_CMD_DOWNLOAD_START); 372 379 if (ret) { 373 380 dev_err(&client->dev, "Failed to start download\n"); 381 + return ret; 382 + } 383 + 384 + ret = ziirave_firm_read_ack(wdd); 385 + if (ret) { 386 + dev_err(&client->dev, "No ACK for start download\n"); 374 387 return ret; 375 388 } 376 389