aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/udlfb/udlfb.h
diff options
context:
space:
mode:
authorBernie Thompson <bernie@plugable.com>2010-02-15 06:45:55 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-03 16:42:59 -0800
commit4a4854dd2049ddc066a162a0f843dc2a78481060 (patch)
treec4b6af4581bfe1024f53bd593267d364ab85d3d7 /drivers/staging/udlfb/udlfb.h
parentcc403dc67d10b895fec14b837fa2a6cb6ee6c8bd (diff)
Staging: udlfb: pre-allocated urb list helpers
Add functions to pre-allocate and free usb bulk urbs for core render path. Udlfb currently allocates a single urb, guarded by a mutex, that is a key bottleneck. Because udlfb sends so much data, preallocation is most efficient. Functions will be used by new rendering functions in later patches. Signed-off-by: Bernie Thompson <bernie@plugable.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/udlfb/udlfb.h')
-rw-r--r--drivers/staging/udlfb/udlfb.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/staging/udlfb/udlfb.h b/drivers/staging/udlfb/udlfb.h
index 15f3d3a6836..13f992fe45f 100644
--- a/drivers/staging/udlfb/udlfb.h
+++ b/drivers/staging/udlfb/udlfb.h
@@ -5,16 +5,35 @@
#define BUF_HIGH_WATER_MARK 1024
#define BUF_SIZE (64*1024)
+struct urb_node {
+ struct list_head entry;
+ struct dlfb_data *dev;
+ struct urb *urb;
+};
+
+struct urb_list {
+ struct list_head list;
+ spinlock_t lock;
+ struct semaphore limit_sem;
+ int available;
+ int count;
+ size_t size;
+};
+
struct dlfb_data {
struct usb_device *udev;
+ struct device *gdev; /* &udev->dev */
struct usb_interface *interface;
struct urb *tx_urb, *ctrl_urb;
struct usb_ctrlrequest dr;
struct fb_info *info;
+ struct urb_list urbs;
+ struct kref kref;
char *buf;
char *bufend;
char *backing_buffer;
struct mutex bulk_mutex;
+ atomic_t lost_pixels; /* 1 = a render op failed. Need screen refresh */
char edid[128];
int screen_size;
int line_length;
@@ -29,6 +48,14 @@ struct dlfb_data {
#define NR_USB_REQUEST_I2C_SUB_IO 0x02
#define NR_USB_REQUEST_CHANNEL 0x12
+/* -BULK_SIZE as per usb-skeleton. Can we get full page and avoid overhead? */
+#define BULK_SIZE 512
+#define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE)
+#define WRITES_IN_FLIGHT (4)
+
+#define GET_URB_TIMEOUT HZ
+#define FREE_URB_TIMEOUT (HZ*2)
+
static void dlfb_bulk_callback(struct urb *urb)
{
struct dlfb_data *dev_info = urb->context;
@@ -72,4 +99,12 @@ static int dlfb_bulk_msg(struct dlfb_data *dev_info, int len)
#define dlfb_set_register insert_command
+#define dl_err(format, arg...) \
+ dev_err(dev->gdev, "dlfb: " format, ## arg)
+#define dl_warn(format, arg...) \
+ dev_warn(dev->gdev, "dlfb: " format, ## arg)
+#define dl_notice(format, arg...) \
+ dev_notice(dev->gdev, "dlfb: " format, ## arg)
+#define dl_info(format, arg...) \
+ dev_info(dev->gdev, "dlfb: " format, ## arg)
#endif