Commit 80e04f09 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

greybus: gbuf recieve path work, not done, dinner time...

parent ee6fb799
...@@ -252,13 +252,6 @@ int gb_new_ap_msg(u8 *data, int size, struct greybus_host_device *hd) ...@@ -252,13 +252,6 @@ int gb_new_ap_msg(u8 *data, int size, struct greybus_host_device *hd)
} }
EXPORT_SYMBOL_GPL(gb_new_ap_msg); EXPORT_SYMBOL_GPL(gb_new_ap_msg);
void greybus_cport_in_data(struct greybus_host_device *hd, int cport, u8 *data,
size_t length)
{
// FIXME - implement...
}
EXPORT_SYMBOL_GPL(greybus_cport_in_data);
int gb_thread_init(void) int gb_thread_init(void)
{ {
ap_workqueue = alloc_workqueue("greybus_ap", 0, 1); ap_workqueue = alloc_workqueue("greybus_ap", 0, 1);
......
...@@ -18,6 +18,31 @@ ...@@ -18,6 +18,31 @@
#include "greybus.h" #include "greybus.h"
static struct gbuf *__alloc_gbuf(struct greybus_device *gdev,
struct gdev_cport *cport,
gbuf_complete_t complete,
gfp_t gfp_mask,
void *context)
{
struct gbuf *gbuf;
/*
* change this to a slab allocation if it's too slow, but for now, let's
* be dumb and simple.
*/
gbuf = kzalloc(sizeof(*gbuf), gfp_mask);
if (!gbuf)
return NULL;
kref_init(&gbuf->kref);
gbuf->gdev = gdev;
gbuf->cport = cport;
gbuf->complete = complete;
gbuf->context = context;
return gbuf;
}
/** /**
* greybus_alloc_gbuf - allocate a greybus buffer * greybus_alloc_gbuf - allocate a greybus buffer
* *
...@@ -43,20 +68,10 @@ struct gbuf *greybus_alloc_gbuf(struct greybus_device *gdev, ...@@ -43,20 +68,10 @@ struct gbuf *greybus_alloc_gbuf(struct greybus_device *gdev,
struct gbuf *gbuf; struct gbuf *gbuf;
int retval; int retval;
/* gbuf = __alloc_gbuf(gdev, cport, complete, gfp_mask, context);
* change this to a slab allocation if it's too slow, but for now, let's
* be dumb and simple.
*/
gbuf = kzalloc(sizeof(*gbuf), gfp_mask);
if (!gbuf) if (!gbuf)
return NULL; return NULL;
kref_init(&gbuf->kref);
gbuf->gdev = gdev;
gbuf->cport = cport;
gbuf->complete = complete;
gbuf->context = context;
/* Host controller specific allocation for the actual buffer */ /* Host controller specific allocation for the actual buffer */
retval = gbuf->gdev->hd->driver->alloc_gbuf(gbuf, size, gfp_mask); retval = gbuf->gdev->hd->driver->alloc_gbuf(gbuf, size, gfp_mask);
if (retval) { if (retval) {
...@@ -114,3 +129,71 @@ void greybus_gbuf_finished(struct gbuf *gbuf) ...@@ -114,3 +129,71 @@ void greybus_gbuf_finished(struct gbuf *gbuf)
// FIXME - implement // FIXME - implement
} }
EXPORT_SYMBOL_GPL(greybus_gbuf_finished); EXPORT_SYMBOL_GPL(greybus_gbuf_finished);
#define MAX_CPORTS 1024
struct gb_cport_handler {
gbuf_complete_t handler;
struct gdev_cport cport;
struct greybus_device *gdev;
void *context;
};
static struct gb_cport_handler cport_handler[MAX_CPORTS];
// FIXME - use a lock for this list of handlers, but really, for now we don't
// need it, we don't have a dynamic system...
int gb_register_cport_complete(struct greybus_device *gdev,
gbuf_complete_t handler, int cport,
void *context)
{
if (cport_handler[cport].handler)
return -EINVAL;
cport_handler[cport].context = context;
cport_handler[cport].gdev = gdev;
cport_handler[cport].cport.number = cport;
cport_handler[cport].handler = handler;
return 0;
}
void gb_deregister_cport_handler(int cport)
{
cport_handler[cport].handler = NULL;
}
void greybus_cport_in_data(struct greybus_host_device *hd, int cport, u8 *data,
size_t length)
{
struct gb_cport_handler *ch;
struct gbuf *gbuf;
/* first check to see if we have a cport handler for this cport */
ch = &cport_handler[cport];
if (!ch->handler) {
/* Ugh, drop the data on the floor, after logging it... */
dev_err(&hd->dev,
"Received data for cport %d, but no handler!\n",
cport);
return;
}
gbuf = __alloc_gbuf(ch->gdev, &ch->cport, ch->handler, GFP_ATOMIC,
ch->context);
if (!gbuf) {
/* Again, something bad went wrong, log it... */
pr_err("can't allocate gbuf???\n");
return;
}
/* Set the data pointers */
// FIXME - implement...
}
EXPORT_SYMBOL_GPL(greybus_cport_in_data);
int greybus_gbuf_init(void)
{
return 0;
}
void greybus_gbuf_exit(void)
{
}
...@@ -42,8 +42,8 @@ struct gbuf; ...@@ -42,8 +42,8 @@ struct gbuf;
struct gdev_cport { struct gdev_cport {
u16 number; u16 number;
u16 size; u16 size;
// FIXME, what else?
u8 speed; // valid??? u8 speed; // valid???
// FIXME, what else?
}; };
struct gdev_string { struct gdev_string {
...@@ -234,6 +234,11 @@ void gb_thread_destroy(void); ...@@ -234,6 +234,11 @@ void gb_thread_destroy(void);
int gb_debugfs_init(void); int gb_debugfs_init(void);
void gb_debugfs_cleanup(void); void gb_debugfs_cleanup(void);
int gb_register_cport_complete(struct greybus_device *gdev,
gbuf_complete_t handler, int cport,
void *context);
void gb_deregister_cport_complete(int cport);
extern const struct attribute_group *greybus_module_groups[]; extern const struct attribute_group *greybus_module_groups[];
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment