diff options
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/anysee.c | 27 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/anysee.h | 3 |
2 files changed, 14 insertions, 16 deletions
diff --git a/drivers/media/usb/dvb-usb-v2/anysee.c b/drivers/media/usb/dvb-usb-v2/anysee.c index a20d691d0b63..85ba24650f01 100644 --- a/drivers/media/usb/dvb-usb-v2/anysee.c +++ b/drivers/media/usb/dvb-usb-v2/anysee.c | |||
@@ -45,25 +45,24 @@ | |||
45 | #include "cxd2820r.h" | 45 | #include "cxd2820r.h" |
46 | 46 | ||
47 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 47 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
48 | static DEFINE_MUTEX(anysee_usb_mutex); | ||
49 | 48 | ||
50 | static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen, | 49 | static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen, |
51 | u8 *rbuf, u8 rlen) | 50 | u8 *rbuf, u8 rlen) |
52 | { | 51 | { |
53 | struct anysee_state *state = d_to_priv(d); | 52 | struct anysee_state *state = d_to_priv(d); |
54 | int act_len, ret, i; | 53 | int act_len, ret, i; |
55 | u8 buf[64]; | ||
56 | 54 | ||
57 | memcpy(&buf[0], sbuf, slen); | 55 | mutex_lock(&d->usb_mutex); |
58 | buf[60] = state->seq++; | ||
59 | 56 | ||
60 | mutex_lock(&anysee_usb_mutex); | 57 | memcpy(&state->buf[0], sbuf, slen); |
58 | state->buf[60] = state->seq++; | ||
61 | 59 | ||
62 | dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, buf); | 60 | dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, state->buf); |
63 | 61 | ||
64 | /* We need receive one message more after dvb_usb_generic_rw due | 62 | /* We need receive one message more after dvb_usb_generic_rw due |
65 | to weird transaction flow, which is 1 x send + 2 x receive. */ | 63 | to weird transaction flow, which is 1 x send + 2 x receive. */ |
66 | ret = dvb_usbv2_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf)); | 64 | ret = dvb_usbv2_generic_rw_locked(d, state->buf, sizeof(state->buf), |
65 | state->buf, sizeof(state->buf)); | ||
67 | if (ret) | 66 | if (ret) |
68 | goto error_unlock; | 67 | goto error_unlock; |
69 | 68 | ||
@@ -82,17 +81,16 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen, | |||
82 | for (i = 0; i < 3; i++) { | 81 | for (i = 0; i < 3; i++) { |
83 | /* receive 2nd answer */ | 82 | /* receive 2nd answer */ |
84 | ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, | 83 | ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, |
85 | d->props->generic_bulk_ctrl_endpoint), buf, sizeof(buf), | 84 | d->props->generic_bulk_ctrl_endpoint), |
86 | &act_len, 2000); | 85 | state->buf, sizeof(state->buf), &act_len, 2000); |
87 | |||
88 | if (ret) { | 86 | if (ret) { |
89 | dev_dbg(&d->udev->dev, "%s: recv bulk message " \ | 87 | dev_dbg(&d->udev->dev, "%s: recv bulk message " \ |
90 | "failed=%d\n", __func__, ret); | 88 | "failed=%d\n", __func__, ret); |
91 | } else { | 89 | } else { |
92 | dev_dbg(&d->udev->dev, "%s: <<< %*ph\n", __func__, | 90 | dev_dbg(&d->udev->dev, "%s: <<< %*ph\n", __func__, |
93 | rlen, buf); | 91 | rlen, state->buf); |
94 | 92 | ||
95 | if (buf[63] != 0x4f) | 93 | if (state->buf[63] != 0x4f) |
96 | dev_dbg(&d->udev->dev, "%s: cmd failed\n", | 94 | dev_dbg(&d->udev->dev, "%s: cmd failed\n", |
97 | __func__); | 95 | __func__); |
98 | 96 | ||
@@ -109,11 +107,10 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen, | |||
109 | 107 | ||
110 | /* read request, copy returned data to return buf */ | 108 | /* read request, copy returned data to return buf */ |
111 | if (rbuf && rlen) | 109 | if (rbuf && rlen) |
112 | memcpy(rbuf, buf, rlen); | 110 | memcpy(rbuf, state->buf, rlen); |
113 | 111 | ||
114 | error_unlock: | 112 | error_unlock: |
115 | mutex_unlock(&anysee_usb_mutex); | 113 | mutex_unlock(&d->usb_mutex); |
116 | |||
117 | return ret; | 114 | return ret; |
118 | } | 115 | } |
119 | 116 | ||
diff --git a/drivers/media/usb/dvb-usb-v2/anysee.h b/drivers/media/usb/dvb-usb-v2/anysee.h index c1a4273f14ff..8f426d9fc6e1 100644 --- a/drivers/media/usb/dvb-usb-v2/anysee.h +++ b/drivers/media/usb/dvb-usb-v2/anysee.h | |||
@@ -52,8 +52,9 @@ enum cmd { | |||
52 | }; | 52 | }; |
53 | 53 | ||
54 | struct anysee_state { | 54 | struct anysee_state { |
55 | u8 hw; /* PCB ID */ | 55 | u8 buf[64]; |
56 | u8 seq; | 56 | u8 seq; |
57 | u8 hw; /* PCB ID */ | ||
57 | u8 fe_id:1; /* frondend ID */ | 58 | u8 fe_id:1; /* frondend ID */ |
58 | u8 has_ci:1; | 59 | u8 has_ci:1; |
59 | u8 ci_attached:1; | 60 | u8 ci_attached:1; |