aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/redrat3.c
diff options
context:
space:
mode:
authorSean Young <sean@mess.org>2013-02-16 15:25:44 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-03-19 14:14:03 -0400
commit4c055a5ae94c76b1139d6e071812d39eed3b67cd (patch)
tree71fecf33aba549586dbd2bdd60c4c39c228cd011 /drivers/media/rc/redrat3.c
parent801b69f2570e2556c6d5a060df85ce9bd0d38119 (diff)
[media] redrat3: remove memcpys and fix unaligned memory access
In stead of doing a memcpy from #defined offset, declare structs which describe the incoming and outgoing data accurately. Tested on first generation RedRat. Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/rc/redrat3.c')
-rw-r--r--drivers/media/rc/redrat3.c351
1 files changed, 103 insertions, 248 deletions
diff --git a/drivers/media/rc/redrat3.c b/drivers/media/rc/redrat3.c
index 842bdcded27c..ec655b8ef4d3 100644
--- a/drivers/media/rc/redrat3.c
+++ b/drivers/media/rc/redrat3.c
@@ -45,6 +45,7 @@
45 * 45 *
46 */ 46 */
47 47
48#include <asm/unaligned.h>
48#include <linux/device.h> 49#include <linux/device.h>
49#include <linux/module.h> 50#include <linux/module.h>
50#include <linux/slab.h> 51#include <linux/slab.h>
@@ -129,25 +130,11 @@ static int debug;
129/* USB bulk-in IR data endpoint address */ 130/* USB bulk-in IR data endpoint address */
130#define RR3_BULK_IN_EP_ADDR 0x82 131#define RR3_BULK_IN_EP_ADDR 0x82
131 132
132/* Raw Modulated signal data value offsets */
133#define RR3_PAUSE_OFFSET 0
134#define RR3_FREQ_COUNT_OFFSET 4
135#define RR3_NUM_PERIOD_OFFSET 6
136#define RR3_MAX_LENGTHS_OFFSET 8
137#define RR3_NUM_LENGTHS_OFFSET 9
138#define RR3_MAX_SIGS_OFFSET 10
139#define RR3_NUM_SIGS_OFFSET 12
140#define RR3_REPEATS_OFFSET 14
141
142/* Size of the fixed-length portion of the signal */ 133/* Size of the fixed-length portion of the signal */
143#define RR3_HEADER_LENGTH 15
144#define RR3_DRIVER_MAXLENS 128 134#define RR3_DRIVER_MAXLENS 128
145#define RR3_MAX_SIG_SIZE 512 135#define RR3_MAX_SIG_SIZE 512
146#define RR3_MAX_BUF_SIZE \
147 ((2 * RR3_HEADER_LENGTH) + RR3_DRIVER_MAXLENS + RR3_MAX_SIG_SIZE)
148#define RR3_TIME_UNIT 50 136#define RR3_TIME_UNIT 50
149#define RR3_END_OF_SIGNAL 0x7f 137#define RR3_END_OF_SIGNAL 0x7f
150#define RR3_TX_HEADER_OFFSET 4
151#define RR3_TX_TRAILER_LEN 2 138#define RR3_TX_TRAILER_LEN 2
152#define RR3_RX_MIN_TIMEOUT 5 139#define RR3_RX_MIN_TIMEOUT 5
153#define RR3_RX_MAX_TIMEOUT 2000 140#define RR3_RX_MAX_TIMEOUT 2000
@@ -159,6 +146,32 @@ static int debug;
159#define USB_RR3USB_PRODUCT_ID 0x0001 146#define USB_RR3USB_PRODUCT_ID 0x0001
160#define USB_RR3IIUSB_PRODUCT_ID 0x0005 147#define USB_RR3IIUSB_PRODUCT_ID 0x0005
161 148
149struct redrat3_header {
150 __be16 length;
151 __be16 transfer_type;
152} __packed;
153
154/* sending and receiving irdata */
155struct redrat3_irdata {
156 struct redrat3_header header;
157 __be32 pause;
158 __be16 mod_freq_count;
159 __be16 num_periods;
160 __u8 max_lengths;
161 __u8 no_lengths;
162 __be16 max_sig_size;
163 __be16 sig_size;
164 __u8 no_repeats;
165 __be16 lens[RR3_DRIVER_MAXLENS]; /* not aligned */
166 __u8 sigdata[RR3_MAX_SIG_SIZE];
167} __packed;
168
169/* firmware errors */
170struct redrat3_error {
171 struct redrat3_header header;
172 __be16 fw_error;
173} __packed;
174
162/* table of devices that work with this driver */ 175/* table of devices that work with this driver */
163static struct usb_device_id redrat3_dev_table[] = { 176static struct usb_device_id redrat3_dev_table[] = {
164 /* Original version of the RedRat3 */ 177 /* Original version of the RedRat3 */
@@ -180,7 +193,7 @@ struct redrat3_dev {
180 /* the receive endpoint */ 193 /* the receive endpoint */
181 struct usb_endpoint_descriptor *ep_in; 194 struct usb_endpoint_descriptor *ep_in;
182 /* the buffer to receive data */ 195 /* the buffer to receive data */
183 unsigned char *bulk_in_buf; 196 void *bulk_in_buf;
184 /* urb used to read ir data */ 197 /* urb used to read ir data */
185 struct urb *read_urb; 198 struct urb *read_urb;
186 199
@@ -205,69 +218,15 @@ struct redrat3_dev {
205 bool transmitting; 218 bool transmitting;
206 219
207 /* store for current packet */ 220 /* store for current packet */
208 char pbuf[RR3_MAX_BUF_SIZE]; 221 struct redrat3_irdata irdata;
209 u16 pktlen;
210 u16 pkttype;
211 u16 bytes_read; 222 u16 bytes_read;
212 char *datap;
213 223
214 u32 carrier; 224 u32 carrier;
215 225
216 char name[128]; 226 char name[64];
217 char phys[64]; 227 char phys[64];
218}; 228};
219 229
220/* All incoming data buffers adhere to a very specific data format */
221struct redrat3_signal_header {
222 u16 length; /* Length of data being transferred */
223 u16 transfer_type; /* Type of data transferred */
224 u32 pause; /* Pause between main and repeat signals */
225 u16 mod_freq_count; /* Value of timer on mod. freq. measurement */
226 u16 no_periods; /* No. of periods over which mod. freq. is measured */
227 u8 max_lengths; /* Max no. of lengths (i.e. size of array) */
228 u8 no_lengths; /* Actual no. of elements in lengths array */
229 u16 max_sig_size; /* Max no. of values in signal data array */
230 u16 sig_size; /* Acuto no. of values in signal data array */
231 u8 no_repeats; /* No. of repeats of repeat signal section */
232 /* Here forward is the lengths and signal data */
233};
234
235static void redrat3_dump_signal_header(struct redrat3_signal_header *header)
236{
237 pr_info("%s:\n", __func__);
238 pr_info(" * length: %u, transfer_type: 0x%02x\n",
239 header->length, header->transfer_type);
240 pr_info(" * pause: %u, freq_count: %u, no_periods: %u\n",
241 header->pause, header->mod_freq_count, header->no_periods);
242 pr_info(" * lengths: %u (max: %u)\n",
243 header->no_lengths, header->max_lengths);
244 pr_info(" * sig_size: %u (max: %u)\n",
245 header->sig_size, header->max_sig_size);
246 pr_info(" * repeats: %u\n", header->no_repeats);
247}
248
249static void redrat3_dump_signal_data(char *buffer, u16 len)
250{
251 int offset, i;
252 char *data_vals;
253
254 pr_info("%s:", __func__);
255
256 offset = RR3_TX_HEADER_OFFSET + RR3_HEADER_LENGTH
257 + (RR3_DRIVER_MAXLENS * sizeof(u16));
258
259 /* read RR3_DRIVER_MAXLENS from ctrl msg */
260 data_vals = buffer + offset;
261
262 for (i = 0; i < len; i++) {
263 if (i % 10 == 0)
264 pr_cont("\n * ");
265 pr_cont("%02x ", *data_vals++);
266 }
267
268 pr_cont("\n");
269}
270
271/* 230/*
272 * redrat3_issue_async 231 * redrat3_issue_async
273 * 232 *
@@ -349,13 +308,14 @@ static void redrat3_dump_fw_error(struct redrat3_dev *rr3, int code)
349 } 308 }
350} 309}
351 310
352static u32 redrat3_val_to_mod_freq(struct redrat3_signal_header *ph) 311static u32 redrat3_val_to_mod_freq(struct redrat3_irdata *irdata)
353{ 312{
354 u32 mod_freq = 0; 313 u32 mod_freq = 0;
314 u16 mod_freq_count = be16_to_cpu(irdata->mod_freq_count);
355 315
356 if (ph->mod_freq_count != 0) 316 if (mod_freq_count != 0)
357 mod_freq = (RR3_CLK * ph->no_periods) / 317 mod_freq = (RR3_CLK * be16_to_cpu(irdata->num_periods)) /
358 (ph->mod_freq_count * RR3_CLK_PER_COUNT); 318 (mod_freq_count * RR3_CLK_PER_COUNT);
359 319
360 return mod_freq; 320 return mod_freq;
361} 321}
@@ -407,16 +367,11 @@ static void redrat3_rx_timeout(unsigned long data)
407static void redrat3_process_ir_data(struct redrat3_dev *rr3) 367static void redrat3_process_ir_data(struct redrat3_dev *rr3)
408{ 368{
409 DEFINE_IR_RAW_EVENT(rawir); 369 DEFINE_IR_RAW_EVENT(rawir);
410 struct redrat3_signal_header header;
411 struct device *dev; 370 struct device *dev;
412 int i, trailer = 0; 371 int i, trailer = 0;
372 unsigned sig_size, single_len, offset, val;
413 unsigned long delay; 373 unsigned long delay;
414 u32 mod_freq, single_len; 374 u32 mod_freq;
415 u16 *len_vals;
416 u8 *data_vals;
417 u32 tmp32;
418 u16 tmp16;
419 char *sig_data;
420 375
421 if (!rr3) { 376 if (!rr3) {
422 pr_err("%s called with no context!\n", __func__); 377 pr_err("%s called with no context!\n", __func__);
@@ -426,57 +381,20 @@ static void redrat3_process_ir_data(struct redrat3_dev *rr3)
426 rr3_ftr(rr3->dev, "Entered %s\n", __func__); 381 rr3_ftr(rr3->dev, "Entered %s\n", __func__);
427 382
428 dev = rr3->dev; 383 dev = rr3->dev;
429 sig_data = rr3->pbuf;
430
431 header.length = rr3->pktlen;
432 header.transfer_type = rr3->pkttype;
433
434 /* Sanity check */
435 if (!(header.length >= RR3_HEADER_LENGTH))
436 dev_warn(dev, "read returned less than rr3 header len\n");
437 384
438 /* Make sure we reset the IR kfifo after a bit of inactivity */ 385 /* Make sure we reset the IR kfifo after a bit of inactivity */
439 delay = usecs_to_jiffies(rr3->hw_timeout); 386 delay = usecs_to_jiffies(rr3->hw_timeout);
440 mod_timer(&rr3->rx_timeout, jiffies + delay); 387 mod_timer(&rr3->rx_timeout, jiffies + delay);
441 388
442 memcpy(&tmp32, sig_data + RR3_PAUSE_OFFSET, sizeof(tmp32)); 389 mod_freq = redrat3_val_to_mod_freq(&rr3->irdata);
443 header.pause = be32_to_cpu(tmp32);
444
445 memcpy(&tmp16, sig_data + RR3_FREQ_COUNT_OFFSET, sizeof(tmp16));
446 header.mod_freq_count = be16_to_cpu(tmp16);
447
448 memcpy(&tmp16, sig_data + RR3_NUM_PERIOD_OFFSET, sizeof(tmp16));
449 header.no_periods = be16_to_cpu(tmp16);
450
451 header.max_lengths = sig_data[RR3_MAX_LENGTHS_OFFSET];
452 header.no_lengths = sig_data[RR3_NUM_LENGTHS_OFFSET];
453
454 memcpy(&tmp16, sig_data + RR3_MAX_SIGS_OFFSET, sizeof(tmp16));
455 header.max_sig_size = be16_to_cpu(tmp16);
456
457 memcpy(&tmp16, sig_data + RR3_NUM_SIGS_OFFSET, sizeof(tmp16));
458 header.sig_size = be16_to_cpu(tmp16);
459
460 header.no_repeats= sig_data[RR3_REPEATS_OFFSET];
461
462 if (debug) {
463 redrat3_dump_signal_header(&header);
464 redrat3_dump_signal_data(sig_data, header.sig_size);
465 }
466
467 mod_freq = redrat3_val_to_mod_freq(&header);
468 rr3_dbg(dev, "Got mod_freq of %u\n", mod_freq); 390 rr3_dbg(dev, "Got mod_freq of %u\n", mod_freq);
469 391
470 /* Here we pull out the 'length' values from the signal */
471 len_vals = (u16 *)(sig_data + RR3_HEADER_LENGTH);
472
473 data_vals = sig_data + RR3_HEADER_LENGTH +
474 (header.max_lengths * sizeof(u16));
475
476 /* process each rr3 encoded byte into an int */ 392 /* process each rr3 encoded byte into an int */
477 for (i = 0; i < header.sig_size; i++) { 393 sig_size = be16_to_cpu(rr3->irdata.sig_size);
478 u16 val = len_vals[data_vals[i]]; 394 for (i = 0; i < sig_size; i++) {
479 single_len = redrat3_len_to_us((u32)be16_to_cpu(val)); 395 offset = rr3->irdata.sigdata[i];
396 val = get_unaligned_be16(&rr3->irdata.lens[offset]);
397 single_len = redrat3_len_to_us(val);
480 398
481 /* we should always get pulse/space/pulse/space samples */ 399 /* we should always get pulse/space/pulse/space samples */
482 if (i % 2) 400 if (i % 2)
@@ -534,7 +452,7 @@ static u8 redrat3_send_cmd(int cmd, struct redrat3_dev *rr3)
534 __func__, res, *data); 452 __func__, res, *data);
535 res = -EIO; 453 res = -EIO;
536 } else 454 } else
537 res = (u8)data[0]; 455 res = data[0];
538 456
539 kfree(data); 457 kfree(data);
540 458
@@ -704,79 +622,72 @@ static void redrat3_get_firmware_rev(struct redrat3_dev *rr3)
704 622
705static void redrat3_read_packet_start(struct redrat3_dev *rr3, int len) 623static void redrat3_read_packet_start(struct redrat3_dev *rr3, int len)
706{ 624{
707 u16 tx_error; 625 struct redrat3_header *header = rr3->bulk_in_buf;
708 u16 hdrlen; 626 unsigned pktlen, pkttype;
709 627
710 rr3_ftr(rr3->dev, "Entering %s\n", __func__); 628 rr3_ftr(rr3->dev, "Entering %s\n", __func__);
711 629
712 /* grab the Length and type of transfer */ 630 /* grab the Length and type of transfer */
713 memcpy(&(rr3->pktlen), (unsigned char *) rr3->bulk_in_buf, 631 pktlen = be16_to_cpu(header->length);
714 sizeof(rr3->pktlen)); 632 pkttype = be16_to_cpu(header->transfer_type);
715 memcpy(&(rr3->pkttype), ((unsigned char *) rr3->bulk_in_buf +
716 sizeof(rr3->pktlen)),
717 sizeof(rr3->pkttype));
718 633
719 /*data needs conversion to know what its real values are*/ 634 if (pktlen > sizeof(rr3->irdata)) {
720 rr3->pktlen = be16_to_cpu(rr3->pktlen); 635 dev_warn(rr3->dev, "packet length %u too large\n", pktlen);
721 rr3->pkttype = be16_to_cpu(rr3->pkttype); 636 return;
637 }
722 638
723 switch (rr3->pkttype) { 639 switch (pkttype) {
724 case RR3_ERROR: 640 case RR3_ERROR:
725 memcpy(&tx_error, ((unsigned char *)rr3->bulk_in_buf 641 if (len >= sizeof(struct redrat3_error)) {
726 + (sizeof(rr3->pktlen) + sizeof(rr3->pkttype))), 642 struct redrat3_error *error = rr3->bulk_in_buf;
727 sizeof(tx_error)); 643 unsigned fw_error = be16_to_cpu(error->fw_error);
728 tx_error = be16_to_cpu(tx_error); 644 redrat3_dump_fw_error(rr3, fw_error);
729 redrat3_dump_fw_error(rr3, tx_error); 645 }
730 break; 646 break;
731 647
732 case RR3_MOD_SIGNAL_IN: 648 case RR3_MOD_SIGNAL_IN:
733 hdrlen = sizeof(rr3->pktlen) + sizeof(rr3->pkttype); 649 memcpy(&rr3->irdata, rr3->bulk_in_buf, len);
734 rr3->bytes_read = len; 650 rr3->bytes_read = len;
735 rr3->bytes_read -= hdrlen;
736 rr3->datap = &(rr3->pbuf[0]);
737
738 memcpy(rr3->datap, ((unsigned char *)rr3->bulk_in_buf + hdrlen),
739 rr3->bytes_read);
740 rr3->datap += rr3->bytes_read;
741 rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n", 651 rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n",
742 rr3->bytes_read, rr3->pktlen); 652 rr3->bytes_read, pktlen);
743 break; 653 break;
744 654
745 default: 655 default:
746 rr3_dbg(rr3->dev, "ignoring packet with type 0x%02x, " 656 rr3_dbg(rr3->dev, "ignoring packet with type 0x%02x, len of %d, 0x%02x\n",
747 "len of %d, 0x%02x\n", rr3->pkttype, len, rr3->pktlen); 657 pkttype, len, pktlen);
748 break; 658 break;
749 } 659 }
750} 660}
751 661
752static void redrat3_read_packet_continue(struct redrat3_dev *rr3, int len) 662static void redrat3_read_packet_continue(struct redrat3_dev *rr3, int len)
753{ 663{
664 void *irdata = &rr3->irdata;
665
754 rr3_ftr(rr3->dev, "Entering %s\n", __func__); 666 rr3_ftr(rr3->dev, "Entering %s\n", __func__);
755 667
756 memcpy(rr3->datap, (unsigned char *)rr3->bulk_in_buf, len); 668 if (len + rr3->bytes_read > sizeof(rr3->irdata)) {
757 rr3->datap += len; 669 dev_warn(rr3->dev, "too much data for packet\n");
670 rr3->bytes_read = 0;
671 return;
672 }
673
674 memcpy(irdata + rr3->bytes_read, rr3->bulk_in_buf, len);
758 675
759 rr3->bytes_read += len; 676 rr3->bytes_read += len;
760 rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n", 677 rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n", rr3->bytes_read,
761 rr3->bytes_read, rr3->pktlen); 678 be16_to_cpu(rr3->irdata.header.length));
762} 679}
763 680
764/* gather IR data from incoming urb, process it when we have enough */ 681/* gather IR data from incoming urb, process it when we have enough */
765static int redrat3_get_ir_data(struct redrat3_dev *rr3, int len) 682static int redrat3_get_ir_data(struct redrat3_dev *rr3, int len)
766{ 683{
767 struct device *dev = rr3->dev; 684 struct device *dev = rr3->dev;
685 unsigned pkttype;
768 int ret = 0; 686 int ret = 0;
769 687
770 rr3_ftr(dev, "Entering %s\n", __func__); 688 rr3_ftr(dev, "Entering %s\n", __func__);
771 689
772 if (rr3->pktlen > RR3_MAX_BUF_SIZE) { 690 if (rr3->bytes_read == 0 && len >= sizeof(struct redrat3_header)) {
773 dev_err(rr3->dev, "error: packet larger than buffer\n");
774 ret = -EINVAL;
775 goto out;
776 }
777
778 if ((rr3->bytes_read == 0) &&
779 (len >= (sizeof(rr3->pkttype) + sizeof(rr3->pktlen)))) {
780 redrat3_read_packet_start(rr3, len); 691 redrat3_read_packet_start(rr3, len);
781 } else if (rr3->bytes_read != 0) { 692 } else if (rr3->bytes_read != 0) {
782 redrat3_read_packet_continue(rr3, len); 693 redrat3_read_packet_continue(rr3, len);
@@ -786,26 +697,20 @@ static int redrat3_get_ir_data(struct redrat3_dev *rr3, int len)
786 goto out; 697 goto out;
787 } 698 }
788 699
789 if (rr3->bytes_read > rr3->pktlen) { 700 if (rr3->bytes_read < be16_to_cpu(rr3->irdata.header.length))
790 dev_err(dev, "bytes_read (%d) greater than pktlen (%d)\n",
791 rr3->bytes_read, rr3->pktlen);
792 ret = -EINVAL;
793 goto out;
794 } else if (rr3->bytes_read < rr3->pktlen)
795 /* we're still accumulating data */ 701 /* we're still accumulating data */
796 return 0; 702 return 0;
797 703
798 /* if we get here, we've got IR data to decode */ 704 /* if we get here, we've got IR data to decode */
799 if (rr3->pkttype == RR3_MOD_SIGNAL_IN) 705 pkttype = be16_to_cpu(rr3->irdata.header.transfer_type);
706 if (pkttype == RR3_MOD_SIGNAL_IN)
800 redrat3_process_ir_data(rr3); 707 redrat3_process_ir_data(rr3);
801 else 708 else
802 rr3_dbg(dev, "discarding non-signal data packet " 709 rr3_dbg(dev, "discarding non-signal data packet (type 0x%02x)\n",
803 "(type 0x%02x)\n", rr3->pkttype); 710 pkttype);
804 711
805out: 712out:
806 rr3->bytes_read = 0; 713 rr3->bytes_read = 0;
807 rr3->pktlen = 0;
808 rr3->pkttype = 0;
809 return ret; 714 return ret;
810} 715}
811 716
@@ -846,8 +751,6 @@ static void redrat3_handle_async(struct urb *urb)
846 default: 751 default:
847 dev_warn(rr3->dev, "Error: urb status = %d\n", urb->status); 752 dev_warn(rr3->dev, "Error: urb status = %d\n", urb->status);
848 rr3->bytes_read = 0; 753 rr3->bytes_read = 0;
849 rr3->pktlen = 0;
850 rr3->pkttype = 0;
851 break; 754 break;
852 } 755 }
853} 756}
@@ -873,7 +776,7 @@ static u16 mod_freq_to_val(unsigned int mod_freq)
873 int mult = 6000000; 776 int mult = 6000000;
874 777
875 /* Clk used in mod. freq. generation is CLK24/4. */ 778 /* Clk used in mod. freq. generation is CLK24/4. */
876 return (u16)(65536 - (mult / mod_freq)); 779 return 65536 - (mult / mod_freq);
877} 780}
878 781
879static int redrat3_set_tx_carrier(struct rc_dev *rcdev, u32 carrier) 782static int redrat3_set_tx_carrier(struct rc_dev *rcdev, u32 carrier)
@@ -895,16 +798,11 @@ static int redrat3_transmit_ir(struct rc_dev *rcdev, unsigned *txbuf,
895{ 798{
896 struct redrat3_dev *rr3 = rcdev->priv; 799 struct redrat3_dev *rr3 = rcdev->priv;
897 struct device *dev = rr3->dev; 800 struct device *dev = rr3->dev;
898 struct redrat3_signal_header header; 801 struct redrat3_irdata *irdata = NULL;
899 int i, ret, ret_len, offset; 802 int i, ret, ret_len;
900 int lencheck, cur_sample_len, pipe; 803 int lencheck, cur_sample_len, pipe;
901 char *buffer = NULL, *sigdata = NULL;
902 int *sample_lens = NULL; 804 int *sample_lens = NULL;
903 u32 tmpi;
904 u16 tmps;
905 u8 *datap;
906 u8 curlencheck = 0; 805 u8 curlencheck = 0;
907 u16 *lengths_ptr;
908 int sendbuf_len; 806 int sendbuf_len;
909 807
910 rr3_ftr(dev, "Entering %s\n", __func__); 808 rr3_ftr(dev, "Entering %s\n", __func__);
@@ -926,8 +824,8 @@ static int redrat3_transmit_ir(struct rc_dev *rcdev, unsigned *txbuf,
926 goto out; 824 goto out;
927 } 825 }
928 826
929 sigdata = kzalloc((count + RR3_TX_TRAILER_LEN), GFP_KERNEL); 827 irdata = kzalloc(sizeof(*irdata), GFP_KERNEL);
930 if (!sigdata) { 828 if (!irdata) {
931 ret = -ENOMEM; 829 ret = -ENOMEM;
932 goto out; 830 goto out;
933 } 831 }
@@ -950,83 +848,41 @@ static int redrat3_transmit_ir(struct rc_dev *rcdev, unsigned *txbuf,
950 /* now convert the value to a proper 848 /* now convert the value to a proper
951 * rr3 value.. */ 849 * rr3 value.. */
952 sample_lens[curlencheck] = cur_sample_len; 850 sample_lens[curlencheck] = cur_sample_len;
851 put_unaligned_be16(cur_sample_len,
852 &irdata->lens[curlencheck]);
953 curlencheck++; 853 curlencheck++;
954 } else { 854 } else {
955 count = i - 1; 855 count = i - 1;
956 break; 856 break;
957 } 857 }
958 } 858 }
959 sigdata[i] = lencheck; 859 irdata->sigdata[i] = lencheck;
960 } 860 }
961 861
962 sigdata[count] = RR3_END_OF_SIGNAL; 862 irdata->sigdata[count] = RR3_END_OF_SIGNAL;
963 sigdata[count + 1] = RR3_END_OF_SIGNAL; 863 irdata->sigdata[count + 1] = RR3_END_OF_SIGNAL;
964
965 offset = RR3_TX_HEADER_OFFSET;
966 sendbuf_len = RR3_HEADER_LENGTH + (sizeof(u16) * RR3_DRIVER_MAXLENS)
967 + count + RR3_TX_TRAILER_LEN + offset;
968
969 buffer = kzalloc(sendbuf_len, GFP_KERNEL);
970 if (!buffer) {
971 ret = -ENOMEM;
972 goto out;
973 }
974 864
865 sendbuf_len = offsetof(struct redrat3_irdata,
866 sigdata[count + RR3_TX_TRAILER_LEN]);
975 /* fill in our packet header */ 867 /* fill in our packet header */
976 header.length = sendbuf_len - offset; 868 irdata->header.length = cpu_to_be16(sendbuf_len -
977 header.transfer_type = RR3_MOD_SIGNAL_OUT; 869 sizeof(struct redrat3_header));
978 header.pause = redrat3_len_to_us(100); 870 irdata->header.transfer_type = cpu_to_be16(RR3_MOD_SIGNAL_OUT);
979 header.mod_freq_count = mod_freq_to_val(rr3->carrier); 871 irdata->pause = cpu_to_be32(redrat3_len_to_us(100));
980 header.no_periods = 0; /* n/a to transmit */ 872 irdata->mod_freq_count = cpu_to_be16(mod_freq_to_val(rr3->carrier));
981 header.max_lengths = RR3_DRIVER_MAXLENS; 873 irdata->no_lengths = curlencheck;
982 header.no_lengths = curlencheck; 874 irdata->sig_size = cpu_to_be16(count + RR3_TX_TRAILER_LEN);
983 header.max_sig_size = RR3_MAX_SIG_SIZE;
984 header.sig_size = count + RR3_TX_TRAILER_LEN;
985 /* we currently rely on repeat handling in the IR encoding source */
986 header.no_repeats = 0;
987
988 tmps = cpu_to_be16(header.length);
989 memcpy(buffer, &tmps, 2);
990
991 tmps = cpu_to_be16(header.transfer_type);
992 memcpy(buffer + 2, &tmps, 2);
993
994 tmpi = cpu_to_be32(header.pause);
995 memcpy(buffer + offset, &tmpi, sizeof(tmpi));
996
997 tmps = cpu_to_be16(header.mod_freq_count);
998 memcpy(buffer + offset + RR3_FREQ_COUNT_OFFSET, &tmps, 2);
999
1000 buffer[offset + RR3_NUM_LENGTHS_OFFSET] = header.no_lengths;
1001
1002 tmps = cpu_to_be16(header.sig_size);
1003 memcpy(buffer + offset + RR3_NUM_SIGS_OFFSET, &tmps, 2);
1004
1005 buffer[offset + RR3_REPEATS_OFFSET] = header.no_repeats;
1006
1007 lengths_ptr = (u16 *)(buffer + offset + RR3_HEADER_LENGTH);
1008 for (i = 0; i < curlencheck; ++i)
1009 lengths_ptr[i] = cpu_to_be16(sample_lens[i]);
1010
1011 datap = (u8 *)(buffer + offset + RR3_HEADER_LENGTH +
1012 (sizeof(u16) * RR3_DRIVER_MAXLENS));
1013 memcpy(datap, sigdata, (count + RR3_TX_TRAILER_LEN));
1014
1015 if (debug) {
1016 redrat3_dump_signal_header(&header);
1017 redrat3_dump_signal_data(buffer, header.sig_size);
1018 }
1019 875
1020 pipe = usb_sndbulkpipe(rr3->udev, rr3->ep_out->bEndpointAddress); 876 pipe = usb_sndbulkpipe(rr3->udev, rr3->ep_out->bEndpointAddress);
1021 tmps = usb_bulk_msg(rr3->udev, pipe, buffer, 877 ret = usb_bulk_msg(rr3->udev, pipe, irdata,
1022 sendbuf_len, &ret_len, 10 * HZ); 878 sendbuf_len, &ret_len, 10 * HZ);
1023 rr3_dbg(dev, "sent %d bytes, (ret %d)\n", ret_len, tmps); 879 rr3_dbg(dev, "sent %d bytes, (ret %d)\n", ret_len, ret);
1024 880
1025 /* now tell the hardware to transmit what we sent it */ 881 /* now tell the hardware to transmit what we sent it */
1026 pipe = usb_rcvctrlpipe(rr3->udev, 0); 882 pipe = usb_rcvctrlpipe(rr3->udev, 0);
1027 ret = usb_control_msg(rr3->udev, pipe, RR3_TX_SEND_SIGNAL, 883 ret = usb_control_msg(rr3->udev, pipe, RR3_TX_SEND_SIGNAL,
1028 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 884 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
1029 0, 0, buffer, 2, HZ * 10); 885 0, 0, irdata, 2, HZ * 10);
1030 886
1031 if (ret < 0) 887 if (ret < 0)
1032 dev_err(dev, "Error: control msg send failed, rc %d\n", ret); 888 dev_err(dev, "Error: control msg send failed, rc %d\n", ret);
@@ -1035,8 +891,7 @@ static int redrat3_transmit_ir(struct rc_dev *rcdev, unsigned *txbuf,
1035 891
1036out: 892out:
1037 kfree(sample_lens); 893 kfree(sample_lens);
1038 kfree(buffer); 894 kfree(irdata);
1039 kfree(sigdata);
1040 895
1041 rr3->transmitting = false; 896 rr3->transmitting = false;
1042 /* rr3 re-enables rc detector because it was enabled before */ 897 /* rr3 re-enables rc detector because it was enabled before */