Updated from Linux LTS 3.10.22 to 3.10.23
This commit is contained in:
@@ -3511,7 +3511,7 @@ static int init_card(struct atm_dev *dev)
|
||||
tmp = dev_get_by_name(&init_net, tname); /* jhs: was "tmp = dev_get(tname);" */
|
||||
if (tmp) {
|
||||
memcpy(card->atmdev->esi, tmp->dev_addr, 6);
|
||||
|
||||
dev_put(tmp);
|
||||
printk("%s: ESI %pM\n", card->name, card->atmdev->esi);
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -32,11 +32,23 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/pid_namespace.h>
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <linux/cn_proc.h>
|
||||
|
||||
#define CN_PROC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event))
|
||||
/*
|
||||
* Size of a cn_msg followed by a proc_event structure. Since the
|
||||
* sizeof struct cn_msg is a multiple of 4 bytes, but not 8 bytes, we
|
||||
* add one 4-byte word to the size here, and then start the actual
|
||||
* cn_msg structure 4 bytes into the stack buffer. The result is that
|
||||
* the immediately following proc_event structure is aligned to 8 bytes.
|
||||
*/
|
||||
#define CN_PROC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event) + 4)
|
||||
|
||||
/* See comment above; we test our assumption about sizeof struct cn_msg here. */
|
||||
static inline struct cn_msg *buffer_to_cn_msg(__u8 *buffer)
|
||||
{
|
||||
BUILD_BUG_ON(sizeof(struct cn_msg) != 20);
|
||||
return (struct cn_msg *)(buffer + 4);
|
||||
}
|
||||
|
||||
static atomic_t proc_event_num_listeners = ATOMIC_INIT(0);
|
||||
static struct cb_id cn_proc_event_id = { CN_IDX_PROC, CN_VAL_PROC };
|
||||
@@ -56,19 +68,19 @@ void proc_fork_connector(struct task_struct *task)
|
||||
{
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
struct timespec ts;
|
||||
struct task_struct *parent;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_FORK;
|
||||
rcu_read_lock();
|
||||
parent = rcu_dereference(task->real_parent);
|
||||
@@ -91,17 +103,17 @@ void proc_exec_connector(struct task_struct *task)
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
struct timespec ts;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_EXEC;
|
||||
ev->event_data.exec.process_pid = task->pid;
|
||||
ev->event_data.exec.process_tgid = task->tgid;
|
||||
@@ -117,14 +129,14 @@ void proc_id_connector(struct task_struct *task, int which_id)
|
||||
{
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
struct timespec ts;
|
||||
const struct cred *cred;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
ev->what = which_id;
|
||||
@@ -145,7 +157,7 @@ void proc_id_connector(struct task_struct *task, int which_id)
|
||||
rcu_read_unlock();
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
|
||||
memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
|
||||
msg->ack = 0; /* not used */
|
||||
@@ -159,17 +171,17 @@ void proc_sid_connector(struct task_struct *task)
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
struct timespec ts;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_SID;
|
||||
ev->event_data.sid.process_pid = task->pid;
|
||||
ev->event_data.sid.process_tgid = task->tgid;
|
||||
@@ -186,17 +198,17 @@ void proc_ptrace_connector(struct task_struct *task, int ptrace_id)
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
struct timespec ts;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_PTRACE;
|
||||
ev->event_data.ptrace.process_pid = task->pid;
|
||||
ev->event_data.ptrace.process_tgid = task->tgid;
|
||||
@@ -221,17 +233,17 @@ void proc_comm_connector(struct task_struct *task)
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
struct timespec ts;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_COMM;
|
||||
ev->event_data.comm.process_pid = task->pid;
|
||||
ev->event_data.comm.process_tgid = task->tgid;
|
||||
@@ -248,18 +260,18 @@ void proc_coredump_connector(struct task_struct *task)
|
||||
{
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
struct timespec ts;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_COREDUMP;
|
||||
ev->event_data.coredump.process_pid = task->pid;
|
||||
ev->event_data.coredump.process_tgid = task->tgid;
|
||||
@@ -275,18 +287,18 @@ void proc_exit_connector(struct task_struct *task)
|
||||
{
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
struct timespec ts;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_EXIT;
|
||||
ev->event_data.exit.process_pid = task->pid;
|
||||
ev->event_data.exit.process_tgid = task->tgid;
|
||||
@@ -312,18 +324,18 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
|
||||
{
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
__u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
|
||||
struct timespec ts;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
||||
msg = (struct cn_msg *)buffer;
|
||||
msg = buffer_to_cn_msg(buffer);
|
||||
ev = (struct proc_event *)msg->data;
|
||||
memset(&ev->event_data, 0, sizeof(ev->event_data));
|
||||
msg->seq = rcvd_seq;
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->cpu = -1;
|
||||
ev->what = PROC_EVENT_NONE;
|
||||
ev->event_data.ack.err = err;
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
* Authors: Christian König
|
||||
*/
|
||||
#include <linux/hdmi.h>
|
||||
#include <linux/gcd.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/radeon_drm.h>
|
||||
#include "radeon.h"
|
||||
@@ -57,35 +58,57 @@ enum r600_hdmi_iec_status_bits {
|
||||
static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = {
|
||||
/* 32kHz 44.1kHz 48kHz */
|
||||
/* Clock N CTS N CTS N CTS */
|
||||
{ 25175, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */
|
||||
{ 25175, 4096, 25175, 28224, 125875, 6144, 25175 }, /* 25,20/1.001 MHz */
|
||||
{ 25200, 4096, 25200, 6272, 28000, 6144, 25200 }, /* 25.20 MHz */
|
||||
{ 27000, 4096, 27000, 6272, 30000, 6144, 27000 }, /* 27.00 MHz */
|
||||
{ 27027, 4096, 27027, 6272, 30030, 6144, 27027 }, /* 27.00*1.001 MHz */
|
||||
{ 54000, 4096, 54000, 6272, 60000, 6144, 54000 }, /* 54.00 MHz */
|
||||
{ 54054, 4096, 54054, 6272, 60060, 6144, 54054 }, /* 54.00*1.001 MHz */
|
||||
{ 74176, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */
|
||||
{ 74176, 4096, 74176, 5733, 75335, 6144, 74176 }, /* 74.25/1.001 MHz */
|
||||
{ 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */
|
||||
{ 148352, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */
|
||||
{ 148352, 4096, 148352, 5733, 150670, 6144, 148352 }, /* 148.50/1.001 MHz */
|
||||
{ 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */
|
||||
{ 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */
|
||||
};
|
||||
|
||||
/*
|
||||
* calculate CTS value if it's not found in the table
|
||||
*/
|
||||
static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int N, int freq)
|
||||
{
|
||||
u64 n;
|
||||
u32 d;
|
||||
|
||||
if (*CTS == 0) {
|
||||
n = (u64)clock * (u64)N * 1000ULL;
|
||||
d = 128 * freq;
|
||||
do_div(n, d);
|
||||
*CTS = n;
|
||||
}
|
||||
DRM_DEBUG("Using ACR timing N=%d CTS=%d for frequency %d\n",
|
||||
N, *CTS, freq);
|
||||
/*
|
||||
* calculate CTS and N values if they are not found in the table
|
||||
*/
|
||||
static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq)
|
||||
{
|
||||
int n, cts;
|
||||
unsigned long div, mul;
|
||||
|
||||
/* Safe, but overly large values */
|
||||
n = 128 * freq;
|
||||
cts = clock * 1000;
|
||||
|
||||
/* Smallest valid fraction */
|
||||
div = gcd(n, cts);
|
||||
|
||||
n /= div;
|
||||
cts /= div;
|
||||
|
||||
/*
|
||||
* The optimal N is 128*freq/1000. Calculate the closest larger
|
||||
* value that doesn't truncate any bits.
|
||||
*/
|
||||
mul = ((128*freq/1000) + (n-1))/n;
|
||||
|
||||
n *= mul;
|
||||
cts *= mul;
|
||||
|
||||
/* Check that we are in spec (not always possible) */
|
||||
if (n < (128*freq/1500))
|
||||
printk(KERN_WARNING "Calculated ACR N value is too small. You may experience audio problems.\n");
|
||||
if (n > (128*freq/300))
|
||||
printk(KERN_WARNING "Calculated ACR N value is too large. You may experience audio problems.\n");
|
||||
|
||||
*N = n;
|
||||
*CTS = cts;
|
||||
|
||||
DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n",
|
||||
*N, *CTS, freq);
|
||||
}
|
||||
|
||||
struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock)
|
||||
@@ -93,15 +116,16 @@ struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock)
|
||||
struct radeon_hdmi_acr res;
|
||||
u8 i;
|
||||
|
||||
for (i = 0; r600_hdmi_predefined_acr[i].clock != clock &&
|
||||
r600_hdmi_predefined_acr[i].clock != 0; i++)
|
||||
;
|
||||
res = r600_hdmi_predefined_acr[i];
|
||||
/* Precalculated values for common clocks */
|
||||
for (i = 0; i < ARRAY_SIZE(r600_hdmi_predefined_acr); i++) {
|
||||
if (r600_hdmi_predefined_acr[i].clock == clock)
|
||||
return r600_hdmi_predefined_acr[i];
|
||||
}
|
||||
|
||||
/* In case some CTS are missing */
|
||||
r600_hdmi_calc_cts(clock, &res.cts_32khz, res.n_32khz, 32000);
|
||||
r600_hdmi_calc_cts(clock, &res.cts_44_1khz, res.n_44_1khz, 44100);
|
||||
r600_hdmi_calc_cts(clock, &res.cts_48khz, res.n_48khz, 48000);
|
||||
/* And odd clocks get manually calculated */
|
||||
r600_hdmi_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
|
||||
r600_hdmi_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
|
||||
r600_hdmi_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#define DFP_RDESC_ORIG_SIZE 97
|
||||
#define FV_RDESC_ORIG_SIZE 130
|
||||
#define MOMO_RDESC_ORIG_SIZE 87
|
||||
#define MOMO2_RDESC_ORIG_SIZE 87
|
||||
|
||||
/* Fixed report descriptors for Logitech Driving Force (and Pro)
|
||||
* wheel controllers
|
||||
@@ -284,6 +285,54 @@ static __u8 momo_rdesc_fixed[] = {
|
||||
0xC0 /* End Collection */
|
||||
};
|
||||
|
||||
static __u8 momo2_rdesc_fixed[] = {
|
||||
0x05, 0x01, /* Usage Page (Desktop), */
|
||||
0x09, 0x04, /* Usage (Joystik), */
|
||||
0xA1, 0x01, /* Collection (Application), */
|
||||
0xA1, 0x02, /* Collection (Logical), */
|
||||
0x95, 0x01, /* Report Count (1), */
|
||||
0x75, 0x0A, /* Report Size (10), */
|
||||
0x15, 0x00, /* Logical Minimum (0), */
|
||||
0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
|
||||
0x35, 0x00, /* Physical Minimum (0), */
|
||||
0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
|
||||
0x09, 0x30, /* Usage (X), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x95, 0x0A, /* Report Count (10), */
|
||||
0x75, 0x01, /* Report Size (1), */
|
||||
0x25, 0x01, /* Logical Maximum (1), */
|
||||
0x45, 0x01, /* Physical Maximum (1), */
|
||||
0x05, 0x09, /* Usage Page (Button), */
|
||||
0x19, 0x01, /* Usage Minimum (01h), */
|
||||
0x29, 0x0A, /* Usage Maximum (0Ah), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
|
||||
0x09, 0x00, /* Usage (00h), */
|
||||
0x95, 0x04, /* Report Count (4), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x95, 0x01, /* Report Count (1), */
|
||||
0x75, 0x08, /* Report Size (8), */
|
||||
0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
0x09, 0x01, /* Usage (01h), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x05, 0x01, /* Usage Page (Desktop), */
|
||||
0x09, 0x31, /* Usage (Y), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x09, 0x32, /* Usage (Z), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
|
||||
0x09, 0x00, /* Usage (00h), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0xC0, /* End Collection, */
|
||||
0xA1, 0x02, /* Collection (Logical), */
|
||||
0x09, 0x02, /* Usage (02h), */
|
||||
0x95, 0x07, /* Report Count (7), */
|
||||
0x91, 0x02, /* Output (Variable), */
|
||||
0xC0, /* End Collection, */
|
||||
0xC0 /* End Collection */
|
||||
};
|
||||
|
||||
/*
|
||||
* Certain Logitech keyboards send in report #3 keys which are far
|
||||
* above the logical maximum described in descriptor. This extends
|
||||
@@ -343,6 +392,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
}
|
||||
break;
|
||||
|
||||
case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
|
||||
if (*rsize == MOMO2_RDESC_ORIG_SIZE) {
|
||||
hid_info(hdev,
|
||||
"fixing up Logitech Momo Racing Force (Black) report descriptor\n");
|
||||
rdesc = momo2_rdesc_fixed;
|
||||
*rsize = sizeof(momo2_rdesc_fixed);
|
||||
}
|
||||
break;
|
||||
|
||||
case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
|
||||
if (*rsize == FV_RDESC_ORIG_SIZE) {
|
||||
hid_info(hdev,
|
||||
|
||||
@@ -782,7 +782,11 @@ static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain,
|
||||
int offset;
|
||||
|
||||
BUG_ON(!domain->pgd);
|
||||
BUG_ON(addr_width < BITS_PER_LONG && pfn >> addr_width);
|
||||
|
||||
if (addr_width < BITS_PER_LONG && pfn >> addr_width)
|
||||
/* Address beyond IOMMU's addressing capabilities. */
|
||||
return NULL;
|
||||
|
||||
parent = domain->pgd;
|
||||
|
||||
while (level > 0) {
|
||||
|
||||
@@ -525,12 +525,13 @@ static int __init intel_irq_remapping_supported(void)
|
||||
if (disable_irq_remap)
|
||||
return 0;
|
||||
if (irq_remap_broken) {
|
||||
WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
|
||||
"This system BIOS has enabled interrupt remapping\n"
|
||||
"on a chipset that contains an erratum making that\n"
|
||||
"feature unstable. To maintain system stability\n"
|
||||
"interrupt remapping is being disabled. Please\n"
|
||||
"contact your BIOS vendor for an update\n");
|
||||
printk(KERN_WARNING
|
||||
"This system BIOS has enabled interrupt remapping\n"
|
||||
"on a chipset that contains an erratum making that\n"
|
||||
"feature unstable. To maintain system stability\n"
|
||||
"interrupt remapping is being disabled. Please\n"
|
||||
"contact your BIOS vendor for an update\n");
|
||||
add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
||||
disable_irq_remap = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1083,8 +1083,10 @@ isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp)
|
||||
spin_unlock_irqrestore(&card->isdnloop_lock, flags);
|
||||
return -ENOMEM;
|
||||
}
|
||||
for (i = 0; i < 3; i++)
|
||||
strcpy(card->s0num[i], sdef.num[i]);
|
||||
for (i = 0; i < 3; i++) {
|
||||
strlcpy(card->s0num[i], sdef.num[i],
|
||||
sizeof(card->s0num[0]));
|
||||
}
|
||||
break;
|
||||
case ISDN_PTYPE_1TR6:
|
||||
if (isdnloop_fake(card, "DRV1.04TC-1TR6-CAPI-CNS-BASIS-29.11.95",
|
||||
@@ -1097,7 +1099,7 @@ isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp)
|
||||
spin_unlock_irqrestore(&card->isdnloop_lock, flags);
|
||||
return -ENOMEM;
|
||||
}
|
||||
strcpy(card->s0num[0], sdef.num[0]);
|
||||
strlcpy(card->s0num[0], sdef.num[0], sizeof(card->s0num[0]));
|
||||
card->s0num[1][0] = '\0';
|
||||
card->s0num[2][0] = '\0';
|
||||
break;
|
||||
|
||||
@@ -784,7 +784,7 @@ static int mmc_blk_cmd_error(struct request *req, const char *name, int error,
|
||||
* Otherwise we don't understand what happened, so abort.
|
||||
*/
|
||||
static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
|
||||
struct mmc_blk_request *brq, int *ecc_err)
|
||||
struct mmc_blk_request *brq, int *ecc_err, int *gen_err)
|
||||
{
|
||||
bool prev_cmd_status_valid = true;
|
||||
u32 status, stop_status = 0;
|
||||
@@ -822,6 +822,16 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
|
||||
(brq->cmd.resp[0] & R1_CARD_ECC_FAILED))
|
||||
*ecc_err = 1;
|
||||
|
||||
/* Flag General errors */
|
||||
if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ)
|
||||
if ((status & R1_ERROR) ||
|
||||
(brq->stop.resp[0] & R1_ERROR)) {
|
||||
pr_err("%s: %s: general error sending stop or status command, stop cmd response %#x, card status %#x\n",
|
||||
req->rq_disk->disk_name, __func__,
|
||||
brq->stop.resp[0], status);
|
||||
*gen_err = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the current card state. If it is in some data transfer
|
||||
* mode, tell it to stop (and hopefully transition back to TRAN.)
|
||||
@@ -841,6 +851,13 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
|
||||
return ERR_ABORT;
|
||||
if (stop_status & R1_CARD_ECC_FAILED)
|
||||
*ecc_err = 1;
|
||||
if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ)
|
||||
if (stop_status & R1_ERROR) {
|
||||
pr_err("%s: %s: general error sending stop command, stop cmd response %#x\n",
|
||||
req->rq_disk->disk_name, __func__,
|
||||
stop_status);
|
||||
*gen_err = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for set block count errors */
|
||||
@@ -1084,7 +1101,7 @@ static int mmc_blk_err_check(struct mmc_card *card,
|
||||
mmc_active);
|
||||
struct mmc_blk_request *brq = &mq_mrq->brq;
|
||||
struct request *req = mq_mrq->req;
|
||||
int ecc_err = 0;
|
||||
int ecc_err = 0, gen_err = 0;
|
||||
|
||||
/*
|
||||
* sbc.error indicates a problem with the set block count
|
||||
@@ -1098,7 +1115,7 @@ static int mmc_blk_err_check(struct mmc_card *card,
|
||||
*/
|
||||
if (brq->sbc.error || brq->cmd.error || brq->stop.error ||
|
||||
brq->data.error) {
|
||||
switch (mmc_blk_cmd_recovery(card, req, brq, &ecc_err)) {
|
||||
switch (mmc_blk_cmd_recovery(card, req, brq, &ecc_err, &gen_err)) {
|
||||
case ERR_RETRY:
|
||||
return MMC_BLK_RETRY;
|
||||
case ERR_ABORT:
|
||||
@@ -1130,6 +1147,14 @@ static int mmc_blk_err_check(struct mmc_card *card,
|
||||
u32 status;
|
||||
unsigned long timeout;
|
||||
|
||||
/* Check stop command response */
|
||||
if (brq->stop.resp[0] & R1_ERROR) {
|
||||
pr_err("%s: %s: general error sending stop command, stop cmd response %#x\n",
|
||||
req->rq_disk->disk_name, __func__,
|
||||
brq->stop.resp[0]);
|
||||
gen_err = 1;
|
||||
}
|
||||
|
||||
timeout = jiffies + msecs_to_jiffies(MMC_BLK_TIMEOUT_MS);
|
||||
do {
|
||||
int err = get_card_status(card, &status, 5);
|
||||
@@ -1139,6 +1164,13 @@ static int mmc_blk_err_check(struct mmc_card *card,
|
||||
return MMC_BLK_CMD_ERR;
|
||||
}
|
||||
|
||||
if (status & R1_ERROR) {
|
||||
pr_err("%s: %s: general error sending status command, card status %#x\n",
|
||||
req->rq_disk->disk_name, __func__,
|
||||
status);
|
||||
gen_err = 1;
|
||||
}
|
||||
|
||||
/* Timeout if the device never becomes ready for data
|
||||
* and never leaves the program state.
|
||||
*/
|
||||
@@ -1158,6 +1190,13 @@ static int mmc_blk_err_check(struct mmc_card *card,
|
||||
(R1_CURRENT_STATE(status) == R1_STATE_PRG));
|
||||
}
|
||||
|
||||
/* if general error occurs, retry the write operation. */
|
||||
if (gen_err) {
|
||||
pr_warn("%s: retrying write for general error\n",
|
||||
req->rq_disk->disk_name);
|
||||
return MMC_BLK_RETRY;
|
||||
}
|
||||
|
||||
if (brq->data.error) {
|
||||
pr_err("%s: error %d transferring data, sector %u, nr %u, cmd response %#x, card status %#x\n",
|
||||
req->rq_disk->disk_name, brq->data.error,
|
||||
|
||||
@@ -537,8 +537,9 @@ static ssize_t bonding_store_arp_interval(struct device *d,
|
||||
goto out;
|
||||
}
|
||||
if (bond->params.mode == BOND_MODE_ALB ||
|
||||
bond->params.mode == BOND_MODE_TLB) {
|
||||
pr_info("%s: ARP monitoring cannot be used with ALB/TLB. Only MII monitoring is supported on %s.\n",
|
||||
bond->params.mode == BOND_MODE_TLB ||
|
||||
bond->params.mode == BOND_MODE_8023AD) {
|
||||
pr_info("%s: ARP monitoring cannot be used with ALB/TLB/802.3ad. Only MII monitoring is supported on %s.\n",
|
||||
bond->dev->name, bond->dev->name);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
@@ -696,6 +697,8 @@ static ssize_t bonding_store_downdelay(struct device *d,
|
||||
int new_value, ret = count;
|
||||
struct bonding *bond = to_bond(d);
|
||||
|
||||
if (!rtnl_trylock())
|
||||
return restart_syscall();
|
||||
if (!(bond->params.miimon)) {
|
||||
pr_err("%s: Unable to set down delay as MII monitoring is disabled\n",
|
||||
bond->dev->name);
|
||||
@@ -729,6 +732,7 @@ static ssize_t bonding_store_downdelay(struct device *d,
|
||||
}
|
||||
|
||||
out:
|
||||
rtnl_unlock();
|
||||
return ret;
|
||||
}
|
||||
static DEVICE_ATTR(downdelay, S_IRUGO | S_IWUSR,
|
||||
@@ -751,6 +755,8 @@ static ssize_t bonding_store_updelay(struct device *d,
|
||||
int new_value, ret = count;
|
||||
struct bonding *bond = to_bond(d);
|
||||
|
||||
if (!rtnl_trylock())
|
||||
return restart_syscall();
|
||||
if (!(bond->params.miimon)) {
|
||||
pr_err("%s: Unable to set up delay as MII monitoring is disabled\n",
|
||||
bond->dev->name);
|
||||
@@ -784,6 +790,7 @@ static ssize_t bonding_store_updelay(struct device *d,
|
||||
}
|
||||
|
||||
out:
|
||||
rtnl_unlock();
|
||||
return ret;
|
||||
}
|
||||
static DEVICE_ATTR(updelay, S_IRUGO | S_IWUSR,
|
||||
|
||||
@@ -264,6 +264,10 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
|
||||
mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH)
|
||||
mdev->port_cnt++;
|
||||
|
||||
/* Initialize time stamp mechanism */
|
||||
if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
|
||||
mlx4_en_init_timestamp(mdev);
|
||||
|
||||
mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH) {
|
||||
if (!dev->caps.comp_pool) {
|
||||
mdev->profile.prof[i].rx_ring_num =
|
||||
@@ -301,10 +305,6 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
|
||||
mdev->pndev[i] = NULL;
|
||||
}
|
||||
|
||||
/* Initialize time stamp mechanism */
|
||||
if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
|
||||
mlx4_en_init_timestamp(mdev);
|
||||
|
||||
return mdev;
|
||||
|
||||
err_mr:
|
||||
|
||||
@@ -678,9 +678,6 @@ static void cp_tx (struct cp_private *cp)
|
||||
le32_to_cpu(txd->opts1) & 0xffff,
|
||||
PCI_DMA_TODEVICE);
|
||||
|
||||
bytes_compl += skb->len;
|
||||
pkts_compl++;
|
||||
|
||||
if (status & LastFrag) {
|
||||
if (status & (TxError | TxFIFOUnder)) {
|
||||
netif_dbg(cp, tx_err, cp->dev,
|
||||
@@ -702,6 +699,8 @@ static void cp_tx (struct cp_private *cp)
|
||||
netif_dbg(cp, tx_done, cp->dev,
|
||||
"tx done, slot %d\n", tx_tail);
|
||||
}
|
||||
bytes_compl += skb->len;
|
||||
pkts_compl++;
|
||||
dev_kfree_skb_irq(skb);
|
||||
}
|
||||
|
||||
|
||||
@@ -3461,6 +3461,11 @@ static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_writephy(tp, 0x14, 0x9065);
|
||||
rtl_writephy(tp, 0x14, 0x1065);
|
||||
|
||||
/* Check ALDPS bit, disable it if enabled */
|
||||
rtl_writephy(tp, 0x1f, 0x0a43);
|
||||
if (rtl_readphy(tp, 0x10) & 0x0004)
|
||||
rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0004);
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
}
|
||||
|
||||
|
||||
@@ -661,6 +661,7 @@ 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);
|
||||
struct sk_buff *skb;
|
||||
struct macvlan_dev *vlan;
|
||||
unsigned long len = total_len;
|
||||
@@ -703,6 +704,8 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
||||
|
||||
if (m && m->msg_control && sock_flag(&q->sk, SOCK_ZEROCOPY)) {
|
||||
copylen = vnet_hdr.hdr_len ? vnet_hdr.hdr_len : GOODCOPY_LEN;
|
||||
if (copylen > good_linear)
|
||||
copylen = good_linear;
|
||||
linear = copylen;
|
||||
if (iov_pages(iv, vnet_hdr_len + copylen, count)
|
||||
<= MAX_SKB_FRAGS)
|
||||
@@ -711,7 +714,10 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
||||
|
||||
if (!zerocopy) {
|
||||
copylen = len;
|
||||
linear = vnet_hdr.hdr_len;
|
||||
if (vnet_hdr.hdr_len > good_linear)
|
||||
linear = good_linear;
|
||||
else
|
||||
linear = vnet_hdr.hdr_len;
|
||||
}
|
||||
|
||||
skb = macvtap_alloc_skb(&q->sk, NET_IP_ALIGN, copylen,
|
||||
|
||||
@@ -1217,6 +1217,8 @@ static int team_user_linkup_option_get(struct team *team,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __team_carrier_check(struct team *team);
|
||||
|
||||
static int team_user_linkup_option_set(struct team *team,
|
||||
struct team_gsetter_ctx *ctx)
|
||||
{
|
||||
@@ -1224,6 +1226,7 @@ static int team_user_linkup_option_set(struct team *team,
|
||||
|
||||
port->user.linkup = ctx->data.bool_val;
|
||||
team_refresh_port_linkup(port);
|
||||
__team_carrier_check(port->team);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1243,6 +1246,7 @@ static int team_user_linkup_en_option_set(struct team *team,
|
||||
|
||||
port->user.linkup_enabled = ctx->data.bool_val;
|
||||
team_refresh_port_linkup(port);
|
||||
__team_carrier_check(port->team);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1069,6 +1069,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
struct sk_buff *skb;
|
||||
size_t len = total_len, align = NET_SKB_PAD, linear;
|
||||
struct virtio_net_hdr gso = { 0 };
|
||||
int good_linear;
|
||||
int offset = 0;
|
||||
int copylen;
|
||||
bool zerocopy = false;
|
||||
@@ -1109,12 +1110,16 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
good_linear = SKB_MAX_HEAD(align);
|
||||
|
||||
if (msg_control) {
|
||||
/* There are 256 bytes to be copied in skb, so there is
|
||||
* enough room for skb expand head in case it is used.
|
||||
* The rest of the buffer is mapped from userspace.
|
||||
*/
|
||||
copylen = gso.hdr_len ? gso.hdr_len : GOODCOPY_LEN;
|
||||
if (copylen > good_linear)
|
||||
copylen = good_linear;
|
||||
linear = copylen;
|
||||
if (iov_pages(iv, offset + copylen, count) <= MAX_SKB_FRAGS)
|
||||
zerocopy = true;
|
||||
@@ -1122,7 +1127,10 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
|
||||
if (!zerocopy) {
|
||||
copylen = len;
|
||||
linear = gso.hdr_len;
|
||||
if (gso.hdr_len > good_linear)
|
||||
linear = good_linear;
|
||||
else
|
||||
linear = gso.hdr_len;
|
||||
}
|
||||
|
||||
skb = tun_alloc_skb(tfile, align, copylen, linear, noblock);
|
||||
|
||||
@@ -203,9 +203,6 @@ static void intr_complete (struct urb *urb)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!netif_running (dev->net))
|
||||
return;
|
||||
|
||||
status = usb_submit_urb (urb, GFP_ATOMIC);
|
||||
if (status != 0)
|
||||
netif_err(dev, timer, dev->net,
|
||||
|
||||
@@ -625,15 +625,15 @@ static int kyrofb_ioctl(struct fb_info *info,
|
||||
}
|
||||
break;
|
||||
case KYRO_IOCTL_UVSTRIDE:
|
||||
if (copy_to_user(argp, &deviceInfo.ulOverlayUVStride, sizeof(unsigned long)))
|
||||
if (copy_to_user(argp, &deviceInfo.ulOverlayUVStride, sizeof(deviceInfo.ulOverlayUVStride)))
|
||||
return -EFAULT;
|
||||
break;
|
||||
case KYRO_IOCTL_STRIDE:
|
||||
if (copy_to_user(argp, &deviceInfo.ulOverlayStride, sizeof(unsigned long)))
|
||||
if (copy_to_user(argp, &deviceInfo.ulOverlayStride, sizeof(deviceInfo.ulOverlayStride)))
|
||||
return -EFAULT;
|
||||
break;
|
||||
case KYRO_IOCTL_OVERLAY_OFFSET:
|
||||
if (copy_to_user(argp, &deviceInfo.ulOverlayOffset, sizeof(unsigned long)))
|
||||
if (copy_to_user(argp, &deviceInfo.ulOverlayOffset, sizeof(deviceInfo.ulOverlayOffset)))
|
||||
return -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user