int escore_slim_write(struct escore_priv *escore, const void *buf, int len) { int retry = MAX_SMB_TRIALS; int rc; int wr; struct slim_device *sbdev = escore->gen0_client; struct slim_ele_access msg = { .start_offset = ES_WRITE_VE_OFFSET, .num_bytes = ES_WRITE_VE_WIDTH, .comp = NULL, }; BUG_ON(len < 0); rc = wr = 0; while (wr < len) { int sz = min(len - wr, ES_WRITE_VE_WIDTH); /* As long as the caller expects the most significant * bytes of the VE value written to be zero, this is * valid. */ if (sz < ES_WRITE_VE_WIDTH) dev_dbg(&sbdev->dev, "write smaller than VE size %d < %d\n", sz, ES_WRITE_VE_WIDTH); rc = slim_get_logical_addr(sbdev, escore->gen0_client->e_addr, 6, &(escore->gen0_client->laddr)); if (rc) dev_err(&sbdev->dev, "%s(): get logical addr err %d\n", __func__, rc); do { rc = slim_change_val_element(sbdev, &msg, buf + wr, sz); if (rc != 0) dev_warn(&sbdev->dev, "%s: Warnning write failed rc=%d\n", __func__, rc); else break; usleep_range(SMB_DELAY, SMB_DELAY); } while (--retry); if (rc != 0) { dev_err(&sbdev->dev, "%s: Error write failed rc=%d after %d retries\n", __func__, rc, MAX_SMB_TRIALS); break; } wr += sz; } return rc; }
static int es705_slim_write(struct es705_priv *es705, const void *buf, int len) { struct slim_device *sbdev = es705->gen0_client; int rc = 0; int wr = 0; struct slim_ele_access msg = { .start_offset = ES705_WRITE_VE_OFFSET, .num_bytes = ES705_WRITE_VE_WIDTH, .comp = NULL, }; BUG_ON(len < 0); while (wr < len) { int i; int sz = min(len - wr, ES705_WRITE_VE_WIDTH); /* * As long as the caller expects the most significant * bytes of the VE value written to be zero, this is * valid. */ for (i = 0; i < MAX_SMB_TRIALS; i++) { if (sz < ES705_WRITE_VE_WIDTH) dev_dbg(&sbdev->dev, "%s(): write smaller than VE size %d < %d\n", __func__, sz, ES705_WRITE_VE_WIDTH); rc = slim_change_val_element(sbdev, &msg, (char *)buf + wr, sz); if (!rc) break; usleep_range(SMB_DELAY, SMB_DELAY); } if (i == MAX_SMB_TRIALS) { dev_err(&sbdev->dev, "%s(): reach MAX_TRIALS (%d)\n", __func__, MAX_SMB_TRIALS); break; } wr += sz; } return rc; }