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; }
void escore_slim_get_logical_addr(struct escore_priv *escore) { do { slim_get_logical_addr(escore->gen0_client, escore->gen0_client->e_addr, 6, &(escore->gen0_client->laddr)); usleep_range(1000, 2000); } while (escore->gen0_client->laddr == 0xf0); dev_dbg(&escore->gen0_client->dev, "%s(): gen0_client LA = %d\n", __func__, escore->gen0_client->laddr); }
static int es705_fw_thread(void *priv) { struct es705_priv *es705 = (struct es705_priv *)priv; do { slim_get_logical_addr(es705->gen0_client, es705->gen0_client->e_addr, 6, &(es705->gen0_client->laddr)); usleep_range(1000, 2000); } while (es705->gen0_client->laddr == 0xf0); dev_dbg(&es705->gen0_client->dev, "%s(): gen0_client LA = %d\n", __func__, es705->gen0_client->laddr); do { slim_get_logical_addr(es705->intf_client, es705->intf_client->e_addr, 6, &(es705->intf_client->laddr)); usleep_range(1000, 2000); } while (es705->intf_client->laddr == 0xf0); dev_dbg(&es705->intf_client->dev, "%s(): intf_client LA = %d\n", __func__, es705->intf_client->laddr); es705_slim_device_up(es705->gen0_client); return 0; }
int escore_slim_read(struct escore_priv *escore, void *buf, int len) { int retry = MAX_SMB_TRIALS; int rc; struct slim_device *sbdev = escore->gen0_client; DECLARE_COMPLETION_ONSTACK(read_done); struct slim_ele_access msg = { .start_offset = ES_READ_VE_OFFSET, .num_bytes = ES_READ_VE_WIDTH, .comp = NULL, }; 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_request_val_element(sbdev, &msg, buf, len); if (rc != 0) dev_warn(&sbdev->dev, "%s: Warnning read 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 read failed rc=%d after %d retries\n", __func__, rc, MAX_SMB_TRIALS); return rc; }