diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-05-17 00:04:56 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-05-17 00:04:56 -0400 |
| commit | 3f4741b1d863f624e8632b3283af5eabe35c2fca (patch) | |
| tree | 450df928579a5db36ca450ab44ae12d51d9fbe31 /drivers | |
| parent | 148c46f3e12bfd877c4fcec986f55988f21b0857 (diff) | |
| parent | ec94efcdadab69f41d257a1054260f8295ab77ef (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')
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, | |||
| 316 | static int mma9553_read_activity_stepcnt(struct mma9553_data *data, | 317 | static 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 | ||
| 82 | static 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 | |||
| 88 | static 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 | |||
| 82 | static void cc10001_adc_start(struct cc10001_adc_device *adc_dev, | 94 | static 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 | ||
| 168 | done: | 179 | done: |
| 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 | ||
| 258 | static int cc10001_adc_channel_init(struct iio_dev *indio_dev) | 265 | static 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 | ||
| 71 | static int mcp320x_channel_to_tx_data(int device_index, | 71 | static 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 | ||
| 493 | static int vadc_decimation_from_dt(u32 value) | 494 | static 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[] = { | |||
| 1008 | static const struct iio_chan_spec xadc_channels[] = { | 1009 | static 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 { | |||
| 43 | static const struct iio_chan_spec prox_channels[] = { | 43 | static 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 { | |||
| 47 | static const struct iio_chan_spec press_channels[] = { | 47 | static 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 | ||
| 1253 | static void __exit lynxfb_pci_remove(struct pci_dev *pdev) | 1253 | static 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 | */ |
| 364 | bool CARDbUpdateTSF(struct vnt_private *pDevice, unsigned char byRxRate, | 364 | bool 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 *); | |||
| 83 | bool CARDbRadioPowerOn(struct vnt_private *); | 83 | bool CARDbRadioPowerOn(struct vnt_private *); |
| 84 | bool CARDbSetPhyParameter(struct vnt_private *, u8); | 84 | bool CARDbSetPhyParameter(struct vnt_private *, u8); |
| 85 | bool CARDbUpdateTSF(struct vnt_private *, unsigned char byRxRate, | 85 | bool CARDbUpdateTSF(struct vnt_private *, unsigned char byRxRate, |
| 86 | u64 qwBSSTimestamp, u64 qwLocalTSF); | 86 | u64 qwBSSTimestamp); |
| 87 | bool CARDbSetBeaconPeriod(struct vnt_private *, unsigned short wBeaconInterval); | 87 | bool 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 | ||
