aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-05-17 00:04:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-05-17 00:04:56 -0400
commit3f4741b1d863f624e8632b3283af5eabe35c2fca (patch)
tree450df928579a5db36ca450ab44ae12d51d9fbe31 /drivers
parent148c46f3e12bfd877c4fcec986f55988f21b0857 (diff)
parentec94efcdadab69f41d257a1054260f8295ab77ef (diff)
Merge tag 'staging-4.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging / IIO driver fixes from Greg KH: "Here's some staging and iio driver fixes to resolve a number of reported issues. All of these have been in linux-next for a while" * tag 'staging-4.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (31 commits) iio: light: hid-sensor-prox: Fix memory leak in probe() iio: adc: cc10001: Add delay before setting START bit iio: adc: cc10001: Fix regulator_get_voltage() return value check iio: adc: cc10001: Fix incorrect use of power-up/power-down register staging: gdm724x: Correction of variable usage after applying ALIGN() iio: adc: cc10001: Fix the channel number mapping staging: vt6655: lock MACvWriteBSSIDAddress. staging: vt6655: CARDbUpdateTSF bss timestamp correct tsf counter value. staging: vt6655: vnt_tx_packet Correct TX order of OWNED_BY_NIC staging: vt6655: Fix 80211 control and management status reporting. staging: vt6655: implement IEEE80211_TX_STAT_NOACK_TRANSMITTED staging: vt6655: device_free_tx_buf use only ieee80211_tx_status_irqsafe staging: vt6656: use ieee80211_tx_info to select packet type. staging: rtl8712: freeing an ERR_PTR staging: sm750: remove incorrect __exit annotation iio: kfifo: Set update_needed to false only if a buffer was allocated iio: mcp320x: Fix occasional incorrect readings iio: accel: mma9553: check input value for activity period iio: accel: mma9553: add enable channel for activity iio: accel: mma9551_core: prevent buffer overrun ...
Diffstat (limited to 'drivers')
-rw-r--r--drivers/iio/accel/mma9551_core.c21
-rw-r--r--drivers/iio/accel/mma9553.c18
-rw-r--r--drivers/iio/accel/st_accel_core.c1
-rw-r--r--drivers/iio/adc/axp288_adc.c12
-rw-r--r--drivers/iio/adc/cc10001_adc.c60
-rw-r--r--drivers/iio/adc/mcp320x.c6
-rw-r--r--drivers/iio/adc/qcom-spmi-vadc.c7
-rw-r--r--drivers/iio/adc/xilinx-xadc-core.c5
-rw-r--r--drivers/iio/adc/xilinx-xadc.h6
-rw-r--r--drivers/iio/common/st_sensors/st_sensors_core.c2
-rw-r--r--drivers/iio/gyro/st_gyro_core.c1
-rw-r--r--drivers/iio/kfifo_buf.c3
-rw-r--r--drivers/iio/light/hid-sensor-prox.c12
-rw-r--r--drivers/iio/magnetometer/st_magn_core.c1
-rw-r--r--drivers/iio/pressure/bmp280.c1
-rw-r--r--drivers/iio/pressure/hid-sensor-press.c2
-rw-r--r--drivers/iio/pressure/st_pressure_core.c1
-rw-r--r--drivers/staging/gdm724x/gdm_mux.c16
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl_linux.c17
-rw-r--r--drivers/staging/sm750fb/sm750.c2
-rw-r--r--drivers/staging/vt6655/card.c10
-rw-r--r--drivers/staging/vt6655/card.h2
-rw-r--r--drivers/staging/vt6655/device_main.c42
-rw-r--r--drivers/staging/vt6656/rxtx.c14
24 files changed, 152 insertions, 110 deletions
diff --git a/drivers/iio/accel/mma9551_core.c b/drivers/iio/accel/mma9551_core.c
index 7f55a6d7cd03..c6d5a3a40b60 100644
--- a/drivers/iio/accel/mma9551_core.c
+++ b/drivers/iio/accel/mma9551_core.c
@@ -389,7 +389,12 @@ int mma9551_read_config_words(struct i2c_client *client, u8 app_id,
389{ 389{
390 int ret, i; 390 int ret, i;
391 int len_words = len / sizeof(u16); 391 int len_words = len / sizeof(u16);
392 __be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS]; 392 __be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS / 2];
393
394 if (len_words > ARRAY_SIZE(be_buf)) {
395 dev_err(&client->dev, "Invalid buffer size %d\n", len);
396 return -EINVAL;
397 }
393 398
394 ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_CONFIG, 399 ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_CONFIG,
395 reg, NULL, 0, (u8 *) be_buf, len); 400 reg, NULL, 0, (u8 *) be_buf, len);
@@ -424,7 +429,12 @@ int mma9551_read_status_words(struct i2c_client *client, u8 app_id,
424{ 429{
425 int ret, i; 430 int ret, i;
426 int len_words = len / sizeof(u16); 431 int len_words = len / sizeof(u16);
427 __be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS]; 432 __be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS / 2];
433
434 if (len_words > ARRAY_SIZE(be_buf)) {
435 dev_err(&client->dev, "Invalid buffer size %d\n", len);
436 return -EINVAL;
437 }
428 438
429 ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_STATUS, 439 ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_STATUS,
430 reg, NULL, 0, (u8 *) be_buf, len); 440 reg, NULL, 0, (u8 *) be_buf, len);
@@ -459,7 +469,12 @@ int mma9551_write_config_words(struct i2c_client *client, u8 app_id,
459{ 469{
460 int i; 470 int i;
461 int len_words = len / sizeof(u16); 471 int len_words = len / sizeof(u16);
462 __be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS]; 472 __be16 be_buf[(MMA9551_MAX_MAILBOX_DATA_REGS - 1) / 2];
473
474 if (len_words > ARRAY_SIZE(be_buf)) {
475 dev_err(&client->dev, "Invalid buffer size %d\n", len);
476 return -EINVAL;
477 }
463 478
464 for (i = 0; i < len_words; i++) 479 for (i = 0; i < len_words; i++)
465 be_buf[i] = cpu_to_be16(buf[i]); 480 be_buf[i] = cpu_to_be16(buf[i]);
diff --git a/drivers/iio/accel/mma9553.c b/drivers/iio/accel/mma9553.c
index 2df1af7d43fc..365a109aaaef 100644
--- a/drivers/iio/accel/mma9553.c
+++ b/drivers/iio/accel/mma9553.c
@@ -54,6 +54,7 @@
54#define MMA9553_MASK_CONF_STEPCOALESCE GENMASK(7, 0) 54#define MMA9553_MASK_CONF_STEPCOALESCE GENMASK(7, 0)
55 55
56#define MMA9553_REG_CONF_ACTTHD 0x0E 56#define MMA9553_REG_CONF_ACTTHD 0x0E
57#define MMA9553_MAX_ACTTHD GENMASK(15, 0)
57 58
58/* Pedometer status registers (R-only) */ 59/* Pedometer status registers (R-only) */
59#define MMA9553_REG_STATUS 0x00 60#define MMA9553_REG_STATUS 0x00
@@ -316,22 +317,19 @@ static int mma9553_set_config(struct mma9553_data *data, u16 reg,
316static int mma9553_read_activity_stepcnt(struct mma9553_data *data, 317static int mma9553_read_activity_stepcnt(struct mma9553_data *data,
317 u8 *activity, u16 *stepcnt) 318 u8 *activity, u16 *stepcnt)
318{ 319{
319 u32 status_stepcnt; 320 u16 buf[2];
320 u16 status;
321 int ret; 321 int ret;
322 322
323 ret = mma9551_read_status_words(data->client, MMA9551_APPID_PEDOMETER, 323 ret = mma9551_read_status_words(data->client, MMA9551_APPID_PEDOMETER,
324 MMA9553_REG_STATUS, sizeof(u32), 324 MMA9553_REG_STATUS, sizeof(u32), buf);
325 (u16 *) &status_stepcnt);
326 if (ret < 0) { 325 if (ret < 0) {
327 dev_err(&data->client->dev, 326 dev_err(&data->client->dev,
328 "error reading status and stepcnt\n"); 327 "error reading status and stepcnt\n");
329 return ret; 328 return ret;
330 } 329 }
331 330
332 status = status_stepcnt & MMA9553_MASK_CONF_WORD; 331 *activity = mma9553_get_bits(buf[0], MMA9553_MASK_STATUS_ACTIVITY);
333 *activity = mma9553_get_bits(status, MMA9553_MASK_STATUS_ACTIVITY); 332 *stepcnt = buf[1];
334 *stepcnt = status_stepcnt >> 16;
335 333
336 return 0; 334 return 0;
337} 335}
@@ -872,6 +870,9 @@ static int mma9553_write_event_value(struct iio_dev *indio_dev,
872 case IIO_EV_INFO_PERIOD: 870 case IIO_EV_INFO_PERIOD:
873 switch (chan->type) { 871 switch (chan->type) {
874 case IIO_ACTIVITY: 872 case IIO_ACTIVITY:
873 if (val < 0 || val > MMA9553_ACTIVITY_THD_TO_SEC(
874 MMA9553_MAX_ACTTHD))
875 return -EINVAL;
875 mutex_lock(&data->mutex); 876 mutex_lock(&data->mutex);
876 ret = mma9553_set_config(data, MMA9553_REG_CONF_ACTTHD, 877 ret = mma9553_set_config(data, MMA9553_REG_CONF_ACTTHD,
877 &data->conf.actthd, 878 &data->conf.actthd,
@@ -971,7 +972,8 @@ static const struct iio_chan_spec_ext_info mma9553_ext_info[] = {
971 .modified = 1, \ 972 .modified = 1, \
972 .channel2 = _chan2, \ 973 .channel2 = _chan2, \
973 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \ 974 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \
974 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBHEIGHT), \ 975 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBHEIGHT) | \
976 BIT(IIO_CHAN_INFO_ENABLE), \
975 .event_spec = mma9553_activity_events, \ 977 .event_spec = mma9553_activity_events, \
976 .num_event_specs = ARRAY_SIZE(mma9553_activity_events), \ 978 .num_event_specs = ARRAY_SIZE(mma9553_activity_events), \
977 .ext_info = mma9553_ext_info, \ 979 .ext_info = mma9553_ext_info, \
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 58d1d13d552a..211b13271c61 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -546,6 +546,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
546 546
547 indio_dev->modes = INDIO_DIRECT_MODE; 547 indio_dev->modes = INDIO_DIRECT_MODE;
548 indio_dev->info = &accel_info; 548 indio_dev->info = &accel_info;
549 mutex_init(&adata->tb.buf_lock);
549 550
550 st_sensors_power_enable(indio_dev); 551 st_sensors_power_enable(indio_dev);
551 552
diff --git a/drivers/iio/adc/axp288_adc.c b/drivers/iio/adc/axp288_adc.c
index 08bcfb061ca5..56008a86b78f 100644
--- a/drivers/iio/adc/axp288_adc.c
+++ b/drivers/iio/adc/axp288_adc.c
@@ -53,39 +53,42 @@ static const struct iio_chan_spec const axp288_adc_channels[] = {
53 .channel = 0, 53 .channel = 0,
54 .address = AXP288_TS_ADC_H, 54 .address = AXP288_TS_ADC_H,
55 .datasheet_name = "TS_PIN", 55 .datasheet_name = "TS_PIN",
56 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
56 }, { 57 }, {
57 .indexed = 1, 58 .indexed = 1,
58 .type = IIO_TEMP, 59 .type = IIO_TEMP,
59 .channel = 1, 60 .channel = 1,
60 .address = AXP288_PMIC_ADC_H, 61 .address = AXP288_PMIC_ADC_H,
61 .datasheet_name = "PMIC_TEMP", 62 .datasheet_name = "PMIC_TEMP",
63 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
62 }, { 64 }, {
63 .indexed = 1, 65 .indexed = 1,
64 .type = IIO_TEMP, 66 .type = IIO_TEMP,
65 .channel = 2, 67 .channel = 2,
66 .address = AXP288_GP_ADC_H, 68 .address = AXP288_GP_ADC_H,
67 .datasheet_name = "GPADC", 69 .datasheet_name = "GPADC",
70 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
68 }, { 71 }, {
69 .indexed = 1, 72 .indexed = 1,
70 .type = IIO_CURRENT, 73 .type = IIO_CURRENT,
71 .channel = 3, 74 .channel = 3,
72 .address = AXP20X_BATT_CHRG_I_H, 75 .address = AXP20X_BATT_CHRG_I_H,
73 .datasheet_name = "BATT_CHG_I", 76 .datasheet_name = "BATT_CHG_I",
74 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), 77 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
75 }, { 78 }, {
76 .indexed = 1, 79 .indexed = 1,
77 .type = IIO_CURRENT, 80 .type = IIO_CURRENT,
78 .channel = 4, 81 .channel = 4,
79 .address = AXP20X_BATT_DISCHRG_I_H, 82 .address = AXP20X_BATT_DISCHRG_I_H,
80 .datasheet_name = "BATT_DISCHRG_I", 83 .datasheet_name = "BATT_DISCHRG_I",
81 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), 84 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
82 }, { 85 }, {
83 .indexed = 1, 86 .indexed = 1,
84 .type = IIO_VOLTAGE, 87 .type = IIO_VOLTAGE,
85 .channel = 5, 88 .channel = 5,
86 .address = AXP20X_BATT_V_H, 89 .address = AXP20X_BATT_V_H,
87 .datasheet_name = "BATT_V", 90 .datasheet_name = "BATT_V",
88 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), 91 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
89 }, 92 },
90}; 93};
91 94
@@ -151,9 +154,6 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev,
151 chan->address)) 154 chan->address))
152 dev_err(&indio_dev->dev, "TS pin restore\n"); 155 dev_err(&indio_dev->dev, "TS pin restore\n");
153 break; 156 break;
154 case IIO_CHAN_INFO_PROCESSED:
155 ret = axp288_adc_read_channel(val, chan->address, info->regmap);
156 break;
157 default: 157 default:
158 ret = -EINVAL; 158 ret = -EINVAL;
159 } 159 }
diff --git a/drivers/iio/adc/cc10001_adc.c b/drivers/iio/adc/cc10001_adc.c
index 51e2a83c9404..115f6e99a7fa 100644
--- a/drivers/iio/adc/cc10001_adc.c
+++ b/drivers/iio/adc/cc10001_adc.c
@@ -35,8 +35,9 @@
35#define CC10001_ADC_EOC_SET BIT(0) 35#define CC10001_ADC_EOC_SET BIT(0)
36 36
37#define CC10001_ADC_CHSEL_SAMPLED 0x0c 37#define CC10001_ADC_CHSEL_SAMPLED 0x0c
38#define CC10001_ADC_POWER_UP 0x10 38#define CC10001_ADC_POWER_DOWN 0x10
39#define CC10001_ADC_POWER_UP_SET BIT(0) 39#define CC10001_ADC_POWER_DOWN_SET BIT(0)
40
40#define CC10001_ADC_DEBUG 0x14 41#define CC10001_ADC_DEBUG 0x14
41#define CC10001_ADC_DATA_COUNT 0x20 42#define CC10001_ADC_DATA_COUNT 0x20
42 43
@@ -62,7 +63,6 @@ struct cc10001_adc_device {
62 u16 *buf; 63 u16 *buf;
63 64
64 struct mutex lock; 65 struct mutex lock;
65 unsigned long channel_map;
66 unsigned int start_delay_ns; 66 unsigned int start_delay_ns;
67 unsigned int eoc_delay_ns; 67 unsigned int eoc_delay_ns;
68}; 68};
@@ -79,6 +79,18 @@ static inline u32 cc10001_adc_read_reg(struct cc10001_adc_device *adc_dev,
79 return readl(adc_dev->reg_base + reg); 79 return readl(adc_dev->reg_base + reg);
80} 80}
81 81
82static void cc10001_adc_power_up(struct cc10001_adc_device *adc_dev)
83{
84 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN, 0);
85 ndelay(adc_dev->start_delay_ns);
86}
87
88static void cc10001_adc_power_down(struct cc10001_adc_device *adc_dev)
89{
90 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN,
91 CC10001_ADC_POWER_DOWN_SET);
92}
93
82static void cc10001_adc_start(struct cc10001_adc_device *adc_dev, 94static void cc10001_adc_start(struct cc10001_adc_device *adc_dev,
83 unsigned int channel) 95 unsigned int channel)
84{ 96{
@@ -88,6 +100,7 @@ static void cc10001_adc_start(struct cc10001_adc_device *adc_dev,
88 val = (channel & CC10001_ADC_CH_MASK) | CC10001_ADC_MODE_SINGLE_CONV; 100 val = (channel & CC10001_ADC_CH_MASK) | CC10001_ADC_MODE_SINGLE_CONV;
89 cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val); 101 cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val);
90 102
103 udelay(1);
91 val = cc10001_adc_read_reg(adc_dev, CC10001_ADC_CONFIG); 104 val = cc10001_adc_read_reg(adc_dev, CC10001_ADC_CONFIG);
92 val = val | CC10001_ADC_START_CONV; 105 val = val | CC10001_ADC_START_CONV;
93 cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val); 106 cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val);
@@ -129,6 +142,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
129 struct iio_dev *indio_dev; 142 struct iio_dev *indio_dev;
130 unsigned int delay_ns; 143 unsigned int delay_ns;
131 unsigned int channel; 144 unsigned int channel;
145 unsigned int scan_idx;
132 bool sample_invalid; 146 bool sample_invalid;
133 u16 *data; 147 u16 *data;
134 int i; 148 int i;
@@ -139,20 +153,17 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
139 153
140 mutex_lock(&adc_dev->lock); 154 mutex_lock(&adc_dev->lock);
141 155
142 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 156 cc10001_adc_power_up(adc_dev);
143 CC10001_ADC_POWER_UP_SET);
144
145 /* Wait for 8 (6+2) clock cycles before activating START */
146 ndelay(adc_dev->start_delay_ns);
147 157
148 /* Calculate delay step for eoc and sampled data */ 158 /* Calculate delay step for eoc and sampled data */
149 delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT; 159 delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
150 160
151 i = 0; 161 i = 0;
152 sample_invalid = false; 162 sample_invalid = false;
153 for_each_set_bit(channel, indio_dev->active_scan_mask, 163 for_each_set_bit(scan_idx, indio_dev->active_scan_mask,
154 indio_dev->masklength) { 164 indio_dev->masklength) {
155 165
166 channel = indio_dev->channels[scan_idx].channel;
156 cc10001_adc_start(adc_dev, channel); 167 cc10001_adc_start(adc_dev, channel);
157 168
158 data[i] = cc10001_adc_poll_done(indio_dev, channel, delay_ns); 169 data[i] = cc10001_adc_poll_done(indio_dev, channel, delay_ns);
@@ -166,7 +177,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
166 } 177 }
167 178
168done: 179done:
169 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0); 180 cc10001_adc_power_down(adc_dev);
170 181
171 mutex_unlock(&adc_dev->lock); 182 mutex_unlock(&adc_dev->lock);
172 183
@@ -185,11 +196,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev,
185 unsigned int delay_ns; 196 unsigned int delay_ns;
186 u16 val; 197 u16 val;
187 198
188 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 199 cc10001_adc_power_up(adc_dev);
189 CC10001_ADC_POWER_UP_SET);
190
191 /* Wait for 8 (6+2) clock cycles before activating START */
192 ndelay(adc_dev->start_delay_ns);
193 200
194 /* Calculate delay step for eoc and sampled data */ 201 /* Calculate delay step for eoc and sampled data */
195 delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT; 202 delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
@@ -198,7 +205,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev,
198 205
199 val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns); 206 val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns);
200 207
201 cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0); 208 cc10001_adc_power_down(adc_dev);
202 209
203 return val; 210 return val;
204} 211}
@@ -224,7 +231,7 @@ static int cc10001_adc_read_raw(struct iio_dev *indio_dev,
224 231
225 case IIO_CHAN_INFO_SCALE: 232 case IIO_CHAN_INFO_SCALE:
226 ret = regulator_get_voltage(adc_dev->reg); 233 ret = regulator_get_voltage(adc_dev->reg);
227 if (ret) 234 if (ret < 0)
228 return ret; 235 return ret;
229 236
230 *val = ret / 1000; 237 *val = ret / 1000;
@@ -255,22 +262,22 @@ static const struct iio_info cc10001_adc_info = {
255 .update_scan_mode = &cc10001_update_scan_mode, 262 .update_scan_mode = &cc10001_update_scan_mode,
256}; 263};
257 264
258static int cc10001_adc_channel_init(struct iio_dev *indio_dev) 265static int cc10001_adc_channel_init(struct iio_dev *indio_dev,
266 unsigned long channel_map)
259{ 267{
260 struct cc10001_adc_device *adc_dev = iio_priv(indio_dev);
261 struct iio_chan_spec *chan_array, *timestamp; 268 struct iio_chan_spec *chan_array, *timestamp;
262 unsigned int bit, idx = 0; 269 unsigned int bit, idx = 0;
263 270
264 indio_dev->num_channels = bitmap_weight(&adc_dev->channel_map, 271 indio_dev->num_channels = bitmap_weight(&channel_map,
265 CC10001_ADC_NUM_CHANNELS); 272 CC10001_ADC_NUM_CHANNELS) + 1;
266 273
267 chan_array = devm_kcalloc(&indio_dev->dev, indio_dev->num_channels + 1, 274 chan_array = devm_kcalloc(&indio_dev->dev, indio_dev->num_channels,
268 sizeof(struct iio_chan_spec), 275 sizeof(struct iio_chan_spec),
269 GFP_KERNEL); 276 GFP_KERNEL);
270 if (!chan_array) 277 if (!chan_array)
271 return -ENOMEM; 278 return -ENOMEM;
272 279
273 for_each_set_bit(bit, &adc_dev->channel_map, CC10001_ADC_NUM_CHANNELS) { 280 for_each_set_bit(bit, &channel_map, CC10001_ADC_NUM_CHANNELS) {
274 struct iio_chan_spec *chan = &chan_array[idx]; 281 struct iio_chan_spec *chan = &chan_array[idx];
275 282
276 chan->type = IIO_VOLTAGE; 283 chan->type = IIO_VOLTAGE;
@@ -305,6 +312,7 @@ static int cc10001_adc_probe(struct platform_device *pdev)
305 unsigned long adc_clk_rate; 312 unsigned long adc_clk_rate;
306 struct resource *res; 313 struct resource *res;
307 struct iio_dev *indio_dev; 314 struct iio_dev *indio_dev;
315 unsigned long channel_map;
308 int ret; 316 int ret;
309 317
310 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc_dev)); 318 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc_dev));
@@ -313,9 +321,9 @@ static int cc10001_adc_probe(struct platform_device *pdev)
313 321
314 adc_dev = iio_priv(indio_dev); 322 adc_dev = iio_priv(indio_dev);
315 323
316 adc_dev->channel_map = GENMASK(CC10001_ADC_NUM_CHANNELS - 1, 0); 324 channel_map = GENMASK(CC10001_ADC_NUM_CHANNELS - 1, 0);
317 if (!of_property_read_u32(node, "adc-reserved-channels", &ret)) 325 if (!of_property_read_u32(node, "adc-reserved-channels", &ret))
318 adc_dev->channel_map &= ~ret; 326 channel_map &= ~ret;
319 327
320 adc_dev->reg = devm_regulator_get(&pdev->dev, "vref"); 328 adc_dev->reg = devm_regulator_get(&pdev->dev, "vref");
321 if (IS_ERR(adc_dev->reg)) 329 if (IS_ERR(adc_dev->reg))
@@ -361,7 +369,7 @@ static int cc10001_adc_probe(struct platform_device *pdev)
361 adc_dev->start_delay_ns = adc_dev->eoc_delay_ns * CC10001_WAIT_CYCLES; 369 adc_dev->start_delay_ns = adc_dev->eoc_delay_ns * CC10001_WAIT_CYCLES;
362 370
363 /* Setup the ADC channels available on the device */ 371 /* Setup the ADC channels available on the device */
364 ret = cc10001_adc_channel_init(indio_dev); 372 ret = cc10001_adc_channel_init(indio_dev, channel_map);
365 if (ret < 0) 373 if (ret < 0)
366 goto err_disable_clk; 374 goto err_disable_clk;
367 375
diff --git a/drivers/iio/adc/mcp320x.c b/drivers/iio/adc/mcp320x.c
index efbfd12a4bfd..8d9c9b9215dd 100644
--- a/drivers/iio/adc/mcp320x.c
+++ b/drivers/iio/adc/mcp320x.c
@@ -60,12 +60,12 @@ struct mcp320x {
60 struct spi_message msg; 60 struct spi_message msg;
61 struct spi_transfer transfer[2]; 61 struct spi_transfer transfer[2];
62 62
63 u8 tx_buf;
64 u8 rx_buf[2];
65
66 struct regulator *reg; 63 struct regulator *reg;
67 struct mutex lock; 64 struct mutex lock;
68 const struct mcp320x_chip_info *chip_info; 65 const struct mcp320x_chip_info *chip_info;
66
67 u8 tx_buf ____cacheline_aligned;
68 u8 rx_buf[2];
69}; 69};
70 70
71static int mcp320x_channel_to_tx_data(int device_index, 71static int mcp320x_channel_to_tx_data(int device_index,
diff --git a/drivers/iio/adc/qcom-spmi-vadc.c b/drivers/iio/adc/qcom-spmi-vadc.c
index 3211729bcb0b..0c4618b4d515 100644
--- a/drivers/iio/adc/qcom-spmi-vadc.c
+++ b/drivers/iio/adc/qcom-spmi-vadc.c
@@ -18,6 +18,7 @@
18#include <linux/iio/iio.h> 18#include <linux/iio/iio.h>
19#include <linux/interrupt.h> 19#include <linux/interrupt.h>
20#include <linux/kernel.h> 20#include <linux/kernel.h>
21#include <linux/math64.h>
21#include <linux/module.h> 22#include <linux/module.h>
22#include <linux/of.h> 23#include <linux/of.h>
23#include <linux/platform_device.h> 24#include <linux/platform_device.h>
@@ -471,11 +472,11 @@ static s32 vadc_calibrate(struct vadc_priv *vadc,
471 const struct vadc_channel_prop *prop, u16 adc_code) 472 const struct vadc_channel_prop *prop, u16 adc_code)
472{ 473{
473 const struct vadc_prescale_ratio *prescale; 474 const struct vadc_prescale_ratio *prescale;
474 s32 voltage; 475 s64 voltage;
475 476
476 voltage = adc_code - vadc->graph[prop->calibration].gnd; 477 voltage = adc_code - vadc->graph[prop->calibration].gnd;
477 voltage *= vadc->graph[prop->calibration].dx; 478 voltage *= vadc->graph[prop->calibration].dx;
478 voltage = voltage / vadc->graph[prop->calibration].dy; 479 voltage = div64_s64(voltage, vadc->graph[prop->calibration].dy);
479 480
480 if (prop->calibration == VADC_CALIB_ABSOLUTE) 481 if (prop->calibration == VADC_CALIB_ABSOLUTE)
481 voltage += vadc->graph[prop->calibration].dx; 482 voltage += vadc->graph[prop->calibration].dx;
@@ -487,7 +488,7 @@ static s32 vadc_calibrate(struct vadc_priv *vadc,
487 488
488 voltage = voltage * prescale->den; 489 voltage = voltage * prescale->den;
489 490
490 return voltage / prescale->num; 491 return div64_s64(voltage, prescale->num);
491} 492}
492 493
493static int vadc_decimation_from_dt(u32 value) 494static int vadc_decimation_from_dt(u32 value)
diff --git a/drivers/iio/adc/xilinx-xadc-core.c b/drivers/iio/adc/xilinx-xadc-core.c
index a221f7329b79..ce93bd8e3f68 100644
--- a/drivers/iio/adc/xilinx-xadc-core.c
+++ b/drivers/iio/adc/xilinx-xadc-core.c
@@ -856,6 +856,7 @@ static int xadc_read_raw(struct iio_dev *indio_dev,
856 switch (chan->address) { 856 switch (chan->address) {
857 case XADC_REG_VCCINT: 857 case XADC_REG_VCCINT:
858 case XADC_REG_VCCAUX: 858 case XADC_REG_VCCAUX:
859 case XADC_REG_VREFP:
859 case XADC_REG_VCCBRAM: 860 case XADC_REG_VCCBRAM:
860 case XADC_REG_VCCPINT: 861 case XADC_REG_VCCPINT:
861 case XADC_REG_VCCPAUX: 862 case XADC_REG_VCCPAUX:
@@ -996,7 +997,7 @@ static const struct iio_event_spec xadc_voltage_events[] = {
996 .num_event_specs = (_alarm) ? ARRAY_SIZE(xadc_voltage_events) : 0, \ 997 .num_event_specs = (_alarm) ? ARRAY_SIZE(xadc_voltage_events) : 0, \
997 .scan_index = (_scan_index), \ 998 .scan_index = (_scan_index), \
998 .scan_type = { \ 999 .scan_type = { \
999 .sign = 'u', \ 1000 .sign = ((_addr) == XADC_REG_VREFN) ? 's' : 'u', \
1000 .realbits = 12, \ 1001 .realbits = 12, \
1001 .storagebits = 16, \ 1002 .storagebits = 16, \
1002 .shift = 4, \ 1003 .shift = 4, \
@@ -1008,7 +1009,7 @@ static const struct iio_event_spec xadc_voltage_events[] = {
1008static const struct iio_chan_spec xadc_channels[] = { 1009static const struct iio_chan_spec xadc_channels[] = {
1009 XADC_CHAN_TEMP(0, 8, XADC_REG_TEMP), 1010 XADC_CHAN_TEMP(0, 8, XADC_REG_TEMP),
1010 XADC_CHAN_VOLTAGE(0, 9, XADC_REG_VCCINT, "vccint", true), 1011 XADC_CHAN_VOLTAGE(0, 9, XADC_REG_VCCINT, "vccint", true),
1011 XADC_CHAN_VOLTAGE(1, 10, XADC_REG_VCCINT, "vccaux", true), 1012 XADC_CHAN_VOLTAGE(1, 10, XADC_REG_VCCAUX, "vccaux", true),
1012 XADC_CHAN_VOLTAGE(2, 14, XADC_REG_VCCBRAM, "vccbram", true), 1013 XADC_CHAN_VOLTAGE(2, 14, XADC_REG_VCCBRAM, "vccbram", true),
1013 XADC_CHAN_VOLTAGE(3, 5, XADC_REG_VCCPINT, "vccpint", true), 1014 XADC_CHAN_VOLTAGE(3, 5, XADC_REG_VCCPINT, "vccpint", true),
1014 XADC_CHAN_VOLTAGE(4, 6, XADC_REG_VCCPAUX, "vccpaux", true), 1015 XADC_CHAN_VOLTAGE(4, 6, XADC_REG_VCCPAUX, "vccpaux", true),
diff --git a/drivers/iio/adc/xilinx-xadc.h b/drivers/iio/adc/xilinx-xadc.h
index c7487e8d7f80..54adc5087210 100644
--- a/drivers/iio/adc/xilinx-xadc.h
+++ b/drivers/iio/adc/xilinx-xadc.h
@@ -145,9 +145,9 @@ static inline int xadc_write_adc_reg(struct xadc *xadc, unsigned int reg,
145#define XADC_REG_MAX_VCCPINT 0x28 145#define XADC_REG_MAX_VCCPINT 0x28
146#define XADC_REG_MAX_VCCPAUX 0x29 146#define XADC_REG_MAX_VCCPAUX 0x29
147#define XADC_REG_MAX_VCCO_DDR 0x2a 147#define XADC_REG_MAX_VCCO_DDR 0x2a
148#define XADC_REG_MIN_VCCPINT 0x2b 148#define XADC_REG_MIN_VCCPINT 0x2c
149#define XADC_REG_MIN_VCCPAUX 0x2c 149#define XADC_REG_MIN_VCCPAUX 0x2d
150#define XADC_REG_MIN_VCCO_DDR 0x2d 150#define XADC_REG_MIN_VCCO_DDR 0x2e
151 151
152#define XADC_REG_CONF0 0x40 152#define XADC_REG_CONF0 0x40
153#define XADC_REG_CONF1 0x41 153#define XADC_REG_CONF1 0x41
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index edd13d2b4121..8dd0477e201c 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -304,8 +304,6 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
304 struct st_sensors_platform_data *of_pdata; 304 struct st_sensors_platform_data *of_pdata;
305 int err = 0; 305 int err = 0;
306 306
307 mutex_init(&sdata->tb.buf_lock);
308
309 /* If OF/DT pdata exists, it will take precedence of anything else */ 307 /* If OF/DT pdata exists, it will take precedence of anything else */
310 of_pdata = st_sensors_of_probe(indio_dev->dev.parent, pdata); 308 of_pdata = st_sensors_of_probe(indio_dev->dev.parent, pdata);
311 if (of_pdata) 309 if (of_pdata)
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
index 21395f26d227..ffe96642b6d0 100644
--- a/drivers/iio/gyro/st_gyro_core.c
+++ b/drivers/iio/gyro/st_gyro_core.c
@@ -400,6 +400,7 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
400 400
401 indio_dev->modes = INDIO_DIRECT_MODE; 401 indio_dev->modes = INDIO_DIRECT_MODE;
402 indio_dev->info = &gyro_info; 402 indio_dev->info = &gyro_info;
403 mutex_init(&gdata->tb.buf_lock);
403 404
404 st_sensors_power_enable(indio_dev); 405 st_sensors_power_enable(indio_dev);
405 406
diff --git a/drivers/iio/kfifo_buf.c b/drivers/iio/kfifo_buf.c
index 847ca561afe0..55c267bbfd2f 100644
--- a/drivers/iio/kfifo_buf.c
+++ b/drivers/iio/kfifo_buf.c
@@ -38,7 +38,8 @@ static int iio_request_update_kfifo(struct iio_buffer *r)
38 kfifo_free(&buf->kf); 38 kfifo_free(&buf->kf);
39 ret = __iio_allocate_kfifo(buf, buf->buffer.bytes_per_datum, 39 ret = __iio_allocate_kfifo(buf, buf->buffer.bytes_per_datum,
40 buf->buffer.length); 40 buf->buffer.length);
41 buf->update_needed = false; 41 if (ret >= 0)
42 buf->update_needed = false;
42 } else { 43 } else {
43 kfifo_reset_out(&buf->kf); 44 kfifo_reset_out(&buf->kf);
44 } 45 }
diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c
index 91ecc46ffeaa..ef60bae738e3 100644
--- a/drivers/iio/light/hid-sensor-prox.c
+++ b/drivers/iio/light/hid-sensor-prox.c
@@ -43,8 +43,6 @@ struct prox_state {
43static const struct iio_chan_spec prox_channels[] = { 43static const struct iio_chan_spec prox_channels[] = {
44 { 44 {
45 .type = IIO_PROXIMITY, 45 .type = IIO_PROXIMITY,
46 .modified = 1,
47 .channel2 = IIO_NO_MOD,
48 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 46 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
49 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 47 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
50 BIT(IIO_CHAN_INFO_SCALE) | 48 BIT(IIO_CHAN_INFO_SCALE) |
@@ -253,7 +251,6 @@ static int hid_prox_probe(struct platform_device *pdev)
253 struct iio_dev *indio_dev; 251 struct iio_dev *indio_dev;
254 struct prox_state *prox_state; 252 struct prox_state *prox_state;
255 struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; 253 struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
256 struct iio_chan_spec *channels;
257 254
258 indio_dev = devm_iio_device_alloc(&pdev->dev, 255 indio_dev = devm_iio_device_alloc(&pdev->dev,
259 sizeof(struct prox_state)); 256 sizeof(struct prox_state));
@@ -272,20 +269,21 @@ static int hid_prox_probe(struct platform_device *pdev)
272 return ret; 269 return ret;
273 } 270 }
274 271
275 channels = kmemdup(prox_channels, sizeof(prox_channels), GFP_KERNEL); 272 indio_dev->channels = kmemdup(prox_channels, sizeof(prox_channels),
276 if (!channels) { 273 GFP_KERNEL);
274 if (!indio_dev->channels) {
277 dev_err(&pdev->dev, "failed to duplicate channels\n"); 275 dev_err(&pdev->dev, "failed to duplicate channels\n");
278 return -ENOMEM; 276 return -ENOMEM;
279 } 277 }
280 278
281 ret = prox_parse_report(pdev, hsdev, channels, 279 ret = prox_parse_report(pdev, hsdev,
280 (struct iio_chan_spec *)indio_dev->channels,
282 HID_USAGE_SENSOR_PROX, prox_state); 281 HID_USAGE_SENSOR_PROX, prox_state);
283 if (ret) { 282 if (ret) {
284 dev_err(&pdev->dev, "failed to setup attributes\n"); 283 dev_err(&pdev->dev, "failed to setup attributes\n");
285 goto error_free_dev_mem; 284 goto error_free_dev_mem;
286 } 285 }
287 286
288 indio_dev->channels = channels;
289 indio_dev->num_channels = 287 indio_dev->num_channels =
290 ARRAY_SIZE(prox_channels); 288 ARRAY_SIZE(prox_channels);
291 indio_dev->dev.parent = &pdev->dev; 289 indio_dev->dev.parent = &pdev->dev;
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index 8ade473f99fe..2e56f812a644 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -369,6 +369,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
369 369
370 indio_dev->modes = INDIO_DIRECT_MODE; 370 indio_dev->modes = INDIO_DIRECT_MODE;
371 indio_dev->info = &magn_info; 371 indio_dev->info = &magn_info;
372 mutex_init(&mdata->tb.buf_lock);
372 373
373 st_sensors_power_enable(indio_dev); 374 st_sensors_power_enable(indio_dev);
374 375
diff --git a/drivers/iio/pressure/bmp280.c b/drivers/iio/pressure/bmp280.c
index 7c623e2bd633..a2602d8dd6d5 100644
--- a/drivers/iio/pressure/bmp280.c
+++ b/drivers/iio/pressure/bmp280.c
@@ -172,6 +172,7 @@ static s32 bmp280_compensate_temp(struct bmp280_data *data,
172 var2 = (((((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1]))) * 172 var2 = (((((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1]))) *
173 ((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1])))) >> 12) * 173 ((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1])))) >> 12) *
174 ((s32)(s16)le16_to_cpu(buf[T3]))) >> 14; 174 ((s32)(s16)le16_to_cpu(buf[T3]))) >> 14;
175 data->t_fine = var1 + var2;
175 176
176 return (data->t_fine * 5 + 128) >> 8; 177 return (data->t_fine * 5 + 128) >> 8;
177} 178}
diff --git a/drivers/iio/pressure/hid-sensor-press.c b/drivers/iio/pressure/hid-sensor-press.c
index 7bb8d4c1f7df..3cf0bd67d24c 100644
--- a/drivers/iio/pressure/hid-sensor-press.c
+++ b/drivers/iio/pressure/hid-sensor-press.c
@@ -47,8 +47,6 @@ struct press_state {
47static const struct iio_chan_spec press_channels[] = { 47static const struct iio_chan_spec press_channels[] = {
48 { 48 {
49 .type = IIO_PRESSURE, 49 .type = IIO_PRESSURE,
50 .modified = 1,
51 .channel2 = IIO_NO_MOD,
52 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 50 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
53 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 51 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
54 BIT(IIO_CHAN_INFO_SCALE) | 52 BIT(IIO_CHAN_INFO_SCALE) |
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index 97baf40d424b..e881fa6291e9 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -417,6 +417,7 @@ int st_press_common_probe(struct iio_dev *indio_dev)
417 417
418 indio_dev->modes = INDIO_DIRECT_MODE; 418 indio_dev->modes = INDIO_DIRECT_MODE;
419 indio_dev->info = &press_info; 419 indio_dev->info = &press_info;
420 mutex_init(&press_data->tb.buf_lock);
420 421
421 st_sensors_power_enable(indio_dev); 422 st_sensors_power_enable(indio_dev);
422 423
diff --git a/drivers/staging/gdm724x/gdm_mux.c b/drivers/staging/gdm724x/gdm_mux.c
index 8199b0a697bb..1cf24e4edf25 100644
--- a/drivers/staging/gdm724x/gdm_mux.c
+++ b/drivers/staging/gdm724x/gdm_mux.c
@@ -158,7 +158,7 @@ static int up_to_host(struct mux_rx *r)
158 unsigned int start_flag; 158 unsigned int start_flag;
159 unsigned int payload_size; 159 unsigned int payload_size;
160 unsigned short packet_type; 160 unsigned short packet_type;
161 int dummy_cnt; 161 int total_len;
162 u32 packet_size_sum = r->offset; 162 u32 packet_size_sum = r->offset;
163 int index; 163 int index;
164 int ret = TO_HOST_INVALID_PACKET; 164 int ret = TO_HOST_INVALID_PACKET;
@@ -176,10 +176,10 @@ static int up_to_host(struct mux_rx *r)
176 break; 176 break;
177 } 177 }
178 178
179 dummy_cnt = ALIGN(MUX_HEADER_SIZE + payload_size, 4); 179 total_len = ALIGN(MUX_HEADER_SIZE + payload_size, 4);
180 180
181 if (len - packet_size_sum < 181 if (len - packet_size_sum <
182 MUX_HEADER_SIZE + payload_size + dummy_cnt) { 182 total_len) {
183 pr_err("invalid payload : %d %d %04x\n", 183 pr_err("invalid payload : %d %d %04x\n",
184 payload_size, len, packet_type); 184 payload_size, len, packet_type);
185 break; 185 break;
@@ -202,7 +202,7 @@ static int up_to_host(struct mux_rx *r)
202 break; 202 break;
203 } 203 }
204 204
205 packet_size_sum += MUX_HEADER_SIZE + payload_size + dummy_cnt; 205 packet_size_sum += total_len;
206 if (len - packet_size_sum <= MUX_HEADER_SIZE + 2) { 206 if (len - packet_size_sum <= MUX_HEADER_SIZE + 2) {
207 ret = r->callback(NULL, 207 ret = r->callback(NULL,
208 0, 208 0,
@@ -361,7 +361,6 @@ static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
361 struct mux_pkt_header *mux_header; 361 struct mux_pkt_header *mux_header;
362 struct mux_tx *t = NULL; 362 struct mux_tx *t = NULL;
363 static u32 seq_num = 1; 363 static u32 seq_num = 1;
364 int dummy_cnt;
365 int total_len; 364 int total_len;
366 int ret; 365 int ret;
367 unsigned long flags; 366 unsigned long flags;
@@ -374,9 +373,7 @@ static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
374 373
375 spin_lock_irqsave(&mux_dev->write_lock, flags); 374 spin_lock_irqsave(&mux_dev->write_lock, flags);
376 375
377 dummy_cnt = ALIGN(MUX_HEADER_SIZE + len, 4); 376 total_len = ALIGN(MUX_HEADER_SIZE + len, 4);
378
379 total_len = len + MUX_HEADER_SIZE + dummy_cnt;
380 377
381 t = alloc_mux_tx(total_len); 378 t = alloc_mux_tx(total_len);
382 if (!t) { 379 if (!t) {
@@ -392,7 +389,8 @@ static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
392 mux_header->packet_type = __cpu_to_le16(packet_type[tty_index]); 389 mux_header->packet_type = __cpu_to_le16(packet_type[tty_index]);
393 390
394 memcpy(t->buf+MUX_HEADER_SIZE, data, len); 391 memcpy(t->buf+MUX_HEADER_SIZE, data, len);
395 memset(t->buf+MUX_HEADER_SIZE+len, 0, dummy_cnt); 392 memset(t->buf+MUX_HEADER_SIZE+len, 0, total_len - MUX_HEADER_SIZE -
393 len);
396 394
397 t->len = total_len; 395 t->len = total_len;
398 t->callback = cb; 396 t->callback = cb;
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
index 42fba3f5b593..cb0b6387789f 100644
--- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
@@ -1900,23 +1900,20 @@ static int r871x_mp_ioctl_hdl(struct net_device *dev,
1900 struct mp_ioctl_handler *phandler; 1900 struct mp_ioctl_handler *phandler;
1901 struct mp_ioctl_param *poidparam; 1901 struct mp_ioctl_param *poidparam;
1902 unsigned long BytesRead, BytesWritten, BytesNeeded; 1902 unsigned long BytesRead, BytesWritten, BytesNeeded;
1903 u8 *pparmbuf = NULL, bset; 1903 u8 *pparmbuf, bset;
1904 u16 len; 1904 u16 len;
1905 uint status; 1905 uint status;
1906 int ret = 0; 1906 int ret = 0;
1907 1907
1908 if ((!p->length) || (!p->pointer)) { 1908 if ((!p->length) || (!p->pointer))
1909 ret = -EINVAL; 1909 return -EINVAL;
1910 goto _r871x_mp_ioctl_hdl_exit; 1910
1911 }
1912 bset = (u8)(p->flags & 0xFFFF); 1911 bset = (u8)(p->flags & 0xFFFF);
1913 len = p->length; 1912 len = p->length;
1914 pparmbuf = NULL;
1915 pparmbuf = memdup_user(p->pointer, len); 1913 pparmbuf = memdup_user(p->pointer, len);
1916 if (IS_ERR(pparmbuf)) { 1914 if (IS_ERR(pparmbuf))
1917 ret = PTR_ERR(pparmbuf); 1915 return PTR_ERR(pparmbuf);
1918 goto _r871x_mp_ioctl_hdl_exit; 1916
1919 }
1920 poidparam = (struct mp_ioctl_param *)pparmbuf; 1917 poidparam = (struct mp_ioctl_param *)pparmbuf;
1921 if (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) { 1918 if (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) {
1922 ret = -EINVAL; 1919 ret = -EINVAL;
diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c
index 3c7ea95dd9f9..dbbb2f879a29 100644
--- a/drivers/staging/sm750fb/sm750.c
+++ b/drivers/staging/sm750fb/sm750.c
@@ -1250,7 +1250,7 @@ err_enable:
1250 return -ENODEV; 1250 return -ENODEV;
1251} 1251}
1252 1252
1253static void __exit lynxfb_pci_remove(struct pci_dev *pdev) 1253static void lynxfb_pci_remove(struct pci_dev *pdev)
1254{ 1254{
1255 struct fb_info *info; 1255 struct fb_info *info;
1256 struct lynx_share *share; 1256 struct lynx_share *share;
diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c
index 1cdcf49b2445..e00c0605d154 100644
--- a/drivers/staging/vt6655/card.c
+++ b/drivers/staging/vt6655/card.c
@@ -362,12 +362,16 @@ bool CARDbSetPhyParameter(struct vnt_private *pDevice, u8 bb_type)
362 * Return Value: none 362 * Return Value: none
363 */ 363 */
364bool CARDbUpdateTSF(struct vnt_private *pDevice, unsigned char byRxRate, 364bool CARDbUpdateTSF(struct vnt_private *pDevice, unsigned char byRxRate,
365 u64 qwBSSTimestamp, u64 qwLocalTSF) 365 u64 qwBSSTimestamp)
366{ 366{
367 u64 local_tsf;
367 u64 qwTSFOffset = 0; 368 u64 qwTSFOffset = 0;
368 369
369 if (qwBSSTimestamp != qwLocalTSF) { 370 CARDbGetCurrentTSF(pDevice, &local_tsf);
370 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF); 371
372 if (qwBSSTimestamp != local_tsf) {
373 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp,
374 local_tsf);
371 /* adjust TSF, HW's TSF add TSF Offset reg */ 375 /* adjust TSF, HW's TSF add TSF Offset reg */
372 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST, (u32)qwTSFOffset); 376 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST, (u32)qwTSFOffset);
373 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST + 4, (u32)(qwTSFOffset >> 32)); 377 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST + 4, (u32)(qwTSFOffset >> 32));
diff --git a/drivers/staging/vt6655/card.h b/drivers/staging/vt6655/card.h
index 2dfc41952271..16cca49e680a 100644
--- a/drivers/staging/vt6655/card.h
+++ b/drivers/staging/vt6655/card.h
@@ -83,7 +83,7 @@ bool CARDbRadioPowerOff(struct vnt_private *);
83bool CARDbRadioPowerOn(struct vnt_private *); 83bool CARDbRadioPowerOn(struct vnt_private *);
84bool CARDbSetPhyParameter(struct vnt_private *, u8); 84bool CARDbSetPhyParameter(struct vnt_private *, u8);
85bool CARDbUpdateTSF(struct vnt_private *, unsigned char byRxRate, 85bool CARDbUpdateTSF(struct vnt_private *, unsigned char byRxRate,
86 u64 qwBSSTimestamp, u64 qwLocalTSF); 86 u64 qwBSSTimestamp);
87bool CARDbSetBeaconPeriod(struct vnt_private *, unsigned short wBeaconInterval); 87bool CARDbSetBeaconPeriod(struct vnt_private *, unsigned short wBeaconInterval);
88 88
89#endif /* __CARD_H__ */ 89#endif /* __CARD_H__ */
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index 4bb4f8ee4132..0343ae386f03 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -912,7 +912,11 @@ static int vnt_int_report_rate(struct vnt_private *priv,
912 912
913 if (!(tsr1 & TSR1_TERR)) { 913 if (!(tsr1 & TSR1_TERR)) {
914 info->status.rates[0].idx = idx; 914 info->status.rates[0].idx = idx;
915 info->flags |= IEEE80211_TX_STAT_ACK; 915
916 if (info->flags & IEEE80211_TX_CTL_NO_ACK)
917 info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
918 else
919 info->flags |= IEEE80211_TX_STAT_ACK;
916 } 920 }
917 921
918 return 0; 922 return 0;
@@ -937,9 +941,6 @@ static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx)
937 /* Only the status of first TD in the chain is correct */ 941 /* Only the status of first TD in the chain is correct */
938 if (pTD->m_td1TD1.byTCR & TCR_STP) { 942 if (pTD->m_td1TD1.byTCR & TCR_STP) {
939 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) { 943 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
940
941 vnt_int_report_rate(pDevice, pTD->pTDInfo, byTsr0, byTsr1);
942
943 if (!(byTsr1 & TSR1_TERR)) { 944 if (!(byTsr1 & TSR1_TERR)) {
944 if (byTsr0 != 0) { 945 if (byTsr0 != 0) {
945 pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n", 946 pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n",
@@ -958,6 +959,9 @@ static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx)
958 (int)uIdx, byTsr1, byTsr0); 959 (int)uIdx, byTsr1, byTsr0);
959 } 960 }
960 } 961 }
962
963 vnt_int_report_rate(pDevice, pTD->pTDInfo, byTsr0, byTsr1);
964
961 device_free_tx_buf(pDevice, pTD); 965 device_free_tx_buf(pDevice, pTD);
962 pDevice->iTDUsed[uIdx]--; 966 pDevice->iTDUsed[uIdx]--;
963 } 967 }
@@ -989,10 +993,8 @@ static void device_free_tx_buf(struct vnt_private *pDevice, PSTxDesc pDesc)
989 skb->len, DMA_TO_DEVICE); 993 skb->len, DMA_TO_DEVICE);
990 } 994 }
991 995
992 if (pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) 996 if (skb)
993 ieee80211_tx_status_irqsafe(pDevice->hw, skb); 997 ieee80211_tx_status_irqsafe(pDevice->hw, skb);
994 else
995 dev_kfree_skb_irq(skb);
996 998
997 pTDInfo->skb_dma = 0; 999 pTDInfo->skb_dma = 0;
998 pTDInfo->skb = NULL; 1000 pTDInfo->skb = NULL;
@@ -1204,14 +1206,6 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
1204 if (dma_idx == TYPE_AC0DMA) 1206 if (dma_idx == TYPE_AC0DMA)
1205 head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB; 1207 head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB;
1206 1208
1207 priv->iTDUsed[dma_idx]++;
1208
1209 /* Take ownership */
1210 wmb();
1211 head_td->m_td0TD0.f1Owner = OWNED_BY_NIC;
1212
1213 /* get Next */
1214 wmb();
1215 priv->apCurrTD[dma_idx] = head_td->next; 1209 priv->apCurrTD[dma_idx] = head_td->next;
1216 1210
1217 spin_unlock_irqrestore(&priv->lock, flags); 1211 spin_unlock_irqrestore(&priv->lock, flags);
@@ -1232,11 +1226,18 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
1232 1226
1233 head_td->buff_addr = cpu_to_le32(head_td->pTDInfo->skb_dma); 1227 head_td->buff_addr = cpu_to_le32(head_td->pTDInfo->skb_dma);
1234 1228
1229 /* Poll Transmit the adapter */
1230 wmb();
1231 head_td->m_td0TD0.f1Owner = OWNED_BY_NIC;
1232 wmb(); /* second memory barrier */
1233
1235 if (head_td->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) 1234 if (head_td->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)
1236 MACvTransmitAC0(priv->PortOffset); 1235 MACvTransmitAC0(priv->PortOffset);
1237 else 1236 else
1238 MACvTransmit0(priv->PortOffset); 1237 MACvTransmit0(priv->PortOffset);
1239 1238
1239 priv->iTDUsed[dma_idx]++;
1240
1240 spin_unlock_irqrestore(&priv->lock, flags); 1241 spin_unlock_irqrestore(&priv->lock, flags);
1241 1242
1242 return 0; 1243 return 0;
@@ -1416,9 +1417,16 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw,
1416 1417
1417 priv->current_aid = conf->aid; 1418 priv->current_aid = conf->aid;
1418 1419
1419 if (changed & BSS_CHANGED_BSSID) 1420 if (changed & BSS_CHANGED_BSSID) {
1421 unsigned long flags;
1422
1423 spin_lock_irqsave(&priv->lock, flags);
1424
1420 MACvWriteBSSIDAddress(priv->PortOffset, (u8 *)conf->bssid); 1425 MACvWriteBSSIDAddress(priv->PortOffset, (u8 *)conf->bssid);
1421 1426
1427 spin_unlock_irqrestore(&priv->lock, flags);
1428 }
1429
1422 if (changed & BSS_CHANGED_BASIC_RATES) { 1430 if (changed & BSS_CHANGED_BASIC_RATES) {
1423 priv->basic_rates = conf->basic_rates; 1431 priv->basic_rates = conf->basic_rates;
1424 1432
@@ -1477,7 +1485,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw,
1477 if (changed & BSS_CHANGED_ASSOC && priv->op_mode != NL80211_IFTYPE_AP) { 1485 if (changed & BSS_CHANGED_ASSOC && priv->op_mode != NL80211_IFTYPE_AP) {
1478 if (conf->assoc) { 1486 if (conf->assoc) {
1479 CARDbUpdateTSF(priv, conf->beacon_rate->hw_value, 1487 CARDbUpdateTSF(priv, conf->beacon_rate->hw_value,
1480 conf->sync_device_ts, conf->sync_tsf); 1488 conf->sync_tsf);
1481 1489
1482 CARDbSetBeaconPeriod(priv, conf->beacon_int); 1490 CARDbSetBeaconPeriod(priv, conf->beacon_int);
1483 1491
diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c
index f6c2cf8590c4..5c589962a1e8 100644
--- a/drivers/staging/vt6656/rxtx.c
+++ b/drivers/staging/vt6656/rxtx.c
@@ -805,10 +805,18 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
805 vnt_schedule_command(priv, WLAN_CMD_SETPOWER); 805 vnt_schedule_command(priv, WLAN_CMD_SETPOWER);
806 } 806 }
807 807
808 if (current_rate > RATE_11M) 808 if (current_rate > RATE_11M) {
809 pkt_type = priv->packet_type; 809 if (info->band == IEEE80211_BAND_5GHZ) {
810 else 810 pkt_type = PK_TYPE_11A;
811 } else {
812 if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
813 pkt_type = PK_TYPE_11GB;
814 else
815 pkt_type = PK_TYPE_11GA;
816 }
817 } else {
811 pkt_type = PK_TYPE_11B; 818 pkt_type = PK_TYPE_11B;
819 }
812 820
813 spin_lock_irqsave(&priv->lock, flags); 821 spin_lock_irqsave(&priv->lock, flags);
814 822