From cde9070d9970eef1f7ec2360586c802a16230ad8 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 10 May 2024 07:43:50 +0000 Subject: [PATCH] rtl88x2CE_WiFi_linux driver --- kernel/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c | 207 ++++++++++++++++++++------------------------------- 1 files changed, 83 insertions(+), 124 deletions(-) diff --git a/kernel/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c b/kernel/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c index eed5689..9e016b7 100644 --- a/kernel/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c +++ b/kernel/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c @@ -1,14 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * TTUSB DVB driver * * Copyright (c) 2002 Holger Waechtler <holger@convergence.de> * Copyright (c) 2003 Felix Domke <tmbinc@elitedvb.net> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + #include <linux/init.h> #include <linux/slab.h> #include <linux/wait.h> @@ -63,7 +62,12 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); -#define dprintk(x...) do { if (debug) printk(KERN_DEBUG x); } while (0) +#define dprintk(fmt, arg...) do { \ + if (debug) \ + printk(KERN_DEBUG pr_fmt("%s: " fmt), \ + __func__, ##arg); \ +} while (0) + #define ISO_BUF_COUNT 4 #define FRAMES_PER_ISO_BUF 4 @@ -75,6 +79,9 @@ #define TTUSB_REV_2_2 0x22 #define TTUSB_BUDGET_NAME "ttusb_stc_fw" + +#define MAX_SEND 0x28 +#define MAX_RCV 0x20 /* * since we're casting (struct ttusb*) <-> (struct dvb_demux*) around @@ -123,87 +130,70 @@ int cc; /* MuxCounter - will increment on EVERY MUX PACKET */ /* (including stuffing. yes. really.) */ - u8 last_result[32]; + u8 send_buf[MAX_SEND]; + u8 last_result[MAX_RCV]; int revision; struct dvb_frontend* fe; }; -/* ugly workaround ... don't know why it's necessary to read */ -/* all result codes. */ - -static int ttusb_cmd(struct ttusb *ttusb, - const u8 * data, int len, int needresult) +static int ttusb_cmd(struct ttusb *ttusb, u8 *data, int len, int len_result) { int actual_len; int err; - int i; - - if (debug >= 3) { - printk(KERN_DEBUG ">"); - for (i = 0; i < len; ++i) - printk(KERN_CONT " %02x", data[i]); - printk(KERN_CONT "\n"); - } if (mutex_lock_interruptible(&ttusb->semusb) < 0) return -EAGAIN; + if (debug >= 3) + dprintk("> %*ph\n", len, data); + + memcpy(data, ttusb->send_buf, len); + err = usb_bulk_msg(ttusb->dev, ttusb->bulk_out_pipe, - (u8 *) data, len, &actual_len, 1000); + ttusb->send_buf, len, &actual_len, 1000); if (err != 0) { - dprintk("%s: usb_bulk_msg(send) failed, err == %i!\n", - __func__, err); - mutex_unlock(&ttusb->semusb); - return err; + dprintk("usb_bulk_msg(send) failed, err == %i!\n", err); + goto err; } if (actual_len != len) { - dprintk("%s: only wrote %d of %d bytes\n", __func__, + err = -EIO; + dprintk("only wrote %d of %d bytes\n", actual_len, len); - mutex_unlock(&ttusb->semusb); - return -1; + goto err; } err = usb_bulk_msg(ttusb->dev, ttusb->bulk_in_pipe, - ttusb->last_result, 32, &actual_len, 1000); + ttusb->last_result, MAX_RCV, &actual_len, 1000); if (err != 0) { - printk("%s: failed, receive error %d\n", __func__, - err); - mutex_unlock(&ttusb->semusb); - return err; + pr_err("cmd xter failed, receive error %d\n", err); + goto err; } if (debug >= 3) { actual_len = ttusb->last_result[3] + 4; - printk(KERN_DEBUG "<"); - for (i = 0; i < actual_len; ++i) - printk(KERN_CONT " %02x", ttusb->last_result[i]); - printk(KERN_CONT "\n"); + dprintk("< %*ph\n", actual_len, ttusb->last_result); } - if (!needresult) - mutex_unlock(&ttusb->semusb); - return 0; -} + if (len_result) + memcpy(ttusb->send_buf, ttusb->last_result, len_result); -static int ttusb_result(struct ttusb *ttusb, u8 * data, int len) -{ - memcpy(data, ttusb->last_result, len); +err: mutex_unlock(&ttusb->semusb); - return 0; + return err; } static int ttusb_i2c_msg(struct ttusb *ttusb, u8 addr, u8 * snd_buf, u8 snd_len, u8 * rcv_buf, u8 rcv_len) { - u8 b[0x28]; + u8 b[MAX_SEND]; u8 id = ++ttusb->c; int i, err; - if (snd_len > 0x28 - 7 || rcv_len > 0x20 - 7) + if (snd_len > MAX_SEND - 7 || rcv_len > MAX_RCV - 7) return -EINVAL; b[0] = 0xaa; @@ -217,12 +207,10 @@ for (i = 0; i < snd_len; i++) b[7 + i] = snd_buf[i]; - err = ttusb_cmd(ttusb, b, snd_len + 7, 1); + err = ttusb_cmd(ttusb, b, snd_len + 7, MAX_RCV); if (err) return -EREMOTEIO; - - err = ttusb_result(ttusb, b, 0x20); /* check if the i2c transaction was successful */ if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO; @@ -230,9 +218,8 @@ if (rcv_len > 0) { if (err || b[0] != 0x55 || b[1] != id) { - dprintk - ("%s: usb_bulk_msg(recv) failed, err == %i, id == %02x, b == ", - __func__, err, id); + dprintk("usb_bulk_msg(recv) failed, err == %i, id == %02x, b == ", + err, id); return -EREMOTEIO; } @@ -276,7 +263,7 @@ snd_buf, snd_len, rcv_buf, rcv_len); if (err < rcv_len) { - dprintk("%s: i == %i\n", __func__, i); + dprintk("i == %i\n", i); break; } @@ -296,7 +283,7 @@ err = request_firmware(&fw, "ttusb-budget/dspbootcode.bin", &ttusb->dev->dev); if (err) { - printk(KERN_ERR "ttusb-budget: failed to request firmware\n"); + pr_err("failed to request firmware\n"); return err; } @@ -306,7 +293,7 @@ b[3] = 28; /* upload dsp code in 32 byte steps (36 didn't work for me ...) */ - /* 32 is max packet size, no messages should be splitted. */ + /* 32 is max packet size, no messages should be split. */ for (i = 0; i < fw->size; i += 28) { memcpy(&b[4], &fw->data[i], 28); @@ -336,8 +323,7 @@ done: release_firmware(fw); if (err) { - dprintk("%s: usb_bulk_msg() failed, return value %i!\n", - __func__, err); + dprintk("usb_bulk_msg() failed, return value %i!\n", err); } return err; @@ -404,8 +390,6 @@ /* i2c write read: 5 bytes, addr 0x10, 0x02 bytes write, 1 bytes read. */ u8 b3[] = { 0xaa, ++ttusb->c, 0x31, 5, 0x10, 0x02, 0x01, 0x00, 0x1e }; - u8 b4[] = - { 0x55, ttusb->c, 0x31, 4, 0x10, 0x02, 0x01, 0x00, 0x1e }; u8 get_version[] = { 0xaa, ++ttusb->c, 0x17, 5, 0, 0, 0, 0, 0 }; u8 get_dsp_version[0x20] = @@ -426,44 +410,35 @@ if ((err = ttusb_cmd(ttusb, b2, sizeof(b2), 0))) return err; - if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 1))) + if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 0))) return err; - err = ttusb_result(ttusb, b4, sizeof(b4)); - - if ((err = ttusb_cmd(ttusb, get_version, sizeof(get_version), 1))) + if ((err = ttusb_cmd(ttusb, get_version, + sizeof(get_version), sizeof(get_version)))) return err; - if ((err = ttusb_result(ttusb, get_version, sizeof(get_version)))) - return err; - - dprintk("%s: stc-version: %c%c%c%c%c\n", __func__, - get_version[4], get_version[5], get_version[6], - get_version[7], get_version[8]); + dprintk("stc-version: %c%c%c%c%c\n", get_version[4], get_version[5], + get_version[6], get_version[7], get_version[8]); if (memcmp(get_version + 4, "V 0.0", 5) && memcmp(get_version + 4, "V 1.1", 5) && memcmp(get_version + 4, "V 2.1", 5) && memcmp(get_version + 4, "V 2.2", 5)) { - printk - ("%s: unknown STC version %c%c%c%c%c, please report!\n", - __func__, get_version[4], get_version[5], - get_version[6], get_version[7], get_version[8]); + pr_err("unknown STC version %c%c%c%c%c, please report!\n", + get_version[4], get_version[5], + get_version[6], get_version[7], get_version[8]); } ttusb->revision = ((get_version[6] - '0') << 4) | (get_version[8] - '0'); err = - ttusb_cmd(ttusb, get_dsp_version, sizeof(get_dsp_version), 1); + ttusb_cmd(ttusb, get_dsp_version, + sizeof(get_dsp_version), sizeof(get_dsp_version)); if (err) return err; - err = - ttusb_result(ttusb, get_dsp_version, sizeof(get_dsp_version)); - if (err) - return err; - printk("%s: dsp-version: %c%c%c\n", __func__, + pr_info("dsp-version: %c%c%c\n", get_dsp_version[4], get_dsp_version[5], get_dsp_version[6]); return 0; } @@ -485,8 +460,7 @@ /* Diseqc */ if ((err = ttusb_cmd(ttusb, b, 4 + b[3], 0))) { - dprintk("%s: usb_bulk_msg() failed, return value %i!\n", - __func__, err); + dprintk("usb_bulk_msg() failed, return value %i!\n", err); } return err; @@ -503,8 +477,7 @@ /* SetLNB */ if ((err = ttusb_cmd(ttusb, b, sizeof(b), 0))) { - dprintk("%s: usb_bulk_msg() failed, return value %i!\n", - __func__, err); + dprintk("usb_bulk_msg() failed, return value %i!\n", err); } return err; @@ -538,8 +511,7 @@ err = ttusb_cmd(ttusb, b, sizeof(b), 0); if (err) { - dprintk("%s: usb_bulk_msg() failed, return value %i!\n", - __func__, err); + dprintk("usb_bulk_msg() failed, return value %i!\n", err); } } #endif @@ -563,7 +535,7 @@ int i; if (len < 4 || len & 0x1) { - pr_warn("%s: muxpack has invalid len %d\n", __func__, len); + pr_warn("muxpack has invalid len %d\n", len); numinvalid++; return; } @@ -571,8 +543,7 @@ for (i = 0; i < len; i += 2) csum ^= le16_to_cpup((__le16 *) (muxpack + i)); if (csum) { - printk("%s: muxpack with incorrect checksum, ignoring\n", - __func__); + pr_warn("muxpack with incorrect checksum, ignoring\n"); numinvalid++; return; } @@ -580,8 +551,8 @@ cc = (muxpack[len - 4] << 8) | muxpack[len - 3]; cc &= 0x7FFF; if ((cc != ttusb->cc) && (ttusb->cc != -1)) - printk("%s: cc discontinuity (%d frames missing)\n", - __func__, (cc - ttusb->cc) & 0x7FFF); + pr_warn("cc discontinuity (%d frames missing)\n", + (cc - ttusb->cc) & 0x7FFF); ttusb->cc = (cc + 1) & 0x7FFF; if (muxpack[0] & 0x80) { #ifdef TTUSB_HWSECTIONS @@ -602,7 +573,7 @@ !!(ttusb->muxpack[1] & 1)) data++; #warning TODO: pusi - printk("cc: %04x\n", (data[0] << 8) | data[1]); + dprintk("cc: %04x\n", (data[0] << 8) | data[1]); #endif numsec++; } else if (muxpack[0] == 0x47) { @@ -621,7 +592,7 @@ dvb_dmx_swfilter_packets(&ttusb->dvb_demux, muxpack, 1); } else if (muxpack[0] != 0) { numinvalid++; - printk("illegal muxpack type %02x\n", muxpack[0]); + pr_err("illegal muxpack type %02x\n", muxpack[0]); } else numstuff++; } @@ -631,7 +602,7 @@ int maxwork = 1024; while (len) { if (!(maxwork--)) { - printk("%s: too much work\n", __func__); + pr_err("too much work\n"); break; } @@ -645,10 +616,7 @@ else { ttusb->mux_state = 0; if (ttusb->insync) { - dprintk("%s: %02x\n", - __func__, data[-1]); - printk(KERN_INFO "%s: lost sync.\n", - __func__); + pr_info("lost sync.\n"); ttusb->insync = 0; } } @@ -704,10 +672,8 @@ ttusb->muxpack[1] + 2 + 4; else { - dprintk - ("%s: invalid state: first byte is %x\n", - __func__, - ttusb->muxpack[0]); + dprintk("invalid state: first byte is %x\n", + ttusb->muxpack[0]); ttusb->mux_state = 0; } } @@ -755,12 +721,6 @@ if (!ttusb->iso_streaming) return; - -#if 0 - printk("%s: status %d, errcount == %d, length == %i\n", - __func__, - urb->status, urb->error_count, urb->actual_length); -#endif if (!urb->status) { for (i = 0; i < urb->number_of_packets; ++i) { @@ -834,7 +794,7 @@ int i, j, err, buffer_offset = 0; if (ttusb->iso_streaming) { - printk("%s: iso xfer already running!\n", __func__); + pr_err("iso xfer already running!\n"); return 0; } @@ -868,9 +828,8 @@ for (i = 0; i < ISO_BUF_COUNT; i++) { if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_ATOMIC))) { ttusb_stop_iso_xfer(ttusb); - printk - ("%s: failed urb submission (%i: err = %i)!\n", - __func__, i, err); + pr_err("failed urb submission (%i: err = %i)!\n", + i, err); return err; } } @@ -1430,7 +1389,7 @@ if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) { - printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 1\n"); + pr_err("dvbc_philips_tdm1316l_pll_set Error 1\n"); return -EIO; } @@ -1439,7 +1398,7 @@ if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) { - printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 2\n"); + pr_err("dvbc_philips_tdm1316l_pll_set Error 2\n"); return -EIO; } @@ -1616,12 +1575,12 @@ } if (ttusb->fe == NULL) { - printk("dvb-ttusb-budget: A frontend driver was not found for device [%04x:%04x]\n", + pr_err("no frontend driver found for device [%04x:%04x]\n", le16_to_cpu(ttusb->dev->descriptor.idVendor), le16_to_cpu(ttusb->dev->descriptor.idProduct)); } else { if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) { - printk("dvb-ttusb-budget: Frontend registration failed!\n"); + pr_err("Frontend registration failed!\n"); dvb_frontend_detach(ttusb->fe); ttusb->fe = NULL; } @@ -1641,7 +1600,7 @@ struct ttusb *ttusb; int result; - dprintk("%s: TTUSB DVB connected\n", __func__); + dprintk("TTUSB DVB connected\n"); udev = interface_to_usbdev(intf); @@ -1663,14 +1622,14 @@ result = ttusb_alloc_iso_urbs(ttusb); if (result < 0) { - dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__); + dprintk("ttusb_alloc_iso_urbs - failed\n"); mutex_unlock(&ttusb->semi2c); kfree(ttusb); return result; } if (ttusb_init_controller(ttusb)) - printk("ttusb_init_controller: error\n"); + pr_err("ttusb_init_controller: error\n"); mutex_unlock(&ttusb->semi2c); @@ -1686,7 +1645,7 @@ /* i2c */ memset(&ttusb->i2c_adap, 0, sizeof(struct i2c_adapter)); - strcpy(ttusb->i2c_adap.name, "TTUSB DEC"); + strscpy(ttusb->i2c_adap.name, "TTUSB DEC", sizeof(ttusb->i2c_adap.name)); i2c_set_adapdata(&ttusb->i2c_adap, ttusb); @@ -1715,7 +1674,7 @@ result = dvb_dmx_init(&ttusb->dvb_demux); if (result < 0) { - printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n", result); + pr_err("dvb_dmx_init failed (errno = %d)\n", result); result = -ENODEV; goto err_i2c_del_adapter; } @@ -1726,14 +1685,14 @@ result = dvb_dmxdev_init(&ttusb->dmxdev, &ttusb->adapter); if (result < 0) { - printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n", + pr_err("dvb_dmxdev_init failed (errno = %d)\n", result); result = -ENODEV; goto err_release_dmx; } if (dvb_net_init(&ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) { - printk("ttusb_dvb: dvb_net_init failed!\n"); + pr_err("dvb_net_init failed!\n"); result = -ENODEV; goto err_release_dmxdev; } @@ -1782,7 +1741,7 @@ kfree(ttusb); - dprintk("%s: TTUSB DVB disconnected\n", __func__); + dprintk("TTUSB DVB disconnected\n"); } static const struct usb_device_id ttusb_table[] = { -- Gitblit v1.6.2