* Validate that the driver implements all of the callbacks
* so that we don't have to every time we make them.
*/
- if ((!driver->alloc_gbuf_data) ||
+ if ((!driver->buffer_alloc) ||
(!driver->free_gbuf_data) ||
(!driver->submit_svc) ||
(!driver->submit_gbuf) ||
static void cport_out_callback(struct urb *urb);
/*
- * Allocate the actual buffer for this gbuf and device and cport
- *
- * We are responsible for setting the following fields in a struct gbuf:
- * void *hcpriv;
- * void *transfer_buffer;
- * u32 transfer_buffer_length;
+ * Allocate a buffer to be sent via UniPro.
*/
-static int alloc_gbuf_data(struct gbuf *gbuf, unsigned int size,
- gfp_t gfp_mask)
+static void *buffer_alloc(unsigned int size, gfp_t gfp_mask)
{
u8 *buffer;
- if (gbuf->transfer_buffer)
- return -EALREADY;
-
if (size > ES1_GBUF_MSG_SIZE) {
pr_err("guf was asked to be bigger than %ld!\n",
ES1_GBUF_MSG_SIZE);
* XXX Do we need to indicate the destination device id too?
*/
buffer = kzalloc(GB_BUFFER_ALIGN + size, gfp_mask);
- if (!buffer)
- return -ENOMEM;
- buffer += GB_BUFFER_ALIGN;
+ if (buffer)
+ buffer += GB_BUFFER_ALIGN;
- gbuf->transfer_buffer = buffer;
- gbuf->transfer_buffer_length = size;
-
- return 0;
+ return buffer;
}
/* Free the memory we allocated with a gbuf */
static struct greybus_host_driver es1_driver = {
.hd_priv_size = sizeof(struct es1_ap_dev),
- .alloc_gbuf_data = alloc_gbuf_data,
+ .buffer_alloc = buffer_alloc,
.free_gbuf_data = free_gbuf_data,
.submit_svc = submit_svc,
.submit_gbuf = submit_gbuf,
struct greybus_host_driver {
size_t hd_priv_size;
- int (*alloc_gbuf_data)(struct gbuf *gbuf, unsigned int size,
- gfp_t gfp_mask);
+ void *(*buffer_alloc)(unsigned int size, gfp_t gfp_mask);
void (*free_gbuf_data)(struct gbuf *gbuf);
int (*submit_svc)(struct svc_msg *svc_msg,
struct greybus_host_device *hd);
struct gbuf *gbuf;
gfp_t gfp_flags = request && !outbound ? GFP_ATOMIC : GFP_KERNEL;
u16 dest_cport_id;
- int ret;
if (size > GB_OPERATION_MESSAGE_SIZE_MAX)
return -E2BIG;
else
dest_cport_id = CPORT_ID_BAD;
- ret = hd->driver->alloc_gbuf_data(gbuf, size, gfp_flags);
- if (ret)
- return ret;
+ gbuf->transfer_buffer = hd->driver->buffer_alloc(size, gfp_flags);
+ if (!gbuf->transfer_buffer)
+ return -ENOMEM;
+ gbuf->transfer_buffer_length = size;
gbuf->hd = hd;
gbuf->dest_cport_id = dest_cport_id;
gbuf->status = -EBADR; /* Initial value--means "never set" */