mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
Conflicts:
included wakeup_reason.h file of 57caa2ad5c in kernel/power/process.c
This commit is contained in:
commit
80cd9be34a
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 91
|
||||
SUBLEVEL = 92
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
|
|||
|
|
@ -809,7 +809,8 @@ static ssize_t driver_override_store(struct device *dev,
|
|||
struct platform_device *pdev = to_platform_device(dev);
|
||||
char *driver_override, *old, *cp;
|
||||
|
||||
if (count > PATH_MAX)
|
||||
/* We need to keep extra room for a newline */
|
||||
if (count >= (PAGE_SIZE - 1))
|
||||
return -EINVAL;
|
||||
|
||||
driver_override = kstrndup(buf, count, GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -957,6 +957,13 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
|||
is_hdmi = is_dvi && (child->common.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
|
||||
is_edp = is_dp && (child->common.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR);
|
||||
|
||||
if (port == PORT_A && is_dvi) {
|
||||
DRM_DEBUG_KMS("VBT claims port A supports DVI%s, ignoring\n",
|
||||
is_hdmi ? "/HDMI" : "");
|
||||
is_dvi = false;
|
||||
is_hdmi = false;
|
||||
}
|
||||
|
||||
info->supports_dvi = is_dvi;
|
||||
info->supports_hdmi = is_hdmi;
|
||||
info->supports_dp = is_dp;
|
||||
|
|
|
|||
|
|
@ -540,7 +540,8 @@ static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size)
|
|||
{
|
||||
/* the worst case is computed from the set_report command with a
|
||||
* reportID > 15 and the maximum report length */
|
||||
int args_len = sizeof(__u8) + /* optional ReportID byte */
|
||||
int args_len = sizeof(__u8) + /* ReportID */
|
||||
sizeof(__u8) + /* optional ReportID byte */
|
||||
sizeof(__u16) + /* data register */
|
||||
sizeof(__u16) + /* size of the report */
|
||||
report_size; /* report */
|
||||
|
|
|
|||
|
|
@ -155,6 +155,10 @@ static void fcopy_send_data(struct work_struct *dummy)
|
|||
out_src = smsg_out;
|
||||
break;
|
||||
|
||||
case WRITE_TO_FILE:
|
||||
out_src = fcopy_transaction.fcopy_msg;
|
||||
out_len = sizeof(struct hv_do_fcopy);
|
||||
break;
|
||||
default:
|
||||
out_src = fcopy_transaction.fcopy_msg;
|
||||
out_len = fcopy_transaction.recv_len;
|
||||
|
|
|
|||
|
|
@ -1065,7 +1065,7 @@ void stm_source_unregister_device(struct stm_source_data *data)
|
|||
|
||||
stm_source_link_drop(src);
|
||||
|
||||
device_destroy(&stm_source_class, src->dev.devt);
|
||||
device_unregister(&src->dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stm_source_unregister_device);
|
||||
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
|
|||
unsigned int vref_mv)
|
||||
{
|
||||
struct ad7793_state *st = iio_priv(indio_dev);
|
||||
int i, ret = -1;
|
||||
int i, ret;
|
||||
unsigned long long scale_uv;
|
||||
u32 id;
|
||||
|
||||
|
|
@ -266,7 +266,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
|
|||
return ret;
|
||||
|
||||
/* reset the serial interface */
|
||||
ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret));
|
||||
ret = ad_sd_reset(&st->sd, 32);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
usleep_range(500, 2000); /* Wait for at least 500us */
|
||||
|
|
|
|||
|
|
@ -177,6 +177,34 @@ int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ad_sd_read_reg);
|
||||
|
||||
/**
|
||||
* ad_sd_reset() - Reset the serial interface
|
||||
*
|
||||
* @sigma_delta: The sigma delta device
|
||||
* @reset_length: Number of SCLKs with DIN = 1
|
||||
*
|
||||
* Returns 0 on success, an error code otherwise.
|
||||
**/
|
||||
int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
|
||||
unsigned int reset_length)
|
||||
{
|
||||
uint8_t *buf;
|
||||
unsigned int size;
|
||||
int ret;
|
||||
|
||||
size = DIV_ROUND_UP(reset_length, 8);
|
||||
buf = kcalloc(size, sizeof(*buf), GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(buf, 0xff, size);
|
||||
ret = spi_write(sigma_delta->spi, buf, size);
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ad_sd_reset);
|
||||
|
||||
static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
|
||||
unsigned int mode, unsigned int channel)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@
|
|||
* MCP3204
|
||||
* MCP3208
|
||||
* ------------
|
||||
* 13 bit converter
|
||||
* MCP3301
|
||||
*
|
||||
* Datasheet can be found here:
|
||||
* http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf mcp3001
|
||||
|
|
@ -96,7 +98,7 @@ static int mcp320x_channel_to_tx_data(int device_index,
|
|||
}
|
||||
|
||||
static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
|
||||
bool differential, int device_index)
|
||||
bool differential, int device_index, int *val)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
|
@ -117,19 +119,25 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
|
|||
|
||||
switch (device_index) {
|
||||
case mcp3001:
|
||||
return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3);
|
||||
*val = (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3);
|
||||
return 0;
|
||||
case mcp3002:
|
||||
case mcp3004:
|
||||
case mcp3008:
|
||||
return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6);
|
||||
*val = (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6);
|
||||
return 0;
|
||||
case mcp3201:
|
||||
return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1);
|
||||
*val = (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1);
|
||||
return 0;
|
||||
case mcp3202:
|
||||
case mcp3204:
|
||||
case mcp3208:
|
||||
return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
|
||||
*val = (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
|
||||
return 0;
|
||||
case mcp3301:
|
||||
return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12);
|
||||
*val = sign_extend32((adc->rx_buf[0] & 0x1f) << 8
|
||||
| adc->rx_buf[1], 12);
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -150,12 +158,10 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev,
|
|||
switch (mask) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
ret = mcp320x_adc_conversion(adc, channel->address,
|
||||
channel->differential, device_index);
|
||||
|
||||
channel->differential, device_index, val);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
*val = ret;
|
||||
ret = IIO_VAL_INT;
|
||||
break;
|
||||
|
||||
|
|
@ -304,6 +310,7 @@ static int mcp320x_probe(struct spi_device *spi)
|
|||
indio_dev->name = spi_get_device_id(spi)->name;
|
||||
indio_dev->modes = INDIO_DIRECT_MODE;
|
||||
indio_dev->info = &mcp320x_info;
|
||||
spi_set_drvdata(spi, indio_dev);
|
||||
|
||||
chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data];
|
||||
indio_dev->channels = chip_info->channels;
|
||||
|
|
|
|||
|
|
@ -866,8 +866,10 @@ static int twl4030_madc_probe(struct platform_device *pdev)
|
|||
|
||||
/* Enable 3v1 bias regulator for MADC[3:6] */
|
||||
madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1");
|
||||
if (IS_ERR(madc->usb3v1))
|
||||
return -ENODEV;
|
||||
if (IS_ERR(madc->usb3v1)) {
|
||||
ret = -ENODEV;
|
||||
goto err_i2c;
|
||||
}
|
||||
|
||||
ret = regulator_enable(madc->usb3v1);
|
||||
if (ret)
|
||||
|
|
@ -876,11 +878,13 @@ static int twl4030_madc_probe(struct platform_device *pdev)
|
|||
ret = iio_device_register(iio_dev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "could not register iio device\n");
|
||||
goto err_i2c;
|
||||
goto err_usb3v1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_usb3v1:
|
||||
regulator_disable(madc->usb3v1);
|
||||
err_i2c:
|
||||
twl4030_madc_set_current_generator(madc, 0, 0);
|
||||
err_current_generator:
|
||||
|
|
|
|||
|
|
@ -221,8 +221,10 @@ static ssize_t iio_debugfs_read_reg(struct file *file, char __user *userbuf,
|
|||
ret = indio_dev->info->debugfs_reg_access(indio_dev,
|
||||
indio_dev->cached_reg_addr,
|
||||
0, &val);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
len = snprintf(buf, sizeof(buf), "0x%X\n", val);
|
||||
|
||||
|
|
|
|||
|
|
@ -1990,6 +1990,10 @@ int cdc_parse_cdc_header(struct usb_cdc_parsed_header *hdr,
|
|||
elength = 1;
|
||||
goto next_desc;
|
||||
}
|
||||
if ((buflen < elength) || (elength < 3)) {
|
||||
dev_err(&intf->dev, "invalid descriptor buffer length\n");
|
||||
break;
|
||||
}
|
||||
if (buffer[1] != USB_DT_CS_INTERFACE) {
|
||||
dev_err(&intf->dev, "skipping garbage\n");
|
||||
goto next_desc;
|
||||
|
|
|
|||
|
|
@ -876,7 +876,7 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
|
|||
|
||||
eth_broadcast_addr(params_le->bssid);
|
||||
params_le->bss_type = DOT11_BSSTYPE_ANY;
|
||||
params_le->scan_type = 0;
|
||||
params_le->scan_type = BRCMF_SCANTYPE_ACTIVE;
|
||||
params_le->channel_num = 0;
|
||||
params_le->nprobes = cpu_to_le32(-1);
|
||||
params_le->active_time = cpu_to_le32(-1);
|
||||
|
|
@ -884,12 +884,9 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
|
|||
params_le->home_time = cpu_to_le32(-1);
|
||||
memset(¶ms_le->ssid_le, 0, sizeof(params_le->ssid_le));
|
||||
|
||||
/* if request is null exit so it will be all channel broadcast scan */
|
||||
if (!request)
|
||||
return;
|
||||
|
||||
n_ssids = request->n_ssids;
|
||||
n_channels = request->n_channels;
|
||||
|
||||
/* Copy channel array if applicable */
|
||||
brcmf_dbg(SCAN, "### List of channelspecs to scan ### %d\n",
|
||||
n_channels);
|
||||
|
|
@ -926,16 +923,8 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
|
|||
ptr += sizeof(ssid_le);
|
||||
}
|
||||
} else {
|
||||
brcmf_dbg(SCAN, "Broadcast scan %p\n", request->ssids);
|
||||
if ((request->ssids) && request->ssids->ssid_len) {
|
||||
brcmf_dbg(SCAN, "SSID %s len=%d\n",
|
||||
params_le->ssid_le.SSID,
|
||||
request->ssids->ssid_len);
|
||||
params_le->ssid_le.SSID_len =
|
||||
cpu_to_le32(request->ssids->ssid_len);
|
||||
memcpy(¶ms_le->ssid_le.SSID, request->ssids->ssid,
|
||||
request->ssids->ssid_len);
|
||||
}
|
||||
brcmf_dbg(SCAN, "Performing passive scan\n");
|
||||
params_le->scan_type = BRCMF_SCANTYPE_PASSIVE;
|
||||
}
|
||||
/* Adding mask to channel numbers */
|
||||
params_le->channel_num =
|
||||
|
|
|
|||
|
|
@ -45,6 +45,11 @@
|
|||
#define BRCMF_SCAN_PARAMS_COUNT_MASK 0x0000ffff
|
||||
#define BRCMF_SCAN_PARAMS_NSSID_SHIFT 16
|
||||
|
||||
/* scan type definitions */
|
||||
#define BRCMF_SCANTYPE_DEFAULT 0xFF
|
||||
#define BRCMF_SCANTYPE_ACTIVE 0
|
||||
#define BRCMF_SCANTYPE_PASSIVE 1
|
||||
|
||||
/* primary (ie tx) key */
|
||||
#define BRCMF_PRIMARY_KEY (1 << 1)
|
||||
#define DOT11_BSSTYPE_ANY 2
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@
|
|||
/* NVM offsets (in words) definitions */
|
||||
enum wkp_nvm_offsets {
|
||||
/* NVM HW-Section offset (in words) definitions */
|
||||
SUBSYSTEM_ID = 0x0A,
|
||||
HW_ADDR = 0x15,
|
||||
|
||||
/* NVM SW-Section offset (in words) definitions */
|
||||
|
|
@ -257,13 +258,12 @@ static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, bool is_5ghz,
|
|||
static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
|
||||
struct iwl_nvm_data *data,
|
||||
const __le16 * const nvm_ch_flags,
|
||||
bool lar_supported)
|
||||
bool lar_supported, bool no_wide_in_5ghz)
|
||||
{
|
||||
int ch_idx;
|
||||
int n_channels = 0;
|
||||
struct ieee80211_channel *channel;
|
||||
u16 ch_flags;
|
||||
bool is_5ghz;
|
||||
int num_of_ch, num_2ghz_channels;
|
||||
const u8 *nvm_chan;
|
||||
|
||||
|
|
@ -278,12 +278,20 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
|
|||
}
|
||||
|
||||
for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
|
||||
bool is_5ghz = (ch_idx >= num_2ghz_channels);
|
||||
|
||||
ch_flags = __le16_to_cpup(nvm_ch_flags + ch_idx);
|
||||
|
||||
if (ch_idx >= num_2ghz_channels &&
|
||||
!data->sku_cap_band_52GHz_enable)
|
||||
if (is_5ghz && !data->sku_cap_band_52GHz_enable)
|
||||
continue;
|
||||
|
||||
/* workaround to disable wide channels in 5GHz */
|
||||
if (no_wide_in_5ghz && is_5ghz) {
|
||||
ch_flags &= ~(NVM_CHANNEL_40MHZ |
|
||||
NVM_CHANNEL_80MHZ |
|
||||
NVM_CHANNEL_160MHZ);
|
||||
}
|
||||
|
||||
if (!lar_supported && !(ch_flags & NVM_CHANNEL_VALID)) {
|
||||
/*
|
||||
* Channels might become valid later if lar is
|
||||
|
|
@ -303,8 +311,8 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
|
|||
n_channels++;
|
||||
|
||||
channel->hw_value = nvm_chan[ch_idx];
|
||||
channel->band = (ch_idx < num_2ghz_channels) ?
|
||||
IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
|
||||
channel->band = is_5ghz ?
|
||||
IEEE80211_BAND_5GHZ : IEEE80211_BAND_2GHZ;
|
||||
channel->center_freq =
|
||||
ieee80211_channel_to_frequency(
|
||||
channel->hw_value, channel->band);
|
||||
|
|
@ -316,7 +324,6 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
|
|||
* is not used in mvm, and is used for backwards compatibility
|
||||
*/
|
||||
channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
|
||||
is_5ghz = channel->band == IEEE80211_BAND_5GHZ;
|
||||
|
||||
/* don't put limitations in case we're using LAR */
|
||||
if (!lar_supported)
|
||||
|
|
@ -405,7 +412,8 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
|
|||
static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
|
||||
struct iwl_nvm_data *data,
|
||||
const __le16 *ch_section,
|
||||
u8 tx_chains, u8 rx_chains, bool lar_supported)
|
||||
u8 tx_chains, u8 rx_chains, bool lar_supported,
|
||||
bool no_wide_in_5ghz)
|
||||
{
|
||||
int n_channels;
|
||||
int n_used = 0;
|
||||
|
|
@ -414,12 +422,14 @@ static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
|
|||
if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
|
||||
n_channels = iwl_init_channel_map(
|
||||
dev, cfg, data,
|
||||
&ch_section[NVM_CHANNELS], lar_supported);
|
||||
&ch_section[NVM_CHANNELS], lar_supported,
|
||||
no_wide_in_5ghz);
|
||||
else
|
||||
n_channels = iwl_init_channel_map(
|
||||
dev, cfg, data,
|
||||
&ch_section[NVM_CHANNELS_FAMILY_8000],
|
||||
lar_supported);
|
||||
lar_supported,
|
||||
no_wide_in_5ghz);
|
||||
|
||||
sband = &data->bands[IEEE80211_BAND_2GHZ];
|
||||
sband->band = IEEE80211_BAND_2GHZ;
|
||||
|
|
@ -582,6 +592,39 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
|
|||
|
||||
#define IWL_4165_DEVICE_ID 0x5501
|
||||
|
||||
static bool
|
||||
iwl_nvm_no_wide_in_5ghz(struct device *dev, const struct iwl_cfg *cfg,
|
||||
const __le16 *nvm_hw)
|
||||
{
|
||||
/*
|
||||
* Workaround a bug in Indonesia SKUs where the regulatory in
|
||||
* some 7000-family OTPs erroneously allow wide channels in
|
||||
* 5GHz. To check for Indonesia, we take the SKU value from
|
||||
* bits 1-4 in the subsystem ID and check if it is either 5 or
|
||||
* 9. In those cases, we need to force-disable wide channels
|
||||
* in 5GHz otherwise the FW will throw a sysassert when we try
|
||||
* to use them.
|
||||
*/
|
||||
if (cfg->device_family == IWL_DEVICE_FAMILY_7000) {
|
||||
/*
|
||||
* Unlike the other sections in the NVM, the hw
|
||||
* section uses big-endian.
|
||||
*/
|
||||
u16 subsystem_id = be16_to_cpup((const __be16 *)nvm_hw
|
||||
+ SUBSYSTEM_ID);
|
||||
u8 sku = (subsystem_id & 0x1e) >> 1;
|
||||
|
||||
if (sku == 5 || sku == 9) {
|
||||
IWL_DEBUG_EEPROM(dev,
|
||||
"disabling wide channels in 5GHz (0x%0x %d)\n",
|
||||
subsystem_id, sku);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
struct iwl_nvm_data *
|
||||
iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
|
||||
const __le16 *nvm_hw, const __le16 *nvm_sw,
|
||||
|
|
@ -591,6 +634,7 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
|
|||
u32 mac_addr0, u32 mac_addr1, u32 hw_id)
|
||||
{
|
||||
struct iwl_nvm_data *data;
|
||||
bool no_wide_in_5ghz = iwl_nvm_no_wide_in_5ghz(dev, cfg, nvm_hw);
|
||||
u32 sku;
|
||||
u32 radio_cfg;
|
||||
u16 lar_config;
|
||||
|
|
@ -657,7 +701,8 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
|
|||
iwl_set_hw_address(cfg, data, nvm_hw);
|
||||
|
||||
iwl_init_sbands(dev, cfg, data, nvm_sw,
|
||||
tx_chains, rx_chains, lar_fw_supported);
|
||||
tx_chains, rx_chains, lar_fw_supported,
|
||||
no_wide_in_5ghz);
|
||||
} else {
|
||||
u16 lar_offset = data->nvm_version < 0xE39 ?
|
||||
NVM_LAR_OFFSET_FAMILY_8000_OLD :
|
||||
|
|
@ -673,7 +718,8 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
|
|||
|
||||
iwl_init_sbands(dev, cfg, data, regulatory,
|
||||
tx_chains, rx_chains,
|
||||
lar_fw_supported && data->lar_enabled);
|
||||
lar_fw_supported && data->lar_enabled,
|
||||
no_wide_in_5ghz);
|
||||
}
|
||||
|
||||
data->calib_version = 255;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#ifndef _NVME_H
|
||||
#define _NVME_H
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/nvme.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/kref.h>
|
||||
|
|
@ -62,6 +63,7 @@ struct nvme_dev {
|
|||
struct work_struct reset_work;
|
||||
struct work_struct probe_work;
|
||||
struct work_struct scan_work;
|
||||
struct mutex shutdown_lock;
|
||||
char name[12];
|
||||
char serial[20];
|
||||
char model[40];
|
||||
|
|
|
|||
|
|
@ -2954,6 +2954,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev)
|
|||
|
||||
nvme_dev_list_remove(dev);
|
||||
|
||||
mutex_lock(&dev->shutdown_lock);
|
||||
if (pci_is_enabled(to_pci_dev(dev->dev))) {
|
||||
nvme_freeze_queues(dev);
|
||||
csts = readl(&dev->bar->csts);
|
||||
|
|
@ -2972,6 +2973,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev)
|
|||
|
||||
for (i = dev->queue_count - 1; i >= 0; i--)
|
||||
nvme_clear_queue(dev->queues[i]);
|
||||
mutex_unlock(&dev->shutdown_lock);
|
||||
}
|
||||
|
||||
static void nvme_dev_remove(struct nvme_dev *dev)
|
||||
|
|
@ -3328,6 +3330,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
|
||||
INIT_LIST_HEAD(&dev->namespaces);
|
||||
INIT_WORK(&dev->reset_work, nvme_reset_work);
|
||||
mutex_init(&dev->shutdown_lock);
|
||||
dev->dev = get_device(&pdev->dev);
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -2878,8 +2878,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
|
|||
sd_read_write_same(sdkp, buffer);
|
||||
}
|
||||
|
||||
sdkp->first_scan = 0;
|
||||
|
||||
/*
|
||||
* We now have all cache related info, determine how we deal
|
||||
* with flush requests.
|
||||
|
|
@ -2894,7 +2892,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
|
|||
q->limits.max_dev_sectors = logical_to_sectors(sdp, dev_max);
|
||||
|
||||
/*
|
||||
* Use the device's preferred I/O size for reads and writes
|
||||
* Determine the device's preferred I/O size for reads and writes
|
||||
* unless the reported value is unreasonably small, large, or
|
||||
* garbage.
|
||||
*/
|
||||
|
|
@ -2908,8 +2906,19 @@ static int sd_revalidate_disk(struct gendisk *disk)
|
|||
rw_max = min_not_zero(logical_to_sectors(sdp, dev_max),
|
||||
(sector_t)BLK_DEF_MAX_SECTORS);
|
||||
|
||||
/* Combine with controller limits */
|
||||
q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q));
|
||||
/* Do not exceed controller limit */
|
||||
rw_max = min(rw_max, queue_max_hw_sectors(q));
|
||||
|
||||
/*
|
||||
* Only update max_sectors if previously unset or if the current value
|
||||
* exceeds the capabilities of the hardware.
|
||||
*/
|
||||
if (sdkp->first_scan ||
|
||||
q->limits.max_sectors > q->limits.max_dev_sectors ||
|
||||
q->limits.max_sectors > q->limits.max_hw_sectors)
|
||||
q->limits.max_sectors = rw_max;
|
||||
|
||||
sdkp->first_scan = 0;
|
||||
|
||||
set_capacity(disk, logical_to_sectors(sdp, sdkp->capacity));
|
||||
sd_config_write_same(sdkp);
|
||||
|
|
|
|||
|
|
@ -205,11 +205,9 @@ static int ad7192_setup(struct ad7192_state *st,
|
|||
struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi);
|
||||
unsigned long long scale_uv;
|
||||
int i, ret, id;
|
||||
u8 ones[6];
|
||||
|
||||
/* reset the serial interface */
|
||||
memset(&ones, 0xFF, 6);
|
||||
ret = spi_write(st->sd.spi, &ones, 6);
|
||||
ret = ad_sd_reset(&st->sd, 48);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
usleep_range(500, 1000); /* Wait for at least 500us */
|
||||
|
|
|
|||
|
|
@ -609,15 +609,23 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx,
|
|||
|
||||
} else if (header->bDescriptorType ==
|
||||
USB_DT_INTERFACE_ASSOCIATION) {
|
||||
struct usb_interface_assoc_descriptor *d;
|
||||
|
||||
d = (struct usb_interface_assoc_descriptor *)header;
|
||||
if (d->bLength < USB_DT_INTERFACE_ASSOCIATION_SIZE) {
|
||||
dev_warn(ddev,
|
||||
"config %d has an invalid interface association descriptor of length %d, skipping\n",
|
||||
cfgno, d->bLength);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (iad_num == USB_MAXIADS) {
|
||||
dev_warn(ddev, "found more Interface "
|
||||
"Association Descriptors "
|
||||
"than allocated for in "
|
||||
"configuration %d\n", cfgno);
|
||||
} else {
|
||||
config->intf_assoc[iad_num] =
|
||||
(struct usb_interface_assoc_descriptor
|
||||
*)header;
|
||||
config->intf_assoc[iad_num] = d;
|
||||
iad_num++;
|
||||
}
|
||||
|
||||
|
|
@ -818,7 +826,7 @@ int usb_get_configuration(struct usb_device *dev)
|
|||
}
|
||||
|
||||
if (dev->quirks & USB_QUIRK_DELAY_INIT)
|
||||
msleep(100);
|
||||
msleep(200);
|
||||
|
||||
result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno,
|
||||
bigbuffer, length);
|
||||
|
|
|
|||
|
|
@ -1417,7 +1417,11 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
|
|||
totlen += isopkt[u].length;
|
||||
}
|
||||
u *= sizeof(struct usb_iso_packet_descriptor);
|
||||
uurb->buffer_length = totlen;
|
||||
if (totlen <= uurb->buffer_length)
|
||||
uurb->buffer_length = totlen;
|
||||
else
|
||||
WARN_ONCE(1, "uurb->buffer_length is too short %d vs %d",
|
||||
totlen, uurb->buffer_length);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -4761,7 +4761,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
|
|||
goto loop;
|
||||
|
||||
if (udev->quirks & USB_QUIRK_DELAY_INIT)
|
||||
msleep(1000);
|
||||
msleep(2000);
|
||||
|
||||
/* consecutive bus-powered hubs aren't reliable; they can
|
||||
* violate the voltage drop budget. if the new child has
|
||||
|
|
|
|||
|
|
@ -306,8 +306,6 @@ struct fsg_common {
|
|||
struct completion thread_notifier;
|
||||
struct task_struct *thread_task;
|
||||
|
||||
/* Callback functions. */
|
||||
const struct fsg_operations *ops;
|
||||
/* Gadget's private data. */
|
||||
void *private_data;
|
||||
|
||||
|
|
@ -2504,6 +2502,7 @@ static void handle_exception(struct fsg_common *common)
|
|||
static int fsg_main_thread(void *common_)
|
||||
{
|
||||
struct fsg_common *common = common_;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Allow the thread to be killed by a signal, but set the signal mask
|
||||
|
|
@ -2565,21 +2564,16 @@ static int fsg_main_thread(void *common_)
|
|||
common->thread_task = NULL;
|
||||
spin_unlock_irq(&common->lock);
|
||||
|
||||
if (!common->ops || !common->ops->thread_exits
|
||||
|| common->ops->thread_exits(common) < 0) {
|
||||
int i;
|
||||
/* Eject media from all LUNs */
|
||||
|
||||
down_write(&common->filesem);
|
||||
for (i = 0; i < ARRAY_SIZE(common->luns); --i) {
|
||||
struct fsg_lun *curlun = common->luns[i];
|
||||
if (!curlun || !fsg_lun_is_open(curlun))
|
||||
continue;
|
||||
down_write(&common->filesem);
|
||||
for (i = 0; i < ARRAY_SIZE(common->luns); i++) {
|
||||
struct fsg_lun *curlun = common->luns[i];
|
||||
|
||||
if (curlun && fsg_lun_is_open(curlun))
|
||||
fsg_lun_close(curlun);
|
||||
curlun->unit_attention_data = SS_MEDIUM_NOT_PRESENT;
|
||||
}
|
||||
up_write(&common->filesem);
|
||||
}
|
||||
up_write(&common->filesem);
|
||||
|
||||
/* Let fsg_unbind() know the thread has exited */
|
||||
complete_and_exit(&common->thread_notifier, 0);
|
||||
|
|
@ -2785,13 +2779,6 @@ void fsg_common_remove_luns(struct fsg_common *common)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(fsg_common_remove_luns);
|
||||
|
||||
void fsg_common_set_ops(struct fsg_common *common,
|
||||
const struct fsg_operations *ops)
|
||||
{
|
||||
common->ops = ops;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fsg_common_set_ops);
|
||||
|
||||
void fsg_common_free_buffers(struct fsg_common *common)
|
||||
{
|
||||
_fsg_common_free_buffers(common->buffhds, common->fsg_num_buffers);
|
||||
|
|
|
|||
|
|
@ -60,17 +60,6 @@ struct fsg_module_parameters {
|
|||
struct fsg_common;
|
||||
|
||||
/* FSF callback functions */
|
||||
struct fsg_operations {
|
||||
/*
|
||||
* Callback function to call when thread exits. If no
|
||||
* callback is set or it returns value lower then zero MSF
|
||||
* will force eject all LUNs it operates on (including those
|
||||
* marked as non-removable or with prevent_medium_removal flag
|
||||
* set).
|
||||
*/
|
||||
int (*thread_exits)(struct fsg_common *common);
|
||||
};
|
||||
|
||||
struct fsg_lun_opts {
|
||||
struct config_group group;
|
||||
struct fsg_lun *lun;
|
||||
|
|
@ -141,9 +130,6 @@ void fsg_common_remove_lun(struct fsg_lun *lun);
|
|||
|
||||
void fsg_common_remove_luns(struct fsg_common *common);
|
||||
|
||||
void fsg_common_set_ops(struct fsg_common *common,
|
||||
const struct fsg_operations *ops);
|
||||
|
||||
int fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg,
|
||||
unsigned int id, const char *name,
|
||||
const char **name_pfx);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
#include <linux/mmu_context.h>
|
||||
#include <linux/aio.h>
|
||||
#include <linux/uio.h>
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/moduleparam.h>
|
||||
|
||||
|
|
@ -116,6 +116,7 @@ enum ep0_state {
|
|||
struct dev_data {
|
||||
spinlock_t lock;
|
||||
atomic_t count;
|
||||
int udc_usage;
|
||||
enum ep0_state state; /* P: lock */
|
||||
struct usb_gadgetfs_event event [N_EVENT];
|
||||
unsigned ev_next;
|
||||
|
|
@ -512,9 +513,9 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req)
|
|||
INIT_WORK(&priv->work, ep_user_copy_worker);
|
||||
schedule_work(&priv->work);
|
||||
}
|
||||
spin_unlock(&epdata->dev->lock);
|
||||
|
||||
usb_ep_free_request(ep, req);
|
||||
spin_unlock(&epdata->dev->lock);
|
||||
put_ep(epdata);
|
||||
}
|
||||
|
||||
|
|
@ -938,9 +939,11 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
|||
struct usb_request *req = dev->req;
|
||||
|
||||
if ((retval = setup_req (ep, req, 0)) == 0) {
|
||||
++dev->udc_usage;
|
||||
spin_unlock_irq (&dev->lock);
|
||||
retval = usb_ep_queue (ep, req, GFP_KERNEL);
|
||||
spin_lock_irq (&dev->lock);
|
||||
--dev->udc_usage;
|
||||
}
|
||||
dev->state = STATE_DEV_CONNECTED;
|
||||
|
||||
|
|
@ -982,11 +985,14 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
|||
retval = -EIO;
|
||||
else {
|
||||
len = min (len, (size_t)dev->req->actual);
|
||||
// FIXME don't call this with the spinlock held ...
|
||||
++dev->udc_usage;
|
||||
spin_unlock_irq(&dev->lock);
|
||||
if (copy_to_user (buf, dev->req->buf, len))
|
||||
retval = -EFAULT;
|
||||
else
|
||||
retval = len;
|
||||
spin_lock_irq(&dev->lock);
|
||||
--dev->udc_usage;
|
||||
clean_req (dev->gadget->ep0, dev->req);
|
||||
/* NOTE userspace can't yet choose to stall */
|
||||
}
|
||||
|
|
@ -1130,6 +1136,7 @@ ep0_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
|||
retval = setup_req (dev->gadget->ep0, dev->req, len);
|
||||
if (retval == 0) {
|
||||
dev->state = STATE_DEV_CONNECTED;
|
||||
++dev->udc_usage;
|
||||
spin_unlock_irq (&dev->lock);
|
||||
if (copy_from_user (dev->req->buf, buf, len))
|
||||
retval = -EFAULT;
|
||||
|
|
@ -1140,10 +1147,10 @@ ep0_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
|||
dev->gadget->ep0, dev->req,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
spin_lock_irq(&dev->lock);
|
||||
--dev->udc_usage;
|
||||
if (retval < 0) {
|
||||
spin_lock_irq (&dev->lock);
|
||||
clean_req (dev->gadget->ep0, dev->req);
|
||||
spin_unlock_irq (&dev->lock);
|
||||
} else
|
||||
retval = len;
|
||||
|
||||
|
|
@ -1240,9 +1247,21 @@ static long dev_ioctl (struct file *fd, unsigned code, unsigned long value)
|
|||
struct usb_gadget *gadget = dev->gadget;
|
||||
long ret = -ENOTTY;
|
||||
|
||||
if (gadget->ops->ioctl)
|
||||
spin_lock_irq(&dev->lock);
|
||||
if (dev->state == STATE_DEV_OPENED ||
|
||||
dev->state == STATE_DEV_UNBOUND) {
|
||||
/* Not bound to a UDC */
|
||||
} else if (gadget->ops->ioctl) {
|
||||
++dev->udc_usage;
|
||||
spin_unlock_irq(&dev->lock);
|
||||
|
||||
ret = gadget->ops->ioctl (gadget, code, value);
|
||||
|
||||
spin_lock_irq(&dev->lock);
|
||||
--dev->udc_usage;
|
||||
}
|
||||
spin_unlock_irq(&dev->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1460,10 +1479,12 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
|
|||
if (value < 0)
|
||||
break;
|
||||
|
||||
++dev->udc_usage;
|
||||
spin_unlock (&dev->lock);
|
||||
value = usb_ep_queue (gadget->ep0, dev->req,
|
||||
GFP_KERNEL);
|
||||
spin_lock (&dev->lock);
|
||||
--dev->udc_usage;
|
||||
if (value < 0) {
|
||||
clean_req (gadget->ep0, dev->req);
|
||||
break;
|
||||
|
|
@ -1487,8 +1508,12 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
|
|||
req->length = value;
|
||||
req->zero = value < w_length;
|
||||
|
||||
++dev->udc_usage;
|
||||
spin_unlock (&dev->lock);
|
||||
value = usb_ep_queue (gadget->ep0, req, GFP_KERNEL);
|
||||
spin_lock(&dev->lock);
|
||||
--dev->udc_usage;
|
||||
spin_unlock(&dev->lock);
|
||||
if (value < 0) {
|
||||
DBG (dev, "ep_queue --> %d\n", value);
|
||||
req->status = 0;
|
||||
|
|
@ -1515,21 +1540,24 @@ static void destroy_ep_files (struct dev_data *dev)
|
|||
/* break link to FS */
|
||||
ep = list_first_entry (&dev->epfiles, struct ep_data, epfiles);
|
||||
list_del_init (&ep->epfiles);
|
||||
spin_unlock_irq (&dev->lock);
|
||||
|
||||
dentry = ep->dentry;
|
||||
ep->dentry = NULL;
|
||||
parent = d_inode(dentry->d_parent);
|
||||
|
||||
/* break link to controller */
|
||||
mutex_lock(&ep->lock);
|
||||
if (ep->state == STATE_EP_ENABLED)
|
||||
(void) usb_ep_disable (ep->ep);
|
||||
ep->state = STATE_EP_UNBOUND;
|
||||
usb_ep_free_request (ep->ep, ep->req);
|
||||
ep->ep = NULL;
|
||||
mutex_unlock(&ep->lock);
|
||||
|
||||
wake_up (&ep->wait);
|
||||
put_ep (ep);
|
||||
|
||||
spin_unlock_irq (&dev->lock);
|
||||
|
||||
/* break link to dcache */
|
||||
mutex_lock (&parent->i_mutex);
|
||||
d_delete (dentry);
|
||||
|
|
@ -1600,6 +1628,11 @@ gadgetfs_unbind (struct usb_gadget *gadget)
|
|||
|
||||
spin_lock_irq (&dev->lock);
|
||||
dev->state = STATE_DEV_UNBOUND;
|
||||
while (dev->udc_usage > 0) {
|
||||
spin_unlock_irq(&dev->lock);
|
||||
usleep_range(1000, 2000);
|
||||
spin_lock_irq(&dev->lock);
|
||||
}
|
||||
spin_unlock_irq (&dev->lock);
|
||||
|
||||
destroy_ep_files (dev);
|
||||
|
|
|
|||
|
|
@ -107,15 +107,6 @@ static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS;
|
|||
|
||||
FSG_MODULE_PARAMETERS(/* no prefix */, mod_data);
|
||||
|
||||
static unsigned long msg_registered;
|
||||
static void msg_cleanup(void);
|
||||
|
||||
static int msg_thread_exits(struct fsg_common *common)
|
||||
{
|
||||
msg_cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msg_do_config(struct usb_configuration *c)
|
||||
{
|
||||
struct fsg_opts *opts;
|
||||
|
|
@ -154,9 +145,6 @@ static struct usb_configuration msg_config_driver = {
|
|||
|
||||
static int msg_bind(struct usb_composite_dev *cdev)
|
||||
{
|
||||
static const struct fsg_operations ops = {
|
||||
.thread_exits = msg_thread_exits,
|
||||
};
|
||||
struct fsg_opts *opts;
|
||||
struct fsg_config config;
|
||||
int status;
|
||||
|
|
@ -173,8 +161,6 @@ static int msg_bind(struct usb_composite_dev *cdev)
|
|||
if (status)
|
||||
goto fail;
|
||||
|
||||
fsg_common_set_ops(opts->common, &ops);
|
||||
|
||||
status = fsg_common_set_cdev(opts->common, cdev, config.can_stall);
|
||||
if (status)
|
||||
goto fail_set_cdev;
|
||||
|
|
@ -210,7 +196,6 @@ static int msg_bind(struct usb_composite_dev *cdev)
|
|||
usb_composite_overwrite_options(cdev, &coverwrite);
|
||||
dev_info(&cdev->gadget->dev,
|
||||
DRIVER_DESC ", version: " DRIVER_VERSION "\n");
|
||||
set_bit(0, &msg_registered);
|
||||
return 0;
|
||||
|
||||
fail_otg_desc:
|
||||
|
|
@ -261,9 +246,8 @@ static int __init msg_init(void)
|
|||
}
|
||||
module_init(msg_init);
|
||||
|
||||
static void msg_cleanup(void)
|
||||
static void __exit msg_cleanup(void)
|
||||
{
|
||||
if (test_and_clear_bit(0, &msg_registered))
|
||||
usb_composite_unregister(&msg_driver);
|
||||
usb_composite_unregister(&msg_driver);
|
||||
}
|
||||
module_exit(msg_cleanup);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@
|
|||
#include <asm/gpio.h>
|
||||
|
||||
#include "atmel_usba_udc.h"
|
||||
#define USBA_VBUS_IRQFLAGS (IRQF_ONESHOT \
|
||||
| IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING)
|
||||
|
||||
#ifdef CONFIG_USB_GADGET_DEBUG_FS
|
||||
#include <linux/debugfs.h>
|
||||
|
|
@ -2185,7 +2187,7 @@ static int usba_udc_probe(struct platform_device *pdev)
|
|||
IRQ_NOAUTOEN);
|
||||
ret = devm_request_threaded_irq(&pdev->dev,
|
||||
gpio_to_irq(udc->vbus_pin), NULL,
|
||||
usba_vbus_irq_thread, IRQF_ONESHOT,
|
||||
usba_vbus_irq_thread, USBA_VBUS_IRQFLAGS,
|
||||
"atmel_usba_udc", udc);
|
||||
if (ret) {
|
||||
udc->vbus_pin = -ENODEV;
|
||||
|
|
|
|||
|
|
@ -237,6 +237,8 @@ struct dummy_hcd {
|
|||
|
||||
struct usb_device *udev;
|
||||
struct list_head urbp_list;
|
||||
struct urbp *next_frame_urbp;
|
||||
|
||||
u32 stream_en_ep;
|
||||
u8 num_stream[30 / 2];
|
||||
|
||||
|
|
@ -253,11 +255,13 @@ struct dummy {
|
|||
*/
|
||||
struct dummy_ep ep[DUMMY_ENDPOINTS];
|
||||
int address;
|
||||
int callback_usage;
|
||||
struct usb_gadget gadget;
|
||||
struct usb_gadget_driver *driver;
|
||||
struct dummy_request fifo_req;
|
||||
u8 fifo_buf[FIFO_SIZE];
|
||||
u16 devstatus;
|
||||
unsigned ints_enabled:1;
|
||||
unsigned udc_suspended:1;
|
||||
unsigned pullup:1;
|
||||
|
||||
|
|
@ -440,18 +444,27 @@ static void set_link_state(struct dummy_hcd *dum_hcd)
|
|||
(~dum_hcd->old_status) & dum_hcd->port_status;
|
||||
|
||||
/* Report reset and disconnect events to the driver */
|
||||
if (dum->driver && (disconnect || reset)) {
|
||||
if (dum->ints_enabled && (disconnect || reset)) {
|
||||
stop_activity(dum);
|
||||
++dum->callback_usage;
|
||||
spin_unlock(&dum->lock);
|
||||
if (reset)
|
||||
usb_gadget_udc_reset(&dum->gadget, dum->driver);
|
||||
else
|
||||
dum->driver->disconnect(&dum->gadget);
|
||||
spin_lock(&dum->lock);
|
||||
--dum->callback_usage;
|
||||
}
|
||||
} else if (dum_hcd->active != dum_hcd->old_active) {
|
||||
} else if (dum_hcd->active != dum_hcd->old_active &&
|
||||
dum->ints_enabled) {
|
||||
++dum->callback_usage;
|
||||
spin_unlock(&dum->lock);
|
||||
if (dum_hcd->old_active && dum->driver->suspend)
|
||||
dum->driver->suspend(&dum->gadget);
|
||||
else if (!dum_hcd->old_active && dum->driver->resume)
|
||||
dum->driver->resume(&dum->gadget);
|
||||
spin_lock(&dum->lock);
|
||||
--dum->callback_usage;
|
||||
}
|
||||
|
||||
dum_hcd->old_status = dum_hcd->port_status;
|
||||
|
|
@ -967,8 +980,11 @@ static int dummy_udc_start(struct usb_gadget *g,
|
|||
* can't enumerate without help from the driver we're binding.
|
||||
*/
|
||||
|
||||
spin_lock_irq(&dum->lock);
|
||||
dum->devstatus = 0;
|
||||
dum->driver = driver;
|
||||
dum->ints_enabled = 1;
|
||||
spin_unlock_irq(&dum->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -979,6 +995,16 @@ static int dummy_udc_stop(struct usb_gadget *g)
|
|||
struct dummy *dum = dum_hcd->dum;
|
||||
|
||||
spin_lock_irq(&dum->lock);
|
||||
dum->ints_enabled = 0;
|
||||
stop_activity(dum);
|
||||
|
||||
/* emulate synchronize_irq(): wait for callbacks to finish */
|
||||
while (dum->callback_usage > 0) {
|
||||
spin_unlock_irq(&dum->lock);
|
||||
usleep_range(1000, 2000);
|
||||
spin_lock_irq(&dum->lock);
|
||||
}
|
||||
|
||||
dum->driver = NULL;
|
||||
spin_unlock_irq(&dum->lock);
|
||||
|
||||
|
|
@ -1032,7 +1058,12 @@ static int dummy_udc_probe(struct platform_device *pdev)
|
|||
memzero_explicit(&dum->gadget, sizeof(struct usb_gadget));
|
||||
dum->gadget.name = gadget_name;
|
||||
dum->gadget.ops = &dummy_ops;
|
||||
dum->gadget.max_speed = USB_SPEED_SUPER;
|
||||
if (mod_data.is_super_speed)
|
||||
dum->gadget.max_speed = USB_SPEED_SUPER;
|
||||
else if (mod_data.is_high_speed)
|
||||
dum->gadget.max_speed = USB_SPEED_HIGH;
|
||||
else
|
||||
dum->gadget.max_speed = USB_SPEED_FULL;
|
||||
|
||||
dum->gadget.dev.parent = &pdev->dev;
|
||||
init_dummy_udc_hw(dum);
|
||||
|
|
@ -1241,6 +1272,8 @@ static int dummy_urb_enqueue(
|
|||
|
||||
list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list);
|
||||
urb->hcpriv = urbp;
|
||||
if (!dum_hcd->next_frame_urbp)
|
||||
dum_hcd->next_frame_urbp = urbp;
|
||||
if (usb_pipetype(urb->pipe) == PIPE_CONTROL)
|
||||
urb->error_count = 1; /* mark as a new urb */
|
||||
|
||||
|
|
@ -1517,6 +1550,8 @@ static struct dummy_ep *find_endpoint(struct dummy *dum, u8 address)
|
|||
if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ?
|
||||
dum->ss_hcd : dum->hs_hcd)))
|
||||
return NULL;
|
||||
if (!dum->ints_enabled)
|
||||
return NULL;
|
||||
if ((address & ~USB_DIR_IN) == 0)
|
||||
return &dum->ep[0];
|
||||
for (i = 1; i < DUMMY_ENDPOINTS; i++) {
|
||||
|
|
@ -1758,6 +1793,7 @@ static void dummy_timer(unsigned long _dum_hcd)
|
|||
spin_unlock_irqrestore(&dum->lock, flags);
|
||||
return;
|
||||
}
|
||||
dum_hcd->next_frame_urbp = NULL;
|
||||
|
||||
for (i = 0; i < DUMMY_ENDPOINTS; i++) {
|
||||
if (!ep_info[i].name)
|
||||
|
|
@ -1774,6 +1810,10 @@ static void dummy_timer(unsigned long _dum_hcd)
|
|||
int type;
|
||||
int status = -EINPROGRESS;
|
||||
|
||||
/* stop when we reach URBs queued after the timer interrupt */
|
||||
if (urbp == dum_hcd->next_frame_urbp)
|
||||
break;
|
||||
|
||||
urb = urbp->urb;
|
||||
if (urb->unlinked)
|
||||
goto return_urb;
|
||||
|
|
@ -1853,10 +1893,12 @@ static void dummy_timer(unsigned long _dum_hcd)
|
|||
* until setup() returns; no reentrancy issues etc.
|
||||
*/
|
||||
if (value > 0) {
|
||||
++dum->callback_usage;
|
||||
spin_unlock(&dum->lock);
|
||||
value = dum->driver->setup(&dum->gadget,
|
||||
&setup);
|
||||
spin_lock(&dum->lock);
|
||||
--dum->callback_usage;
|
||||
|
||||
if (value >= 0) {
|
||||
/* no delays (max 64KB data stage) */
|
||||
|
|
@ -2564,8 +2606,6 @@ static struct hc_driver dummy_hcd = {
|
|||
.product_desc = "Dummy host controller",
|
||||
.hcd_priv_size = sizeof(struct dummy_hcd),
|
||||
|
||||
.flags = HCD_USB3 | HCD_SHARED,
|
||||
|
||||
.reset = dummy_setup,
|
||||
.start = dummy_start,
|
||||
.stop = dummy_stop,
|
||||
|
|
@ -2594,8 +2634,12 @@ static int dummy_hcd_probe(struct platform_device *pdev)
|
|||
dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
|
||||
dum = *((void **)dev_get_platdata(&pdev->dev));
|
||||
|
||||
if (!mod_data.is_super_speed)
|
||||
if (mod_data.is_super_speed)
|
||||
dummy_hcd.flags = HCD_USB3 | HCD_SHARED;
|
||||
else if (mod_data.is_high_speed)
|
||||
dummy_hcd.flags = HCD_USB2;
|
||||
else
|
||||
dummy_hcd.flags = HCD_USB11;
|
||||
hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev));
|
||||
if (!hs_hcd)
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -969,7 +969,7 @@ EXPORT_SYMBOL_GPL(usb_disable_xhci_ports);
|
|||
*
|
||||
* Takes care of the handoff between the Pre-OS (i.e. BIOS) and the OS.
|
||||
* It signals to the BIOS that the OS wants control of the host controller,
|
||||
* and then waits 5 seconds for the BIOS to hand over control.
|
||||
* and then waits 1 second for the BIOS to hand over control.
|
||||
* If we timeout, assume the BIOS is broken and take control anyway.
|
||||
*/
|
||||
static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
|
||||
|
|
@ -1015,9 +1015,9 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
|
|||
if (val & XHCI_HC_BIOS_OWNED) {
|
||||
writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset);
|
||||
|
||||
/* Wait for 5 seconds with 10 microsecond polling interval */
|
||||
/* Wait for 1 second with 10 microsecond polling interval */
|
||||
timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED,
|
||||
0, 5000, 10);
|
||||
0, 1000000, 10);
|
||||
|
||||
/* Assume a buggy BIOS and take HC ownership anyway */
|
||||
if (timeout) {
|
||||
|
|
@ -1046,7 +1046,7 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
|
|||
* operational or runtime registers. Wait 5 seconds and no more.
|
||||
*/
|
||||
timeout = handshake(op_reg_base + XHCI_STS_OFFSET, XHCI_STS_CNR, 0,
|
||||
5000, 10);
|
||||
5000000, 10);
|
||||
/* Assume a buggy HC and start HC initialization anyway */
|
||||
if (timeout) {
|
||||
val = readl(op_reg_base + XHCI_STS_OFFSET);
|
||||
|
|
|
|||
|
|
@ -1490,7 +1490,7 @@ struct xhci_bus_state {
|
|||
|
||||
static inline unsigned int hcd_index(struct usb_hcd *hcd)
|
||||
{
|
||||
if (hcd->speed == HCD_USB3)
|
||||
if (hcd->speed >= HCD_USB3)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -285,11 +285,26 @@ static void usbhsf_fifo_clear(struct usbhs_pipe *pipe,
|
|||
struct usbhs_fifo *fifo)
|
||||
{
|
||||
struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
|
||||
int ret = 0;
|
||||
|
||||
if (!usbhs_pipe_is_dcp(pipe))
|
||||
usbhsf_fifo_barrier(priv, fifo);
|
||||
if (!usbhs_pipe_is_dcp(pipe)) {
|
||||
/*
|
||||
* This driver checks the pipe condition first to avoid -EBUSY
|
||||
* from usbhsf_fifo_barrier() with about 10 msec delay in
|
||||
* the interrupt handler if the pipe is RX direction and empty.
|
||||
*/
|
||||
if (usbhs_pipe_is_dir_in(pipe))
|
||||
ret = usbhs_pipe_is_accessible(pipe);
|
||||
if (!ret)
|
||||
ret = usbhsf_fifo_barrier(priv, fifo);
|
||||
}
|
||||
|
||||
usbhs_write(priv, fifo->ctr, BCLR);
|
||||
/*
|
||||
* if non-DCP pipe, this driver should set BCLR when
|
||||
* usbhsf_fifo_barrier() returns 0.
|
||||
*/
|
||||
if (!ret)
|
||||
usbhs_write(priv, fifo->ctr, BCLR);
|
||||
}
|
||||
|
||||
static int usbhsf_fifo_rcv_len(struct usbhs_priv *priv,
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ static int uas_is_interface(struct usb_host_interface *intf)
|
|||
intf->desc.bInterfaceProtocol == USB_PR_UAS);
|
||||
}
|
||||
|
||||
static int uas_find_uas_alt_setting(struct usb_interface *intf)
|
||||
static struct usb_host_interface *uas_find_uas_alt_setting(
|
||||
struct usb_interface *intf)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -17,10 +18,10 @@ static int uas_find_uas_alt_setting(struct usb_interface *intf)
|
|||
struct usb_host_interface *alt = &intf->altsetting[i];
|
||||
|
||||
if (uas_is_interface(alt))
|
||||
return alt->desc.bAlternateSetting;
|
||||
return alt;
|
||||
}
|
||||
|
||||
return -ENODEV;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int uas_find_endpoints(struct usb_host_interface *alt,
|
||||
|
|
@ -58,14 +59,14 @@ static int uas_use_uas_driver(struct usb_interface *intf,
|
|||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct usb_hcd *hcd = bus_to_hcd(udev->bus);
|
||||
unsigned long flags = id->driver_info;
|
||||
int r, alt;
|
||||
|
||||
struct usb_host_interface *alt;
|
||||
int r;
|
||||
|
||||
alt = uas_find_uas_alt_setting(intf);
|
||||
if (alt < 0)
|
||||
if (!alt)
|
||||
return 0;
|
||||
|
||||
r = uas_find_endpoints(&intf->altsetting[alt], eps);
|
||||
r = uas_find_endpoints(alt, eps);
|
||||
if (r < 0)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -849,14 +849,14 @@ MODULE_DEVICE_TABLE(usb, uas_usb_ids);
|
|||
static int uas_switch_interface(struct usb_device *udev,
|
||||
struct usb_interface *intf)
|
||||
{
|
||||
int alt;
|
||||
struct usb_host_interface *alt;
|
||||
|
||||
alt = uas_find_uas_alt_setting(intf);
|
||||
if (alt < 0)
|
||||
return alt;
|
||||
if (!alt)
|
||||
return -ENODEV;
|
||||
|
||||
return usb_set_interface(udev,
|
||||
intf->altsetting[0].desc.bInterfaceNumber, alt);
|
||||
return usb_set_interface(udev, alt->desc.bInterfaceNumber,
|
||||
alt->desc.bAlternateSetting);
|
||||
}
|
||||
|
||||
static int uas_configure_endpoints(struct uas_dev_info *devinfo)
|
||||
|
|
|
|||
|
|
@ -1379,6 +1379,13 @@ UNUSUAL_DEV( 0x0bc2, 0x3010, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_SANE_SENSE ),
|
||||
|
||||
/* Reported by Kris Lindgren <kris.lindgren@gmail.com> */
|
||||
UNUSUAL_DEV( 0x0bc2, 0x3332, 0x0000, 0x9999,
|
||||
"Seagate",
|
||||
"External",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_WP_DETECT ),
|
||||
|
||||
UNUSUAL_DEV( 0x0d49, 0x7310, 0x0000, 0x9999,
|
||||
"Maxtor",
|
||||
"USB to SATA",
|
||||
|
|
|
|||
|
|
@ -827,6 +827,8 @@ static int hwarc_probe(struct usb_interface *iface,
|
|||
|
||||
if (iface->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
if (!usb_endpoint_xfer_int(&iface->cur_altsetting->endpoint[0].desc))
|
||||
return -ENODEV;
|
||||
|
||||
result = -ENOMEM;
|
||||
uwb_rc = uwb_rc_alloc();
|
||||
|
|
|
|||
|
|
@ -303,18 +303,22 @@ static int uwbd(void *param)
|
|||
/** Start the UWB daemon */
|
||||
void uwbd_start(struct uwb_rc *rc)
|
||||
{
|
||||
rc->uwbd.task = kthread_run(uwbd, rc, "uwbd");
|
||||
if (rc->uwbd.task == NULL)
|
||||
struct task_struct *task = kthread_run(uwbd, rc, "uwbd");
|
||||
if (IS_ERR(task)) {
|
||||
rc->uwbd.task = NULL;
|
||||
printk(KERN_ERR "UWB: Cannot start management daemon; "
|
||||
"UWB won't work\n");
|
||||
else
|
||||
} else {
|
||||
rc->uwbd.task = task;
|
||||
rc->uwbd.pid = rc->uwbd.task->pid;
|
||||
}
|
||||
}
|
||||
|
||||
/* Stop the UWB daemon and free any unprocessed events */
|
||||
void uwbd_stop(struct uwb_rc *rc)
|
||||
{
|
||||
kthread_stop(rc->uwbd.task);
|
||||
if (rc->uwbd.task)
|
||||
kthread_stop(rc->uwbd.task);
|
||||
uwbd_flush(rc);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -195,13 +195,6 @@ __ext4_set_acl(handle_t *handle, struct inode *inode, int type,
|
|||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
|
||||
if (acl) {
|
||||
error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
|
||||
if (error)
|
||||
return error;
|
||||
inode->i_ctime = ext4_current_time(inode);
|
||||
ext4_mark_inode_dirty(handle, inode);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACL_TYPE_DEFAULT:
|
||||
|
|
@ -234,6 +227,8 @@ ext4_set_acl(struct inode *inode, struct posix_acl *acl, int type)
|
|||
{
|
||||
handle_t *handle;
|
||||
int error, retries = 0;
|
||||
umode_t mode = inode->i_mode;
|
||||
int update_mode = 0;
|
||||
|
||||
retry:
|
||||
handle = ext4_journal_start(inode, EXT4_HT_XATTR,
|
||||
|
|
@ -241,7 +236,20 @@ ext4_set_acl(struct inode *inode, struct posix_acl *acl, int type)
|
|||
if (IS_ERR(handle))
|
||||
return PTR_ERR(handle);
|
||||
|
||||
if ((type == ACL_TYPE_ACCESS) && acl) {
|
||||
error = posix_acl_update_mode(inode, &mode, &acl);
|
||||
if (error)
|
||||
goto out_stop;
|
||||
update_mode = 1;
|
||||
}
|
||||
|
||||
error = __ext4_set_acl(handle, inode, type, acl);
|
||||
if (!error && update_mode) {
|
||||
inode->i_mode = mode;
|
||||
inode->i_ctime = ext4_current_time(inode);
|
||||
ext4_mark_inode_dirty(handle, inode);
|
||||
}
|
||||
out_stop:
|
||||
ext4_journal_stop(handle);
|
||||
if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
|
||||
goto retry;
|
||||
|
|
|
|||
|
|
@ -1964,15 +1964,29 @@ static int ext4_writepage(struct page *page,
|
|||
static int mpage_submit_page(struct mpage_da_data *mpd, struct page *page)
|
||||
{
|
||||
int len;
|
||||
loff_t size = i_size_read(mpd->inode);
|
||||
loff_t size;
|
||||
int err;
|
||||
|
||||
BUG_ON(page->index != mpd->first_page);
|
||||
if (page->index == size >> PAGE_CACHE_SHIFT)
|
||||
len = size & ~PAGE_CACHE_MASK;
|
||||
else
|
||||
len = PAGE_CACHE_SIZE;
|
||||
clear_page_dirty_for_io(page);
|
||||
/*
|
||||
* We have to be very careful here! Nothing protects writeback path
|
||||
* against i_size changes and the page can be writeably mapped into
|
||||
* page tables. So an application can be growing i_size and writing
|
||||
* data through mmap while writeback runs. clear_page_dirty_for_io()
|
||||
* write-protects our page in page tables and the page cannot get
|
||||
* written to again until we release page lock. So only after
|
||||
* clear_page_dirty_for_io() we are safe to sample i_size for
|
||||
* ext4_bio_write_page() to zero-out tail of the written page. We rely
|
||||
* on the barrier provided by TestClearPageDirty in
|
||||
* clear_page_dirty_for_io() to make sure i_size is really sampled only
|
||||
* after page tables are updated.
|
||||
*/
|
||||
size = i_size_read(mpd->inode);
|
||||
if (page->index == size >> PAGE_SHIFT)
|
||||
len = size & ~PAGE_MASK;
|
||||
else
|
||||
len = PAGE_SIZE;
|
||||
err = ext4_bio_write_page(&mpd->io_submit, page, len, mpd->wbc, false);
|
||||
if (!err)
|
||||
mpd->wbc->nr_to_write--;
|
||||
|
|
|
|||
|
|
@ -3506,6 +3506,12 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
int credits;
|
||||
u8 old_file_type;
|
||||
|
||||
if ((ext4_encrypted_inode(old_dir) &&
|
||||
!ext4_has_encryption_key(old_dir)) ||
|
||||
(ext4_encrypted_inode(new_dir) &&
|
||||
!ext4_has_encryption_key(new_dir)))
|
||||
return -ENOKEY;
|
||||
|
||||
retval = dquot_initialize(old.dir);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
|
@ -3706,6 +3712,12 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
u8 new_file_type;
|
||||
int retval;
|
||||
|
||||
if ((ext4_encrypted_inode(old_dir) &&
|
||||
!ext4_has_encryption_key(old_dir)) ||
|
||||
(ext4_encrypted_inode(new_dir) &&
|
||||
!ext4_has_encryption_key(new_dir)))
|
||||
return -ENOKEY;
|
||||
|
||||
if ((ext4_encrypted_inode(old_dir) ||
|
||||
ext4_encrypted_inode(new_dir)) &&
|
||||
(old_dir != new_dir) &&
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ xattr_getsecurity(struct inode *inode, const char *name, void *value,
|
|||
}
|
||||
memcpy(value, buffer, len);
|
||||
out:
|
||||
security_release_secctx(buffer, len);
|
||||
kfree(buffer);
|
||||
out_noalloc:
|
||||
return len;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,9 @@ static inline void cpuset_dec(void)
|
|||
|
||||
extern int cpuset_init(void);
|
||||
extern void cpuset_init_smp(void);
|
||||
extern void cpuset_force_rebuild(void);
|
||||
extern void cpuset_update_active_cpus(bool cpu_online);
|
||||
extern void cpuset_wait_for_hotplug(void);
|
||||
extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask);
|
||||
extern void cpuset_cpus_allowed_fallback(struct task_struct *p);
|
||||
extern nodemask_t cpuset_mems_allowed(struct task_struct *p);
|
||||
|
|
@ -147,11 +149,15 @@ static inline bool cpusets_enabled(void) { return false; }
|
|||
static inline int cpuset_init(void) { return 0; }
|
||||
static inline void cpuset_init_smp(void) {}
|
||||
|
||||
static inline void cpuset_force_rebuild(void) { }
|
||||
|
||||
static inline void cpuset_update_active_cpus(bool cpu_online)
|
||||
{
|
||||
partition_sched_domains(1, NULL, NULL);
|
||||
}
|
||||
|
||||
static inline void cpuset_wait_for_hotplug(void) { }
|
||||
|
||||
static inline void cpuset_cpus_allowed(struct task_struct *p,
|
||||
struct cpumask *mask)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -111,6 +111,9 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
|
|||
int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
|
||||
unsigned int size, unsigned int *val);
|
||||
|
||||
int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
|
||||
unsigned int reset_length);
|
||||
|
||||
int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan, int *val);
|
||||
int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,
|
||||
|
|
|
|||
|
|
@ -717,6 +717,7 @@ struct usb_interface_assoc_descriptor {
|
|||
__u8 iFunction;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define USB_DT_INTERFACE_ASSOCIATION_SIZE 8
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -2294,6 +2294,13 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs)
|
|||
mutex_unlock(&cpuset_mutex);
|
||||
}
|
||||
|
||||
static bool force_rebuild;
|
||||
|
||||
void cpuset_force_rebuild(void)
|
||||
{
|
||||
force_rebuild = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* cpuset_hotplug_workfn - handle CPU/memory hotunplug for a cpuset
|
||||
*
|
||||
|
|
@ -2368,8 +2375,10 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
|
|||
}
|
||||
|
||||
/* rebuild sched domains if cpus_allowed has changed */
|
||||
if (cpus_updated)
|
||||
if (cpus_updated || force_rebuild) {
|
||||
force_rebuild = false;
|
||||
rebuild_sched_domains();
|
||||
}
|
||||
}
|
||||
|
||||
void cpuset_update_active_cpus(bool cpu_online)
|
||||
|
|
@ -2388,6 +2397,11 @@ void cpuset_update_active_cpus(bool cpu_online)
|
|||
schedule_work(&cpuset_hotplug_work);
|
||||
}
|
||||
|
||||
void cpuset_wait_for_hotplug(void)
|
||||
{
|
||||
flush_work(&cpuset_hotplug_work);
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep top_cpuset.mems_allowed tracking node_states[N_MEMORY].
|
||||
* Call this routine anytime after node_states[N_MEMORY] changes.
|
||||
|
|
|
|||
|
|
@ -19,8 +19,9 @@
|
|||
#include <linux/kmod.h>
|
||||
#include <trace/events/power.h>
|
||||
#include <linux/wakeup_reason.h>
|
||||
#include <linux/cpuset.h>
|
||||
|
||||
/*
|
||||
/*
|
||||
* Timeout for stopping processes
|
||||
*/
|
||||
unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
|
||||
|
|
@ -208,6 +209,8 @@ void thaw_processes(void)
|
|||
__usermodehelper_set_disable_depth(UMH_FREEZING);
|
||||
thaw_workqueues();
|
||||
|
||||
cpuset_wait_for_hotplug();
|
||||
|
||||
read_lock(&tasklist_lock);
|
||||
for_each_process_thread(g, p) {
|
||||
/* No other threads should have PF_SUSPEND_TASK set */
|
||||
|
|
|
|||
|
|
@ -7641,17 +7641,16 @@ static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action,
|
|||
* operation in the resume sequence, just build a single sched
|
||||
* domain, ignoring cpusets.
|
||||
*/
|
||||
num_cpus_frozen--;
|
||||
if (likely(num_cpus_frozen)) {
|
||||
partition_sched_domains(1, NULL, NULL);
|
||||
partition_sched_domains(1, NULL, NULL);
|
||||
if (--num_cpus_frozen)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the last CPU online operation. So fall through and
|
||||
* restore the original sched domains by considering the
|
||||
* cpuset configurations.
|
||||
*/
|
||||
cpuset_force_rebuild();
|
||||
|
||||
case CPU_ONLINE:
|
||||
cpuset_update_active_cpus(true);
|
||||
|
|
|
|||
|
|
@ -4315,9 +4315,6 @@ static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;
|
|||
static char ftrace_graph_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
|
||||
static int ftrace_set_func(unsigned long *array, int *idx, int size, char *buffer);
|
||||
|
||||
static unsigned long save_global_trampoline;
|
||||
static unsigned long save_global_flags;
|
||||
|
||||
static int __init set_graph_function(char *str)
|
||||
{
|
||||
strlcpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE);
|
||||
|
|
@ -5907,17 +5904,6 @@ void unregister_ftrace_graph(void)
|
|||
unregister_pm_notifier(&ftrace_suspend_notifier);
|
||||
unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL);
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
/*
|
||||
* Function graph does not allocate the trampoline, but
|
||||
* other global_ops do. We need to reset the ALLOC_TRAMP flag
|
||||
* if one was used.
|
||||
*/
|
||||
global_ops.trampoline = save_global_trampoline;
|
||||
if (save_global_flags & FTRACE_OPS_FL_ALLOC_TRAMP)
|
||||
global_ops.flags |= FTRACE_OPS_FL_ALLOC_TRAMP;
|
||||
#endif
|
||||
|
||||
out:
|
||||
mutex_unlock(&ftrace_lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1459,7 +1459,7 @@ static int smack_inode_removexattr(struct dentry *dentry, const char *name)
|
|||
* @inode: the object
|
||||
* @name: attribute name
|
||||
* @buffer: where to put the result
|
||||
* @alloc: unused
|
||||
* @alloc: duplicate memory
|
||||
*
|
||||
* Returns the size of the attribute or an error code
|
||||
*/
|
||||
|
|
@ -1472,43 +1472,38 @@ static int smack_inode_getsecurity(const struct inode *inode,
|
|||
struct super_block *sbp;
|
||||
struct inode *ip = (struct inode *)inode;
|
||||
struct smack_known *isp;
|
||||
int ilen;
|
||||
int rc = 0;
|
||||
|
||||
if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) {
|
||||
if (strcmp(name, XATTR_SMACK_SUFFIX) == 0)
|
||||
isp = smk_of_inode(inode);
|
||||
ilen = strlen(isp->smk_known);
|
||||
*buffer = isp->smk_known;
|
||||
return ilen;
|
||||
else {
|
||||
/*
|
||||
* The rest of the Smack xattrs are only on sockets.
|
||||
*/
|
||||
sbp = ip->i_sb;
|
||||
if (sbp->s_magic != SOCKFS_MAGIC)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
sock = SOCKET_I(ip);
|
||||
if (sock == NULL || sock->sk == NULL)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ssp = sock->sk->sk_security;
|
||||
|
||||
if (strcmp(name, XATTR_SMACK_IPIN) == 0)
|
||||
isp = ssp->smk_in;
|
||||
else if (strcmp(name, XATTR_SMACK_IPOUT) == 0)
|
||||
isp = ssp->smk_out;
|
||||
else
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/*
|
||||
* The rest of the Smack xattrs are only on sockets.
|
||||
*/
|
||||
sbp = ip->i_sb;
|
||||
if (sbp->s_magic != SOCKFS_MAGIC)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
sock = SOCKET_I(ip);
|
||||
if (sock == NULL || sock->sk == NULL)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ssp = sock->sk->sk_security;
|
||||
|
||||
if (strcmp(name, XATTR_SMACK_IPIN) == 0)
|
||||
isp = ssp->smk_in;
|
||||
else if (strcmp(name, XATTR_SMACK_IPOUT) == 0)
|
||||
isp = ssp->smk_out;
|
||||
else
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ilen = strlen(isp->smk_known);
|
||||
if (rc == 0) {
|
||||
*buffer = isp->smk_known;
|
||||
rc = ilen;
|
||||
if (alloc) {
|
||||
*buffer = kstrdup(isp->smk_known, GFP_KERNEL);
|
||||
if (*buffer == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return rc;
|
||||
return strlen(isp->smk_known);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -872,14 +872,13 @@ static const struct file_operations snd_compr_file_ops = {
|
|||
static int snd_compress_dev_register(struct snd_device *device)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
char str[16];
|
||||
struct snd_compr *compr;
|
||||
|
||||
if (snd_BUG_ON(!device || !device->device_data))
|
||||
return -EBADFD;
|
||||
compr = device->device_data;
|
||||
|
||||
pr_debug("reg %s for device %s, direction %d\n", str, compr->name,
|
||||
pr_debug("reg device %s, direction %d\n", compr->name,
|
||||
compr->direction);
|
||||
/* register compressed device */
|
||||
ret = snd_register_device(SNDRV_DEVICE_TYPE_COMPRESS,
|
||||
|
|
|
|||
|
|
@ -217,6 +217,7 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
|
|||
struct usb_interface_descriptor *altsd;
|
||||
void *control_header;
|
||||
int i, protocol;
|
||||
int rest_bytes;
|
||||
|
||||
/* find audiocontrol interface */
|
||||
host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0];
|
||||
|
|
@ -231,6 +232,15 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
rest_bytes = (void *)(host_iface->extra + host_iface->extralen) -
|
||||
control_header;
|
||||
|
||||
/* just to be sure -- this shouldn't hit at all */
|
||||
if (rest_bytes <= 0) {
|
||||
dev_err(&dev->dev, "invalid control header\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (protocol) {
|
||||
default:
|
||||
dev_warn(&dev->dev,
|
||||
|
|
@ -241,11 +251,21 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
|
|||
case UAC_VERSION_1: {
|
||||
struct uac1_ac_header_descriptor *h1 = control_header;
|
||||
|
||||
if (rest_bytes < sizeof(*h1)) {
|
||||
dev_err(&dev->dev, "too short v1 buffer descriptor\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!h1->bInCollection) {
|
||||
dev_info(&dev->dev, "skipping empty audio interface (v1)\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (rest_bytes < h1->bLength) {
|
||||
dev_err(&dev->dev, "invalid buffer length (v1)\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (h1->bLength < sizeof(*h1) + h1->bInCollection) {
|
||||
dev_err(&dev->dev, "invalid UAC_HEADER (v1)\n");
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -191,7 +191,8 @@ struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk,
|
|||
}
|
||||
|
||||
pg = get_order(read_size);
|
||||
sk->s = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO, pg);
|
||||
sk->s = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO|
|
||||
__GFP_NOWARN, pg);
|
||||
if (!sk->s) {
|
||||
snd_printk(KERN_WARNING "couldn't __get_free_pages()\n");
|
||||
goto out;
|
||||
|
|
@ -211,7 +212,8 @@ struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk,
|
|||
pg = get_order(write_size);
|
||||
|
||||
sk->write_page =
|
||||
(void *)__get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO, pg);
|
||||
(void *)__get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO|
|
||||
__GFP_NOWARN, pg);
|
||||
if (!sk->write_page) {
|
||||
snd_printk(KERN_WARNING "couldn't __get_free_pages()\n");
|
||||
usb_stream_free(sk);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user