You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'topic/kbuild-fixes-for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media build fixes from Mauro Carvalho Chehab: "A series of patches that fix compilation on non-x86 archs. While most of them are just build fixes, there are some fixes for real bugs, as there are a number of drivers using dynamic stack allocation. A few of those might be considered a security risk, if the i2c-dev module is loaded, as someone could be sending very long I2C data that could potentially overflow the Kernel stack. Ok, as using /dev/i2c-* devnodes usually requires root on usual distros, and exploiting it would require a DVB board or USB stick, the risk is not high" * 'topic/kbuild-fixes-for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (28 commits) [media] platform drivers: Fix build on frv arch [media] lirc_zilog: Don't use dynamic static allocation [media] mxl111sf: Don't use dynamic static allocation [media] af9035: Don't use dynamic static allocation [media] af9015: Don't use dynamic static allocation [media] dw2102: Don't use dynamic static allocation [media] dibusb-common: Don't use dynamic static allocation [media] cxusb: Don't use dynamic static allocation [media] v4l2-async: Don't use dynamic static allocation [media] cimax2: Don't use dynamic static allocation [media] tuner-xc2028: Don't use dynamic static allocation [media] tuners: Don't use dynamic static allocation [media] av7110_hw: Don't use dynamic static allocation [media] stv090x: Don't use dynamic static allocation [media] stv0367: Don't use dynamic static allocation [media] stb0899_drv: Don't use dynamic static allocation [media] dvb-frontends: Don't use dynamic static allocation [media] dvb-frontends: Don't use dynamic static allocation [media] s5h1420: Don't use dynamic static allocation [media] uvc/lirc_serial: Fix some warnings on parisc arch ...
This commit is contained in:
@@ -24,6 +24,9 @@
|
||||
|
||||
#include "af9013_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
struct af9013_state {
|
||||
struct i2c_adapter *i2c;
|
||||
struct dvb_frontend fe;
|
||||
@@ -50,16 +53,23 @@ static int af9013_wr_regs_i2c(struct af9013_state *priv, u8 mbox, u16 reg,
|
||||
const u8 *val, int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[3+len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[1] = {
|
||||
{
|
||||
.addr = priv->config.i2c_addr,
|
||||
.flags = 0,
|
||||
.len = sizeof(buf),
|
||||
.len = 3 + len,
|
||||
.buf = buf,
|
||||
}
|
||||
};
|
||||
|
||||
if (3 + len > sizeof(buf)) {
|
||||
dev_warn(&priv->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = (reg >> 8) & 0xff;
|
||||
buf[1] = (reg >> 0) & 0xff;
|
||||
buf[2] = mbox;
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
|
||||
#include "af9033_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
struct af9033_state {
|
||||
struct i2c_adapter *i2c;
|
||||
struct dvb_frontend fe;
|
||||
@@ -40,16 +43,23 @@ static int af9033_wr_regs(struct af9033_state *state, u32 reg, const u8 *val,
|
||||
int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[3 + len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[1] = {
|
||||
{
|
||||
.addr = state->cfg.i2c_addr,
|
||||
.flags = 0,
|
||||
.len = sizeof(buf),
|
||||
.len = 3 + len,
|
||||
.buf = buf,
|
||||
}
|
||||
};
|
||||
|
||||
if (3 + len > sizeof(buf)) {
|
||||
dev_warn(&state->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = (reg >> 16) & 0xff;
|
||||
buf[1] = (reg >> 8) & 0xff;
|
||||
buf[2] = (reg >> 0) & 0xff;
|
||||
@@ -161,7 +171,14 @@ static int af9033_wr_reg_val_tab(struct af9033_state *state,
|
||||
const struct reg_val *tab, int tab_len)
|
||||
{
|
||||
int ret, i, j;
|
||||
u8 buf[tab_len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
|
||||
if (tab_len > sizeof(buf)) {
|
||||
dev_warn(&state->i2c->dev,
|
||||
"%s: i2c wr len=%d is too big!\n",
|
||||
KBUILD_MODNAME, tab_len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len);
|
||||
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
#include "bcm3510.h"
|
||||
#include "bcm3510_priv.h"
|
||||
|
||||
/* Max transfer size done by bcm3510_do_hab_cmd() function */
|
||||
#define MAX_XFER_SIZE 128
|
||||
|
||||
struct bcm3510_state {
|
||||
|
||||
struct i2c_adapter* i2c;
|
||||
@@ -201,9 +204,19 @@ static int bcm3510_hab_send_request(struct bcm3510_state *st, u8 *buf, int len)
|
||||
|
||||
static int bcm3510_do_hab_cmd(struct bcm3510_state *st, u8 cmd, u8 msgid, u8 *obuf, u8 olen, u8 *ibuf, u8 ilen)
|
||||
{
|
||||
u8 ob[olen+2],ib[ilen+2];
|
||||
u8 ob[MAX_XFER_SIZE], ib[MAX_XFER_SIZE];
|
||||
int ret = 0;
|
||||
|
||||
if (ilen + 2 > sizeof(ib)) {
|
||||
deb_hab("do_hab_cmd: ilen=%d is too big!\n", ilen);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (olen + 2 > sizeof(ob)) {
|
||||
deb_hab("do_hab_cmd: olen=%d is too big!\n", olen);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ob[0] = cmd;
|
||||
ob[1] = msgid;
|
||||
memcpy(&ob[2],obuf,olen);
|
||||
|
||||
@@ -21,12 +21,15 @@
|
||||
|
||||
#include "cxd2820r_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
/* write multiple registers */
|
||||
static int cxd2820r_wr_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg,
|
||||
u8 *val, int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[len+1];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[1] = {
|
||||
{
|
||||
.addr = i2c,
|
||||
@@ -36,6 +39,13 @@ static int cxd2820r_wr_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg,
|
||||
}
|
||||
};
|
||||
|
||||
if (1 + len > sizeof(buf)) {
|
||||
dev_warn(&priv->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = reg;
|
||||
memcpy(&buf[1], val, len);
|
||||
|
||||
@@ -55,7 +65,7 @@ static int cxd2820r_rd_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg,
|
||||
u8 *val, int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[2] = {
|
||||
{
|
||||
.addr = i2c,
|
||||
@@ -70,6 +80,13 @@ static int cxd2820r_rd_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg,
|
||||
}
|
||||
};
|
||||
|
||||
if (len > sizeof(buf)) {
|
||||
dev_warn(&priv->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = i2c_transfer(priv->i2c, msg, 2);
|
||||
if (ret == 2) {
|
||||
memcpy(val, buf, len);
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
#include "itd1000.h"
|
||||
#include "itd1000_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
static int debug;
|
||||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
|
||||
@@ -52,10 +55,18 @@ MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
|
||||
/* don't write more than one byte with flexcop behind */
|
||||
static int itd1000_write_regs(struct itd1000_state *state, u8 reg, u8 v[], u8 len)
|
||||
{
|
||||
u8 buf[1+len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg = {
|
||||
.addr = state->cfg->i2c_address, .flags = 0, .buf = buf, .len = len+1
|
||||
};
|
||||
|
||||
if (1 + len > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"itd1000: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = reg;
|
||||
memcpy(&buf[1], v, len);
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "mt312_priv.h"
|
||||
#include "mt312.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
struct mt312_state {
|
||||
struct i2c_adapter *i2c;
|
||||
@@ -96,9 +98,15 @@ static int mt312_write(struct mt312_state *state, const enum mt312_reg_addr reg,
|
||||
const u8 *src, const size_t count)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[count + 1];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg;
|
||||
|
||||
if (1 + count > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"mt312: write: len=%zd is too big!\n", count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (debug) {
|
||||
int i;
|
||||
dprintk("W(%d):", reg & 0x7f);
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
#define NXT2002_DEFAULT_FIRMWARE "dvb-fe-nxt2002.fw"
|
||||
#define NXT2004_DEFAULT_FIRMWARE "dvb-fe-nxt2004.fw"
|
||||
#define CRC_CCIT_MASK 0x1021
|
||||
@@ -95,10 +98,16 @@ static int i2c_readbytes(struct nxt200x_state *state, u8 addr, u8 *buf, u8 len)
|
||||
static int nxt200x_writebytes (struct nxt200x_state* state, u8 reg,
|
||||
const u8 *buf, u8 len)
|
||||
{
|
||||
u8 buf2 [len+1];
|
||||
u8 buf2[MAX_XFER_SIZE];
|
||||
int err;
|
||||
struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf2, .len = len + 1 };
|
||||
|
||||
if (1 + len > sizeof(buf2)) {
|
||||
pr_warn("%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
__func__, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf2[0] = reg;
|
||||
memcpy(&buf2[1], buf, len);
|
||||
|
||||
|
||||
@@ -27,20 +27,30 @@
|
||||
|
||||
#include "rtl2830_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
/* write multiple hardware registers */
|
||||
static int rtl2830_wr(struct rtl2830_priv *priv, u8 reg, const u8 *val, int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[1+len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[1] = {
|
||||
{
|
||||
.addr = priv->cfg.i2c_addr,
|
||||
.flags = 0,
|
||||
.len = 1+len,
|
||||
.len = 1 + len,
|
||||
.buf = buf,
|
||||
}
|
||||
};
|
||||
|
||||
if (1 + len > sizeof(buf)) {
|
||||
dev_warn(&priv->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = reg;
|
||||
memcpy(&buf[1], val, len);
|
||||
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
#include "dvb_math.h"
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
int rtl2832_debug;
|
||||
module_param_named(debug, rtl2832_debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
|
||||
@@ -162,16 +165,23 @@ static const struct rtl2832_reg_entry registers[] = {
|
||||
static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[1+len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[1] = {
|
||||
{
|
||||
.addr = priv->cfg.i2c_addr,
|
||||
.flags = 0,
|
||||
.len = 1+len,
|
||||
.len = 1 + len,
|
||||
.buf = buf,
|
||||
}
|
||||
};
|
||||
|
||||
if (1 + len > sizeof(buf)) {
|
||||
dev_warn(&priv->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = reg;
|
||||
memcpy(&buf[1], val, len);
|
||||
|
||||
|
||||
@@ -836,9 +836,16 @@ static u32 s5h1420_tuner_i2c_func(struct i2c_adapter *adapter)
|
||||
static int s5h1420_tuner_i2c_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
|
||||
{
|
||||
struct s5h1420_state *state = i2c_get_adapdata(i2c_adap);
|
||||
struct i2c_msg m[1 + num];
|
||||
struct i2c_msg m[3];
|
||||
u8 tx_open[2] = { CON_1, state->CON_1_val | 1 }; /* repeater stops once there was a stop condition */
|
||||
|
||||
if (1 + num > ARRAY_SIZE(m)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c xfer: num=%d is too big!\n",
|
||||
KBUILD_MODNAME, num);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
memset(m, 0, sizeof(struct i2c_msg) * (1 + num));
|
||||
|
||||
m[0].addr = state->config->demod_address;
|
||||
@@ -847,7 +854,7 @@ static int s5h1420_tuner_i2c_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c
|
||||
|
||||
memcpy(&m[1], msg, sizeof(struct i2c_msg) * num);
|
||||
|
||||
return i2c_transfer(state->i2c, m, 1+num) == 1 + num ? num : -EIO;
|
||||
return i2c_transfer(state->i2c, m, 1 + num) == 1 + num ? num : -EIO;
|
||||
}
|
||||
|
||||
static struct i2c_algorithm s5h1420_tuner_i2c_algo = {
|
||||
|
||||
@@ -32,6 +32,9 @@
|
||||
#include "stb0899_priv.h"
|
||||
#include "stb0899_reg.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
static unsigned int verbose = 0;//1;
|
||||
module_param(verbose, int, 0644);
|
||||
|
||||
@@ -499,7 +502,7 @@ err:
|
||||
int stb0899_write_regs(struct stb0899_state *state, unsigned int reg, u8 *data, u32 count)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[2 + count];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg i2c_msg = {
|
||||
.addr = state->config->demod_address,
|
||||
.flags = 0,
|
||||
@@ -507,6 +510,13 @@ int stb0899_write_regs(struct stb0899_state *state, unsigned int reg, u8 *data,
|
||||
.len = 2 + count
|
||||
};
|
||||
|
||||
if (2 + count > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = reg >> 8;
|
||||
buf[1] = reg & 0xff;
|
||||
memcpy(&buf[2], data, count);
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
static unsigned int verbose;
|
||||
module_param(verbose, int, 0644);
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
#define FE_ERROR 0
|
||||
#define FE_NOTICE 1
|
||||
@@ -183,7 +185,7 @@ static int stb6100_read_reg(struct stb6100_state *state, u8 reg)
|
||||
static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int start, int len)
|
||||
{
|
||||
int rc;
|
||||
u8 cmdbuf[len + 1];
|
||||
u8 cmdbuf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg = {
|
||||
.addr = state->config->tuner_address,
|
||||
.flags = 0,
|
||||
@@ -191,6 +193,13 @@ static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int st
|
||||
.len = len + 1
|
||||
};
|
||||
|
||||
if (1 + len > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(start < 1 || start + len > STB6100_NUMREGS)) {
|
||||
dprintk(verbose, FE_ERROR, 1, "Invalid register range %d:%d",
|
||||
start, len);
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
#include "stv0367_regs.h"
|
||||
#include "stv0367_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
static int stvdebug;
|
||||
module_param_named(debug, stvdebug, int, 0644);
|
||||
|
||||
@@ -767,7 +770,7 @@ static struct st_register def0367cab[STV0367CAB_NBREGS] = {
|
||||
static
|
||||
int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len)
|
||||
{
|
||||
u8 buf[len + 2];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg = {
|
||||
.addr = state->config->demod_address,
|
||||
.flags = 0,
|
||||
@@ -776,6 +779,14 @@ int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len)
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (2 + len > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
buf[0] = MSB(reg);
|
||||
buf[1] = LSB(reg);
|
||||
memcpy(buf + 2, data, len);
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
#include "stv090x.h"
|
||||
#include "stv090x_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
static unsigned int verbose;
|
||||
module_param(verbose, int, 0644);
|
||||
|
||||
@@ -722,9 +725,16 @@ static int stv090x_write_regs(struct stv090x_state *state, unsigned int reg, u8
|
||||
{
|
||||
const struct stv090x_config *config = state->config;
|
||||
int ret;
|
||||
u8 buf[2 + count];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg i2c_msg = { .addr = config->address, .flags = 0, .buf = buf, .len = 2 + count };
|
||||
|
||||
if (2 + count > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = reg >> 8;
|
||||
buf[1] = reg & 0xff;
|
||||
memcpy(&buf[2], data, count);
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
|
||||
#include "stv6110.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
static int debug;
|
||||
|
||||
struct stv6110_priv {
|
||||
@@ -68,7 +71,7 @@ static int stv6110_write_regs(struct dvb_frontend *fe, u8 buf[],
|
||||
{
|
||||
struct stv6110_priv *priv = fe->tuner_priv;
|
||||
int rc;
|
||||
u8 cmdbuf[len + 1];
|
||||
u8 cmdbuf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg = {
|
||||
.addr = priv->i2c_address,
|
||||
.flags = 0,
|
||||
@@ -78,6 +81,13 @@ static int stv6110_write_regs(struct dvb_frontend *fe, u8 buf[],
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
|
||||
if (1 + len > sizeof(cmdbuf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (start + len > 8)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -32,6 +32,9 @@
|
||||
#include "stv6110x.h"
|
||||
#include "stv6110x_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
static unsigned int verbose;
|
||||
module_param(verbose, int, 0644);
|
||||
MODULE_PARM_DESC(verbose, "Set Verbosity level");
|
||||
@@ -61,7 +64,8 @@ static int stv6110x_write_regs(struct stv6110x_state *stv6110x, int start, u8 da
|
||||
{
|
||||
int ret;
|
||||
const struct stv6110x_config *config = stv6110x->config;
|
||||
u8 buf[len + 1];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
|
||||
struct i2c_msg msg = {
|
||||
.addr = config->addr,
|
||||
.flags = 0,
|
||||
@@ -69,6 +73,13 @@ static int stv6110x_write_regs(struct stv6110x_state *stv6110x, int start, u8 da
|
||||
.len = len + 1
|
||||
};
|
||||
|
||||
if (1 + len > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (start + len > 8)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
|
||||
#include "tda10071_priv.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
static struct dvb_frontend_ops tda10071_ops;
|
||||
|
||||
/* write multiple registers */
|
||||
@@ -27,16 +30,23 @@ static int tda10071_wr_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
|
||||
int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[len+1];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[1] = {
|
||||
{
|
||||
.addr = priv->cfg.demod_i2c_addr,
|
||||
.flags = 0,
|
||||
.len = sizeof(buf),
|
||||
.len = 1 + len,
|
||||
.buf = buf,
|
||||
}
|
||||
};
|
||||
|
||||
if (1 + len > sizeof(buf)) {
|
||||
dev_warn(&priv->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf[0] = reg;
|
||||
memcpy(&buf[1], val, len);
|
||||
|
||||
@@ -56,7 +66,7 @@ static int tda10071_rd_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
|
||||
int len)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[len];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg[2] = {
|
||||
{
|
||||
.addr = priv->cfg.demod_i2c_addr,
|
||||
@@ -66,11 +76,18 @@ static int tda10071_rd_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
|
||||
}, {
|
||||
.addr = priv->cfg.demod_i2c_addr,
|
||||
.flags = I2C_M_RD,
|
||||
.len = sizeof(buf),
|
||||
.len = len,
|
||||
.buf = buf,
|
||||
}
|
||||
};
|
||||
|
||||
if (len > sizeof(buf)) {
|
||||
dev_warn(&priv->i2c->dev,
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = i2c_transfer(priv->i2c, msg, 2);
|
||||
if (ret == 2) {
|
||||
memcpy(val, buf, len);
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
#include "dvb_frontend.h"
|
||||
#include "tda18271c2dd.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
struct SStandardParam {
|
||||
s32 m_IFFrequency;
|
||||
u32 m_BandWidth;
|
||||
@@ -139,11 +142,18 @@ static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
|
||||
static int WriteRegs(struct tda_state *state,
|
||||
u8 SubAddr, u8 *Regs, u16 nRegs)
|
||||
{
|
||||
u8 data[nRegs+1];
|
||||
u8 data[MAX_XFER_SIZE];
|
||||
|
||||
if (1 + nRegs > sizeof(data)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, nRegs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data[0] = SubAddr;
|
||||
memcpy(data + 1, Regs, nRegs);
|
||||
return i2c_write(state->i2c, state->adr, data, nRegs+1);
|
||||
return i2c_write(state->i2c, state->adr, data, nRegs + 1);
|
||||
}
|
||||
|
||||
static int WriteReg(struct tda_state *state, u8 SubAddr, u8 Reg)
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
|
||||
static int debug;
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
|
||||
#define dprintk(args...) \
|
||||
do { \
|
||||
if (debug) \
|
||||
@@ -98,7 +101,7 @@ static int zl10039_write(struct zl10039_state *state,
|
||||
const enum zl10039_reg_addr reg, const u8 *src,
|
||||
const size_t count)
|
||||
{
|
||||
u8 buf[count + 1];
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct i2c_msg msg = {
|
||||
.addr = state->i2c_addr,
|
||||
.flags = 0,
|
||||
@@ -106,6 +109,13 @@ static int zl10039_write(struct zl10039_state *state,
|
||||
.len = count + 1,
|
||||
};
|
||||
|
||||
if (1 + count > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr reg=%04x: len=%zd is too big!\n",
|
||||
KBUILD_MODNAME, reg, count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
/* Write register address and data in one go */
|
||||
buf[0] = reg;
|
||||
|
||||
@@ -324,23 +324,24 @@ static void cx18_eeprom_dump(struct cx18 *cx, unsigned char *eedata, int len)
|
||||
/* Hauppauge card? get values from tveeprom */
|
||||
void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
|
||||
{
|
||||
struct i2c_client c;
|
||||
struct i2c_client *c;
|
||||
u8 eedata[256];
|
||||
|
||||
memset(&c, 0, sizeof(c));
|
||||
strlcpy(c.name, "cx18 tveeprom tmp", sizeof(c.name));
|
||||
c.adapter = &cx->i2c_adap[0];
|
||||
c.addr = 0xA0 >> 1;
|
||||
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
|
||||
strlcpy(c->name, "cx18 tveeprom tmp", sizeof(c->name));
|
||||
c->adapter = &cx->i2c_adap[0];
|
||||
c->addr = 0xa0 >> 1;
|
||||
|
||||
memset(tv, 0, sizeof(*tv));
|
||||
if (tveeprom_read(&c, eedata, sizeof(eedata)))
|
||||
return;
|
||||
if (tveeprom_read(c, eedata, sizeof(eedata)))
|
||||
goto ret;
|
||||
|
||||
switch (cx->card->type) {
|
||||
case CX18_CARD_HVR_1600_ESMT:
|
||||
case CX18_CARD_HVR_1600_SAMSUNG:
|
||||
case CX18_CARD_HVR_1600_S5H1411:
|
||||
tveeprom_hauppauge_analog(&c, tv, eedata);
|
||||
tveeprom_hauppauge_analog(c, tv, eedata);
|
||||
break;
|
||||
case CX18_CARD_YUAN_MPC718:
|
||||
case CX18_CARD_GOTVIEW_PCI_DVD3:
|
||||
@@ -354,6 +355,9 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
|
||||
cx18_eeprom_dump(cx, eedata, sizeof(eedata));
|
||||
break;
|
||||
}
|
||||
|
||||
ret:
|
||||
kfree(c);
|
||||
}
|
||||
|
||||
static void cx18_process_eeprom(struct cx18 *cx)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user