mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-25 03:50:24 +09:00
Merge tag 'v3.10.72' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidc-3.10.y
This is the 3.10.72 stable release
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 71
|
||||
SUBLEVEL = 72
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
||||
@@ -26,18 +26,18 @@ TRACE_EVENT(kvm_exit,
|
||||
TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
|
||||
TP_ARGS(vcpu, reason),
|
||||
TP_STRUCT__entry(
|
||||
__field(struct kvm_vcpu *, vcpu)
|
||||
__field(unsigned long, pc)
|
||||
__field(unsigned int, reason)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->vcpu = vcpu;
|
||||
__entry->pc = vcpu->arch.pc;
|
||||
__entry->reason = reason;
|
||||
),
|
||||
|
||||
TP_printk("[%s]PC: 0x%08lx",
|
||||
kvm_mips_exit_types_str[__entry->reason],
|
||||
__entry->vcpu->arch.pc)
|
||||
__entry->pc)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_KVM_H */
|
||||
|
||||
@@ -557,11 +557,14 @@ ENTRY(ret_from_fork)
|
||||
testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread?
|
||||
jz 1f
|
||||
|
||||
testl $_TIF_IA32, TI_flags(%rcx) # 32-bit compat task needs IRET
|
||||
jnz int_ret_from_sys_call
|
||||
|
||||
RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET
|
||||
jmp ret_from_sys_call # go to the SYSRET fastpath
|
||||
/*
|
||||
* By the time we get here, we have no idea whether our pt_regs,
|
||||
* ti flags, and ti status came from the 64-bit SYSCALL fast path,
|
||||
* the slow path, or one of the ia32entry paths.
|
||||
* Use int_ret_from_sys_call to return, since it can safely handle
|
||||
* all of the above.
|
||||
*/
|
||||
jmp int_ret_from_sys_call
|
||||
|
||||
1:
|
||||
subq $REST_SKIP, %rsp # leave space for volatiles
|
||||
|
||||
@@ -4732,7 +4732,8 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
|
||||
if (rc != X86EMUL_CONTINUE)
|
||||
goto done;
|
||||
}
|
||||
ctxt->dst.orig_val = ctxt->dst.val;
|
||||
/* Copy full 64-bit value for CMPXCHG8B. */
|
||||
ctxt->dst.orig_val64 = ctxt->dst.val64;
|
||||
|
||||
special_insn:
|
||||
|
||||
|
||||
@@ -1953,6 +1953,17 @@ EXPORT_SYMBOL(acpi_video_unregister);
|
||||
|
||||
static int __init acpi_video_init(void)
|
||||
{
|
||||
/*
|
||||
* Let the module load even if ACPI is disabled (e.g. due to
|
||||
* a broken BIOS) so that i915.ko can still be loaded on such
|
||||
* old systems without an AcpiOpRegion.
|
||||
*
|
||||
* acpi_video_register() will report -ENODEV later as well due
|
||||
* to acpi_disabled when i915.ko tries to register itself afterwards.
|
||||
*/
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
dmi_check_system(video_dmi_table);
|
||||
|
||||
if (intel_opregion_present())
|
||||
|
||||
@@ -70,7 +70,7 @@ static unsigned long clk_factors_recalc_rate(struct clk_hw *hw,
|
||||
p = FACTOR_GET(config->pshift, config->pwidth, reg);
|
||||
|
||||
/* Calculate the rate */
|
||||
rate = (parent_rate * n * (k + 1) >> p) / (m + 1);
|
||||
rate = (parent_rate * (n + config->n_start) * (k + 1) >> p) / (m + 1);
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ struct clk_factors_config {
|
||||
u8 mwidth;
|
||||
u8 pshift;
|
||||
u8 pwidth;
|
||||
u8 n_start;
|
||||
};
|
||||
|
||||
struct clk *clk_register_factors(struct device *dev, const char *name,
|
||||
|
||||
@@ -930,12 +930,12 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
||||
|
||||
if ((rdev->config.cayman.max_backends_per_se == 1) &&
|
||||
(rdev->flags & RADEON_IS_IGP)) {
|
||||
if ((disabled_rb_mask & 3) == 1) {
|
||||
/* RB0 disabled, RB1 enabled */
|
||||
tmp = 0x11111111;
|
||||
} else {
|
||||
if ((disabled_rb_mask & 3) == 2) {
|
||||
/* RB1 disabled, RB0 enabled */
|
||||
tmp = 0x00000000;
|
||||
} else {
|
||||
/* RB0 disabled, RB1 enabled */
|
||||
tmp = 0x11111111;
|
||||
}
|
||||
} else {
|
||||
tmp = gb_addr_config & NUM_PIPES_MASK;
|
||||
|
||||
@@ -1066,6 +1066,23 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore reports for absolute data if the data didn't change. This is
|
||||
* not only an optimization but also fixes 'dead' key reports. Some
|
||||
* RollOver implementations for localized keys (like BACKSLASH/PIPE; HID
|
||||
* 0x31 and 0x32) report multiple keys, even though a localized keyboard
|
||||
* can only have one of them physically available. The 'dead' keys
|
||||
* report constant 0. As all map to the same keycode, they'd confuse
|
||||
* the input layer. If we filter the 'dead' keys on the HID level, we
|
||||
* skip the keycode translation and only forward real events.
|
||||
*/
|
||||
if (!(field->flags & (HID_MAIN_ITEM_RELATIVE |
|
||||
HID_MAIN_ITEM_BUFFERED_BYTE)) &&
|
||||
(field->flags & HID_MAIN_ITEM_VARIABLE) &&
|
||||
usage->usage_index < field->maxusage &&
|
||||
value == field->value[usage->usage_index])
|
||||
return;
|
||||
|
||||
/* report the usage code as scancode if the key status has changed */
|
||||
if (usage->type == EV_KEY && !!test_bit(usage->code, input->key) != value)
|
||||
input_event(input, EV_MSC, MSC_SCAN, usage->hid);
|
||||
|
||||
@@ -686,7 +686,7 @@ int vmbus_device_register(struct hv_device *child_device_obj)
|
||||
if (ret)
|
||||
pr_err("Unable to register child device\n");
|
||||
else
|
||||
pr_info("child device %s registered\n",
|
||||
pr_debug("child device %s registered\n",
|
||||
dev_name(&child_device_obj->device));
|
||||
|
||||
return ret;
|
||||
@@ -698,14 +698,14 @@ int vmbus_device_register(struct hv_device *child_device_obj)
|
||||
*/
|
||||
void vmbus_device_unregister(struct hv_device *device_obj)
|
||||
{
|
||||
pr_debug("child device %s unregistered\n",
|
||||
dev_name(&device_obj->device));
|
||||
|
||||
/*
|
||||
* Kick off the process of unregistering the device.
|
||||
* This will call vmbus_remove() and eventually vmbus_device_release()
|
||||
*/
|
||||
device_unregister(&device_obj->device);
|
||||
|
||||
pr_info("child device %s unregistered\n",
|
||||
dev_name(&device_obj->device));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <linux/iio/iio.h>
|
||||
#include <linux/iio/sysfs.h>
|
||||
@@ -447,7 +448,7 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
if (ret)
|
||||
return ret;
|
||||
val16 = ((val16 & 0xFFF) << 4) >> 4;
|
||||
val16 = sign_extend32(val16, 11);
|
||||
*val = val16;
|
||||
return IIO_VAL_INT;
|
||||
case IIO_CHAN_INFO_OFFSET:
|
||||
|
||||
@@ -1055,12 +1055,6 @@ struct qib_devdata {
|
||||
/* control high-level access to EEPROM */
|
||||
struct mutex eep_lock;
|
||||
uint64_t traffic_wds;
|
||||
/* active time is kept in seconds, but logged in hours */
|
||||
atomic_t active_time;
|
||||
/* Below are nominal shadow of EEPROM, new since last EEPROM update */
|
||||
uint8_t eep_st_errs[QIB_EEP_LOG_CNT];
|
||||
uint8_t eep_st_new_errs[QIB_EEP_LOG_CNT];
|
||||
uint16_t eep_hrs;
|
||||
/*
|
||||
* masks for which bits of errs, hwerrs that cause
|
||||
* each of the counters to increment.
|
||||
@@ -1278,8 +1272,7 @@ int qib_twsi_blk_rd(struct qib_devdata *dd, int dev, int addr, void *buffer,
|
||||
int qib_twsi_blk_wr(struct qib_devdata *dd, int dev, int addr,
|
||||
const void *buffer, int len);
|
||||
void qib_get_eeprom_info(struct qib_devdata *);
|
||||
int qib_update_eeprom_log(struct qib_devdata *dd);
|
||||
void qib_inc_eeprom_err(struct qib_devdata *dd, u32 eidx, u32 incr);
|
||||
#define qib_inc_eeprom_err(dd, eidx, incr)
|
||||
void qib_dump_lookup_output_queue(struct qib_devdata *);
|
||||
void qib_force_pio_avail_update(struct qib_devdata *);
|
||||
void qib_clear_symerror_on_linkup(unsigned long opaque);
|
||||
|
||||
@@ -267,190 +267,9 @@ void qib_get_eeprom_info(struct qib_devdata *dd)
|
||||
"Board SN %s did not pass functional test: %s\n",
|
||||
dd->serial, ifp->if_comment);
|
||||
|
||||
memcpy(&dd->eep_st_errs, &ifp->if_errcntp, QIB_EEP_LOG_CNT);
|
||||
/*
|
||||
* Power-on (actually "active") hours are kept as little-endian value
|
||||
* in EEPROM, but as seconds in a (possibly as small as 24-bit)
|
||||
* atomic_t while running.
|
||||
*/
|
||||
atomic_set(&dd->active_time, 0);
|
||||
dd->eep_hrs = ifp->if_powerhour[0] | (ifp->if_powerhour[1] << 8);
|
||||
|
||||
done:
|
||||
vfree(buf);
|
||||
|
||||
bail:;
|
||||
}
|
||||
|
||||
/**
|
||||
* qib_update_eeprom_log - copy active-time and error counters to eeprom
|
||||
* @dd: the qlogic_ib device
|
||||
*
|
||||
* Although the time is kept as seconds in the qib_devdata struct, it is
|
||||
* rounded to hours for re-write, as we have only 16 bits in EEPROM.
|
||||
* First-cut code reads whole (expected) struct qib_flash, modifies,
|
||||
* re-writes. Future direction: read/write only what we need, assuming
|
||||
* that the EEPROM had to have been "good enough" for driver init, and
|
||||
* if not, we aren't making it worse.
|
||||
*
|
||||
*/
|
||||
int qib_update_eeprom_log(struct qib_devdata *dd)
|
||||
{
|
||||
void *buf;
|
||||
struct qib_flash *ifp;
|
||||
int len, hi_water;
|
||||
uint32_t new_time, new_hrs;
|
||||
u8 csum;
|
||||
int ret, idx;
|
||||
unsigned long flags;
|
||||
|
||||
/* first, check if we actually need to do anything. */
|
||||
ret = 0;
|
||||
for (idx = 0; idx < QIB_EEP_LOG_CNT; ++idx) {
|
||||
if (dd->eep_st_new_errs[idx]) {
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
new_time = atomic_read(&dd->active_time);
|
||||
|
||||
if (ret == 0 && new_time < 3600)
|
||||
goto bail;
|
||||
|
||||
/*
|
||||
* The quick-check above determined that there is something worthy
|
||||
* of logging, so get current contents and do a more detailed idea.
|
||||
* read full flash, not just currently used part, since it may have
|
||||
* been written with a newer definition
|
||||
*/
|
||||
len = sizeof(struct qib_flash);
|
||||
buf = vmalloc(len);
|
||||
ret = 1;
|
||||
if (!buf) {
|
||||
qib_dev_err(dd,
|
||||
"Couldn't allocate memory to read %u bytes from eeprom for logging\n",
|
||||
len);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* Grab semaphore and read current EEPROM. If we get an
|
||||
* error, let go, but if not, keep it until we finish write.
|
||||
*/
|
||||
ret = mutex_lock_interruptible(&dd->eep_lock);
|
||||
if (ret) {
|
||||
qib_dev_err(dd, "Unable to acquire EEPROM for logging\n");
|
||||
goto free_bail;
|
||||
}
|
||||
ret = qib_twsi_blk_rd(dd, dd->twsi_eeprom_dev, 0, buf, len);
|
||||
if (ret) {
|
||||
mutex_unlock(&dd->eep_lock);
|
||||
qib_dev_err(dd, "Unable read EEPROM for logging\n");
|
||||
goto free_bail;
|
||||
}
|
||||
ifp = (struct qib_flash *)buf;
|
||||
|
||||
csum = flash_csum(ifp, 0);
|
||||
if (csum != ifp->if_csum) {
|
||||
mutex_unlock(&dd->eep_lock);
|
||||
qib_dev_err(dd, "EEPROM cks err (0x%02X, S/B 0x%02X)\n",
|
||||
csum, ifp->if_csum);
|
||||
ret = 1;
|
||||
goto free_bail;
|
||||
}
|
||||
hi_water = 0;
|
||||
spin_lock_irqsave(&dd->eep_st_lock, flags);
|
||||
for (idx = 0; idx < QIB_EEP_LOG_CNT; ++idx) {
|
||||
int new_val = dd->eep_st_new_errs[idx];
|
||||
if (new_val) {
|
||||
/*
|
||||
* If we have seen any errors, add to EEPROM values
|
||||
* We need to saturate at 0xFF (255) and we also
|
||||
* would need to adjust the checksum if we were
|
||||
* trying to minimize EEPROM traffic
|
||||
* Note that we add to actual current count in EEPROM,
|
||||
* in case it was altered while we were running.
|
||||
*/
|
||||
new_val += ifp->if_errcntp[idx];
|
||||
if (new_val > 0xFF)
|
||||
new_val = 0xFF;
|
||||
if (ifp->if_errcntp[idx] != new_val) {
|
||||
ifp->if_errcntp[idx] = new_val;
|
||||
hi_water = offsetof(struct qib_flash,
|
||||
if_errcntp) + idx;
|
||||
}
|
||||
/*
|
||||
* update our shadow (used to minimize EEPROM
|
||||
* traffic), to match what we are about to write.
|
||||
*/
|
||||
dd->eep_st_errs[idx] = new_val;
|
||||
dd->eep_st_new_errs[idx] = 0;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Now update active-time. We would like to round to the nearest hour
|
||||
* but unless atomic_t are sure to be proper signed ints we cannot,
|
||||
* because we need to account for what we "transfer" to EEPROM and
|
||||
* if we log an hour at 31 minutes, then we would need to set
|
||||
* active_time to -29 to accurately count the _next_ hour.
|
||||
*/
|
||||
if (new_time >= 3600) {
|
||||
new_hrs = new_time / 3600;
|
||||
atomic_sub((new_hrs * 3600), &dd->active_time);
|
||||
new_hrs += dd->eep_hrs;
|
||||
if (new_hrs > 0xFFFF)
|
||||
new_hrs = 0xFFFF;
|
||||
dd->eep_hrs = new_hrs;
|
||||
if ((new_hrs & 0xFF) != ifp->if_powerhour[0]) {
|
||||
ifp->if_powerhour[0] = new_hrs & 0xFF;
|
||||
hi_water = offsetof(struct qib_flash, if_powerhour);
|
||||
}
|
||||
if ((new_hrs >> 8) != ifp->if_powerhour[1]) {
|
||||
ifp->if_powerhour[1] = new_hrs >> 8;
|
||||
hi_water = offsetof(struct qib_flash, if_powerhour) + 1;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* There is a tiny possibility that we could somehow fail to write
|
||||
* the EEPROM after updating our shadows, but problems from holding
|
||||
* the spinlock too long are a much bigger issue.
|
||||
*/
|
||||
spin_unlock_irqrestore(&dd->eep_st_lock, flags);
|
||||
if (hi_water) {
|
||||
/* we made some change to the data, uopdate cksum and write */
|
||||
csum = flash_csum(ifp, 1);
|
||||
ret = eeprom_write_with_enable(dd, 0, buf, hi_water + 1);
|
||||
}
|
||||
mutex_unlock(&dd->eep_lock);
|
||||
if (ret)
|
||||
qib_dev_err(dd, "Failed updating EEPROM\n");
|
||||
|
||||
free_bail:
|
||||
vfree(buf);
|
||||
bail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* qib_inc_eeprom_err - increment one of the four error counters
|
||||
* that are logged to EEPROM.
|
||||
* @dd: the qlogic_ib device
|
||||
* @eidx: 0..3, the counter to increment
|
||||
* @incr: how much to add
|
||||
*
|
||||
* Each counter is 8-bits, and saturates at 255 (0xFF). They
|
||||
* are copied to the EEPROM (aka flash) whenever qib_update_eeprom_log()
|
||||
* is called, but it can only be called in a context that allows sleep.
|
||||
* This function can be called even at interrupt level.
|
||||
*/
|
||||
void qib_inc_eeprom_err(struct qib_devdata *dd, u32 eidx, u32 incr)
|
||||
{
|
||||
uint new_val;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&dd->eep_st_lock, flags);
|
||||
new_val = dd->eep_st_new_errs[eidx] + incr;
|
||||
if (new_val > 255)
|
||||
new_val = 255;
|
||||
dd->eep_st_new_errs[eidx] = new_val;
|
||||
spin_unlock_irqrestore(&dd->eep_st_lock, flags);
|
||||
}
|
||||
|
||||
@@ -2682,8 +2682,6 @@ static void qib_get_6120_faststats(unsigned long opaque)
|
||||
spin_lock_irqsave(&dd->eep_st_lock, flags);
|
||||
traffic_wds -= dd->traffic_wds;
|
||||
dd->traffic_wds += traffic_wds;
|
||||
if (traffic_wds >= QIB_TRAFFIC_ACTIVE_THRESHOLD)
|
||||
atomic_add(5, &dd->active_time); /* S/B #define */
|
||||
spin_unlock_irqrestore(&dd->eep_st_lock, flags);
|
||||
|
||||
qib_chk_6120_errormask(dd);
|
||||
|
||||
@@ -3299,8 +3299,6 @@ static void qib_get_7220_faststats(unsigned long opaque)
|
||||
spin_lock_irqsave(&dd->eep_st_lock, flags);
|
||||
traffic_wds -= dd->traffic_wds;
|
||||
dd->traffic_wds += traffic_wds;
|
||||
if (traffic_wds >= QIB_TRAFFIC_ACTIVE_THRESHOLD)
|
||||
atomic_add(5, &dd->active_time); /* S/B #define */
|
||||
spin_unlock_irqrestore(&dd->eep_st_lock, flags);
|
||||
done:
|
||||
mod_timer(&dd->stats_timer, jiffies + HZ * ACTIVITY_TIMER);
|
||||
|
||||
@@ -4854,8 +4854,6 @@ static void qib_get_7322_faststats(unsigned long opaque)
|
||||
spin_lock_irqsave(&ppd->dd->eep_st_lock, flags);
|
||||
traffic_wds -= ppd->dd->traffic_wds;
|
||||
ppd->dd->traffic_wds += traffic_wds;
|
||||
if (traffic_wds >= QIB_TRAFFIC_ACTIVE_THRESHOLD)
|
||||
atomic_add(ACTIVITY_TIMER, &ppd->dd->active_time);
|
||||
spin_unlock_irqrestore(&ppd->dd->eep_st_lock, flags);
|
||||
if (ppd->cpspec->qdr_dfe_on && (ppd->link_speed_active &
|
||||
QIB_IB_QDR) &&
|
||||
|
||||
@@ -892,7 +892,6 @@ static void qib_shutdown_device(struct qib_devdata *dd)
|
||||
}
|
||||
}
|
||||
|
||||
qib_update_eeprom_log(dd);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -611,28 +611,6 @@ bail:
|
||||
return ret < 0 ? ret : count;
|
||||
}
|
||||
|
||||
static ssize_t show_logged_errs(struct device *device,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct qib_ibdev *dev =
|
||||
container_of(device, struct qib_ibdev, ibdev.dev);
|
||||
struct qib_devdata *dd = dd_from_dev(dev);
|
||||
int idx, count;
|
||||
|
||||
/* force consistency with actual EEPROM */
|
||||
if (qib_update_eeprom_log(dd) != 0)
|
||||
return -ENXIO;
|
||||
|
||||
count = 0;
|
||||
for (idx = 0; idx < QIB_EEP_LOG_CNT; ++idx) {
|
||||
count += scnprintf(buf + count, PAGE_SIZE - count, "%d%c",
|
||||
dd->eep_st_errs[idx],
|
||||
idx == (QIB_EEP_LOG_CNT - 1) ? '\n' : ' ');
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* Dump tempsense regs. in decimal, to ease shell-scripts.
|
||||
*/
|
||||
@@ -679,7 +657,6 @@ static DEVICE_ATTR(nctxts, S_IRUGO, show_nctxts, NULL);
|
||||
static DEVICE_ATTR(nfreectxts, S_IRUGO, show_nfreectxts, NULL);
|
||||
static DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL);
|
||||
static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL);
|
||||
static DEVICE_ATTR(logged_errors, S_IRUGO, show_logged_errs, NULL);
|
||||
static DEVICE_ATTR(tempsense, S_IRUGO, show_tempsense, NULL);
|
||||
static DEVICE_ATTR(localbus_info, S_IRUGO, show_localbus_info, NULL);
|
||||
static DEVICE_ATTR(chip_reset, S_IWUSR, NULL, store_chip_reset);
|
||||
@@ -693,7 +670,6 @@ static struct device_attribute *qib_attributes[] = {
|
||||
&dev_attr_nfreectxts,
|
||||
&dev_attr_serial,
|
||||
&dev_attr_boardversion,
|
||||
&dev_attr_logged_errors,
|
||||
&dev_attr_tempsense,
|
||||
&dev_attr_localbus_info,
|
||||
&dev_attr_chip_reset,
|
||||
|
||||
@@ -291,6 +291,12 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
|
||||
unsigned short logical_block_size = queue_logical_block_size(q);
|
||||
sector_t num_sectors;
|
||||
|
||||
/* Reject unsupported discard requests */
|
||||
if ((rw & REQ_DISCARD) && !blk_queue_discard(q)) {
|
||||
dec_count(io, region, -EOPNOTSUPP);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* where->count may be zero if rw holds a flush and we need to
|
||||
* send a zero-sized flush.
|
||||
|
||||
@@ -604,6 +604,15 @@ static void write_callback(unsigned long error, void *context)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the bio is discard, return an error, but do not
|
||||
* degrade the array.
|
||||
*/
|
||||
if (bio->bi_rw & REQ_DISCARD) {
|
||||
bio_endio(bio, -EOPNOTSUPP);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < ms->nr_mirrors; i++)
|
||||
if (test_bit(i, &error))
|
||||
fail_mirror(ms->mirror + i, DM_RAID1_WRITE_ERROR);
|
||||
|
||||
@@ -1439,8 +1439,6 @@ out:
|
||||
full_bio->bi_end_io = pe->full_bio_end_io;
|
||||
full_bio->bi_private = pe->full_bio_private;
|
||||
}
|
||||
free_pending_exception(pe);
|
||||
|
||||
increment_pending_exceptions_done_count();
|
||||
|
||||
up_write(&s->lock);
|
||||
@@ -1457,6 +1455,8 @@ out:
|
||||
}
|
||||
|
||||
retry_origin_bios(s, origin_bios);
|
||||
|
||||
free_pending_exception(pe);
|
||||
}
|
||||
|
||||
static void commit_callback(void *context, int success)
|
||||
|
||||
@@ -2270,7 +2270,7 @@ int dm_setup_md_queue(struct mapped_device *md)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct mapped_device *dm_find_md(dev_t dev)
|
||||
struct mapped_device *dm_get_md(dev_t dev)
|
||||
{
|
||||
struct mapped_device *md;
|
||||
unsigned minor = MINOR(dev);
|
||||
@@ -2281,12 +2281,15 @@ static struct mapped_device *dm_find_md(dev_t dev)
|
||||
spin_lock(&_minor_lock);
|
||||
|
||||
md = idr_find(&_minor_idr, minor);
|
||||
if (md && (md == MINOR_ALLOCED ||
|
||||
(MINOR(disk_devt(dm_disk(md))) != minor) ||
|
||||
dm_deleting_md(md) ||
|
||||
test_bit(DMF_FREEING, &md->flags))) {
|
||||
md = NULL;
|
||||
goto out;
|
||||
if (md) {
|
||||
if ((md == MINOR_ALLOCED ||
|
||||
(MINOR(disk_devt(dm_disk(md))) != minor) ||
|
||||
dm_deleting_md(md) ||
|
||||
test_bit(DMF_FREEING, &md->flags))) {
|
||||
md = NULL;
|
||||
goto out;
|
||||
}
|
||||
dm_get(md);
|
||||
}
|
||||
|
||||
out:
|
||||
@@ -2294,16 +2297,6 @@ out:
|
||||
|
||||
return md;
|
||||
}
|
||||
|
||||
struct mapped_device *dm_get_md(dev_t dev)
|
||||
{
|
||||
struct mapped_device *md = dm_find_md(dev);
|
||||
|
||||
if (md)
|
||||
dm_get(md);
|
||||
|
||||
return md;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dm_get_md);
|
||||
|
||||
void *dm_get_mdptr(struct mapped_device *md)
|
||||
|
||||
@@ -658,12 +658,15 @@ static unsigned long iov_pages(const struct iovec *iv, int offset,
|
||||
return pages;
|
||||
}
|
||||
|
||||
/* Neighbour code has some assumptions on HH_DATA_MOD alignment */
|
||||
#define MACVTAP_RESERVE HH_DATA_OFF(ETH_HLEN)
|
||||
|
||||
/* Get packet from user space buffer */
|
||||
static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
||||
const struct iovec *iv, unsigned long total_len,
|
||||
size_t count, int noblock)
|
||||
{
|
||||
int good_linear = SKB_MAX_HEAD(NET_IP_ALIGN);
|
||||
int good_linear = SKB_MAX_HEAD(MACVTAP_RESERVE);
|
||||
struct sk_buff *skb;
|
||||
struct macvlan_dev *vlan;
|
||||
unsigned long len = total_len;
|
||||
@@ -722,7 +725,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
||||
linear = vnet_hdr.hdr_len;
|
||||
}
|
||||
|
||||
skb = macvtap_alloc_skb(&q->sk, NET_IP_ALIGN, copylen,
|
||||
skb = macvtap_alloc_skb(&q->sk, MACVTAP_RESERVE, copylen,
|
||||
linear, noblock, &err);
|
||||
if (!skb)
|
||||
goto err;
|
||||
|
||||
@@ -202,6 +202,25 @@ static inline int phy_find_valid(int idx, u32 features)
|
||||
return idx < MAX_NUM_SETTINGS ? idx : MAX_NUM_SETTINGS - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_check_valid - check if there is a valid PHY setting which matches
|
||||
* speed, duplex, and feature mask
|
||||
* @speed: speed to match
|
||||
* @duplex: duplex to match
|
||||
* @features: A mask of the valid settings
|
||||
*
|
||||
* Description: Returns true if there is a valid setting, false otherwise.
|
||||
*/
|
||||
static inline bool phy_check_valid(int speed, int duplex, u32 features)
|
||||
{
|
||||
unsigned int idx;
|
||||
|
||||
idx = phy_find_valid(phy_find_setting(speed, duplex), features);
|
||||
|
||||
return settings[idx].speed == speed && settings[idx].duplex == duplex &&
|
||||
(settings[idx].setting & features);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_sanitize_settings - make sure the PHY is set to supported speed and duplex
|
||||
* @phydev: the target phy_device struct
|
||||
@@ -1011,7 +1030,7 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII))) {
|
||||
int eee_lp, eee_cap, eee_adv;
|
||||
u32 lp, cap, adv;
|
||||
int idx, status;
|
||||
int status;
|
||||
|
||||
/* Read phy status to properly get the right settings */
|
||||
status = phy_read_status(phydev);
|
||||
@@ -1043,8 +1062,7 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
|
||||
|
||||
adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv);
|
||||
lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp);
|
||||
idx = phy_find_setting(phydev->speed, phydev->duplex);
|
||||
if (!(lp & adv & settings[idx].setting))
|
||||
if (!phy_check_valid(phydev->speed, phydev->duplex, lp & adv))
|
||||
goto eee_exit;
|
||||
|
||||
if (clk_stop_enable) {
|
||||
|
||||
@@ -42,9 +42,7 @@
|
||||
|
||||
static struct team_port *team_port_get_rcu(const struct net_device *dev)
|
||||
{
|
||||
struct team_port *port = rcu_dereference(dev->rx_handler_data);
|
||||
|
||||
return team_port_exists(dev) ? port : NULL;
|
||||
return rcu_dereference(dev->rx_handler_data);
|
||||
}
|
||||
|
||||
static struct team_port *team_port_get_rtnl(const struct net_device *dev)
|
||||
@@ -1523,11 +1521,11 @@ static int team_set_mac_address(struct net_device *dev, void *p)
|
||||
if (dev->type == ARPHRD_ETHER && !is_valid_ether_addr(addr->sa_data))
|
||||
return -EADDRNOTAVAIL;
|
||||
memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(port, &team->port_list, list)
|
||||
mutex_lock(&team->lock);
|
||||
list_for_each_entry(port, &team->port_list, list)
|
||||
if (team->ops.port_change_dev_addr)
|
||||
team->ops.port_change_dev_addr(team, port);
|
||||
rcu_read_unlock();
|
||||
mutex_unlock(&team->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -136,6 +136,11 @@ static const struct usb_device_id products [] = {
|
||||
}, {
|
||||
USB_DEVICE(0x050d, 0x258a), /* Belkin F5U258/F5U279 (PL-25A1) */
|
||||
.driver_info = (unsigned long) &prolific_info,
|
||||
}, {
|
||||
USB_DEVICE(0x3923, 0x7825), /* National Instruments USB
|
||||
* Host-to-Host Cable
|
||||
*/
|
||||
.driver_info = (unsigned long) &prolific_info,
|
||||
},
|
||||
|
||||
{ }, // END
|
||||
|
||||
@@ -478,7 +478,7 @@ ath5k_hw_wisoc_reset(struct ath5k_hw *ah, u32 flags)
|
||||
regval = ioread32(reg);
|
||||
iowrite32(regval | val, reg);
|
||||
regval = ioread32(reg);
|
||||
usleep_range(100, 150);
|
||||
udelay(100); /* NB: should be atomic */
|
||||
|
||||
/* Bring BB/MAC out of reset */
|
||||
iowrite32(regval & ~val, reg);
|
||||
|
||||
@@ -564,7 +564,6 @@ static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev)
|
||||
"beiscsi_hba_alloc - iscsi_host_alloc failed\n");
|
||||
return NULL;
|
||||
}
|
||||
shost->dma_boundary = pcidev->dma_mask;
|
||||
shost->max_id = BE2_MAX_SESSIONS;
|
||||
shost->max_channel = 0;
|
||||
shost->max_cmd_len = BEISCSI_MAX_CMD_LEN;
|
||||
|
||||
@@ -522,7 +522,7 @@ static ssize_t
|
||||
sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp)
|
||||
{
|
||||
sg_io_hdr_t *hp = &srp->header;
|
||||
int err = 0;
|
||||
int err = 0, err2;
|
||||
int len;
|
||||
|
||||
if (count < SZ_SG_IO_HDR) {
|
||||
@@ -551,8 +551,8 @@ sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp)
|
||||
goto err_out;
|
||||
}
|
||||
err_out:
|
||||
err = sg_finish_rem_req(srp);
|
||||
return (0 == err) ? count : err;
|
||||
err2 = sg_finish_rem_req(srp);
|
||||
return err ? : err2 ? : count;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
||||
@@ -270,7 +270,7 @@ static int compat_cmd(struct file *file, unsigned long arg)
|
||||
{
|
||||
struct comedi_cmd __user *cmd;
|
||||
struct comedi32_cmd_struct __user *cmd32;
|
||||
int rc;
|
||||
int rc, err;
|
||||
|
||||
cmd32 = compat_ptr(arg);
|
||||
cmd = compat_alloc_user_space(sizeof(*cmd));
|
||||
@@ -279,7 +279,15 @@ static int compat_cmd(struct file *file, unsigned long arg)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
return translated_ioctl(file, COMEDI_CMD, (unsigned long)cmd);
|
||||
rc = translated_ioctl(file, COMEDI_CMD, (unsigned long)cmd);
|
||||
if (rc == -EAGAIN) {
|
||||
/* Special case: copy cmd back to user. */
|
||||
err = put_compat_cmd(cmd32, cmd);
|
||||
if (err)
|
||||
rc = err;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Handle 32-bit COMEDI_CMDTEST ioctl. */
|
||||
|
||||
@@ -455,6 +455,29 @@ static const struct comedi_lrange ai_ranges_64xx = {
|
||||
}
|
||||
};
|
||||
|
||||
static const uint8_t ai_range_code_64xx[8] = {
|
||||
0x0, 0x1, 0x2, 0x3, /* bipolar 10, 5, 2,5, 1.25 */
|
||||
0x8, 0x9, 0xa, 0xb /* unipolar 10, 5, 2.5, 1.25 */
|
||||
};
|
||||
|
||||
/* analog input ranges for 64-Mx boards */
|
||||
static const struct comedi_lrange ai_ranges_64_mx = {
|
||||
7, {
|
||||
BIP_RANGE(5),
|
||||
BIP_RANGE(2.5),
|
||||
BIP_RANGE(1.25),
|
||||
BIP_RANGE(0.625),
|
||||
UNI_RANGE(5),
|
||||
UNI_RANGE(2.5),
|
||||
UNI_RANGE(1.25)
|
||||
}
|
||||
};
|
||||
|
||||
static const uint8_t ai_range_code_64_mx[7] = {
|
||||
0x0, 0x1, 0x2, 0x3, /* bipolar 5, 2.5, 1.25, 0.625 */
|
||||
0x9, 0xa, 0xb /* unipolar 5, 2.5, 1.25 */
|
||||
};
|
||||
|
||||
/* analog input ranges for 60xx boards */
|
||||
static const struct comedi_lrange ai_ranges_60xx = {
|
||||
4,
|
||||
@@ -466,6 +489,10 @@ static const struct comedi_lrange ai_ranges_60xx = {
|
||||
}
|
||||
};
|
||||
|
||||
static const uint8_t ai_range_code_60xx[4] = {
|
||||
0x0, 0x1, 0x4, 0x7 /* bipolar 10, 5, 0.5, 0.05 */
|
||||
};
|
||||
|
||||
/* analog input ranges for 6030, etc boards */
|
||||
static const struct comedi_lrange ai_ranges_6030 = {
|
||||
14,
|
||||
@@ -487,6 +514,11 @@ static const struct comedi_lrange ai_ranges_6030 = {
|
||||
}
|
||||
};
|
||||
|
||||
static const uint8_t ai_range_code_6030[14] = {
|
||||
0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, /* bip 10, 5, 2, 1, 0.5, 0.2, 0.1 */
|
||||
0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf /* uni 10, 5, 2, 1, 0.5, 0.2, 0.1 */
|
||||
};
|
||||
|
||||
/* analog input ranges for 6052, etc boards */
|
||||
static const struct comedi_lrange ai_ranges_6052 = {
|
||||
15,
|
||||
@@ -509,6 +541,11 @@ static const struct comedi_lrange ai_ranges_6052 = {
|
||||
}
|
||||
};
|
||||
|
||||
static const uint8_t ai_range_code_6052[15] = {
|
||||
0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, /* bipolar 10 ... 0.05 */
|
||||
0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf /* unipolar 10 ... 0.1 */
|
||||
};
|
||||
|
||||
/* analog input ranges for 4020 board */
|
||||
static const struct comedi_lrange ai_ranges_4020 = {
|
||||
2,
|
||||
@@ -616,6 +653,7 @@ struct pcidas64_board {
|
||||
int ai_bits; /* analog input resolution */
|
||||
int ai_speed; /* fastest conversion period in ns */
|
||||
const struct comedi_lrange *ai_range_table;
|
||||
const uint8_t *ai_range_code;
|
||||
int ao_nchan; /* number of analog out channels */
|
||||
int ao_bits; /* analog output resolution */
|
||||
int ao_scan_speed; /* analog output scan speed */
|
||||
@@ -674,6 +712,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_code = ai_range_code_64xx,
|
||||
.ao_range_table = &ao_ranges_64xx,
|
||||
.ao_range_code = ao_range_code_64xx,
|
||||
.ai_fifo = &ai_fifo_64xx,
|
||||
@@ -689,6 +728,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_code = ai_range_code_64xx,
|
||||
.ao_range_table = &ao_ranges_64xx,
|
||||
.ao_range_code = ao_range_code_64xx,
|
||||
.ai_fifo = &ai_fifo_64xx,
|
||||
@@ -703,7 +743,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_bits = 16,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ao_range_table = &ao_ranges_64xx,
|
||||
.ao_range_code = ao_range_code_64xx,
|
||||
.ai_fifo = &ai_fifo_64xx,
|
||||
@@ -718,7 +759,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_bits = 16,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ao_range_table = &ao_ranges_64xx,
|
||||
.ao_range_code = ao_range_code_64xx,
|
||||
.ai_fifo = &ai_fifo_64xx,
|
||||
@@ -733,7 +775,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_bits = 16,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ao_range_table = &ao_ranges_64xx,
|
||||
.ao_range_code = ao_range_code_64xx,
|
||||
.ai_fifo = &ai_fifo_64xx,
|
||||
@@ -748,6 +791,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_bits = 16,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_60xx,
|
||||
.ai_range_code = ai_range_code_60xx,
|
||||
.ao_range_table = &range_bipolar10,
|
||||
.ao_range_code = ao_range_code_60xx,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -763,6 +807,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 100000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_60xx,
|
||||
.ai_range_code = ai_range_code_60xx,
|
||||
.ao_range_table = &range_bipolar10,
|
||||
.ao_range_code = ao_range_code_60xx,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -777,6 +822,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 100000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_60xx,
|
||||
.ai_range_code = ai_range_code_60xx,
|
||||
.ao_range_table = &range_bipolar10,
|
||||
.ao_range_code = ao_range_code_60xx,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -792,6 +838,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 100000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_60xx,
|
||||
.ai_range_code = ai_range_code_60xx,
|
||||
.ao_range_table = &range_bipolar10,
|
||||
.ao_range_code = ao_range_code_60xx,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -807,6 +854,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6030,
|
||||
.ai_range_code = ai_range_code_6030,
|
||||
.ao_range_table = &ao_ranges_6030,
|
||||
.ao_range_code = ao_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -822,6 +870,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6030,
|
||||
.ai_range_code = ai_range_code_6030,
|
||||
.ao_range_table = &ao_ranges_6030,
|
||||
.ao_range_code = ao_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -835,6 +884,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 0,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6030,
|
||||
.ai_range_code = ai_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
.has_8255 = 0,
|
||||
},
|
||||
@@ -846,6 +896,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 0,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6030,
|
||||
.ai_range_code = ai_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
.has_8255 = 0,
|
||||
},
|
||||
@@ -858,6 +909,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 0,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_60xx,
|
||||
.ai_range_code = ai_range_code_60xx,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
.has_8255 = 0,
|
||||
},
|
||||
@@ -871,6 +923,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 100000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_60xx,
|
||||
.ai_range_code = ai_range_code_60xx,
|
||||
.ao_range_table = &range_bipolar10,
|
||||
.ao_range_code = ao_range_code_60xx,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -886,6 +939,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 100000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_60xx,
|
||||
.ai_range_code = ai_range_code_60xx,
|
||||
.ao_range_table = &range_bipolar10,
|
||||
.ao_range_code = ao_range_code_60xx,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -901,6 +955,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 1000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6052,
|
||||
.ai_range_code = ai_range_code_6052,
|
||||
.ao_range_table = &ao_ranges_6030,
|
||||
.ao_range_code = ao_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -916,6 +971,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 3333,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6052,
|
||||
.ai_range_code = ai_range_code_6052,
|
||||
.ao_range_table = &ao_ranges_6030,
|
||||
.ao_range_code = ao_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -931,6 +987,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 1000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6052,
|
||||
.ai_range_code = ai_range_code_6052,
|
||||
.ao_range_table = &ao_ranges_6030,
|
||||
.ao_range_code = ao_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -946,6 +1003,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 1000,
|
||||
.layout = LAYOUT_60XX,
|
||||
.ai_range_table = &ai_ranges_6052,
|
||||
.ai_range_code = ai_range_code_6052,
|
||||
.ao_range_table = &ao_ranges_6030,
|
||||
.ao_range_code = ao_range_code_6030,
|
||||
.ai_fifo = &ai_fifo_60xx,
|
||||
@@ -980,6 +1038,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_code = ai_range_code_64xx,
|
||||
.ai_fifo = ai_fifo_64xx,
|
||||
.has_8255 = 1,
|
||||
},
|
||||
@@ -991,7 +1050,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 0,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ai_fifo = ai_fifo_64xx,
|
||||
.has_8255 = 1,
|
||||
},
|
||||
@@ -1003,7 +1063,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 0,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ai_fifo = ai_fifo_64xx,
|
||||
.has_8255 = 1,
|
||||
},
|
||||
@@ -1015,7 +1076,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 0,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ai_fifo = ai_fifo_64xx,
|
||||
.has_8255 = 1,
|
||||
},
|
||||
@@ -1027,7 +1089,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 2,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ai_fifo = ai_fifo_64xx,
|
||||
.has_8255 = 1,
|
||||
},
|
||||
@@ -1039,7 +1102,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 2,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ai_fifo = ai_fifo_64xx,
|
||||
.has_8255 = 1,
|
||||
},
|
||||
@@ -1051,7 +1115,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
|
||||
.ao_nchan = 2,
|
||||
.ao_scan_speed = 10000,
|
||||
.layout = LAYOUT_64XX,
|
||||
.ai_range_table = &ai_ranges_64xx,
|
||||
.ai_range_table = &ai_ranges_64_mx,
|
||||
.ai_range_code = ai_range_code_64_mx,
|
||||
.ai_fifo = ai_fifo_64xx,
|
||||
.has_8255 = 1,
|
||||
},
|
||||
@@ -1148,45 +1213,8 @@ static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
|
||||
unsigned int range_index)
|
||||
{
|
||||
const struct pcidas64_board *thisboard = comedi_board(dev);
|
||||
const struct comedi_krange *range =
|
||||
&thisboard->ai_range_table->range[range_index];
|
||||
unsigned int bits = 0;
|
||||
|
||||
switch (range->max) {
|
||||
case 10000000:
|
||||
bits = 0x000;
|
||||
break;
|
||||
case 5000000:
|
||||
bits = 0x100;
|
||||
break;
|
||||
case 2000000:
|
||||
case 2500000:
|
||||
bits = 0x200;
|
||||
break;
|
||||
case 1000000:
|
||||
case 1250000:
|
||||
bits = 0x300;
|
||||
break;
|
||||
case 500000:
|
||||
bits = 0x400;
|
||||
break;
|
||||
case 200000:
|
||||
case 250000:
|
||||
bits = 0x500;
|
||||
break;
|
||||
case 100000:
|
||||
bits = 0x600;
|
||||
break;
|
||||
case 50000:
|
||||
bits = 0x700;
|
||||
break;
|
||||
default:
|
||||
comedi_error(dev, "bug! in ai_range_bits_6xxx");
|
||||
break;
|
||||
}
|
||||
if (range->min == 0)
|
||||
bits += 0x900;
|
||||
return bits;
|
||||
return thisboard->ai_range_code[range_index] << 8;
|
||||
}
|
||||
|
||||
static unsigned int hw_revision(const struct comedi_device *dev,
|
||||
|
||||
@@ -562,7 +562,8 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
|
||||
unsigned long long end_lba;
|
||||
|
||||
end_lba = dev->transport->get_blocks(dev) + 1;
|
||||
if (cmd->t_task_lba + sectors > end_lba) {
|
||||
if (((cmd->t_task_lba + sectors) < cmd->t_task_lba) ||
|
||||
((cmd->t_task_lba + sectors) > end_lba)) {
|
||||
pr_err("cmd exceeds last lba %llu "
|
||||
"(lba %llu, sectors %u)\n",
|
||||
end_lba, cmd->t_task_lba, sectors);
|
||||
|
||||
@@ -992,8 +992,8 @@ EXPORT_SYMBOL(start_tty);
|
||||
/* We limit tty time update visibility to every 8 seconds or so. */
|
||||
static void tty_update_time(struct timespec *time)
|
||||
{
|
||||
unsigned long sec = get_seconds() & ~7;
|
||||
if ((long)(sec - time->tv_sec) > 0)
|
||||
unsigned long sec = get_seconds();
|
||||
if (abs(sec - time->tv_sec) & ~7)
|
||||
time->tv_sec = sec;
|
||||
}
|
||||
|
||||
|
||||
@@ -217,11 +217,17 @@ void tty_wait_until_sent(struct tty_struct *tty, long timeout)
|
||||
#endif
|
||||
if (!timeout)
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
|
||||
if (wait_event_interruptible_timeout(tty->write_wait,
|
||||
!tty_chars_in_buffer(tty), timeout) >= 0) {
|
||||
if (tty->ops->wait_until_sent)
|
||||
tty->ops->wait_until_sent(tty, timeout);
|
||||
!tty_chars_in_buffer(tty), timeout) < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (timeout == MAX_SCHEDULE_TIMEOUT)
|
||||
timeout = 0;
|
||||
|
||||
if (tty->ops->wait_until_sent)
|
||||
tty->ops->wait_until_sent(tty, timeout);
|
||||
}
|
||||
EXPORT_SYMBOL(tty_wait_until_sent);
|
||||
|
||||
|
||||
@@ -501,6 +501,7 @@ static void async_completed(struct urb *urb)
|
||||
as->status = urb->status;
|
||||
signr = as->signr;
|
||||
if (signr) {
|
||||
memset(&sinfo, 0, sizeof(sinfo));
|
||||
sinfo.si_signo = as->signr;
|
||||
sinfo.si_errno = as->status;
|
||||
sinfo.si_code = SI_ASYNCIO;
|
||||
@@ -2228,6 +2229,7 @@ static void usbdev_remove(struct usb_device *udev)
|
||||
wake_up_all(&ps->wait);
|
||||
list_del_init(&ps->list);
|
||||
if (ps->discsignr) {
|
||||
memset(&sinfo, 0, sizeof(sinfo));
|
||||
sinfo.si_signo = ps->discsignr;
|
||||
sinfo.si_errno = EPIPE;
|
||||
sinfo.si_code = SI_ASYNCIO;
|
||||
|
||||
@@ -2064,7 +2064,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
||||
if (event_trb != ep_ring->dequeue) {
|
||||
/* The event was for the status stage */
|
||||
if (event_trb == td->last_trb) {
|
||||
if (td->urb->actual_length != 0) {
|
||||
if (td->urb_length_set) {
|
||||
/* Don't overwrite a previously set error code
|
||||
*/
|
||||
if ((*status == -EINPROGRESS || *status == 0) &&
|
||||
@@ -2078,7 +2078,13 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
||||
td->urb->transfer_buffer_length;
|
||||
}
|
||||
} else {
|
||||
/* Maybe the event was for the data stage? */
|
||||
/*
|
||||
* Maybe the event was for the data stage? If so, update
|
||||
* already the actual_length of the URB and flag it as
|
||||
* set, so that it is not overwritten in the event for
|
||||
* the last TRB.
|
||||
*/
|
||||
td->urb_length_set = true;
|
||||
td->urb->actual_length =
|
||||
td->urb->transfer_buffer_length -
|
||||
EVENT_TRB_LEN(le32_to_cpu(event->transfer_len));
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/*
|
||||
* xHCI host controller driver
|
||||
*
|
||||
@@ -88,9 +89,10 @@ struct xhci_cap_regs {
|
||||
#define HCS_IST(p) (((p) >> 0) & 0xf)
|
||||
/* bits 4:7, max number of Event Ring segments */
|
||||
#define HCS_ERST_MAX(p) (((p) >> 4) & 0xf)
|
||||
/* bits 21:25 Hi 5 bits of Scratchpad buffers SW must allocate for the HW */
|
||||
/* bit 26 Scratchpad restore - for save/restore HW state - not used yet */
|
||||
/* bits 27:31 number of Scratchpad buffers SW must allocate for the HW */
|
||||
#define HCS_MAX_SCRATCHPAD(p) (((p) >> 27) & 0x1f)
|
||||
/* bits 27:31 Lo 5 bits of Scratchpad buffers SW must allocate for the HW */
|
||||
#define HCS_MAX_SCRATCHPAD(p) ((((p) >> 16) & 0x3e0) | (((p) >> 27) & 0x1f))
|
||||
|
||||
/* HCSPARAMS3 - hcs_params3 - bitmasks */
|
||||
/* bits 0:7, Max U1 to U0 latency for the roothub ports */
|
||||
@@ -1258,6 +1260,8 @@ struct xhci_td {
|
||||
struct xhci_segment *start_seg;
|
||||
union xhci_trb *first_trb;
|
||||
union xhci_trb *last_trb;
|
||||
/* actual_length of the URB has already been set */
|
||||
bool urb_length_set;
|
||||
};
|
||||
|
||||
/* xHCI command default timeout value */
|
||||
|
||||
@@ -76,7 +76,7 @@ static int usb_serial_device_probe(struct device *dev)
|
||||
retval = device_create_file(dev, &dev_attr_port_number);
|
||||
if (retval) {
|
||||
if (driver->port_remove)
|
||||
retval = driver->port_remove(port);
|
||||
driver->port_remove(port);
|
||||
goto exit_with_autopm;
|
||||
}
|
||||
|
||||
|
||||
@@ -147,6 +147,8 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x166A, 0x0305) }, /* Clipsal C-5000CT2 C-Bus Spectrum Colour Touchscreen */
|
||||
{ USB_DEVICE(0x166A, 0x0401) }, /* Clipsal L51xx C-Bus Architectural Dimmer */
|
||||
{ USB_DEVICE(0x166A, 0x0101) }, /* Clipsal 5560884 C-Bus Multi-room Audio Matrix Switcher */
|
||||
{ USB_DEVICE(0x16C0, 0x09B0) }, /* Lunatico Seletek */
|
||||
{ USB_DEVICE(0x16C0, 0x09B1) }, /* Lunatico Seletek */
|
||||
{ USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
|
||||
{ USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 Power Supply */
|
||||
{ USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */
|
||||
|
||||
@@ -814,6 +814,8 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, CYBER_CORTEX_AV_PID),
|
||||
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
|
||||
{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
|
||||
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
|
||||
{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
|
||||
|
||||
@@ -38,6 +38,9 @@
|
||||
|
||||
#define FTDI_LUMEL_PD12_PID 0x6002
|
||||
|
||||
/* Cyber Cortex AV by Fabulous Silicon (http://fabuloussilicon.com) */
|
||||
#define CYBER_CORTEX_AV_PID 0x8698
|
||||
|
||||
/*
|
||||
* Marvell OpenRD Base, Client
|
||||
* http://www.open-rd.org
|
||||
|
||||
@@ -261,7 +261,8 @@ void usb_serial_generic_wait_until_sent(struct tty_struct *tty, long timeout)
|
||||
* character or at least one jiffy.
|
||||
*/
|
||||
period = max_t(unsigned long, (10 * HZ / bps), 1);
|
||||
period = min_t(unsigned long, period, timeout);
|
||||
if (timeout)
|
||||
period = min_t(unsigned long, period, timeout);
|
||||
|
||||
dev_dbg(&port->dev, "%s - timeout = %u ms, period = %u ms\n",
|
||||
__func__, jiffies_to_msecs(timeout),
|
||||
@@ -271,7 +272,7 @@ void usb_serial_generic_wait_until_sent(struct tty_struct *tty, long timeout)
|
||||
schedule_timeout_interruptible(period);
|
||||
if (signal_pending(current))
|
||||
break;
|
||||
if (time_after(jiffies, expire))
|
||||
if (timeout && time_after(jiffies, expire))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ static int check_dev_ioctl_version(int cmd, struct autofs_dev_ioctl *param)
|
||||
*/
|
||||
static struct autofs_dev_ioctl *copy_dev_ioctl(struct autofs_dev_ioctl __user *in)
|
||||
{
|
||||
struct autofs_dev_ioctl tmp;
|
||||
struct autofs_dev_ioctl tmp, *res;
|
||||
|
||||
if (copy_from_user(&tmp, in, sizeof(tmp)))
|
||||
return ERR_PTR(-EFAULT);
|
||||
@@ -103,7 +103,11 @@ static struct autofs_dev_ioctl *copy_dev_ioctl(struct autofs_dev_ioctl __user *i
|
||||
if (tmp.size < sizeof(tmp))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return memdup_user(in, tmp.size);
|
||||
res = memdup_user(in, tmp.size);
|
||||
if (!IS_ERR(res))
|
||||
res->size = tmp.size;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline void free_dev_ioctl(struct autofs_dev_ioctl *param)
|
||||
|
||||
@@ -1593,22 +1593,10 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
||||
/*
|
||||
* we want to make sure fsync finds this change
|
||||
* but we haven't joined a transaction running right now.
|
||||
*
|
||||
* Later on, someone is sure to update the inode and get the
|
||||
* real transid recorded.
|
||||
*
|
||||
* We set last_trans now to the fs_info generation + 1,
|
||||
* this will either be one more than the running transaction
|
||||
* or the generation used for the next transaction if there isn't
|
||||
* one running right now.
|
||||
*
|
||||
* We also have to set last_sub_trans to the current log transid,
|
||||
* otherwise subsequent syncs to a file that's been synced in this
|
||||
* transaction will appear to have already occured.
|
||||
*/
|
||||
BTRFS_I(inode)->last_trans = root->fs_info->generation + 1;
|
||||
BTRFS_I(inode)->last_sub_trans = root->log_transid;
|
||||
if (num_written > 0 || num_written == -EIOCBQUEUED) {
|
||||
err = generic_write_sync(file, pos, num_written);
|
||||
@@ -1706,25 +1694,37 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
atomic_inc(&root->log_batch);
|
||||
|
||||
/*
|
||||
* check the transaction that last modified this inode
|
||||
* and see if its already been committed
|
||||
*/
|
||||
if (!BTRFS_I(inode)->last_trans) {
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* if the last transaction that changed this file was before
|
||||
* the current transaction, we can bail out now without any
|
||||
* syncing
|
||||
* If the last transaction that changed this file was before the current
|
||||
* transaction and we have the full sync flag set in our inode, we can
|
||||
* bail out now without any syncing.
|
||||
*
|
||||
* Note that we can't bail out if the full sync flag isn't set. This is
|
||||
* because when the full sync flag is set we start all ordered extents
|
||||
* and wait for them to fully complete - when they complete they update
|
||||
* the inode's last_trans field through:
|
||||
*
|
||||
* btrfs_finish_ordered_io() ->
|
||||
* btrfs_update_inode_fallback() ->
|
||||
* btrfs_update_inode() ->
|
||||
* btrfs_set_inode_last_trans()
|
||||
*
|
||||
* So we are sure that last_trans is up to date and can do this check to
|
||||
* bail out safely. For the fast path, when the full sync flag is not
|
||||
* set in our inode, we can not do it because we start only our ordered
|
||||
* extents and don't wait for them to complete (that is when
|
||||
* btrfs_finish_ordered_io runs), so here at this point their last_trans
|
||||
* value might be less than or equals to fs_info->last_trans_committed,
|
||||
* and setting a speculative last_trans for an inode when a buffered
|
||||
* write is made (such as fs_info->generation + 1 for example) would not
|
||||
* be reliable since after setting the value and before fsync is called
|
||||
* any number of transactions can start and commit (transaction kthread
|
||||
* commits the current transaction periodically), and a transaction
|
||||
* commit does not start nor waits for ordered extents to complete.
|
||||
*/
|
||||
smp_mb();
|
||||
if (btrfs_inode_in_log(inode, root->fs_info->generation) ||
|
||||
BTRFS_I(inode)->last_trans <=
|
||||
root->fs_info->last_trans_committed) {
|
||||
BTRFS_I(inode)->last_trans = 0;
|
||||
|
||||
(full_sync && BTRFS_I(inode)->last_trans <=
|
||||
root->fs_info->last_trans_committed)) {
|
||||
/*
|
||||
* We'v had everything committed since the last time we were
|
||||
* modified so clear this flag in case it was set for whatever
|
||||
|
||||
@@ -6825,7 +6825,6 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
|
||||
((BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW) &&
|
||||
em->block_start != EXTENT_MAP_HOLE)) {
|
||||
int type;
|
||||
int ret;
|
||||
u64 block_start, orig_start, orig_block_len, ram_bytes;
|
||||
|
||||
if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
|
||||
|
||||
@@ -943,7 +943,7 @@ again:
|
||||
base = btrfs_item_ptr_offset(leaf, path->slots[0]);
|
||||
|
||||
while (cur_offset < item_size) {
|
||||
extref = (struct btrfs_inode_extref *)base + cur_offset;
|
||||
extref = (struct btrfs_inode_extref *)(base + cur_offset);
|
||||
|
||||
victim_name_len = btrfs_inode_extref_name_len(leaf, extref);
|
||||
|
||||
|
||||
@@ -245,10 +245,19 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void debugfs_evict_inode(struct inode *inode)
|
||||
{
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
clear_inode(inode);
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
kfree(inode->i_private);
|
||||
}
|
||||
|
||||
static const struct super_operations debugfs_super_operations = {
|
||||
.statfs = simple_statfs,
|
||||
.remount_fs = debugfs_remount,
|
||||
.show_options = debugfs_show_options,
|
||||
.evict_inode = debugfs_evict_inode,
|
||||
};
|
||||
|
||||
static int debug_fill_super(struct super_block *sb, void *data, int silent)
|
||||
@@ -465,23 +474,14 @@ static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
|
||||
int ret = 0;
|
||||
|
||||
if (debugfs_positive(dentry)) {
|
||||
if (dentry->d_inode) {
|
||||
dget(dentry);
|
||||
switch (dentry->d_inode->i_mode & S_IFMT) {
|
||||
case S_IFDIR:
|
||||
ret = simple_rmdir(parent->d_inode, dentry);
|
||||
break;
|
||||
case S_IFLNK:
|
||||
kfree(dentry->d_inode->i_private);
|
||||
/* fall through */
|
||||
default:
|
||||
simple_unlink(parent->d_inode, dentry);
|
||||
break;
|
||||
}
|
||||
if (!ret)
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
}
|
||||
dget(dentry);
|
||||
if (S_ISDIR(dentry->d_inode->i_mode))
|
||||
ret = simple_rmdir(parent->d_inode, dentry);
|
||||
else
|
||||
simple_unlink(parent->d_inode, dentry);
|
||||
if (!ret)
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
#include "alloc.h"
|
||||
#include "dat.h"
|
||||
|
||||
static void __nilfs_btree_init(struct nilfs_bmap *bmap);
|
||||
|
||||
static struct nilfs_btree_path *nilfs_btree_alloc_path(void)
|
||||
{
|
||||
struct nilfs_btree_path *path;
|
||||
@@ -368,6 +370,34 @@ static int nilfs_btree_node_broken(const struct nilfs_btree_node *node,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nilfs_btree_root_broken - verify consistency of btree root node
|
||||
* @node: btree root node to be examined
|
||||
* @ino: inode number
|
||||
*
|
||||
* Return Value: If node is broken, 1 is returned. Otherwise, 0 is returned.
|
||||
*/
|
||||
static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,
|
||||
unsigned long ino)
|
||||
{
|
||||
int level, flags, nchildren;
|
||||
int ret = 0;
|
||||
|
||||
level = nilfs_btree_node_get_level(node);
|
||||
flags = nilfs_btree_node_get_flags(node);
|
||||
nchildren = nilfs_btree_node_get_nchildren(node);
|
||||
|
||||
if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
|
||||
level > NILFS_BTREE_LEVEL_MAX ||
|
||||
nchildren < 0 ||
|
||||
nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX)) {
|
||||
pr_crit("NILFS: bad btree root (inode number=%lu): level = %d, flags = 0x%x, nchildren = %d\n",
|
||||
ino, level, flags, nchildren);
|
||||
ret = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int nilfs_btree_broken_node_block(struct buffer_head *bh)
|
||||
{
|
||||
int ret;
|
||||
@@ -1713,7 +1743,7 @@ nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *btree,
|
||||
|
||||
/* convert and insert */
|
||||
dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
|
||||
nilfs_btree_init(btree);
|
||||
__nilfs_btree_init(btree);
|
||||
if (nreq != NULL) {
|
||||
nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
|
||||
nilfs_bmap_commit_alloc_ptr(btree, nreq, dat);
|
||||
@@ -2294,12 +2324,23 @@ static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
|
||||
.bop_gather_data = NULL,
|
||||
};
|
||||
|
||||
int nilfs_btree_init(struct nilfs_bmap *bmap)
|
||||
static void __nilfs_btree_init(struct nilfs_bmap *bmap)
|
||||
{
|
||||
bmap->b_ops = &nilfs_btree_ops;
|
||||
bmap->b_nchildren_per_block =
|
||||
NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(bmap));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nilfs_btree_init(struct nilfs_bmap *bmap)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
__nilfs_btree_init(bmap);
|
||||
|
||||
if (nilfs_btree_root_broken(nilfs_btree_get_root(bmap),
|
||||
bmap->b_inode->i_ino))
|
||||
ret = -EIO;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <linux/mount.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/namei.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/completion.h>
|
||||
@@ -163,17 +162,6 @@ void proc_free_inum(unsigned int inum)
|
||||
spin_unlock_irqrestore(&proc_inum_lock, flags);
|
||||
}
|
||||
|
||||
static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
{
|
||||
nd_set_link(nd, __PDE_DATA(dentry->d_inode));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const struct inode_operations proc_link_inode_operations = {
|
||||
.readlink = generic_readlink,
|
||||
.follow_link = proc_follow_link,
|
||||
};
|
||||
|
||||
/*
|
||||
* As some entries in /proc are volatile, we want to
|
||||
* get rid of unused dentries. This could be made
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/namei.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
@@ -373,6 +374,26 @@ static const struct file_operations proc_reg_file_ops_no_compat = {
|
||||
};
|
||||
#endif
|
||||
|
||||
static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
{
|
||||
struct proc_dir_entry *pde = PDE(dentry->d_inode);
|
||||
if (unlikely(!use_pde(pde)))
|
||||
return ERR_PTR(-EINVAL);
|
||||
nd_set_link(nd, pde->data);
|
||||
return pde;
|
||||
}
|
||||
|
||||
static void proc_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
|
||||
{
|
||||
unuse_pde(p);
|
||||
}
|
||||
|
||||
const struct inode_operations proc_link_inode_operations = {
|
||||
.readlink = generic_readlink,
|
||||
.follow_link = proc_follow_link,
|
||||
.put_link = proc_put_link,
|
||||
};
|
||||
|
||||
struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
|
||||
{
|
||||
struct inode *inode = new_inode_pseudo(sb);
|
||||
|
||||
@@ -202,6 +202,7 @@ struct pde_opener {
|
||||
int closing;
|
||||
struct completion *c;
|
||||
};
|
||||
extern const struct inode_operations proc_link_inode_operations;
|
||||
|
||||
extern const struct inode_operations proc_pid_link_inode_operations;
|
||||
|
||||
|
||||
@@ -369,12 +369,6 @@ void pm_qos_update_request(struct pm_qos_request *req,
|
||||
}
|
||||
|
||||
cancel_delayed_work_sync(&req->work);
|
||||
|
||||
if (new_value != req->node.prio)
|
||||
pm_qos_update_target(
|
||||
pm_qos_array[req->pm_qos_class]->constraints,
|
||||
&req->node, PM_QOS_UPDATE_REQ, new_value);
|
||||
|
||||
__pm_qos_update_request(req, new_value);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pm_qos_update_request);
|
||||
|
||||
@@ -881,7 +881,7 @@ static int compact_finished(struct zone *zone,
|
||||
return COMPACT_PARTIAL;
|
||||
|
||||
/* Job done if allocation would set block type */
|
||||
if (cc->order >= pageblock_order && area->nr_free)
|
||||
if (order >= pageblock_order && area->nr_free)
|
||||
return COMPACT_PARTIAL;
|
||||
}
|
||||
|
||||
|
||||
@@ -2451,9 +2451,10 @@ again:
|
||||
continue;
|
||||
|
||||
/*
|
||||
* HWPoisoned hugepage is already unmapped and dropped reference
|
||||
* Migrating hugepage or HWPoisoned hugepage is already
|
||||
* unmapped and its refcount is dropped, so just clear pte here.
|
||||
*/
|
||||
if (unlikely(is_hugetlb_entry_hwpoisoned(pte))) {
|
||||
if (unlikely(!pte_present(pte))) {
|
||||
huge_pte_clear(mm, address, ptep);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -4088,7 +4088,7 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
|
||||
if (follow_phys(vma, addr, write, &prot, &phys_addr))
|
||||
return -EINVAL;
|
||||
|
||||
maddr = ioremap_prot(phys_addr, PAGE_SIZE, prot);
|
||||
maddr = ioremap_prot(phys_addr, PAGE_ALIGN(len + offset), prot);
|
||||
if (write)
|
||||
memcpy_toio(maddr + offset, buf, len);
|
||||
else
|
||||
|
||||
@@ -127,7 +127,7 @@ EXPORT_SYMBOL_GPL(vm_memory_committed);
|
||||
*/
|
||||
int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
|
||||
{
|
||||
unsigned long free, allowed, reserve;
|
||||
long free, allowed, reserve;
|
||||
|
||||
vm_acct_memory(pages);
|
||||
|
||||
@@ -193,7 +193,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
|
||||
*/
|
||||
if (mm) {
|
||||
reserve = sysctl_user_reserve_kbytes >> (PAGE_SHIFT - 10);
|
||||
allowed -= min(mm->total_vm / 32, reserve);
|
||||
allowed -= min_t(long, mm->total_vm / 32, reserve);
|
||||
}
|
||||
|
||||
if (percpu_counter_read_positive(&vm_committed_as) < allowed)
|
||||
|
||||
@@ -1898,7 +1898,7 @@ EXPORT_SYMBOL(unmap_mapping_range);
|
||||
*/
|
||||
int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
|
||||
{
|
||||
unsigned long free, allowed, reserve;
|
||||
long free, allowed, reserve;
|
||||
|
||||
vm_acct_memory(pages);
|
||||
|
||||
@@ -1963,7 +1963,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
|
||||
*/
|
||||
if (mm) {
|
||||
reserve = sysctl_user_reserve_kbytes >> (PAGE_SHIFT - 10);
|
||||
allowed -= min(mm->total_vm / 32, reserve);
|
||||
allowed -= min_t(long, mm->total_vm / 32, reserve);
|
||||
}
|
||||
|
||||
if (percpu_counter_read_positive(&vm_committed_as) < allowed)
|
||||
|
||||
@@ -738,24 +738,18 @@ static unsigned char nas[21] = {
|
||||
|
||||
asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)
|
||||
{
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
return __sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||
unsigned int vlen, unsigned int flags)
|
||||
{
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)
|
||||
{
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
return __sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
@@ -778,9 +772,6 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||
int datagrams;
|
||||
struct timespec ktspec;
|
||||
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
|
||||
if (timeout == NULL)
|
||||
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT, NULL);
|
||||
|
||||
@@ -927,7 +927,7 @@ bool dev_valid_name(const char *name)
|
||||
return false;
|
||||
|
||||
while (*name) {
|
||||
if (*name == '/' || isspace(*name))
|
||||
if (*name == '/' || *name == ':' || isspace(*name))
|
||||
return false;
|
||||
name++;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,9 @@ gnet_stats_copy(struct gnet_dump *d, int type, void *buf, int size)
|
||||
return 0;
|
||||
|
||||
nla_put_failure:
|
||||
kfree(d->xstats);
|
||||
d->xstats = NULL;
|
||||
d->xstats_len = 0;
|
||||
spin_unlock_bh(d->lock);
|
||||
return -1;
|
||||
}
|
||||
@@ -205,7 +208,9 @@ int
|
||||
gnet_stats_copy_app(struct gnet_dump *d, void *st, int len)
|
||||
{
|
||||
if (d->compat_xstats) {
|
||||
d->xstats = st;
|
||||
d->xstats = kmemdup(st, len, GFP_ATOMIC);
|
||||
if (!d->xstats)
|
||||
goto err_out;
|
||||
d->xstats_len = len;
|
||||
}
|
||||
|
||||
@@ -213,6 +218,11 @@ gnet_stats_copy_app(struct gnet_dump *d, void *st, int len)
|
||||
return gnet_stats_copy(d, TCA_STATS_APP, st, len);
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
d->xstats_len = 0;
|
||||
spin_unlock_bh(d->lock);
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL(gnet_stats_copy_app);
|
||||
|
||||
@@ -245,6 +255,9 @@ gnet_stats_finish_copy(struct gnet_dump *d)
|
||||
return -1;
|
||||
}
|
||||
|
||||
kfree(d->xstats);
|
||||
d->xstats = NULL;
|
||||
d->xstats_len = 0;
|
||||
spin_unlock_bh(d->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1138,14 +1138,10 @@ static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = {
|
||||
};
|
||||
|
||||
static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
|
||||
[IFLA_VF_MAC] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_mac) },
|
||||
[IFLA_VF_VLAN] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_vlan) },
|
||||
[IFLA_VF_TX_RATE] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_tx_rate) },
|
||||
[IFLA_VF_SPOOFCHK] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_spoofchk) },
|
||||
[IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) },
|
||||
[IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) },
|
||||
[IFLA_VF_TX_RATE] = { .len = sizeof(struct ifla_vf_tx_rate) },
|
||||
[IFLA_VF_SPOOFCHK] = { .len = sizeof(struct ifla_vf_spoofchk) },
|
||||
};
|
||||
|
||||
static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = {
|
||||
@@ -1855,8 +1851,16 @@ replay:
|
||||
goto out;
|
||||
|
||||
err = rtnl_configure_link(dev, ifm);
|
||||
if (err < 0)
|
||||
unregister_netdevice(dev);
|
||||
if (err < 0) {
|
||||
if (ops->newlink) {
|
||||
LIST_HEAD(list_kill);
|
||||
|
||||
ops->dellink(dev, &list_kill);
|
||||
unregister_netdevice_many(&list_kill);
|
||||
} else {
|
||||
unregister_netdevice(dev);
|
||||
}
|
||||
}
|
||||
out:
|
||||
put_net(dest_net);
|
||||
return err;
|
||||
|
||||
@@ -678,27 +678,30 @@ EXPORT_SYMBOL(ip_defrag);
|
||||
struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user)
|
||||
{
|
||||
struct iphdr iph;
|
||||
int netoff;
|
||||
u32 len;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_IP))
|
||||
return skb;
|
||||
|
||||
if (!skb_copy_bits(skb, 0, &iph, sizeof(iph)))
|
||||
netoff = skb_network_offset(skb);
|
||||
|
||||
if (skb_copy_bits(skb, netoff, &iph, sizeof(iph)) < 0)
|
||||
return skb;
|
||||
|
||||
if (iph.ihl < 5 || iph.version != 4)
|
||||
return skb;
|
||||
|
||||
len = ntohs(iph.tot_len);
|
||||
if (skb->len < len || len < (iph.ihl * 4))
|
||||
if (skb->len < netoff + len || len < (iph.ihl * 4))
|
||||
return skb;
|
||||
|
||||
if (ip_is_fragment(&iph)) {
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (skb) {
|
||||
if (!pskb_may_pull(skb, iph.ihl*4))
|
||||
if (!pskb_may_pull(skb, netoff + iph.ihl * 4))
|
||||
return skb;
|
||||
if (pskb_trim_rcsum(skb, len))
|
||||
if (pskb_trim_rcsum(skb, netoff + len))
|
||||
return skb;
|
||||
memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
|
||||
if (ip_defrag(skb, user))
|
||||
|
||||
@@ -845,7 +845,8 @@ static int __ip_append_data(struct sock *sk,
|
||||
cork->length += length;
|
||||
if (((length > mtu) || (skb && skb_has_frags(skb))) &&
|
||||
(sk->sk_protocol == IPPROTO_UDP) &&
|
||||
(rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) {
|
||||
(rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len &&
|
||||
(sk->sk_type == SOCK_DGRAM)) {
|
||||
err = ip_ufo_append_data(sk, queue, getfrag, from, length,
|
||||
hh_len, fragheaderlen, transhdrlen,
|
||||
maxfraglen, flags);
|
||||
|
||||
@@ -1286,7 +1286,8 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
||||
if (((length > mtu) ||
|
||||
(skb && skb_has_frags(skb))) &&
|
||||
(sk->sk_protocol == IPPROTO_UDP) &&
|
||||
(rt->dst.dev->features & NETIF_F_UFO)) {
|
||||
(rt->dst.dev->features & NETIF_F_UFO) &&
|
||||
(sk->sk_type == SOCK_DGRAM)) {
|
||||
err = ip6_ufo_append_data(sk, getfrag, from, length,
|
||||
hh_len, fragheaderlen,
|
||||
transhdrlen, mtu, flags, rt);
|
||||
|
||||
@@ -109,7 +109,7 @@ static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old)
|
||||
u32 *p = NULL;
|
||||
|
||||
if (!(rt->dst.flags & DST_HOST))
|
||||
return NULL;
|
||||
return dst_cow_metrics_generic(dst, old);
|
||||
|
||||
peer = rt6_get_peer_create(rt);
|
||||
if (peer) {
|
||||
|
||||
@@ -820,7 +820,9 @@ static void ircomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
|
||||
orig_jiffies = jiffies;
|
||||
|
||||
/* Set poll time to 200 ms */
|
||||
poll_time = IRDA_MIN(timeout, msecs_to_jiffies(200));
|
||||
poll_time = msecs_to_jiffies(200);
|
||||
if (timeout)
|
||||
poll_time = min_t(unsigned long, timeout, poll_time);
|
||||
|
||||
spin_lock_irqsave(&self->spinlock, flags);
|
||||
while (self->tx_skb && self->tx_skb->len) {
|
||||
|
||||
@@ -227,6 +227,7 @@ static int tcf_em_validate(struct tcf_proto *tp,
|
||||
* to replay the request.
|
||||
*/
|
||||
module_put(em->ops->owner);
|
||||
em->ops = NULL;
|
||||
err = -EAGAIN;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -930,7 +930,7 @@ static unsigned int cache_poll(struct file *filp, poll_table *wait,
|
||||
poll_wait(filp, &queue_wait, wait);
|
||||
|
||||
/* alway allow write */
|
||||
mask = POLL_OUT | POLLWRNORM;
|
||||
mask = POLLOUT | POLLWRNORM;
|
||||
|
||||
if (!rp)
|
||||
return mask;
|
||||
|
||||
@@ -1404,6 +1404,8 @@ static int snd_pcm_do_drain_init(struct snd_pcm_substream *substream, int state)
|
||||
if (! snd_pcm_playback_empty(substream)) {
|
||||
snd_pcm_do_start(substream, SNDRV_PCM_STATE_DRAINING);
|
||||
snd_pcm_post_start(substream, SNDRV_PCM_STATE_DRAINING);
|
||||
} else {
|
||||
runtime->status->state = SNDRV_PCM_STATE_SETUP;
|
||||
}
|
||||
break;
|
||||
case SNDRV_PCM_STATE_RUNNING:
|
||||
|
||||
@@ -85,6 +85,7 @@ enum {
|
||||
STAC_ALIENWARE_M17X,
|
||||
STAC_92HD89XX_HP_FRONT_JACK,
|
||||
STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK,
|
||||
STAC_92HD73XX_ASUS_MOBO,
|
||||
STAC_92HD73XX_MODELS
|
||||
};
|
||||
|
||||
@@ -1915,7 +1916,18 @@ static const struct hda_fixup stac92hd73xx_fixups[] = {
|
||||
[STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = stac92hd89xx_hp_z1_g2_right_mic_jack_pin_configs,
|
||||
}
|
||||
},
|
||||
[STAC_92HD73XX_ASUS_MOBO] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
/* enable 5.1 and SPDIF out */
|
||||
{ 0x0c, 0x01014411 },
|
||||
{ 0x0d, 0x01014410 },
|
||||
{ 0x0e, 0x01014412 },
|
||||
{ 0x22, 0x014b1180 },
|
||||
{ }
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
static const struct hda_model_fixup stac92hd73xx_models[] = {
|
||||
@@ -1927,6 +1939,7 @@ static const struct hda_model_fixup stac92hd73xx_models[] = {
|
||||
{ .id = STAC_DELL_M6_BOTH, .name = "dell-m6" },
|
||||
{ .id = STAC_DELL_EQ, .name = "dell-eq" },
|
||||
{ .id = STAC_ALIENWARE_M17X, .name = "alienware" },
|
||||
{ .id = STAC_92HD73XX_ASUS_MOBO, .name = "asus-mobo" },
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -1979,6 +1992,8 @@ static const struct snd_pci_quirk stac92hd73xx_fixup_tbl[] = {
|
||||
"HP Z1 G2", STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2b17,
|
||||
"unknown HP", STAC_92HD89XX_HP_FRONT_JACK),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_ASUSTEK, 0x83f8, "ASUS AT4NM10",
|
||||
STAC_92HD73XX_ASUS_MOBO),
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user