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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'mvebu-fixes-5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu into arm/drivers

mvebu fixes for 5.13 (part 1)

Few fixes for the Turris Mox rWTM firmware found on the Armada 3700
SoCs.

* tag 'mvebu-fixes-5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu:
firmware: turris-mox-rwtm: show message about HWRNG registration
firmware: turris-mox-rwtm: fail probing when firmware does not support hwrng
firmware: turris-mox-rwtm: report failures better
firmware: turris-mox-rwtm: fix reply status decoding function

Link: https://lore.kernel.org/r/87eecx0w6s.fsf@BL-laptop
Signed-off-by: Olof Johansson <olof@lixom.net>

+47 -8
+47 -8
drivers/firmware/turris-mox-rwtm.c
··· 147 147 148 148 static int mox_get_status(enum mbox_cmd cmd, u32 retval) 149 149 { 150 - if (MBOX_STS_CMD(retval) != cmd || 151 - MBOX_STS_ERROR(retval) != MBOX_STS_SUCCESS) 150 + if (MBOX_STS_CMD(retval) != cmd) 152 151 return -EIO; 153 152 else if (MBOX_STS_ERROR(retval) == MBOX_STS_FAIL) 154 153 return -(int)MBOX_STS_VALUE(retval); 154 + else if (MBOX_STS_ERROR(retval) == MBOX_STS_BADCMD) 155 + return -ENOSYS; 156 + else if (MBOX_STS_ERROR(retval) != MBOX_STS_SUCCESS) 157 + return -EIO; 155 158 else 156 159 return MBOX_STS_VALUE(retval); 157 160 } ··· 204 201 return ret; 205 202 206 203 ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval); 207 - if (ret < 0 && ret != -ENODATA) { 208 - return ret; 209 - } else if (ret == -ENODATA) { 204 + if (ret == -ENODATA) { 210 205 dev_warn(rwtm->dev, 211 206 "Board does not have manufacturing information burned!\n"); 207 + } else if (ret == -ENOSYS) { 208 + dev_notice(rwtm->dev, 209 + "Firmware does not support the BOARD_INFO command\n"); 210 + } else if (ret < 0) { 211 + return ret; 212 212 } else { 213 213 rwtm->serial_number = reply->status[1]; 214 214 rwtm->serial_number <<= 32; ··· 240 234 return ret; 241 235 242 236 ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval); 243 - if (ret < 0 && ret != -ENODATA) { 244 - return ret; 245 - } else if (ret == -ENODATA) { 237 + if (ret == -ENODATA) { 246 238 dev_warn(rwtm->dev, "Board has no public key burned!\n"); 239 + } else if (ret == -ENOSYS) { 240 + dev_notice(rwtm->dev, 241 + "Firmware does not support the ECDSA_PUB_KEY command\n"); 242 + } else if (ret < 0) { 243 + return ret; 247 244 } else { 248 245 u32 *s = reply->status; 249 246 ··· 258 249 } 259 250 260 251 return 0; 252 + } 253 + 254 + static int check_get_random_support(struct mox_rwtm *rwtm) 255 + { 256 + struct armada_37xx_rwtm_tx_msg msg; 257 + int ret; 258 + 259 + msg.command = MBOX_CMD_GET_RANDOM; 260 + msg.args[0] = 1; 261 + msg.args[1] = rwtm->buf_phys; 262 + msg.args[2] = 4; 263 + 264 + ret = mbox_send_message(rwtm->mbox, &msg); 265 + if (ret < 0) 266 + return ret; 267 + 268 + ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); 269 + if (ret < 0) 270 + return ret; 271 + 272 + return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); 261 273 } 262 274 263 275 static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) ··· 518 488 if (ret < 0) 519 489 dev_warn(dev, "Cannot read board information: %i\n", ret); 520 490 491 + ret = check_get_random_support(rwtm); 492 + if (ret < 0) { 493 + dev_notice(dev, 494 + "Firmware does not support the GET_RANDOM command\n"); 495 + goto free_channel; 496 + } 497 + 521 498 rwtm->hwrng.name = DRIVER_NAME "_hwrng"; 522 499 rwtm->hwrng.read = mox_hwrng_read; 523 500 rwtm->hwrng.priv = (unsigned long) rwtm; ··· 541 504 dev_err(dev, "Failed creating debugfs entries: %i\n", ret); 542 505 goto free_channel; 543 506 } 507 + 508 + dev_info(dev, "HWRNG successfully registered\n"); 544 509 545 510 return 0; 546 511