free_urb(es1, urb);
 }
 
-static void apb1_log_get(struct es1_ap_dev *es1)
+#define APB1_LOG_MSG_SIZE      64
+static void apb1_log_get(struct es1_ap_dev *es1, char *buf)
 {
-       char buf[65];
        int retval;
 
        /* SVC messages go down our control pipe */
        do {
-               memset(buf, 0, 65);
                retval = usb_control_msg(es1->usb_dev,
                                        usb_rcvctrlpipe(es1->usb_dev,
                                                        es1->control_endpoint),
                                        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
                                        0x00, 0x00,
                                        buf,
-                                       64,
+                                       APB1_LOG_MSG_SIZE,
                                        ES1_TIMEOUT);
                if (retval > 0)
                        kfifo_in(&apb1_log_fifo, buf, retval);
 
 static int apb1_log_poll(void *data)
 {
+       struct es1_ap_dev *es1 = data;
+       char *buf;
+
+       buf = kmalloc(APB1_LOG_MSG_SIZE, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+
        while (!kthread_should_stop()) {
                msleep(1000);
-               apb1_log_get((struct es1_ap_dev *)data);
+               apb1_log_get(es1, buf);
        }
+
+       kfree(buf);
+
        return 0;
 }