On Thu, 3 Sep 2020 17:05:34 -0700 Shannon Nelson wrote: > + devlink_flash_update_status_notify(dl, "Downloading", NULL, 0, > fw->size); > + offset = 0; > + next_interval = fw->size / IONIC_FW_INTERVAL_FRACTION; > + while (offset < fw->size) { > + copy_sz = min_t(unsigned int, buf_sz, fw->size - offset); > + mutex_lock(&ionic->dev_cmd_lock); > + memcpy_toio(&idev->dev_cmd_regs->data, fw->data + offset, > copy_sz); > + ionic_dev_cmd_firmware_download(idev, > + offsetof(union > ionic_dev_cmd_regs, data), > + offset, copy_sz); > + err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT); > + mutex_unlock(&ionic->dev_cmd_lock); > + if (err) { > + netdev_err(netdev, > + "download failed offset 0x%x addr 0x%lx len > 0x%x\n", > + offset, offsetof(union ionic_dev_cmd_regs, > data), > + copy_sz); > + NL_SET_ERR_MSG_MOD(extack, "Segment download failed"); > + goto err_out; > + } > + offset += copy_sz; > + > + if (offset > next_interval) { > + devlink_flash_update_status_notify(dl, "Downloading", > + NULL, offset, > fw->size); > + next_interval = offset + (fw->size / > IONIC_FW_INTERVAL_FRACTION); > + } > + } > + devlink_flash_update_status_notify(dl, "Downloading", NULL, 1, 1);
This is quite awkward. You send a notification with a different size, and potentially an unnecessary one if last iteration of the loop triggered offset > next_interval. Please just add || offset == fw->size to the condition at the end of the loop and it will always trigger, with the correct length.