fw->cl.tx_block = true;
fw->chan = mbox_request_channel(&fw->cl, 0);
- if (IS_ERR(fw->chan))
- return dev_err_probe(dev, PTR_ERR(fw->chan),
- "Failed to get mbox channel\n");
+ if (IS_ERR(fw->chan)) {
+ int ret = PTR_ERR(fw->chan);
- if (ret != -EPROBE_DEFER)
- dev_err(dev, "Failed to get mbox channel: %d\n", ret);
+ kfree(fw);
- return ret;
++ return dev_err_probe(dev, ret, "Failed to get mbox channel\n");
+ }
init_completion(&fw->c);
kref_init(&fw->consumers);
cb->internal = !!(mode & MEI_CL_IO_TX_INTERNAL);
cb->blocking = !!(mode & MEI_CL_IO_TX_BLOCKING);
memcpy(cb->buf.data, buf, length);
+ /* hack we point data to header */
+ if (mode & MEI_CL_IO_SGL) {
+ cb->ext_hdr = (struct mei_ext_hdr *)cb->buf.data;
+ cb->buf.data = NULL;
+ cb->buf.size = 0;
+ }
- rets = mei_cl_write(cl, cb);
+ rets = mei_cl_write(cl, cb, timeout);
+ if (mode & MEI_CL_IO_SGL && rets == 0)
+ rets = length;
+
out:
mutex_unlock(&bus->device_lock);