Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 306101
b: refs/heads/master
c: b1a9599
h: refs/heads/master
i:
  306099: 234f777
v: v3
  • Loading branch information
Michael Büsch authored and Mauro Carvalho Chehab committed Apr 9, 2012
1 parent 562a9b0 commit 54424e9
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 812fe6d9426a23ad78055f1fa955acef9bea9a93
refs/heads/master: b1a9599a0d228d6555ad9e5c1fe0b0dfac7c5ccb
45 changes: 35 additions & 10 deletions trunk/drivers/media/dvb/dvb-usb/af9035.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,22 @@ static struct af9033_config af9035_af9033_config[] = {
}
};

static u16 af9035_checksum(const u8 *buf, size_t len)
{
size_t i;
u16 checksum = 0;

for (i = 1; i < len; i++) {
if (i % 2)
checksum += buf[i] << 8;
else
checksum += buf[i];
}
checksum = ~checksum;

return checksum;
}

static int af9035_ctrl_msg(struct usb_device *udev, struct usb_req *req)
{
#define BUF_LEN 63
Expand All @@ -44,11 +60,11 @@ static int af9035_ctrl_msg(struct usb_device *udev, struct usb_req *req)
#define CHECKSUM_LEN 2
#define USB_TIMEOUT 2000

int ret, i, act_len;
int ret, act_len;
u8 buf[BUF_LEN];
u32 msg_len;
static u8 seq; /* packet sequence number */
u16 checksum = 0;
u16 checksum, tmpsum;

/* buffer overflow check */
if (req->wlen > (BUF_LEN - REQ_HDR_LEN - CHECKSUM_LEN) ||
Expand All @@ -69,14 +85,7 @@ static int af9035_ctrl_msg(struct usb_device *udev, struct usb_req *req)
memcpy(&buf[4], req->wbuf, req->wlen);

/* calc and add checksum */
for (i = 1; i < buf[0]-1; i++) {
if (i % 2)
checksum += buf[i] << 8;
else
checksum += buf[i];
}
checksum = ~checksum;

checksum = af9035_checksum(buf, buf[0] - 1);
buf[buf[0]-1] = (checksum >> 8);
buf[buf[0]-0] = (checksum & 0xff);

Expand Down Expand Up @@ -106,7 +115,23 @@ static int af9035_ctrl_msg(struct usb_device *udev, struct usb_req *req)
ret = -EIO;
goto err_mutex_unlock;
}
if (act_len != msg_len) {
err("recv bulk message truncated (%d != %u)\n",
act_len, (unsigned int)msg_len);
ret = -EIO;
goto err_mutex_unlock;
}

/* verify checksum */
checksum = af9035_checksum(buf, act_len - 2);
tmpsum = (buf[act_len - 2] << 8) | buf[act_len - 1];
if (tmpsum != checksum) {
err("%s: command=%02X checksum mismatch (%04X != %04X)\n",
__func__, req->cmd,
(unsigned int)tmpsum, (unsigned int)checksum);
ret = -EIO;
goto err_mutex_unlock;
}
/* check status */
if (buf[2]) {
pr_debug("%s: command=%02x failed fw error=%d\n", __func__,
Expand Down

0 comments on commit 54424e9

Please sign in to comment.