static int i2c_transfer(I2cOps *me, I2cSeg *segments, int seg_count) { CrosECTunnelI2c *bus = container_of(me, CrosECTunnelI2c, ops); int request_len; int response_len; int result; request_len = ec_i2c_count_message(segments, seg_count); response_len = ec_i2c_count_response(segments, seg_count); if (request_len > ARRAY_SIZE(bus->request_buf) || response_len > ARRAY_SIZE(bus->response_buf)) { printf("%s: Request or response too large (%d/%d).\n", __func__, request_len, response_len); return -1; } ec_i2c_construct_message(bus->request_buf, segments, seg_count, bus->remote_bus); result = ec_command(bus->ec, EC_CMD_I2C_PASSTHRU, 0, bus->request_buf, request_len, bus->response_buf, response_len); if (result < response_len) { printf("%s: ec_command error %d<%d.\n", __func__, result, response_len); return result; } result = ec_i2c_parse_response(bus->response_buf, segments, seg_count); if (result != 0) return result; return 0; }
static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[], int num) { struct ec_i2c_device *bus = adap->algo_data; struct device *dev = bus->dev; const u16 bus_num = bus->remote_bus; int request_len; int response_len; u8 *request = NULL; u8 *response = NULL; int result; request_len = ec_i2c_count_message(i2c_msgs, num); if (request_len < 0) { dev_warn(dev, "Error constructing message %d\n", request_len); result = request_len; goto exit; } response_len = ec_i2c_count_response(i2c_msgs, num); if (response_len < 0) { /* Unexpected; no errors should come when NULL response */ dev_warn(dev, "Error preparing response %d\n", response_len); result = response_len; goto exit; } if (request_len <= ARRAY_SIZE(bus->request_buf)) { request = bus->request_buf; } else { request = kzalloc(request_len, GFP_KERNEL); if (request == NULL) { result = -ENOMEM; goto exit; } } if (response_len <= ARRAY_SIZE(bus->response_buf)) { response = bus->response_buf; } else { response = kzalloc(response_len, GFP_KERNEL); if (response == NULL) { result = -ENOMEM; goto exit; } } ec_i2c_construct_message(request, i2c_msgs, num, bus_num); result = bus->ec->command_sendrecv(bus->ec, EC_CMD_I2C_PASSTHRU, request, request_len, response, response_len); if (result) goto exit; result = ec_i2c_parse_response(response, i2c_msgs, &num); if (result < 0) goto exit; /* Indicate success by saying how many messages were sent */ result = num; exit: if (request != bus->request_buf) kfree(request); if (response != bus->response_buf) kfree(response); return result; }