mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 06:25:52 +02:00
This is the 3.10.15 stable release
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.21 (GNU/Linux) iQIcBAABAgAGBQJSUB6KAAoJEDjbvchgkmk+Kq8P/2ehUrXv8VCbW1GO4U7aYqsn S8dj19FRuSDYX9D6VbZYMEkNLljiJKjTwH8bmbUPOI6Wd6xkdmL77RA7VLpbUGxt I7YpPAKiAWGq9jWNWEDPtSzKITOVh1FrYUB15ISJhcOif3U3ox1xTcfsHAlJmtL/ 9uYx2kUMv70iuW3cnrwaBLS0tSI3hL/aeF8pf2nIA77+pgj6OfKTM8pLpf0tIyIg R9q61syVwMba3dVQT6hcbAsqDfxcFAEasP3WT82mPW+s0usO43PS0nl8lirmjvQv /d/npoeDZDs5vicS8bGygiV6mDr778nVbJtWheUSyBX0R78u89lfyYL6s27FHbIX eBMGu3lGcP7lz8fN1fPvPz+M1QzIcvb+PLrqSkfAgKiPNW4I7bWQe1jxbUUhB48H eSP22xSXP0KkxdK5N5BJwAAT00ENFfL9NRTIsjHWTZs0sq4I3FYU3EznZ5IwXalN rwR2gWyVv0df+t4825rszSBv8E+9noamOpLUx1a82pgdb0n99+xtob1DSLI65LLD KXFAok60a6+s4bESwhnWPQM9NSUQ0C+Q+RHv3AKg+Cdn4UJGPp+LMizTtiENCkAD AGl+v2fZtTdiNInWlR1dQbTzcWhn3OUziplTarr2W3X4QvqW4c1Utr+eS32AZkGh VmHkeePBH+cAYSQHHBeV =ymNh -----END PGP SIGNATURE----- Merge tag 'v3.10.15' into linux-linaro-lsk This is the 3.10.15 stable release
This commit is contained in:
commit
a3dfd8c063
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 14
|
||||
SUBLEVEL = 15
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ AES_Te:
|
|||
@ const AES_KEY *key) {
|
||||
.align 5
|
||||
ENTRY(AES_encrypt)
|
||||
sub r3,pc,#8 @ AES_encrypt
|
||||
adr r3,AES_encrypt
|
||||
stmdb sp!,{r1,r4-r12,lr}
|
||||
mov r12,r0 @ inp
|
||||
mov r11,r2
|
||||
|
|
@ -381,7 +381,7 @@ _armv4_AES_encrypt:
|
|||
.align 5
|
||||
ENTRY(private_AES_set_encrypt_key)
|
||||
_armv4_AES_set_encrypt_key:
|
||||
sub r3,pc,#8 @ AES_set_encrypt_key
|
||||
adr r3,_armv4_AES_set_encrypt_key
|
||||
teq r0,#0
|
||||
moveq r0,#-1
|
||||
beq .Labrt
|
||||
|
|
@ -843,7 +843,7 @@ AES_Td:
|
|||
@ const AES_KEY *key) {
|
||||
.align 5
|
||||
ENTRY(AES_decrypt)
|
||||
sub r3,pc,#8 @ AES_decrypt
|
||||
adr r3,AES_decrypt
|
||||
stmdb sp!,{r1,r4-r12,lr}
|
||||
mov r12,r0 @ inp
|
||||
mov r11,r2
|
||||
|
|
|
|||
|
|
@ -9,6 +9,10 @@
|
|||
#ifndef __ARCH_MXS_PM_H
|
||||
#define __ARCH_MXS_PM_H
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
void mxs_pm_init(void);
|
||||
#else
|
||||
#define mxs_pm_init NULL
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -447,6 +447,22 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Precision M6600"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on the Dell PowerEdge C6100. */
|
||||
.callback = set_pci_reboot,
|
||||
.ident = "Dell PowerEdge C6100",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "C6100"),
|
||||
},
|
||||
},
|
||||
{ /* Some C6100 machines were shipped with vendor being 'Dell'. */
|
||||
.callback = set_pci_reboot,
|
||||
.ident = "Dell PowerEdge C6100",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "C6100"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -910,10 +910,13 @@ void __init efi_enter_virtual_mode(void)
|
|||
|
||||
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
||||
md = p;
|
||||
if (!(md->attribute & EFI_MEMORY_RUNTIME) &&
|
||||
md->type != EFI_BOOT_SERVICES_CODE &&
|
||||
md->type != EFI_BOOT_SERVICES_DATA)
|
||||
continue;
|
||||
if (!(md->attribute & EFI_MEMORY_RUNTIME)) {
|
||||
#ifdef CONFIG_X86_64
|
||||
if (md->type != EFI_BOOT_SERVICES_CODE &&
|
||||
md->type != EFI_BOOT_SERVICES_DATA)
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
||||
size = md->num_pages << EFI_PAGE_SHIFT;
|
||||
end = md->phys_addr + size;
|
||||
|
|
|
|||
|
|
@ -1839,7 +1839,7 @@ EXPORT_SYMBOL_GPL(device_move);
|
|||
*/
|
||||
void device_shutdown(void)
|
||||
{
|
||||
struct device *dev;
|
||||
struct device *dev, *parent;
|
||||
|
||||
spin_lock(&devices_kset->list_lock);
|
||||
/*
|
||||
|
|
@ -1856,7 +1856,7 @@ void device_shutdown(void)
|
|||
* prevent it from being freed because parent's
|
||||
* lock is to be held
|
||||
*/
|
||||
get_device(dev->parent);
|
||||
parent = get_device(dev->parent);
|
||||
get_device(dev);
|
||||
/*
|
||||
* Make sure the device is off the kset list, in the
|
||||
|
|
@ -1866,8 +1866,8 @@ void device_shutdown(void)
|
|||
spin_unlock(&devices_kset->list_lock);
|
||||
|
||||
/* hold lock to avoid race with probe/release */
|
||||
if (dev->parent)
|
||||
device_lock(dev->parent);
|
||||
if (parent)
|
||||
device_lock(parent);
|
||||
device_lock(dev);
|
||||
|
||||
/* Don't allow any more runtime suspends */
|
||||
|
|
@ -1885,11 +1885,11 @@ void device_shutdown(void)
|
|||
}
|
||||
|
||||
device_unlock(dev);
|
||||
if (dev->parent)
|
||||
device_unlock(dev->parent);
|
||||
if (parent)
|
||||
device_unlock(parent);
|
||||
|
||||
put_device(dev);
|
||||
put_device(dev->parent);
|
||||
put_device(parent);
|
||||
|
||||
spin_lock(&devices_kset->list_lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1675,10 +1675,16 @@
|
|||
#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
|
||||
|
||||
#define PORT_HOTPLUG_STAT (dev_priv->info->display_mmio_offset + 0x61114)
|
||||
/* HDMI/DP bits are gen4+ */
|
||||
#define PORTB_HOTPLUG_LIVE_STATUS (1 << 29)
|
||||
/*
|
||||
* HDMI/DP bits are gen4+
|
||||
*
|
||||
* WARNING: Bspec for hpd status bits on gen4 seems to be completely confused.
|
||||
* Please check the detailed lore in the commit message for for experimental
|
||||
* evidence.
|
||||
*/
|
||||
#define PORTD_HOTPLUG_LIVE_STATUS (1 << 29)
|
||||
#define PORTC_HOTPLUG_LIVE_STATUS (1 << 28)
|
||||
#define PORTD_HOTPLUG_LIVE_STATUS (1 << 27)
|
||||
#define PORTB_HOTPLUG_LIVE_STATUS (1 << 27)
|
||||
#define PORTD_HOTPLUG_INT_STATUS (3 << 21)
|
||||
#define PORTC_HOTPLUG_INT_STATUS (3 << 19)
|
||||
#define PORTB_HOTPLUG_INT_STATUS (3 << 17)
|
||||
|
|
|
|||
|
|
@ -4564,6 +4564,10 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
|
|||
|
||||
pipeconf = I915_READ(PIPECONF(intel_crtc->pipe));
|
||||
|
||||
if (dev_priv->quirks & QUIRK_PIPEA_FORCE &&
|
||||
I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE)
|
||||
pipeconf |= PIPECONF_ENABLE;
|
||||
|
||||
if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) {
|
||||
/* Enable pixel doubling when the dot clock is > 90% of the (display)
|
||||
* core speed.
|
||||
|
|
|
|||
|
|
@ -604,7 +604,18 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
|
|||
DRM_DEBUG_KMS("aux_ch native nack\n");
|
||||
return -EREMOTEIO;
|
||||
case AUX_NATIVE_REPLY_DEFER:
|
||||
udelay(100);
|
||||
/*
|
||||
* For now, just give more slack to branch devices. We
|
||||
* could check the DPCD for I2C bit rate capabilities,
|
||||
* and if available, adjust the interval. We could also
|
||||
* be more careful with DP-to-Legacy adapters where a
|
||||
* long legacy cable may force very low I2C bit rates.
|
||||
*/
|
||||
if (intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
|
||||
DP_DWN_STRM_PORT_PRESENT)
|
||||
usleep_range(500, 600);
|
||||
else
|
||||
usleep_range(300, 400);
|
||||
continue;
|
||||
default:
|
||||
DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
|
||||
|
|
|
|||
|
|
@ -921,6 +921,14 @@ intel_tv_compute_config(struct intel_encoder *encoder,
|
|||
DRM_DEBUG_KMS("forcing bpc to 8 for TV\n");
|
||||
pipe_config->pipe_bpp = 8*3;
|
||||
|
||||
/* TV has it's own notion of sync and other mode flags, so clear them. */
|
||||
pipe_config->adjusted_mode.flags = 0;
|
||||
|
||||
/*
|
||||
* FIXME: We don't check whether the input mode is actually what we want
|
||||
* or whether userspace is doing something stupid.
|
||||
*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2935,9 +2935,11 @@ static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data)
|
|||
seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp);
|
||||
seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
|
||||
seq_printf(m, "%u dwords in ring\n", count);
|
||||
for (j = 0; j <= count; j++) {
|
||||
i = (rdp + j) & ring->ptr_mask;
|
||||
seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]);
|
||||
if (ring->ready) {
|
||||
for (j = 0; j <= count; j++) {
|
||||
i = (rdp + j) & ring->ptr_mask;
|
||||
seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -238,9 +238,19 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
|
|||
* number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE
|
||||
* is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
|
||||
*/
|
||||
if (ASIC_IS_DCE3(rdev)) {
|
||||
if (ASIC_IS_DCE32(rdev)) {
|
||||
if (dig->dig_encoder == 0) {
|
||||
WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100);
|
||||
WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100);
|
||||
WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */
|
||||
} else {
|
||||
WREG32(DCCG_AUDIO_DTO1_PHASE, base_rate * 100);
|
||||
WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100);
|
||||
WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
|
||||
}
|
||||
} else if (ASIC_IS_DCE3(rdev)) {
|
||||
/* according to the reg specs, this should DCE3.2 only, but in
|
||||
* practice it seems to cover DCE3.0 as well.
|
||||
* practice it seems to cover DCE3.0/3.1 as well.
|
||||
*/
|
||||
if (dig->dig_encoder == 0) {
|
||||
WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100);
|
||||
|
|
@ -252,7 +262,7 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
|
|||
WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
|
||||
}
|
||||
} else {
|
||||
/* according to the reg specs, this should be DCE2.0 and DCE3.0 */
|
||||
/* according to the reg specs, this should be DCE2.0 and DCE3.0/3.1 */
|
||||
WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) |
|
||||
AUDIO_DTO_MODULE(clock / 10));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -892,6 +892,8 @@ static struct radeon_asic r520_asic = {
|
|||
.wait_for_vblank = &avivo_wait_for_vblank,
|
||||
.set_backlight_level = &atombios_set_backlight_level,
|
||||
.get_backlight_level = &atombios_get_backlight_level,
|
||||
.hdmi_enable = &r600_hdmi_enable,
|
||||
.hdmi_setmode = &r600_hdmi_setmode,
|
||||
},
|
||||
.copy = {
|
||||
.blit = &r100_copy_blit,
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
|
|||
VRAM, also but everything into VRAM on AGP cards to avoid
|
||||
image corruptions */
|
||||
if (p->ring == R600_RING_TYPE_UVD_INDEX &&
|
||||
(i == 0 || p->rdev->flags & RADEON_IS_AGP)) {
|
||||
(i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) {
|
||||
/* TODO: is this still needed for NI+ ? */
|
||||
p->relocs[i].lobj.domain =
|
||||
RADEON_GEM_DOMAIN_VRAM;
|
||||
|
|
|
|||
|
|
@ -1196,13 +1196,22 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||
return r;
|
||||
}
|
||||
if ((radeon_testing & 1)) {
|
||||
radeon_test_moves(rdev);
|
||||
if (rdev->accel_working)
|
||||
radeon_test_moves(rdev);
|
||||
else
|
||||
DRM_INFO("radeon: acceleration disabled, skipping move tests\n");
|
||||
}
|
||||
if ((radeon_testing & 2)) {
|
||||
radeon_test_syncing(rdev);
|
||||
if (rdev->accel_working)
|
||||
radeon_test_syncing(rdev);
|
||||
else
|
||||
DRM_INFO("radeon: acceleration disabled, skipping sync tests\n");
|
||||
}
|
||||
if (radeon_benchmarking) {
|
||||
radeon_benchmark(rdev, radeon_benchmarking);
|
||||
if (rdev->accel_working)
|
||||
radeon_benchmark(rdev, radeon_benchmarking);
|
||||
else
|
||||
DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -823,9 +823,11 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
|
|||
* packet that is the root issue
|
||||
*/
|
||||
i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask;
|
||||
for (j = 0; j <= (count + 32); j++) {
|
||||
seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]);
|
||||
i = (i + 1) & ring->ptr_mask;
|
||||
if (ring->ready) {
|
||||
for (j = 0; j <= (count + 32); j++) {
|
||||
seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]);
|
||||
i = (i + 1) & ring->ptr_mask;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -525,16 +525,25 @@ static int applesmc_init_smcreg_try(void)
|
|||
{
|
||||
struct applesmc_registers *s = &smcreg;
|
||||
bool left_light_sensor, right_light_sensor;
|
||||
unsigned int count;
|
||||
u8 tmp[1];
|
||||
int ret;
|
||||
|
||||
if (s->init_complete)
|
||||
return 0;
|
||||
|
||||
ret = read_register_count(&s->key_count);
|
||||
ret = read_register_count(&count);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (s->cache && s->key_count != count) {
|
||||
pr_warn("key count changed from %d to %d\n",
|
||||
s->key_count, count);
|
||||
kfree(s->cache);
|
||||
s->cache = NULL;
|
||||
}
|
||||
s->key_count = count;
|
||||
|
||||
if (!s->cache)
|
||||
s->cache = kcalloc(s->key_count, sizeof(*s->cache), GFP_KERNEL);
|
||||
if (!s->cache)
|
||||
|
|
|
|||
|
|
@ -499,7 +499,7 @@ struct cached_dev {
|
|||
*/
|
||||
atomic_t has_dirty;
|
||||
|
||||
struct ratelimit writeback_rate;
|
||||
struct bch_ratelimit writeback_rate;
|
||||
struct delayed_work writeback_rate_update;
|
||||
|
||||
/*
|
||||
|
|
@ -508,10 +508,9 @@ struct cached_dev {
|
|||
*/
|
||||
sector_t last_read;
|
||||
|
||||
/* Number of writeback bios in flight */
|
||||
atomic_t in_flight;
|
||||
/* Limit number of writeback bios in flight */
|
||||
struct semaphore in_flight;
|
||||
struct closure_with_timer writeback;
|
||||
struct closure_waitlist writeback_wait;
|
||||
|
||||
struct keybuf writeback_keys;
|
||||
|
||||
|
|
|
|||
|
|
@ -918,28 +918,45 @@ struct bkey *bch_next_recurse_key(struct btree *b, struct bkey *search)
|
|||
|
||||
/* Mergesort */
|
||||
|
||||
static void sort_key_next(struct btree_iter *iter,
|
||||
struct btree_iter_set *i)
|
||||
{
|
||||
i->k = bkey_next(i->k);
|
||||
|
||||
if (i->k == i->end)
|
||||
*i = iter->data[--iter->used];
|
||||
}
|
||||
|
||||
static void btree_sort_fixup(struct btree_iter *iter)
|
||||
{
|
||||
while (iter->used > 1) {
|
||||
struct btree_iter_set *top = iter->data, *i = top + 1;
|
||||
struct bkey *k;
|
||||
|
||||
if (iter->used > 2 &&
|
||||
btree_iter_cmp(i[0], i[1]))
|
||||
i++;
|
||||
|
||||
for (k = i->k;
|
||||
k != i->end && bkey_cmp(top->k, &START_KEY(k)) > 0;
|
||||
k = bkey_next(k))
|
||||
if (top->k > i->k)
|
||||
__bch_cut_front(top->k, k);
|
||||
else if (KEY_SIZE(k))
|
||||
bch_cut_back(&START_KEY(k), top->k);
|
||||
|
||||
if (top->k < i->k || k == i->k)
|
||||
if (bkey_cmp(top->k, &START_KEY(i->k)) <= 0)
|
||||
break;
|
||||
|
||||
heap_sift(iter, i - top, btree_iter_cmp);
|
||||
if (!KEY_SIZE(i->k)) {
|
||||
sort_key_next(iter, i);
|
||||
heap_sift(iter, i - top, btree_iter_cmp);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (top->k > i->k) {
|
||||
if (bkey_cmp(top->k, i->k) >= 0)
|
||||
sort_key_next(iter, i);
|
||||
else
|
||||
bch_cut_front(top->k, i->k);
|
||||
|
||||
heap_sift(iter, i - top, btree_iter_cmp);
|
||||
} else {
|
||||
/* can't happen because of comparison func */
|
||||
BUG_ON(!bkey_cmp(&START_KEY(top->k), &START_KEY(i->k)));
|
||||
bch_cut_back(&START_KEY(i->k), top->k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -633,7 +633,7 @@ static int bch_mca_shrink(struct shrinker *shrink, struct shrink_control *sc)
|
|||
return mca_can_free(c) * c->btree_pages;
|
||||
|
||||
/* Return -1 if we can't do anything right now */
|
||||
if (sc->gfp_mask & __GFP_WAIT)
|
||||
if (sc->gfp_mask & __GFP_IO)
|
||||
mutex_lock(&c->bucket_lock);
|
||||
else if (!mutex_trylock(&c->bucket_lock))
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -151,7 +151,8 @@ int bch_journal_read(struct cache_set *c, struct list_head *list,
|
|||
bitmap_zero(bitmap, SB_JOURNAL_BUCKETS);
|
||||
pr_debug("%u journal buckets", ca->sb.njournal_buckets);
|
||||
|
||||
/* Read journal buckets ordered by golden ratio hash to quickly
|
||||
/*
|
||||
* Read journal buckets ordered by golden ratio hash to quickly
|
||||
* find a sequence of buckets with valid journal entries
|
||||
*/
|
||||
for (i = 0; i < ca->sb.njournal_buckets; i++) {
|
||||
|
|
@ -164,18 +165,20 @@ int bch_journal_read(struct cache_set *c, struct list_head *list,
|
|||
goto bsearch;
|
||||
}
|
||||
|
||||
/* If that fails, check all the buckets we haven't checked
|
||||
/*
|
||||
* If that fails, check all the buckets we haven't checked
|
||||
* already
|
||||
*/
|
||||
pr_debug("falling back to linear search");
|
||||
|
||||
for (l = 0; l < ca->sb.njournal_buckets; l++) {
|
||||
if (test_bit(l, bitmap))
|
||||
continue;
|
||||
|
||||
for (l = find_first_zero_bit(bitmap, ca->sb.njournal_buckets);
|
||||
l < ca->sb.njournal_buckets;
|
||||
l = find_next_zero_bit(bitmap, ca->sb.njournal_buckets, l + 1))
|
||||
if (read_bucket(l))
|
||||
goto bsearch;
|
||||
}
|
||||
|
||||
if (list_empty(list))
|
||||
continue;
|
||||
bsearch:
|
||||
/* Binary search */
|
||||
m = r = find_next_bit(bitmap, ca->sb.njournal_buckets, l + 1);
|
||||
|
|
@ -195,10 +198,12 @@ int bch_journal_read(struct cache_set *c, struct list_head *list,
|
|||
r = m;
|
||||
}
|
||||
|
||||
/* Read buckets in reverse order until we stop finding more
|
||||
/*
|
||||
* Read buckets in reverse order until we stop finding more
|
||||
* journal entries
|
||||
*/
|
||||
pr_debug("finishing up");
|
||||
pr_debug("finishing up: m %u njournal_buckets %u",
|
||||
m, ca->sb.njournal_buckets);
|
||||
l = m;
|
||||
|
||||
while (1) {
|
||||
|
|
@ -226,9 +231,10 @@ int bch_journal_read(struct cache_set *c, struct list_head *list,
|
|||
}
|
||||
}
|
||||
|
||||
c->journal.seq = list_entry(list->prev,
|
||||
struct journal_replay,
|
||||
list)->j.seq;
|
||||
if (!list_empty(list))
|
||||
c->journal.seq = list_entry(list->prev,
|
||||
struct journal_replay,
|
||||
list)->j.seq;
|
||||
|
||||
return 0;
|
||||
#undef read_bucket
|
||||
|
|
@ -425,7 +431,7 @@ static void do_journal_discard(struct cache *ca)
|
|||
return;
|
||||
}
|
||||
|
||||
switch (atomic_read(&ja->discard_in_flight) == DISCARD_IN_FLIGHT) {
|
||||
switch (atomic_read(&ja->discard_in_flight)) {
|
||||
case DISCARD_IN_FLIGHT:
|
||||
return;
|
||||
|
||||
|
|
@ -686,6 +692,7 @@ void bch_journal_meta(struct cache_set *c, struct closure *cl)
|
|||
if (cl)
|
||||
BUG_ON(!closure_wait(&w->wait, cl));
|
||||
|
||||
closure_flush(&c->journal.io);
|
||||
__journal_try_write(c, true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1056,14 +1056,17 @@ static void request_write(struct cached_dev *dc, struct search *s)
|
|||
trace_bcache_writeback(s->orig_bio);
|
||||
bch_writeback_add(dc, bio_sectors(bio));
|
||||
|
||||
if (s->op.flush_journal) {
|
||||
if (bio->bi_rw & REQ_FLUSH) {
|
||||
/* Also need to send a flush to the backing device */
|
||||
s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO,
|
||||
dc->disk.bio_split);
|
||||
struct bio *flush = bio_alloc_bioset(0, GFP_NOIO,
|
||||
dc->disk.bio_split);
|
||||
|
||||
bio->bi_size = 0;
|
||||
bio->bi_vcnt = 0;
|
||||
closure_bio_submit(bio, cl, s->d);
|
||||
flush->bi_rw = WRITE_FLUSH;
|
||||
flush->bi_bdev = bio->bi_bdev;
|
||||
flush->bi_end_io = request_endio;
|
||||
flush->bi_private = cl;
|
||||
|
||||
closure_bio_submit(flush, cl, s->d);
|
||||
} else {
|
||||
s->op.cache_bio = bio;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -214,7 +214,13 @@ STORE(__cached_dev)
|
|||
}
|
||||
|
||||
if (attr == &sysfs_label) {
|
||||
memcpy(dc->sb.label, buf, SB_LABEL_SIZE);
|
||||
if (size > SB_LABEL_SIZE)
|
||||
return -EINVAL;
|
||||
memcpy(dc->sb.label, buf, size);
|
||||
if (size < SB_LABEL_SIZE)
|
||||
dc->sb.label[size] = '\0';
|
||||
if (size && dc->sb.label[size - 1] == '\n')
|
||||
dc->sb.label[size - 1] = '\0';
|
||||
bch_write_bdev_super(dc, NULL);
|
||||
if (dc->disk.c) {
|
||||
memcpy(dc->disk.c->uuids[dc->disk.id].label,
|
||||
|
|
|
|||
|
|
@ -190,7 +190,16 @@ void bch_time_stats_update(struct time_stats *stats, uint64_t start_time)
|
|||
stats->last = now ?: 1;
|
||||
}
|
||||
|
||||
unsigned bch_next_delay(struct ratelimit *d, uint64_t done)
|
||||
/**
|
||||
* bch_next_delay() - increment @d by the amount of work done, and return how
|
||||
* long to delay until the next time to do some work.
|
||||
*
|
||||
* @d - the struct bch_ratelimit to update
|
||||
* @done - the amount of work done, in arbitrary units
|
||||
*
|
||||
* Returns the amount of time to delay by, in jiffies
|
||||
*/
|
||||
uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done)
|
||||
{
|
||||
uint64_t now = local_clock();
|
||||
|
||||
|
|
|
|||
|
|
@ -452,17 +452,23 @@ read_attribute(name ## _last_ ## frequency_units)
|
|||
(ewma) >> factor; \
|
||||
})
|
||||
|
||||
struct ratelimit {
|
||||
struct bch_ratelimit {
|
||||
/* Next time we want to do some work, in nanoseconds */
|
||||
uint64_t next;
|
||||
|
||||
/*
|
||||
* Rate at which we want to do work, in units per nanosecond
|
||||
* The units here correspond to the units passed to bch_next_delay()
|
||||
*/
|
||||
unsigned rate;
|
||||
};
|
||||
|
||||
static inline void ratelimit_reset(struct ratelimit *d)
|
||||
static inline void bch_ratelimit_reset(struct bch_ratelimit *d)
|
||||
{
|
||||
d->next = local_clock();
|
||||
}
|
||||
|
||||
unsigned bch_next_delay(struct ratelimit *d, uint64_t done);
|
||||
uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done);
|
||||
|
||||
#define __DIV_SAFE(n, d, zero) \
|
||||
({ \
|
||||
|
|
|
|||
|
|
@ -91,11 +91,15 @@ static void update_writeback_rate(struct work_struct *work)
|
|||
|
||||
static unsigned writeback_delay(struct cached_dev *dc, unsigned sectors)
|
||||
{
|
||||
uint64_t ret;
|
||||
|
||||
if (atomic_read(&dc->disk.detaching) ||
|
||||
!dc->writeback_percent)
|
||||
return 0;
|
||||
|
||||
return bch_next_delay(&dc->writeback_rate, sectors * 10000000ULL);
|
||||
ret = bch_next_delay(&dc->writeback_rate, sectors * 10000000ULL);
|
||||
|
||||
return min_t(uint64_t, ret, HZ);
|
||||
}
|
||||
|
||||
/* Background writeback */
|
||||
|
|
@ -165,7 +169,7 @@ static void refill_dirty(struct closure *cl)
|
|||
|
||||
up_write(&dc->writeback_lock);
|
||||
|
||||
ratelimit_reset(&dc->writeback_rate);
|
||||
bch_ratelimit_reset(&dc->writeback_rate);
|
||||
|
||||
/* Punt to workqueue only so we don't recurse and blow the stack */
|
||||
continue_at(cl, read_dirty, dirty_wq);
|
||||
|
|
@ -246,9 +250,7 @@ static void write_dirty_finish(struct closure *cl)
|
|||
}
|
||||
|
||||
bch_keybuf_del(&dc->writeback_keys, w);
|
||||
atomic_dec_bug(&dc->in_flight);
|
||||
|
||||
closure_wake_up(&dc->writeback_wait);
|
||||
up(&dc->in_flight);
|
||||
|
||||
closure_return_with_destructor(cl, dirty_io_destructor);
|
||||
}
|
||||
|
|
@ -278,7 +280,7 @@ static void write_dirty(struct closure *cl)
|
|||
trace_bcache_write_dirty(&io->bio);
|
||||
closure_bio_submit(&io->bio, cl, &io->dc->disk);
|
||||
|
||||
continue_at(cl, write_dirty_finish, dirty_wq);
|
||||
continue_at(cl, write_dirty_finish, system_wq);
|
||||
}
|
||||
|
||||
static void read_dirty_endio(struct bio *bio, int error)
|
||||
|
|
@ -299,7 +301,7 @@ static void read_dirty_submit(struct closure *cl)
|
|||
trace_bcache_read_dirty(&io->bio);
|
||||
closure_bio_submit(&io->bio, cl, &io->dc->disk);
|
||||
|
||||
continue_at(cl, write_dirty, dirty_wq);
|
||||
continue_at(cl, write_dirty, system_wq);
|
||||
}
|
||||
|
||||
static void read_dirty(struct closure *cl)
|
||||
|
|
@ -324,12 +326,8 @@ static void read_dirty(struct closure *cl)
|
|||
|
||||
if (delay > 0 &&
|
||||
(KEY_START(&w->key) != dc->last_read ||
|
||||
jiffies_to_msecs(delay) > 50)) {
|
||||
w->private = NULL;
|
||||
|
||||
closure_delay(&dc->writeback, delay);
|
||||
continue_at(cl, read_dirty, dirty_wq);
|
||||
}
|
||||
jiffies_to_msecs(delay) > 50))
|
||||
delay = schedule_timeout_uninterruptible(delay);
|
||||
|
||||
dc->last_read = KEY_OFFSET(&w->key);
|
||||
|
||||
|
|
@ -354,15 +352,10 @@ static void read_dirty(struct closure *cl)
|
|||
|
||||
pr_debug("%s", pkey(&w->key));
|
||||
|
||||
closure_call(&io->cl, read_dirty_submit, NULL, &dc->disk.cl);
|
||||
down(&dc->in_flight);
|
||||
closure_call(&io->cl, read_dirty_submit, NULL, cl);
|
||||
|
||||
delay = writeback_delay(dc, KEY_SIZE(&w->key));
|
||||
|
||||
atomic_inc(&dc->in_flight);
|
||||
|
||||
if (!closure_wait_event(&dc->writeback_wait, cl,
|
||||
atomic_read(&dc->in_flight) < 64))
|
||||
continue_at(cl, read_dirty, dirty_wq);
|
||||
}
|
||||
|
||||
if (0) {
|
||||
|
|
@ -372,11 +365,16 @@ static void read_dirty(struct closure *cl)
|
|||
bch_keybuf_del(&dc->writeback_keys, w);
|
||||
}
|
||||
|
||||
refill_dirty(cl);
|
||||
/*
|
||||
* Wait for outstanding writeback IOs to finish (and keybuf slots to be
|
||||
* freed) before refilling again
|
||||
*/
|
||||
continue_at(cl, refill_dirty, dirty_wq);
|
||||
}
|
||||
|
||||
void bch_cached_dev_writeback_init(struct cached_dev *dc)
|
||||
{
|
||||
sema_init(&dc->in_flight, 64);
|
||||
closure_init_unlocked(&dc->writeback);
|
||||
init_rwsem(&dc->writeback_lock);
|
||||
|
||||
|
|
@ -406,7 +404,7 @@ void bch_writeback_exit(void)
|
|||
|
||||
int __init bch_writeback_init(void)
|
||||
{
|
||||
dirty_wq = create_singlethread_workqueue("bcache_writeback");
|
||||
dirty_wq = create_workqueue("bcache_writeback");
|
||||
if (!dirty_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -1284,8 +1284,17 @@ static int do_end_io(struct multipath *m, struct request *clone,
|
|||
if (!error && !clone->errors)
|
||||
return 0; /* I/O complete */
|
||||
|
||||
if (error == -EOPNOTSUPP || error == -EREMOTEIO || error == -EILSEQ)
|
||||
if (error == -EOPNOTSUPP || error == -EREMOTEIO || error == -EILSEQ) {
|
||||
if ((clone->cmd_flags & REQ_WRITE_SAME) &&
|
||||
!clone->q->limits.max_write_same_sectors) {
|
||||
struct queue_limits *limits;
|
||||
|
||||
/* device doesn't really support WRITE SAME, disable it */
|
||||
limits = dm_get_queue_limits(dm_table_get_md(m->ti->table));
|
||||
limits->max_write_same_sectors = 0;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
if (mpio->pgpath)
|
||||
fail_path(mpio->pgpath);
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size)
|
|||
static int validate_raid_redundancy(struct raid_set *rs)
|
||||
{
|
||||
unsigned i, rebuild_cnt = 0;
|
||||
unsigned rebuilds_per_group, copies, d;
|
||||
unsigned rebuilds_per_group = 0, copies, d;
|
||||
unsigned group_size, last_group_start;
|
||||
|
||||
for (i = 0; i < rs->md.raid_disks; i++)
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw,
|
|||
*/
|
||||
INIT_WORK_ONSTACK(&req.work, do_metadata);
|
||||
queue_work(ps->metadata_wq, &req.work);
|
||||
flush_work(&req.work);
|
||||
flush_workqueue(ps->metadata_wq);
|
||||
|
||||
return req.result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -725,17 +725,16 @@ static int calc_max_buckets(void)
|
|||
*/
|
||||
static int init_hash_tables(struct dm_snapshot *s)
|
||||
{
|
||||
sector_t hash_size, cow_dev_size, origin_dev_size, max_buckets;
|
||||
sector_t hash_size, cow_dev_size, max_buckets;
|
||||
|
||||
/*
|
||||
* Calculate based on the size of the original volume or
|
||||
* the COW volume...
|
||||
*/
|
||||
cow_dev_size = get_dev_size(s->cow->bdev);
|
||||
origin_dev_size = get_dev_size(s->origin->bdev);
|
||||
max_buckets = calc_max_buckets();
|
||||
|
||||
hash_size = min(origin_dev_size, cow_dev_size) >> s->store->chunk_shift;
|
||||
hash_size = cow_dev_size >> s->store->chunk_shift;
|
||||
hash_size = min(hash_size, max_buckets);
|
||||
|
||||
if (hash_size < 64)
|
||||
|
|
|
|||
|
|
@ -2218,6 +2218,17 @@ struct target_type *dm_get_immutable_target_type(struct mapped_device *md)
|
|||
return md->immutable_target_type;
|
||||
}
|
||||
|
||||
/*
|
||||
* The queue_limits are only valid as long as you have a reference
|
||||
* count on 'md'.
|
||||
*/
|
||||
struct queue_limits *dm_get_queue_limits(struct mapped_device *md)
|
||||
{
|
||||
BUG_ON(!atomic_read(&md->holders));
|
||||
return &md->queue->limits;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dm_get_queue_limits);
|
||||
|
||||
/*
|
||||
* Fully initialize a request-based queue (->elevator, ->request_fn, etc).
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ void mei_amthif_reset_params(struct mei_device *dev)
|
|||
dev->iamthif_ioctl = false;
|
||||
dev->iamthif_state = MEI_IAMTHIF_IDLE;
|
||||
dev->iamthif_timer = 0;
|
||||
dev->iamthif_stall_timer = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -295,10 +295,13 @@ int __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length)
|
|||
|
||||
if (cl->reading_state != MEI_READ_COMPLETE &&
|
||||
!waitqueue_active(&cl->rx_wait)) {
|
||||
|
||||
mutex_unlock(&dev->device_lock);
|
||||
|
||||
if (wait_event_interruptible(cl->rx_wait,
|
||||
(MEI_READ_COMPLETE == cl->reading_state))) {
|
||||
cl->reading_state == MEI_READ_COMPLETE ||
|
||||
mei_cl_is_transitioning(cl))) {
|
||||
|
||||
if (signal_pending(current))
|
||||
return -EINTR;
|
||||
return -ERESTARTSYS;
|
||||
|
|
|
|||
|
|
@ -76,6 +76,12 @@ static inline bool mei_cl_cmp_id(const struct mei_cl *cl1,
|
|||
(cl1->host_client_id == cl2->host_client_id) &&
|
||||
(cl1->me_client_id == cl2->me_client_id);
|
||||
}
|
||||
static inline bool mei_cl_is_transitioning(struct mei_cl *cl)
|
||||
{
|
||||
return (MEI_FILE_INITIALIZING == cl->state ||
|
||||
MEI_FILE_DISCONNECTED == cl->state ||
|
||||
MEI_FILE_DISCONNECTING == cl->state);
|
||||
}
|
||||
|
||||
|
||||
int mei_cl_flow_ctrl_creds(struct mei_cl *cl);
|
||||
|
|
|
|||
|
|
@ -35,11 +35,15 @@ static void mei_hbm_me_cl_allocate(struct mei_device *dev)
|
|||
struct mei_me_client *clients;
|
||||
int b;
|
||||
|
||||
dev->me_clients_num = 0;
|
||||
dev->me_client_presentation_num = 0;
|
||||
dev->me_client_index = 0;
|
||||
|
||||
/* count how many ME clients we have */
|
||||
for_each_set_bit(b, dev->me_clients_map, MEI_CLIENTS_MAX)
|
||||
dev->me_clients_num++;
|
||||
|
||||
if (dev->me_clients_num <= 0)
|
||||
if (dev->me_clients_num == 0)
|
||||
return;
|
||||
|
||||
kfree(dev->me_clients);
|
||||
|
|
@ -221,7 +225,7 @@ static int mei_hbm_prop_req(struct mei_device *dev)
|
|||
struct hbm_props_request *prop_req;
|
||||
const size_t len = sizeof(struct hbm_props_request);
|
||||
unsigned long next_client_index;
|
||||
u8 client_num;
|
||||
unsigned long client_num;
|
||||
|
||||
|
||||
client_num = dev->me_client_presentation_num;
|
||||
|
|
@ -650,8 +654,6 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
|
|||
if (dev->dev_state == MEI_DEV_INIT_CLIENTS &&
|
||||
dev->hbm_state == MEI_HBM_ENUM_CLIENTS) {
|
||||
dev->init_clients_timer = 0;
|
||||
dev->me_client_presentation_num = 0;
|
||||
dev->me_client_index = 0;
|
||||
mei_hbm_me_cl_allocate(dev);
|
||||
dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES;
|
||||
|
||||
|
|
|
|||
|
|
@ -164,6 +164,9 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled)
|
|||
memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg));
|
||||
}
|
||||
|
||||
/* we're already in reset, cancel the init timer */
|
||||
dev->init_clients_timer = 0;
|
||||
|
||||
dev->me_clients_num = 0;
|
||||
dev->rd_msg_hdr = 0;
|
||||
dev->wd_pending = false;
|
||||
|
|
|
|||
|
|
@ -262,19 +262,16 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
|
|||
mutex_unlock(&dev->device_lock);
|
||||
|
||||
if (wait_event_interruptible(cl->rx_wait,
|
||||
(MEI_READ_COMPLETE == cl->reading_state ||
|
||||
MEI_FILE_INITIALIZING == cl->state ||
|
||||
MEI_FILE_DISCONNECTED == cl->state ||
|
||||
MEI_FILE_DISCONNECTING == cl->state))) {
|
||||
MEI_READ_COMPLETE == cl->reading_state ||
|
||||
mei_cl_is_transitioning(cl))) {
|
||||
|
||||
if (signal_pending(current))
|
||||
return -EINTR;
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
|
||||
mutex_lock(&dev->device_lock);
|
||||
if (MEI_FILE_INITIALIZING == cl->state ||
|
||||
MEI_FILE_DISCONNECTED == cl->state ||
|
||||
MEI_FILE_DISCONNECTING == cl->state) {
|
||||
if (mei_cl_is_transitioning(cl)) {
|
||||
rets = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -402,9 +402,9 @@ struct mei_device {
|
|||
struct mei_me_client *me_clients; /* Note: memory has to be allocated */
|
||||
DECLARE_BITMAP(me_clients_map, MEI_CLIENTS_MAX);
|
||||
DECLARE_BITMAP(host_clients_map, MEI_CLIENTS_MAX);
|
||||
u8 me_clients_num;
|
||||
u8 me_client_presentation_num;
|
||||
u8 me_client_index;
|
||||
unsigned long me_clients_num;
|
||||
unsigned long me_client_presentation_num;
|
||||
unsigned long me_client_index;
|
||||
|
||||
struct mei_cl wd_cl;
|
||||
enum mei_wd_states wd_state;
|
||||
|
|
|
|||
|
|
@ -1634,6 +1634,9 @@ int iwctl_siwencodeext(struct net_device *dev, struct iw_request_info *info,
|
|||
if (pMgmt == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
if (!(pDevice->flags & DEVICE_FLAGS_OPENED))
|
||||
return -ENODEV;
|
||||
|
||||
buf = kzalloc(sizeof(struct viawget_wpa_param), GFP_KERNEL);
|
||||
if (buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -1099,6 +1099,8 @@ static int device_close(struct net_device *dev)
|
|||
memset(pMgmt->abyCurrBSSID, 0, 6);
|
||||
pMgmt->eCurrState = WMAC_STATE_IDLE;
|
||||
|
||||
pDevice->flags &= ~DEVICE_FLAGS_OPENED;
|
||||
|
||||
device_free_tx_bufs(pDevice);
|
||||
device_free_rx_bufs(pDevice);
|
||||
device_free_int_bufs(pDevice);
|
||||
|
|
@ -1110,7 +1112,6 @@ static int device_close(struct net_device *dev)
|
|||
usb_free_urb(pDevice->pInterruptURB);
|
||||
|
||||
BSSvClearNodeDBTable(pDevice, 0);
|
||||
pDevice->flags &=(~DEVICE_FLAGS_OPENED);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
|
||||
|
||||
|
|
|
|||
|
|
@ -658,11 +658,12 @@ static int dma_push_rx(struct eg20t_port *priv, int size)
|
|||
dev_warn(port->dev, "Rx overrun: dropping %u bytes\n",
|
||||
size - room);
|
||||
if (!room)
|
||||
return room;
|
||||
goto out;
|
||||
|
||||
tty_insert_flip_string(tport, sg_virt(&priv->sg_rx), size);
|
||||
|
||||
port->icount.rx += room;
|
||||
out:
|
||||
tty_kref_put(tty);
|
||||
|
||||
return room;
|
||||
|
|
@ -1071,6 +1072,8 @@ static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr)
|
|||
if (tty == NULL) {
|
||||
for (i = 0; error_msg[i] != NULL; i++)
|
||||
dev_err(&priv->pdev->dev, error_msg[i]);
|
||||
} else {
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -726,7 +726,7 @@ static irqreturn_t tegra_uart_isr(int irq, void *data)
|
|||
static void tegra_uart_stop_rx(struct uart_port *u)
|
||||
{
|
||||
struct tegra_uart_port *tup = to_tegra_uport(u);
|
||||
struct tty_struct *tty = tty_port_tty_get(&tup->uport.state->port);
|
||||
struct tty_struct *tty;
|
||||
struct tty_port *port = &u->state->port;
|
||||
struct dma_tx_state state;
|
||||
unsigned long ier;
|
||||
|
|
@ -738,6 +738,8 @@ static void tegra_uart_stop_rx(struct uart_port *u)
|
|||
if (!tup->rx_in_progress)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&tup->uport.state->port);
|
||||
|
||||
tegra_uart_wait_sym_time(tup, 1); /* wait a character interval */
|
||||
|
||||
ier = tup->ier_shadow;
|
||||
|
|
|
|||
|
|
@ -1201,6 +1201,9 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
|
|||
}
|
||||
return 0;
|
||||
case TCFLSH:
|
||||
retval = tty_check_change(tty);
|
||||
if (retval)
|
||||
return retval;
|
||||
return __tty_perform_flush(tty, arg);
|
||||
default:
|
||||
/* Try the mode commands */
|
||||
|
|
|
|||
|
|
@ -742,6 +742,22 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype,
|
|||
if ((index & ~USB_DIR_IN) == 0)
|
||||
return 0;
|
||||
ret = findintfep(ps->dev, index);
|
||||
if (ret < 0) {
|
||||
/*
|
||||
* Some not fully compliant Win apps seem to get
|
||||
* index wrong and have the endpoint number here
|
||||
* rather than the endpoint address (with the
|
||||
* correct direction). Win does let this through,
|
||||
* so we'll not reject it here but leave it to
|
||||
* the device to not break KVM. But we warn.
|
||||
*/
|
||||
ret = findintfep(ps->dev, index ^ 0x80);
|
||||
if (ret >= 0)
|
||||
dev_info(&ps->dev->dev,
|
||||
"%s: process %i (%s) requesting ep %02x but needs %02x\n",
|
||||
__func__, task_pid_nr(current),
|
||||
current->comm, index, index ^ 0x80);
|
||||
}
|
||||
if (ret >= 0)
|
||||
ret = checkintf(ps, ret);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@
|
|||
/* FIXME define these in <linux/pci_ids.h> */
|
||||
#define PCI_VENDOR_ID_SYNOPSYS 0x16c3
|
||||
#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd
|
||||
#define PCI_DEVICE_ID_INTEL_BYT 0x0f37
|
||||
#define PCI_DEVICE_ID_INTEL_MRFLD 0x119e
|
||||
|
||||
struct dwc3_pci {
|
||||
struct device *dev;
|
||||
|
|
@ -208,6 +210,8 @@ static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = {
|
|||
PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS,
|
||||
PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3),
|
||||
},
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), },
|
||||
{ } /* Terminating Entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table);
|
||||
|
|
|
|||
|
|
@ -1034,37 +1034,19 @@ struct ffs_sb_fill_data {
|
|||
struct ffs_file_perms perms;
|
||||
umode_t root_mode;
|
||||
const char *dev_name;
|
||||
union {
|
||||
/* set by ffs_fs_mount(), read by ffs_sb_fill() */
|
||||
void *private_data;
|
||||
/* set by ffs_sb_fill(), read by ffs_fs_mount */
|
||||
struct ffs_data *ffs_data;
|
||||
};
|
||||
struct ffs_data *ffs_data;
|
||||
};
|
||||
|
||||
static int ffs_sb_fill(struct super_block *sb, void *_data, int silent)
|
||||
{
|
||||
struct ffs_sb_fill_data *data = _data;
|
||||
struct inode *inode;
|
||||
struct ffs_data *ffs;
|
||||
struct ffs_data *ffs = data->ffs_data;
|
||||
|
||||
ENTER();
|
||||
|
||||
/* Initialise data */
|
||||
ffs = ffs_data_new();
|
||||
if (unlikely(!ffs))
|
||||
goto Enomem;
|
||||
|
||||
ffs->sb = sb;
|
||||
ffs->dev_name = kstrdup(data->dev_name, GFP_KERNEL);
|
||||
if (unlikely(!ffs->dev_name))
|
||||
goto Enomem;
|
||||
ffs->file_perms = data->perms;
|
||||
ffs->private_data = data->private_data;
|
||||
|
||||
/* used by the caller of this function */
|
||||
data->ffs_data = ffs;
|
||||
|
||||
data->ffs_data = NULL;
|
||||
sb->s_fs_info = ffs;
|
||||
sb->s_blocksize = PAGE_CACHE_SIZE;
|
||||
sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
|
||||
|
|
@ -1080,17 +1062,14 @@ static int ffs_sb_fill(struct super_block *sb, void *_data, int silent)
|
|||
&data->perms);
|
||||
sb->s_root = d_make_root(inode);
|
||||
if (unlikely(!sb->s_root))
|
||||
goto Enomem;
|
||||
return -ENOMEM;
|
||||
|
||||
/* EP0 file */
|
||||
if (unlikely(!ffs_sb_create_file(sb, "ep0", ffs,
|
||||
&ffs_ep0_operations, NULL)))
|
||||
goto Enomem;
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
|
||||
Enomem:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int ffs_fs_parse_opts(struct ffs_sb_fill_data *data, char *opts)
|
||||
|
|
@ -1193,6 +1172,7 @@ ffs_fs_mount(struct file_system_type *t, int flags,
|
|||
struct dentry *rv;
|
||||
int ret;
|
||||
void *ffs_dev;
|
||||
struct ffs_data *ffs;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
|
@ -1200,18 +1180,30 @@ ffs_fs_mount(struct file_system_type *t, int flags,
|
|||
if (unlikely(ret < 0))
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ffs = ffs_data_new();
|
||||
if (unlikely(!ffs))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
ffs->file_perms = data.perms;
|
||||
|
||||
ffs->dev_name = kstrdup(dev_name, GFP_KERNEL);
|
||||
if (unlikely(!ffs->dev_name)) {
|
||||
ffs_data_put(ffs);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
ffs_dev = functionfs_acquire_dev_callback(dev_name);
|
||||
if (IS_ERR(ffs_dev))
|
||||
return ffs_dev;
|
||||
if (IS_ERR(ffs_dev)) {
|
||||
ffs_data_put(ffs);
|
||||
return ERR_CAST(ffs_dev);
|
||||
}
|
||||
ffs->private_data = ffs_dev;
|
||||
data.ffs_data = ffs;
|
||||
|
||||
data.dev_name = dev_name;
|
||||
data.private_data = ffs_dev;
|
||||
rv = mount_nodev(t, flags, &data, ffs_sb_fill);
|
||||
|
||||
/* data.ffs_data is set by ffs_sb_fill */
|
||||
if (IS_ERR(rv))
|
||||
if (IS_ERR(rv) && data.ffs_data) {
|
||||
functionfs_release_dev_callback(data.ffs_data);
|
||||
|
||||
ffs_data_put(data.ffs_data);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver,
|
|||
}
|
||||
|
||||
/* Enable USB controller, 83xx or 8536 */
|
||||
if (pdata->have_sysif_regs)
|
||||
if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6)
|
||||
setbits32(hcd->regs + FSL_SOC_USB_CTRL, 0x4);
|
||||
|
||||
/* Don't need to set host mode here. It will be done by tdi_reset() */
|
||||
|
|
@ -232,15 +232,9 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd,
|
|||
case FSL_USB2_PHY_ULPI:
|
||||
if (pdata->have_sysif_regs && pdata->controller_ver) {
|
||||
/* controller version 1.6 or above */
|
||||
clrbits32(non_ehci + FSL_SOC_USB_CTRL, UTMI_PHY_EN);
|
||||
setbits32(non_ehci + FSL_SOC_USB_CTRL,
|
||||
ULPI_PHY_CLK_SEL);
|
||||
/*
|
||||
* Due to controller issue of PHY_CLK_VALID in ULPI
|
||||
* mode, we set USB_CTRL_USB_EN before checking
|
||||
* PHY_CLK_VALID, otherwise PHY_CLK_VALID doesn't work.
|
||||
*/
|
||||
clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL,
|
||||
UTMI_PHY_EN, USB_CTRL_USB_EN);
|
||||
ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN);
|
||||
}
|
||||
portsc |= PORT_PTS_ULPI;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -403,7 +403,7 @@ static struct pci_driver ehci_pci_driver = {
|
|||
.remove = usb_hcd_pci_remove,
|
||||
.shutdown = usb_hcd_pci_shutdown,
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
#ifdef CONFIG_PM
|
||||
.driver = {
|
||||
.pm = &usb_hcd_pci_pm_ops
|
||||
},
|
||||
|
|
|
|||
|
|
@ -231,31 +231,26 @@ static int ohci_urb_enqueue (
|
|||
frame &= ~(ed->interval - 1);
|
||||
frame |= ed->branch;
|
||||
urb->start_frame = frame;
|
||||
ed->last_iso = frame + ed->interval * (size - 1);
|
||||
}
|
||||
} else if (ed->type == PIPE_ISOCHRONOUS) {
|
||||
u16 next = ohci_frame_no(ohci) + 1;
|
||||
u16 frame = ed->last_iso + ed->interval;
|
||||
u16 length = ed->interval * (size - 1);
|
||||
|
||||
/* Behind the scheduling threshold? */
|
||||
if (unlikely(tick_before(frame, next))) {
|
||||
|
||||
/* USB_ISO_ASAP: Round up to the first available slot */
|
||||
/* URB_ISO_ASAP: Round up to the first available slot */
|
||||
if (urb->transfer_flags & URB_ISO_ASAP) {
|
||||
frame += (next - frame + ed->interval - 1) &
|
||||
-ed->interval;
|
||||
|
||||
/*
|
||||
* Not ASAP: Use the next slot in the stream. If
|
||||
* the entire URB falls before the threshold, fail.
|
||||
* Not ASAP: Use the next slot in the stream,
|
||||
* no matter what.
|
||||
*/
|
||||
} else {
|
||||
if (tick_before(frame + ed->interval *
|
||||
(urb->number_of_packets - 1), next)) {
|
||||
retval = -EXDEV;
|
||||
usb_hcd_unlink_urb_from_ep(hcd, urb);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some OHCI hardware doesn't handle late TDs
|
||||
* correctly. After retiring them it proceeds
|
||||
|
|
@ -266,9 +261,16 @@ static int ohci_urb_enqueue (
|
|||
urb_priv->td_cnt = DIV_ROUND_UP(
|
||||
(u16) (next - frame),
|
||||
ed->interval);
|
||||
if (urb_priv->td_cnt >= urb_priv->length) {
|
||||
++urb_priv->td_cnt; /* Mark it */
|
||||
ohci_dbg(ohci, "iso underrun %p (%u+%u < %u)\n",
|
||||
urb, frame, length,
|
||||
next);
|
||||
}
|
||||
}
|
||||
}
|
||||
urb->start_frame = frame;
|
||||
ed->last_iso = frame + length;
|
||||
}
|
||||
|
||||
/* fill the TDs and link them to the ed; and
|
||||
|
|
|
|||
|
|
@ -41,8 +41,12 @@ finish_urb(struct ohci_hcd *ohci, struct urb *urb, int status)
|
|||
__releases(ohci->lock)
|
||||
__acquires(ohci->lock)
|
||||
{
|
||||
struct usb_host_endpoint *ep = urb->ep;
|
||||
struct urb_priv *urb_priv;
|
||||
|
||||
// ASSERT (urb->hcpriv != 0);
|
||||
|
||||
restart:
|
||||
urb_free_priv (ohci, urb->hcpriv);
|
||||
urb->hcpriv = NULL;
|
||||
if (likely(status == -EINPROGRESS))
|
||||
|
|
@ -79,6 +83,21 @@ __acquires(ohci->lock)
|
|||
ohci->hc_control &= ~(OHCI_CTRL_PLE|OHCI_CTRL_IE);
|
||||
ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
|
||||
}
|
||||
|
||||
/*
|
||||
* An isochronous URB that is sumitted too late won't have any TDs
|
||||
* (marked by the fact that the td_cnt value is larger than the
|
||||
* actual number of TDs). If the next URB on this endpoint is like
|
||||
* that, give it back now.
|
||||
*/
|
||||
if (!list_empty(&ep->urb_list)) {
|
||||
urb = list_first_entry(&ep->urb_list, struct urb, urb_list);
|
||||
urb_priv = urb->hcpriv;
|
||||
if (urb_priv->td_cnt > urb_priv->length) {
|
||||
status = 0;
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -545,7 +564,6 @@ td_fill (struct ohci_hcd *ohci, u32 info,
|
|||
td->hwCBP = cpu_to_hc32 (ohci, data & 0xFFFFF000);
|
||||
*ohci_hwPSWp(ohci, td, 0) = cpu_to_hc16 (ohci,
|
||||
(data & 0x0FFF) | 0xE000);
|
||||
td->ed->last_iso = info & 0xffff;
|
||||
} else {
|
||||
td->hwCBP = cpu_to_hc32 (ohci, data);
|
||||
}
|
||||
|
|
@ -994,7 +1012,7 @@ finish_unlinks (struct ohci_hcd *ohci, u16 tick)
|
|||
urb_priv->td_cnt++;
|
||||
|
||||
/* if URB is done, clean up */
|
||||
if (urb_priv->td_cnt == urb_priv->length) {
|
||||
if (urb_priv->td_cnt >= urb_priv->length) {
|
||||
modified = completed = 1;
|
||||
finish_urb(ohci, urb, 0);
|
||||
}
|
||||
|
|
@ -1084,7 +1102,7 @@ static void takeback_td(struct ohci_hcd *ohci, struct td *td)
|
|||
urb_priv->td_cnt++;
|
||||
|
||||
/* If all this urb's TDs are done, call complete() */
|
||||
if (urb_priv->td_cnt == urb_priv->length)
|
||||
if (urb_priv->td_cnt >= urb_priv->length)
|
||||
finish_urb(ohci, urb, status);
|
||||
|
||||
/* clean schedule: unlink EDs that are no longer busy */
|
||||
|
|
|
|||
|
|
@ -293,7 +293,7 @@ static struct pci_driver uhci_pci_driver = {
|
|||
.remove = usb_hcd_pci_remove,
|
||||
.shutdown = uhci_shutdown,
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
#ifdef CONFIG_PM
|
||||
.driver = {
|
||||
.pm = &usb_hcd_pci_pm_ops
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1303,7 +1303,7 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb,
|
|||
}
|
||||
|
||||
/* Fell behind? */
|
||||
if (uhci_frame_before_eq(frame, next)) {
|
||||
if (!uhci_frame_before_eq(next, frame)) {
|
||||
|
||||
/* USB_ISO_ASAP: Round up to the first available slot */
|
||||
if (urb->transfer_flags & URB_ISO_ASAP)
|
||||
|
|
@ -1311,13 +1311,17 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb,
|
|||
-qh->period;
|
||||
|
||||
/*
|
||||
* Not ASAP: Use the next slot in the stream. If
|
||||
* the entire URB falls before the threshold, fail.
|
||||
* Not ASAP: Use the next slot in the stream,
|
||||
* no matter what.
|
||||
*/
|
||||
else if (!uhci_frame_before_eq(next,
|
||||
frame + (urb->number_of_packets - 1) *
|
||||
qh->period))
|
||||
return -EXDEV;
|
||||
dev_dbg(uhci_dev(uhci), "iso underrun %p (%u+%u < %u)\n",
|
||||
urb, frame,
|
||||
(urb->number_of_packets - 1) *
|
||||
qh->period,
|
||||
next);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -286,7 +286,7 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend)
|
|||
if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue)
|
||||
xhci_queue_stop_endpoint(xhci, slot_id, i, suspend);
|
||||
}
|
||||
cmd->command_trb = xhci->cmd_ring->enqueue;
|
||||
cmd->command_trb = xhci_find_next_enqueue(xhci->cmd_ring);
|
||||
list_add_tail(&cmd->cmd_list, &virt_dev->cmd_list);
|
||||
xhci_queue_stop_endpoint(xhci, slot_id, 0, suspend);
|
||||
xhci_ring_cmd_db(xhci);
|
||||
|
|
|
|||
|
|
@ -345,7 +345,7 @@ static struct pci_driver xhci_pci_driver = {
|
|||
/* suspend and resume implemented later */
|
||||
|
||||
.shutdown = usb_hcd_pci_shutdown,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
#ifdef CONFIG_PM
|
||||
.driver = {
|
||||
.pm = &usb_hcd_pci_pm_ops
|
||||
},
|
||||
|
|
|
|||
|
|
@ -122,6 +122,16 @@ static int enqueue_is_link_trb(struct xhci_ring *ring)
|
|||
return TRB_TYPE_LINK_LE32(link->control);
|
||||
}
|
||||
|
||||
union xhci_trb *xhci_find_next_enqueue(struct xhci_ring *ring)
|
||||
{
|
||||
/* Enqueue pointer can be left pointing to the link TRB,
|
||||
* we must handle that
|
||||
*/
|
||||
if (TRB_TYPE_LINK_LE32(ring->enqueue->link.control))
|
||||
return ring->enq_seg->next->trbs;
|
||||
return ring->enqueue;
|
||||
}
|
||||
|
||||
/* Updates trb to point to the next TRB in the ring, and updates seg if the next
|
||||
* TRB is in a new segment. This does not skip over link TRBs, and it does not
|
||||
* effect the ring dequeue or enqueue pointers.
|
||||
|
|
@ -847,8 +857,12 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci,
|
|||
/* Otherwise ring the doorbell(s) to restart queued transfers */
|
||||
ring_doorbell_for_active_rings(xhci, slot_id, ep_index);
|
||||
}
|
||||
ep->stopped_td = NULL;
|
||||
ep->stopped_trb = NULL;
|
||||
|
||||
/* Clear stopped_td and stopped_trb if endpoint is not halted */
|
||||
if (!(ep->ep_state & EP_HALTED)) {
|
||||
ep->stopped_td = NULL;
|
||||
ep->stopped_trb = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Drop the lock and complete the URBs in the cancelled TD list.
|
||||
|
|
@ -1390,6 +1404,12 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
|
|||
inc_deq(xhci, xhci->cmd_ring);
|
||||
return;
|
||||
}
|
||||
/* There is no command to handle if we get a stop event when the
|
||||
* command ring is empty, event->cmd_trb points to the next
|
||||
* unset command
|
||||
*/
|
||||
if (xhci->cmd_ring->dequeue == xhci->cmd_ring->enqueue)
|
||||
return;
|
||||
}
|
||||
|
||||
switch (le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3])
|
||||
|
|
|
|||
|
|
@ -2592,15 +2592,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
|
|||
if (command) {
|
||||
cmd_completion = command->completion;
|
||||
cmd_status = &command->status;
|
||||
command->command_trb = xhci->cmd_ring->enqueue;
|
||||
|
||||
/* Enqueue pointer can be left pointing to the link TRB,
|
||||
* we must handle that
|
||||
*/
|
||||
if (TRB_TYPE_LINK_LE32(command->command_trb->link.control))
|
||||
command->command_trb =
|
||||
xhci->cmd_ring->enq_seg->next->trbs;
|
||||
|
||||
command->command_trb = xhci_find_next_enqueue(xhci->cmd_ring);
|
||||
list_add_tail(&command->cmd_list, &virt_dev->cmd_list);
|
||||
} else {
|
||||
cmd_completion = &virt_dev->cmd_completion;
|
||||
|
|
@ -2608,7 +2600,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
|
|||
}
|
||||
init_completion(cmd_completion);
|
||||
|
||||
cmd_trb = xhci->cmd_ring->dequeue;
|
||||
cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring);
|
||||
if (!ctx_change)
|
||||
ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma,
|
||||
udev->slot_id, must_succeed);
|
||||
|
|
@ -3393,14 +3385,7 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
|
|||
|
||||
/* Attempt to submit the Reset Device command to the command ring */
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
reset_device_cmd->command_trb = xhci->cmd_ring->enqueue;
|
||||
|
||||
/* Enqueue pointer can be left pointing to the link TRB,
|
||||
* we must handle that
|
||||
*/
|
||||
if (TRB_TYPE_LINK_LE32(reset_device_cmd->command_trb->link.control))
|
||||
reset_device_cmd->command_trb =
|
||||
xhci->cmd_ring->enq_seg->next->trbs;
|
||||
reset_device_cmd->command_trb = xhci_find_next_enqueue(xhci->cmd_ring);
|
||||
|
||||
list_add_tail(&reset_device_cmd->cmd_list, &virt_dev->cmd_list);
|
||||
ret = xhci_queue_reset_device(xhci, slot_id);
|
||||
|
|
@ -3604,7 +3589,7 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|||
union xhci_trb *cmd_trb;
|
||||
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
cmd_trb = xhci->cmd_ring->dequeue;
|
||||
cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring);
|
||||
ret = xhci_queue_slot_control(xhci, TRB_ENABLE_SLOT, 0);
|
||||
if (ret) {
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
|
@ -3731,7 +3716,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
|
|||
xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2);
|
||||
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
cmd_trb = xhci->cmd_ring->dequeue;
|
||||
cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring);
|
||||
ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma,
|
||||
udev->slot_id);
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -1821,6 +1821,7 @@ int xhci_cancel_cmd(struct xhci_hcd *xhci, struct xhci_command *command,
|
|||
union xhci_trb *cmd_trb);
|
||||
void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id,
|
||||
unsigned int ep_index, unsigned int stream_id);
|
||||
union xhci_trb *xhci_find_next_enqueue(struct xhci_ring *ring);
|
||||
|
||||
/* xHCI roothub code */
|
||||
void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array,
|
||||
|
|
|
|||
4
fs/bio.c
4
fs/bio.c
|
|
@ -917,8 +917,8 @@ void bio_copy_data(struct bio *dst, struct bio *src)
|
|||
src_p = kmap_atomic(src_bv->bv_page);
|
||||
dst_p = kmap_atomic(dst_bv->bv_page);
|
||||
|
||||
memcpy(dst_p + dst_bv->bv_offset,
|
||||
src_p + src_bv->bv_offset,
|
||||
memcpy(dst_p + dst_offset,
|
||||
src_p + src_offset,
|
||||
bytes);
|
||||
|
||||
kunmap_atomic(dst_p);
|
||||
|
|
|
|||
|
|
@ -487,6 +487,7 @@ static int v7_fill_super(struct super_block *sb, void *data, int silent)
|
|||
sbi->s_sb = sb;
|
||||
sbi->s_block_base = 0;
|
||||
sbi->s_type = FSTYPE_V7;
|
||||
mutex_init(&sbi->s_lock);
|
||||
sb->s_fs_info = sbi;
|
||||
|
||||
sb_set_blocksize(sb, 512);
|
||||
|
|
|
|||
|
|
@ -405,13 +405,14 @@ int dm_noflush_suspending(struct dm_target *ti);
|
|||
union map_info *dm_get_mapinfo(struct bio *bio);
|
||||
union map_info *dm_get_rq_mapinfo(struct request *rq);
|
||||
|
||||
struct queue_limits *dm_get_queue_limits(struct mapped_device *md);
|
||||
|
||||
/*
|
||||
* Geometry functions.
|
||||
*/
|
||||
int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo);
|
||||
int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo);
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------
|
||||
* Functions for manipulating device-mapper tables.
|
||||
*---------------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -837,7 +837,8 @@ static int snd_compress_dev_disconnect(struct snd_device *device)
|
|||
struct snd_compr *compr;
|
||||
|
||||
compr = device->device_data;
|
||||
snd_unregister_device(compr->direction, compr->card, compr->device);
|
||||
snd_unregister_device(SNDRV_DEVICE_TYPE_COMPRESS, compr->card,
|
||||
compr->device);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@
|
|||
#include <stdbool.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <sys/mount.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "debugfs.h"
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user