Re: [PATCH] IR/mceusb: clean up gen1 device init

2010-06-08 Thread Jarod Wilson
On Fri, Jun 4, 2010 at 11:06 AM, Jarod Wilson ja...@redhat.com wrote:
 The first-gen mceusb device init code, while mostly functional, had a few
 issues in it. This patch does the following:

 1) removes use of magic numbers
 2) eliminates mapping of memory from stack
 3) makes debug spew translator functional
 4) properly initializes default tx blaster mask

My memory is starting to go. I pretty much resubmitted exactly the
same patch (https://patchwork.kernel.org/patch/105042/) today,
forgetting I'd already submitted this. There's a minor context
difference though, the newer one should match the staging/rc tree
better.

-- 
Jarod Wilson
ja...@wilsonet.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] IR/mceusb: clean up gen1 device init

2010-06-04 Thread Jarod Wilson
The first-gen mceusb device init code, while mostly functional, had a few
issues in it. This patch does the following:

1) removes use of magic numbers
2) eliminates mapping of memory from stack
3) makes debug spew translator functional
4) properly initializes default tx blaster mask

Signed-off-by: Jarod Wilson ja...@redhat.com

---
 drivers/media/IR/mceusb.c |   57 
 1 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/drivers/media/IR/mceusb.c b/drivers/media/IR/mceusb.c
index 6659cd1..ca146ad 100644
--- a/drivers/media/IR/mceusb.c
+++ b/drivers/media/IR/mceusb.c
@@ -48,6 +48,8 @@
 
 #define USB_BUFLEN 32  /* USB reception buffer length */
 #define IRBUF_SIZE 256 /* IR work buffer length */
+#define USB_CTRL_MSG_SZ2   /* Size of usb ctrl msg on gen1 hw */
+#define MCE_G1_INIT_MSGS 40/* Init messages on gen1 hw to throw out */
 
 /* MCE constants */
 #define MCE_CMDBUF_SIZE384 /* MCE Command buffer length */
@@ -300,11 +302,13 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, 
char *buf,
int i;
u8 cmd, subcmd, data1, data2;
struct device *dev = ir-dev;
+   int idx = 0;
 
-   if (len = 0)
-   return;
+   /* skip meaningless 0xb1 0x60 header bytes on orig receiver */
+   if (ir-flags.microsoft_gen1  !out)
+   idx = 2;
 
-   if (ir-flags.microsoft_gen1  len = 2)
+   if (len = idx)
return;
 
for (i = 0; i  len  i  USB_BUFLEN; i++)
@@ -318,10 +322,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, 
char *buf,
else
strcpy(inout, Got\0);
 
-   cmd= buf[0]  0xff;
-   subcmd = buf[1]  0xff;
-   data1  = buf[2]  0xff;
-   data2  = buf[3]  0xff;
+   cmd= buf[idx]  0xff;
+   subcmd = buf[idx + 1]  0xff;
+   data1  = buf[idx + 2]  0xff;
+   data2  = buf[idx + 3]  0xff;
 
switch (cmd) {
case 0x00:
@@ -339,7 +343,7 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, 
char *buf,
else
dev_info(dev, hw/sw rev 0x%02x 0x%02x 
 0x%02x 0x%02x\n, data1, data2,
-buf[4], buf[5]);
+buf[idx + 4], buf[idx + 5]);
break;
case 0xaa:
dev_info(dev, Device reset requested\n);
@@ -705,6 +709,13 @@ static void mceusb_set_default_tx_mask(struct urb *urb)
char *buffer = urb-transfer_buffer;
u8 cmd, subcmd, def_tx_mask;
 
+   /* default mask isn't fetchable on gen1, we have to set it */
+   if (ir-flags.microsoft_gen1) {
+   ir-def_tx_mask = MCE_DEFAULT_TX_MASK;
+   ir-tx_mask = MCE_DEFAULT_TX_MASK;
+   return;
+   }
+
cmd= buffer[0]  0xff;
subcmd = buffer[1]  0xff;
 
@@ -769,27 +780,38 @@ static void mceusb_dev_recv(struct urb *urb, struct 
pt_regs *regs)
 static void mceusb_gen1_init(struct mceusb_dev *ir)
 {
int i, ret;
-   char junk[64], data[8];
int partial = 0;
struct device *dev = ir-dev;
+   char *junk, *data;
+
+   junk = kmalloc(2 * USB_BUFLEN, GFP_KERNEL);
+   if (!junk) {
+   dev_err(dev, %s: memory allocation failed!\n, __func__);
+   return;
+   }
+
+   data = kzalloc(USB_CTRL_MSG_SZ, GFP_KERNEL);
+   if (!data) {
+   dev_err(dev, %s: memory allocation failed!\n, __func__);
+   kfree(junk);
+   return;
+   }
 
/*
 * Clear off the first few messages. These look like calibration
 * or test data, I can't really tell. This also flushes in case
 * we have random ir data queued up.
 */
-   for (i = 0; i  40; i++)
+   for (i = 0; i  MCE_G1_INIT_MSGS; i++)
usb_bulk_msg(ir-usbdev,
usb_rcvbulkpipe(ir-usbdev,
ir-usb_ep_in-bEndpointAddress),
-   junk, 64, partial, HZ * 10);
-
-   memset(data, 0, 8);
+   junk, sizeof(junk), partial, HZ * 10);
 
/* Get Status */
ret = usb_control_msg(ir-usbdev, usb_rcvctrlpipe(ir-usbdev, 0),
  USB_REQ_GET_STATUS, USB_DIR_IN,
- 0, 0, data, 2, HZ * 3);
+ 0, 0, data, USB_CTRL_MSG_SZ, HZ * 3);
 
/*ret = usb_get_status( ir-usbdev, 0, 0, data ); */
dev_dbg(dev, %s - ret = %d status = 0x%x 0x%x\n, __func__,
@@ -799,11 +821,11 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
 * This is a strange one. They issue a set address to the device
 * on the receive control pipe and expect a certain value pair back
 */
-   memset(data, 0, 8);
+   memset(data, 0, sizeof(data));