diff options
Diffstat (limited to 'drivers')
170 files changed, 1813 insertions, 1044 deletions
diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c index a1d177d58254..21932d640a41 100644 --- a/drivers/acpi/acpica/exconfig.c +++ b/drivers/acpi/acpica/exconfig.c | |||
| @@ -108,7 +108,9 @@ acpi_ex_add_table(u32 table_index, | |||
| 108 | 108 | ||
| 109 | /* Add the table to the namespace */ | 109 | /* Add the table to the namespace */ |
| 110 | 110 | ||
| 111 | acpi_ex_exit_interpreter(); | ||
| 111 | status = acpi_ns_load_table(table_index, parent_node); | 112 | status = acpi_ns_load_table(table_index, parent_node); |
| 113 | acpi_ex_enter_interpreter(); | ||
| 112 | if (ACPI_FAILURE(status)) { | 114 | if (ACPI_FAILURE(status)) { |
| 113 | acpi_ut_remove_reference(obj_desc); | 115 | acpi_ut_remove_reference(obj_desc); |
| 114 | *ddb_handle = NULL; | 116 | *ddb_handle = NULL; |
diff --git a/drivers/acpi/acpica/nsparse.c b/drivers/acpi/acpica/nsparse.c index f631a47724f0..1783cd7e1446 100644 --- a/drivers/acpi/acpica/nsparse.c +++ b/drivers/acpi/acpica/nsparse.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include "acparser.h" | 47 | #include "acparser.h" |
| 48 | #include "acdispat.h" | 48 | #include "acdispat.h" |
| 49 | #include "actables.h" | 49 | #include "actables.h" |
| 50 | #include "acinterp.h" | ||
| 50 | 51 | ||
| 51 | #define _COMPONENT ACPI_NAMESPACE | 52 | #define _COMPONENT ACPI_NAMESPACE |
| 52 | ACPI_MODULE_NAME("nsparse") | 53 | ACPI_MODULE_NAME("nsparse") |
| @@ -170,6 +171,8 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node) | |||
| 170 | 171 | ||
| 171 | ACPI_FUNCTION_TRACE(ns_parse_table); | 172 | ACPI_FUNCTION_TRACE(ns_parse_table); |
| 172 | 173 | ||
| 174 | acpi_ex_enter_interpreter(); | ||
| 175 | |||
| 173 | /* | 176 | /* |
| 174 | * AML Parse, pass 1 | 177 | * AML Parse, pass 1 |
| 175 | * | 178 | * |
| @@ -185,7 +188,7 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node) | |||
| 185 | status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1, | 188 | status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1, |
| 186 | table_index, start_node); | 189 | table_index, start_node); |
| 187 | if (ACPI_FAILURE(status)) { | 190 | if (ACPI_FAILURE(status)) { |
| 188 | return_ACPI_STATUS(status); | 191 | goto error_exit; |
| 189 | } | 192 | } |
| 190 | 193 | ||
| 191 | /* | 194 | /* |
| @@ -201,8 +204,10 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node) | |||
| 201 | status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS2, | 204 | status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS2, |
| 202 | table_index, start_node); | 205 | table_index, start_node); |
| 203 | if (ACPI_FAILURE(status)) { | 206 | if (ACPI_FAILURE(status)) { |
| 204 | return_ACPI_STATUS(status); | 207 | goto error_exit; |
| 205 | } | 208 | } |
| 206 | 209 | ||
| 210 | error_exit: | ||
| 211 | acpi_ex_exit_interpreter(); | ||
| 207 | return_ACPI_STATUS(status); | 212 | return_ACPI_STATUS(status); |
| 208 | } | 213 | } |
diff --git a/drivers/ata/ahci_seattle.c b/drivers/ata/ahci_seattle.c index 6e702ab57220..1d31c0c0fc20 100644 --- a/drivers/ata/ahci_seattle.c +++ b/drivers/ata/ahci_seattle.c | |||
| @@ -137,7 +137,7 @@ static const struct ata_port_info *ahci_seattle_get_port_info( | |||
| 137 | u32 val; | 137 | u32 val; |
| 138 | 138 | ||
| 139 | plat_data = devm_kzalloc(dev, sizeof(*plat_data), GFP_KERNEL); | 139 | plat_data = devm_kzalloc(dev, sizeof(*plat_data), GFP_KERNEL); |
| 140 | if (IS_ERR(plat_data)) | 140 | if (!plat_data) |
| 141 | return &ahci_port_info; | 141 | return &ahci_port_info; |
| 142 | 142 | ||
| 143 | plat_data->sgpio_ctrl = devm_ioremap_resource(dev, | 143 | plat_data->sgpio_ctrl = devm_ioremap_resource(dev, |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 61dc7a99e89a..c6f017458958 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -606,7 +606,7 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
| 606 | ata_scsi_port_error_handler(host, ap); | 606 | ata_scsi_port_error_handler(host, ap); |
| 607 | 607 | ||
| 608 | /* finish or retry handled scmd's and clean up */ | 608 | /* finish or retry handled scmd's and clean up */ |
| 609 | WARN_ON(host->host_failed || !list_empty(&eh_work_q)); | 609 | WARN_ON(!list_empty(&eh_work_q)); |
| 610 | 610 | ||
| 611 | DPRINTK("EXIT\n"); | 611 | DPRINTK("EXIT\n"); |
| 612 | } | 612 | } |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index bd74ee555278..745489a1c86a 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -986,7 +986,7 @@ static inline void mv_write_cached_reg(void __iomem *addr, u32 *old, u32 new) | |||
| 986 | * Looks like a lot of fuss, but it avoids an unnecessary | 986 | * Looks like a lot of fuss, but it avoids an unnecessary |
| 987 | * +1 usec read-after-write delay for unaffected registers. | 987 | * +1 usec read-after-write delay for unaffected registers. |
| 988 | */ | 988 | */ |
| 989 | laddr = (long)addr & 0xffff; | 989 | laddr = (unsigned long)addr & 0xffff; |
| 990 | if (laddr >= 0x300 && laddr <= 0x33c) { | 990 | if (laddr >= 0x300 && laddr <= 0x33c) { |
| 991 | laddr &= 0x000f; | 991 | laddr &= 0x000f; |
| 992 | if (laddr == 0x4 || laddr == 0xc) { | 992 | if (laddr == 0x4 || laddr == 0xc) { |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index d597e432e195..ab19adb07a12 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -1750,7 +1750,7 @@ aoecmd_init(void) | |||
| 1750 | int ret; | 1750 | int ret; |
| 1751 | 1751 | ||
| 1752 | /* get_zeroed_page returns page with ref count 1 */ | 1752 | /* get_zeroed_page returns page with ref count 1 */ |
| 1753 | p = (void *) get_zeroed_page(GFP_KERNEL | __GFP_REPEAT); | 1753 | p = (void *) get_zeroed_page(GFP_KERNEL); |
| 1754 | if (!p) | 1754 | if (!p) |
| 1755 | return -ENOMEM; | 1755 | return -ENOMEM; |
| 1756 | empty_page = virt_to_page(p); | 1756 | empty_page = virt_to_page(p); |
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index 15d06fcf0b50..b02f9c606e0b 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c | |||
| @@ -56,11 +56,21 @@ static struct cb_id cn_proc_event_id = { CN_IDX_PROC, CN_VAL_PROC }; | |||
| 56 | /* proc_event_counts is used as the sequence number of the netlink message */ | 56 | /* proc_event_counts is used as the sequence number of the netlink message */ |
| 57 | static DEFINE_PER_CPU(__u32, proc_event_counts) = { 0 }; | 57 | static DEFINE_PER_CPU(__u32, proc_event_counts) = { 0 }; |
| 58 | 58 | ||
| 59 | static inline void get_seq(__u32 *ts, int *cpu) | 59 | static inline void send_msg(struct cn_msg *msg) |
| 60 | { | 60 | { |
| 61 | preempt_disable(); | 61 | preempt_disable(); |
| 62 | *ts = __this_cpu_inc_return(proc_event_counts) - 1; | 62 | |
| 63 | *cpu = smp_processor_id(); | 63 | msg->seq = __this_cpu_inc_return(proc_event_counts) - 1; |
| 64 | ((struct proc_event *)msg->data)->cpu = smp_processor_id(); | ||
| 65 | |||
| 66 | /* | ||
| 67 | * Preemption remains disabled during send to ensure the messages are | ||
| 68 | * ordered according to their sequence numbers. | ||
| 69 | * | ||
| 70 | * If cn_netlink_send() fails, the data is not sent. | ||
| 71 | */ | ||
| 72 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_NOWAIT); | ||
| 73 | |||
| 64 | preempt_enable(); | 74 | preempt_enable(); |
| 65 | } | 75 | } |
| 66 | 76 | ||
| @@ -77,7 +87,6 @@ void proc_fork_connector(struct task_struct *task) | |||
| 77 | msg = buffer_to_cn_msg(buffer); | 87 | msg = buffer_to_cn_msg(buffer); |
| 78 | ev = (struct proc_event *)msg->data; | 88 | ev = (struct proc_event *)msg->data; |
| 79 | memset(&ev->event_data, 0, sizeof(ev->event_data)); | 89 | memset(&ev->event_data, 0, sizeof(ev->event_data)); |
| 80 | get_seq(&msg->seq, &ev->cpu); | ||
| 81 | ev->timestamp_ns = ktime_get_ns(); | 90 | ev->timestamp_ns = ktime_get_ns(); |
| 82 | ev->what = PROC_EVENT_FORK; | 91 | ev->what = PROC_EVENT_FORK; |
| 83 | rcu_read_lock(); | 92 | rcu_read_lock(); |
| @@ -92,8 +101,7 @@ void proc_fork_connector(struct task_struct *task) | |||
| 92 | msg->ack = 0; /* not used */ | 101 | msg->ack = 0; /* not used */ |
| 93 | msg->len = sizeof(*ev); | 102 | msg->len = sizeof(*ev); |
| 94 | msg->flags = 0; /* not used */ | 103 | msg->flags = 0; /* not used */ |
| 95 | /* If cn_netlink_send() failed, the data is not sent */ | 104 | send_msg(msg); |
| 96 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | ||
| 97 | } | 105 | } |
| 98 | 106 | ||
| 99 | void proc_exec_connector(struct task_struct *task) | 107 | void proc_exec_connector(struct task_struct *task) |
| @@ -108,7 +116,6 @@ void proc_exec_connector(struct task_struct *task) | |||
| 108 | msg = buffer_to_cn_msg(buffer); | 116 | msg = buffer_to_cn_msg(buffer); |
| 109 | ev = (struct proc_event *)msg->data; | 117 | ev = (struct proc_event *)msg->data; |
| 110 | memset(&ev->event_data, 0, sizeof(ev->event_data)); | 118 | memset(&ev->event_data, 0, sizeof(ev->event_data)); |
| 111 | get_seq(&msg->seq, &ev->cpu); | ||
| 112 | ev->timestamp_ns = ktime_get_ns(); | 119 | ev->timestamp_ns = ktime_get_ns(); |
| 113 | ev->what = PROC_EVENT_EXEC; | 120 | ev->what = PROC_EVENT_EXEC; |
| 114 | ev->event_data.exec.process_pid = task->pid; | 121 | ev->event_data.exec.process_pid = task->pid; |
| @@ -118,7 +125,7 @@ void proc_exec_connector(struct task_struct *task) | |||
| 118 | msg->ack = 0; /* not used */ | 125 | msg->ack = 0; /* not used */ |
| 119 | msg->len = sizeof(*ev); | 126 | msg->len = sizeof(*ev); |
| 120 | msg->flags = 0; /* not used */ | 127 | msg->flags = 0; /* not used */ |
| 121 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 128 | send_msg(msg); |
| 122 | } | 129 | } |
| 123 | 130 | ||
| 124 | void proc_id_connector(struct task_struct *task, int which_id) | 131 | void proc_id_connector(struct task_struct *task, int which_id) |
| @@ -150,14 +157,13 @@ void proc_id_connector(struct task_struct *task, int which_id) | |||
| 150 | return; | 157 | return; |
| 151 | } | 158 | } |
| 152 | rcu_read_unlock(); | 159 | rcu_read_unlock(); |
| 153 | get_seq(&msg->seq, &ev->cpu); | ||
| 154 | ev->timestamp_ns = ktime_get_ns(); | 160 | ev->timestamp_ns = ktime_get_ns(); |
| 155 | 161 | ||
| 156 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | 162 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); |
| 157 | msg->ack = 0; /* not used */ | 163 | msg->ack = 0; /* not used */ |
| 158 | msg->len = sizeof(*ev); | 164 | msg->len = sizeof(*ev); |
| 159 | msg->flags = 0; /* not used */ | 165 | msg->flags = 0; /* not used */ |
| 160 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 166 | send_msg(msg); |
| 161 | } | 167 | } |
| 162 | 168 | ||
| 163 | void proc_sid_connector(struct task_struct *task) | 169 | void proc_sid_connector(struct task_struct *task) |
| @@ -172,7 +178,6 @@ void proc_sid_connector(struct task_struct *task) | |||
| 172 | msg = buffer_to_cn_msg(buffer); | 178 | msg = buffer_to_cn_msg(buffer); |
| 173 | ev = (struct proc_event *)msg->data; | 179 | ev = (struct proc_event *)msg->data; |
| 174 | memset(&ev->event_data, 0, sizeof(ev->event_data)); | 180 | memset(&ev->event_data, 0, sizeof(ev->event_data)); |
| 175 | get_seq(&msg->seq, &ev->cpu); | ||
| 176 | ev->timestamp_ns = ktime_get_ns(); | 181 | ev->timestamp_ns = ktime_get_ns(); |
| 177 | ev->what = PROC_EVENT_SID; | 182 | ev->what = PROC_EVENT_SID; |
| 178 | ev->event_data.sid.process_pid = task->pid; | 183 | ev->event_data.sid.process_pid = task->pid; |
| @@ -182,7 +187,7 @@ void proc_sid_connector(struct task_struct *task) | |||
| 182 | msg->ack = 0; /* not used */ | 187 | msg->ack = 0; /* not used */ |
| 183 | msg->len = sizeof(*ev); | 188 | msg->len = sizeof(*ev); |
| 184 | msg->flags = 0; /* not used */ | 189 | msg->flags = 0; /* not used */ |
| 185 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 190 | send_msg(msg); |
| 186 | } | 191 | } |
| 187 | 192 | ||
| 188 | void proc_ptrace_connector(struct task_struct *task, int ptrace_id) | 193 | void proc_ptrace_connector(struct task_struct *task, int ptrace_id) |
| @@ -197,7 +202,6 @@ void proc_ptrace_connector(struct task_struct *task, int ptrace_id) | |||
| 197 | msg = buffer_to_cn_msg(buffer); | 202 | msg = buffer_to_cn_msg(buffer); |
| 198 | ev = (struct proc_event *)msg->data; | 203 | ev = (struct proc_event *)msg->data; |
| 199 | memset(&ev->event_data, 0, sizeof(ev->event_data)); | 204 | memset(&ev->event_data, 0, sizeof(ev->event_data)); |
| 200 | get_seq(&msg->seq, &ev->cpu); | ||
| 201 | ev->timestamp_ns = ktime_get_ns(); | 205 | ev->timestamp_ns = ktime_get_ns(); |
| 202 | ev->what = PROC_EVENT_PTRACE; | 206 | ev->what = PROC_EVENT_PTRACE; |
| 203 | ev->event_data.ptrace.process_pid = task->pid; | 207 | ev->event_data.ptrace.process_pid = task->pid; |
| @@ -215,7 +219,7 @@ void proc_ptrace_connector(struct task_struct *task, int ptrace_id) | |||
| 215 | msg->ack = 0; /* not used */ | 219 | msg->ack = 0; /* not used */ |
| 216 | msg->len = sizeof(*ev); | 220 | msg->len = sizeof(*ev); |
| 217 | msg->flags = 0; /* not used */ | 221 | msg->flags = 0; /* not used */ |
| 218 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 222 | send_msg(msg); |
| 219 | } | 223 | } |
| 220 | 224 | ||
| 221 | void proc_comm_connector(struct task_struct *task) | 225 | void proc_comm_connector(struct task_struct *task) |
| @@ -230,7 +234,6 @@ void proc_comm_connector(struct task_struct *task) | |||
| 230 | msg = buffer_to_cn_msg(buffer); | 234 | msg = buffer_to_cn_msg(buffer); |
| 231 | ev = (struct proc_event *)msg->data; | 235 | ev = (struct proc_event *)msg->data; |
| 232 | memset(&ev->event_data, 0, sizeof(ev->event_data)); | 236 | memset(&ev->event_data, 0, sizeof(ev->event_data)); |
| 233 | get_seq(&msg->seq, &ev->cpu); | ||
| 234 | ev->timestamp_ns = ktime_get_ns(); | 237 | ev->timestamp_ns = ktime_get_ns(); |
| 235 | ev->what = PROC_EVENT_COMM; | 238 | ev->what = PROC_EVENT_COMM; |
| 236 | ev->event_data.comm.process_pid = task->pid; | 239 | ev->event_data.comm.process_pid = task->pid; |
| @@ -241,7 +244,7 @@ void proc_comm_connector(struct task_struct *task) | |||
| 241 | msg->ack = 0; /* not used */ | 244 | msg->ack = 0; /* not used */ |
| 242 | msg->len = sizeof(*ev); | 245 | msg->len = sizeof(*ev); |
| 243 | msg->flags = 0; /* not used */ | 246 | msg->flags = 0; /* not used */ |
| 244 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 247 | send_msg(msg); |
| 245 | } | 248 | } |
| 246 | 249 | ||
| 247 | void proc_coredump_connector(struct task_struct *task) | 250 | void proc_coredump_connector(struct task_struct *task) |
| @@ -256,7 +259,6 @@ void proc_coredump_connector(struct task_struct *task) | |||
| 256 | msg = buffer_to_cn_msg(buffer); | 259 | msg = buffer_to_cn_msg(buffer); |
| 257 | ev = (struct proc_event *)msg->data; | 260 | ev = (struct proc_event *)msg->data; |
| 258 | memset(&ev->event_data, 0, sizeof(ev->event_data)); | 261 | memset(&ev->event_data, 0, sizeof(ev->event_data)); |
| 259 | get_seq(&msg->seq, &ev->cpu); | ||
| 260 | ev->timestamp_ns = ktime_get_ns(); | 262 | ev->timestamp_ns = ktime_get_ns(); |
| 261 | ev->what = PROC_EVENT_COREDUMP; | 263 | ev->what = PROC_EVENT_COREDUMP; |
| 262 | ev->event_data.coredump.process_pid = task->pid; | 264 | ev->event_data.coredump.process_pid = task->pid; |
| @@ -266,7 +268,7 @@ void proc_coredump_connector(struct task_struct *task) | |||
| 266 | msg->ack = 0; /* not used */ | 268 | msg->ack = 0; /* not used */ |
| 267 | msg->len = sizeof(*ev); | 269 | msg->len = sizeof(*ev); |
| 268 | msg->flags = 0; /* not used */ | 270 | msg->flags = 0; /* not used */ |
| 269 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 271 | send_msg(msg); |
| 270 | } | 272 | } |
| 271 | 273 | ||
| 272 | void proc_exit_connector(struct task_struct *task) | 274 | void proc_exit_connector(struct task_struct *task) |
| @@ -281,7 +283,6 @@ void proc_exit_connector(struct task_struct *task) | |||
| 281 | msg = buffer_to_cn_msg(buffer); | 283 | msg = buffer_to_cn_msg(buffer); |
| 282 | ev = (struct proc_event *)msg->data; | 284 | ev = (struct proc_event *)msg->data; |
| 283 | memset(&ev->event_data, 0, sizeof(ev->event_data)); | 285 | memset(&ev->event_data, 0, sizeof(ev->event_data)); |
| 284 | get_seq(&msg->seq, &ev->cpu); | ||
| 285 | ev->timestamp_ns = ktime_get_ns(); | 286 | ev->timestamp_ns = ktime_get_ns(); |
| 286 | ev->what = PROC_EVENT_EXIT; | 287 | ev->what = PROC_EVENT_EXIT; |
| 287 | ev->event_data.exit.process_pid = task->pid; | 288 | ev->event_data.exit.process_pid = task->pid; |
| @@ -293,7 +294,7 @@ void proc_exit_connector(struct task_struct *task) | |||
| 293 | msg->ack = 0; /* not used */ | 294 | msg->ack = 0; /* not used */ |
| 294 | msg->len = sizeof(*ev); | 295 | msg->len = sizeof(*ev); |
| 295 | msg->flags = 0; /* not used */ | 296 | msg->flags = 0; /* not used */ |
| 296 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 297 | send_msg(msg); |
| 297 | } | 298 | } |
| 298 | 299 | ||
| 299 | /* | 300 | /* |
| @@ -325,7 +326,7 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) | |||
| 325 | msg->ack = rcvd_ack + 1; | 326 | msg->ack = rcvd_ack + 1; |
| 326 | msg->len = sizeof(*ev); | 327 | msg->len = sizeof(*ev); |
| 327 | msg->flags = 0; /* not used */ | 328 | msg->flags = 0; /* not used */ |
| 328 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); | 329 | send_msg(msg); |
| 329 | } | 330 | } |
| 330 | 331 | ||
| 331 | /** | 332 | /** |
diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c index 808a320e9d5d..a7ecb9a84c15 100644 --- a/drivers/cpufreq/pcc-cpufreq.c +++ b/drivers/cpufreq/pcc-cpufreq.c | |||
| @@ -487,7 +487,7 @@ static int __init pcc_cpufreq_probe(void) | |||
| 487 | doorbell.space_id = reg_resource->space_id; | 487 | doorbell.space_id = reg_resource->space_id; |
| 488 | doorbell.bit_width = reg_resource->bit_width; | 488 | doorbell.bit_width = reg_resource->bit_width; |
| 489 | doorbell.bit_offset = reg_resource->bit_offset; | 489 | doorbell.bit_offset = reg_resource->bit_offset; |
| 490 | doorbell.access_width = 64; | 490 | doorbell.access_width = 4; |
| 491 | doorbell.address = reg_resource->address; | 491 | doorbell.address = reg_resource->address; |
| 492 | 492 | ||
| 493 | pr_debug("probe: doorbell: space_id is %d, bit_width is %d, " | 493 | pr_debug("probe: doorbell: space_id is %d, bit_width is %d, " |
diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c index 574e87c7f2b8..9acccad26928 100644 --- a/drivers/crypto/ux500/hash/hash_core.c +++ b/drivers/crypto/ux500/hash/hash_core.c | |||
| @@ -781,7 +781,7 @@ static int hash_process_data(struct hash_device_data *device_data, | |||
| 781 | &device_data->state); | 781 | &device_data->state); |
| 782 | memmove(req_ctx->state.buffer, | 782 | memmove(req_ctx->state.buffer, |
| 783 | device_data->state.buffer, | 783 | device_data->state.buffer, |
| 784 | HASH_BLOCK_SIZE / sizeof(u32)); | 784 | HASH_BLOCK_SIZE); |
| 785 | if (ret) { | 785 | if (ret) { |
| 786 | dev_err(device_data->dev, | 786 | dev_err(device_data->dev, |
| 787 | "%s: hash_resume_state() failed!\n", | 787 | "%s: hash_resume_state() failed!\n", |
| @@ -832,7 +832,7 @@ static int hash_process_data(struct hash_device_data *device_data, | |||
| 832 | 832 | ||
| 833 | memmove(device_data->state.buffer, | 833 | memmove(device_data->state.buffer, |
| 834 | req_ctx->state.buffer, | 834 | req_ctx->state.buffer, |
| 835 | HASH_BLOCK_SIZE / sizeof(u32)); | 835 | HASH_BLOCK_SIZE); |
| 836 | if (ret) { | 836 | if (ret) { |
| 837 | dev_err(device_data->dev, "%s: hash_save_state() failed!\n", | 837 | dev_err(device_data->dev, "%s: hash_save_state() failed!\n", |
| 838 | __func__); | 838 | __func__); |
diff --git a/drivers/crypto/vmx/aes_cbc.c b/drivers/crypto/vmx/aes_cbc.c index 495577b6d31b..94ad5c0adbcb 100644 --- a/drivers/crypto/vmx/aes_cbc.c +++ b/drivers/crypto/vmx/aes_cbc.c | |||
| @@ -182,7 +182,7 @@ struct crypto_alg p8_aes_cbc_alg = { | |||
| 182 | .cra_name = "cbc(aes)", | 182 | .cra_name = "cbc(aes)", |
| 183 | .cra_driver_name = "p8_aes_cbc", | 183 | .cra_driver_name = "p8_aes_cbc", |
| 184 | .cra_module = THIS_MODULE, | 184 | .cra_module = THIS_MODULE, |
| 185 | .cra_priority = 1000, | 185 | .cra_priority = 2000, |
| 186 | .cra_type = &crypto_blkcipher_type, | 186 | .cra_type = &crypto_blkcipher_type, |
| 187 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_NEED_FALLBACK, | 187 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_NEED_FALLBACK, |
| 188 | .cra_alignmask = 0, | 188 | .cra_alignmask = 0, |
diff --git a/drivers/crypto/vmx/aes_ctr.c b/drivers/crypto/vmx/aes_ctr.c index 0a3c1b04cf3c..38ed10d761d0 100644 --- a/drivers/crypto/vmx/aes_ctr.c +++ b/drivers/crypto/vmx/aes_ctr.c | |||
| @@ -166,7 +166,7 @@ struct crypto_alg p8_aes_ctr_alg = { | |||
| 166 | .cra_name = "ctr(aes)", | 166 | .cra_name = "ctr(aes)", |
| 167 | .cra_driver_name = "p8_aes_ctr", | 167 | .cra_driver_name = "p8_aes_ctr", |
| 168 | .cra_module = THIS_MODULE, | 168 | .cra_module = THIS_MODULE, |
| 169 | .cra_priority = 1000, | 169 | .cra_priority = 2000, |
| 170 | .cra_type = &crypto_blkcipher_type, | 170 | .cra_type = &crypto_blkcipher_type, |
| 171 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_NEED_FALLBACK, | 171 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_NEED_FALLBACK, |
| 172 | .cra_alignmask = 0, | 172 | .cra_alignmask = 0, |
diff --git a/drivers/crypto/vmx/ppc-xlate.pl b/drivers/crypto/vmx/ppc-xlate.pl index 9f4994cabcc7..b18e67d0e065 100644 --- a/drivers/crypto/vmx/ppc-xlate.pl +++ b/drivers/crypto/vmx/ppc-xlate.pl | |||
| @@ -141,7 +141,7 @@ my $vmr = sub { | |||
| 141 | 141 | ||
| 142 | # Some ABIs specify vrsave, special-purpose register #256, as reserved | 142 | # Some ABIs specify vrsave, special-purpose register #256, as reserved |
| 143 | # for system use. | 143 | # for system use. |
| 144 | my $no_vrsave = ($flavour =~ /aix|linux64le/); | 144 | my $no_vrsave = ($flavour =~ /linux-ppc64le/); |
| 145 | my $mtspr = sub { | 145 | my $mtspr = sub { |
| 146 | my ($f,$idx,$ra) = @_; | 146 | my ($f,$idx,$ra) = @_; |
| 147 | if ($idx == 256 && $no_vrsave) { | 147 | if ($idx == 256 && $no_vrsave) { |
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 1d6c803804d5..e92418facc92 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c | |||
| @@ -268,8 +268,11 @@ int update_devfreq(struct devfreq *devfreq) | |||
| 268 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE); | 268 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE); |
| 269 | 269 | ||
| 270 | err = devfreq->profile->target(devfreq->dev.parent, &freq, flags); | 270 | err = devfreq->profile->target(devfreq->dev.parent, &freq, flags); |
| 271 | if (err) | 271 | if (err) { |
| 272 | freqs.new = cur_freq; | ||
| 273 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); | ||
| 272 | return err; | 274 | return err; |
| 275 | } | ||
| 273 | 276 | ||
| 274 | freqs.new = freq; | 277 | freqs.new = freq; |
| 275 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); | 278 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); |
| @@ -552,6 +555,7 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
| 552 | devfreq->profile = profile; | 555 | devfreq->profile = profile; |
| 553 | strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN); | 556 | strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN); |
| 554 | devfreq->previous_freq = profile->initial_freq; | 557 | devfreq->previous_freq = profile->initial_freq; |
| 558 | devfreq->last_status.current_frequency = profile->initial_freq; | ||
| 555 | devfreq->data = data; | 559 | devfreq->data = data; |
| 556 | devfreq->nb.notifier_call = devfreq_notifier_call; | 560 | devfreq->nb.notifier_call = devfreq_notifier_call; |
| 557 | 561 | ||
| @@ -561,23 +565,22 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
| 561 | mutex_lock(&devfreq->lock); | 565 | mutex_lock(&devfreq->lock); |
| 562 | } | 566 | } |
| 563 | 567 | ||
| 564 | devfreq->trans_table = devm_kzalloc(dev, sizeof(unsigned int) * | ||
| 565 | devfreq->profile->max_state * | ||
| 566 | devfreq->profile->max_state, | ||
| 567 | GFP_KERNEL); | ||
| 568 | devfreq->time_in_state = devm_kzalloc(dev, sizeof(unsigned long) * | ||
| 569 | devfreq->profile->max_state, | ||
| 570 | GFP_KERNEL); | ||
| 571 | devfreq->last_stat_updated = jiffies; | ||
| 572 | |||
| 573 | dev_set_name(&devfreq->dev, "%s", dev_name(dev)); | 568 | dev_set_name(&devfreq->dev, "%s", dev_name(dev)); |
| 574 | err = device_register(&devfreq->dev); | 569 | err = device_register(&devfreq->dev); |
| 575 | if (err) { | 570 | if (err) { |
| 576 | put_device(&devfreq->dev); | ||
| 577 | mutex_unlock(&devfreq->lock); | 571 | mutex_unlock(&devfreq->lock); |
| 578 | goto err_out; | 572 | goto err_out; |
| 579 | } | 573 | } |
| 580 | 574 | ||
| 575 | devfreq->trans_table = devm_kzalloc(&devfreq->dev, sizeof(unsigned int) * | ||
| 576 | devfreq->profile->max_state * | ||
| 577 | devfreq->profile->max_state, | ||
| 578 | GFP_KERNEL); | ||
| 579 | devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) * | ||
| 580 | devfreq->profile->max_state, | ||
| 581 | GFP_KERNEL); | ||
| 582 | devfreq->last_stat_updated = jiffies; | ||
| 583 | |||
| 581 | srcu_init_notifier_head(&devfreq->transition_notifier_list); | 584 | srcu_init_notifier_head(&devfreq->transition_notifier_list); |
| 582 | 585 | ||
| 583 | mutex_unlock(&devfreq->lock); | 586 | mutex_unlock(&devfreq->lock); |
| @@ -603,7 +606,6 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
| 603 | err_init: | 606 | err_init: |
| 604 | list_del(&devfreq->node); | 607 | list_del(&devfreq->node); |
| 605 | device_unregister(&devfreq->dev); | 608 | device_unregister(&devfreq->dev); |
| 606 | kfree(devfreq); | ||
| 607 | err_out: | 609 | err_out: |
| 608 | return ERR_PTR(err); | 610 | return ERR_PTR(err); |
| 609 | } | 611 | } |
| @@ -621,7 +623,6 @@ int devfreq_remove_device(struct devfreq *devfreq) | |||
| 621 | return -EINVAL; | 623 | return -EINVAL; |
| 622 | 624 | ||
| 623 | device_unregister(&devfreq->dev); | 625 | device_unregister(&devfreq->dev); |
| 624 | put_device(&devfreq->dev); | ||
| 625 | 626 | ||
| 626 | return 0; | 627 | return 0; |
| 627 | } | 628 | } |
diff --git a/drivers/devfreq/event/exynos-nocp.c b/drivers/devfreq/event/exynos-nocp.c index 6b6a5f310486..a5841403bde8 100644 --- a/drivers/devfreq/event/exynos-nocp.c +++ b/drivers/devfreq/event/exynos-nocp.c | |||
| @@ -220,9 +220,6 @@ static int exynos_nocp_parse_dt(struct platform_device *pdev, | |||
| 220 | 220 | ||
| 221 | /* Maps the memory mapped IO to control nocp register */ | 221 | /* Maps the memory mapped IO to control nocp register */ |
| 222 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 222 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 223 | if (IS_ERR(res)) | ||
| 224 | return PTR_ERR(res); | ||
| 225 | |||
| 226 | base = devm_ioremap_resource(dev, res); | 223 | base = devm_ioremap_resource(dev, res); |
| 227 | if (IS_ERR(base)) | 224 | if (IS_ERR(base)) |
| 228 | return PTR_ERR(base); | 225 | return PTR_ERR(base); |
diff --git a/drivers/gpio/gpio-104-idi-48.c b/drivers/gpio/gpio-104-idi-48.c index 6c75c83baf5a..2d2763ea1a68 100644 --- a/drivers/gpio/gpio-104-idi-48.c +++ b/drivers/gpio/gpio-104-idi-48.c | |||
| @@ -247,6 +247,7 @@ static int idi_48_probe(struct device *dev, unsigned int id) | |||
| 247 | idi48gpio->irq = irq[id]; | 247 | idi48gpio->irq = irq[id]; |
| 248 | 248 | ||
| 249 | spin_lock_init(&idi48gpio->lock); | 249 | spin_lock_init(&idi48gpio->lock); |
| 250 | spin_lock_init(&idi48gpio->ack_lock); | ||
| 250 | 251 | ||
| 251 | dev_set_drvdata(dev, idi48gpio); | 252 | dev_set_drvdata(dev, idi48gpio); |
| 252 | 253 | ||
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c index ec891a27952f..661b0e34e067 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c | |||
| @@ -98,7 +98,6 @@ struct tegra_gpio_info { | |||
| 98 | const struct tegra_gpio_soc_config *soc; | 98 | const struct tegra_gpio_soc_config *soc; |
| 99 | struct gpio_chip gc; | 99 | struct gpio_chip gc; |
| 100 | struct irq_chip ic; | 100 | struct irq_chip ic; |
| 101 | struct lock_class_key lock_class; | ||
| 102 | u32 bank_count; | 101 | u32 bank_count; |
| 103 | }; | 102 | }; |
| 104 | 103 | ||
| @@ -547,6 +546,12 @@ static const struct dev_pm_ops tegra_gpio_pm_ops = { | |||
| 547 | SET_SYSTEM_SLEEP_PM_OPS(tegra_gpio_suspend, tegra_gpio_resume) | 546 | SET_SYSTEM_SLEEP_PM_OPS(tegra_gpio_suspend, tegra_gpio_resume) |
| 548 | }; | 547 | }; |
| 549 | 548 | ||
| 549 | /* | ||
| 550 | * This lock class tells lockdep that GPIO irqs are in a different category | ||
| 551 | * than their parents, so it won't report false recursion. | ||
| 552 | */ | ||
| 553 | static struct lock_class_key gpio_lock_class; | ||
| 554 | |||
| 550 | static int tegra_gpio_probe(struct platform_device *pdev) | 555 | static int tegra_gpio_probe(struct platform_device *pdev) |
| 551 | { | 556 | { |
| 552 | const struct tegra_gpio_soc_config *config; | 557 | const struct tegra_gpio_soc_config *config; |
| @@ -660,7 +665,7 @@ static int tegra_gpio_probe(struct platform_device *pdev) | |||
| 660 | 665 | ||
| 661 | bank = &tgi->bank_info[GPIO_BANK(gpio)]; | 666 | bank = &tgi->bank_info[GPIO_BANK(gpio)]; |
| 662 | 667 | ||
| 663 | irq_set_lockdep_class(irq, &tgi->lock_class); | 668 | irq_set_lockdep_class(irq, &gpio_lock_class); |
| 664 | irq_set_chip_data(irq, bank); | 669 | irq_set_chip_data(irq, bank); |
| 665 | irq_set_chip_and_handler(irq, &tgi->ic, handle_simple_irq); | 670 | irq_set_chip_and_handler(irq, &tgi->ic, handle_simple_irq); |
| 666 | } | 671 | } |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 58d822d7e8da..570771ed19e6 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
| @@ -1373,8 +1373,12 @@ done: | |||
| 1373 | #define VALIDATE_DESC(desc) do { \ | 1373 | #define VALIDATE_DESC(desc) do { \ |
| 1374 | if (!desc) \ | 1374 | if (!desc) \ |
| 1375 | return 0; \ | 1375 | return 0; \ |
| 1376 | if (IS_ERR(desc)) { \ | ||
| 1377 | pr_warn("%s: invalid GPIO (errorpointer)\n", __func__); \ | ||
| 1378 | return PTR_ERR(desc); \ | ||
| 1379 | } \ | ||
| 1376 | if (!desc->gdev) { \ | 1380 | if (!desc->gdev) { \ |
| 1377 | pr_warn("%s: invalid GPIO\n", __func__); \ | 1381 | pr_warn("%s: invalid GPIO (no device)\n", __func__); \ |
| 1378 | return -EINVAL; \ | 1382 | return -EINVAL; \ |
| 1379 | } \ | 1383 | } \ |
| 1380 | if ( !desc->gdev->chip ) { \ | 1384 | if ( !desc->gdev->chip ) { \ |
| @@ -1386,8 +1390,12 @@ done: | |||
| 1386 | #define VALIDATE_DESC_VOID(desc) do { \ | 1390 | #define VALIDATE_DESC_VOID(desc) do { \ |
| 1387 | if (!desc) \ | 1391 | if (!desc) \ |
| 1388 | return; \ | 1392 | return; \ |
| 1393 | if (IS_ERR(desc)) { \ | ||
| 1394 | pr_warn("%s: invalid GPIO (errorpointer)\n", __func__); \ | ||
| 1395 | return; \ | ||
| 1396 | } \ | ||
| 1389 | if (!desc->gdev) { \ | 1397 | if (!desc->gdev) { \ |
| 1390 | pr_warn("%s: invalid GPIO\n", __func__); \ | 1398 | pr_warn("%s: invalid GPIO (no device)\n", __func__); \ |
| 1391 | return; \ | 1399 | return; \ |
| 1392 | } \ | 1400 | } \ |
| 1393 | if (!desc->gdev->chip) { \ | 1401 | if (!desc->gdev->chip) { \ |
| @@ -2056,7 +2064,14 @@ int gpiod_to_irq(const struct gpio_desc *desc) | |||
| 2056 | struct gpio_chip *chip; | 2064 | struct gpio_chip *chip; |
| 2057 | int offset; | 2065 | int offset; |
| 2058 | 2066 | ||
| 2059 | VALIDATE_DESC(desc); | 2067 | /* |
| 2068 | * Cannot VALIDATE_DESC() here as gpiod_to_irq() consumer semantics | ||
| 2069 | * requires this function to not return zero on an invalid descriptor | ||
| 2070 | * but rather a negative error number. | ||
| 2071 | */ | ||
| 2072 | if (!desc || IS_ERR(desc) || !desc->gdev || !desc->gdev->chip) | ||
| 2073 | return -EINVAL; | ||
| 2074 | |||
| 2060 | chip = desc->gdev->chip; | 2075 | chip = desc->gdev->chip; |
| 2061 | offset = gpio_chip_hwgpio(desc); | 2076 | offset = gpio_chip_hwgpio(desc); |
| 2062 | if (chip->to_irq) { | 2077 | if (chip->to_irq) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 8943099eb135..cf6f49fc1c75 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | |||
| @@ -909,7 +909,7 @@ static int amdgpu_cgs_acpi_eval_object(struct cgs_device *cgs_device, | |||
| 909 | struct cgs_acpi_method_argument *argument = NULL; | 909 | struct cgs_acpi_method_argument *argument = NULL; |
| 910 | uint32_t i, count; | 910 | uint32_t i, count; |
| 911 | acpi_status status; | 911 | acpi_status status; |
| 912 | int result; | 912 | int result = 0; |
| 913 | uint32_t func_no = 0xFFFFFFFF; | 913 | uint32_t func_no = 0xFFFFFFFF; |
| 914 | 914 | ||
| 915 | handle = ACPI_HANDLE(&adev->pdev->dev); | 915 | handle = ACPI_HANDLE(&adev->pdev->dev); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 66482b429458..6e920086af46 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
| @@ -1535,7 +1535,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, | |||
| 1535 | /* Post card if necessary */ | 1535 | /* Post card if necessary */ |
| 1536 | if (!amdgpu_card_posted(adev) || | 1536 | if (!amdgpu_card_posted(adev) || |
| 1537 | (adev->virtualization.is_virtual && | 1537 | (adev->virtualization.is_virtual && |
| 1538 | !adev->virtualization.caps & AMDGPU_VIRT_CAPS_SRIOV_EN)) { | 1538 | !(adev->virtualization.caps & AMDGPU_VIRT_CAPS_SRIOV_EN))) { |
| 1539 | if (!adev->bios) { | 1539 | if (!adev->bios) { |
| 1540 | dev_err(adev->dev, "Card not posted and no BIOS - ignoring\n"); | 1540 | dev_err(adev->dev, "Card not posted and no BIOS - ignoring\n"); |
| 1541 | return -EINVAL; | 1541 | return -EINVAL; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 40a23704a981..d851ea15059f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
| @@ -447,7 +447,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
| 447 | dev_info.max_memory_clock = adev->pm.default_mclk * 10; | 447 | dev_info.max_memory_clock = adev->pm.default_mclk * 10; |
| 448 | } | 448 | } |
| 449 | dev_info.enabled_rb_pipes_mask = adev->gfx.config.backend_enable_mask; | 449 | dev_info.enabled_rb_pipes_mask = adev->gfx.config.backend_enable_mask; |
| 450 | dev_info.num_rb_pipes = adev->gfx.config.num_rbs; | 450 | dev_info.num_rb_pipes = adev->gfx.config.max_backends_per_se * |
| 451 | adev->gfx.config.max_shader_engines; | ||
| 451 | dev_info.num_hw_gfx_contexts = adev->gfx.config.max_hw_contexts; | 452 | dev_info.num_hw_gfx_contexts = adev->gfx.config.max_hw_contexts; |
| 452 | dev_info._pad = 0; | 453 | dev_info._pad = 0; |
| 453 | dev_info.ids_flags = 0; | 454 | dev_info.ids_flags = 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 589b36e8c5cf..0e13d80d2a95 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
| @@ -270,30 +270,28 @@ static ssize_t amdgpu_set_pp_force_state(struct device *dev, | |||
| 270 | struct drm_device *ddev = dev_get_drvdata(dev); | 270 | struct drm_device *ddev = dev_get_drvdata(dev); |
| 271 | struct amdgpu_device *adev = ddev->dev_private; | 271 | struct amdgpu_device *adev = ddev->dev_private; |
| 272 | enum amd_pm_state_type state = 0; | 272 | enum amd_pm_state_type state = 0; |
| 273 | long idx; | 273 | unsigned long idx; |
| 274 | int ret; | 274 | int ret; |
| 275 | 275 | ||
| 276 | if (strlen(buf) == 1) | 276 | if (strlen(buf) == 1) |
| 277 | adev->pp_force_state_enabled = false; | 277 | adev->pp_force_state_enabled = false; |
| 278 | else { | 278 | else if (adev->pp_enabled) { |
| 279 | ret = kstrtol(buf, 0, &idx); | 279 | struct pp_states_info data; |
| 280 | 280 | ||
| 281 | if (ret) { | 281 | ret = kstrtoul(buf, 0, &idx); |
| 282 | if (ret || idx >= ARRAY_SIZE(data.states)) { | ||
| 282 | count = -EINVAL; | 283 | count = -EINVAL; |
| 283 | goto fail; | 284 | goto fail; |
| 284 | } | 285 | } |
| 285 | 286 | ||
| 286 | if (adev->pp_enabled) { | 287 | amdgpu_dpm_get_pp_num_states(adev, &data); |
| 287 | struct pp_states_info data; | 288 | state = data.states[idx]; |
| 288 | amdgpu_dpm_get_pp_num_states(adev, &data); | 289 | /* only set user selected power states */ |
| 289 | state = data.states[idx]; | 290 | if (state != POWER_STATE_TYPE_INTERNAL_BOOT && |
| 290 | /* only set user selected power states */ | 291 | state != POWER_STATE_TYPE_DEFAULT) { |
| 291 | if (state != POWER_STATE_TYPE_INTERNAL_BOOT && | 292 | amdgpu_dpm_dispatch_task(adev, |
| 292 | state != POWER_STATE_TYPE_DEFAULT) { | 293 | AMD_PP_EVENT_ENABLE_USER_STATE, &state, NULL); |
| 293 | amdgpu_dpm_dispatch_task(adev, | 294 | adev->pp_force_state_enabled = true; |
| 294 | AMD_PP_EVENT_ENABLE_USER_STATE, &state, NULL); | ||
| 295 | adev->pp_force_state_enabled = true; | ||
| 296 | } | ||
| 297 | } | 295 | } |
| 298 | } | 296 | } |
| 299 | fail: | 297 | fail: |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 9f6f8669edc3..1a5cbaff1e34 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
| @@ -297,7 +297,8 @@ static const u32 polaris11_golden_common_all[] = | |||
| 297 | static const u32 golden_settings_polaris10_a11[] = | 297 | static const u32 golden_settings_polaris10_a11[] = |
| 298 | { | 298 | { |
| 299 | mmATC_MISC_CG, 0x000c0fc0, 0x000c0200, | 299 | mmATC_MISC_CG, 0x000c0fc0, 0x000c0200, |
| 300 | mmCB_HW_CONTROL, 0xfffdf3cf, 0x00006208, | 300 | mmCB_HW_CONTROL, 0xfffdf3cf, 0x00007208, |
| 301 | mmCB_HW_CONTROL_2, 0, 0x0f000000, | ||
| 301 | mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040, | 302 | mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040, |
| 302 | mmDB_DEBUG2, 0xf00fffff, 0x00000400, | 303 | mmDB_DEBUG2, 0xf00fffff, 0x00000400, |
| 303 | mmPA_SC_ENHANCE, 0xffffffff, 0x20000001, | 304 | mmPA_SC_ENHANCE, 0xffffffff, 0x20000001, |
diff --git a/drivers/gpu/drm/amd/include/atombios.h b/drivers/gpu/drm/amd/include/atombios.h index 32f3e345de08..3493da5c8f0e 100644 --- a/drivers/gpu/drm/amd/include/atombios.h +++ b/drivers/gpu/drm/amd/include/atombios.h | |||
| @@ -5538,6 +5538,78 @@ typedef struct _ATOM_ASIC_PROFILING_INFO_V3_5 | |||
| 5538 | ULONG ulReserved[12]; | 5538 | ULONG ulReserved[12]; |
| 5539 | }ATOM_ASIC_PROFILING_INFO_V3_5; | 5539 | }ATOM_ASIC_PROFILING_INFO_V3_5; |
| 5540 | 5540 | ||
| 5541 | /* for Polars10/11 AVFS parameters */ | ||
| 5542 | typedef struct _ATOM_ASIC_PROFILING_INFO_V3_6 | ||
| 5543 | { | ||
| 5544 | ATOM_COMMON_TABLE_HEADER asHeader; | ||
| 5545 | ULONG ulMaxVddc; | ||
| 5546 | ULONG ulMinVddc; | ||
| 5547 | USHORT usLkgEuseIndex; | ||
| 5548 | UCHAR ucLkgEfuseBitLSB; | ||
| 5549 | UCHAR ucLkgEfuseLength; | ||
| 5550 | ULONG ulLkgEncodeLn_MaxDivMin; | ||
| 5551 | ULONG ulLkgEncodeMax; | ||
| 5552 | ULONG ulLkgEncodeMin; | ||
| 5553 | EFUSE_LINEAR_FUNC_PARAM sRoFuse; | ||
| 5554 | ULONG ulEvvDefaultVddc; | ||
| 5555 | ULONG ulEvvNoCalcVddc; | ||
| 5556 | ULONG ulSpeed_Model; | ||
| 5557 | ULONG ulSM_A0; | ||
| 5558 | ULONG ulSM_A1; | ||
| 5559 | ULONG ulSM_A2; | ||
| 5560 | ULONG ulSM_A3; | ||
| 5561 | ULONG ulSM_A4; | ||
| 5562 | ULONG ulSM_A5; | ||
| 5563 | ULONG ulSM_A6; | ||
| 5564 | ULONG ulSM_A7; | ||
| 5565 | UCHAR ucSM_A0_sign; | ||
| 5566 | UCHAR ucSM_A1_sign; | ||
| 5567 | UCHAR ucSM_A2_sign; | ||
| 5568 | UCHAR ucSM_A3_sign; | ||
| 5569 | UCHAR ucSM_A4_sign; | ||
| 5570 | UCHAR ucSM_A5_sign; | ||
| 5571 | UCHAR ucSM_A6_sign; | ||
| 5572 | UCHAR ucSM_A7_sign; | ||
| 5573 | ULONG ulMargin_RO_a; | ||
| 5574 | ULONG ulMargin_RO_b; | ||
| 5575 | ULONG ulMargin_RO_c; | ||
| 5576 | ULONG ulMargin_fixed; | ||
| 5577 | ULONG ulMargin_Fmax_mean; | ||
| 5578 | ULONG ulMargin_plat_mean; | ||
| 5579 | ULONG ulMargin_Fmax_sigma; | ||
| 5580 | ULONG ulMargin_plat_sigma; | ||
| 5581 | ULONG ulMargin_DC_sigma; | ||
| 5582 | ULONG ulLoadLineSlop; | ||
| 5583 | ULONG ulaTDClimitPerDPM[8]; | ||
| 5584 | ULONG ulaNoCalcVddcPerDPM[8]; | ||
| 5585 | ULONG ulAVFS_meanNsigma_Acontant0; | ||
| 5586 | ULONG ulAVFS_meanNsigma_Acontant1; | ||
| 5587 | ULONG ulAVFS_meanNsigma_Acontant2; | ||
| 5588 | USHORT usAVFS_meanNsigma_DC_tol_sigma; | ||
| 5589 | USHORT usAVFS_meanNsigma_Platform_mean; | ||
| 5590 | USHORT usAVFS_meanNsigma_Platform_sigma; | ||
| 5591 | ULONG ulGB_VDROOP_TABLE_CKSOFF_a0; | ||
| 5592 | ULONG ulGB_VDROOP_TABLE_CKSOFF_a1; | ||
| 5593 | ULONG ulGB_VDROOP_TABLE_CKSOFF_a2; | ||
| 5594 | ULONG ulGB_VDROOP_TABLE_CKSON_a0; | ||
| 5595 | ULONG ulGB_VDROOP_TABLE_CKSON_a1; | ||
| 5596 | ULONG ulGB_VDROOP_TABLE_CKSON_a2; | ||
| 5597 | ULONG ulAVFSGB_FUSE_TABLE_CKSOFF_m1; | ||
| 5598 | USHORT usAVFSGB_FUSE_TABLE_CKSOFF_m2; | ||
| 5599 | ULONG ulAVFSGB_FUSE_TABLE_CKSOFF_b; | ||
| 5600 | ULONG ulAVFSGB_FUSE_TABLE_CKSON_m1; | ||
| 5601 | USHORT usAVFSGB_FUSE_TABLE_CKSON_m2; | ||
| 5602 | ULONG ulAVFSGB_FUSE_TABLE_CKSON_b; | ||
| 5603 | USHORT usMaxVoltage_0_25mv; | ||
| 5604 | UCHAR ucEnableGB_VDROOP_TABLE_CKSOFF; | ||
| 5605 | UCHAR ucEnableGB_VDROOP_TABLE_CKSON; | ||
| 5606 | UCHAR ucEnableGB_FUSE_TABLE_CKSOFF; | ||
| 5607 | UCHAR ucEnableGB_FUSE_TABLE_CKSON; | ||
| 5608 | USHORT usPSM_Age_ComFactor; | ||
| 5609 | UCHAR ucEnableApplyAVFS_CKS_OFF_Voltage; | ||
| 5610 | UCHAR ucReserved; | ||
| 5611 | }ATOM_ASIC_PROFILING_INFO_V3_6; | ||
| 5612 | |||
| 5541 | 5613 | ||
| 5542 | typedef struct _ATOM_SCLK_FCW_RANGE_ENTRY_V1{ | 5614 | typedef struct _ATOM_SCLK_FCW_RANGE_ENTRY_V1{ |
| 5543 | ULONG ulMaxSclkFreq; | 5615 | ULONG ulMaxSclkFreq; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c index 586f73276226..92912ab20944 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c | |||
| @@ -633,6 +633,8 @@ static int fiji_hwmgr_backend_init(struct pp_hwmgr *hwmgr) | |||
| 633 | data->vddci_control = FIJI_VOLTAGE_CONTROL_NONE; | 633 | data->vddci_control = FIJI_VOLTAGE_CONTROL_NONE; |
| 634 | data->mvdd_control = FIJI_VOLTAGE_CONTROL_NONE; | 634 | data->mvdd_control = FIJI_VOLTAGE_CONTROL_NONE; |
| 635 | 635 | ||
| 636 | data->force_pcie_gen = PP_PCIEGenInvalid; | ||
| 637 | |||
| 636 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, | 638 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, |
| 637 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) | 639 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) |
| 638 | data->voltage_control = FIJI_VOLTAGE_CONTROL_BY_SVID2; | 640 | data->voltage_control = FIJI_VOLTAGE_CONTROL_BY_SVID2; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c index fa208ada6892..efb77eda7508 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c | |||
| @@ -306,10 +306,14 @@ int phm_store_dal_configuration_data(struct pp_hwmgr *hwmgr, | |||
| 306 | { | 306 | { |
| 307 | PHM_FUNC_CHECK(hwmgr); | 307 | PHM_FUNC_CHECK(hwmgr); |
| 308 | 308 | ||
| 309 | if (hwmgr->hwmgr_func->store_cc6_data == NULL) | 309 | if (display_config == NULL) |
| 310 | return -EINVAL; | 310 | return -EINVAL; |
| 311 | 311 | ||
| 312 | hwmgr->display_config = *display_config; | 312 | hwmgr->display_config = *display_config; |
| 313 | |||
| 314 | if (hwmgr->hwmgr_func->store_cc6_data == NULL) | ||
| 315 | return -EINVAL; | ||
| 316 | |||
| 313 | /* to do pass other display configuration in furture */ | 317 | /* to do pass other display configuration in furture */ |
| 314 | 318 | ||
| 315 | if (hwmgr->hwmgr_func->store_cc6_data) | 319 | if (hwmgr->hwmgr_func->store_cc6_data) |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c index 1400bc420881..64ee78f7d41e 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c | |||
| @@ -1296,7 +1296,6 @@ static int polaris10_populate_single_memory_level(struct pp_hwmgr *hwmgr, | |||
| 1296 | } | 1296 | } |
| 1297 | 1297 | ||
| 1298 | mem_level->MclkFrequency = clock; | 1298 | mem_level->MclkFrequency = clock; |
| 1299 | mem_level->StutterEnable = 0; | ||
| 1300 | mem_level->EnabledForThrottle = 1; | 1299 | mem_level->EnabledForThrottle = 1; |
| 1301 | mem_level->EnabledForActivity = 0; | 1300 | mem_level->EnabledForActivity = 0; |
| 1302 | mem_level->UpHyst = 0; | 1301 | mem_level->UpHyst = 0; |
| @@ -1304,7 +1303,6 @@ static int polaris10_populate_single_memory_level(struct pp_hwmgr *hwmgr, | |||
| 1304 | mem_level->VoltageDownHyst = 0; | 1303 | mem_level->VoltageDownHyst = 0; |
| 1305 | mem_level->ActivityLevel = (uint16_t)data->mclk_activity_target; | 1304 | mem_level->ActivityLevel = (uint16_t)data->mclk_activity_target; |
| 1306 | mem_level->StutterEnable = false; | 1305 | mem_level->StutterEnable = false; |
| 1307 | |||
| 1308 | mem_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW; | 1306 | mem_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW; |
| 1309 | 1307 | ||
| 1310 | data->display_timing.num_existing_displays = info.display_count; | 1308 | data->display_timing.num_existing_displays = info.display_count; |
| @@ -1363,7 +1361,7 @@ static int polaris10_populate_all_memory_levels(struct pp_hwmgr *hwmgr) | |||
| 1363 | * a higher state by default such that we are not effected by | 1361 | * a higher state by default such that we are not effected by |
| 1364 | * up threshold or and MCLK DPM latency. | 1362 | * up threshold or and MCLK DPM latency. |
| 1365 | */ | 1363 | */ |
| 1366 | levels[0].ActivityLevel = (uint16_t)data->mclk_dpm0_activity_target; | 1364 | levels[0].ActivityLevel = 0x1f; |
| 1367 | CONVERT_FROM_HOST_TO_SMC_US(levels[0].ActivityLevel); | 1365 | CONVERT_FROM_HOST_TO_SMC_US(levels[0].ActivityLevel); |
| 1368 | 1366 | ||
| 1369 | data->smc_state_table.MemoryDpmLevelCount = | 1367 | data->smc_state_table.MemoryDpmLevelCount = |
| @@ -1761,12 +1759,9 @@ static int polaris10_populate_smc_initailial_state(struct pp_hwmgr *hwmgr) | |||
| 1761 | 1759 | ||
| 1762 | static int polaris10_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr) | 1760 | static int polaris10_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr) |
| 1763 | { | 1761 | { |
| 1764 | uint32_t ro, efuse, efuse2, clock_freq, volt_without_cks, | 1762 | uint32_t ro, efuse, volt_without_cks, volt_with_cks, value, max, min; |
| 1765 | volt_with_cks, value; | ||
| 1766 | uint16_t clock_freq_u16; | ||
| 1767 | struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); | 1763 | struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); |
| 1768 | uint8_t type, i, j, cks_setting, stretch_amount, stretch_amount2, | 1764 | uint8_t i, stretch_amount, stretch_amount2, volt_offset = 0; |
| 1769 | volt_offset = 0; | ||
| 1770 | struct phm_ppt_v1_information *table_info = | 1765 | struct phm_ppt_v1_information *table_info = |
| 1771 | (struct phm_ppt_v1_information *)(hwmgr->pptable); | 1766 | (struct phm_ppt_v1_information *)(hwmgr->pptable); |
| 1772 | struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = | 1767 | struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = |
| @@ -1778,50 +1773,38 @@ static int polaris10_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr) | |||
| 1778 | * if the part is SS or FF. if RO >= 1660MHz, part is FF. | 1773 | * if the part is SS or FF. if RO >= 1660MHz, part is FF. |
| 1779 | */ | 1774 | */ |
| 1780 | efuse = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, | 1775 | efuse = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, |
| 1781 | ixSMU_EFUSE_0 + (146 * 4)); | 1776 | ixSMU_EFUSE_0 + (67 * 4)); |
| 1782 | efuse2 = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, | ||
| 1783 | ixSMU_EFUSE_0 + (148 * 4)); | ||
| 1784 | efuse &= 0xFF000000; | 1777 | efuse &= 0xFF000000; |
| 1785 | efuse = efuse >> 24; | 1778 | efuse = efuse >> 24; |
| 1786 | efuse2 &= 0xF; | ||
| 1787 | |||
| 1788 | if (efuse2 == 1) | ||
| 1789 | ro = (2300 - 1350) * efuse / 255 + 1350; | ||
| 1790 | else | ||
| 1791 | ro = (2500 - 1000) * efuse / 255 + 1000; | ||
| 1792 | 1779 | ||
| 1793 | if (ro >= 1660) | 1780 | if (hwmgr->chip_id == CHIP_POLARIS10) { |
| 1794 | type = 0; | 1781 | min = 1000; |
| 1795 | else | 1782 | max = 2300; |
| 1796 | type = 1; | 1783 | } else { |
| 1784 | min = 1100; | ||
| 1785 | max = 2100; | ||
| 1786 | } | ||
| 1797 | 1787 | ||
| 1798 | /* Populate Stretch amount */ | 1788 | ro = efuse * (max -min)/255 + min; |
| 1799 | data->smc_state_table.ClockStretcherAmount = stretch_amount; | ||
| 1800 | 1789 | ||
| 1801 | /* Populate Sclk_CKS_masterEn0_7 and Sclk_voltageOffset */ | 1790 | /* Populate Sclk_CKS_masterEn0_7 and Sclk_voltageOffset */ |
| 1802 | for (i = 0; i < sclk_table->count; i++) { | 1791 | for (i = 0; i < sclk_table->count; i++) { |
| 1803 | data->smc_state_table.Sclk_CKS_masterEn0_7 |= | 1792 | data->smc_state_table.Sclk_CKS_masterEn0_7 |= |
| 1804 | sclk_table->entries[i].cks_enable << i; | 1793 | sclk_table->entries[i].cks_enable << i; |
| 1805 | volt_without_cks = (uint32_t)((14041 * | 1794 | |
| 1806 | (sclk_table->entries[i].clk/100) / 10000 + 3571 + 75 - ro) * 1000 / | 1795 | volt_without_cks = (uint32_t)(((ro - 40) * 1000 - 2753594 - sclk_table->entries[i].clk/100 * 136418 /1000) / \ |
| 1807 | (4026 - (13924 * (sclk_table->entries[i].clk/100) / 10000))); | 1796 | (sclk_table->entries[i].clk/100 * 1132925 /10000 - 242418)/100); |
| 1808 | volt_with_cks = (uint32_t)((13946 * | 1797 | |
| 1809 | (sclk_table->entries[i].clk/100) / 10000 + 3320 + 45 - ro) * 1000 / | 1798 | volt_with_cks = (uint32_t)((ro * 1000 -2396351 - sclk_table->entries[i].clk/100 * 329021/1000) / \ |
| 1810 | (3664 - (11454 * (sclk_table->entries[i].clk/100) / 10000))); | 1799 | (sclk_table->entries[i].clk/10000 * 649434 /1000 - 18005)/10); |
| 1800 | |||
| 1811 | if (volt_without_cks >= volt_with_cks) | 1801 | if (volt_without_cks >= volt_with_cks) |
| 1812 | volt_offset = (uint8_t)(((volt_without_cks - volt_with_cks + | 1802 | volt_offset = (uint8_t)(((volt_without_cks - volt_with_cks + |
| 1813 | sclk_table->entries[i].cks_voffset) * 100 / 625) + 1); | 1803 | sclk_table->entries[i].cks_voffset) * 100 / 625) + 1); |
| 1804 | |||
| 1814 | data->smc_state_table.Sclk_voltageOffset[i] = volt_offset; | 1805 | data->smc_state_table.Sclk_voltageOffset[i] = volt_offset; |
| 1815 | } | 1806 | } |
| 1816 | 1807 | ||
| 1817 | PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE, | ||
| 1818 | STRETCH_ENABLE, 0x0); | ||
| 1819 | PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE, | ||
| 1820 | masterReset, 0x1); | ||
| 1821 | /* PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE, staticEnable, 0x1); */ | ||
| 1822 | PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE, | ||
| 1823 | masterReset, 0x0); | ||
| 1824 | |||
| 1825 | /* Populate CKS Lookup Table */ | 1808 | /* Populate CKS Lookup Table */ |
| 1826 | if (stretch_amount == 1 || stretch_amount == 2 || stretch_amount == 5) | 1809 | if (stretch_amount == 1 || stretch_amount == 2 || stretch_amount == 5) |
| 1827 | stretch_amount2 = 0; | 1810 | stretch_amount2 = 0; |
| @@ -1835,69 +1818,6 @@ static int polaris10_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr) | |||
| 1835 | return -EINVAL); | 1818 | return -EINVAL); |
| 1836 | } | 1819 | } |
| 1837 | 1820 | ||
| 1838 | value = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, | ||
| 1839 | ixPWR_CKS_CNTL); | ||
| 1840 | value &= 0xFFC2FF87; | ||
| 1841 | data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].minFreq = | ||
| 1842 | polaris10_clock_stretcher_lookup_table[stretch_amount2][0]; | ||
| 1843 | data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].maxFreq = | ||
| 1844 | polaris10_clock_stretcher_lookup_table[stretch_amount2][1]; | ||
| 1845 | clock_freq_u16 = (uint16_t)(PP_SMC_TO_HOST_UL(data->smc_state_table. | ||
| 1846 | GraphicsLevel[data->smc_state_table.GraphicsDpmLevelCount - 1].SclkSetting.SclkFrequency) / 100); | ||
| 1847 | if (polaris10_clock_stretcher_lookup_table[stretch_amount2][0] < clock_freq_u16 | ||
| 1848 | && polaris10_clock_stretcher_lookup_table[stretch_amount2][1] > clock_freq_u16) { | ||
| 1849 | /* Program PWR_CKS_CNTL. CKS_USE_FOR_LOW_FREQ */ | ||
| 1850 | value |= (polaris10_clock_stretcher_lookup_table[stretch_amount2][3]) << 16; | ||
| 1851 | /* Program PWR_CKS_CNTL. CKS_LDO_REFSEL */ | ||
| 1852 | value |= (polaris10_clock_stretcher_lookup_table[stretch_amount2][2]) << 18; | ||
| 1853 | /* Program PWR_CKS_CNTL. CKS_STRETCH_AMOUNT */ | ||
| 1854 | value |= (polaris10_clock_stretch_amount_conversion | ||
| 1855 | [polaris10_clock_stretcher_lookup_table[stretch_amount2][3]] | ||
| 1856 | [stretch_amount]) << 3; | ||
| 1857 | } | ||
| 1858 | CONVERT_FROM_HOST_TO_SMC_US(data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].minFreq); | ||
| 1859 | CONVERT_FROM_HOST_TO_SMC_US(data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].maxFreq); | ||
| 1860 | data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].setting = | ||
| 1861 | polaris10_clock_stretcher_lookup_table[stretch_amount2][2] & 0x7F; | ||
| 1862 | data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].setting |= | ||
| 1863 | (polaris10_clock_stretcher_lookup_table[stretch_amount2][3]) << 7; | ||
| 1864 | |||
| 1865 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, | ||
| 1866 | ixPWR_CKS_CNTL, value); | ||
| 1867 | |||
| 1868 | /* Populate DDT Lookup Table */ | ||
| 1869 | for (i = 0; i < 4; i++) { | ||
| 1870 | /* Assign the minimum and maximum VID stored | ||
| 1871 | * in the last row of Clock Stretcher Voltage Table. | ||
| 1872 | */ | ||
| 1873 | data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].minVID = | ||
| 1874 | (uint8_t) polaris10_clock_stretcher_ddt_table[type][i][2]; | ||
| 1875 | data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].maxVID = | ||
| 1876 | (uint8_t) polaris10_clock_stretcher_ddt_table[type][i][3]; | ||
| 1877 | /* Loop through each SCLK and check the frequency | ||
| 1878 | * to see if it lies within the frequency for clock stretcher. | ||
| 1879 | */ | ||
| 1880 | for (j = 0; j < data->smc_state_table.GraphicsDpmLevelCount; j++) { | ||
| 1881 | cks_setting = 0; | ||
| 1882 | clock_freq = PP_SMC_TO_HOST_UL( | ||
| 1883 | data->smc_state_table.GraphicsLevel[j].SclkSetting.SclkFrequency); | ||
| 1884 | /* Check the allowed frequency against the sclk level[j]. | ||
| 1885 | * Sclk's endianness has already been converted, | ||
| 1886 | * and it's in 10Khz unit, | ||
| 1887 | * as opposed to Data table, which is in Mhz unit. | ||
| 1888 | */ | ||
| 1889 | if (clock_freq >= (polaris10_clock_stretcher_ddt_table[type][i][0]) * 100) { | ||
| 1890 | cks_setting |= 0x2; | ||
| 1891 | if (clock_freq < (polaris10_clock_stretcher_ddt_table[type][i][1]) * 100) | ||
| 1892 | cks_setting |= 0x1; | ||
| 1893 | } | ||
| 1894 | data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].setting | ||
| 1895 | |= cks_setting << (j * 2); | ||
| 1896 | } | ||
| 1897 | CONVERT_FROM_HOST_TO_SMC_US( | ||
| 1898 | data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].setting); | ||
| 1899 | } | ||
| 1900 | |||
| 1901 | value = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixPWR_CKS_CNTL); | 1821 | value = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixPWR_CKS_CNTL); |
| 1902 | value &= 0xFFFFFFFE; | 1822 | value &= 0xFFFFFFFE; |
| 1903 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixPWR_CKS_CNTL, value); | 1823 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixPWR_CKS_CNTL, value); |
| @@ -1956,6 +1876,90 @@ static int polaris10_populate_vr_config(struct pp_hwmgr *hwmgr, | |||
| 1956 | return 0; | 1876 | return 0; |
| 1957 | } | 1877 | } |
| 1958 | 1878 | ||
| 1879 | |||
| 1880 | int polaris10_populate_avfs_parameters(struct pp_hwmgr *hwmgr) | ||
| 1881 | { | ||
| 1882 | struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); | ||
| 1883 | SMU74_Discrete_DpmTable *table = &(data->smc_state_table); | ||
| 1884 | int result = 0; | ||
| 1885 | struct pp_atom_ctrl__avfs_parameters avfs_params = {0}; | ||
| 1886 | AVFS_meanNsigma_t AVFS_meanNsigma = { {0} }; | ||
| 1887 | AVFS_Sclk_Offset_t AVFS_SclkOffset = { {0} }; | ||
| 1888 | uint32_t tmp, i; | ||
| 1889 | struct pp_smumgr *smumgr = hwmgr->smumgr; | ||
| 1890 | struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend); | ||
| 1891 | |||
| 1892 | struct phm_ppt_v1_information *table_info = | ||
| 1893 | (struct phm_ppt_v1_information *)hwmgr->pptable; | ||
| 1894 | struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = | ||
| 1895 | table_info->vdd_dep_on_sclk; | ||
| 1896 | |||
| 1897 | |||
| 1898 | if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED) | ||
| 1899 | return result; | ||
| 1900 | |||
| 1901 | result = atomctrl_get_avfs_information(hwmgr, &avfs_params); | ||
| 1902 | |||
| 1903 | if (0 == result) { | ||
| 1904 | table->BTCGB_VDROOP_TABLE[0].a0 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSON_a0); | ||
| 1905 | table->BTCGB_VDROOP_TABLE[0].a1 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSON_a1); | ||
| 1906 | table->BTCGB_VDROOP_TABLE[0].a2 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSON_a2); | ||
| 1907 | table->BTCGB_VDROOP_TABLE[1].a0 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a0); | ||
| 1908 | table->BTCGB_VDROOP_TABLE[1].a1 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a1); | ||
| 1909 | table->BTCGB_VDROOP_TABLE[1].a2 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a2); | ||
| 1910 | table->AVFSGB_VDROOP_TABLE[0].m1 = PP_HOST_TO_SMC_UL(avfs_params.ulAVFSGB_FUSE_TABLE_CKSON_m1); | ||
| 1911 | table->AVFSGB_VDROOP_TABLE[0].m2 = PP_HOST_TO_SMC_US(avfs_params.usAVFSGB_FUSE_TABLE_CKSON_m2); | ||
| 1912 | table->AVFSGB_VDROOP_TABLE[0].b = PP_HOST_TO_SMC_UL(avfs_params.ulAVFSGB_FUSE_TABLE_CKSON_b); | ||
| 1913 | table->AVFSGB_VDROOP_TABLE[0].m1_shift = 24; | ||
| 1914 | table->AVFSGB_VDROOP_TABLE[0].m2_shift = 12; | ||
| 1915 | table->AVFSGB_VDROOP_TABLE[1].m1 = PP_HOST_TO_SMC_UL(avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_m1); | ||
| 1916 | table->AVFSGB_VDROOP_TABLE[1].m2 = PP_HOST_TO_SMC_US(avfs_params.usAVFSGB_FUSE_TABLE_CKSOFF_m2); | ||
| 1917 | table->AVFSGB_VDROOP_TABLE[1].b = PP_HOST_TO_SMC_UL(avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_b); | ||
| 1918 | table->AVFSGB_VDROOP_TABLE[1].m1_shift = 24; | ||
| 1919 | table->AVFSGB_VDROOP_TABLE[1].m2_shift = 12; | ||
| 1920 | table->MaxVoltage = PP_HOST_TO_SMC_US(avfs_params.usMaxVoltage_0_25mv); | ||
| 1921 | AVFS_meanNsigma.Aconstant[0] = PP_HOST_TO_SMC_UL(avfs_params.ulAVFS_meanNsigma_Acontant0); | ||
| 1922 | AVFS_meanNsigma.Aconstant[1] = PP_HOST_TO_SMC_UL(avfs_params.ulAVFS_meanNsigma_Acontant1); | ||
| 1923 | AVFS_meanNsigma.Aconstant[2] = PP_HOST_TO_SMC_UL(avfs_params.ulAVFS_meanNsigma_Acontant2); | ||
| 1924 | AVFS_meanNsigma.DC_tol_sigma = PP_HOST_TO_SMC_US(avfs_params.usAVFS_meanNsigma_DC_tol_sigma); | ||
| 1925 | AVFS_meanNsigma.Platform_mean = PP_HOST_TO_SMC_US(avfs_params.usAVFS_meanNsigma_Platform_mean); | ||
| 1926 | AVFS_meanNsigma.PSM_Age_CompFactor = PP_HOST_TO_SMC_US(avfs_params.usPSM_Age_ComFactor); | ||
| 1927 | AVFS_meanNsigma.Platform_sigma = PP_HOST_TO_SMC_US(avfs_params.usAVFS_meanNsigma_Platform_sigma); | ||
| 1928 | |||
| 1929 | for (i = 0; i < NUM_VFT_COLUMNS; i++) { | ||
| 1930 | AVFS_meanNsigma.Static_Voltage_Offset[i] = (uint8_t)(sclk_table->entries[i].cks_voffset * 100 / 625); | ||
| 1931 | AVFS_SclkOffset.Sclk_Offset[i] = PP_HOST_TO_SMC_US((uint16_t)(sclk_table->entries[i].sclk_offset) / 100); | ||
| 1932 | } | ||
| 1933 | |||
| 1934 | result = polaris10_read_smc_sram_dword(smumgr, | ||
| 1935 | SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, AvfsMeanNSigma), | ||
| 1936 | &tmp, data->sram_end); | ||
| 1937 | |||
| 1938 | polaris10_copy_bytes_to_smc(smumgr, | ||
| 1939 | tmp, | ||
| 1940 | (uint8_t *)&AVFS_meanNsigma, | ||
| 1941 | sizeof(AVFS_meanNsigma_t), | ||
| 1942 | data->sram_end); | ||
| 1943 | |||
| 1944 | result = polaris10_read_smc_sram_dword(smumgr, | ||
| 1945 | SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, AvfsSclkOffsetTable), | ||
| 1946 | &tmp, data->sram_end); | ||
| 1947 | polaris10_copy_bytes_to_smc(smumgr, | ||
| 1948 | tmp, | ||
| 1949 | (uint8_t *)&AVFS_SclkOffset, | ||
| 1950 | sizeof(AVFS_Sclk_Offset_t), | ||
| 1951 | data->sram_end); | ||
| 1952 | |||
| 1953 | data->avfs_vdroop_override_setting = (avfs_params.ucEnableGB_VDROOP_TABLE_CKSON << BTCGB0_Vdroop_Enable_SHIFT) | | ||
| 1954 | (avfs_params.ucEnableGB_VDROOP_TABLE_CKSOFF << BTCGB1_Vdroop_Enable_SHIFT) | | ||
| 1955 | (avfs_params.ucEnableGB_FUSE_TABLE_CKSON << AVFSGB0_Vdroop_Enable_SHIFT) | | ||
| 1956 | (avfs_params.ucEnableGB_FUSE_TABLE_CKSOFF << AVFSGB1_Vdroop_Enable_SHIFT); | ||
| 1957 | data->apply_avfs_cks_off_voltage = (avfs_params.ucEnableApplyAVFS_CKS_OFF_Voltage == 1) ? true : false; | ||
| 1958 | } | ||
| 1959 | return result; | ||
| 1960 | } | ||
| 1961 | |||
| 1962 | |||
| 1959 | /** | 1963 | /** |
| 1960 | * Initializes the SMC table and uploads it | 1964 | * Initializes the SMC table and uploads it |
| 1961 | * | 1965 | * |
| @@ -2056,6 +2060,10 @@ static int polaris10_init_smc_table(struct pp_hwmgr *hwmgr) | |||
| 2056 | "Failed to populate Clock Stretcher Data Table!", | 2060 | "Failed to populate Clock Stretcher Data Table!", |
| 2057 | return result); | 2061 | return result); |
| 2058 | } | 2062 | } |
| 2063 | |||
| 2064 | result = polaris10_populate_avfs_parameters(hwmgr); | ||
| 2065 | PP_ASSERT_WITH_CODE(0 == result, "Failed to populate AVFS Parameters!", return result;); | ||
| 2066 | |||
| 2059 | table->CurrSclkPllRange = 0xff; | 2067 | table->CurrSclkPllRange = 0xff; |
| 2060 | table->GraphicsVoltageChangeEnable = 1; | 2068 | table->GraphicsVoltageChangeEnable = 1; |
| 2061 | table->GraphicsThermThrottleEnable = 1; | 2069 | table->GraphicsThermThrottleEnable = 1; |
| @@ -2252,6 +2260,9 @@ static int polaris10_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr) | |||
| 2252 | static int polaris10_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr) | 2260 | static int polaris10_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr) |
| 2253 | { | 2261 | { |
| 2254 | struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); | 2262 | struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); |
| 2263 | uint32_t soft_register_value = 0; | ||
| 2264 | uint32_t handshake_disables_offset = data->soft_regs_start | ||
| 2265 | + offsetof(SMU74_SoftRegisters, HandshakeDisables); | ||
| 2255 | 2266 | ||
| 2256 | /* enable SCLK dpm */ | 2267 | /* enable SCLK dpm */ |
| 2257 | if (!data->sclk_dpm_key_disabled) | 2268 | if (!data->sclk_dpm_key_disabled) |
| @@ -2262,6 +2273,12 @@ static int polaris10_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr) | |||
| 2262 | 2273 | ||
| 2263 | /* enable MCLK dpm */ | 2274 | /* enable MCLK dpm */ |
| 2264 | if (0 == data->mclk_dpm_key_disabled) { | 2275 | if (0 == data->mclk_dpm_key_disabled) { |
| 2276 | /* Disable UVD - SMU handshake for MCLK. */ | ||
| 2277 | soft_register_value = cgs_read_ind_register(hwmgr->device, | ||
| 2278 | CGS_IND_REG__SMC, handshake_disables_offset); | ||
| 2279 | soft_register_value |= SMU7_UVD_MCLK_HANDSHAKE_DISABLE; | ||
| 2280 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, | ||
| 2281 | handshake_disables_offset, soft_register_value); | ||
| 2265 | 2282 | ||
| 2266 | PP_ASSERT_WITH_CODE( | 2283 | PP_ASSERT_WITH_CODE( |
| 2267 | (0 == smum_send_msg_to_smc(hwmgr->smumgr, | 2284 | (0 == smum_send_msg_to_smc(hwmgr->smumgr, |
| @@ -2269,7 +2286,6 @@ static int polaris10_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr) | |||
| 2269 | "Failed to enable MCLK DPM during DPM Start Function!", | 2286 | "Failed to enable MCLK DPM during DPM Start Function!", |
| 2270 | return -1); | 2287 | return -1); |
| 2271 | 2288 | ||
| 2272 | |||
| 2273 | PHM_WRITE_FIELD(hwmgr->device, MC_SEQ_CNTL_3, CAC_EN, 0x1); | 2289 | PHM_WRITE_FIELD(hwmgr->device, MC_SEQ_CNTL_3, CAC_EN, 0x1); |
| 2274 | 2290 | ||
| 2275 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_MC0_CNTL, 0x5); | 2291 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_MC0_CNTL, 0x5); |
| @@ -2606,6 +2622,7 @@ int polaris10_set_features_platform_caps(struct pp_hwmgr *hwmgr) | |||
| 2606 | 2622 | ||
| 2607 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, | 2623 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, |
| 2608 | PHM_PlatformCaps_FanSpeedInTableIsRPM); | 2624 | PHM_PlatformCaps_FanSpeedInTableIsRPM); |
| 2625 | |||
| 2609 | if (hwmgr->chip_id == CHIP_POLARIS11) | 2626 | if (hwmgr->chip_id == CHIP_POLARIS11) |
| 2610 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, | 2627 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, |
| 2611 | PHM_PlatformCaps_SPLLShutdownSupport); | 2628 | PHM_PlatformCaps_SPLLShutdownSupport); |
| @@ -2938,6 +2955,11 @@ int polaris10_hwmgr_backend_init(struct pp_hwmgr *hwmgr) | |||
| 2938 | data->vddci_control = POLARIS10_VOLTAGE_CONTROL_NONE; | 2955 | data->vddci_control = POLARIS10_VOLTAGE_CONTROL_NONE; |
| 2939 | data->mvdd_control = POLARIS10_VOLTAGE_CONTROL_NONE; | 2956 | data->mvdd_control = POLARIS10_VOLTAGE_CONTROL_NONE; |
| 2940 | 2957 | ||
| 2958 | data->enable_tdc_limit_feature = true; | ||
| 2959 | data->enable_pkg_pwr_tracking_feature = true; | ||
| 2960 | data->force_pcie_gen = PP_PCIEGenInvalid; | ||
| 2961 | data->mclk_stutter_mode_threshold = 40000; | ||
| 2962 | |||
| 2941 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, | 2963 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, |
| 2942 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) | 2964 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) |
| 2943 | data->voltage_control = POLARIS10_VOLTAGE_CONTROL_BY_SVID2; | 2965 | data->voltage_control = POLARIS10_VOLTAGE_CONTROL_BY_SVID2; |
| @@ -2962,6 +2984,10 @@ int polaris10_hwmgr_backend_init(struct pp_hwmgr *hwmgr) | |||
| 2962 | data->vddci_control = POLARIS10_VOLTAGE_CONTROL_BY_SVID2; | 2984 | data->vddci_control = POLARIS10_VOLTAGE_CONTROL_BY_SVID2; |
| 2963 | } | 2985 | } |
| 2964 | 2986 | ||
| 2987 | if (table_info->cac_dtp_table->usClockStretchAmount != 0) | ||
| 2988 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, | ||
| 2989 | PHM_PlatformCaps_ClockStretcher); | ||
| 2990 | |||
| 2965 | polaris10_set_features_platform_caps(hwmgr); | 2991 | polaris10_set_features_platform_caps(hwmgr); |
| 2966 | 2992 | ||
| 2967 | polaris10_init_dpm_defaults(hwmgr); | 2993 | polaris10_init_dpm_defaults(hwmgr); |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h index beedf35cbfa6..d717789441f5 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h | |||
| @@ -312,6 +312,9 @@ struct polaris10_hwmgr { | |||
| 312 | 312 | ||
| 313 | /* soft pptable for re-uploading into smu */ | 313 | /* soft pptable for re-uploading into smu */ |
| 314 | void *soft_pp_table; | 314 | void *soft_pp_table; |
| 315 | |||
| 316 | uint32_t avfs_vdroop_override_setting; | ||
| 317 | bool apply_avfs_cks_off_voltage; | ||
| 315 | }; | 318 | }; |
| 316 | 319 | ||
| 317 | /* To convert to Q8.8 format for firmware */ | 320 | /* To convert to Q8.8 format for firmware */ |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.c b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.c index aba167f7d167..b206632d4650 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.c | |||
| @@ -625,10 +625,14 @@ static int tf_polaris10_thermal_avfs_enable(struct pp_hwmgr *hwmgr, | |||
| 625 | int ret; | 625 | int ret; |
| 626 | struct pp_smumgr *smumgr = (struct pp_smumgr *)(hwmgr->smumgr); | 626 | struct pp_smumgr *smumgr = (struct pp_smumgr *)(hwmgr->smumgr); |
| 627 | struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend); | 627 | struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend); |
| 628 | struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend); | ||
| 628 | 629 | ||
| 629 | if (smu_data->avfs.avfs_btc_status != AVFS_BTC_ENABLEAVFS) | 630 | if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED) |
| 630 | return 0; | 631 | return 0; |
| 631 | 632 | ||
| 633 | ret = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, | ||
| 634 | PPSMC_MSG_SetGBDroopSettings, data->avfs_vdroop_override_setting); | ||
| 635 | |||
| 632 | ret = (smum_send_msg_to_smc(smumgr, PPSMC_MSG_EnableAvfs) == 0) ? | 636 | ret = (smum_send_msg_to_smc(smumgr, PPSMC_MSG_EnableAvfs) == 0) ? |
| 633 | 0 : -1; | 637 | 0 : -1; |
| 634 | 638 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c index 58742e0d1492..a3c38bbd1e94 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c | |||
| @@ -44,6 +44,20 @@ bool acpi_atcs_functions_supported(void *device, uint32_t index) | |||
| 44 | return result == 0 ? (output_buf.function_bits & (1 << (index - 1))) != 0 : false; | 44 | return result == 0 ? (output_buf.function_bits & (1 << (index - 1))) != 0 : false; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | bool acpi_atcs_notify_pcie_device_ready(void *device) | ||
| 48 | { | ||
| 49 | int32_t temp_buffer = 1; | ||
| 50 | |||
| 51 | return cgs_call_acpi_method(device, CGS_ACPI_METHOD_ATCS, | ||
| 52 | ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION, | ||
| 53 | &temp_buffer, | ||
| 54 | NULL, | ||
| 55 | 0, | ||
| 56 | sizeof(temp_buffer), | ||
| 57 | 0); | ||
| 58 | } | ||
| 59 | |||
| 60 | |||
| 47 | int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise) | 61 | int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise) |
| 48 | { | 62 | { |
| 49 | struct atcs_pref_req_input atcs_input; | 63 | struct atcs_pref_req_input atcs_input; |
| @@ -52,7 +66,7 @@ int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise) | |||
| 52 | int result; | 66 | int result; |
| 53 | struct cgs_system_info info = {0}; | 67 | struct cgs_system_info info = {0}; |
| 54 | 68 | ||
| 55 | if (!acpi_atcs_functions_supported(device, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST)) | 69 | if( 0 != acpi_atcs_notify_pcie_device_ready(device)) |
| 56 | return -EINVAL; | 70 | return -EINVAL; |
| 57 | 71 | ||
| 58 | info.size = sizeof(struct cgs_system_info); | 72 | info.size = sizeof(struct cgs_system_info); |
| @@ -77,7 +91,7 @@ int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise) | |||
| 77 | ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, | 91 | ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, |
| 78 | &atcs_input, | 92 | &atcs_input, |
| 79 | &atcs_output, | 93 | &atcs_output, |
| 80 | 0, | 94 | 1, |
| 81 | sizeof(atcs_input), | 95 | sizeof(atcs_input), |
| 82 | sizeof(atcs_output)); | 96 | sizeof(atcs_output)); |
| 83 | if (result != 0) | 97 | if (result != 0) |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c index da9f5f1b6dc2..bf4e18fd3872 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c | |||
| @@ -1302,3 +1302,46 @@ int atomctrl_get_smc_sclk_range_table(struct pp_hwmgr *hwmgr, struct pp_atom_ctr | |||
| 1302 | 1302 | ||
| 1303 | return 0; | 1303 | return 0; |
| 1304 | } | 1304 | } |
| 1305 | |||
| 1306 | int atomctrl_get_avfs_information(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl__avfs_parameters *param) | ||
| 1307 | { | ||
| 1308 | ATOM_ASIC_PROFILING_INFO_V3_6 *profile = NULL; | ||
| 1309 | |||
| 1310 | if (param == NULL) | ||
| 1311 | return -EINVAL; | ||
| 1312 | |||
| 1313 | profile = (ATOM_ASIC_PROFILING_INFO_V3_6 *) | ||
| 1314 | cgs_atom_get_data_table(hwmgr->device, | ||
| 1315 | GetIndexIntoMasterTable(DATA, ASIC_ProfilingInfo), | ||
| 1316 | NULL, NULL, NULL); | ||
| 1317 | if (!profile) | ||
| 1318 | return -1; | ||
| 1319 | |||
| 1320 | param->ulAVFS_meanNsigma_Acontant0 = profile->ulAVFS_meanNsigma_Acontant0; | ||
| 1321 | param->ulAVFS_meanNsigma_Acontant1 = profile->ulAVFS_meanNsigma_Acontant1; | ||
| 1322 | param->ulAVFS_meanNsigma_Acontant2 = profile->ulAVFS_meanNsigma_Acontant2; | ||
| 1323 | param->usAVFS_meanNsigma_DC_tol_sigma = profile->usAVFS_meanNsigma_DC_tol_sigma; | ||
| 1324 | param->usAVFS_meanNsigma_Platform_mean = profile->usAVFS_meanNsigma_Platform_mean; | ||
| 1325 | param->usAVFS_meanNsigma_Platform_sigma = profile->usAVFS_meanNsigma_Platform_sigma; | ||
| 1326 | param->ulGB_VDROOP_TABLE_CKSOFF_a0 = profile->ulGB_VDROOP_TABLE_CKSOFF_a0; | ||
| 1327 | param->ulGB_VDROOP_TABLE_CKSOFF_a1 = profile->ulGB_VDROOP_TABLE_CKSOFF_a1; | ||
| 1328 | param->ulGB_VDROOP_TABLE_CKSOFF_a2 = profile->ulGB_VDROOP_TABLE_CKSOFF_a2; | ||
| 1329 | param->ulGB_VDROOP_TABLE_CKSON_a0 = profile->ulGB_VDROOP_TABLE_CKSON_a0; | ||
| 1330 | param->ulGB_VDROOP_TABLE_CKSON_a1 = profile->ulGB_VDROOP_TABLE_CKSON_a1; | ||
| 1331 | param->ulGB_VDROOP_TABLE_CKSON_a2 = profile->ulGB_VDROOP_TABLE_CKSON_a2; | ||
| 1332 | param->ulAVFSGB_FUSE_TABLE_CKSOFF_m1 = profile->ulAVFSGB_FUSE_TABLE_CKSOFF_m1; | ||
| 1333 | param->usAVFSGB_FUSE_TABLE_CKSOFF_m2 = profile->usAVFSGB_FUSE_TABLE_CKSOFF_m2; | ||
| 1334 | param->ulAVFSGB_FUSE_TABLE_CKSOFF_b = profile->ulAVFSGB_FUSE_TABLE_CKSOFF_b; | ||
| 1335 | param->ulAVFSGB_FUSE_TABLE_CKSON_m1 = profile->ulAVFSGB_FUSE_TABLE_CKSON_m1; | ||
| 1336 | param->usAVFSGB_FUSE_TABLE_CKSON_m2 = profile->usAVFSGB_FUSE_TABLE_CKSON_m2; | ||
| 1337 | param->ulAVFSGB_FUSE_TABLE_CKSON_b = profile->ulAVFSGB_FUSE_TABLE_CKSON_b; | ||
| 1338 | param->usMaxVoltage_0_25mv = profile->usMaxVoltage_0_25mv; | ||
| 1339 | param->ucEnableGB_VDROOP_TABLE_CKSOFF = profile->ucEnableGB_VDROOP_TABLE_CKSOFF; | ||
| 1340 | param->ucEnableGB_VDROOP_TABLE_CKSON = profile->ucEnableGB_VDROOP_TABLE_CKSON; | ||
| 1341 | param->ucEnableGB_FUSE_TABLE_CKSOFF = profile->ucEnableGB_FUSE_TABLE_CKSOFF; | ||
| 1342 | param->ucEnableGB_FUSE_TABLE_CKSON = profile->ucEnableGB_FUSE_TABLE_CKSON; | ||
| 1343 | param->usPSM_Age_ComFactor = profile->usPSM_Age_ComFactor; | ||
| 1344 | param->ucEnableApplyAVFS_CKS_OFF_Voltage = profile->ucEnableApplyAVFS_CKS_OFF_Voltage; | ||
| 1345 | |||
| 1346 | return 0; | ||
| 1347 | } | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h index d24ebb566905..248c5db5f380 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h | |||
| @@ -250,6 +250,35 @@ struct pp_atomctrl_gpio_pin_assignment { | |||
| 250 | }; | 250 | }; |
| 251 | typedef struct pp_atomctrl_gpio_pin_assignment pp_atomctrl_gpio_pin_assignment; | 251 | typedef struct pp_atomctrl_gpio_pin_assignment pp_atomctrl_gpio_pin_assignment; |
| 252 | 252 | ||
| 253 | struct pp_atom_ctrl__avfs_parameters { | ||
| 254 | uint32_t ulAVFS_meanNsigma_Acontant0; | ||
| 255 | uint32_t ulAVFS_meanNsigma_Acontant1; | ||
| 256 | uint32_t ulAVFS_meanNsigma_Acontant2; | ||
| 257 | uint16_t usAVFS_meanNsigma_DC_tol_sigma; | ||
| 258 | uint16_t usAVFS_meanNsigma_Platform_mean; | ||
| 259 | uint16_t usAVFS_meanNsigma_Platform_sigma; | ||
| 260 | uint32_t ulGB_VDROOP_TABLE_CKSOFF_a0; | ||
| 261 | uint32_t ulGB_VDROOP_TABLE_CKSOFF_a1; | ||
| 262 | uint32_t ulGB_VDROOP_TABLE_CKSOFF_a2; | ||
| 263 | uint32_t ulGB_VDROOP_TABLE_CKSON_a0; | ||
| 264 | uint32_t ulGB_VDROOP_TABLE_CKSON_a1; | ||
| 265 | uint32_t ulGB_VDROOP_TABLE_CKSON_a2; | ||
| 266 | uint32_t ulAVFSGB_FUSE_TABLE_CKSOFF_m1; | ||
| 267 | uint16_t usAVFSGB_FUSE_TABLE_CKSOFF_m2; | ||
| 268 | uint32_t ulAVFSGB_FUSE_TABLE_CKSOFF_b; | ||
| 269 | uint32_t ulAVFSGB_FUSE_TABLE_CKSON_m1; | ||
| 270 | uint16_t usAVFSGB_FUSE_TABLE_CKSON_m2; | ||
| 271 | uint32_t ulAVFSGB_FUSE_TABLE_CKSON_b; | ||
| 272 | uint16_t usMaxVoltage_0_25mv; | ||
| 273 | uint8_t ucEnableGB_VDROOP_TABLE_CKSOFF; | ||
| 274 | uint8_t ucEnableGB_VDROOP_TABLE_CKSON; | ||
| 275 | uint8_t ucEnableGB_FUSE_TABLE_CKSOFF; | ||
| 276 | uint8_t ucEnableGB_FUSE_TABLE_CKSON; | ||
| 277 | uint16_t usPSM_Age_ComFactor; | ||
| 278 | uint8_t ucEnableApplyAVFS_CKS_OFF_Voltage; | ||
| 279 | uint8_t ucReserved; | ||
| 280 | }; | ||
| 281 | |||
| 253 | extern bool atomctrl_get_pp_assign_pin(struct pp_hwmgr *hwmgr, const uint32_t pinId, pp_atomctrl_gpio_pin_assignment *gpio_pin_assignment); | 282 | extern bool atomctrl_get_pp_assign_pin(struct pp_hwmgr *hwmgr, const uint32_t pinId, pp_atomctrl_gpio_pin_assignment *gpio_pin_assignment); |
| 254 | extern int atomctrl_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type, uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage); | 283 | extern int atomctrl_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type, uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage); |
| 255 | extern uint32_t atomctrl_get_mpll_reference_clock(struct pp_hwmgr *hwmgr); | 284 | extern uint32_t atomctrl_get_mpll_reference_clock(struct pp_hwmgr *hwmgr); |
| @@ -278,5 +307,8 @@ extern int atomctrl_set_ac_timing_ai(struct pp_hwmgr *hwmgr, uint32_t memory_clo | |||
| 278 | extern int atomctrl_get_voltage_evv_on_sclk_ai(struct pp_hwmgr *hwmgr, uint8_t voltage_type, | 307 | extern int atomctrl_get_voltage_evv_on_sclk_ai(struct pp_hwmgr *hwmgr, uint8_t voltage_type, |
| 279 | uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage); | 308 | uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage); |
| 280 | extern int atomctrl_get_smc_sclk_range_table(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl_sclk_range_table *table); | 309 | extern int atomctrl_get_smc_sclk_range_table(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl_sclk_range_table *table); |
| 310 | |||
| 311 | extern int atomctrl_get_avfs_information(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl__avfs_parameters *param); | ||
| 312 | |||
| 281 | #endif | 313 | #endif |
| 282 | 314 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c index d27e8c40602a..233eb7f36c1d 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c | |||
| @@ -4489,6 +4489,7 @@ int tonga_hwmgr_backend_init(struct pp_hwmgr *hwmgr) | |||
| 4489 | data->vdd_ci_control = TONGA_VOLTAGE_CONTROL_NONE; | 4489 | data->vdd_ci_control = TONGA_VOLTAGE_CONTROL_NONE; |
| 4490 | data->vdd_gfx_control = TONGA_VOLTAGE_CONTROL_NONE; | 4490 | data->vdd_gfx_control = TONGA_VOLTAGE_CONTROL_NONE; |
| 4491 | data->mvdd_control = TONGA_VOLTAGE_CONTROL_NONE; | 4491 | data->mvdd_control = TONGA_VOLTAGE_CONTROL_NONE; |
| 4492 | data->force_pcie_gen = PP_PCIEGenInvalid; | ||
| 4492 | 4493 | ||
| 4493 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, | 4494 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, |
| 4494 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) { | 4495 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) { |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/polaris10_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/polaris10_ppsmc.h index 0c6a413eaa5b..d41d37ab5b7c 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/polaris10_ppsmc.h +++ b/drivers/gpu/drm/amd/powerplay/inc/polaris10_ppsmc.h | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | 27 | ||
| 28 | #pragma pack(push, 1) | 28 | #pragma pack(push, 1) |
| 29 | 29 | ||
| 30 | #define PPSMC_MSG_SetGBDroopSettings ((uint16_t) 0x305) | ||
| 30 | 31 | ||
| 31 | #define PPSMC_SWSTATE_FLAG_DC 0x01 | 32 | #define PPSMC_SWSTATE_FLAG_DC 0x01 |
| 32 | #define PPSMC_SWSTATE_FLAG_UVD 0x02 | 33 | #define PPSMC_SWSTATE_FLAG_UVD 0x02 |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h b/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h index 3bd5e69b9045..3df5de2cdab0 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h +++ b/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h | |||
| @@ -26,3 +26,4 @@ extern bool acpi_atcs_functions_supported(void *device, | |||
| 26 | extern int acpi_pcie_perf_request(void *device, | 26 | extern int acpi_pcie_perf_request(void *device, |
| 27 | uint8_t perf_req, | 27 | uint8_t perf_req, |
| 28 | bool advertise); | 28 | bool advertise); |
| 29 | extern bool acpi_atcs_notify_pcie_device_ready(void *device); | ||
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu74.h b/drivers/gpu/drm/amd/powerplay/inc/smu74.h index 1a12d85b8e97..fd10a9fa843d 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/smu74.h +++ b/drivers/gpu/drm/amd/powerplay/inc/smu74.h | |||
| @@ -34,6 +34,30 @@ | |||
| 34 | #define SMU__NUM_LCLK_DPM_LEVELS 8 | 34 | #define SMU__NUM_LCLK_DPM_LEVELS 8 |
| 35 | #define SMU__NUM_PCIE_DPM_LEVELS 8 | 35 | #define SMU__NUM_PCIE_DPM_LEVELS 8 |
| 36 | 36 | ||
| 37 | #define EXP_M1 35 | ||
| 38 | #define EXP_M2 92821 | ||
| 39 | #define EXP_B 66629747 | ||
| 40 | |||
| 41 | #define EXP_M1_1 365 | ||
| 42 | #define EXP_M2_1 658700 | ||
| 43 | #define EXP_B_1 305506134 | ||
| 44 | |||
| 45 | #define EXP_M1_2 189 | ||
| 46 | #define EXP_M2_2 379692 | ||
| 47 | #define EXP_B_2 194609469 | ||
| 48 | |||
| 49 | #define EXP_M1_3 99 | ||
| 50 | #define EXP_M2_3 217915 | ||
| 51 | #define EXP_B_3 122255994 | ||
| 52 | |||
| 53 | #define EXP_M1_4 51 | ||
| 54 | #define EXP_M2_4 122643 | ||
| 55 | #define EXP_B_4 74893384 | ||
| 56 | |||
| 57 | #define EXP_M1_5 423 | ||
| 58 | #define EXP_M2_5 1103326 | ||
| 59 | #define EXP_B_5 728122621 | ||
| 60 | |||
| 37 | enum SID_OPTION { | 61 | enum SID_OPTION { |
| 38 | SID_OPTION_HI, | 62 | SID_OPTION_HI, |
| 39 | SID_OPTION_LO, | 63 | SID_OPTION_LO, |
| @@ -548,20 +572,20 @@ struct SMU74_Firmware_Header { | |||
| 548 | uint32_t CacConfigTable; | 572 | uint32_t CacConfigTable; |
| 549 | uint32_t CacStatusTable; | 573 | uint32_t CacStatusTable; |
| 550 | 574 | ||
| 551 | |||
| 552 | uint32_t mcRegisterTable; | 575 | uint32_t mcRegisterTable; |
| 553 | 576 | ||
| 554 | |||
| 555 | uint32_t mcArbDramTimingTable; | 577 | uint32_t mcArbDramTimingTable; |
| 556 | 578 | ||
| 557 | |||
| 558 | |||
| 559 | |||
| 560 | uint32_t PmFuseTable; | 579 | uint32_t PmFuseTable; |
| 561 | uint32_t Globals; | 580 | uint32_t Globals; |
| 562 | uint32_t ClockStretcherTable; | 581 | uint32_t ClockStretcherTable; |
| 563 | uint32_t VftTable; | 582 | uint32_t VftTable; |
| 564 | uint32_t Reserved[21]; | 583 | uint32_t Reserved1; |
| 584 | uint32_t AvfsTable; | ||
| 585 | uint32_t AvfsCksOffGbvTable; | ||
| 586 | uint32_t AvfsMeanNSigma; | ||
| 587 | uint32_t AvfsSclkOffsetTable; | ||
| 588 | uint32_t Reserved[16]; | ||
| 565 | uint32_t Signature; | 589 | uint32_t Signature; |
| 566 | }; | 590 | }; |
| 567 | 591 | ||
| @@ -701,8 +725,6 @@ VR Config info is contained in dpmTable.VRConfig */ | |||
| 701 | struct SMU_ClockStretcherDataTableEntry { | 725 | struct SMU_ClockStretcherDataTableEntry { |
| 702 | uint8_t minVID; | 726 | uint8_t minVID; |
| 703 | uint8_t maxVID; | 727 | uint8_t maxVID; |
| 704 | |||
| 705 | |||
| 706 | uint16_t setting; | 728 | uint16_t setting; |
| 707 | }; | 729 | }; |
| 708 | typedef struct SMU_ClockStretcherDataTableEntry SMU_ClockStretcherDataTableEntry; | 730 | typedef struct SMU_ClockStretcherDataTableEntry SMU_ClockStretcherDataTableEntry; |
| @@ -769,6 +791,43 @@ struct VFT_TABLE_t { | |||
| 769 | typedef struct VFT_TABLE_t VFT_TABLE_t; | 791 | typedef struct VFT_TABLE_t VFT_TABLE_t; |
| 770 | 792 | ||
| 771 | 793 | ||
| 794 | /* Total margin, root mean square of Fmax + DC + Platform */ | ||
| 795 | struct AVFS_Margin_t { | ||
| 796 | VFT_CELL_t Cell[NUM_VFT_COLUMNS]; | ||
| 797 | }; | ||
| 798 | typedef struct AVFS_Margin_t AVFS_Margin_t; | ||
| 799 | |||
| 800 | #define BTCGB_VDROOP_TABLE_MAX_ENTRIES 2 | ||
| 801 | #define AVFSGB_VDROOP_TABLE_MAX_ENTRIES 2 | ||
| 802 | |||
| 803 | struct GB_VDROOP_TABLE_t { | ||
| 804 | int32_t a0; | ||
| 805 | int32_t a1; | ||
| 806 | int32_t a2; | ||
| 807 | uint32_t spare; | ||
| 808 | }; | ||
| 809 | typedef struct GB_VDROOP_TABLE_t GB_VDROOP_TABLE_t; | ||
| 810 | |||
| 811 | struct AVFS_CksOff_Gbv_t { | ||
| 812 | VFT_CELL_t Cell[NUM_VFT_COLUMNS]; | ||
| 813 | }; | ||
| 814 | typedef struct AVFS_CksOff_Gbv_t AVFS_CksOff_Gbv_t; | ||
| 815 | |||
| 816 | struct AVFS_meanNsigma_t { | ||
| 817 | uint32_t Aconstant[3]; | ||
| 818 | uint16_t DC_tol_sigma; | ||
| 819 | uint16_t Platform_mean; | ||
| 820 | uint16_t Platform_sigma; | ||
| 821 | uint16_t PSM_Age_CompFactor; | ||
| 822 | uint8_t Static_Voltage_Offset[NUM_VFT_COLUMNS]; | ||
| 823 | }; | ||
| 824 | typedef struct AVFS_meanNsigma_t AVFS_meanNsigma_t; | ||
| 825 | |||
| 826 | struct AVFS_Sclk_Offset_t { | ||
| 827 | uint16_t Sclk_Offset[8]; | ||
| 828 | }; | ||
| 829 | typedef struct AVFS_Sclk_Offset_t AVFS_Sclk_Offset_t; | ||
| 830 | |||
| 772 | #endif | 831 | #endif |
| 773 | 832 | ||
| 774 | 833 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu74_discrete.h b/drivers/gpu/drm/amd/powerplay/inc/smu74_discrete.h index 0dfe82336dc7..b85ff5400e57 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/smu74_discrete.h +++ b/drivers/gpu/drm/amd/powerplay/inc/smu74_discrete.h | |||
| @@ -223,6 +223,16 @@ struct SMU74_Discrete_StateInfo { | |||
| 223 | 223 | ||
| 224 | typedef struct SMU74_Discrete_StateInfo SMU74_Discrete_StateInfo; | 224 | typedef struct SMU74_Discrete_StateInfo SMU74_Discrete_StateInfo; |
| 225 | 225 | ||
| 226 | struct SMU_QuadraticCoeffs { | ||
| 227 | int32_t m1; | ||
| 228 | uint32_t b; | ||
| 229 | |||
| 230 | int16_t m2; | ||
| 231 | uint8_t m1_shift; | ||
| 232 | uint8_t m2_shift; | ||
| 233 | }; | ||
| 234 | typedef struct SMU_QuadraticCoeffs SMU_QuadraticCoeffs; | ||
| 235 | |||
| 226 | struct SMU74_Discrete_DpmTable { | 236 | struct SMU74_Discrete_DpmTable { |
| 227 | 237 | ||
| 228 | SMU74_PIDController GraphicsPIDController; | 238 | SMU74_PIDController GraphicsPIDController; |
| @@ -258,7 +268,14 @@ struct SMU74_Discrete_DpmTable { | |||
| 258 | uint8_t ThermOutPolarity; | 268 | uint8_t ThermOutPolarity; |
| 259 | uint8_t ThermOutMode; | 269 | uint8_t ThermOutMode; |
| 260 | uint8_t BootPhases; | 270 | uint8_t BootPhases; |
| 261 | uint32_t Reserved[4]; | 271 | |
| 272 | uint8_t VRHotLevel; | ||
| 273 | uint8_t Reserved1[3]; | ||
| 274 | uint16_t FanStartTemperature; | ||
| 275 | uint16_t FanStopTemperature; | ||
| 276 | uint16_t MaxVoltage; | ||
| 277 | uint16_t Reserved2; | ||
| 278 | uint32_t Reserved[1]; | ||
| 262 | 279 | ||
| 263 | SMU74_Discrete_GraphicsLevel GraphicsLevel[SMU74_MAX_LEVELS_GRAPHICS]; | 280 | SMU74_Discrete_GraphicsLevel GraphicsLevel[SMU74_MAX_LEVELS_GRAPHICS]; |
| 264 | SMU74_Discrete_MemoryLevel MemoryACPILevel; | 281 | SMU74_Discrete_MemoryLevel MemoryACPILevel; |
| @@ -347,6 +364,8 @@ struct SMU74_Discrete_DpmTable { | |||
| 347 | 364 | ||
| 348 | uint32_t CurrSclkPllRange; | 365 | uint32_t CurrSclkPllRange; |
| 349 | sclkFcwRange_t SclkFcwRangeTable[NUM_SCLK_RANGE]; | 366 | sclkFcwRange_t SclkFcwRangeTable[NUM_SCLK_RANGE]; |
| 367 | GB_VDROOP_TABLE_t BTCGB_VDROOP_TABLE[BTCGB_VDROOP_TABLE_MAX_ENTRIES]; | ||
| 368 | SMU_QuadraticCoeffs AVFSGB_VDROOP_TABLE[AVFSGB_VDROOP_TABLE_MAX_ENTRIES]; | ||
| 350 | }; | 369 | }; |
| 351 | 370 | ||
| 352 | typedef struct SMU74_Discrete_DpmTable SMU74_Discrete_DpmTable; | 371 | typedef struct SMU74_Discrete_DpmTable SMU74_Discrete_DpmTable; |
| @@ -550,16 +569,6 @@ struct SMU7_AcpiScoreboard { | |||
| 550 | 569 | ||
| 551 | typedef struct SMU7_AcpiScoreboard SMU7_AcpiScoreboard; | 570 | typedef struct SMU7_AcpiScoreboard SMU7_AcpiScoreboard; |
| 552 | 571 | ||
| 553 | struct SMU_QuadraticCoeffs { | ||
| 554 | int32_t m1; | ||
| 555 | uint32_t b; | ||
| 556 | |||
| 557 | int16_t m2; | ||
| 558 | uint8_t m1_shift; | ||
| 559 | uint8_t m2_shift; | ||
| 560 | }; | ||
| 561 | typedef struct SMU_QuadraticCoeffs SMU_QuadraticCoeffs; | ||
| 562 | |||
| 563 | struct SMU74_Discrete_PmFuses { | 572 | struct SMU74_Discrete_PmFuses { |
| 564 | uint8_t BapmVddCVidHiSidd[8]; | 573 | uint8_t BapmVddCVidHiSidd[8]; |
| 565 | uint8_t BapmVddCVidLoSidd[8]; | 574 | uint8_t BapmVddCVidLoSidd[8]; |
| @@ -821,6 +830,17 @@ typedef struct SMU7_GfxCuPgScoreboard SMU7_GfxCuPgScoreboard; | |||
| 821 | #define DB_PCC_SHIFT 26 | 830 | #define DB_PCC_SHIFT 26 |
| 822 | #define DB_EDC_SHIFT 27 | 831 | #define DB_EDC_SHIFT 27 |
| 823 | 832 | ||
| 833 | #define BTCGB0_Vdroop_Enable_MASK 0x1 | ||
| 834 | #define BTCGB1_Vdroop_Enable_MASK 0x2 | ||
| 835 | #define AVFSGB0_Vdroop_Enable_MASK 0x4 | ||
| 836 | #define AVFSGB1_Vdroop_Enable_MASK 0x8 | ||
| 837 | |||
| 838 | #define BTCGB0_Vdroop_Enable_SHIFT 0 | ||
| 839 | #define BTCGB1_Vdroop_Enable_SHIFT 1 | ||
| 840 | #define AVFSGB0_Vdroop_Enable_SHIFT 2 | ||
| 841 | #define AVFSGB1_Vdroop_Enable_SHIFT 3 | ||
| 842 | |||
| 843 | |||
| 824 | #pragma pack(pop) | 844 | #pragma pack(pop) |
| 825 | 845 | ||
| 826 | 846 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c index 043b6ac09d5f..5dba7c509710 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c | |||
| @@ -52,19 +52,18 @@ | |||
| 52 | static const SMU74_Discrete_GraphicsLevel avfs_graphics_level_polaris10[8] = { | 52 | static const SMU74_Discrete_GraphicsLevel avfs_graphics_level_polaris10[8] = { |
| 53 | /* Min pcie DeepSleep Activity CgSpll CgSpll CcPwr CcPwr Sclk Enabled Enabled Voltage Power */ | 53 | /* Min pcie DeepSleep Activity CgSpll CgSpll CcPwr CcPwr Sclk Enabled Enabled Voltage Power */ |
| 54 | /* Voltage, DpmLevel, DivId, Level, FuncCntl3, FuncCntl4, DynRm, DynRm1 Did, Padding,ForActivity, ForThrottle, UpHyst, DownHyst, DownHyst, Throttle */ | 54 | /* Voltage, DpmLevel, DivId, Level, FuncCntl3, FuncCntl4, DynRm, DynRm1 Did, Padding,ForActivity, ForThrottle, UpHyst, DownHyst, DownHyst, Throttle */ |
| 55 | { 0x3c0fd047, 0x00, 0x03, 0x1e00, 0x00200410, 0x87020000, 0, 0, 0x16, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x30750000, 0, 0, 0, 0, 0, 0, 0 } }, | 55 | { 0x100ea446, 0x00, 0x03, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0x30750000, 0x3000, 0, 0x2600, 0, 0, 0x0004, 0x8f02, 0xffff, 0x2f00, 0x300e, 0x2700 } }, |
| 56 | { 0xa00fd047, 0x01, 0x04, 0x1e00, 0x00800510, 0x87020000, 0, 0, 0x16, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x409c0000, 0, 0, 0, 0, 0, 0, 0 } }, | 56 | { 0x400ea446, 0x01, 0x04, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0x409c0000, 0x2000, 0, 0x1e00, 1, 1, 0x0004, 0x8300, 0xffff, 0x1f00, 0xcb5e, 0x1a00 } }, |
| 57 | { 0x0410d047, 0x01, 0x00, 0x1e00, 0x00600410, 0x87020000, 0, 0, 0x0e, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x50c30000, 0, 0, 0, 0, 0, 0, 0 } }, | 57 | { 0x740ea446, 0x01, 0x00, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0x50c30000, 0x2800, 0, 0x2000, 1, 1, 0x0004, 0x0c02, 0xffff, 0x2700, 0x6433, 0x2100 } }, |
| 58 | { 0x6810d047, 0x01, 0x00, 0x1e00, 0x00800410, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x60ea0000, 0, 0, 0, 0, 0, 0, 0 } }, | 58 | { 0xa40ea446, 0x01, 0x00, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0x60ea0000, 0x3000, 0, 0x2600, 1, 1, 0x0004, 0x8f02, 0xffff, 0x2f00, 0x300e, 0x2700 } }, |
| 59 | { 0xcc10d047, 0x01, 0x00, 0x1e00, 0x00e00410, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0xe8fd0000, 0, 0, 0, 0, 0, 0, 0 } }, | 59 | { 0xd80ea446, 0x01, 0x00, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0x70110100, 0x3800, 0, 0x2c00, 1, 1, 0x0004, 0x1203, 0xffff, 0x3600, 0xc9e2, 0x2e00 } }, |
| 60 | { 0x3011d047, 0x01, 0x00, 0x1e00, 0x00400510, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x70110100, 0, 0, 0, 0, 0, 0, 0 } }, | 60 | { 0x3c0fa446, 0x01, 0x00, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0x80380100, 0x2000, 0, 0x1e00, 2, 1, 0x0004, 0x8300, 0xffff, 0x1f00, 0xcb5e, 0x1a00 } }, |
| 61 | { 0x9411d047, 0x01, 0x00, 0x1e00, 0x00a00510, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0xf8240100, 0, 0, 0, 0, 0, 0, 0 } }, | 61 | { 0x6c0fa446, 0x01, 0x00, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0x905f0100, 0x2400, 0, 0x1e00, 2, 1, 0x0004, 0x8901, 0xffff, 0x2300, 0x314c, 0x1d00 } }, |
| 62 | { 0xf811d047, 0x01, 0x00, 0x1e00, 0x00000610, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x80380100, 0, 0, 0, 0, 0, 0, 0 } } | 62 | { 0xa00fa446, 0x01, 0x00, 0x3200, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x00, { 0xa0860100, 0x2800, 0, 0x2000, 2, 1, 0x0004, 0x0c02, 0xffff, 0x2700, 0x6433, 0x2100 } } |
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | static const SMU74_Discrete_MemoryLevel avfs_memory_level_polaris10 = | 65 | static const SMU74_Discrete_MemoryLevel avfs_memory_level_polaris10 = |
| 66 | {0x50140000, 0x50140000, 0x00320000, 0x00, 0x00, | 66 | {0x100ea446, 0, 0x30750000, 0x01, 0x01, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x1f00, 0x00, 0x00}; |
| 67 | 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0000, 0x00, 0x00}; | ||
| 68 | 67 | ||
| 69 | /** | 68 | /** |
| 70 | * Set the address for reading/writing the SMC SRAM space. | 69 | * Set the address for reading/writing the SMC SRAM space. |
| @@ -219,6 +218,18 @@ bool polaris10_is_smc_ram_running(struct pp_smumgr *smumgr) | |||
| 219 | && (0x20100 <= cgs_read_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMC_PC_C))); | 218 | && (0x20100 <= cgs_read_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMC_PC_C))); |
| 220 | } | 219 | } |
| 221 | 220 | ||
| 221 | static bool polaris10_is_hw_avfs_present(struct pp_smumgr *smumgr) | ||
| 222 | { | ||
| 223 | uint32_t efuse; | ||
| 224 | |||
| 225 | efuse = cgs_read_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMU_EFUSE_0 + (49*4)); | ||
| 226 | efuse &= 0x00000001; | ||
| 227 | if (efuse) | ||
| 228 | return true; | ||
| 229 | |||
| 230 | return false; | ||
| 231 | } | ||
| 232 | |||
| 222 | /** | 233 | /** |
| 223 | * Send a message to the SMC, and wait for its response. | 234 | * Send a message to the SMC, and wait for its response. |
| 224 | * | 235 | * |
| @@ -228,21 +239,27 @@ bool polaris10_is_smc_ram_running(struct pp_smumgr *smumgr) | |||
| 228 | */ | 239 | */ |
| 229 | int polaris10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg) | 240 | int polaris10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg) |
| 230 | { | 241 | { |
| 242 | int ret; | ||
| 243 | |||
| 231 | if (!polaris10_is_smc_ram_running(smumgr)) | 244 | if (!polaris10_is_smc_ram_running(smumgr)) |
| 232 | return -1; | 245 | return -1; |
| 233 | 246 | ||
| 247 | |||
| 234 | SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0); | 248 | SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0); |
| 235 | 249 | ||
| 236 | if (1 != SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP)) | 250 | ret = SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP); |
| 237 | printk("Failed to send Previous Message.\n"); | ||
| 238 | 251 | ||
| 252 | if (ret != 1) | ||
| 253 | printk("\n failed to send pre message %x ret is %d \n", msg, ret); | ||
| 239 | 254 | ||
| 240 | cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg); | 255 | cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg); |
| 241 | 256 | ||
| 242 | SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0); | 257 | SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0); |
| 243 | 258 | ||
| 244 | if (1 != SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP)) | 259 | ret = SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP); |
| 245 | printk("Failed to send Message.\n"); | 260 | |
| 261 | if (ret != 1) | ||
| 262 | printk("\n failed to send message %x ret is %d \n", msg, ret); | ||
| 246 | 263 | ||
| 247 | return 0; | 264 | return 0; |
| 248 | } | 265 | } |
| @@ -953,6 +970,11 @@ static int polaris10_smu_init(struct pp_smumgr *smumgr) | |||
| 953 | (cgs_handle_t)smu_data->smu_buffer.handle); | 970 | (cgs_handle_t)smu_data->smu_buffer.handle); |
| 954 | return -1;); | 971 | return -1;); |
| 955 | 972 | ||
| 973 | if (polaris10_is_hw_avfs_present(smumgr)) | ||
| 974 | smu_data->avfs.avfs_btc_status = AVFS_BTC_BOOT; | ||
| 975 | else | ||
| 976 | smu_data->avfs.avfs_btc_status = AVFS_BTC_NOTSUPPORTED; | ||
| 977 | |||
| 956 | return 0; | 978 | return 0; |
| 957 | } | 979 | } |
| 958 | 980 | ||
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c index 39802c0539b6..3d34fc4ca826 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | |||
| @@ -266,9 +266,10 @@ int atmel_hlcdc_create_outputs(struct drm_device *dev) | |||
| 266 | if (!ret) | 266 | if (!ret) |
| 267 | ret = atmel_hlcdc_check_endpoint(dev, &ep); | 267 | ret = atmel_hlcdc_check_endpoint(dev, &ep); |
| 268 | 268 | ||
| 269 | of_node_put(ep_np); | 269 | if (ret) { |
| 270 | if (ret) | 270 | of_node_put(ep_np); |
| 271 | return ret; | 271 | return ret; |
| 272 | } | ||
| 272 | } | 273 | } |
| 273 | 274 | ||
| 274 | for_each_endpoint_of_node(dev->dev->of_node, ep_np) { | 275 | for_each_endpoint_of_node(dev->dev->of_node, ep_np) { |
| @@ -276,9 +277,10 @@ int atmel_hlcdc_create_outputs(struct drm_device *dev) | |||
| 276 | if (!ret) | 277 | if (!ret) |
| 277 | ret = atmel_hlcdc_attach_endpoint(dev, &ep); | 278 | ret = atmel_hlcdc_attach_endpoint(dev, &ep); |
| 278 | 279 | ||
| 279 | of_node_put(ep_np); | 280 | if (ret) { |
| 280 | if (ret) | 281 | of_node_put(ep_np); |
| 281 | return ret; | 282 | return ret; |
| 283 | } | ||
| 282 | } | 284 | } |
| 283 | 285 | ||
| 284 | return 0; | 286 | return 0; |
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c index aef3ca8a81fa..016c191221f3 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | |||
| @@ -339,6 +339,8 @@ atmel_hlcdc_plane_update_pos_and_size(struct atmel_hlcdc_plane *plane, | |||
| 339 | 339 | ||
| 340 | atmel_hlcdc_layer_update_cfg(&plane->layer, 13, 0xffffffff, | 340 | atmel_hlcdc_layer_update_cfg(&plane->layer, 13, 0xffffffff, |
| 341 | factor_reg); | 341 | factor_reg); |
| 342 | } else { | ||
| 343 | atmel_hlcdc_layer_update_cfg(&plane->layer, 13, 0xffffffff, 0); | ||
| 342 | } | 344 | } |
| 343 | } | 345 | } |
| 344 | 346 | ||
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index c204ef32df16..9bb99e274d23 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c | |||
| @@ -1296,14 +1296,39 @@ EXPORT_SYMBOL(drm_atomic_add_affected_planes); | |||
| 1296 | */ | 1296 | */ |
| 1297 | void drm_atomic_legacy_backoff(struct drm_atomic_state *state) | 1297 | void drm_atomic_legacy_backoff(struct drm_atomic_state *state) |
| 1298 | { | 1298 | { |
| 1299 | struct drm_device *dev = state->dev; | ||
| 1300 | unsigned crtc_mask = 0; | ||
| 1301 | struct drm_crtc *crtc; | ||
| 1299 | int ret; | 1302 | int ret; |
| 1303 | bool global = false; | ||
| 1304 | |||
| 1305 | drm_for_each_crtc(crtc, dev) { | ||
| 1306 | if (crtc->acquire_ctx != state->acquire_ctx) | ||
| 1307 | continue; | ||
| 1308 | |||
| 1309 | crtc_mask |= drm_crtc_mask(crtc); | ||
| 1310 | crtc->acquire_ctx = NULL; | ||
| 1311 | } | ||
| 1312 | |||
| 1313 | if (WARN_ON(dev->mode_config.acquire_ctx == state->acquire_ctx)) { | ||
| 1314 | global = true; | ||
| 1315 | |||
| 1316 | dev->mode_config.acquire_ctx = NULL; | ||
| 1317 | } | ||
| 1300 | 1318 | ||
| 1301 | retry: | 1319 | retry: |
| 1302 | drm_modeset_backoff(state->acquire_ctx); | 1320 | drm_modeset_backoff(state->acquire_ctx); |
| 1303 | 1321 | ||
| 1304 | ret = drm_modeset_lock_all_ctx(state->dev, state->acquire_ctx); | 1322 | ret = drm_modeset_lock_all_ctx(dev, state->acquire_ctx); |
| 1305 | if (ret) | 1323 | if (ret) |
| 1306 | goto retry; | 1324 | goto retry; |
| 1325 | |||
| 1326 | drm_for_each_crtc(crtc, dev) | ||
| 1327 | if (drm_crtc_mask(crtc) & crtc_mask) | ||
| 1328 | crtc->acquire_ctx = state->acquire_ctx; | ||
| 1329 | |||
| 1330 | if (global) | ||
| 1331 | dev->mode_config.acquire_ctx = state->acquire_ctx; | ||
| 1307 | } | 1332 | } |
| 1308 | EXPORT_SYMBOL(drm_atomic_legacy_backoff); | 1333 | EXPORT_SYMBOL(drm_atomic_legacy_backoff); |
| 1309 | 1334 | ||
diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index f6223f907c15..7f9901b7777b 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include "exynos_drm_plane.h" | 31 | #include "exynos_drm_plane.h" |
| 32 | #include "exynos_drm_drv.h" | 32 | #include "exynos_drm_drv.h" |
| 33 | #include "exynos_drm_fb.h" | 33 | #include "exynos_drm_fb.h" |
| 34 | #include "exynos_drm_fbdev.h" | ||
| 35 | #include "exynos_drm_iommu.h" | 34 | #include "exynos_drm_iommu.h" |
| 36 | 35 | ||
| 37 | /* | 36 | /* |
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c index 468498e3fec1..4c1fb3f8b5a6 100644 --- a/drivers/gpu/drm/exynos/exynos_dp.c +++ b/drivers/gpu/drm/exynos/exynos_dp.c | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | 34 | ||
| 35 | struct exynos_dp_device { | 35 | struct exynos_dp_device { |
| 36 | struct drm_encoder encoder; | 36 | struct drm_encoder encoder; |
| 37 | struct drm_connector connector; | 37 | struct drm_connector *connector; |
| 38 | struct drm_bridge *ptn_bridge; | 38 | struct drm_bridge *ptn_bridge; |
| 39 | struct drm_device *drm_dev; | 39 | struct drm_device *drm_dev; |
| 40 | struct device *dev; | 40 | struct device *dev; |
| @@ -70,7 +70,7 @@ static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data) | |||
| 70 | static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data) | 70 | static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data) |
| 71 | { | 71 | { |
| 72 | struct exynos_dp_device *dp = to_dp(plat_data); | 72 | struct exynos_dp_device *dp = to_dp(plat_data); |
| 73 | struct drm_connector *connector = &dp->connector; | 73 | struct drm_connector *connector = dp->connector; |
| 74 | struct drm_display_mode *mode; | 74 | struct drm_display_mode *mode; |
| 75 | int num_modes = 0; | 75 | int num_modes = 0; |
| 76 | 76 | ||
| @@ -103,6 +103,7 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data, | |||
| 103 | int ret; | 103 | int ret; |
| 104 | 104 | ||
| 105 | drm_connector_register(connector); | 105 | drm_connector_register(connector); |
| 106 | dp->connector = connector; | ||
| 106 | 107 | ||
| 107 | /* Pre-empt DP connector creation if there's a bridge */ | 108 | /* Pre-empt DP connector creation if there's a bridge */ |
| 108 | if (dp->ptn_bridge) { | 109 | if (dp->ptn_bridge) { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index 011211e4167d..edbd98ff293e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | #include <drm/drmP.h> | 15 | #include <drm/drmP.h> |
| 16 | #include "exynos_drm_drv.h" | 16 | #include "exynos_drm_drv.h" |
| 17 | #include "exynos_drm_crtc.h" | 17 | #include "exynos_drm_crtc.h" |
| 18 | #include "exynos_drm_fbdev.h" | ||
| 19 | 18 | ||
| 20 | static LIST_HEAD(exynos_drm_subdrv_list); | 19 | static LIST_HEAD(exynos_drm_subdrv_list); |
| 21 | 20 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 3efe1aa89416..d47216488985 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | 30 | ||
| 31 | #include "exynos_drm_drv.h" | 31 | #include "exynos_drm_drv.h" |
| 32 | #include "exynos_drm_fb.h" | 32 | #include "exynos_drm_fb.h" |
| 33 | #include "exynos_drm_fbdev.h" | ||
| 34 | #include "exynos_drm_crtc.h" | 33 | #include "exynos_drm_crtc.h" |
| 35 | #include "exynos_drm_plane.h" | 34 | #include "exynos_drm_plane.h" |
| 36 | #include "exynos_drm_iommu.h" | 35 | #include "exynos_drm_iommu.h" |
| @@ -120,7 +119,6 @@ static struct fimd_driver_data s3c64xx_fimd_driver_data = { | |||
| 120 | .timing_base = 0x0, | 119 | .timing_base = 0x0, |
| 121 | .has_clksel = 1, | 120 | .has_clksel = 1, |
| 122 | .has_limited_fmt = 1, | 121 | .has_limited_fmt = 1, |
| 123 | .has_hw_trigger = 1, | ||
| 124 | }; | 122 | }; |
| 125 | 123 | ||
| 126 | static struct fimd_driver_data exynos3_fimd_driver_data = { | 124 | static struct fimd_driver_data exynos3_fimd_driver_data = { |
| @@ -171,14 +169,11 @@ static struct fimd_driver_data exynos5420_fimd_driver_data = { | |||
| 171 | .lcdblk_vt_shift = 24, | 169 | .lcdblk_vt_shift = 24, |
| 172 | .lcdblk_bypass_shift = 15, | 170 | .lcdblk_bypass_shift = 15, |
| 173 | .lcdblk_mic_bypass_shift = 11, | 171 | .lcdblk_mic_bypass_shift = 11, |
| 174 | .trg_type = I80_HW_TRG, | ||
| 175 | .has_shadowcon = 1, | 172 | .has_shadowcon = 1, |
| 176 | .has_vidoutcon = 1, | 173 | .has_vidoutcon = 1, |
| 177 | .has_vtsel = 1, | 174 | .has_vtsel = 1, |
| 178 | .has_mic_bypass = 1, | 175 | .has_mic_bypass = 1, |
| 179 | .has_dp_clk = 1, | 176 | .has_dp_clk = 1, |
| 180 | .has_hw_trigger = 1, | ||
| 181 | .has_trigger_per_te = 1, | ||
| 182 | }; | 177 | }; |
| 183 | 178 | ||
| 184 | struct fimd_context { | 179 | struct fimd_context { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 493552368295..8564c3da0d22 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c | |||
| @@ -48,13 +48,13 @@ | |||
| 48 | 48 | ||
| 49 | /* registers for base address */ | 49 | /* registers for base address */ |
| 50 | #define G2D_SRC_BASE_ADDR 0x0304 | 50 | #define G2D_SRC_BASE_ADDR 0x0304 |
| 51 | #define G2D_SRC_STRIDE_REG 0x0308 | 51 | #define G2D_SRC_STRIDE 0x0308 |
| 52 | #define G2D_SRC_COLOR_MODE 0x030C | 52 | #define G2D_SRC_COLOR_MODE 0x030C |
| 53 | #define G2D_SRC_LEFT_TOP 0x0310 | 53 | #define G2D_SRC_LEFT_TOP 0x0310 |
| 54 | #define G2D_SRC_RIGHT_BOTTOM 0x0314 | 54 | #define G2D_SRC_RIGHT_BOTTOM 0x0314 |
| 55 | #define G2D_SRC_PLANE2_BASE_ADDR 0x0318 | 55 | #define G2D_SRC_PLANE2_BASE_ADDR 0x0318 |
| 56 | #define G2D_DST_BASE_ADDR 0x0404 | 56 | #define G2D_DST_BASE_ADDR 0x0404 |
| 57 | #define G2D_DST_STRIDE_REG 0x0408 | 57 | #define G2D_DST_STRIDE 0x0408 |
| 58 | #define G2D_DST_COLOR_MODE 0x040C | 58 | #define G2D_DST_COLOR_MODE 0x040C |
| 59 | #define G2D_DST_LEFT_TOP 0x0410 | 59 | #define G2D_DST_LEFT_TOP 0x0410 |
| 60 | #define G2D_DST_RIGHT_BOTTOM 0x0414 | 60 | #define G2D_DST_RIGHT_BOTTOM 0x0414 |
| @@ -563,7 +563,7 @@ static enum g2d_reg_type g2d_get_reg_type(int reg_offset) | |||
| 563 | 563 | ||
| 564 | switch (reg_offset) { | 564 | switch (reg_offset) { |
| 565 | case G2D_SRC_BASE_ADDR: | 565 | case G2D_SRC_BASE_ADDR: |
| 566 | case G2D_SRC_STRIDE_REG: | 566 | case G2D_SRC_STRIDE: |
| 567 | case G2D_SRC_COLOR_MODE: | 567 | case G2D_SRC_COLOR_MODE: |
| 568 | case G2D_SRC_LEFT_TOP: | 568 | case G2D_SRC_LEFT_TOP: |
| 569 | case G2D_SRC_RIGHT_BOTTOM: | 569 | case G2D_SRC_RIGHT_BOTTOM: |
| @@ -573,7 +573,7 @@ static enum g2d_reg_type g2d_get_reg_type(int reg_offset) | |||
| 573 | reg_type = REG_TYPE_SRC_PLANE2; | 573 | reg_type = REG_TYPE_SRC_PLANE2; |
| 574 | break; | 574 | break; |
| 575 | case G2D_DST_BASE_ADDR: | 575 | case G2D_DST_BASE_ADDR: |
| 576 | case G2D_DST_STRIDE_REG: | 576 | case G2D_DST_STRIDE: |
| 577 | case G2D_DST_COLOR_MODE: | 577 | case G2D_DST_COLOR_MODE: |
| 578 | case G2D_DST_LEFT_TOP: | 578 | case G2D_DST_LEFT_TOP: |
| 579 | case G2D_DST_RIGHT_BOTTOM: | 579 | case G2D_DST_RIGHT_BOTTOM: |
| @@ -968,8 +968,8 @@ static int g2d_check_reg_offset(struct device *dev, | |||
| 968 | } else | 968 | } else |
| 969 | buf_info->types[reg_type] = BUF_TYPE_GEM; | 969 | buf_info->types[reg_type] = BUF_TYPE_GEM; |
| 970 | break; | 970 | break; |
| 971 | case G2D_SRC_STRIDE_REG: | 971 | case G2D_SRC_STRIDE: |
| 972 | case G2D_DST_STRIDE_REG: | 972 | case G2D_DST_STRIDE: |
| 973 | if (for_addr) | 973 | if (for_addr) |
| 974 | goto err; | 974 | goto err; |
| 975 | 975 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c index 55f1d37c666a..77f12c00abf9 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c | |||
| @@ -242,7 +242,7 @@ exynos_drm_plane_check_size(const struct exynos_drm_plane_config *config, | |||
| 242 | state->v_ratio == (1 << 15)) | 242 | state->v_ratio == (1 << 15)) |
| 243 | height_ok = true; | 243 | height_ok = true; |
| 244 | 244 | ||
| 245 | if (width_ok & height_ok) | 245 | if (width_ok && height_ok) |
| 246 | return 0; | 246 | return 0; |
| 247 | 247 | ||
| 248 | DRM_DEBUG_KMS("scaling mode is not supported"); | 248 | DRM_DEBUG_KMS("scaling mode is not supported"); |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index ffe5f8430957..79cf2d5f5a20 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -4977,9 +4977,6 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
| 4977 | intel_display_power_get(dev_priv, power_domain); | 4977 | intel_display_power_get(dev_priv, power_domain); |
| 4978 | 4978 | ||
| 4979 | if (long_hpd) { | 4979 | if (long_hpd) { |
| 4980 | /* indicate that we need to restart link training */ | ||
| 4981 | intel_dp->train_set_valid = false; | ||
| 4982 | |||
| 4983 | intel_dp_long_pulse(intel_dp->attached_connector); | 4980 | intel_dp_long_pulse(intel_dp->attached_connector); |
| 4984 | if (intel_dp->is_mst) | 4981 | if (intel_dp->is_mst) |
| 4985 | ret = IRQ_HANDLED; | 4982 | ret = IRQ_HANDLED; |
diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c b/drivers/gpu/drm/i915/intel_dp_link_training.c index 0b8eefc2acc5..60fb39cd220b 100644 --- a/drivers/gpu/drm/i915/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/intel_dp_link_training.c | |||
| @@ -85,8 +85,7 @@ static bool | |||
| 85 | intel_dp_reset_link_train(struct intel_dp *intel_dp, | 85 | intel_dp_reset_link_train(struct intel_dp *intel_dp, |
| 86 | uint8_t dp_train_pat) | 86 | uint8_t dp_train_pat) |
| 87 | { | 87 | { |
| 88 | if (!intel_dp->train_set_valid) | 88 | memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set)); |
| 89 | memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set)); | ||
| 90 | intel_dp_set_signal_levels(intel_dp); | 89 | intel_dp_set_signal_levels(intel_dp); |
| 91 | return intel_dp_set_link_train(intel_dp, dp_train_pat); | 90 | return intel_dp_set_link_train(intel_dp, dp_train_pat); |
| 92 | } | 91 | } |
| @@ -161,23 +160,6 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp) | |||
| 161 | break; | 160 | break; |
| 162 | } | 161 | } |
| 163 | 162 | ||
| 164 | /* | ||
| 165 | * if we used previously trained voltage and pre-emphasis values | ||
| 166 | * and we don't get clock recovery, reset link training values | ||
| 167 | */ | ||
| 168 | if (intel_dp->train_set_valid) { | ||
| 169 | DRM_DEBUG_KMS("clock recovery not ok, reset"); | ||
| 170 | /* clear the flag as we are not reusing train set */ | ||
| 171 | intel_dp->train_set_valid = false; | ||
| 172 | if (!intel_dp_reset_link_train(intel_dp, | ||
| 173 | DP_TRAINING_PATTERN_1 | | ||
| 174 | DP_LINK_SCRAMBLING_DISABLE)) { | ||
| 175 | DRM_ERROR("failed to enable link training\n"); | ||
| 176 | return; | ||
| 177 | } | ||
| 178 | continue; | ||
| 179 | } | ||
| 180 | |||
| 181 | /* Check to see if we've tried the max voltage */ | 163 | /* Check to see if we've tried the max voltage */ |
| 182 | for (i = 0; i < intel_dp->lane_count; i++) | 164 | for (i = 0; i < intel_dp->lane_count; i++) |
| 183 | if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) | 165 | if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) |
| @@ -284,7 +266,6 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp) | |||
| 284 | /* Make sure clock is still ok */ | 266 | /* Make sure clock is still ok */ |
| 285 | if (!drm_dp_clock_recovery_ok(link_status, | 267 | if (!drm_dp_clock_recovery_ok(link_status, |
| 286 | intel_dp->lane_count)) { | 268 | intel_dp->lane_count)) { |
| 287 | intel_dp->train_set_valid = false; | ||
| 288 | intel_dp_link_training_clock_recovery(intel_dp); | 269 | intel_dp_link_training_clock_recovery(intel_dp); |
| 289 | intel_dp_set_link_train(intel_dp, | 270 | intel_dp_set_link_train(intel_dp, |
| 290 | training_pattern | | 271 | training_pattern | |
| @@ -301,7 +282,6 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp) | |||
| 301 | 282 | ||
| 302 | /* Try 5 times, then try clock recovery if that fails */ | 283 | /* Try 5 times, then try clock recovery if that fails */ |
| 303 | if (tries > 5) { | 284 | if (tries > 5) { |
| 304 | intel_dp->train_set_valid = false; | ||
| 305 | intel_dp_link_training_clock_recovery(intel_dp); | 285 | intel_dp_link_training_clock_recovery(intel_dp); |
| 306 | intel_dp_set_link_train(intel_dp, | 286 | intel_dp_set_link_train(intel_dp, |
| 307 | training_pattern | | 287 | training_pattern | |
| @@ -322,10 +302,8 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp) | |||
| 322 | 302 | ||
| 323 | intel_dp_set_idle_link_train(intel_dp); | 303 | intel_dp_set_idle_link_train(intel_dp); |
| 324 | 304 | ||
| 325 | if (channel_eq) { | 305 | if (channel_eq) |
| 326 | intel_dp->train_set_valid = true; | ||
| 327 | DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n"); | 306 | DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n"); |
| 328 | } | ||
| 329 | } | 307 | } |
| 330 | 308 | ||
| 331 | void intel_dp_stop_link_train(struct intel_dp *intel_dp) | 309 | void intel_dp_stop_link_train(struct intel_dp *intel_dp) |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 4a24b0067a3a..f7f0f01814f6 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -863,8 +863,6 @@ struct intel_dp { | |||
| 863 | /* This is called before a link training is starterd */ | 863 | /* This is called before a link training is starterd */ |
| 864 | void (*prepare_link_retrain)(struct intel_dp *intel_dp); | 864 | void (*prepare_link_retrain)(struct intel_dp *intel_dp); |
| 865 | 865 | ||
| 866 | bool train_set_valid; | ||
| 867 | |||
| 868 | /* Displayport compliance testing */ | 866 | /* Displayport compliance testing */ |
| 869 | unsigned long compliance_test_type; | 867 | unsigned long compliance_test_type; |
| 870 | unsigned long compliance_test_data; | 868 | unsigned long compliance_test_data; |
diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c index d5a7cfec589b..647127f3aaff 100644 --- a/drivers/gpu/drm/i915/intel_fbc.c +++ b/drivers/gpu/drm/i915/intel_fbc.c | |||
| @@ -824,8 +824,7 @@ static bool intel_fbc_can_choose(struct intel_crtc *crtc) | |||
| 824 | { | 824 | { |
| 825 | struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; | 825 | struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; |
| 826 | struct intel_fbc *fbc = &dev_priv->fbc; | 826 | struct intel_fbc *fbc = &dev_priv->fbc; |
| 827 | bool enable_by_default = IS_HASWELL(dev_priv) || | 827 | bool enable_by_default = IS_BROADWELL(dev_priv); |
| 828 | IS_BROADWELL(dev_priv); | ||
| 829 | 828 | ||
| 830 | if (intel_vgpu_active(dev_priv->dev)) { | 829 | if (intel_vgpu_active(dev_priv->dev)) { |
| 831 | fbc->no_fbc_reason = "VGPU is active"; | 830 | fbc->no_fbc_reason = "VGPU is active"; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index 300ea03be8f0..d1f248fd3506 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
| @@ -552,7 +552,8 @@ nouveau_fbcon_init(struct drm_device *dev) | |||
| 552 | if (ret) | 552 | if (ret) |
| 553 | goto fini; | 553 | goto fini; |
| 554 | 554 | ||
| 555 | fbcon->helper.fbdev->pixmap.buf_align = 4; | 555 | if (fbcon->helper.fbdev) |
| 556 | fbcon->helper.fbdev->pixmap.buf_align = 4; | ||
| 556 | return 0; | 557 | return 0; |
| 557 | 558 | ||
| 558 | fini: | 559 | fini: |
diff --git a/drivers/gpu/drm/sun4i/Kconfig b/drivers/gpu/drm/sun4i/Kconfig index 99510e64e91a..a4b357db8856 100644 --- a/drivers/gpu/drm/sun4i/Kconfig +++ b/drivers/gpu/drm/sun4i/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config DRM_SUN4I | 1 | config DRM_SUN4I |
| 2 | tristate "DRM Support for Allwinner A10 Display Engine" | 2 | tristate "DRM Support for Allwinner A10 Display Engine" |
| 3 | depends on DRM && ARM | 3 | depends on DRM && ARM && COMMON_CLK |
| 4 | depends on ARCH_SUNXI || COMPILE_TEST | 4 | depends on ARCH_SUNXI || COMPILE_TEST |
| 5 | select DRM_GEM_CMA_HELPER | 5 | select DRM_GEM_CMA_HELPER |
| 6 | select DRM_KMS_HELPER | 6 | select DRM_KMS_HELPER |
diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c index f7a15c1a93bf..3ab560450a82 100644 --- a/drivers/gpu/drm/sun4i/sun4i_backend.c +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c | |||
| @@ -190,7 +190,7 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend, | |||
| 190 | /* Get the physical address of the buffer in memory */ | 190 | /* Get the physical address of the buffer in memory */ |
| 191 | gem = drm_fb_cma_get_gem_obj(fb, 0); | 191 | gem = drm_fb_cma_get_gem_obj(fb, 0); |
| 192 | 192 | ||
| 193 | DRM_DEBUG_DRIVER("Using GEM @ 0x%x\n", gem->paddr); | 193 | DRM_DEBUG_DRIVER("Using GEM @ %pad\n", &gem->paddr); |
| 194 | 194 | ||
| 195 | /* Compute the start of the displayed memory */ | 195 | /* Compute the start of the displayed memory */ |
| 196 | bpp = drm_format_plane_cpp(fb->pixel_format, 0); | 196 | bpp = drm_format_plane_cpp(fb->pixel_format, 0); |
| @@ -198,7 +198,7 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend, | |||
| 198 | paddr += (state->src_x >> 16) * bpp; | 198 | paddr += (state->src_x >> 16) * bpp; |
| 199 | paddr += (state->src_y >> 16) * fb->pitches[0]; | 199 | paddr += (state->src_y >> 16) * fb->pitches[0]; |
| 200 | 200 | ||
| 201 | DRM_DEBUG_DRIVER("Setting buffer address to 0x%x\n", paddr); | 201 | DRM_DEBUG_DRIVER("Setting buffer address to %pad\n", &paddr); |
| 202 | 202 | ||
| 203 | /* Write the 32 lower bits of the address (in bits) */ | 203 | /* Write the 32 lower bits of the address (in bits) */ |
| 204 | lo_paddr = paddr << 3; | 204 | lo_paddr = paddr << 3; |
diff --git a/drivers/gpu/drm/sun4i/sun4i_dotclock.c b/drivers/gpu/drm/sun4i/sun4i_dotclock.c index 3ff668cb463c..5b3463197c48 100644 --- a/drivers/gpu/drm/sun4i/sun4i_dotclock.c +++ b/drivers/gpu/drm/sun4i/sun4i_dotclock.c | |||
| @@ -72,14 +72,40 @@ static unsigned long sun4i_dclk_recalc_rate(struct clk_hw *hw, | |||
| 72 | static long sun4i_dclk_round_rate(struct clk_hw *hw, unsigned long rate, | 72 | static long sun4i_dclk_round_rate(struct clk_hw *hw, unsigned long rate, |
| 73 | unsigned long *parent_rate) | 73 | unsigned long *parent_rate) |
| 74 | { | 74 | { |
| 75 | return *parent_rate / DIV_ROUND_CLOSEST(*parent_rate, rate); | 75 | unsigned long best_parent = 0; |
| 76 | u8 best_div = 1; | ||
| 77 | int i; | ||
| 78 | |||
| 79 | for (i = 6; i < 127; i++) { | ||
| 80 | unsigned long ideal = rate * i; | ||
| 81 | unsigned long rounded; | ||
| 82 | |||
| 83 | rounded = clk_hw_round_rate(clk_hw_get_parent(hw), | ||
| 84 | ideal); | ||
| 85 | |||
| 86 | if (rounded == ideal) { | ||
| 87 | best_parent = rounded; | ||
| 88 | best_div = i; | ||
| 89 | goto out; | ||
| 90 | } | ||
| 91 | |||
| 92 | if ((rounded < ideal) && (rounded > best_parent)) { | ||
| 93 | best_parent = rounded; | ||
| 94 | best_div = i; | ||
| 95 | } | ||
| 96 | } | ||
| 97 | |||
| 98 | out: | ||
| 99 | *parent_rate = best_parent; | ||
| 100 | |||
| 101 | return best_parent / best_div; | ||
| 76 | } | 102 | } |
| 77 | 103 | ||
| 78 | static int sun4i_dclk_set_rate(struct clk_hw *hw, unsigned long rate, | 104 | static int sun4i_dclk_set_rate(struct clk_hw *hw, unsigned long rate, |
| 79 | unsigned long parent_rate) | 105 | unsigned long parent_rate) |
| 80 | { | 106 | { |
| 81 | struct sun4i_dclk *dclk = hw_to_dclk(hw); | 107 | struct sun4i_dclk *dclk = hw_to_dclk(hw); |
| 82 | int div = DIV_ROUND_CLOSEST(parent_rate, rate); | 108 | u8 div = parent_rate / rate; |
| 83 | 109 | ||
| 84 | return regmap_update_bits(dclk->regmap, SUN4I_TCON0_DCLK_REG, | 110 | return regmap_update_bits(dclk->regmap, SUN4I_TCON0_DCLK_REG, |
| 85 | GENMASK(6, 0), div); | 111 | GENMASK(6, 0), div); |
| @@ -127,10 +153,14 @@ int sun4i_dclk_create(struct device *dev, struct sun4i_tcon *tcon) | |||
| 127 | const char *clk_name, *parent_name; | 153 | const char *clk_name, *parent_name; |
| 128 | struct clk_init_data init; | 154 | struct clk_init_data init; |
| 129 | struct sun4i_dclk *dclk; | 155 | struct sun4i_dclk *dclk; |
| 156 | int ret; | ||
| 130 | 157 | ||
| 131 | parent_name = __clk_get_name(tcon->sclk0); | 158 | parent_name = __clk_get_name(tcon->sclk0); |
| 132 | of_property_read_string_index(dev->of_node, "clock-output-names", 0, | 159 | ret = of_property_read_string_index(dev->of_node, |
| 133 | &clk_name); | 160 | "clock-output-names", 0, |
| 161 | &clk_name); | ||
| 162 | if (ret) | ||
| 163 | return ret; | ||
| 134 | 164 | ||
| 135 | dclk = devm_kzalloc(dev, sizeof(*dclk), GFP_KERNEL); | 165 | dclk = devm_kzalloc(dev, sizeof(*dclk), GFP_KERNEL); |
| 136 | if (!dclk) | 166 | if (!dclk) |
| @@ -140,6 +170,7 @@ int sun4i_dclk_create(struct device *dev, struct sun4i_tcon *tcon) | |||
| 140 | init.ops = &sun4i_dclk_ops; | 170 | init.ops = &sun4i_dclk_ops; |
| 141 | init.parent_names = &parent_name; | 171 | init.parent_names = &parent_name; |
| 142 | init.num_parents = 1; | 172 | init.num_parents = 1; |
| 173 | init.flags = CLK_SET_RATE_PARENT; | ||
| 143 | 174 | ||
| 144 | dclk->regmap = tcon->regs; | 175 | dclk->regmap = tcon->regs; |
| 145 | dclk->hw.init = &init; | 176 | dclk->hw.init = &init; |
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c index 76e922bb60e5..257d2b4f3645 100644 --- a/drivers/gpu/drm/sun4i/sun4i_drv.c +++ b/drivers/gpu/drm/sun4i/sun4i_drv.c | |||
| @@ -24,34 +24,6 @@ | |||
| 24 | #include "sun4i_layer.h" | 24 | #include "sun4i_layer.h" |
| 25 | #include "sun4i_tcon.h" | 25 | #include "sun4i_tcon.h" |
| 26 | 26 | ||
| 27 | static int sun4i_drv_connector_plug_all(struct drm_device *drm) | ||
| 28 | { | ||
| 29 | struct drm_connector *connector, *failed; | ||
| 30 | int ret; | ||
| 31 | |||
| 32 | mutex_lock(&drm->mode_config.mutex); | ||
| 33 | list_for_each_entry(connector, &drm->mode_config.connector_list, head) { | ||
| 34 | ret = drm_connector_register(connector); | ||
| 35 | if (ret) { | ||
| 36 | failed = connector; | ||
| 37 | goto err; | ||
| 38 | } | ||
| 39 | } | ||
| 40 | mutex_unlock(&drm->mode_config.mutex); | ||
| 41 | return 0; | ||
| 42 | |||
| 43 | err: | ||
| 44 | list_for_each_entry(connector, &drm->mode_config.connector_list, head) { | ||
| 45 | if (failed == connector) | ||
| 46 | break; | ||
| 47 | |||
| 48 | drm_connector_unregister(connector); | ||
| 49 | } | ||
| 50 | mutex_unlock(&drm->mode_config.mutex); | ||
| 51 | |||
| 52 | return ret; | ||
| 53 | } | ||
| 54 | |||
| 55 | static int sun4i_drv_enable_vblank(struct drm_device *drm, unsigned int pipe) | 27 | static int sun4i_drv_enable_vblank(struct drm_device *drm, unsigned int pipe) |
| 56 | { | 28 | { |
| 57 | struct sun4i_drv *drv = drm->dev_private; | 29 | struct sun4i_drv *drv = drm->dev_private; |
| @@ -125,6 +97,22 @@ static struct drm_driver sun4i_drv_driver = { | |||
| 125 | .disable_vblank = sun4i_drv_disable_vblank, | 97 | .disable_vblank = sun4i_drv_disable_vblank, |
| 126 | }; | 98 | }; |
| 127 | 99 | ||
| 100 | static void sun4i_remove_framebuffers(void) | ||
| 101 | { | ||
| 102 | struct apertures_struct *ap; | ||
| 103 | |||
| 104 | ap = alloc_apertures(1); | ||
| 105 | if (!ap) | ||
| 106 | return; | ||
| 107 | |||
| 108 | /* The framebuffer can be located anywhere in RAM */ | ||
| 109 | ap->ranges[0].base = 0; | ||
| 110 | ap->ranges[0].size = ~0; | ||
| 111 | |||
| 112 | remove_conflicting_framebuffers(ap, "sun4i-drm-fb", false); | ||
| 113 | kfree(ap); | ||
| 114 | } | ||
| 115 | |||
| 128 | static int sun4i_drv_bind(struct device *dev) | 116 | static int sun4i_drv_bind(struct device *dev) |
| 129 | { | 117 | { |
| 130 | struct drm_device *drm; | 118 | struct drm_device *drm; |
| @@ -172,6 +160,9 @@ static int sun4i_drv_bind(struct device *dev) | |||
| 172 | } | 160 | } |
| 173 | drm->irq_enabled = true; | 161 | drm->irq_enabled = true; |
| 174 | 162 | ||
| 163 | /* Remove early framebuffers (ie. simplefb) */ | ||
| 164 | sun4i_remove_framebuffers(); | ||
| 165 | |||
| 175 | /* Create our framebuffer */ | 166 | /* Create our framebuffer */ |
| 176 | drv->fbdev = sun4i_framebuffer_init(drm); | 167 | drv->fbdev = sun4i_framebuffer_init(drm); |
| 177 | if (IS_ERR(drv->fbdev)) { | 168 | if (IS_ERR(drv->fbdev)) { |
| @@ -187,7 +178,7 @@ static int sun4i_drv_bind(struct device *dev) | |||
| 187 | if (ret) | 178 | if (ret) |
| 188 | goto free_drm; | 179 | goto free_drm; |
| 189 | 180 | ||
| 190 | ret = sun4i_drv_connector_plug_all(drm); | 181 | ret = drm_connector_register_all(drm); |
| 191 | if (ret) | 182 | if (ret) |
| 192 | goto unregister_drm; | 183 | goto unregister_drm; |
| 193 | 184 | ||
| @@ -204,6 +195,7 @@ static void sun4i_drv_unbind(struct device *dev) | |||
| 204 | { | 195 | { |
| 205 | struct drm_device *drm = dev_get_drvdata(dev); | 196 | struct drm_device *drm = dev_get_drvdata(dev); |
| 206 | 197 | ||
| 198 | drm_connector_unregister_all(drm); | ||
| 207 | drm_dev_unregister(drm); | 199 | drm_dev_unregister(drm); |
| 208 | drm_kms_helper_poll_fini(drm); | 200 | drm_kms_helper_poll_fini(drm); |
| 209 | sun4i_framebuffer_free(drm); | 201 | sun4i_framebuffer_free(drm); |
diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c index ab6494818050..aaffe9e64ffb 100644 --- a/drivers/gpu/drm/sun4i/sun4i_rgb.c +++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c | |||
| @@ -54,8 +54,13 @@ static int sun4i_rgb_get_modes(struct drm_connector *connector) | |||
| 54 | static int sun4i_rgb_mode_valid(struct drm_connector *connector, | 54 | static int sun4i_rgb_mode_valid(struct drm_connector *connector, |
| 55 | struct drm_display_mode *mode) | 55 | struct drm_display_mode *mode) |
| 56 | { | 56 | { |
| 57 | struct sun4i_rgb *rgb = drm_connector_to_sun4i_rgb(connector); | ||
| 58 | struct sun4i_drv *drv = rgb->drv; | ||
| 59 | struct sun4i_tcon *tcon = drv->tcon; | ||
| 57 | u32 hsync = mode->hsync_end - mode->hsync_start; | 60 | u32 hsync = mode->hsync_end - mode->hsync_start; |
| 58 | u32 vsync = mode->vsync_end - mode->vsync_start; | 61 | u32 vsync = mode->vsync_end - mode->vsync_start; |
| 62 | unsigned long rate = mode->clock * 1000; | ||
| 63 | long rounded_rate; | ||
| 59 | 64 | ||
| 60 | DRM_DEBUG_DRIVER("Validating modes...\n"); | 65 | DRM_DEBUG_DRIVER("Validating modes...\n"); |
| 61 | 66 | ||
| @@ -87,6 +92,15 @@ static int sun4i_rgb_mode_valid(struct drm_connector *connector, | |||
| 87 | 92 | ||
| 88 | DRM_DEBUG_DRIVER("Vertical parameters OK\n"); | 93 | DRM_DEBUG_DRIVER("Vertical parameters OK\n"); |
| 89 | 94 | ||
| 95 | rounded_rate = clk_round_rate(tcon->dclk, rate); | ||
| 96 | if (rounded_rate < rate) | ||
| 97 | return MODE_CLOCK_LOW; | ||
| 98 | |||
| 99 | if (rounded_rate > rate) | ||
| 100 | return MODE_CLOCK_HIGH; | ||
| 101 | |||
| 102 | DRM_DEBUG_DRIVER("Clock rate OK\n"); | ||
| 103 | |||
| 90 | return MODE_OK; | 104 | return MODE_OK; |
| 91 | } | 105 | } |
| 92 | 106 | ||
| @@ -203,7 +217,7 @@ int sun4i_rgb_init(struct drm_device *drm) | |||
| 203 | int ret; | 217 | int ret; |
| 204 | 218 | ||
| 205 | /* If we don't have a panel, there's no point in going on */ | 219 | /* If we don't have a panel, there's no point in going on */ |
| 206 | if (!tcon->panel) | 220 | if (IS_ERR(tcon->panel)) |
| 207 | return -ENODEV; | 221 | return -ENODEV; |
| 208 | 222 | ||
| 209 | rgb = devm_kzalloc(drm->dev, sizeof(*rgb), GFP_KERNEL); | 223 | rgb = devm_kzalloc(drm->dev, sizeof(*rgb), GFP_KERNEL); |
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c index 9f19b0e08560..652385f09735 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c | |||
| @@ -425,11 +425,11 @@ static struct drm_panel *sun4i_tcon_find_panel(struct device_node *node) | |||
| 425 | 425 | ||
| 426 | remote = of_graph_get_remote_port_parent(end_node); | 426 | remote = of_graph_get_remote_port_parent(end_node); |
| 427 | if (!remote) { | 427 | if (!remote) { |
| 428 | DRM_DEBUG_DRIVER("Enable to parse remote node\n"); | 428 | DRM_DEBUG_DRIVER("Unable to parse remote node\n"); |
| 429 | return ERR_PTR(-EINVAL); | 429 | return ERR_PTR(-EINVAL); |
| 430 | } | 430 | } |
| 431 | 431 | ||
| 432 | return of_drm_find_panel(remote); | 432 | return of_drm_find_panel(remote) ?: ERR_PTR(-EPROBE_DEFER); |
| 433 | } | 433 | } |
| 434 | 434 | ||
| 435 | static int sun4i_tcon_bind(struct device *dev, struct device *master, | 435 | static int sun4i_tcon_bind(struct device *dev, struct device *master, |
| @@ -490,7 +490,11 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master, | |||
| 490 | return 0; | 490 | return 0; |
| 491 | } | 491 | } |
| 492 | 492 | ||
| 493 | return sun4i_rgb_init(drm); | 493 | ret = sun4i_rgb_init(drm); |
| 494 | if (ret < 0) | ||
| 495 | goto err_free_clocks; | ||
| 496 | |||
| 497 | return 0; | ||
| 494 | 498 | ||
| 495 | err_free_clocks: | 499 | err_free_clocks: |
| 496 | sun4i_tcon_free_clocks(tcon); | 500 | sun4i_tcon_free_clocks(tcon); |
| @@ -522,12 +526,13 @@ static int sun4i_tcon_probe(struct platform_device *pdev) | |||
| 522 | * Defer the probe. | 526 | * Defer the probe. |
| 523 | */ | 527 | */ |
| 524 | panel = sun4i_tcon_find_panel(node); | 528 | panel = sun4i_tcon_find_panel(node); |
| 525 | if (IS_ERR(panel)) { | 529 | |
| 526 | /* | 530 | /* |
| 527 | * If we don't have a panel endpoint, just go on | 531 | * If we don't have a panel endpoint, just go on |
| 528 | */ | 532 | */ |
| 529 | if (PTR_ERR(panel) != -ENODEV) | 533 | if (PTR_ERR(panel) == -EPROBE_DEFER) { |
| 530 | return -EPROBE_DEFER; | 534 | DRM_DEBUG_DRIVER("Still waiting for our panel. Deferring...\n"); |
| 535 | return -EPROBE_DEFER; | ||
| 531 | } | 536 | } |
| 532 | 537 | ||
| 533 | return component_add(&pdev->dev, &sun4i_tcon_ops); | 538 | return component_add(&pdev->dev, &sun4i_tcon_ops); |
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 95b7d61d9910..fb6f1f447279 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c | |||
| @@ -61,6 +61,7 @@ MODULE_LICENSE("GPL"); | |||
| 61 | #define MT_QUIRK_ALWAYS_VALID (1 << 4) | 61 | #define MT_QUIRK_ALWAYS_VALID (1 << 4) |
| 62 | #define MT_QUIRK_VALID_IS_INRANGE (1 << 5) | 62 | #define MT_QUIRK_VALID_IS_INRANGE (1 << 5) |
| 63 | #define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 6) | 63 | #define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 6) |
| 64 | #define MT_QUIRK_CONFIDENCE (1 << 7) | ||
| 64 | #define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 8) | 65 | #define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 8) |
| 65 | #define MT_QUIRK_NO_AREA (1 << 9) | 66 | #define MT_QUIRK_NO_AREA (1 << 9) |
| 66 | #define MT_QUIRK_IGNORE_DUPLICATES (1 << 10) | 67 | #define MT_QUIRK_IGNORE_DUPLICATES (1 << 10) |
| @@ -78,6 +79,7 @@ struct mt_slot { | |||
| 78 | __s32 contactid; /* the device ContactID assigned to this slot */ | 79 | __s32 contactid; /* the device ContactID assigned to this slot */ |
| 79 | bool touch_state; /* is the touch valid? */ | 80 | bool touch_state; /* is the touch valid? */ |
| 80 | bool inrange_state; /* is the finger in proximity of the sensor? */ | 81 | bool inrange_state; /* is the finger in proximity of the sensor? */ |
| 82 | bool confidence_state; /* is the touch made by a finger? */ | ||
| 81 | }; | 83 | }; |
| 82 | 84 | ||
| 83 | struct mt_class { | 85 | struct mt_class { |
| @@ -503,10 +505,8 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
| 503 | return 1; | 505 | return 1; |
| 504 | case HID_DG_CONFIDENCE: | 506 | case HID_DG_CONFIDENCE: |
| 505 | if (cls->name == MT_CLS_WIN_8 && | 507 | if (cls->name == MT_CLS_WIN_8 && |
| 506 | field->application == HID_DG_TOUCHPAD) { | 508 | field->application == HID_DG_TOUCHPAD) |
| 507 | cls->quirks &= ~MT_QUIRK_ALWAYS_VALID; | 509 | cls->quirks |= MT_QUIRK_CONFIDENCE; |
| 508 | cls->quirks |= MT_QUIRK_VALID_IS_CONFIDENCE; | ||
| 509 | } | ||
| 510 | mt_store_field(usage, td, hi); | 510 | mt_store_field(usage, td, hi); |
| 511 | return 1; | 511 | return 1; |
| 512 | case HID_DG_TIPSWITCH: | 512 | case HID_DG_TIPSWITCH: |
| @@ -619,6 +619,7 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input) | |||
| 619 | return; | 619 | return; |
| 620 | 620 | ||
| 621 | if (td->curvalid || (td->mtclass.quirks & MT_QUIRK_ALWAYS_VALID)) { | 621 | if (td->curvalid || (td->mtclass.quirks & MT_QUIRK_ALWAYS_VALID)) { |
| 622 | int active; | ||
| 622 | int slotnum = mt_compute_slot(td, input); | 623 | int slotnum = mt_compute_slot(td, input); |
| 623 | struct mt_slot *s = &td->curdata; | 624 | struct mt_slot *s = &td->curdata; |
| 624 | struct input_mt *mt = input->mt; | 625 | struct input_mt *mt = input->mt; |
| @@ -633,10 +634,14 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input) | |||
| 633 | return; | 634 | return; |
| 634 | } | 635 | } |
| 635 | 636 | ||
| 637 | if (!(td->mtclass.quirks & MT_QUIRK_CONFIDENCE)) | ||
| 638 | s->confidence_state = 1; | ||
| 639 | active = (s->touch_state || s->inrange_state) && | ||
| 640 | s->confidence_state; | ||
| 641 | |||
| 636 | input_mt_slot(input, slotnum); | 642 | input_mt_slot(input, slotnum); |
| 637 | input_mt_report_slot_state(input, MT_TOOL_FINGER, | 643 | input_mt_report_slot_state(input, MT_TOOL_FINGER, active); |
| 638 | s->touch_state || s->inrange_state); | 644 | if (active) { |
| 639 | if (s->touch_state || s->inrange_state) { | ||
| 640 | /* this finger is in proximity of the sensor */ | 645 | /* this finger is in proximity of the sensor */ |
| 641 | int wide = (s->w > s->h); | 646 | int wide = (s->w > s->h); |
| 642 | /* divided by two to match visual scale of touch */ | 647 | /* divided by two to match visual scale of touch */ |
| @@ -701,6 +706,8 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field, | |||
| 701 | td->curdata.touch_state = value; | 706 | td->curdata.touch_state = value; |
| 702 | break; | 707 | break; |
| 703 | case HID_DG_CONFIDENCE: | 708 | case HID_DG_CONFIDENCE: |
| 709 | if (quirks & MT_QUIRK_CONFIDENCE) | ||
| 710 | td->curdata.confidence_state = value; | ||
| 704 | if (quirks & MT_QUIRK_VALID_IS_CONFIDENCE) | 711 | if (quirks & MT_QUIRK_VALID_IS_CONFIDENCE) |
| 705 | td->curvalid = value; | 712 | td->curvalid = value; |
| 706 | break; | 713 | break; |
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 2f1ddca6f2e0..700145b15088 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c | |||
| @@ -516,13 +516,13 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd, | |||
| 516 | goto inval; | 516 | goto inval; |
| 517 | } else if (uref->usage_index >= field->report_count) | 517 | } else if (uref->usage_index >= field->report_count) |
| 518 | goto inval; | 518 | goto inval; |
| 519 | |||
| 520 | else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && | ||
| 521 | (uref_multi->num_values > HID_MAX_MULTI_USAGES || | ||
| 522 | uref->usage_index + uref_multi->num_values > field->report_count)) | ||
| 523 | goto inval; | ||
| 524 | } | 519 | } |
| 525 | 520 | ||
| 521 | if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && | ||
| 522 | (uref_multi->num_values > HID_MAX_MULTI_USAGES || | ||
| 523 | uref->usage_index + uref_multi->num_values > field->report_count)) | ||
| 524 | goto inval; | ||
| 525 | |||
| 526 | switch (cmd) { | 526 | switch (cmd) { |
| 527 | case HIDIOCGUSAGE: | 527 | case HIDIOCGUSAGE: |
| 528 | uref->value = field->value[uref->usage_index]; | 528 | uref->value = field->value[uref->usage_index]; |
diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c index c43318d3416e..2ac87d553e22 100644 --- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/uaccess.h> | 35 | #include <linux/uaccess.h> |
| 36 | #include <linux/io.h> | 36 | #include <linux/io.h> |
| 37 | #include <linux/sched.h> | 37 | #include <linux/sched.h> |
| 38 | #include <linux/ctype.h> | ||
| 38 | 39 | ||
| 39 | #include <linux/i8k.h> | 40 | #include <linux/i8k.h> |
| 40 | 41 | ||
| @@ -66,11 +67,13 @@ | |||
| 66 | 67 | ||
| 67 | static DEFINE_MUTEX(i8k_mutex); | 68 | static DEFINE_MUTEX(i8k_mutex); |
| 68 | static char bios_version[4]; | 69 | static char bios_version[4]; |
| 70 | static char bios_machineid[16]; | ||
| 69 | static struct device *i8k_hwmon_dev; | 71 | static struct device *i8k_hwmon_dev; |
| 70 | static u32 i8k_hwmon_flags; | 72 | static u32 i8k_hwmon_flags; |
| 71 | static uint i8k_fan_mult = I8K_FAN_MULT; | 73 | static uint i8k_fan_mult = I8K_FAN_MULT; |
| 72 | static uint i8k_pwm_mult; | 74 | static uint i8k_pwm_mult; |
| 73 | static uint i8k_fan_max = I8K_FAN_HIGH; | 75 | static uint i8k_fan_max = I8K_FAN_HIGH; |
| 76 | static bool disallow_fan_type_call; | ||
| 74 | 77 | ||
| 75 | #define I8K_HWMON_HAVE_TEMP1 (1 << 0) | 78 | #define I8K_HWMON_HAVE_TEMP1 (1 << 0) |
| 76 | #define I8K_HWMON_HAVE_TEMP2 (1 << 1) | 79 | #define I8K_HWMON_HAVE_TEMP2 (1 << 1) |
| @@ -94,13 +97,13 @@ module_param(ignore_dmi, bool, 0); | |||
| 94 | MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); | 97 | MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); |
| 95 | 98 | ||
| 96 | #if IS_ENABLED(CONFIG_I8K) | 99 | #if IS_ENABLED(CONFIG_I8K) |
| 97 | static bool restricted; | 100 | static bool restricted = true; |
| 98 | module_param(restricted, bool, 0); | 101 | module_param(restricted, bool, 0); |
| 99 | MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); | 102 | MODULE_PARM_DESC(restricted, "Restrict fan control and serial number to CAP_SYS_ADMIN (default: 1)"); |
| 100 | 103 | ||
| 101 | static bool power_status; | 104 | static bool power_status; |
| 102 | module_param(power_status, bool, 0600); | 105 | module_param(power_status, bool, 0600); |
| 103 | MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); | 106 | MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k (default: 0)"); |
| 104 | #endif | 107 | #endif |
| 105 | 108 | ||
| 106 | static uint fan_mult; | 109 | static uint fan_mult; |
| @@ -235,14 +238,28 @@ static int i8k_get_fan_speed(int fan) | |||
| 235 | /* | 238 | /* |
| 236 | * Read the fan type. | 239 | * Read the fan type. |
| 237 | */ | 240 | */ |
| 238 | static int i8k_get_fan_type(int fan) | 241 | static int _i8k_get_fan_type(int fan) |
| 239 | { | 242 | { |
| 240 | struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; | 243 | struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; |
| 241 | 244 | ||
| 245 | if (disallow_fan_type_call) | ||
| 246 | return -EINVAL; | ||
| 247 | |||
| 242 | regs.ebx = fan & 0xff; | 248 | regs.ebx = fan & 0xff; |
| 243 | return i8k_smm(®s) ? : regs.eax & 0xff; | 249 | return i8k_smm(®s) ? : regs.eax & 0xff; |
| 244 | } | 250 | } |
| 245 | 251 | ||
| 252 | static int i8k_get_fan_type(int fan) | ||
| 253 | { | ||
| 254 | /* I8K_SMM_GET_FAN_TYPE SMM call is expensive, so cache values */ | ||
| 255 | static int types[2] = { INT_MIN, INT_MIN }; | ||
| 256 | |||
| 257 | if (types[fan] == INT_MIN) | ||
| 258 | types[fan] = _i8k_get_fan_type(fan); | ||
| 259 | |||
| 260 | return types[fan]; | ||
| 261 | } | ||
| 262 | |||
| 246 | /* | 263 | /* |
| 247 | * Read the fan nominal rpm for specific fan speed. | 264 | * Read the fan nominal rpm for specific fan speed. |
| 248 | */ | 265 | */ |
| @@ -387,14 +404,20 @@ i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) | |||
| 387 | 404 | ||
| 388 | switch (cmd) { | 405 | switch (cmd) { |
| 389 | case I8K_BIOS_VERSION: | 406 | case I8K_BIOS_VERSION: |
| 407 | if (!isdigit(bios_version[0]) || !isdigit(bios_version[1]) || | ||
| 408 | !isdigit(bios_version[2])) | ||
| 409 | return -EINVAL; | ||
| 410 | |||
| 390 | val = (bios_version[0] << 16) | | 411 | val = (bios_version[0] << 16) | |
| 391 | (bios_version[1] << 8) | bios_version[2]; | 412 | (bios_version[1] << 8) | bios_version[2]; |
| 392 | break; | 413 | break; |
| 393 | 414 | ||
| 394 | case I8K_MACHINE_ID: | 415 | case I8K_MACHINE_ID: |
| 395 | memset(buff, 0, 16); | 416 | if (restricted && !capable(CAP_SYS_ADMIN)) |
| 396 | strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), | 417 | return -EPERM; |
| 397 | sizeof(buff)); | 418 | |
| 419 | memset(buff, 0, sizeof(buff)); | ||
| 420 | strlcpy(buff, bios_machineid, sizeof(buff)); | ||
| 398 | break; | 421 | break; |
| 399 | 422 | ||
| 400 | case I8K_FN_STATUS: | 423 | case I8K_FN_STATUS: |
| @@ -511,7 +534,7 @@ static int i8k_proc_show(struct seq_file *seq, void *offset) | |||
| 511 | seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", | 534 | seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", |
| 512 | I8K_PROC_FMT, | 535 | I8K_PROC_FMT, |
| 513 | bios_version, | 536 | bios_version, |
| 514 | i8k_get_dmi_data(DMI_PRODUCT_SERIAL), | 537 | (restricted && !capable(CAP_SYS_ADMIN)) ? "-1" : bios_machineid, |
| 515 | cpu_temp, | 538 | cpu_temp, |
| 516 | left_fan, right_fan, left_speed, right_speed, | 539 | left_fan, right_fan, left_speed, right_speed, |
| 517 | ac_power, fn_key); | 540 | ac_power, fn_key); |
| @@ -718,6 +741,9 @@ static struct attribute *i8k_attrs[] = { | |||
| 718 | static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, | 741 | static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, |
| 719 | int index) | 742 | int index) |
| 720 | { | 743 | { |
| 744 | if (disallow_fan_type_call && | ||
| 745 | (index == 9 || index == 12)) | ||
| 746 | return 0; | ||
| 721 | if (index >= 0 && index <= 1 && | 747 | if (index >= 0 && index <= 1 && |
| 722 | !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) | 748 | !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) |
| 723 | return 0; | 749 | return 0; |
| @@ -767,13 +793,17 @@ static int __init i8k_init_hwmon(void) | |||
| 767 | if (err >= 0) | 793 | if (err >= 0) |
| 768 | i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; | 794 | i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; |
| 769 | 795 | ||
| 770 | /* First fan attributes, if fan type is OK */ | 796 | /* First fan attributes, if fan status or type is OK */ |
| 771 | err = i8k_get_fan_type(0); | 797 | err = i8k_get_fan_status(0); |
| 798 | if (err < 0) | ||
| 799 | err = i8k_get_fan_type(0); | ||
| 772 | if (err >= 0) | 800 | if (err >= 0) |
| 773 | i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; | 801 | i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; |
| 774 | 802 | ||
| 775 | /* Second fan attributes, if fan type is OK */ | 803 | /* Second fan attributes, if fan status or type is OK */ |
| 776 | err = i8k_get_fan_type(1); | 804 | err = i8k_get_fan_status(1); |
| 805 | if (err < 0) | ||
| 806 | err = i8k_get_fan_type(1); | ||
| 777 | if (err >= 0) | 807 | if (err >= 0) |
| 778 | i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; | 808 | i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; |
| 779 | 809 | ||
| @@ -929,12 +959,14 @@ static struct dmi_system_id i8k_dmi_table[] __initdata = { | |||
| 929 | 959 | ||
| 930 | MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); | 960 | MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); |
| 931 | 961 | ||
| 932 | static struct dmi_system_id i8k_blacklist_dmi_table[] __initdata = { | 962 | /* |
| 963 | * On some machines once I8K_SMM_GET_FAN_TYPE is issued then CPU fan speed | ||
| 964 | * randomly going up and down due to bug in Dell SMM or BIOS. Here is blacklist | ||
| 965 | * of affected Dell machines for which we disallow I8K_SMM_GET_FAN_TYPE call. | ||
| 966 | * See bug: https://bugzilla.kernel.org/show_bug.cgi?id=100121 | ||
| 967 | */ | ||
| 968 | static struct dmi_system_id i8k_blacklist_fan_type_dmi_table[] __initdata = { | ||
| 933 | { | 969 | { |
| 934 | /* | ||
| 935 | * CPU fan speed going up and down on Dell Studio XPS 8000 | ||
| 936 | * for unknown reasons. | ||
| 937 | */ | ||
| 938 | .ident = "Dell Studio XPS 8000", | 970 | .ident = "Dell Studio XPS 8000", |
| 939 | .matches = { | 971 | .matches = { |
| 940 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | 972 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
| @@ -942,16 +974,19 @@ static struct dmi_system_id i8k_blacklist_dmi_table[] __initdata = { | |||
| 942 | }, | 974 | }, |
| 943 | }, | 975 | }, |
| 944 | { | 976 | { |
| 945 | /* | ||
| 946 | * CPU fan speed going up and down on Dell Studio XPS 8100 | ||
| 947 | * for unknown reasons. | ||
| 948 | */ | ||
| 949 | .ident = "Dell Studio XPS 8100", | 977 | .ident = "Dell Studio XPS 8100", |
| 950 | .matches = { | 978 | .matches = { |
| 951 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | 979 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
| 952 | DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Studio XPS 8100"), | 980 | DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Studio XPS 8100"), |
| 953 | }, | 981 | }, |
| 954 | }, | 982 | }, |
| 983 | { | ||
| 984 | .ident = "Dell Inspiron 580", | ||
| 985 | .matches = { | ||
| 986 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 987 | DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Inspiron 580 "), | ||
| 988 | }, | ||
| 989 | }, | ||
| 955 | { } | 990 | { } |
| 956 | }; | 991 | }; |
| 957 | 992 | ||
| @@ -966,8 +1001,7 @@ static int __init i8k_probe(void) | |||
| 966 | /* | 1001 | /* |
| 967 | * Get DMI information | 1002 | * Get DMI information |
| 968 | */ | 1003 | */ |
| 969 | if (!dmi_check_system(i8k_dmi_table) || | 1004 | if (!dmi_check_system(i8k_dmi_table)) { |
| 970 | dmi_check_system(i8k_blacklist_dmi_table)) { | ||
| 971 | if (!ignore_dmi && !force) | 1005 | if (!ignore_dmi && !force) |
| 972 | return -ENODEV; | 1006 | return -ENODEV; |
| 973 | 1007 | ||
| @@ -978,8 +1012,13 @@ static int __init i8k_probe(void) | |||
| 978 | i8k_get_dmi_data(DMI_BIOS_VERSION)); | 1012 | i8k_get_dmi_data(DMI_BIOS_VERSION)); |
| 979 | } | 1013 | } |
| 980 | 1014 | ||
| 1015 | if (dmi_check_system(i8k_blacklist_fan_type_dmi_table)) | ||
| 1016 | disallow_fan_type_call = true; | ||
| 1017 | |||
| 981 | strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), | 1018 | strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), |
| 982 | sizeof(bios_version)); | 1019 | sizeof(bios_version)); |
| 1020 | strlcpy(bios_machineid, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), | ||
| 1021 | sizeof(bios_machineid)); | ||
| 983 | 1022 | ||
| 984 | /* | 1023 | /* |
| 985 | * Get SMM Dell signature | 1024 | * Get SMM Dell signature |
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index 040966775f40..1a2984c28b95 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c | |||
| @@ -411,7 +411,9 @@ int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port, | |||
| 411 | 411 | ||
| 412 | for (ix = 0; ix < table->sz; ix++) | 412 | for (ix = 0; ix < table->sz; ix++) |
| 413 | if (table->data_vec[ix].attr.ndev == ndev) | 413 | if (table->data_vec[ix].attr.ndev == ndev) |
| 414 | if (!del_gid(ib_dev, port, table, ix, false)) | 414 | if (!del_gid(ib_dev, port, table, ix, |
| 415 | !!(table->data_vec[ix].props & | ||
| 416 | GID_TABLE_ENTRY_DEFAULT))) | ||
| 415 | deleted = true; | 417 | deleted = true; |
| 416 | 418 | ||
| 417 | write_unlock_irq(&table->rwlock); | 419 | write_unlock_irq(&table->rwlock); |
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index f0c91ba3178a..ad1b1adcf6f0 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
| @@ -708,17 +708,6 @@ static void cma_deref_id(struct rdma_id_private *id_priv) | |||
| 708 | complete(&id_priv->comp); | 708 | complete(&id_priv->comp); |
| 709 | } | 709 | } |
| 710 | 710 | ||
| 711 | static int cma_disable_callback(struct rdma_id_private *id_priv, | ||
| 712 | enum rdma_cm_state state) | ||
| 713 | { | ||
| 714 | mutex_lock(&id_priv->handler_mutex); | ||
| 715 | if (id_priv->state != state) { | ||
| 716 | mutex_unlock(&id_priv->handler_mutex); | ||
| 717 | return -EINVAL; | ||
| 718 | } | ||
| 719 | return 0; | ||
| 720 | } | ||
| 721 | |||
| 722 | struct rdma_cm_id *rdma_create_id(struct net *net, | 711 | struct rdma_cm_id *rdma_create_id(struct net *net, |
| 723 | rdma_cm_event_handler event_handler, | 712 | rdma_cm_event_handler event_handler, |
| 724 | void *context, enum rdma_port_space ps, | 713 | void *context, enum rdma_port_space ps, |
| @@ -1671,11 +1660,12 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
| 1671 | struct rdma_cm_event event; | 1660 | struct rdma_cm_event event; |
| 1672 | int ret = 0; | 1661 | int ret = 0; |
| 1673 | 1662 | ||
| 1663 | mutex_lock(&id_priv->handler_mutex); | ||
| 1674 | if ((ib_event->event != IB_CM_TIMEWAIT_EXIT && | 1664 | if ((ib_event->event != IB_CM_TIMEWAIT_EXIT && |
| 1675 | cma_disable_callback(id_priv, RDMA_CM_CONNECT)) || | 1665 | id_priv->state != RDMA_CM_CONNECT) || |
| 1676 | (ib_event->event == IB_CM_TIMEWAIT_EXIT && | 1666 | (ib_event->event == IB_CM_TIMEWAIT_EXIT && |
| 1677 | cma_disable_callback(id_priv, RDMA_CM_DISCONNECT))) | 1667 | id_priv->state != RDMA_CM_DISCONNECT)) |
| 1678 | return 0; | 1668 | goto out; |
| 1679 | 1669 | ||
| 1680 | memset(&event, 0, sizeof event); | 1670 | memset(&event, 0, sizeof event); |
| 1681 | switch (ib_event->event) { | 1671 | switch (ib_event->event) { |
| @@ -1870,7 +1860,7 @@ static int cma_check_req_qp_type(struct rdma_cm_id *id, struct ib_cm_event *ib_e | |||
| 1870 | 1860 | ||
| 1871 | static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | 1861 | static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) |
| 1872 | { | 1862 | { |
| 1873 | struct rdma_id_private *listen_id, *conn_id; | 1863 | struct rdma_id_private *listen_id, *conn_id = NULL; |
| 1874 | struct rdma_cm_event event; | 1864 | struct rdma_cm_event event; |
| 1875 | struct net_device *net_dev; | 1865 | struct net_device *net_dev; |
| 1876 | int offset, ret; | 1866 | int offset, ret; |
| @@ -1884,9 +1874,10 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
| 1884 | goto net_dev_put; | 1874 | goto net_dev_put; |
| 1885 | } | 1875 | } |
| 1886 | 1876 | ||
| 1887 | if (cma_disable_callback(listen_id, RDMA_CM_LISTEN)) { | 1877 | mutex_lock(&listen_id->handler_mutex); |
| 1878 | if (listen_id->state != RDMA_CM_LISTEN) { | ||
| 1888 | ret = -ECONNABORTED; | 1879 | ret = -ECONNABORTED; |
| 1889 | goto net_dev_put; | 1880 | goto err1; |
| 1890 | } | 1881 | } |
| 1891 | 1882 | ||
| 1892 | memset(&event, 0, sizeof event); | 1883 | memset(&event, 0, sizeof event); |
| @@ -1976,8 +1967,9 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) | |||
| 1976 | struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr; | 1967 | struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr; |
| 1977 | struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr; | 1968 | struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr; |
| 1978 | 1969 | ||
| 1979 | if (cma_disable_callback(id_priv, RDMA_CM_CONNECT)) | 1970 | mutex_lock(&id_priv->handler_mutex); |
| 1980 | return 0; | 1971 | if (id_priv->state != RDMA_CM_CONNECT) |
| 1972 | goto out; | ||
| 1981 | 1973 | ||
| 1982 | memset(&event, 0, sizeof event); | 1974 | memset(&event, 0, sizeof event); |
| 1983 | switch (iw_event->event) { | 1975 | switch (iw_event->event) { |
| @@ -2029,6 +2021,7 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) | |||
| 2029 | return ret; | 2021 | return ret; |
| 2030 | } | 2022 | } |
| 2031 | 2023 | ||
| 2024 | out: | ||
| 2032 | mutex_unlock(&id_priv->handler_mutex); | 2025 | mutex_unlock(&id_priv->handler_mutex); |
| 2033 | return ret; | 2026 | return ret; |
| 2034 | } | 2027 | } |
| @@ -2039,13 +2032,15 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, | |||
| 2039 | struct rdma_cm_id *new_cm_id; | 2032 | struct rdma_cm_id *new_cm_id; |
| 2040 | struct rdma_id_private *listen_id, *conn_id; | 2033 | struct rdma_id_private *listen_id, *conn_id; |
| 2041 | struct rdma_cm_event event; | 2034 | struct rdma_cm_event event; |
| 2042 | int ret; | 2035 | int ret = -ECONNABORTED; |
| 2043 | struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr; | 2036 | struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr; |
| 2044 | struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr; | 2037 | struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr; |
| 2045 | 2038 | ||
| 2046 | listen_id = cm_id->context; | 2039 | listen_id = cm_id->context; |
| 2047 | if (cma_disable_callback(listen_id, RDMA_CM_LISTEN)) | 2040 | |
| 2048 | return -ECONNABORTED; | 2041 | mutex_lock(&listen_id->handler_mutex); |
| 2042 | if (listen_id->state != RDMA_CM_LISTEN) | ||
| 2043 | goto out; | ||
| 2049 | 2044 | ||
| 2050 | /* Create a new RDMA id for the new IW CM ID */ | 2045 | /* Create a new RDMA id for the new IW CM ID */ |
| 2051 | new_cm_id = rdma_create_id(listen_id->id.route.addr.dev_addr.net, | 2046 | new_cm_id = rdma_create_id(listen_id->id.route.addr.dev_addr.net, |
| @@ -3216,8 +3211,9 @@ static int cma_sidr_rep_handler(struct ib_cm_id *cm_id, | |||
| 3216 | struct ib_cm_sidr_rep_event_param *rep = &ib_event->param.sidr_rep_rcvd; | 3211 | struct ib_cm_sidr_rep_event_param *rep = &ib_event->param.sidr_rep_rcvd; |
| 3217 | int ret = 0; | 3212 | int ret = 0; |
| 3218 | 3213 | ||
| 3219 | if (cma_disable_callback(id_priv, RDMA_CM_CONNECT)) | 3214 | mutex_lock(&id_priv->handler_mutex); |
| 3220 | return 0; | 3215 | if (id_priv->state != RDMA_CM_CONNECT) |
| 3216 | goto out; | ||
| 3221 | 3217 | ||
| 3222 | memset(&event, 0, sizeof event); | 3218 | memset(&event, 0, sizeof event); |
| 3223 | switch (ib_event->event) { | 3219 | switch (ib_event->event) { |
| @@ -3673,12 +3669,13 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast) | |||
| 3673 | struct rdma_id_private *id_priv; | 3669 | struct rdma_id_private *id_priv; |
| 3674 | struct cma_multicast *mc = multicast->context; | 3670 | struct cma_multicast *mc = multicast->context; |
| 3675 | struct rdma_cm_event event; | 3671 | struct rdma_cm_event event; |
| 3676 | int ret; | 3672 | int ret = 0; |
| 3677 | 3673 | ||
| 3678 | id_priv = mc->id_priv; | 3674 | id_priv = mc->id_priv; |
| 3679 | if (cma_disable_callback(id_priv, RDMA_CM_ADDR_BOUND) && | 3675 | mutex_lock(&id_priv->handler_mutex); |
| 3680 | cma_disable_callback(id_priv, RDMA_CM_ADDR_RESOLVED)) | 3676 | if (id_priv->state != RDMA_CM_ADDR_BOUND && |
| 3681 | return 0; | 3677 | id_priv->state != RDMA_CM_ADDR_RESOLVED) |
| 3678 | goto out; | ||
| 3682 | 3679 | ||
| 3683 | if (!status) | 3680 | if (!status) |
| 3684 | status = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey)); | 3681 | status = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey)); |
| @@ -3720,6 +3717,7 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast) | |||
| 3720 | return 0; | 3717 | return 0; |
| 3721 | } | 3718 | } |
| 3722 | 3719 | ||
| 3720 | out: | ||
| 3723 | mutex_unlock(&id_priv->handler_mutex); | 3721 | mutex_unlock(&id_priv->handler_mutex); |
| 3724 | return 0; | 3722 | return 0; |
| 3725 | } | 3723 | } |
| @@ -3878,12 +3876,12 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv, | |||
| 3878 | gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num - | 3876 | gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num - |
| 3879 | rdma_start_port(id_priv->cma_dev->device)]; | 3877 | rdma_start_port(id_priv->cma_dev->device)]; |
| 3880 | if (addr->sa_family == AF_INET) { | 3878 | if (addr->sa_family == AF_INET) { |
| 3881 | if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) | 3879 | if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) { |
| 3880 | mc->multicast.ib->rec.hop_limit = IPV6_DEFAULT_HOPLIMIT; | ||
| 3882 | err = cma_igmp_send(ndev, &mc->multicast.ib->rec.mgid, | 3881 | err = cma_igmp_send(ndev, &mc->multicast.ib->rec.mgid, |
| 3883 | true); | 3882 | true); |
| 3884 | if (!err) { | 3883 | if (!err) |
| 3885 | mc->igmp_joined = true; | 3884 | mc->igmp_joined = true; |
| 3886 | mc->multicast.ib->rec.hop_limit = IPV6_DEFAULT_HOPLIMIT; | ||
| 3887 | } | 3885 | } |
| 3888 | } else { | 3886 | } else { |
| 3889 | if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) | 3887 | if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) |
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 1a8babb8ee3c..825021d1008b 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
| @@ -1747,7 +1747,7 @@ static int create_qp(struct ib_uverbs_file *file, | |||
| 1747 | struct ib_srq *srq = NULL; | 1747 | struct ib_srq *srq = NULL; |
| 1748 | struct ib_qp *qp; | 1748 | struct ib_qp *qp; |
| 1749 | char *buf; | 1749 | char *buf; |
| 1750 | struct ib_qp_init_attr attr; | 1750 | struct ib_qp_init_attr attr = {}; |
| 1751 | struct ib_uverbs_ex_create_qp_resp resp; | 1751 | struct ib_uverbs_ex_create_qp_resp resp; |
| 1752 | int ret; | 1752 | int ret; |
| 1753 | 1753 | ||
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 1d7d4cf442e3..6298f54b4137 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
| @@ -511,12 +511,16 @@ int ib_init_ah_from_wc(struct ib_device *device, u8 port_num, | |||
| 511 | ah_attr->grh.dgid = sgid; | 511 | ah_attr->grh.dgid = sgid; |
| 512 | 512 | ||
| 513 | if (!rdma_cap_eth_ah(device, port_num)) { | 513 | if (!rdma_cap_eth_ah(device, port_num)) { |
| 514 | ret = ib_find_cached_gid_by_port(device, &dgid, | 514 | if (dgid.global.interface_id != cpu_to_be64(IB_SA_WELL_KNOWN_GUID)) { |
| 515 | IB_GID_TYPE_IB, | 515 | ret = ib_find_cached_gid_by_port(device, &dgid, |
| 516 | port_num, NULL, | 516 | IB_GID_TYPE_IB, |
| 517 | &gid_index); | 517 | port_num, NULL, |
| 518 | if (ret) | 518 | &gid_index); |
| 519 | return ret; | 519 | if (ret) |
| 520 | return ret; | ||
| 521 | } else { | ||
| 522 | gid_index = 0; | ||
| 523 | } | ||
| 520 | } | 524 | } |
| 521 | 525 | ||
| 522 | ah_attr->grh.sgid_index = (u8) gid_index; | 526 | ah_attr->grh.sgid_index = (u8) gid_index; |
diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c index 81619fbb5842..f5de85178055 100644 --- a/drivers/infiniband/hw/hfi1/chip.c +++ b/drivers/infiniband/hw/hfi1/chip.c | |||
| @@ -1037,7 +1037,7 @@ static void dc_shutdown(struct hfi1_devdata *); | |||
| 1037 | static void dc_start(struct hfi1_devdata *); | 1037 | static void dc_start(struct hfi1_devdata *); |
| 1038 | static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp, | 1038 | static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp, |
| 1039 | unsigned int *np); | 1039 | unsigned int *np); |
| 1040 | static void remove_full_mgmt_pkey(struct hfi1_pportdata *ppd); | 1040 | static void clear_full_mgmt_pkey(struct hfi1_pportdata *ppd); |
| 1041 | 1041 | ||
| 1042 | /* | 1042 | /* |
| 1043 | * Error interrupt table entry. This is used as input to the interrupt | 1043 | * Error interrupt table entry. This is used as input to the interrupt |
| @@ -6962,8 +6962,6 @@ void handle_link_down(struct work_struct *work) | |||
| 6962 | } | 6962 | } |
| 6963 | 6963 | ||
| 6964 | reset_neighbor_info(ppd); | 6964 | reset_neighbor_info(ppd); |
| 6965 | if (ppd->mgmt_allowed) | ||
| 6966 | remove_full_mgmt_pkey(ppd); | ||
| 6967 | 6965 | ||
| 6968 | /* disable the port */ | 6966 | /* disable the port */ |
| 6969 | clear_rcvctrl(ppd->dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK); | 6967 | clear_rcvctrl(ppd->dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK); |
| @@ -7070,12 +7068,16 @@ static void add_full_mgmt_pkey(struct hfi1_pportdata *ppd) | |||
| 7070 | __func__, ppd->pkeys[2], FULL_MGMT_P_KEY); | 7068 | __func__, ppd->pkeys[2], FULL_MGMT_P_KEY); |
| 7071 | ppd->pkeys[2] = FULL_MGMT_P_KEY; | 7069 | ppd->pkeys[2] = FULL_MGMT_P_KEY; |
| 7072 | (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); | 7070 | (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); |
| 7071 | hfi1_event_pkey_change(ppd->dd, ppd->port); | ||
| 7073 | } | 7072 | } |
| 7074 | 7073 | ||
| 7075 | static void remove_full_mgmt_pkey(struct hfi1_pportdata *ppd) | 7074 | static void clear_full_mgmt_pkey(struct hfi1_pportdata *ppd) |
| 7076 | { | 7075 | { |
| 7077 | ppd->pkeys[2] = 0; | 7076 | if (ppd->pkeys[2] != 0) { |
| 7078 | (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); | 7077 | ppd->pkeys[2] = 0; |
| 7078 | (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); | ||
| 7079 | hfi1_event_pkey_change(ppd->dd, ppd->port); | ||
| 7080 | } | ||
| 7079 | } | 7081 | } |
| 7080 | 7082 | ||
| 7081 | /* | 7083 | /* |
| @@ -9168,6 +9170,13 @@ int start_link(struct hfi1_pportdata *ppd) | |||
| 9168 | return 0; | 9170 | return 0; |
| 9169 | } | 9171 | } |
| 9170 | 9172 | ||
| 9173 | /* | ||
| 9174 | * FULL_MGMT_P_KEY is cleared from the pkey table, so that the | ||
| 9175 | * pkey table can be configured properly if the HFI unit is connected | ||
| 9176 | * to switch port with MgmtAllowed=NO | ||
| 9177 | */ | ||
| 9178 | clear_full_mgmt_pkey(ppd); | ||
| 9179 | |||
| 9171 | return set_link_state(ppd, HLS_DN_POLL); | 9180 | return set_link_state(ppd, HLS_DN_POLL); |
| 9172 | } | 9181 | } |
| 9173 | 9182 | ||
| @@ -9777,7 +9786,7 @@ static void set_send_length(struct hfi1_pportdata *ppd) | |||
| 9777 | u64 len1 = 0, len2 = (((dd->vld[15].mtu + max_hb) >> 2) | 9786 | u64 len1 = 0, len2 = (((dd->vld[15].mtu + max_hb) >> 2) |
| 9778 | & SEND_LEN_CHECK1_LEN_VL15_MASK) << | 9787 | & SEND_LEN_CHECK1_LEN_VL15_MASK) << |
| 9779 | SEND_LEN_CHECK1_LEN_VL15_SHIFT; | 9788 | SEND_LEN_CHECK1_LEN_VL15_SHIFT; |
| 9780 | int i; | 9789 | int i, j; |
| 9781 | u32 thres; | 9790 | u32 thres; |
| 9782 | 9791 | ||
| 9783 | for (i = 0; i < ppd->vls_supported; i++) { | 9792 | for (i = 0; i < ppd->vls_supported; i++) { |
| @@ -9801,7 +9810,10 @@ static void set_send_length(struct hfi1_pportdata *ppd) | |||
| 9801 | sc_mtu_to_threshold(dd->vld[i].sc, | 9810 | sc_mtu_to_threshold(dd->vld[i].sc, |
| 9802 | dd->vld[i].mtu, | 9811 | dd->vld[i].mtu, |
| 9803 | dd->rcd[0]->rcvhdrqentsize)); | 9812 | dd->rcd[0]->rcvhdrqentsize)); |
| 9804 | sc_set_cr_threshold(dd->vld[i].sc, thres); | 9813 | for (j = 0; j < INIT_SC_PER_VL; j++) |
| 9814 | sc_set_cr_threshold( | ||
| 9815 | pio_select_send_context_vl(dd, j, i), | ||
| 9816 | thres); | ||
| 9805 | } | 9817 | } |
| 9806 | thres = min(sc_percent_to_threshold(dd->vld[15].sc, 50), | 9818 | thres = min(sc_percent_to_threshold(dd->vld[15].sc, 50), |
| 9807 | sc_mtu_to_threshold(dd->vld[15].sc, | 9819 | sc_mtu_to_threshold(dd->vld[15].sc, |
diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c index 7a5b0e676cc7..c702a009608f 100644 --- a/drivers/infiniband/hw/hfi1/file_ops.c +++ b/drivers/infiniband/hw/hfi1/file_ops.c | |||
| @@ -203,6 +203,9 @@ static long hfi1_file_ioctl(struct file *fp, unsigned int cmd, | |||
| 203 | 203 | ||
| 204 | switch (cmd) { | 204 | switch (cmd) { |
| 205 | case HFI1_IOCTL_ASSIGN_CTXT: | 205 | case HFI1_IOCTL_ASSIGN_CTXT: |
| 206 | if (uctxt) | ||
| 207 | return -EINVAL; | ||
| 208 | |||
| 206 | if (copy_from_user(&uinfo, | 209 | if (copy_from_user(&uinfo, |
| 207 | (struct hfi1_user_info __user *)arg, | 210 | (struct hfi1_user_info __user *)arg, |
| 208 | sizeof(uinfo))) | 211 | sizeof(uinfo))) |
diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c index 0d28a5a40fae..eed971ccd2a1 100644 --- a/drivers/infiniband/hw/hfi1/init.c +++ b/drivers/infiniband/hw/hfi1/init.c | |||
| @@ -1383,7 +1383,7 @@ static void postinit_cleanup(struct hfi1_devdata *dd) | |||
| 1383 | static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 1383 | static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 1384 | { | 1384 | { |
| 1385 | int ret = 0, j, pidx, initfail; | 1385 | int ret = 0, j, pidx, initfail; |
| 1386 | struct hfi1_devdata *dd = NULL; | 1386 | struct hfi1_devdata *dd = ERR_PTR(-EINVAL); |
| 1387 | struct hfi1_pportdata *ppd; | 1387 | struct hfi1_pportdata *ppd; |
| 1388 | 1388 | ||
| 1389 | /* First, lock the non-writable module parameters */ | 1389 | /* First, lock the non-writable module parameters */ |
diff --git a/drivers/infiniband/hw/hfi1/mad.c b/drivers/infiniband/hw/hfi1/mad.c index 219029576ba0..fca07a1d6c28 100644 --- a/drivers/infiniband/hw/hfi1/mad.c +++ b/drivers/infiniband/hw/hfi1/mad.c | |||
| @@ -78,6 +78,16 @@ static inline void clear_opa_smp_data(struct opa_smp *smp) | |||
| 78 | memset(data, 0, size); | 78 | memset(data, 0, size); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | void hfi1_event_pkey_change(struct hfi1_devdata *dd, u8 port) | ||
| 82 | { | ||
| 83 | struct ib_event event; | ||
| 84 | |||
| 85 | event.event = IB_EVENT_PKEY_CHANGE; | ||
| 86 | event.device = &dd->verbs_dev.rdi.ibdev; | ||
| 87 | event.element.port_num = port; | ||
| 88 | ib_dispatch_event(&event); | ||
| 89 | } | ||
| 90 | |||
| 81 | static void send_trap(struct hfi1_ibport *ibp, void *data, unsigned len) | 91 | static void send_trap(struct hfi1_ibport *ibp, void *data, unsigned len) |
| 82 | { | 92 | { |
| 83 | struct ib_mad_send_buf *send_buf; | 93 | struct ib_mad_send_buf *send_buf; |
| @@ -1418,15 +1428,10 @@ static int set_pkeys(struct hfi1_devdata *dd, u8 port, u16 *pkeys) | |||
| 1418 | } | 1428 | } |
| 1419 | 1429 | ||
| 1420 | if (changed) { | 1430 | if (changed) { |
| 1421 | struct ib_event event; | ||
| 1422 | |||
| 1423 | (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); | 1431 | (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); |
| 1424 | 1432 | hfi1_event_pkey_change(dd, port); | |
| 1425 | event.event = IB_EVENT_PKEY_CHANGE; | ||
| 1426 | event.device = &dd->verbs_dev.rdi.ibdev; | ||
| 1427 | event.element.port_num = port; | ||
| 1428 | ib_dispatch_event(&event); | ||
| 1429 | } | 1433 | } |
| 1434 | |||
| 1430 | return 0; | 1435 | return 0; |
| 1431 | } | 1436 | } |
| 1432 | 1437 | ||
diff --git a/drivers/infiniband/hw/hfi1/mad.h b/drivers/infiniband/hw/hfi1/mad.h index 55ee08675333..8b734aaae88a 100644 --- a/drivers/infiniband/hw/hfi1/mad.h +++ b/drivers/infiniband/hw/hfi1/mad.h | |||
| @@ -434,4 +434,6 @@ struct sc2vlnt { | |||
| 434 | COUNTER_MASK(1, 3) | \ | 434 | COUNTER_MASK(1, 3) | \ |
| 435 | COUNTER_MASK(1, 4)) | 435 | COUNTER_MASK(1, 4)) |
| 436 | 436 | ||
| 437 | void hfi1_event_pkey_change(struct hfi1_devdata *dd, u8 port); | ||
| 438 | |||
| 437 | #endif /* _HFI1_MAD_H */ | 439 | #endif /* _HFI1_MAD_H */ |
diff --git a/drivers/infiniband/hw/hfi1/pio.c b/drivers/infiniband/hw/hfi1/pio.c index d5edb1afbb8f..d4022450b73f 100644 --- a/drivers/infiniband/hw/hfi1/pio.c +++ b/drivers/infiniband/hw/hfi1/pio.c | |||
| @@ -995,7 +995,7 @@ static void sc_wait_for_packet_egress(struct send_context *sc, int pause) | |||
| 995 | /* counter is reset if occupancy count changes */ | 995 | /* counter is reset if occupancy count changes */ |
| 996 | if (reg != reg_prev) | 996 | if (reg != reg_prev) |
| 997 | loop = 0; | 997 | loop = 0; |
| 998 | if (loop > 500) { | 998 | if (loop > 50000) { |
| 999 | /* timed out - bounce the link */ | 999 | /* timed out - bounce the link */ |
| 1000 | dd_dev_err(dd, | 1000 | dd_dev_err(dd, |
| 1001 | "%s: context %u(%u) timeout waiting for packets to egress, remaining count %u, bouncing link\n", | 1001 | "%s: context %u(%u) timeout waiting for packets to egress, remaining count %u, bouncing link\n", |
| @@ -1798,6 +1798,21 @@ static void pio_map_rcu_callback(struct rcu_head *list) | |||
| 1798 | } | 1798 | } |
| 1799 | 1799 | ||
| 1800 | /* | 1800 | /* |
| 1801 | * Set credit return threshold for the kernel send context | ||
| 1802 | */ | ||
| 1803 | static void set_threshold(struct hfi1_devdata *dd, int scontext, int i) | ||
| 1804 | { | ||
| 1805 | u32 thres; | ||
| 1806 | |||
| 1807 | thres = min(sc_percent_to_threshold(dd->kernel_send_context[scontext], | ||
| 1808 | 50), | ||
| 1809 | sc_mtu_to_threshold(dd->kernel_send_context[scontext], | ||
| 1810 | dd->vld[i].mtu, | ||
| 1811 | dd->rcd[0]->rcvhdrqentsize)); | ||
| 1812 | sc_set_cr_threshold(dd->kernel_send_context[scontext], thres); | ||
| 1813 | } | ||
| 1814 | |||
| 1815 | /* | ||
| 1801 | * pio_map_init - called when #vls change | 1816 | * pio_map_init - called when #vls change |
| 1802 | * @dd: hfi1_devdata | 1817 | * @dd: hfi1_devdata |
| 1803 | * @port: port number | 1818 | * @port: port number |
| @@ -1872,11 +1887,16 @@ int pio_map_init(struct hfi1_devdata *dd, u8 port, u8 num_vls, u8 *vl_scontexts) | |||
| 1872 | if (!newmap->map[i]) | 1887 | if (!newmap->map[i]) |
| 1873 | goto bail; | 1888 | goto bail; |
| 1874 | newmap->map[i]->mask = (1 << ilog2(sz)) - 1; | 1889 | newmap->map[i]->mask = (1 << ilog2(sz)) - 1; |
| 1875 | /* assign send contexts */ | 1890 | /* |
| 1891 | * assign send contexts and | ||
| 1892 | * adjust credit return threshold | ||
| 1893 | */ | ||
| 1876 | for (j = 0; j < sz; j++) { | 1894 | for (j = 0; j < sz; j++) { |
| 1877 | if (dd->kernel_send_context[scontext]) | 1895 | if (dd->kernel_send_context[scontext]) { |
| 1878 | newmap->map[i]->ksc[j] = | 1896 | newmap->map[i]->ksc[j] = |
| 1879 | dd->kernel_send_context[scontext]; | 1897 | dd->kernel_send_context[scontext]; |
| 1898 | set_threshold(dd, scontext, i); | ||
| 1899 | } | ||
| 1880 | if (++scontext >= first_scontext + | 1900 | if (++scontext >= first_scontext + |
| 1881 | vl_scontexts[i]) | 1901 | vl_scontexts[i]) |
| 1882 | /* wrap back to first send context */ | 1902 | /* wrap back to first send context */ |
diff --git a/drivers/infiniband/hw/hfi1/qsfp.c b/drivers/infiniband/hw/hfi1/qsfp.c index 2441669f0817..9fb561682c66 100644 --- a/drivers/infiniband/hw/hfi1/qsfp.c +++ b/drivers/infiniband/hw/hfi1/qsfp.c | |||
| @@ -579,7 +579,8 @@ int qsfp_dump(struct hfi1_pportdata *ppd, char *buf, int len) | |||
| 579 | 579 | ||
| 580 | if (ppd->qsfp_info.cache_valid) { | 580 | if (ppd->qsfp_info.cache_valid) { |
| 581 | if (QSFP_IS_CU(cache[QSFP_MOD_TECH_OFFS])) | 581 | if (QSFP_IS_CU(cache[QSFP_MOD_TECH_OFFS])) |
| 582 | sprintf(lenstr, "%dM ", cache[QSFP_MOD_LEN_OFFS]); | 582 | snprintf(lenstr, sizeof(lenstr), "%dM ", |
| 583 | cache[QSFP_MOD_LEN_OFFS]); | ||
| 583 | 584 | ||
| 584 | power_byte = cache[QSFP_MOD_PWR_OFFS]; | 585 | power_byte = cache[QSFP_MOD_PWR_OFFS]; |
| 585 | sofar += scnprintf(buf + sofar, len - sofar, "PWR:%.3sW\n", | 586 | sofar += scnprintf(buf + sofar, len - sofar, "PWR:%.3sW\n", |
diff --git a/drivers/infiniband/hw/hfi1/verbs_txreq.c b/drivers/infiniband/hw/hfi1/verbs_txreq.c index bc95c4112c61..d8fb056526f8 100644 --- a/drivers/infiniband/hw/hfi1/verbs_txreq.c +++ b/drivers/infiniband/hw/hfi1/verbs_txreq.c | |||
| @@ -92,11 +92,10 @@ void hfi1_put_txreq(struct verbs_txreq *tx) | |||
| 92 | 92 | ||
| 93 | struct verbs_txreq *__get_txreq(struct hfi1_ibdev *dev, | 93 | struct verbs_txreq *__get_txreq(struct hfi1_ibdev *dev, |
| 94 | struct rvt_qp *qp) | 94 | struct rvt_qp *qp) |
| 95 | __must_hold(&qp->s_lock) | ||
| 95 | { | 96 | { |
| 96 | struct verbs_txreq *tx = ERR_PTR(-EBUSY); | 97 | struct verbs_txreq *tx = ERR_PTR(-EBUSY); |
| 97 | unsigned long flags; | ||
| 98 | 98 | ||
| 99 | spin_lock_irqsave(&qp->s_lock, flags); | ||
| 100 | write_seqlock(&dev->iowait_lock); | 99 | write_seqlock(&dev->iowait_lock); |
| 101 | if (ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK) { | 100 | if (ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK) { |
| 102 | struct hfi1_qp_priv *priv; | 101 | struct hfi1_qp_priv *priv; |
| @@ -116,7 +115,6 @@ struct verbs_txreq *__get_txreq(struct hfi1_ibdev *dev, | |||
| 116 | } | 115 | } |
| 117 | out: | 116 | out: |
| 118 | write_sequnlock(&dev->iowait_lock); | 117 | write_sequnlock(&dev->iowait_lock); |
| 119 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
| 120 | return tx; | 118 | return tx; |
| 121 | } | 119 | } |
| 122 | 120 | ||
diff --git a/drivers/infiniband/hw/hfi1/verbs_txreq.h b/drivers/infiniband/hw/hfi1/verbs_txreq.h index 1cf69b2fe4a5..a1d6e0807f97 100644 --- a/drivers/infiniband/hw/hfi1/verbs_txreq.h +++ b/drivers/infiniband/hw/hfi1/verbs_txreq.h | |||
| @@ -73,6 +73,7 @@ struct verbs_txreq *__get_txreq(struct hfi1_ibdev *dev, | |||
| 73 | 73 | ||
| 74 | static inline struct verbs_txreq *get_txreq(struct hfi1_ibdev *dev, | 74 | static inline struct verbs_txreq *get_txreq(struct hfi1_ibdev *dev, |
| 75 | struct rvt_qp *qp) | 75 | struct rvt_qp *qp) |
| 76 | __must_hold(&qp->slock) | ||
| 76 | { | 77 | { |
| 77 | struct verbs_txreq *tx; | 78 | struct verbs_txreq *tx; |
| 78 | struct hfi1_qp_priv *priv = qp->priv; | 79 | struct hfi1_qp_priv *priv = qp->priv; |
diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h index 8b9532034558..b738acdb9b02 100644 --- a/drivers/infiniband/hw/i40iw/i40iw.h +++ b/drivers/infiniband/hw/i40iw/i40iw.h | |||
| @@ -113,6 +113,8 @@ | |||
| 113 | 113 | ||
| 114 | #define IW_HMC_OBJ_TYPE_NUM ARRAY_SIZE(iw_hmc_obj_types) | 114 | #define IW_HMC_OBJ_TYPE_NUM ARRAY_SIZE(iw_hmc_obj_types) |
| 115 | #define IW_CFG_FPM_QP_COUNT 32768 | 115 | #define IW_CFG_FPM_QP_COUNT 32768 |
| 116 | #define I40IW_MAX_PAGES_PER_FMR 512 | ||
| 117 | #define I40IW_MIN_PAGES_PER_FMR 1 | ||
| 116 | 118 | ||
| 117 | #define I40IW_MTU_TO_MSS 40 | 119 | #define I40IW_MTU_TO_MSS 40 |
| 118 | #define I40IW_DEFAULT_MSS 1460 | 120 | #define I40IW_DEFAULT_MSS 1460 |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c index 02a735b64208..33959ed14563 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c | |||
| @@ -79,6 +79,7 @@ static int i40iw_query_device(struct ib_device *ibdev, | |||
| 79 | props->max_qp_init_rd_atom = props->max_qp_rd_atom; | 79 | props->max_qp_init_rd_atom = props->max_qp_rd_atom; |
| 80 | props->atomic_cap = IB_ATOMIC_NONE; | 80 | props->atomic_cap = IB_ATOMIC_NONE; |
| 81 | props->max_map_per_fmr = 1; | 81 | props->max_map_per_fmr = 1; |
| 82 | props->max_fast_reg_page_list_len = I40IW_MAX_PAGES_PER_FMR; | ||
| 82 | return 0; | 83 | return 0; |
| 83 | } | 84 | } |
| 84 | 85 | ||
| @@ -1527,7 +1528,7 @@ static struct ib_mr *i40iw_alloc_mr(struct ib_pd *pd, | |||
| 1527 | mutex_lock(&iwdev->pbl_mutex); | 1528 | mutex_lock(&iwdev->pbl_mutex); |
| 1528 | status = i40iw_get_pble(&iwdev->sc_dev, iwdev->pble_rsrc, palloc, iwmr->page_cnt); | 1529 | status = i40iw_get_pble(&iwdev->sc_dev, iwdev->pble_rsrc, palloc, iwmr->page_cnt); |
| 1529 | mutex_unlock(&iwdev->pbl_mutex); | 1530 | mutex_unlock(&iwdev->pbl_mutex); |
| 1530 | if (!status) | 1531 | if (status) |
| 1531 | goto err1; | 1532 | goto err1; |
| 1532 | 1533 | ||
| 1533 | if (palloc->level != I40IW_LEVEL_1) | 1534 | if (palloc->level != I40IW_LEVEL_1) |
| @@ -2149,6 +2150,7 @@ static int i40iw_post_send(struct ib_qp *ibqp, | |||
| 2149 | struct i40iw_sc_dev *dev = &iwqp->iwdev->sc_dev; | 2150 | struct i40iw_sc_dev *dev = &iwqp->iwdev->sc_dev; |
| 2150 | struct i40iw_fast_reg_stag_info info; | 2151 | struct i40iw_fast_reg_stag_info info; |
| 2151 | 2152 | ||
| 2153 | memset(&info, 0, sizeof(info)); | ||
| 2152 | info.access_rights = I40IW_ACCESS_FLAGS_LOCALREAD; | 2154 | info.access_rights = I40IW_ACCESS_FLAGS_LOCALREAD; |
| 2153 | info.access_rights |= i40iw_get_user_access(flags); | 2155 | info.access_rights |= i40iw_get_user_access(flags); |
| 2154 | info.stag_key = reg_wr(ib_wr)->key & 0xff; | 2156 | info.stag_key = reg_wr(ib_wr)->key & 0xff; |
| @@ -2158,10 +2160,14 @@ static int i40iw_post_send(struct ib_qp *ibqp, | |||
| 2158 | info.addr_type = I40IW_ADDR_TYPE_VA_BASED; | 2160 | info.addr_type = I40IW_ADDR_TYPE_VA_BASED; |
| 2159 | info.va = (void *)(uintptr_t)iwmr->ibmr.iova; | 2161 | info.va = (void *)(uintptr_t)iwmr->ibmr.iova; |
| 2160 | info.total_len = iwmr->ibmr.length; | 2162 | info.total_len = iwmr->ibmr.length; |
| 2163 | info.reg_addr_pa = *(u64 *)palloc->level1.addr; | ||
| 2161 | info.first_pm_pbl_index = palloc->level1.idx; | 2164 | info.first_pm_pbl_index = palloc->level1.idx; |
| 2162 | info.local_fence = ib_wr->send_flags & IB_SEND_FENCE; | 2165 | info.local_fence = ib_wr->send_flags & IB_SEND_FENCE; |
| 2163 | info.signaled = ib_wr->send_flags & IB_SEND_SIGNALED; | 2166 | info.signaled = ib_wr->send_flags & IB_SEND_SIGNALED; |
| 2164 | 2167 | ||
| 2168 | if (iwmr->npages > I40IW_MIN_PAGES_PER_FMR) | ||
| 2169 | info.chunk_size = 1; | ||
| 2170 | |||
| 2165 | if (page_shift == 21) | 2171 | if (page_shift == 21) |
| 2166 | info.page_size = 1; /* 2M page */ | 2172 | info.page_size = 1; /* 2M page */ |
| 2167 | 2173 | ||
| @@ -2327,13 +2333,16 @@ static int i40iw_req_notify_cq(struct ib_cq *ibcq, | |||
| 2327 | { | 2333 | { |
| 2328 | struct i40iw_cq *iwcq; | 2334 | struct i40iw_cq *iwcq; |
| 2329 | struct i40iw_cq_uk *ukcq; | 2335 | struct i40iw_cq_uk *ukcq; |
| 2330 | enum i40iw_completion_notify cq_notify = IW_CQ_COMPL_SOLICITED; | 2336 | unsigned long flags; |
| 2337 | enum i40iw_completion_notify cq_notify = IW_CQ_COMPL_EVENT; | ||
| 2331 | 2338 | ||
| 2332 | iwcq = (struct i40iw_cq *)ibcq; | 2339 | iwcq = (struct i40iw_cq *)ibcq; |
| 2333 | ukcq = &iwcq->sc_cq.cq_uk; | 2340 | ukcq = &iwcq->sc_cq.cq_uk; |
| 2334 | if (notify_flags == IB_CQ_NEXT_COMP) | 2341 | if (notify_flags == IB_CQ_SOLICITED) |
| 2335 | cq_notify = IW_CQ_COMPL_EVENT; | 2342 | cq_notify = IW_CQ_COMPL_SOLICITED; |
| 2343 | spin_lock_irqsave(&iwcq->lock, flags); | ||
| 2336 | ukcq->ops.iw_cq_request_notification(ukcq, cq_notify); | 2344 | ukcq->ops.iw_cq_request_notification(ukcq, cq_notify); |
| 2345 | spin_unlock_irqrestore(&iwcq->lock, flags); | ||
| 2337 | return 0; | 2346 | return 0; |
| 2338 | } | 2347 | } |
| 2339 | 2348 | ||
diff --git a/drivers/infiniband/hw/mlx4/ah.c b/drivers/infiniband/hw/mlx4/ah.c index 105246fba2e7..5fc623362731 100644 --- a/drivers/infiniband/hw/mlx4/ah.c +++ b/drivers/infiniband/hw/mlx4/ah.c | |||
| @@ -47,6 +47,7 @@ static struct ib_ah *create_ib_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr, | |||
| 47 | 47 | ||
| 48 | ah->av.ib.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24)); | 48 | ah->av.ib.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24)); |
| 49 | ah->av.ib.g_slid = ah_attr->src_path_bits; | 49 | ah->av.ib.g_slid = ah_attr->src_path_bits; |
| 50 | ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28); | ||
| 50 | if (ah_attr->ah_flags & IB_AH_GRH) { | 51 | if (ah_attr->ah_flags & IB_AH_GRH) { |
| 51 | ah->av.ib.g_slid |= 0x80; | 52 | ah->av.ib.g_slid |= 0x80; |
| 52 | ah->av.ib.gid_index = ah_attr->grh.sgid_index; | 53 | ah->av.ib.gid_index = ah_attr->grh.sgid_index; |
| @@ -64,7 +65,6 @@ static struct ib_ah *create_ib_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr, | |||
| 64 | !(1 << ah->av.ib.stat_rate & dev->caps.stat_rate_support)) | 65 | !(1 << ah->av.ib.stat_rate & dev->caps.stat_rate_support)) |
| 65 | --ah->av.ib.stat_rate; | 66 | --ah->av.ib.stat_rate; |
| 66 | } | 67 | } |
| 67 | ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28); | ||
| 68 | 68 | ||
| 69 | return &ah->ibah; | 69 | return &ah->ibah; |
| 70 | } | 70 | } |
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index d68f506c1922..9c2e53d28f98 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
| @@ -527,7 +527,7 @@ int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port, | |||
| 527 | tun_tx_ix = (++tun_qp->tx_ix_head) & (MLX4_NUM_TUNNEL_BUFS - 1); | 527 | tun_tx_ix = (++tun_qp->tx_ix_head) & (MLX4_NUM_TUNNEL_BUFS - 1); |
| 528 | spin_unlock(&tun_qp->tx_lock); | 528 | spin_unlock(&tun_qp->tx_lock); |
| 529 | if (ret) | 529 | if (ret) |
| 530 | goto out; | 530 | goto end; |
| 531 | 531 | ||
| 532 | tun_mad = (struct mlx4_rcv_tunnel_mad *) (tun_qp->tx_ring[tun_tx_ix].buf.addr); | 532 | tun_mad = (struct mlx4_rcv_tunnel_mad *) (tun_qp->tx_ring[tun_tx_ix].buf.addr); |
| 533 | if (tun_qp->tx_ring[tun_tx_ix].ah) | 533 | if (tun_qp->tx_ring[tun_tx_ix].ah) |
| @@ -596,9 +596,15 @@ int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port, | |||
| 596 | wr.wr.send_flags = IB_SEND_SIGNALED; | 596 | wr.wr.send_flags = IB_SEND_SIGNALED; |
| 597 | 597 | ||
| 598 | ret = ib_post_send(src_qp, &wr.wr, &bad_wr); | 598 | ret = ib_post_send(src_qp, &wr.wr, &bad_wr); |
| 599 | out: | 599 | if (!ret) |
| 600 | if (ret) | 600 | return 0; |
| 601 | ib_destroy_ah(ah); | 601 | out: |
| 602 | spin_lock(&tun_qp->tx_lock); | ||
| 603 | tun_qp->tx_ix_tail++; | ||
| 604 | spin_unlock(&tun_qp->tx_lock); | ||
| 605 | tun_qp->tx_ring[tun_tx_ix].ah = NULL; | ||
| 606 | end: | ||
| 607 | ib_destroy_ah(ah); | ||
| 602 | return ret; | 608 | return ret; |
| 603 | } | 609 | } |
| 604 | 610 | ||
| @@ -1326,9 +1332,15 @@ int mlx4_ib_send_to_wire(struct mlx4_ib_dev *dev, int slave, u8 port, | |||
| 1326 | 1332 | ||
| 1327 | 1333 | ||
| 1328 | ret = ib_post_send(send_qp, &wr.wr, &bad_wr); | 1334 | ret = ib_post_send(send_qp, &wr.wr, &bad_wr); |
| 1335 | if (!ret) | ||
| 1336 | return 0; | ||
| 1337 | |||
| 1338 | spin_lock(&sqp->tx_lock); | ||
| 1339 | sqp->tx_ix_tail++; | ||
| 1340 | spin_unlock(&sqp->tx_lock); | ||
| 1341 | sqp->tx_ring[wire_tx_ix].ah = NULL; | ||
| 1329 | out: | 1342 | out: |
| 1330 | if (ret) | 1343 | ib_destroy_ah(ah); |
| 1331 | ib_destroy_ah(ah); | ||
| 1332 | return ret; | 1344 | return ret; |
| 1333 | } | 1345 | } |
| 1334 | 1346 | ||
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 0eb09e104542..42a46078d7d5 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
| @@ -1704,6 +1704,9 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp, | |||
| 1704 | struct mlx4_dev *dev = (to_mdev(qp->device))->dev; | 1704 | struct mlx4_dev *dev = (to_mdev(qp->device))->dev; |
| 1705 | int is_bonded = mlx4_is_bonded(dev); | 1705 | int is_bonded = mlx4_is_bonded(dev); |
| 1706 | 1706 | ||
| 1707 | if (flow_attr->port < 1 || flow_attr->port > qp->device->phys_port_cnt) | ||
| 1708 | return ERR_PTR(-EINVAL); | ||
| 1709 | |||
| 1707 | if ((flow_attr->flags & IB_FLOW_ATTR_FLAGS_DONT_TRAP) && | 1710 | if ((flow_attr->flags & IB_FLOW_ATTR_FLAGS_DONT_TRAP) && |
| 1708 | (flow_attr->type != IB_FLOW_ATTR_NORMAL)) | 1711 | (flow_attr->type != IB_FLOW_ATTR_NORMAL)) |
| 1709 | return ERR_PTR(-EOPNOTSUPP); | 1712 | return ERR_PTR(-EOPNOTSUPP); |
diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h index 6c5ac5d8f32f..29acda249612 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h | |||
| @@ -139,7 +139,7 @@ struct mlx4_ib_mr { | |||
| 139 | u32 max_pages; | 139 | u32 max_pages; |
| 140 | struct mlx4_mr mmr; | 140 | struct mlx4_mr mmr; |
| 141 | struct ib_umem *umem; | 141 | struct ib_umem *umem; |
| 142 | void *pages_alloc; | 142 | size_t page_map_size; |
| 143 | }; | 143 | }; |
| 144 | 144 | ||
| 145 | struct mlx4_ib_mw { | 145 | struct mlx4_ib_mw { |
diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c index 631272172a0b..5d73989d9771 100644 --- a/drivers/infiniband/hw/mlx4/mr.c +++ b/drivers/infiniband/hw/mlx4/mr.c | |||
| @@ -277,20 +277,23 @@ mlx4_alloc_priv_pages(struct ib_device *device, | |||
| 277 | struct mlx4_ib_mr *mr, | 277 | struct mlx4_ib_mr *mr, |
| 278 | int max_pages) | 278 | int max_pages) |
| 279 | { | 279 | { |
| 280 | int size = max_pages * sizeof(u64); | ||
| 281 | int add_size; | ||
| 282 | int ret; | 280 | int ret; |
| 283 | 281 | ||
| 284 | add_size = max_t(int, MLX4_MR_PAGES_ALIGN - ARCH_KMALLOC_MINALIGN, 0); | 282 | /* Ensure that size is aligned to DMA cacheline |
| 283 | * requirements. | ||
| 284 | * max_pages is limited to MLX4_MAX_FAST_REG_PAGES | ||
| 285 | * so page_map_size will never cross PAGE_SIZE. | ||
| 286 | */ | ||
| 287 | mr->page_map_size = roundup(max_pages * sizeof(u64), | ||
| 288 | MLX4_MR_PAGES_ALIGN); | ||
| 285 | 289 | ||
| 286 | mr->pages_alloc = kzalloc(size + add_size, GFP_KERNEL); | 290 | /* Prevent cross page boundary allocation. */ |
| 287 | if (!mr->pages_alloc) | 291 | mr->pages = (__be64 *)get_zeroed_page(GFP_KERNEL); |
| 292 | if (!mr->pages) | ||
| 288 | return -ENOMEM; | 293 | return -ENOMEM; |
| 289 | 294 | ||
| 290 | mr->pages = PTR_ALIGN(mr->pages_alloc, MLX4_MR_PAGES_ALIGN); | ||
| 291 | |||
| 292 | mr->page_map = dma_map_single(device->dma_device, mr->pages, | 295 | mr->page_map = dma_map_single(device->dma_device, mr->pages, |
| 293 | size, DMA_TO_DEVICE); | 296 | mr->page_map_size, DMA_TO_DEVICE); |
| 294 | 297 | ||
| 295 | if (dma_mapping_error(device->dma_device, mr->page_map)) { | 298 | if (dma_mapping_error(device->dma_device, mr->page_map)) { |
| 296 | ret = -ENOMEM; | 299 | ret = -ENOMEM; |
| @@ -298,9 +301,9 @@ mlx4_alloc_priv_pages(struct ib_device *device, | |||
| 298 | } | 301 | } |
| 299 | 302 | ||
| 300 | return 0; | 303 | return 0; |
| 301 | err: | ||
| 302 | kfree(mr->pages_alloc); | ||
| 303 | 304 | ||
| 305 | err: | ||
| 306 | free_page((unsigned long)mr->pages); | ||
| 304 | return ret; | 307 | return ret; |
| 305 | } | 308 | } |
| 306 | 309 | ||
| @@ -309,11 +312,10 @@ mlx4_free_priv_pages(struct mlx4_ib_mr *mr) | |||
| 309 | { | 312 | { |
| 310 | if (mr->pages) { | 313 | if (mr->pages) { |
| 311 | struct ib_device *device = mr->ibmr.device; | 314 | struct ib_device *device = mr->ibmr.device; |
| 312 | int size = mr->max_pages * sizeof(u64); | ||
| 313 | 315 | ||
| 314 | dma_unmap_single(device->dma_device, mr->page_map, | 316 | dma_unmap_single(device->dma_device, mr->page_map, |
| 315 | size, DMA_TO_DEVICE); | 317 | mr->page_map_size, DMA_TO_DEVICE); |
| 316 | kfree(mr->pages_alloc); | 318 | free_page((unsigned long)mr->pages); |
| 317 | mr->pages = NULL; | 319 | mr->pages = NULL; |
| 318 | } | 320 | } |
| 319 | } | 321 | } |
| @@ -537,14 +539,12 @@ int mlx4_ib_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents, | |||
| 537 | mr->npages = 0; | 539 | mr->npages = 0; |
| 538 | 540 | ||
| 539 | ib_dma_sync_single_for_cpu(ibmr->device, mr->page_map, | 541 | ib_dma_sync_single_for_cpu(ibmr->device, mr->page_map, |
| 540 | sizeof(u64) * mr->max_pages, | 542 | mr->page_map_size, DMA_TO_DEVICE); |
| 541 | DMA_TO_DEVICE); | ||
| 542 | 543 | ||
| 543 | rc = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, mlx4_set_page); | 544 | rc = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, mlx4_set_page); |
| 544 | 545 | ||
| 545 | ib_dma_sync_single_for_device(ibmr->device, mr->page_map, | 546 | ib_dma_sync_single_for_device(ibmr->device, mr->page_map, |
| 546 | sizeof(u64) * mr->max_pages, | 547 | mr->page_map_size, DMA_TO_DEVICE); |
| 547 | DMA_TO_DEVICE); | ||
| 548 | 548 | ||
| 549 | return rc; | 549 | return rc; |
| 550 | } | 550 | } |
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c index 81b0e1fbec1d..8db8405c1e99 100644 --- a/drivers/infiniband/hw/mlx4/qp.c +++ b/drivers/infiniband/hw/mlx4/qp.c | |||
| @@ -362,7 +362,7 @@ static int send_wqe_overhead(enum mlx4_ib_qp_type type, u32 flags) | |||
| 362 | sizeof (struct mlx4_wqe_raddr_seg); | 362 | sizeof (struct mlx4_wqe_raddr_seg); |
| 363 | case MLX4_IB_QPT_RC: | 363 | case MLX4_IB_QPT_RC: |
| 364 | return sizeof (struct mlx4_wqe_ctrl_seg) + | 364 | return sizeof (struct mlx4_wqe_ctrl_seg) + |
| 365 | sizeof (struct mlx4_wqe_atomic_seg) + | 365 | sizeof (struct mlx4_wqe_masked_atomic_seg) + |
| 366 | sizeof (struct mlx4_wqe_raddr_seg); | 366 | sizeof (struct mlx4_wqe_raddr_seg); |
| 367 | case MLX4_IB_QPT_SMI: | 367 | case MLX4_IB_QPT_SMI: |
| 368 | case MLX4_IB_QPT_GSI: | 368 | case MLX4_IB_QPT_GSI: |
| @@ -1191,8 +1191,10 @@ static struct ib_qp *_mlx4_ib_create_qp(struct ib_pd *pd, | |||
| 1191 | { | 1191 | { |
| 1192 | err = create_qp_common(to_mdev(pd->device), pd, init_attr, | 1192 | err = create_qp_common(to_mdev(pd->device), pd, init_attr, |
| 1193 | udata, 0, &qp, gfp); | 1193 | udata, 0, &qp, gfp); |
| 1194 | if (err) | 1194 | if (err) { |
| 1195 | kfree(qp); | ||
| 1195 | return ERR_PTR(err); | 1196 | return ERR_PTR(err); |
| 1197 | } | ||
| 1196 | 1198 | ||
| 1197 | qp->ibqp.qp_num = qp->mqp.qpn; | 1199 | qp->ibqp.qp_num = qp->mqp.qpn; |
| 1198 | qp->xrcdn = xrcdn; | 1200 | qp->xrcdn = xrcdn; |
diff --git a/drivers/infiniband/hw/mlx5/mad.c b/drivers/infiniband/hw/mlx5/mad.c index 1534af113058..364aab9f3c9e 100644 --- a/drivers/infiniband/hw/mlx5/mad.c +++ b/drivers/infiniband/hw/mlx5/mad.c | |||
| @@ -121,7 +121,7 @@ static void pma_cnt_ext_assign(struct ib_pma_portcounters_ext *pma_cnt_ext, | |||
| 121 | pma_cnt_ext->port_xmit_data = | 121 | pma_cnt_ext->port_xmit_data = |
| 122 | cpu_to_be64(MLX5_SUM_CNT(out, transmitted_ib_unicast.octets, | 122 | cpu_to_be64(MLX5_SUM_CNT(out, transmitted_ib_unicast.octets, |
| 123 | transmitted_ib_multicast.octets) >> 2); | 123 | transmitted_ib_multicast.octets) >> 2); |
| 124 | pma_cnt_ext->port_xmit_data = | 124 | pma_cnt_ext->port_rcv_data = |
| 125 | cpu_to_be64(MLX5_SUM_CNT(out, received_ib_unicast.octets, | 125 | cpu_to_be64(MLX5_SUM_CNT(out, received_ib_unicast.octets, |
| 126 | received_ib_multicast.octets) >> 2); | 126 | received_ib_multicast.octets) >> 2); |
| 127 | pma_cnt_ext->port_xmit_packets = | 127 | pma_cnt_ext->port_xmit_packets = |
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index ce434228a5ea..ce0a7ab35a22 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c | |||
| @@ -3332,10 +3332,11 @@ static u8 get_fence(u8 fence, struct ib_send_wr *wr) | |||
| 3332 | return MLX5_FENCE_MODE_SMALL_AND_FENCE; | 3332 | return MLX5_FENCE_MODE_SMALL_AND_FENCE; |
| 3333 | else | 3333 | else |
| 3334 | return fence; | 3334 | return fence; |
| 3335 | 3335 | } else if (unlikely(wr->send_flags & IB_SEND_FENCE)) { | |
| 3336 | } else { | 3336 | return MLX5_FENCE_MODE_FENCE; |
| 3337 | return 0; | ||
| 3338 | } | 3337 | } |
| 3338 | |||
| 3339 | return 0; | ||
| 3339 | } | 3340 | } |
| 3340 | 3341 | ||
| 3341 | static int begin_wqe(struct mlx5_ib_qp *qp, void **seg, | 3342 | static int begin_wqe(struct mlx5_ib_qp *qp, void **seg, |
diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c index ff946d5f59e4..382466a90da7 100644 --- a/drivers/infiniband/hw/qib/qib_file_ops.c +++ b/drivers/infiniband/hw/qib/qib_file_ops.c | |||
| @@ -2178,6 +2178,11 @@ static ssize_t qib_write(struct file *fp, const char __user *data, | |||
| 2178 | 2178 | ||
| 2179 | switch (cmd.type) { | 2179 | switch (cmd.type) { |
| 2180 | case QIB_CMD_ASSIGN_CTXT: | 2180 | case QIB_CMD_ASSIGN_CTXT: |
| 2181 | if (rcd) { | ||
| 2182 | ret = -EINVAL; | ||
| 2183 | goto bail; | ||
| 2184 | } | ||
| 2185 | |||
| 2181 | ret = qib_assign_ctxt(fp, &cmd.cmd.user_info); | 2186 | ret = qib_assign_ctxt(fp, &cmd.cmd.user_info); |
| 2182 | if (ret) | 2187 | if (ret) |
| 2183 | goto bail; | 2188 | goto bail; |
diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c index 7de5134bec85..41ba7e9cadaa 100644 --- a/drivers/infiniband/sw/rdmavt/qp.c +++ b/drivers/infiniband/sw/rdmavt/qp.c | |||
| @@ -369,8 +369,8 @@ static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, | |||
| 369 | /* wrap to first map page, invert bit 0 */ | 369 | /* wrap to first map page, invert bit 0 */ |
| 370 | offset = qpt->incr | ((offset & 1) ^ 1); | 370 | offset = qpt->incr | ((offset & 1) ^ 1); |
| 371 | } | 371 | } |
| 372 | /* there can be no bits at shift and below */ | 372 | /* there can be no set bits in low-order QoS bits */ |
| 373 | WARN_ON(offset & (rdi->dparms.qos_shift - 1)); | 373 | WARN_ON(offset & (BIT(rdi->dparms.qos_shift) - 1)); |
| 374 | qpn = mk_qpn(qpt, map, offset); | 374 | qpn = mk_qpn(qpt, map, offset); |
| 375 | } | 375 | } |
| 376 | 376 | ||
| @@ -576,12 +576,6 @@ static void rvt_reset_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, | |||
| 576 | qp->s_ssn = 1; | 576 | qp->s_ssn = 1; |
| 577 | qp->s_lsn = 0; | 577 | qp->s_lsn = 0; |
| 578 | qp->s_mig_state = IB_MIG_MIGRATED; | 578 | qp->s_mig_state = IB_MIG_MIGRATED; |
| 579 | if (qp->s_ack_queue) | ||
| 580 | memset( | ||
| 581 | qp->s_ack_queue, | ||
| 582 | 0, | ||
| 583 | rvt_max_atomic(rdi) * | ||
| 584 | sizeof(*qp->s_ack_queue)); | ||
| 585 | qp->r_head_ack_queue = 0; | 579 | qp->r_head_ack_queue = 0; |
| 586 | qp->s_tail_ack_queue = 0; | 580 | qp->s_tail_ack_queue = 0; |
| 587 | qp->s_num_rd_atomic = 0; | 581 | qp->s_num_rd_atomic = 0; |
| @@ -705,8 +699,10 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, | |||
| 705 | * initialization that is needed. | 699 | * initialization that is needed. |
| 706 | */ | 700 | */ |
| 707 | priv = rdi->driver_f.qp_priv_alloc(rdi, qp, gfp); | 701 | priv = rdi->driver_f.qp_priv_alloc(rdi, qp, gfp); |
| 708 | if (!priv) | 702 | if (IS_ERR(priv)) { |
| 703 | ret = priv; | ||
| 709 | goto bail_qp; | 704 | goto bail_qp; |
| 705 | } | ||
| 710 | qp->priv = priv; | 706 | qp->priv = priv; |
| 711 | qp->timeout_jiffies = | 707 | qp->timeout_jiffies = |
| 712 | usecs_to_jiffies((4096UL * (1UL << qp->timeout)) / | 708 | usecs_to_jiffies((4096UL * (1UL << qp->timeout)) / |
diff --git a/drivers/infiniband/sw/rdmavt/vt.c b/drivers/infiniband/sw/rdmavt/vt.c index e1cc2cc42f25..30c4fda7a05a 100644 --- a/drivers/infiniband/sw/rdmavt/vt.c +++ b/drivers/infiniband/sw/rdmavt/vt.c | |||
| @@ -501,9 +501,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb) | |||
| 501 | !rdi->driver_f.quiesce_qp || | 501 | !rdi->driver_f.quiesce_qp || |
| 502 | !rdi->driver_f.notify_error_qp || | 502 | !rdi->driver_f.notify_error_qp || |
| 503 | !rdi->driver_f.mtu_from_qp || | 503 | !rdi->driver_f.mtu_from_qp || |
| 504 | !rdi->driver_f.mtu_to_path_mtu || | 504 | !rdi->driver_f.mtu_to_path_mtu) |
| 505 | !rdi->driver_f.shut_down_port || | ||
| 506 | !rdi->driver_f.cap_mask_chg) | ||
| 507 | return -EINVAL; | 505 | return -EINVAL; |
| 508 | break; | 506 | break; |
| 509 | 507 | ||
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index e68b20cba70b..4a4155640d51 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c | |||
| @@ -1638,8 +1638,7 @@ retry: | |||
| 1638 | */ | 1638 | */ |
| 1639 | qp_init->cap.max_send_wr = srp_sq_size / 2; | 1639 | qp_init->cap.max_send_wr = srp_sq_size / 2; |
| 1640 | qp_init->cap.max_rdma_ctxs = srp_sq_size / 2; | 1640 | qp_init->cap.max_rdma_ctxs = srp_sq_size / 2; |
| 1641 | qp_init->cap.max_send_sge = max(sdev->device->attrs.max_sge_rd, | 1641 | qp_init->cap.max_send_sge = SRPT_DEF_SG_PER_WQE; |
| 1642 | sdev->device->attrs.max_sge); | ||
| 1643 | qp_init->port_num = ch->sport->port; | 1642 | qp_init->port_num = ch->sport->port; |
| 1644 | 1643 | ||
| 1645 | ch->qp = ib_create_qp(sdev->pd, qp_init); | 1644 | ch->qp = ib_create_qp(sdev->pd, qp_init); |
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h index fee6bfd7ca21..389030487da7 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.h +++ b/drivers/infiniband/ulp/srpt/ib_srpt.h | |||
| @@ -106,6 +106,7 @@ enum { | |||
| 106 | SRP_LOGIN_RSP_MULTICHAN_MAINTAINED = 0x2, | 106 | SRP_LOGIN_RSP_MULTICHAN_MAINTAINED = 0x2, |
| 107 | 107 | ||
| 108 | SRPT_DEF_SG_TABLESIZE = 128, | 108 | SRPT_DEF_SG_TABLESIZE = 128, |
| 109 | SRPT_DEF_SG_PER_WQE = 16, | ||
| 109 | 110 | ||
| 110 | MIN_SRPT_SQ_SIZE = 16, | 111 | MIN_SRPT_SQ_SIZE = 16, |
| 111 | DEF_SRPT_SQ_SIZE = 4096, | 112 | DEF_SRPT_SQ_SIZE = 4096, |
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 804dbcc37d3f..3438e98c145a 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
| @@ -1031,17 +1031,17 @@ static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect | |||
| 1031 | 1031 | ||
| 1032 | case XTYPE_XBOXONE: | 1032 | case XTYPE_XBOXONE: |
| 1033 | packet->data[0] = 0x09; /* activate rumble */ | 1033 | packet->data[0] = 0x09; /* activate rumble */ |
| 1034 | packet->data[1] = 0x08; | 1034 | packet->data[1] = 0x00; |
| 1035 | packet->data[2] = xpad->odata_serial++; | 1035 | packet->data[2] = xpad->odata_serial++; |
| 1036 | packet->data[3] = 0x08; /* continuous effect */ | 1036 | packet->data[3] = 0x09; |
| 1037 | packet->data[4] = 0x00; /* simple rumble mode */ | 1037 | packet->data[4] = 0x00; |
| 1038 | packet->data[5] = 0x03; /* L and R actuator only */ | 1038 | packet->data[5] = 0x0F; |
| 1039 | packet->data[6] = 0x00; /* TODO: LT actuator */ | 1039 | packet->data[6] = 0x00; |
| 1040 | packet->data[7] = 0x00; /* TODO: RT actuator */ | 1040 | packet->data[7] = 0x00; |
| 1041 | packet->data[8] = strong / 512; /* left actuator */ | 1041 | packet->data[8] = strong / 512; /* left actuator */ |
| 1042 | packet->data[9] = weak / 512; /* right actuator */ | 1042 | packet->data[9] = weak / 512; /* right actuator */ |
| 1043 | packet->data[10] = 0x80; /* length of pulse */ | 1043 | packet->data[10] = 0xFF; |
| 1044 | packet->data[11] = 0x00; /* stop period of pulse */ | 1044 | packet->data[11] = 0x00; |
| 1045 | packet->data[12] = 0x00; | 1045 | packet->data[12] = 0x00; |
| 1046 | packet->len = 13; | 1046 | packet->len = 13; |
| 1047 | packet->pending = true; | 1047 | packet->pending = true; |
| @@ -1437,16 +1437,6 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
| 1437 | break; | 1437 | break; |
| 1438 | } | 1438 | } |
| 1439 | 1439 | ||
| 1440 | if (xpad_device[i].xtype == XTYPE_XBOXONE && | ||
| 1441 | intf->cur_altsetting->desc.bInterfaceNumber != 0) { | ||
| 1442 | /* | ||
| 1443 | * The Xbox One controller lists three interfaces all with the | ||
| 1444 | * same interface class, subclass and protocol. Differentiate by | ||
| 1445 | * interface number. | ||
| 1446 | */ | ||
| 1447 | return -ENODEV; | ||
| 1448 | } | ||
| 1449 | |||
| 1450 | xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL); | 1440 | xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL); |
| 1451 | if (!xpad) | 1441 | if (!xpad) |
| 1452 | return -ENOMEM; | 1442 | return -ENOMEM; |
| @@ -1478,6 +1468,8 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
| 1478 | if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { | 1468 | if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { |
| 1479 | if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) | 1469 | if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) |
| 1480 | xpad->xtype = XTYPE_XBOX360W; | 1470 | xpad->xtype = XTYPE_XBOX360W; |
| 1471 | else if (intf->cur_altsetting->desc.bInterfaceProtocol == 208) | ||
| 1472 | xpad->xtype = XTYPE_XBOXONE; | ||
| 1481 | else | 1473 | else |
| 1482 | xpad->xtype = XTYPE_XBOX360; | 1474 | xpad->xtype = XTYPE_XBOX360; |
| 1483 | } else { | 1475 | } else { |
| @@ -1492,6 +1484,17 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
| 1492 | xpad->mapping |= MAP_STICKS_TO_NULL; | 1484 | xpad->mapping |= MAP_STICKS_TO_NULL; |
| 1493 | } | 1485 | } |
| 1494 | 1486 | ||
| 1487 | if (xpad->xtype == XTYPE_XBOXONE && | ||
| 1488 | intf->cur_altsetting->desc.bInterfaceNumber != 0) { | ||
| 1489 | /* | ||
| 1490 | * The Xbox One controller lists three interfaces all with the | ||
| 1491 | * same interface class, subclass and protocol. Differentiate by | ||
| 1492 | * interface number. | ||
| 1493 | */ | ||
| 1494 | error = -ENODEV; | ||
| 1495 | goto err_free_in_urb; | ||
| 1496 | } | ||
| 1497 | |||
| 1495 | error = xpad_init_output(intf, xpad); | 1498 | error = xpad_init_output(intf, xpad); |
| 1496 | if (error) | 1499 | if (error) |
| 1497 | goto err_free_in_urb; | 1500 | goto err_free_in_urb; |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 78f93cf68840..be5b399da5d3 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
| @@ -1568,13 +1568,7 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
| 1568 | case 5: | 1568 | case 5: |
| 1569 | etd->hw_version = 3; | 1569 | etd->hw_version = 3; |
| 1570 | break; | 1570 | break; |
| 1571 | case 6: | 1571 | case 6 ... 14: |
| 1572 | case 7: | ||
| 1573 | case 8: | ||
| 1574 | case 9: | ||
| 1575 | case 10: | ||
| 1576 | case 13: | ||
| 1577 | case 14: | ||
| 1578 | etd->hw_version = 4; | 1572 | etd->hw_version = 4; |
| 1579 | break; | 1573 | break; |
| 1580 | default: | 1574 | default: |
diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c index a3f0f5a47490..0f586780ceb4 100644 --- a/drivers/input/mouse/vmmouse.c +++ b/drivers/input/mouse/vmmouse.c | |||
| @@ -355,18 +355,11 @@ int vmmouse_detect(struct psmouse *psmouse, bool set_properties) | |||
| 355 | return -ENXIO; | 355 | return -ENXIO; |
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | if (!request_region(VMMOUSE_PROTO_PORT, 4, "vmmouse")) { | ||
| 359 | psmouse_dbg(psmouse, "VMMouse port in use.\n"); | ||
| 360 | return -EBUSY; | ||
| 361 | } | ||
| 362 | |||
| 363 | /* Check if the device is present */ | 358 | /* Check if the device is present */ |
| 364 | response = ~VMMOUSE_PROTO_MAGIC; | 359 | response = ~VMMOUSE_PROTO_MAGIC; |
| 365 | VMMOUSE_CMD(GETVERSION, 0, version, response, dummy1, dummy2); | 360 | VMMOUSE_CMD(GETVERSION, 0, version, response, dummy1, dummy2); |
| 366 | if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU) { | 361 | if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU) |
| 367 | release_region(VMMOUSE_PROTO_PORT, 4); | ||
| 368 | return -ENXIO; | 362 | return -ENXIO; |
| 369 | } | ||
| 370 | 363 | ||
| 371 | if (set_properties) { | 364 | if (set_properties) { |
| 372 | psmouse->vendor = VMMOUSE_VENDOR; | 365 | psmouse->vendor = VMMOUSE_VENDOR; |
| @@ -374,8 +367,6 @@ int vmmouse_detect(struct psmouse *psmouse, bool set_properties) | |||
| 374 | psmouse->model = version; | 367 | psmouse->model = version; |
| 375 | } | 368 | } |
| 376 | 369 | ||
| 377 | release_region(VMMOUSE_PROTO_PORT, 4); | ||
| 378 | |||
| 379 | return 0; | 370 | return 0; |
| 380 | } | 371 | } |
| 381 | 372 | ||
| @@ -394,7 +385,6 @@ static void vmmouse_disconnect(struct psmouse *psmouse) | |||
| 394 | psmouse_reset(psmouse); | 385 | psmouse_reset(psmouse); |
| 395 | input_unregister_device(priv->abs_dev); | 386 | input_unregister_device(priv->abs_dev); |
| 396 | kfree(priv); | 387 | kfree(priv); |
| 397 | release_region(VMMOUSE_PROTO_PORT, 4); | ||
| 398 | } | 388 | } |
| 399 | 389 | ||
| 400 | /** | 390 | /** |
| @@ -438,15 +428,10 @@ int vmmouse_init(struct psmouse *psmouse) | |||
| 438 | struct input_dev *rel_dev = psmouse->dev, *abs_dev; | 428 | struct input_dev *rel_dev = psmouse->dev, *abs_dev; |
| 439 | int error; | 429 | int error; |
| 440 | 430 | ||
| 441 | if (!request_region(VMMOUSE_PROTO_PORT, 4, "vmmouse")) { | ||
| 442 | psmouse_dbg(psmouse, "VMMouse port in use.\n"); | ||
| 443 | return -EBUSY; | ||
| 444 | } | ||
| 445 | |||
| 446 | psmouse_reset(psmouse); | 431 | psmouse_reset(psmouse); |
| 447 | error = vmmouse_enable(psmouse); | 432 | error = vmmouse_enable(psmouse); |
| 448 | if (error) | 433 | if (error) |
| 449 | goto release_region; | 434 | return error; |
| 450 | 435 | ||
| 451 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | 436 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
| 452 | abs_dev = input_allocate_device(); | 437 | abs_dev = input_allocate_device(); |
| @@ -502,8 +487,5 @@ init_fail: | |||
| 502 | kfree(priv); | 487 | kfree(priv); |
| 503 | psmouse->private = NULL; | 488 | psmouse->private = NULL; |
| 504 | 489 | ||
| 505 | release_region: | ||
| 506 | release_region(VMMOUSE_PROTO_PORT, 4); | ||
| 507 | |||
| 508 | return error; | 490 | return error; |
| 509 | } | 491 | } |
diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c index bab3c6acf6a2..0c9191cf324d 100644 --- a/drivers/input/touchscreen/wacom_w8001.c +++ b/drivers/input/touchscreen/wacom_w8001.c | |||
| @@ -27,7 +27,7 @@ MODULE_AUTHOR("Jaya Kumar <jayakumar.lkml@gmail.com>"); | |||
| 27 | MODULE_DESCRIPTION(DRIVER_DESC); | 27 | MODULE_DESCRIPTION(DRIVER_DESC); |
| 28 | MODULE_LICENSE("GPL"); | 28 | MODULE_LICENSE("GPL"); |
| 29 | 29 | ||
| 30 | #define W8001_MAX_LENGTH 11 | 30 | #define W8001_MAX_LENGTH 13 |
| 31 | #define W8001_LEAD_MASK 0x80 | 31 | #define W8001_LEAD_MASK 0x80 |
| 32 | #define W8001_LEAD_BYTE 0x80 | 32 | #define W8001_LEAD_BYTE 0x80 |
| 33 | #define W8001_TAB_MASK 0x40 | 33 | #define W8001_TAB_MASK 0x40 |
| @@ -339,6 +339,15 @@ static irqreturn_t w8001_interrupt(struct serio *serio, | |||
| 339 | w8001->idx = 0; | 339 | w8001->idx = 0; |
| 340 | parse_multi_touch(w8001); | 340 | parse_multi_touch(w8001); |
| 341 | break; | 341 | break; |
| 342 | |||
| 343 | default: | ||
| 344 | /* | ||
| 345 | * ThinkPad X60 Tablet PC (pen only device) sometimes | ||
| 346 | * sends invalid data packets that are larger than | ||
| 347 | * W8001_PKTLEN_TPCPEN. Let's start over again. | ||
| 348 | */ | ||
| 349 | if (!w8001->touch_dev && w8001->idx > W8001_PKTLEN_TPCPEN - 1) | ||
| 350 | w8001->idx = 0; | ||
| 342 | } | 351 | } |
| 343 | 352 | ||
| 344 | return IRQ_HANDLED; | 353 | return IRQ_HANDLED; |
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index 3b5e10aa48ab..8a4adbeb2b8c 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c | |||
| @@ -746,6 +746,12 @@ static int gic_irq_domain_alloc(struct irq_domain *d, unsigned int virq, | |||
| 746 | /* verify that it doesn't conflict with an IPI irq */ | 746 | /* verify that it doesn't conflict with an IPI irq */ |
| 747 | if (test_bit(spec->hwirq, ipi_resrv)) | 747 | if (test_bit(spec->hwirq, ipi_resrv)) |
| 748 | return -EBUSY; | 748 | return -EBUSY; |
| 749 | |||
| 750 | hwirq = GIC_SHARED_TO_HWIRQ(spec->hwirq); | ||
| 751 | |||
| 752 | return irq_domain_set_hwirq_and_chip(d, virq, hwirq, | ||
| 753 | &gic_level_irq_controller, | ||
| 754 | NULL); | ||
| 749 | } else { | 755 | } else { |
| 750 | base_hwirq = find_first_bit(ipi_resrv, gic_shared_intrs); | 756 | base_hwirq = find_first_bit(ipi_resrv, gic_shared_intrs); |
| 751 | if (base_hwirq == gic_shared_intrs) { | 757 | if (base_hwirq == gic_shared_intrs) { |
| @@ -867,10 +873,14 @@ static int gic_dev_domain_alloc(struct irq_domain *d, unsigned int virq, | |||
| 867 | &gic_level_irq_controller, | 873 | &gic_level_irq_controller, |
| 868 | NULL); | 874 | NULL); |
| 869 | if (ret) | 875 | if (ret) |
| 870 | return ret; | 876 | goto error; |
| 871 | } | 877 | } |
| 872 | 878 | ||
| 873 | return 0; | 879 | return 0; |
| 880 | |||
| 881 | error: | ||
| 882 | irq_domain_free_irqs_parent(d, virq, nr_irqs); | ||
| 883 | return ret; | ||
| 874 | } | 884 | } |
| 875 | 885 | ||
| 876 | void gic_dev_domain_free(struct irq_domain *d, unsigned int virq, | 886 | void gic_dev_domain_free(struct irq_domain *d, unsigned int virq, |
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index 5780dd1ba79d..ebf517271d29 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
| @@ -575,6 +575,7 @@ static int recover_peb(struct ubi_device *ubi, int pnum, int vol_id, int lnum, | |||
| 575 | int err, idx = vol_id2idx(ubi, vol_id), new_pnum, data_size, tries = 0; | 575 | int err, idx = vol_id2idx(ubi, vol_id), new_pnum, data_size, tries = 0; |
| 576 | struct ubi_volume *vol = ubi->volumes[idx]; | 576 | struct ubi_volume *vol = ubi->volumes[idx]; |
| 577 | struct ubi_vid_hdr *vid_hdr; | 577 | struct ubi_vid_hdr *vid_hdr; |
| 578 | uint32_t crc; | ||
| 578 | 579 | ||
| 579 | vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); | 580 | vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); |
| 580 | if (!vid_hdr) | 581 | if (!vid_hdr) |
| @@ -599,14 +600,8 @@ retry: | |||
| 599 | goto out_put; | 600 | goto out_put; |
| 600 | } | 601 | } |
| 601 | 602 | ||
| 602 | vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); | 603 | ubi_assert(vid_hdr->vol_type == UBI_VID_DYNAMIC); |
| 603 | err = ubi_io_write_vid_hdr(ubi, new_pnum, vid_hdr); | ||
| 604 | if (err) { | ||
| 605 | up_read(&ubi->fm_eba_sem); | ||
| 606 | goto write_error; | ||
| 607 | } | ||
| 608 | 604 | ||
| 609 | data_size = offset + len; | ||
| 610 | mutex_lock(&ubi->buf_mutex); | 605 | mutex_lock(&ubi->buf_mutex); |
| 611 | memset(ubi->peb_buf + offset, 0xFF, len); | 606 | memset(ubi->peb_buf + offset, 0xFF, len); |
| 612 | 607 | ||
| @@ -621,6 +616,19 @@ retry: | |||
| 621 | 616 | ||
| 622 | memcpy(ubi->peb_buf + offset, buf, len); | 617 | memcpy(ubi->peb_buf + offset, buf, len); |
| 623 | 618 | ||
| 619 | data_size = offset + len; | ||
| 620 | crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, data_size); | ||
| 621 | vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi)); | ||
| 622 | vid_hdr->copy_flag = 1; | ||
| 623 | vid_hdr->data_size = cpu_to_be32(data_size); | ||
| 624 | vid_hdr->data_crc = cpu_to_be32(crc); | ||
| 625 | err = ubi_io_write_vid_hdr(ubi, new_pnum, vid_hdr); | ||
| 626 | if (err) { | ||
| 627 | mutex_unlock(&ubi->buf_mutex); | ||
| 628 | up_read(&ubi->fm_eba_sem); | ||
| 629 | goto write_error; | ||
| 630 | } | ||
| 631 | |||
| 624 | err = ubi_io_write_data(ubi, ubi->peb_buf, new_pnum, 0, data_size); | 632 | err = ubi_io_write_data(ubi, ubi->peb_buf, new_pnum, 0, data_size); |
| 625 | if (err) { | 633 | if (err) { |
| 626 | mutex_unlock(&ubi->buf_mutex); | 634 | mutex_unlock(&ubi->buf_mutex); |
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index b9304a295f86..ca81f46ea1aa 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
| @@ -657,6 +657,20 @@ static void __set_agg_ports_ready(struct aggregator *aggregator, int val) | |||
| 657 | } | 657 | } |
| 658 | } | 658 | } |
| 659 | 659 | ||
| 660 | static int __agg_active_ports(struct aggregator *agg) | ||
| 661 | { | ||
| 662 | struct port *port; | ||
| 663 | int active = 0; | ||
| 664 | |||
| 665 | for (port = agg->lag_ports; port; | ||
| 666 | port = port->next_port_in_aggregator) { | ||
| 667 | if (port->is_enabled) | ||
| 668 | active++; | ||
| 669 | } | ||
| 670 | |||
| 671 | return active; | ||
| 672 | } | ||
| 673 | |||
| 660 | /** | 674 | /** |
| 661 | * __get_agg_bandwidth - get the total bandwidth of an aggregator | 675 | * __get_agg_bandwidth - get the total bandwidth of an aggregator |
| 662 | * @aggregator: the aggregator we're looking at | 676 | * @aggregator: the aggregator we're looking at |
| @@ -664,39 +678,40 @@ static void __set_agg_ports_ready(struct aggregator *aggregator, int val) | |||
| 664 | */ | 678 | */ |
| 665 | static u32 __get_agg_bandwidth(struct aggregator *aggregator) | 679 | static u32 __get_agg_bandwidth(struct aggregator *aggregator) |
| 666 | { | 680 | { |
| 681 | int nports = __agg_active_ports(aggregator); | ||
| 667 | u32 bandwidth = 0; | 682 | u32 bandwidth = 0; |
| 668 | 683 | ||
| 669 | if (aggregator->num_of_ports) { | 684 | if (nports) { |
| 670 | switch (__get_link_speed(aggregator->lag_ports)) { | 685 | switch (__get_link_speed(aggregator->lag_ports)) { |
| 671 | case AD_LINK_SPEED_1MBPS: | 686 | case AD_LINK_SPEED_1MBPS: |
| 672 | bandwidth = aggregator->num_of_ports; | 687 | bandwidth = nports; |
| 673 | break; | 688 | break; |
| 674 | case AD_LINK_SPEED_10MBPS: | 689 | case AD_LINK_SPEED_10MBPS: |
| 675 | bandwidth = aggregator->num_of_ports * 10; | 690 | bandwidth = nports * 10; |
| 676 | break; | 691 | break; |
| 677 | case AD_LINK_SPEED_100MBPS: | 692 | case AD_LINK_SPEED_100MBPS: |
| 678 | bandwidth = aggregator->num_of_ports * 100; | 693 | bandwidth = nports * 100; |
| 679 | break; | 694 | break; |
| 680 | case AD_LINK_SPEED_1000MBPS: | 695 | case AD_LINK_SPEED_1000MBPS: |
| 681 | bandwidth = aggregator->num_of_ports * 1000; | 696 | bandwidth = nports * 1000; |
| 682 | break; | 697 | break; |
| 683 | case AD_LINK_SPEED_2500MBPS: | 698 | case AD_LINK_SPEED_2500MBPS: |
| 684 | bandwidth = aggregator->num_of_ports * 2500; | 699 | bandwidth = nports * 2500; |
| 685 | break; | 700 | break; |
| 686 | case AD_LINK_SPEED_10000MBPS: | 701 | case AD_LINK_SPEED_10000MBPS: |
| 687 | bandwidth = aggregator->num_of_ports * 10000; | 702 | bandwidth = nports * 10000; |
| 688 | break; | 703 | break; |
| 689 | case AD_LINK_SPEED_20000MBPS: | 704 | case AD_LINK_SPEED_20000MBPS: |
| 690 | bandwidth = aggregator->num_of_ports * 20000; | 705 | bandwidth = nports * 20000; |
| 691 | break; | 706 | break; |
| 692 | case AD_LINK_SPEED_40000MBPS: | 707 | case AD_LINK_SPEED_40000MBPS: |
| 693 | bandwidth = aggregator->num_of_ports * 40000; | 708 | bandwidth = nports * 40000; |
| 694 | break; | 709 | break; |
| 695 | case AD_LINK_SPEED_56000MBPS: | 710 | case AD_LINK_SPEED_56000MBPS: |
| 696 | bandwidth = aggregator->num_of_ports * 56000; | 711 | bandwidth = nports * 56000; |
| 697 | break; | 712 | break; |
| 698 | case AD_LINK_SPEED_100000MBPS: | 713 | case AD_LINK_SPEED_100000MBPS: |
| 699 | bandwidth = aggregator->num_of_ports * 100000; | 714 | bandwidth = nports * 100000; |
| 700 | break; | 715 | break; |
| 701 | default: | 716 | default: |
| 702 | bandwidth = 0; /* to silence the compiler */ | 717 | bandwidth = 0; /* to silence the compiler */ |
| @@ -1530,10 +1545,10 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best, | |||
| 1530 | 1545 | ||
| 1531 | switch (__get_agg_selection_mode(curr->lag_ports)) { | 1546 | switch (__get_agg_selection_mode(curr->lag_ports)) { |
| 1532 | case BOND_AD_COUNT: | 1547 | case BOND_AD_COUNT: |
| 1533 | if (curr->num_of_ports > best->num_of_ports) | 1548 | if (__agg_active_ports(curr) > __agg_active_ports(best)) |
| 1534 | return curr; | 1549 | return curr; |
| 1535 | 1550 | ||
| 1536 | if (curr->num_of_ports < best->num_of_ports) | 1551 | if (__agg_active_ports(curr) < __agg_active_ports(best)) |
| 1537 | return best; | 1552 | return best; |
| 1538 | 1553 | ||
| 1539 | /*FALLTHROUGH*/ | 1554 | /*FALLTHROUGH*/ |
| @@ -1561,8 +1576,14 @@ static int agg_device_up(const struct aggregator *agg) | |||
| 1561 | if (!port) | 1576 | if (!port) |
| 1562 | return 0; | 1577 | return 0; |
| 1563 | 1578 | ||
| 1564 | return netif_running(port->slave->dev) && | 1579 | for (port = agg->lag_ports; port; |
| 1565 | netif_carrier_ok(port->slave->dev); | 1580 | port = port->next_port_in_aggregator) { |
| 1581 | if (netif_running(port->slave->dev) && | ||
| 1582 | netif_carrier_ok(port->slave->dev)) | ||
| 1583 | return 1; | ||
| 1584 | } | ||
| 1585 | |||
| 1586 | return 0; | ||
| 1566 | } | 1587 | } |
| 1567 | 1588 | ||
| 1568 | /** | 1589 | /** |
| @@ -1610,7 +1631,7 @@ static void ad_agg_selection_logic(struct aggregator *agg, | |||
| 1610 | 1631 | ||
| 1611 | agg->is_active = 0; | 1632 | agg->is_active = 0; |
| 1612 | 1633 | ||
| 1613 | if (agg->num_of_ports && agg_device_up(agg)) | 1634 | if (__agg_active_ports(agg) && agg_device_up(agg)) |
| 1614 | best = ad_agg_selection_test(best, agg); | 1635 | best = ad_agg_selection_test(best, agg); |
| 1615 | } | 1636 | } |
| 1616 | 1637 | ||
| @@ -1622,7 +1643,7 @@ static void ad_agg_selection_logic(struct aggregator *agg, | |||
| 1622 | * answering partner. | 1643 | * answering partner. |
| 1623 | */ | 1644 | */ |
| 1624 | if (active && active->lag_ports && | 1645 | if (active && active->lag_ports && |
| 1625 | active->lag_ports->is_enabled && | 1646 | __agg_active_ports(active) && |
| 1626 | (__agg_has_partner(active) || | 1647 | (__agg_has_partner(active) || |
| 1627 | (!__agg_has_partner(active) && | 1648 | (!__agg_has_partner(active) && |
| 1628 | !__agg_has_partner(best)))) { | 1649 | !__agg_has_partner(best)))) { |
| @@ -2133,7 +2154,7 @@ void bond_3ad_unbind_slave(struct slave *slave) | |||
| 2133 | else | 2154 | else |
| 2134 | temp_aggregator->lag_ports = temp_port->next_port_in_aggregator; | 2155 | temp_aggregator->lag_ports = temp_port->next_port_in_aggregator; |
| 2135 | temp_aggregator->num_of_ports--; | 2156 | temp_aggregator->num_of_ports--; |
| 2136 | if (temp_aggregator->num_of_ports == 0) { | 2157 | if (__agg_active_ports(temp_aggregator) == 0) { |
| 2137 | select_new_active_agg = temp_aggregator->is_active; | 2158 | select_new_active_agg = temp_aggregator->is_active; |
| 2138 | ad_clear_agg(temp_aggregator); | 2159 | ad_clear_agg(temp_aggregator); |
| 2139 | if (select_new_active_agg) { | 2160 | if (select_new_active_agg) { |
| @@ -2432,7 +2453,9 @@ void bond_3ad_adapter_speed_duplex_changed(struct slave *slave) | |||
| 2432 | */ | 2453 | */ |
| 2433 | void bond_3ad_handle_link_change(struct slave *slave, char link) | 2454 | void bond_3ad_handle_link_change(struct slave *slave, char link) |
| 2434 | { | 2455 | { |
| 2456 | struct aggregator *agg; | ||
| 2435 | struct port *port; | 2457 | struct port *port; |
| 2458 | bool dummy; | ||
| 2436 | 2459 | ||
| 2437 | port = &(SLAVE_AD_INFO(slave)->port); | 2460 | port = &(SLAVE_AD_INFO(slave)->port); |
| 2438 | 2461 | ||
| @@ -2459,6 +2482,9 @@ void bond_3ad_handle_link_change(struct slave *slave, char link) | |||
| 2459 | port->is_enabled = false; | 2482 | port->is_enabled = false; |
| 2460 | ad_update_actor_keys(port, true); | 2483 | ad_update_actor_keys(port, true); |
| 2461 | } | 2484 | } |
| 2485 | agg = __get_first_agg(port); | ||
| 2486 | ad_agg_selection_logic(agg, &dummy); | ||
| 2487 | |||
| 2462 | netdev_dbg(slave->bond->dev, "Port %d changed link status to %s\n", | 2488 | netdev_dbg(slave->bond->dev, "Port %d changed link status to %s\n", |
| 2463 | port->actor_port_number, | 2489 | port->actor_port_number, |
| 2464 | link == BOND_LINK_UP ? "UP" : "DOWN"); | 2490 | link == BOND_LINK_UP ? "UP" : "DOWN"); |
| @@ -2499,7 +2525,7 @@ int bond_3ad_set_carrier(struct bonding *bond) | |||
| 2499 | active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator)); | 2525 | active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator)); |
| 2500 | if (active) { | 2526 | if (active) { |
| 2501 | /* are enough slaves available to consider link up? */ | 2527 | /* are enough slaves available to consider link up? */ |
| 2502 | if (active->num_of_ports < bond->params.min_links) { | 2528 | if (__agg_active_ports(active) < bond->params.min_links) { |
| 2503 | if (netif_carrier_ok(bond->dev)) { | 2529 | if (netif_carrier_ok(bond->dev)) { |
| 2504 | netif_carrier_off(bond->dev); | 2530 | netif_carrier_off(bond->dev); |
| 2505 | goto out; | 2531 | goto out; |
diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c index 8b3275d7792a..8f5e93cb7975 100644 --- a/drivers/net/can/at91_can.c +++ b/drivers/net/can/at91_can.c | |||
| @@ -712,9 +712,10 @@ static int at91_poll_rx(struct net_device *dev, int quota) | |||
| 712 | 712 | ||
| 713 | /* upper group completed, look again in lower */ | 713 | /* upper group completed, look again in lower */ |
| 714 | if (priv->rx_next > get_mb_rx_low_last(priv) && | 714 | if (priv->rx_next > get_mb_rx_low_last(priv) && |
| 715 | quota > 0 && mb > get_mb_rx_last(priv)) { | 715 | mb > get_mb_rx_last(priv)) { |
| 716 | priv->rx_next = get_mb_rx_first(priv); | 716 | priv->rx_next = get_mb_rx_first(priv); |
| 717 | goto again; | 717 | if (quota > 0) |
| 718 | goto again; | ||
| 718 | } | 719 | } |
| 719 | 720 | ||
| 720 | return received; | 721 | return received; |
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index f91b094288da..e3dccd3200d5 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
| @@ -332,9 +332,23 @@ static void c_can_setup_tx_object(struct net_device *dev, int iface, | |||
| 332 | 332 | ||
| 333 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl); | 333 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl); |
| 334 | 334 | ||
| 335 | for (i = 0; i < frame->can_dlc; i += 2) { | 335 | if (priv->type == BOSCH_D_CAN) { |
| 336 | priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2, | 336 | u32 data = 0, dreg = C_CAN_IFACE(DATA1_REG, iface); |
| 337 | frame->data[i] | (frame->data[i + 1] << 8)); | 337 | |
| 338 | for (i = 0; i < frame->can_dlc; i += 4, dreg += 2) { | ||
| 339 | data = (u32)frame->data[i]; | ||
| 340 | data |= (u32)frame->data[i + 1] << 8; | ||
| 341 | data |= (u32)frame->data[i + 2] << 16; | ||
| 342 | data |= (u32)frame->data[i + 3] << 24; | ||
| 343 | priv->write_reg32(priv, dreg, data); | ||
| 344 | } | ||
| 345 | } else { | ||
| 346 | for (i = 0; i < frame->can_dlc; i += 2) { | ||
| 347 | priv->write_reg(priv, | ||
| 348 | C_CAN_IFACE(DATA1_REG, iface) + i / 2, | ||
| 349 | frame->data[i] | | ||
| 350 | (frame->data[i + 1] << 8)); | ||
| 351 | } | ||
| 338 | } | 352 | } |
| 339 | } | 353 | } |
| 340 | 354 | ||
| @@ -402,10 +416,20 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl) | |||
| 402 | } else { | 416 | } else { |
| 403 | int i, dreg = C_CAN_IFACE(DATA1_REG, iface); | 417 | int i, dreg = C_CAN_IFACE(DATA1_REG, iface); |
| 404 | 418 | ||
| 405 | for (i = 0; i < frame->can_dlc; i += 2, dreg ++) { | 419 | if (priv->type == BOSCH_D_CAN) { |
| 406 | data = priv->read_reg(priv, dreg); | 420 | for (i = 0; i < frame->can_dlc; i += 4, dreg += 2) { |
| 407 | frame->data[i] = data; | 421 | data = priv->read_reg32(priv, dreg); |
| 408 | frame->data[i + 1] = data >> 8; | 422 | frame->data[i] = data; |
| 423 | frame->data[i + 1] = data >> 8; | ||
| 424 | frame->data[i + 2] = data >> 16; | ||
| 425 | frame->data[i + 3] = data >> 24; | ||
| 426 | } | ||
| 427 | } else { | ||
| 428 | for (i = 0; i < frame->can_dlc; i += 2, dreg++) { | ||
| 429 | data = priv->read_reg(priv, dreg); | ||
| 430 | frame->data[i] = data; | ||
| 431 | frame->data[i + 1] = data >> 8; | ||
| 432 | } | ||
| 409 | } | 433 | } |
| 410 | } | 434 | } |
| 411 | 435 | ||
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 910c12e2638e..ad535a854e5c 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
| @@ -798,6 +798,9 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[]) | |||
| 798 | * - control mode with CAN_CTRLMODE_FD set | 798 | * - control mode with CAN_CTRLMODE_FD set |
| 799 | */ | 799 | */ |
| 800 | 800 | ||
| 801 | if (!data) | ||
| 802 | return 0; | ||
| 803 | |||
| 801 | if (data[IFLA_CAN_CTRLMODE]) { | 804 | if (data[IFLA_CAN_CTRLMODE]) { |
| 802 | struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]); | 805 | struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]); |
| 803 | 806 | ||
| @@ -1008,6 +1011,11 @@ static int can_newlink(struct net *src_net, struct net_device *dev, | |||
| 1008 | return -EOPNOTSUPP; | 1011 | return -EOPNOTSUPP; |
| 1009 | } | 1012 | } |
| 1010 | 1013 | ||
| 1014 | static void can_dellink(struct net_device *dev, struct list_head *head) | ||
| 1015 | { | ||
| 1016 | return; | ||
| 1017 | } | ||
| 1018 | |||
| 1011 | static struct rtnl_link_ops can_link_ops __read_mostly = { | 1019 | static struct rtnl_link_ops can_link_ops __read_mostly = { |
| 1012 | .kind = "can", | 1020 | .kind = "can", |
| 1013 | .maxtype = IFLA_CAN_MAX, | 1021 | .maxtype = IFLA_CAN_MAX, |
| @@ -1016,6 +1024,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = { | |||
| 1016 | .validate = can_validate, | 1024 | .validate = can_validate, |
| 1017 | .newlink = can_newlink, | 1025 | .newlink = can_newlink, |
| 1018 | .changelink = can_changelink, | 1026 | .changelink = can_changelink, |
| 1027 | .dellink = can_dellink, | ||
| 1019 | .get_size = can_get_size, | 1028 | .get_size = can_get_size, |
| 1020 | .fill_info = can_fill_info, | 1029 | .fill_info = can_fill_info, |
| 1021 | .get_xstats_size = can_get_xstats_size, | 1030 | .get_xstats_size = can_get_xstats_size, |
diff --git a/drivers/net/can/usb/Kconfig b/drivers/net/can/usb/Kconfig index bcb272f6c68a..8483a40e7e9e 100644 --- a/drivers/net/can/usb/Kconfig +++ b/drivers/net/can/usb/Kconfig | |||
| @@ -16,7 +16,8 @@ config CAN_ESD_USB2 | |||
| 16 | config CAN_GS_USB | 16 | config CAN_GS_USB |
| 17 | tristate "Geschwister Schneider UG interfaces" | 17 | tristate "Geschwister Schneider UG interfaces" |
| 18 | ---help--- | 18 | ---help--- |
| 19 | This driver supports the Geschwister Schneider USB/CAN devices. | 19 | This driver supports the Geschwister Schneider and bytewerk.org |
| 20 | candleLight USB CAN interfaces USB/CAN devices | ||
| 20 | If unsure choose N, | 21 | If unsure choose N, |
| 21 | choose Y for built in support, | 22 | choose Y for built in support, |
| 22 | M to compile as module (module will be named: gs_usb). | 23 | M to compile as module (module will be named: gs_usb). |
| @@ -46,6 +47,8 @@ config CAN_KVASER_USB | |||
| 46 | - Kvaser USBcan R | 47 | - Kvaser USBcan R |
| 47 | - Kvaser Leaf Light v2 | 48 | - Kvaser Leaf Light v2 |
| 48 | - Kvaser Mini PCI Express HS | 49 | - Kvaser Mini PCI Express HS |
| 50 | - Kvaser Mini PCI Express 2xHS | ||
| 51 | - Kvaser USBcan Light 2xHS | ||
| 49 | - Kvaser USBcan II HS/HS | 52 | - Kvaser USBcan II HS/HS |
| 50 | - Kvaser USBcan II HS/LS | 53 | - Kvaser USBcan II HS/LS |
| 51 | - Kvaser USBcan Rugged ("USBcan Rev B") | 54 | - Kvaser USBcan Rugged ("USBcan Rev B") |
diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 1556d4286235..acb0c8490673 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c | |||
| @@ -1,7 +1,9 @@ | |||
| 1 | /* CAN driver for Geschwister Schneider USB/CAN devices. | 1 | /* CAN driver for Geschwister Schneider USB/CAN devices |
| 2 | * and bytewerk.org candleLight USB CAN interfaces. | ||
| 2 | * | 3 | * |
| 3 | * Copyright (C) 2013 Geschwister Schneider Technologie-, | 4 | * Copyright (C) 2013-2016 Geschwister Schneider Technologie-, |
| 4 | * Entwicklungs- und Vertriebs UG (Haftungsbeschränkt). | 5 | * Entwicklungs- und Vertriebs UG (Haftungsbeschränkt). |
| 6 | * Copyright (C) 2016 Hubert Denkmair | ||
| 5 | * | 7 | * |
| 6 | * Many thanks to all socketcan devs! | 8 | * Many thanks to all socketcan devs! |
| 7 | * | 9 | * |
| @@ -29,6 +31,9 @@ | |||
| 29 | #define USB_GSUSB_1_VENDOR_ID 0x1d50 | 31 | #define USB_GSUSB_1_VENDOR_ID 0x1d50 |
| 30 | #define USB_GSUSB_1_PRODUCT_ID 0x606f | 32 | #define USB_GSUSB_1_PRODUCT_ID 0x606f |
| 31 | 33 | ||
| 34 | #define USB_CANDLELIGHT_VENDOR_ID 0x1209 | ||
| 35 | #define USB_CANDLELIGHT_PRODUCT_ID 0x2323 | ||
| 36 | |||
| 32 | #define GSUSB_ENDPOINT_IN 1 | 37 | #define GSUSB_ENDPOINT_IN 1 |
| 33 | #define GSUSB_ENDPOINT_OUT 2 | 38 | #define GSUSB_ENDPOINT_OUT 2 |
| 34 | 39 | ||
| @@ -952,6 +957,8 @@ static void gs_usb_disconnect(struct usb_interface *intf) | |||
| 952 | static const struct usb_device_id gs_usb_table[] = { | 957 | static const struct usb_device_id gs_usb_table[] = { |
| 953 | { USB_DEVICE_INTERFACE_NUMBER(USB_GSUSB_1_VENDOR_ID, | 958 | { USB_DEVICE_INTERFACE_NUMBER(USB_GSUSB_1_VENDOR_ID, |
| 954 | USB_GSUSB_1_PRODUCT_ID, 0) }, | 959 | USB_GSUSB_1_PRODUCT_ID, 0) }, |
| 960 | { USB_DEVICE_INTERFACE_NUMBER(USB_CANDLELIGHT_VENDOR_ID, | ||
| 961 | USB_CANDLELIGHT_PRODUCT_ID, 0) }, | ||
| 955 | {} /* Terminating entry */ | 962 | {} /* Terminating entry */ |
| 956 | }; | 963 | }; |
| 957 | 964 | ||
| @@ -969,5 +976,6 @@ module_usb_driver(gs_usb_driver); | |||
| 969 | MODULE_AUTHOR("Maximilian Schneider <mws@schneidersoft.net>"); | 976 | MODULE_AUTHOR("Maximilian Schneider <mws@schneidersoft.net>"); |
| 970 | MODULE_DESCRIPTION( | 977 | MODULE_DESCRIPTION( |
| 971 | "Socket CAN device driver for Geschwister Schneider Technologie-, " | 978 | "Socket CAN device driver for Geschwister Schneider Technologie-, " |
| 972 | "Entwicklungs- und Vertriebs UG. USB2.0 to CAN interfaces."); | 979 | "Entwicklungs- und Vertriebs UG. USB2.0 to CAN interfaces\n" |
| 980 | "and bytewerk.org candleLight USB CAN interfaces."); | ||
| 973 | MODULE_LICENSE("GPL v2"); | 981 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 022bfa13ebfa..6f1f3b675ff5 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
| @@ -59,11 +59,14 @@ | |||
| 59 | #define USB_CAN_R_PRODUCT_ID 39 | 59 | #define USB_CAN_R_PRODUCT_ID 39 |
| 60 | #define USB_LEAF_LITE_V2_PRODUCT_ID 288 | 60 | #define USB_LEAF_LITE_V2_PRODUCT_ID 288 |
| 61 | #define USB_MINI_PCIE_HS_PRODUCT_ID 289 | 61 | #define USB_MINI_PCIE_HS_PRODUCT_ID 289 |
| 62 | #define USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID 290 | ||
| 63 | #define USB_USBCAN_LIGHT_2HS_PRODUCT_ID 291 | ||
| 64 | #define USB_MINI_PCIE_2HS_PRODUCT_ID 292 | ||
| 62 | 65 | ||
| 63 | static inline bool kvaser_is_leaf(const struct usb_device_id *id) | 66 | static inline bool kvaser_is_leaf(const struct usb_device_id *id) |
| 64 | { | 67 | { |
| 65 | return id->idProduct >= USB_LEAF_DEVEL_PRODUCT_ID && | 68 | return id->idProduct >= USB_LEAF_DEVEL_PRODUCT_ID && |
| 66 | id->idProduct <= USB_MINI_PCIE_HS_PRODUCT_ID; | 69 | id->idProduct <= USB_MINI_PCIE_2HS_PRODUCT_ID; |
| 67 | } | 70 | } |
| 68 | 71 | ||
| 69 | /* Kvaser USBCan-II devices */ | 72 | /* Kvaser USBCan-II devices */ |
| @@ -537,6 +540,9 @@ static const struct usb_device_id kvaser_usb_table[] = { | |||
| 537 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | 540 | .driver_info = KVASER_HAS_TXRX_ERRORS }, |
| 538 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID) }, | 541 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID) }, |
| 539 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID) }, | 542 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID) }, |
| 543 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID) }, | ||
| 544 | { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_2HS_PRODUCT_ID) }, | ||
| 545 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_2HS_PRODUCT_ID) }, | ||
| 540 | 546 | ||
| 541 | /* USBCANII family IDs */ | 547 | /* USBCANII family IDs */ |
| 542 | { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN2_PRODUCT_ID), | 548 | { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN2_PRODUCT_ID), |
diff --git a/drivers/net/ethernet/amd/au1000_eth.c b/drivers/net/ethernet/amd/au1000_eth.c index e0fb0f1122db..20760e10211a 100644 --- a/drivers/net/ethernet/amd/au1000_eth.c +++ b/drivers/net/ethernet/amd/au1000_eth.c | |||
| @@ -509,8 +509,8 @@ static int au1000_mii_probe(struct net_device *dev) | |||
| 509 | * on the current MAC's MII bus | 509 | * on the current MAC's MII bus |
| 510 | */ | 510 | */ |
| 511 | for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) | 511 | for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) |
| 512 | if (mdiobus_get_phy(aup->mii_bus, aup->phy_addr)) { | 512 | if (mdiobus_get_phy(aup->mii_bus, phy_addr)) { |
| 513 | phydev = mdiobus_get_phy(aup->mii_bus, aup->phy_addr); | 513 | phydev = mdiobus_get_phy(aup->mii_bus, phy_addr); |
| 514 | if (!aup->phy_search_highest_addr) | 514 | if (!aup->phy_search_highest_addr) |
| 515 | /* break out with first one found */ | 515 | /* break out with first one found */ |
| 516 | break; | 516 | break; |
diff --git a/drivers/net/ethernet/atheros/alx/alx.h b/drivers/net/ethernet/atheros/alx/alx.h index d02c4240b7df..8fc93c5f6abc 100644 --- a/drivers/net/ethernet/atheros/alx/alx.h +++ b/drivers/net/ethernet/atheros/alx/alx.h | |||
| @@ -96,10 +96,6 @@ struct alx_priv { | |||
| 96 | unsigned int rx_ringsz; | 96 | unsigned int rx_ringsz; |
| 97 | unsigned int rxbuf_size; | 97 | unsigned int rxbuf_size; |
| 98 | 98 | ||
| 99 | struct page *rx_page; | ||
| 100 | unsigned int rx_page_offset; | ||
| 101 | unsigned int rx_frag_size; | ||
| 102 | |||
| 103 | struct napi_struct napi; | 99 | struct napi_struct napi; |
| 104 | struct alx_tx_queue txq; | 100 | struct alx_tx_queue txq; |
| 105 | struct alx_rx_queue rxq; | 101 | struct alx_rx_queue rxq; |
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c index c98acdc0d14f..e708e360a9e3 100644 --- a/drivers/net/ethernet/atheros/alx/main.c +++ b/drivers/net/ethernet/atheros/alx/main.c | |||
| @@ -70,35 +70,6 @@ static void alx_free_txbuf(struct alx_priv *alx, int entry) | |||
| 70 | } | 70 | } |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | static struct sk_buff *alx_alloc_skb(struct alx_priv *alx, gfp_t gfp) | ||
| 74 | { | ||
| 75 | struct sk_buff *skb; | ||
| 76 | struct page *page; | ||
| 77 | |||
| 78 | if (alx->rx_frag_size > PAGE_SIZE) | ||
| 79 | return __netdev_alloc_skb(alx->dev, alx->rxbuf_size, gfp); | ||
| 80 | |||
| 81 | page = alx->rx_page; | ||
| 82 | if (!page) { | ||
| 83 | alx->rx_page = page = alloc_page(gfp); | ||
| 84 | if (unlikely(!page)) | ||
| 85 | return NULL; | ||
| 86 | alx->rx_page_offset = 0; | ||
| 87 | } | ||
| 88 | |||
| 89 | skb = build_skb(page_address(page) + alx->rx_page_offset, | ||
| 90 | alx->rx_frag_size); | ||
| 91 | if (likely(skb)) { | ||
| 92 | alx->rx_page_offset += alx->rx_frag_size; | ||
| 93 | if (alx->rx_page_offset >= PAGE_SIZE) | ||
| 94 | alx->rx_page = NULL; | ||
| 95 | else | ||
| 96 | get_page(page); | ||
| 97 | } | ||
| 98 | return skb; | ||
| 99 | } | ||
| 100 | |||
| 101 | |||
| 102 | static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) | 73 | static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) |
| 103 | { | 74 | { |
| 104 | struct alx_rx_queue *rxq = &alx->rxq; | 75 | struct alx_rx_queue *rxq = &alx->rxq; |
| @@ -115,9 +86,22 @@ static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) | |||
| 115 | while (!cur_buf->skb && next != rxq->read_idx) { | 86 | while (!cur_buf->skb && next != rxq->read_idx) { |
| 116 | struct alx_rfd *rfd = &rxq->rfd[cur]; | 87 | struct alx_rfd *rfd = &rxq->rfd[cur]; |
| 117 | 88 | ||
| 118 | skb = alx_alloc_skb(alx, gfp); | 89 | /* |
| 90 | * When DMA RX address is set to something like | ||
| 91 | * 0x....fc0, it will be very likely to cause DMA | ||
| 92 | * RFD overflow issue. | ||
| 93 | * | ||
| 94 | * To work around it, we apply rx skb with 64 bytes | ||
| 95 | * longer space, and offset the address whenever | ||
| 96 | * 0x....fc0 is detected. | ||
| 97 | */ | ||
| 98 | skb = __netdev_alloc_skb(alx->dev, alx->rxbuf_size + 64, gfp); | ||
| 119 | if (!skb) | 99 | if (!skb) |
| 120 | break; | 100 | break; |
| 101 | |||
| 102 | if (((unsigned long)skb->data & 0xfff) == 0xfc0) | ||
| 103 | skb_reserve(skb, 64); | ||
| 104 | |||
| 121 | dma = dma_map_single(&alx->hw.pdev->dev, | 105 | dma = dma_map_single(&alx->hw.pdev->dev, |
| 122 | skb->data, alx->rxbuf_size, | 106 | skb->data, alx->rxbuf_size, |
| 123 | DMA_FROM_DEVICE); | 107 | DMA_FROM_DEVICE); |
| @@ -153,7 +137,6 @@ static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) | |||
| 153 | alx_write_mem16(&alx->hw, ALX_RFD_PIDX, cur); | 137 | alx_write_mem16(&alx->hw, ALX_RFD_PIDX, cur); |
| 154 | } | 138 | } |
| 155 | 139 | ||
| 156 | |||
| 157 | return count; | 140 | return count; |
| 158 | } | 141 | } |
| 159 | 142 | ||
| @@ -622,11 +605,6 @@ static void alx_free_rings(struct alx_priv *alx) | |||
| 622 | kfree(alx->txq.bufs); | 605 | kfree(alx->txq.bufs); |
| 623 | kfree(alx->rxq.bufs); | 606 | kfree(alx->rxq.bufs); |
| 624 | 607 | ||
| 625 | if (alx->rx_page) { | ||
| 626 | put_page(alx->rx_page); | ||
| 627 | alx->rx_page = NULL; | ||
| 628 | } | ||
| 629 | |||
| 630 | dma_free_coherent(&alx->hw.pdev->dev, | 608 | dma_free_coherent(&alx->hw.pdev->dev, |
| 631 | alx->descmem.size, | 609 | alx->descmem.size, |
| 632 | alx->descmem.virt, | 610 | alx->descmem.virt, |
| @@ -681,7 +659,6 @@ static int alx_request_irq(struct alx_priv *alx) | |||
| 681 | alx->dev->name, alx); | 659 | alx->dev->name, alx); |
| 682 | if (!err) | 660 | if (!err) |
| 683 | goto out; | 661 | goto out; |
| 684 | |||
| 685 | /* fall back to legacy interrupt */ | 662 | /* fall back to legacy interrupt */ |
| 686 | pci_disable_msi(alx->hw.pdev); | 663 | pci_disable_msi(alx->hw.pdev); |
| 687 | } | 664 | } |
| @@ -725,7 +702,6 @@ static int alx_init_sw(struct alx_priv *alx) | |||
| 725 | struct pci_dev *pdev = alx->hw.pdev; | 702 | struct pci_dev *pdev = alx->hw.pdev; |
| 726 | struct alx_hw *hw = &alx->hw; | 703 | struct alx_hw *hw = &alx->hw; |
| 727 | int err; | 704 | int err; |
| 728 | unsigned int head_size; | ||
| 729 | 705 | ||
| 730 | err = alx_identify_hw(alx); | 706 | err = alx_identify_hw(alx); |
| 731 | if (err) { | 707 | if (err) { |
| @@ -741,12 +717,7 @@ static int alx_init_sw(struct alx_priv *alx) | |||
| 741 | 717 | ||
| 742 | hw->smb_timer = 400; | 718 | hw->smb_timer = 400; |
| 743 | hw->mtu = alx->dev->mtu; | 719 | hw->mtu = alx->dev->mtu; |
| 744 | |||
| 745 | alx->rxbuf_size = ALX_MAX_FRAME_LEN(hw->mtu); | 720 | alx->rxbuf_size = ALX_MAX_FRAME_LEN(hw->mtu); |
| 746 | head_size = SKB_DATA_ALIGN(alx->rxbuf_size + NET_SKB_PAD) + | ||
| 747 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||
| 748 | alx->rx_frag_size = roundup_pow_of_two(head_size); | ||
| 749 | |||
| 750 | alx->tx_ringsz = 256; | 721 | alx->tx_ringsz = 256; |
| 751 | alx->rx_ringsz = 512; | 722 | alx->rx_ringsz = 512; |
| 752 | hw->imt = 200; | 723 | hw->imt = 200; |
| @@ -848,7 +819,6 @@ static int alx_change_mtu(struct net_device *netdev, int mtu) | |||
| 848 | { | 819 | { |
| 849 | struct alx_priv *alx = netdev_priv(netdev); | 820 | struct alx_priv *alx = netdev_priv(netdev); |
| 850 | int max_frame = ALX_MAX_FRAME_LEN(mtu); | 821 | int max_frame = ALX_MAX_FRAME_LEN(mtu); |
| 851 | unsigned int head_size; | ||
| 852 | 822 | ||
| 853 | if ((max_frame < ALX_MIN_FRAME_SIZE) || | 823 | if ((max_frame < ALX_MIN_FRAME_SIZE) || |
| 854 | (max_frame > ALX_MAX_FRAME_SIZE)) | 824 | (max_frame > ALX_MAX_FRAME_SIZE)) |
| @@ -860,9 +830,6 @@ static int alx_change_mtu(struct net_device *netdev, int mtu) | |||
| 860 | netdev->mtu = mtu; | 830 | netdev->mtu = mtu; |
| 861 | alx->hw.mtu = mtu; | 831 | alx->hw.mtu = mtu; |
| 862 | alx->rxbuf_size = max(max_frame, ALX_DEF_RXBUF_SIZE); | 832 | alx->rxbuf_size = max(max_frame, ALX_DEF_RXBUF_SIZE); |
| 863 | head_size = SKB_DATA_ALIGN(alx->rxbuf_size + NET_SKB_PAD) + | ||
| 864 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||
| 865 | alx->rx_frag_size = roundup_pow_of_two(head_size); | ||
| 866 | netdev_update_features(netdev); | 833 | netdev_update_features(netdev); |
| 867 | if (netif_running(netdev)) | 834 | if (netif_running(netdev)) |
| 868 | alx_reinit(alx); | 835 | alx_reinit(alx); |
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index ee5f431ab32a..a6333d38ecc0 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c | |||
| @@ -267,15 +267,16 @@ static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring) | |||
| 267 | while (ring->start != ring->end) { | 267 | while (ring->start != ring->end) { |
| 268 | int slot_idx = ring->start % BGMAC_TX_RING_SLOTS; | 268 | int slot_idx = ring->start % BGMAC_TX_RING_SLOTS; |
| 269 | struct bgmac_slot_info *slot = &ring->slots[slot_idx]; | 269 | struct bgmac_slot_info *slot = &ring->slots[slot_idx]; |
| 270 | u32 ctl1; | 270 | u32 ctl0, ctl1; |
| 271 | int len; | 271 | int len; |
| 272 | 272 | ||
| 273 | if (slot_idx == empty_slot) | 273 | if (slot_idx == empty_slot) |
| 274 | break; | 274 | break; |
| 275 | 275 | ||
| 276 | ctl0 = le32_to_cpu(ring->cpu_base[slot_idx].ctl0); | ||
| 276 | ctl1 = le32_to_cpu(ring->cpu_base[slot_idx].ctl1); | 277 | ctl1 = le32_to_cpu(ring->cpu_base[slot_idx].ctl1); |
| 277 | len = ctl1 & BGMAC_DESC_CTL1_LEN; | 278 | len = ctl1 & BGMAC_DESC_CTL1_LEN; |
| 278 | if (ctl1 & BGMAC_DESC_CTL0_SOF) | 279 | if (ctl0 & BGMAC_DESC_CTL0_SOF) |
| 279 | /* Unmap no longer used buffer */ | 280 | /* Unmap no longer used buffer */ |
| 280 | dma_unmap_single(dma_dev, slot->dma_addr, len, | 281 | dma_unmap_single(dma_dev, slot->dma_addr, len, |
| 281 | DMA_TO_DEVICE); | 282 | DMA_TO_DEVICE); |
| @@ -1312,7 +1313,8 @@ static int bgmac_open(struct net_device *net_dev) | |||
| 1312 | 1313 | ||
| 1313 | phy_start(bgmac->phy_dev); | 1314 | phy_start(bgmac->phy_dev); |
| 1314 | 1315 | ||
| 1315 | netif_carrier_on(net_dev); | 1316 | netif_start_queue(net_dev); |
| 1317 | |||
| 1316 | return 0; | 1318 | return 0; |
| 1317 | } | 1319 | } |
| 1318 | 1320 | ||
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c index 95f17f8cadac..16ed20357c5c 100644 --- a/drivers/net/ethernet/cavium/thunder/nic_main.c +++ b/drivers/net/ethernet/cavium/thunder/nic_main.c | |||
| @@ -499,6 +499,7 @@ static void nic_tx_channel_cfg(struct nicpf *nic, u8 vnic, | |||
| 499 | u32 rr_quantum; | 499 | u32 rr_quantum; |
| 500 | u8 sq_idx = sq->sq_num; | 500 | u8 sq_idx = sq->sq_num; |
| 501 | u8 pqs_vnic; | 501 | u8 pqs_vnic; |
| 502 | int svf; | ||
| 502 | 503 | ||
| 503 | if (sq->sqs_mode) | 504 | if (sq->sqs_mode) |
| 504 | pqs_vnic = nic->pqs_vf[vnic]; | 505 | pqs_vnic = nic->pqs_vf[vnic]; |
| @@ -511,10 +512,19 @@ static void nic_tx_channel_cfg(struct nicpf *nic, u8 vnic, | |||
| 511 | /* 24 bytes for FCS, IPG and preamble */ | 512 | /* 24 bytes for FCS, IPG and preamble */ |
| 512 | rr_quantum = ((NIC_HW_MAX_FRS + 24) / 4); | 513 | rr_quantum = ((NIC_HW_MAX_FRS + 24) / 4); |
| 513 | 514 | ||
| 514 | tl4 = (lmac * NIC_TL4_PER_LMAC) + (bgx * NIC_TL4_PER_BGX); | 515 | if (!sq->sqs_mode) { |
| 516 | tl4 = (lmac * NIC_TL4_PER_LMAC) + (bgx * NIC_TL4_PER_BGX); | ||
| 517 | } else { | ||
| 518 | for (svf = 0; svf < MAX_SQS_PER_VF; svf++) { | ||
| 519 | if (nic->vf_sqs[pqs_vnic][svf] == vnic) | ||
| 520 | break; | ||
| 521 | } | ||
| 522 | tl4 = (MAX_LMAC_PER_BGX * NIC_TL4_PER_LMAC); | ||
| 523 | tl4 += (lmac * NIC_TL4_PER_LMAC * MAX_SQS_PER_VF); | ||
| 524 | tl4 += (svf * NIC_TL4_PER_LMAC); | ||
| 525 | tl4 += (bgx * NIC_TL4_PER_BGX); | ||
| 526 | } | ||
| 515 | tl4 += sq_idx; | 527 | tl4 += sq_idx; |
| 516 | if (sq->sqs_mode) | ||
| 517 | tl4 += vnic * 8; | ||
| 518 | 528 | ||
| 519 | tl3 = tl4 / (NIC_MAX_TL4 / NIC_MAX_TL3); | 529 | tl3 = tl4 / (NIC_MAX_TL4 / NIC_MAX_TL3); |
| 520 | nic_reg_write(nic, NIC_PF_QSET_0_127_SQ_0_7_CFG2 | | 530 | nic_reg_write(nic, NIC_PF_QSET_0_127_SQ_0_7_CFG2 | |
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c index 3ed21988626b..63a39ac97d53 100644 --- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c +++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c | |||
| @@ -551,7 +551,9 @@ static int bgx_xaui_check_link(struct lmac *lmac) | |||
| 551 | } | 551 | } |
| 552 | 552 | ||
| 553 | /* Clear rcvflt bit (latching high) and read it back */ | 553 | /* Clear rcvflt bit (latching high) and read it back */ |
| 554 | bgx_reg_modify(bgx, lmacid, BGX_SPUX_STATUS2, SPU_STATUS2_RCVFLT); | 554 | if (bgx_reg_read(bgx, lmacid, BGX_SPUX_STATUS2) & SPU_STATUS2_RCVFLT) |
| 555 | bgx_reg_modify(bgx, lmacid, | ||
| 556 | BGX_SPUX_STATUS2, SPU_STATUS2_RCVFLT); | ||
| 555 | if (bgx_reg_read(bgx, lmacid, BGX_SPUX_STATUS2) & SPU_STATUS2_RCVFLT) { | 557 | if (bgx_reg_read(bgx, lmacid, BGX_SPUX_STATUS2) & SPU_STATUS2_RCVFLT) { |
| 556 | dev_err(&bgx->pdev->dev, "Receive fault, retry training\n"); | 558 | dev_err(&bgx->pdev->dev, "Receive fault, retry training\n"); |
| 557 | if (bgx->use_training) { | 559 | if (bgx->use_training) { |
| @@ -570,13 +572,6 @@ static int bgx_xaui_check_link(struct lmac *lmac) | |||
| 570 | return -1; | 572 | return -1; |
| 571 | } | 573 | } |
| 572 | 574 | ||
| 573 | /* Wait for MAC RX to be ready */ | ||
| 574 | if (bgx_poll_reg(bgx, lmacid, BGX_SMUX_RX_CTL, | ||
| 575 | SMU_RX_CTL_STATUS, true)) { | ||
| 576 | dev_err(&bgx->pdev->dev, "SMU RX link not okay\n"); | ||
| 577 | return -1; | ||
| 578 | } | ||
| 579 | |||
| 580 | /* Wait for BGX RX to be idle */ | 575 | /* Wait for BGX RX to be idle */ |
| 581 | if (bgx_poll_reg(bgx, lmacid, BGX_SMUX_CTL, SMU_CTL_RX_IDLE, false)) { | 576 | if (bgx_poll_reg(bgx, lmacid, BGX_SMUX_CTL, SMU_CTL_RX_IDLE, false)) { |
| 582 | dev_err(&bgx->pdev->dev, "SMU RX not idle\n"); | 577 | dev_err(&bgx->pdev->dev, "SMU RX not idle\n"); |
| @@ -589,29 +584,30 @@ static int bgx_xaui_check_link(struct lmac *lmac) | |||
| 589 | return -1; | 584 | return -1; |
| 590 | } | 585 | } |
| 591 | 586 | ||
| 592 | if (bgx_reg_read(bgx, lmacid, BGX_SPUX_STATUS2) & SPU_STATUS2_RCVFLT) { | 587 | /* Clear receive packet disable */ |
| 593 | dev_err(&bgx->pdev->dev, "Receive fault\n"); | ||
| 594 | return -1; | ||
| 595 | } | ||
| 596 | |||
| 597 | /* Receive link is latching low. Force it high and verify it */ | ||
| 598 | bgx_reg_modify(bgx, lmacid, BGX_SPUX_STATUS1, SPU_STATUS1_RCV_LNK); | ||
| 599 | if (bgx_poll_reg(bgx, lmacid, BGX_SPUX_STATUS1, | ||
| 600 | SPU_STATUS1_RCV_LNK, false)) { | ||
| 601 | dev_err(&bgx->pdev->dev, "SPU receive link down\n"); | ||
| 602 | return -1; | ||
| 603 | } | ||
| 604 | |||
| 605 | cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_MISC_CONTROL); | 588 | cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_MISC_CONTROL); |
| 606 | cfg &= ~SPU_MISC_CTL_RX_DIS; | 589 | cfg &= ~SPU_MISC_CTL_RX_DIS; |
| 607 | bgx_reg_write(bgx, lmacid, BGX_SPUX_MISC_CONTROL, cfg); | 590 | bgx_reg_write(bgx, lmacid, BGX_SPUX_MISC_CONTROL, cfg); |
| 608 | return 0; | 591 | |
| 592 | /* Check for MAC RX faults */ | ||
| 593 | cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_RX_CTL); | ||
| 594 | /* 0 - Link is okay, 1 - Local fault, 2 - Remote fault */ | ||
| 595 | cfg &= SMU_RX_CTL_STATUS; | ||
| 596 | if (!cfg) | ||
| 597 | return 0; | ||
| 598 | |||
| 599 | /* Rx local/remote fault seen. | ||
| 600 | * Do lmac reinit to see if condition recovers | ||
| 601 | */ | ||
| 602 | bgx_lmac_xaui_init(bgx, lmacid, bgx->lmac_type); | ||
| 603 | |||
| 604 | return -1; | ||
| 609 | } | 605 | } |
| 610 | 606 | ||
| 611 | static void bgx_poll_for_link(struct work_struct *work) | 607 | static void bgx_poll_for_link(struct work_struct *work) |
| 612 | { | 608 | { |
| 613 | struct lmac *lmac; | 609 | struct lmac *lmac; |
| 614 | u64 link; | 610 | u64 spu_link, smu_link; |
| 615 | 611 | ||
| 616 | lmac = container_of(work, struct lmac, dwork.work); | 612 | lmac = container_of(work, struct lmac, dwork.work); |
| 617 | 613 | ||
| @@ -621,8 +617,11 @@ static void bgx_poll_for_link(struct work_struct *work) | |||
| 621 | bgx_poll_reg(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1, | 617 | bgx_poll_reg(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1, |
| 622 | SPU_STATUS1_RCV_LNK, false); | 618 | SPU_STATUS1_RCV_LNK, false); |
| 623 | 619 | ||
| 624 | link = bgx_reg_read(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1); | 620 | spu_link = bgx_reg_read(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1); |
| 625 | if (link & SPU_STATUS1_RCV_LNK) { | 621 | smu_link = bgx_reg_read(lmac->bgx, lmac->lmacid, BGX_SMUX_RX_CTL); |
| 622 | |||
| 623 | if ((spu_link & SPU_STATUS1_RCV_LNK) && | ||
| 624 | !(smu_link & SMU_RX_CTL_STATUS)) { | ||
| 626 | lmac->link_up = 1; | 625 | lmac->link_up = 1; |
| 627 | if (lmac->bgx->lmac_type == BGX_MODE_XLAUI) | 626 | if (lmac->bgx->lmac_type == BGX_MODE_XLAUI) |
| 628 | lmac->last_speed = 40000; | 627 | lmac->last_speed = 40000; |
| @@ -636,9 +635,15 @@ static void bgx_poll_for_link(struct work_struct *work) | |||
| 636 | } | 635 | } |
| 637 | 636 | ||
| 638 | if (lmac->last_link != lmac->link_up) { | 637 | if (lmac->last_link != lmac->link_up) { |
| 638 | if (lmac->link_up) { | ||
| 639 | if (bgx_xaui_check_link(lmac)) { | ||
| 640 | /* Errors, clear link_up state */ | ||
| 641 | lmac->link_up = 0; | ||
| 642 | lmac->last_speed = SPEED_UNKNOWN; | ||
| 643 | lmac->last_duplex = DUPLEX_UNKNOWN; | ||
| 644 | } | ||
| 645 | } | ||
| 639 | lmac->last_link = lmac->link_up; | 646 | lmac->last_link = lmac->link_up; |
| 640 | if (lmac->link_up) | ||
| 641 | bgx_xaui_check_link(lmac); | ||
| 642 | } | 647 | } |
| 643 | 648 | ||
| 644 | queue_delayed_work(lmac->check_link, &lmac->dwork, HZ * 2); | 649 | queue_delayed_work(lmac->check_link, &lmac->dwork, HZ * 2); |
| @@ -710,7 +715,7 @@ static int bgx_lmac_enable(struct bgx *bgx, u8 lmacid) | |||
| 710 | static void bgx_lmac_disable(struct bgx *bgx, u8 lmacid) | 715 | static void bgx_lmac_disable(struct bgx *bgx, u8 lmacid) |
| 711 | { | 716 | { |
| 712 | struct lmac *lmac; | 717 | struct lmac *lmac; |
| 713 | u64 cmrx_cfg; | 718 | u64 cfg; |
| 714 | 719 | ||
| 715 | lmac = &bgx->lmac[lmacid]; | 720 | lmac = &bgx->lmac[lmacid]; |
| 716 | if (lmac->check_link) { | 721 | if (lmac->check_link) { |
| @@ -719,9 +724,33 @@ static void bgx_lmac_disable(struct bgx *bgx, u8 lmacid) | |||
| 719 | destroy_workqueue(lmac->check_link); | 724 | destroy_workqueue(lmac->check_link); |
| 720 | } | 725 | } |
| 721 | 726 | ||
| 722 | cmrx_cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG); | 727 | /* Disable packet reception */ |
| 723 | cmrx_cfg &= ~(1 << 15); | 728 | cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG); |
| 724 | bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cmrx_cfg); | 729 | cfg &= ~CMR_PKT_RX_EN; |
| 730 | bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg); | ||
| 731 | |||
| 732 | /* Give chance for Rx/Tx FIFO to get drained */ | ||
| 733 | bgx_poll_reg(bgx, lmacid, BGX_CMRX_RX_FIFO_LEN, (u64)0x1FFF, true); | ||
| 734 | bgx_poll_reg(bgx, lmacid, BGX_CMRX_TX_FIFO_LEN, (u64)0x3FFF, true); | ||
| 735 | |||
| 736 | /* Disable packet transmission */ | ||
| 737 | cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG); | ||
| 738 | cfg &= ~CMR_PKT_TX_EN; | ||
| 739 | bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg); | ||
| 740 | |||
| 741 | /* Disable serdes lanes */ | ||
| 742 | if (!lmac->is_sgmii) | ||
| 743 | bgx_reg_modify(bgx, lmacid, | ||
| 744 | BGX_SPUX_CONTROL1, SPU_CTL_LOW_POWER); | ||
| 745 | else | ||
| 746 | bgx_reg_modify(bgx, lmacid, | ||
| 747 | BGX_GMP_PCS_MRX_CTL, PCS_MRX_CTL_PWR_DN); | ||
| 748 | |||
| 749 | /* Disable LMAC */ | ||
| 750 | cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG); | ||
| 751 | cfg &= ~CMR_EN; | ||
| 752 | bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg); | ||
| 753 | |||
| 725 | bgx_flush_dmac_addrs(bgx, lmacid); | 754 | bgx_flush_dmac_addrs(bgx, lmacid); |
| 726 | 755 | ||
| 727 | if ((bgx->lmac_type != BGX_MODE_XFI) && | 756 | if ((bgx->lmac_type != BGX_MODE_XFI) && |
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h index 149e179363a1..42010d2e5ddf 100644 --- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h +++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #define BGX_CMRX_RX_STAT10 0xC0 | 41 | #define BGX_CMRX_RX_STAT10 0xC0 |
| 42 | #define BGX_CMRX_RX_BP_DROP 0xC8 | 42 | #define BGX_CMRX_RX_BP_DROP 0xC8 |
| 43 | #define BGX_CMRX_RX_DMAC_CTL 0x0E8 | 43 | #define BGX_CMRX_RX_DMAC_CTL 0x0E8 |
| 44 | #define BGX_CMRX_RX_FIFO_LEN 0x108 | ||
| 44 | #define BGX_CMR_RX_DMACX_CAM 0x200 | 45 | #define BGX_CMR_RX_DMACX_CAM 0x200 |
| 45 | #define RX_DMACX_CAM_EN BIT_ULL(48) | 46 | #define RX_DMACX_CAM_EN BIT_ULL(48) |
| 46 | #define RX_DMACX_CAM_LMACID(x) (x << 49) | 47 | #define RX_DMACX_CAM_LMACID(x) (x << 49) |
| @@ -50,6 +51,7 @@ | |||
| 50 | #define BGX_CMR_CHAN_MSK_AND 0x450 | 51 | #define BGX_CMR_CHAN_MSK_AND 0x450 |
| 51 | #define BGX_CMR_BIST_STATUS 0x460 | 52 | #define BGX_CMR_BIST_STATUS 0x460 |
| 52 | #define BGX_CMR_RX_LMACS 0x468 | 53 | #define BGX_CMR_RX_LMACS 0x468 |
| 54 | #define BGX_CMRX_TX_FIFO_LEN 0x518 | ||
| 53 | #define BGX_CMRX_TX_STAT0 0x600 | 55 | #define BGX_CMRX_TX_STAT0 0x600 |
| 54 | #define BGX_CMRX_TX_STAT1 0x608 | 56 | #define BGX_CMRX_TX_STAT1 0x608 |
| 55 | #define BGX_CMRX_TX_STAT2 0x610 | 57 | #define BGX_CMRX_TX_STAT2 0x610 |
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 864cb21351a4..ecdb6854a898 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c | |||
| @@ -2121,7 +2121,7 @@ static void handle_error_info_rsp(union ibmvnic_crq *crq, | |||
| 2121 | struct ibmvnic_adapter *adapter) | 2121 | struct ibmvnic_adapter *adapter) |
| 2122 | { | 2122 | { |
| 2123 | struct device *dev = &adapter->vdev->dev; | 2123 | struct device *dev = &adapter->vdev->dev; |
| 2124 | struct ibmvnic_error_buff *error_buff; | 2124 | struct ibmvnic_error_buff *error_buff, *tmp; |
| 2125 | unsigned long flags; | 2125 | unsigned long flags; |
| 2126 | bool found = false; | 2126 | bool found = false; |
| 2127 | int i; | 2127 | int i; |
| @@ -2133,7 +2133,7 @@ static void handle_error_info_rsp(union ibmvnic_crq *crq, | |||
| 2133 | } | 2133 | } |
| 2134 | 2134 | ||
| 2135 | spin_lock_irqsave(&adapter->error_list_lock, flags); | 2135 | spin_lock_irqsave(&adapter->error_list_lock, flags); |
| 2136 | list_for_each_entry(error_buff, &adapter->errors, list) | 2136 | list_for_each_entry_safe(error_buff, tmp, &adapter->errors, list) |
| 2137 | if (error_buff->error_id == crq->request_error_rsp.error_id) { | 2137 | if (error_buff->error_id == crq->request_error_rsp.error_id) { |
| 2138 | found = true; | 2138 | found = true; |
| 2139 | list_del(&error_buff->list); | 2139 | list_del(&error_buff->list); |
| @@ -3141,14 +3141,14 @@ static void handle_request_ras_comp_num_rsp(union ibmvnic_crq *crq, | |||
| 3141 | 3141 | ||
| 3142 | static void ibmvnic_free_inflight(struct ibmvnic_adapter *adapter) | 3142 | static void ibmvnic_free_inflight(struct ibmvnic_adapter *adapter) |
| 3143 | { | 3143 | { |
| 3144 | struct ibmvnic_inflight_cmd *inflight_cmd; | 3144 | struct ibmvnic_inflight_cmd *inflight_cmd, *tmp1; |
| 3145 | struct device *dev = &adapter->vdev->dev; | 3145 | struct device *dev = &adapter->vdev->dev; |
| 3146 | struct ibmvnic_error_buff *error_buff; | 3146 | struct ibmvnic_error_buff *error_buff, *tmp2; |
| 3147 | unsigned long flags; | 3147 | unsigned long flags; |
| 3148 | unsigned long flags2; | 3148 | unsigned long flags2; |
| 3149 | 3149 | ||
| 3150 | spin_lock_irqsave(&adapter->inflight_lock, flags); | 3150 | spin_lock_irqsave(&adapter->inflight_lock, flags); |
| 3151 | list_for_each_entry(inflight_cmd, &adapter->inflight, list) { | 3151 | list_for_each_entry_safe(inflight_cmd, tmp1, &adapter->inflight, list) { |
| 3152 | switch (inflight_cmd->crq.generic.cmd) { | 3152 | switch (inflight_cmd->crq.generic.cmd) { |
| 3153 | case LOGIN: | 3153 | case LOGIN: |
| 3154 | dma_unmap_single(dev, adapter->login_buf_token, | 3154 | dma_unmap_single(dev, adapter->login_buf_token, |
| @@ -3165,8 +3165,8 @@ static void ibmvnic_free_inflight(struct ibmvnic_adapter *adapter) | |||
| 3165 | break; | 3165 | break; |
| 3166 | case REQUEST_ERROR_INFO: | 3166 | case REQUEST_ERROR_INFO: |
| 3167 | spin_lock_irqsave(&adapter->error_list_lock, flags2); | 3167 | spin_lock_irqsave(&adapter->error_list_lock, flags2); |
| 3168 | list_for_each_entry(error_buff, &adapter->errors, | 3168 | list_for_each_entry_safe(error_buff, tmp2, |
| 3169 | list) { | 3169 | &adapter->errors, list) { |
| 3170 | dma_unmap_single(dev, error_buff->dma, | 3170 | dma_unmap_single(dev, error_buff->dma, |
| 3171 | error_buff->len, | 3171 | error_buff->len, |
| 3172 | DMA_FROM_DEVICE); | 3172 | DMA_FROM_DEVICE); |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 75e60897b7e7..73f745205a1c 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
| @@ -154,6 +154,16 @@ void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val) | |||
| 154 | writel(val, hw->hw_addr + reg); | 154 | writel(val, hw->hw_addr + reg); |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | static bool e1000e_vlan_used(struct e1000_adapter *adapter) | ||
| 158 | { | ||
| 159 | u16 vid; | ||
| 160 | |||
| 161 | for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID) | ||
| 162 | return true; | ||
| 163 | |||
| 164 | return false; | ||
| 165 | } | ||
| 166 | |||
| 157 | /** | 167 | /** |
| 158 | * e1000_regdump - register printout routine | 168 | * e1000_regdump - register printout routine |
| 159 | * @hw: pointer to the HW structure | 169 | * @hw: pointer to the HW structure |
| @@ -2789,7 +2799,7 @@ static void e1000e_vlan_filter_enable(struct e1000_adapter *adapter) | |||
| 2789 | } | 2799 | } |
| 2790 | 2800 | ||
| 2791 | /** | 2801 | /** |
| 2792 | * e1000e_vlan_strip_enable - helper to disable HW VLAN stripping | 2802 | * e1000e_vlan_strip_disable - helper to disable HW VLAN stripping |
| 2793 | * @adapter: board private structure to initialize | 2803 | * @adapter: board private structure to initialize |
| 2794 | **/ | 2804 | **/ |
| 2795 | static void e1000e_vlan_strip_disable(struct e1000_adapter *adapter) | 2805 | static void e1000e_vlan_strip_disable(struct e1000_adapter *adapter) |
| @@ -3443,7 +3453,8 @@ static void e1000e_set_rx_mode(struct net_device *netdev) | |||
| 3443 | 3453 | ||
| 3444 | ew32(RCTL, rctl); | 3454 | ew32(RCTL, rctl); |
| 3445 | 3455 | ||
| 3446 | if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) | 3456 | if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX || |
| 3457 | e1000e_vlan_used(adapter)) | ||
| 3447 | e1000e_vlan_strip_enable(adapter); | 3458 | e1000e_vlan_strip_enable(adapter); |
| 3448 | else | 3459 | else |
| 3449 | e1000e_vlan_strip_disable(adapter); | 3460 | e1000e_vlan_strip_disable(adapter); |
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 4763252bbf85..d1cdc2d76151 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | |||
| @@ -481,20 +481,23 @@ static inline void mtk_rx_get_desc(struct mtk_rx_dma *rxd, | |||
| 481 | /* the qdma core needs scratch memory to be setup */ | 481 | /* the qdma core needs scratch memory to be setup */ |
| 482 | static int mtk_init_fq_dma(struct mtk_eth *eth) | 482 | static int mtk_init_fq_dma(struct mtk_eth *eth) |
| 483 | { | 483 | { |
| 484 | dma_addr_t phy_ring_head, phy_ring_tail; | 484 | dma_addr_t phy_ring_tail; |
| 485 | int cnt = MTK_DMA_SIZE; | 485 | int cnt = MTK_DMA_SIZE; |
| 486 | dma_addr_t dma_addr; | 486 | dma_addr_t dma_addr; |
| 487 | int i; | 487 | int i; |
| 488 | 488 | ||
| 489 | eth->scratch_ring = dma_alloc_coherent(eth->dev, | 489 | eth->scratch_ring = dma_alloc_coherent(eth->dev, |
| 490 | cnt * sizeof(struct mtk_tx_dma), | 490 | cnt * sizeof(struct mtk_tx_dma), |
| 491 | &phy_ring_head, | 491 | ð->phy_scratch_ring, |
| 492 | GFP_ATOMIC | __GFP_ZERO); | 492 | GFP_ATOMIC | __GFP_ZERO); |
| 493 | if (unlikely(!eth->scratch_ring)) | 493 | if (unlikely(!eth->scratch_ring)) |
| 494 | return -ENOMEM; | 494 | return -ENOMEM; |
| 495 | 495 | ||
| 496 | eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE, | 496 | eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE, |
| 497 | GFP_KERNEL); | 497 | GFP_KERNEL); |
| 498 | if (unlikely(!eth->scratch_head)) | ||
| 499 | return -ENOMEM; | ||
| 500 | |||
| 498 | dma_addr = dma_map_single(eth->dev, | 501 | dma_addr = dma_map_single(eth->dev, |
| 499 | eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE, | 502 | eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE, |
| 500 | DMA_FROM_DEVICE); | 503 | DMA_FROM_DEVICE); |
| @@ -502,19 +505,19 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) | |||
| 502 | return -ENOMEM; | 505 | return -ENOMEM; |
| 503 | 506 | ||
| 504 | memset(eth->scratch_ring, 0x0, sizeof(struct mtk_tx_dma) * cnt); | 507 | memset(eth->scratch_ring, 0x0, sizeof(struct mtk_tx_dma) * cnt); |
| 505 | phy_ring_tail = phy_ring_head + | 508 | phy_ring_tail = eth->phy_scratch_ring + |
| 506 | (sizeof(struct mtk_tx_dma) * (cnt - 1)); | 509 | (sizeof(struct mtk_tx_dma) * (cnt - 1)); |
| 507 | 510 | ||
| 508 | for (i = 0; i < cnt; i++) { | 511 | for (i = 0; i < cnt; i++) { |
| 509 | eth->scratch_ring[i].txd1 = | 512 | eth->scratch_ring[i].txd1 = |
| 510 | (dma_addr + (i * MTK_QDMA_PAGE_SIZE)); | 513 | (dma_addr + (i * MTK_QDMA_PAGE_SIZE)); |
| 511 | if (i < cnt - 1) | 514 | if (i < cnt - 1) |
| 512 | eth->scratch_ring[i].txd2 = (phy_ring_head + | 515 | eth->scratch_ring[i].txd2 = (eth->phy_scratch_ring + |
| 513 | ((i + 1) * sizeof(struct mtk_tx_dma))); | 516 | ((i + 1) * sizeof(struct mtk_tx_dma))); |
| 514 | eth->scratch_ring[i].txd3 = TX_DMA_SDL(MTK_QDMA_PAGE_SIZE); | 517 | eth->scratch_ring[i].txd3 = TX_DMA_SDL(MTK_QDMA_PAGE_SIZE); |
| 515 | } | 518 | } |
| 516 | 519 | ||
| 517 | mtk_w32(eth, phy_ring_head, MTK_QDMA_FQ_HEAD); | 520 | mtk_w32(eth, eth->phy_scratch_ring, MTK_QDMA_FQ_HEAD); |
| 518 | mtk_w32(eth, phy_ring_tail, MTK_QDMA_FQ_TAIL); | 521 | mtk_w32(eth, phy_ring_tail, MTK_QDMA_FQ_TAIL); |
| 519 | mtk_w32(eth, (cnt << 16) | cnt, MTK_QDMA_FQ_CNT); | 522 | mtk_w32(eth, (cnt << 16) | cnt, MTK_QDMA_FQ_CNT); |
| 520 | mtk_w32(eth, MTK_QDMA_PAGE_SIZE << 16, MTK_QDMA_FQ_BLEN); | 523 | mtk_w32(eth, MTK_QDMA_PAGE_SIZE << 16, MTK_QDMA_FQ_BLEN); |
| @@ -671,7 +674,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, | |||
| 671 | 674 | ||
| 672 | err_dma: | 675 | err_dma: |
| 673 | do { | 676 | do { |
| 674 | tx_buf = mtk_desc_to_tx_buf(ring, txd); | 677 | tx_buf = mtk_desc_to_tx_buf(ring, itxd); |
| 675 | 678 | ||
| 676 | /* unmap dma */ | 679 | /* unmap dma */ |
| 677 | mtk_tx_unmap(&dev->dev, tx_buf); | 680 | mtk_tx_unmap(&dev->dev, tx_buf); |
| @@ -701,6 +704,20 @@ static inline int mtk_cal_txd_req(struct sk_buff *skb) | |||
| 701 | return nfrags; | 704 | return nfrags; |
| 702 | } | 705 | } |
| 703 | 706 | ||
| 707 | static int mtk_queue_stopped(struct mtk_eth *eth) | ||
| 708 | { | ||
| 709 | int i; | ||
| 710 | |||
| 711 | for (i = 0; i < MTK_MAC_COUNT; i++) { | ||
| 712 | if (!eth->netdev[i]) | ||
| 713 | continue; | ||
| 714 | if (netif_queue_stopped(eth->netdev[i])) | ||
| 715 | return 1; | ||
| 716 | } | ||
| 717 | |||
| 718 | return 0; | ||
| 719 | } | ||
| 720 | |||
| 704 | static void mtk_wake_queue(struct mtk_eth *eth) | 721 | static void mtk_wake_queue(struct mtk_eth *eth) |
| 705 | { | 722 | { |
| 706 | int i; | 723 | int i; |
| @@ -766,12 +783,9 @@ static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 766 | if (mtk_tx_map(skb, dev, tx_num, ring, gso) < 0) | 783 | if (mtk_tx_map(skb, dev, tx_num, ring, gso) < 0) |
| 767 | goto drop; | 784 | goto drop; |
| 768 | 785 | ||
| 769 | if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) { | 786 | if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) |
| 770 | mtk_stop_queue(eth); | 787 | mtk_stop_queue(eth); |
| 771 | if (unlikely(atomic_read(&ring->free_count) > | 788 | |
| 772 | ring->thresh)) | ||
| 773 | mtk_wake_queue(eth); | ||
| 774 | } | ||
| 775 | spin_unlock_irqrestore(ð->page_lock, flags); | 789 | spin_unlock_irqrestore(ð->page_lock, flags); |
| 776 | 790 | ||
| 777 | return NETDEV_TX_OK; | 791 | return NETDEV_TX_OK; |
| @@ -826,6 +840,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, | |||
| 826 | DMA_FROM_DEVICE); | 840 | DMA_FROM_DEVICE); |
| 827 | if (unlikely(dma_mapping_error(&netdev->dev, dma_addr))) { | 841 | if (unlikely(dma_mapping_error(&netdev->dev, dma_addr))) { |
| 828 | skb_free_frag(new_data); | 842 | skb_free_frag(new_data); |
| 843 | netdev->stats.rx_dropped++; | ||
| 829 | goto release_desc; | 844 | goto release_desc; |
| 830 | } | 845 | } |
| 831 | 846 | ||
| @@ -833,6 +848,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, | |||
| 833 | skb = build_skb(data, ring->frag_size); | 848 | skb = build_skb(data, ring->frag_size); |
| 834 | if (unlikely(!skb)) { | 849 | if (unlikely(!skb)) { |
| 835 | put_page(virt_to_head_page(new_data)); | 850 | put_page(virt_to_head_page(new_data)); |
| 851 | netdev->stats.rx_dropped++; | ||
| 836 | goto release_desc; | 852 | goto release_desc; |
| 837 | } | 853 | } |
| 838 | skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); | 854 | skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); |
| @@ -921,7 +937,6 @@ static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again) | |||
| 921 | } | 937 | } |
| 922 | mtk_tx_unmap(eth->dev, tx_buf); | 938 | mtk_tx_unmap(eth->dev, tx_buf); |
| 923 | 939 | ||
| 924 | ring->last_free->txd2 = next_cpu; | ||
| 925 | ring->last_free = desc; | 940 | ring->last_free = desc; |
| 926 | atomic_inc(&ring->free_count); | 941 | atomic_inc(&ring->free_count); |
| 927 | 942 | ||
| @@ -946,7 +961,8 @@ static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again) | |||
| 946 | if (!total) | 961 | if (!total) |
| 947 | return 0; | 962 | return 0; |
| 948 | 963 | ||
| 949 | if (atomic_read(&ring->free_count) > ring->thresh) | 964 | if (mtk_queue_stopped(eth) && |
| 965 | (atomic_read(&ring->free_count) > ring->thresh)) | ||
| 950 | mtk_wake_queue(eth); | 966 | mtk_wake_queue(eth); |
| 951 | 967 | ||
| 952 | return total; | 968 | return total; |
| @@ -1027,9 +1043,8 @@ static int mtk_tx_alloc(struct mtk_eth *eth) | |||
| 1027 | 1043 | ||
| 1028 | atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); | 1044 | atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); |
| 1029 | ring->next_free = &ring->dma[0]; | 1045 | ring->next_free = &ring->dma[0]; |
| 1030 | ring->last_free = &ring->dma[MTK_DMA_SIZE - 2]; | 1046 | ring->last_free = &ring->dma[MTK_DMA_SIZE - 1]; |
| 1031 | ring->thresh = max((unsigned long)MTK_DMA_SIZE >> 2, | 1047 | ring->thresh = MAX_SKB_FRAGS; |
| 1032 | MAX_SKB_FRAGS); | ||
| 1033 | 1048 | ||
| 1034 | /* make sure that all changes to the dma ring are flushed before we | 1049 | /* make sure that all changes to the dma ring are flushed before we |
| 1035 | * continue | 1050 | * continue |
| @@ -1207,6 +1222,14 @@ static void mtk_dma_free(struct mtk_eth *eth) | |||
| 1207 | for (i = 0; i < MTK_MAC_COUNT; i++) | 1222 | for (i = 0; i < MTK_MAC_COUNT; i++) |
| 1208 | if (eth->netdev[i]) | 1223 | if (eth->netdev[i]) |
| 1209 | netdev_reset_queue(eth->netdev[i]); | 1224 | netdev_reset_queue(eth->netdev[i]); |
| 1225 | if (eth->scratch_ring) { | ||
| 1226 | dma_free_coherent(eth->dev, | ||
| 1227 | MTK_DMA_SIZE * sizeof(struct mtk_tx_dma), | ||
| 1228 | eth->scratch_ring, | ||
| 1229 | eth->phy_scratch_ring); | ||
| 1230 | eth->scratch_ring = NULL; | ||
| 1231 | eth->phy_scratch_ring = 0; | ||
| 1232 | } | ||
| 1210 | mtk_tx_clean(eth); | 1233 | mtk_tx_clean(eth); |
| 1211 | mtk_rx_clean(eth); | 1234 | mtk_rx_clean(eth); |
| 1212 | kfree(eth->scratch_head); | 1235 | kfree(eth->scratch_head); |
| @@ -1269,7 +1292,7 @@ static int mtk_start_dma(struct mtk_eth *eth) | |||
| 1269 | mtk_w32(eth, | 1292 | mtk_w32(eth, |
| 1270 | MTK_TX_WB_DDONE | MTK_RX_DMA_EN | MTK_TX_DMA_EN | | 1293 | MTK_TX_WB_DDONE | MTK_RX_DMA_EN | MTK_TX_DMA_EN | |
| 1271 | MTK_RX_2B_OFFSET | MTK_DMA_SIZE_16DWORDS | | 1294 | MTK_RX_2B_OFFSET | MTK_DMA_SIZE_16DWORDS | |
| 1272 | MTK_RX_BT_32DWORDS, | 1295 | MTK_RX_BT_32DWORDS | MTK_NDP_CO_PRO, |
| 1273 | MTK_QDMA_GLO_CFG); | 1296 | MTK_QDMA_GLO_CFG); |
| 1274 | 1297 | ||
| 1275 | return 0; | 1298 | return 0; |
| @@ -1383,7 +1406,7 @@ static int __init mtk_hw_init(struct mtk_eth *eth) | |||
| 1383 | 1406 | ||
| 1384 | /* disable delay and normal interrupt */ | 1407 | /* disable delay and normal interrupt */ |
| 1385 | mtk_w32(eth, 0, MTK_QDMA_DELAY_INT); | 1408 | mtk_w32(eth, 0, MTK_QDMA_DELAY_INT); |
| 1386 | mtk_irq_disable(eth, MTK_TX_DONE_INT | MTK_RX_DONE_INT); | 1409 | mtk_irq_disable(eth, ~0); |
| 1387 | mtk_w32(eth, RST_GL_PSE, MTK_RST_GL); | 1410 | mtk_w32(eth, RST_GL_PSE, MTK_RST_GL); |
| 1388 | mtk_w32(eth, 0, MTK_RST_GL); | 1411 | mtk_w32(eth, 0, MTK_RST_GL); |
| 1389 | 1412 | ||
| @@ -1697,7 +1720,7 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) | |||
| 1697 | mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET; | 1720 | mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET; |
| 1698 | 1721 | ||
| 1699 | SET_NETDEV_DEV(eth->netdev[id], eth->dev); | 1722 | SET_NETDEV_DEV(eth->netdev[id], eth->dev); |
| 1700 | eth->netdev[id]->watchdog_timeo = HZ; | 1723 | eth->netdev[id]->watchdog_timeo = 5 * HZ; |
| 1701 | eth->netdev[id]->netdev_ops = &mtk_netdev_ops; | 1724 | eth->netdev[id]->netdev_ops = &mtk_netdev_ops; |
| 1702 | eth->netdev[id]->base_addr = (unsigned long)eth->base; | 1725 | eth->netdev[id]->base_addr = (unsigned long)eth->base; |
| 1703 | eth->netdev[id]->vlan_features = MTK_HW_FEATURES & | 1726 | eth->netdev[id]->vlan_features = MTK_HW_FEATURES & |
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h index eed626d56ea4..a5eb7c62306b 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h | |||
| @@ -91,6 +91,7 @@ | |||
| 91 | #define MTK_QDMA_GLO_CFG 0x1A04 | 91 | #define MTK_QDMA_GLO_CFG 0x1A04 |
| 92 | #define MTK_RX_2B_OFFSET BIT(31) | 92 | #define MTK_RX_2B_OFFSET BIT(31) |
| 93 | #define MTK_RX_BT_32DWORDS (3 << 11) | 93 | #define MTK_RX_BT_32DWORDS (3 << 11) |
| 94 | #define MTK_NDP_CO_PRO BIT(10) | ||
| 94 | #define MTK_TX_WB_DDONE BIT(6) | 95 | #define MTK_TX_WB_DDONE BIT(6) |
| 95 | #define MTK_DMA_SIZE_16DWORDS (2 << 4) | 96 | #define MTK_DMA_SIZE_16DWORDS (2 << 4) |
| 96 | #define MTK_RX_DMA_BUSY BIT(3) | 97 | #define MTK_RX_DMA_BUSY BIT(3) |
| @@ -357,6 +358,7 @@ struct mtk_rx_ring { | |||
| 357 | * @rx_ring: Pointer to the memore holding info about the RX ring | 358 | * @rx_ring: Pointer to the memore holding info about the RX ring |
| 358 | * @rx_napi: The NAPI struct | 359 | * @rx_napi: The NAPI struct |
| 359 | * @scratch_ring: Newer SoCs need memory for a second HW managed TX ring | 360 | * @scratch_ring: Newer SoCs need memory for a second HW managed TX ring |
| 361 | * @phy_scratch_ring: physical address of scratch_ring | ||
| 360 | * @scratch_head: The scratch memory that scratch_ring points to. | 362 | * @scratch_head: The scratch memory that scratch_ring points to. |
| 361 | * @clk_ethif: The ethif clock | 363 | * @clk_ethif: The ethif clock |
| 362 | * @clk_esw: The switch clock | 364 | * @clk_esw: The switch clock |
| @@ -384,6 +386,7 @@ struct mtk_eth { | |||
| 384 | struct mtk_rx_ring rx_ring; | 386 | struct mtk_rx_ring rx_ring; |
| 385 | struct napi_struct rx_napi; | 387 | struct napi_struct rx_napi; |
| 386 | struct mtk_tx_dma *scratch_ring; | 388 | struct mtk_tx_dma *scratch_ring; |
| 389 | dma_addr_t phy_scratch_ring; | ||
| 387 | void *scratch_head; | 390 | void *scratch_head; |
| 388 | struct clk *clk_ethif; | 391 | struct clk *clk_ethif; |
| 389 | struct clk *clk_esw; | 392 | struct clk *clk_esw; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index e94ca1c3fc7c..f04a423ff79d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
| @@ -2597,7 +2597,6 @@ int mlx4_cmd_use_events(struct mlx4_dev *dev) | |||
| 2597 | priv->cmd.free_head = 0; | 2597 | priv->cmd.free_head = 0; |
| 2598 | 2598 | ||
| 2599 | sema_init(&priv->cmd.event_sem, priv->cmd.max_cmds); | 2599 | sema_init(&priv->cmd.event_sem, priv->cmd.max_cmds); |
| 2600 | spin_lock_init(&priv->cmd.context_lock); | ||
| 2601 | 2600 | ||
| 2602 | for (priv->cmd.token_mask = 1; | 2601 | for (priv->cmd.token_mask = 1; |
| 2603 | priv->cmd.token_mask < priv->cmd.max_cmds; | 2602 | priv->cmd.token_mask < priv->cmd.max_cmds; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 19ceced6736c..0c0dfd6cdca6 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -406,14 +406,18 @@ static int mlx4_en_vlan_rx_add_vid(struct net_device *dev, | |||
| 406 | mutex_lock(&mdev->state_lock); | 406 | mutex_lock(&mdev->state_lock); |
| 407 | if (mdev->device_up && priv->port_up) { | 407 | if (mdev->device_up && priv->port_up) { |
| 408 | err = mlx4_SET_VLAN_FLTR(mdev->dev, priv); | 408 | err = mlx4_SET_VLAN_FLTR(mdev->dev, priv); |
| 409 | if (err) | 409 | if (err) { |
| 410 | en_err(priv, "Failed configuring VLAN filter\n"); | 410 | en_err(priv, "Failed configuring VLAN filter\n"); |
| 411 | goto out; | ||
| 412 | } | ||
| 411 | } | 413 | } |
| 412 | if (mlx4_register_vlan(mdev->dev, priv->port, vid, &idx)) | 414 | err = mlx4_register_vlan(mdev->dev, priv->port, vid, &idx); |
| 413 | en_dbg(HW, priv, "failed adding vlan %d\n", vid); | 415 | if (err) |
| 414 | mutex_unlock(&mdev->state_lock); | 416 | en_dbg(HW, priv, "Failed adding vlan %d\n", vid); |
| 415 | 417 | ||
| 416 | return 0; | 418 | out: |
| 419 | mutex_unlock(&mdev->state_lock); | ||
| 420 | return err; | ||
| 417 | } | 421 | } |
| 418 | 422 | ||
| 419 | static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev, | 423 | static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev, |
| @@ -421,7 +425,7 @@ static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev, | |||
| 421 | { | 425 | { |
| 422 | struct mlx4_en_priv *priv = netdev_priv(dev); | 426 | struct mlx4_en_priv *priv = netdev_priv(dev); |
| 423 | struct mlx4_en_dev *mdev = priv->mdev; | 427 | struct mlx4_en_dev *mdev = priv->mdev; |
| 424 | int err; | 428 | int err = 0; |
| 425 | 429 | ||
| 426 | en_dbg(HW, priv, "Killing VID:%d\n", vid); | 430 | en_dbg(HW, priv, "Killing VID:%d\n", vid); |
| 427 | 431 | ||
| @@ -438,7 +442,7 @@ static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev, | |||
| 438 | } | 442 | } |
| 439 | mutex_unlock(&mdev->state_lock); | 443 | mutex_unlock(&mdev->state_lock); |
| 440 | 444 | ||
| 441 | return 0; | 445 | return err; |
| 442 | } | 446 | } |
| 443 | 447 | ||
| 444 | static void mlx4_en_u64_to_mac(unsigned char dst_mac[ETH_ALEN + 2], u64 src_mac) | 448 | static void mlx4_en_u64_to_mac(unsigned char dst_mac[ETH_ALEN + 2], u64 src_mac) |
| @@ -2032,11 +2036,20 @@ err: | |||
| 2032 | return -ENOMEM; | 2036 | return -ENOMEM; |
| 2033 | } | 2037 | } |
| 2034 | 2038 | ||
| 2039 | static void mlx4_en_shutdown(struct net_device *dev) | ||
| 2040 | { | ||
| 2041 | rtnl_lock(); | ||
| 2042 | netif_device_detach(dev); | ||
| 2043 | mlx4_en_close(dev); | ||
| 2044 | rtnl_unlock(); | ||
| 2045 | } | ||
| 2035 | 2046 | ||
| 2036 | void mlx4_en_destroy_netdev(struct net_device *dev) | 2047 | void mlx4_en_destroy_netdev(struct net_device *dev) |
| 2037 | { | 2048 | { |
| 2038 | struct mlx4_en_priv *priv = netdev_priv(dev); | 2049 | struct mlx4_en_priv *priv = netdev_priv(dev); |
| 2039 | struct mlx4_en_dev *mdev = priv->mdev; | 2050 | struct mlx4_en_dev *mdev = priv->mdev; |
| 2051 | bool shutdown = mdev->dev->persist->interface_state & | ||
| 2052 | MLX4_INTERFACE_STATE_SHUTDOWN; | ||
| 2040 | 2053 | ||
| 2041 | en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port); | 2054 | en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port); |
| 2042 | 2055 | ||
| @@ -2044,7 +2057,10 @@ void mlx4_en_destroy_netdev(struct net_device *dev) | |||
| 2044 | if (priv->registered) { | 2057 | if (priv->registered) { |
| 2045 | devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev, | 2058 | devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev, |
| 2046 | priv->port)); | 2059 | priv->port)); |
| 2047 | unregister_netdev(dev); | 2060 | if (shutdown) |
| 2061 | mlx4_en_shutdown(dev); | ||
| 2062 | else | ||
| 2063 | unregister_netdev(dev); | ||
| 2048 | } | 2064 | } |
| 2049 | 2065 | ||
| 2050 | if (priv->allocated) | 2066 | if (priv->allocated) |
| @@ -2069,7 +2085,8 @@ void mlx4_en_destroy_netdev(struct net_device *dev) | |||
| 2069 | kfree(priv->tx_ring); | 2085 | kfree(priv->tx_ring); |
| 2070 | kfree(priv->tx_cq); | 2086 | kfree(priv->tx_cq); |
| 2071 | 2087 | ||
| 2072 | free_netdev(dev); | 2088 | if (!shutdown) |
| 2089 | free_netdev(dev); | ||
| 2073 | } | 2090 | } |
| 2074 | 2091 | ||
| 2075 | static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu) | 2092 | static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu) |
| @@ -2447,9 +2464,14 @@ static netdev_features_t mlx4_en_features_check(struct sk_buff *skb, | |||
| 2447 | * strip that feature if this is an IPv6 encapsulated frame. | 2464 | * strip that feature if this is an IPv6 encapsulated frame. |
| 2448 | */ | 2465 | */ |
| 2449 | if (skb->encapsulation && | 2466 | if (skb->encapsulation && |
| 2450 | (skb->ip_summed == CHECKSUM_PARTIAL) && | 2467 | (skb->ip_summed == CHECKSUM_PARTIAL)) { |
| 2451 | (ip_hdr(skb)->version != 4)) | 2468 | struct mlx4_en_priv *priv = netdev_priv(dev); |
| 2452 | features &= ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); | 2469 | |
| 2470 | if (!priv->vxlan_port || | ||
| 2471 | (ip_hdr(skb)->version != 4) || | ||
| 2472 | (udp_hdr(skb)->dest != priv->vxlan_port)) | ||
| 2473 | features &= ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); | ||
| 2474 | } | ||
| 2453 | 2475 | ||
| 2454 | return features; | 2476 | return features; |
| 2455 | } | 2477 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 12c77a70abdb..546fab0ecc3b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -3222,6 +3222,7 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data, | |||
| 3222 | 3222 | ||
| 3223 | INIT_LIST_HEAD(&priv->pgdir_list); | 3223 | INIT_LIST_HEAD(&priv->pgdir_list); |
| 3224 | mutex_init(&priv->pgdir_mutex); | 3224 | mutex_init(&priv->pgdir_mutex); |
| 3225 | spin_lock_init(&priv->cmd.context_lock); | ||
| 3225 | 3226 | ||
| 3226 | INIT_LIST_HEAD(&priv->bf_list); | 3227 | INIT_LIST_HEAD(&priv->bf_list); |
| 3227 | mutex_init(&priv->bf_mutex); | 3228 | mutex_init(&priv->bf_mutex); |
| @@ -4134,8 +4135,11 @@ static void mlx4_shutdown(struct pci_dev *pdev) | |||
| 4134 | 4135 | ||
| 4135 | mlx4_info(persist->dev, "mlx4_shutdown was called\n"); | 4136 | mlx4_info(persist->dev, "mlx4_shutdown was called\n"); |
| 4136 | mutex_lock(&persist->interface_state_mutex); | 4137 | mutex_lock(&persist->interface_state_mutex); |
| 4137 | if (persist->interface_state & MLX4_INTERFACE_STATE_UP) | 4138 | if (persist->interface_state & MLX4_INTERFACE_STATE_UP) { |
| 4139 | /* Notify mlx4 clients that the kernel is being shut down */ | ||
| 4140 | persist->interface_state |= MLX4_INTERFACE_STATE_SHUTDOWN; | ||
| 4138 | mlx4_unload_one(pdev); | 4141 | mlx4_unload_one(pdev); |
| 4142 | } | ||
| 4139 | mutex_unlock(&persist->interface_state_mutex); | 4143 | mutex_unlock(&persist->interface_state_mutex); |
| 4140 | } | 4144 | } |
| 4141 | 4145 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c index dcd2df6518de..0b4986268cc9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c | |||
| @@ -545,6 +545,7 @@ const char *mlx5_command_str(int command) | |||
| 545 | MLX5_COMMAND_STR_CASE(ALLOC_FLOW_COUNTER); | 545 | MLX5_COMMAND_STR_CASE(ALLOC_FLOW_COUNTER); |
| 546 | MLX5_COMMAND_STR_CASE(DEALLOC_FLOW_COUNTER); | 546 | MLX5_COMMAND_STR_CASE(DEALLOC_FLOW_COUNTER); |
| 547 | MLX5_COMMAND_STR_CASE(QUERY_FLOW_COUNTER); | 547 | MLX5_COMMAND_STR_CASE(QUERY_FLOW_COUNTER); |
| 548 | MLX5_COMMAND_STR_CASE(MODIFY_FLOW_TABLE); | ||
| 548 | default: return "unknown command opcode"; | 549 | default: return "unknown command opcode"; |
| 549 | } | 550 | } |
| 550 | } | 551 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index e8a6c3325b39..baa991a23475 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h | |||
| @@ -401,7 +401,7 @@ enum mlx5e_traffic_types { | |||
| 401 | }; | 401 | }; |
| 402 | 402 | ||
| 403 | enum { | 403 | enum { |
| 404 | MLX5E_STATE_ASYNC_EVENTS_ENABLE, | 404 | MLX5E_STATE_ASYNC_EVENTS_ENABLED, |
| 405 | MLX5E_STATE_OPENED, | 405 | MLX5E_STATE_OPENED, |
| 406 | MLX5E_STATE_DESTROYING, | 406 | MLX5E_STATE_DESTROYING, |
| 407 | }; | 407 | }; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c index fc7dcc03b1de..e667a870e0c2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | |||
| @@ -184,7 +184,9 @@ static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv) | |||
| 184 | #define MLX5E_NUM_SQ_STATS(priv) \ | 184 | #define MLX5E_NUM_SQ_STATS(priv) \ |
| 185 | (NUM_SQ_STATS * priv->params.num_channels * priv->params.num_tc * \ | 185 | (NUM_SQ_STATS * priv->params.num_channels * priv->params.num_tc * \ |
| 186 | test_bit(MLX5E_STATE_OPENED, &priv->state)) | 186 | test_bit(MLX5E_STATE_OPENED, &priv->state)) |
| 187 | #define MLX5E_NUM_PFC_COUNTERS(priv) hweight8(mlx5e_query_pfc_combined(priv)) | 187 | #define MLX5E_NUM_PFC_COUNTERS(priv) \ |
| 188 | (hweight8(mlx5e_query_pfc_combined(priv)) * \ | ||
| 189 | NUM_PPORT_PER_PRIO_PFC_COUNTERS) | ||
| 188 | 190 | ||
| 189 | static int mlx5e_get_sset_count(struct net_device *dev, int sset) | 191 | static int mlx5e_get_sset_count(struct net_device *dev, int sset) |
| 190 | { | 192 | { |
| @@ -211,42 +213,41 @@ static void mlx5e_fill_stats_strings(struct mlx5e_priv *priv, uint8_t *data) | |||
| 211 | 213 | ||
| 212 | /* SW counters */ | 214 | /* SW counters */ |
| 213 | for (i = 0; i < NUM_SW_COUNTERS; i++) | 215 | for (i = 0; i < NUM_SW_COUNTERS; i++) |
| 214 | strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].name); | 216 | strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].format); |
| 215 | 217 | ||
| 216 | /* Q counters */ | 218 | /* Q counters */ |
| 217 | for (i = 0; i < MLX5E_NUM_Q_CNTRS(priv); i++) | 219 | for (i = 0; i < MLX5E_NUM_Q_CNTRS(priv); i++) |
| 218 | strcpy(data + (idx++) * ETH_GSTRING_LEN, q_stats_desc[i].name); | 220 | strcpy(data + (idx++) * ETH_GSTRING_LEN, q_stats_desc[i].format); |
| 219 | 221 | ||
| 220 | /* VPORT counters */ | 222 | /* VPORT counters */ |
| 221 | for (i = 0; i < NUM_VPORT_COUNTERS; i++) | 223 | for (i = 0; i < NUM_VPORT_COUNTERS; i++) |
| 222 | strcpy(data + (idx++) * ETH_GSTRING_LEN, | 224 | strcpy(data + (idx++) * ETH_GSTRING_LEN, |
| 223 | vport_stats_desc[i].name); | 225 | vport_stats_desc[i].format); |
| 224 | 226 | ||
| 225 | /* PPORT counters */ | 227 | /* PPORT counters */ |
| 226 | for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++) | 228 | for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++) |
| 227 | strcpy(data + (idx++) * ETH_GSTRING_LEN, | 229 | strcpy(data + (idx++) * ETH_GSTRING_LEN, |
| 228 | pport_802_3_stats_desc[i].name); | 230 | pport_802_3_stats_desc[i].format); |
| 229 | 231 | ||
| 230 | for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++) | 232 | for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++) |
| 231 | strcpy(data + (idx++) * ETH_GSTRING_LEN, | 233 | strcpy(data + (idx++) * ETH_GSTRING_LEN, |
| 232 | pport_2863_stats_desc[i].name); | 234 | pport_2863_stats_desc[i].format); |
| 233 | 235 | ||
| 234 | for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++) | 236 | for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++) |
| 235 | strcpy(data + (idx++) * ETH_GSTRING_LEN, | 237 | strcpy(data + (idx++) * ETH_GSTRING_LEN, |
| 236 | pport_2819_stats_desc[i].name); | 238 | pport_2819_stats_desc[i].format); |
| 237 | 239 | ||
| 238 | for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { | 240 | for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { |
| 239 | for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++) | 241 | for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++) |
| 240 | sprintf(data + (idx++) * ETH_GSTRING_LEN, "prio%d_%s", | 242 | sprintf(data + (idx++) * ETH_GSTRING_LEN, |
| 241 | prio, | 243 | pport_per_prio_traffic_stats_desc[i].format, prio); |
| 242 | pport_per_prio_traffic_stats_desc[i].name); | ||
| 243 | } | 244 | } |
| 244 | 245 | ||
| 245 | pfc_combined = mlx5e_query_pfc_combined(priv); | 246 | pfc_combined = mlx5e_query_pfc_combined(priv); |
| 246 | for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) { | 247 | for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) { |
| 247 | for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) { | 248 | for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) { |
| 248 | sprintf(data + (idx++) * ETH_GSTRING_LEN, "prio%d_%s", | 249 | sprintf(data + (idx++) * ETH_GSTRING_LEN, |
| 249 | prio, pport_per_prio_pfc_stats_desc[i].name); | 250 | pport_per_prio_pfc_stats_desc[i].format, prio); |
| 250 | } | 251 | } |
| 251 | } | 252 | } |
| 252 | 253 | ||
| @@ -256,16 +257,15 @@ static void mlx5e_fill_stats_strings(struct mlx5e_priv *priv, uint8_t *data) | |||
| 256 | /* per channel counters */ | 257 | /* per channel counters */ |
| 257 | for (i = 0; i < priv->params.num_channels; i++) | 258 | for (i = 0; i < priv->params.num_channels; i++) |
| 258 | for (j = 0; j < NUM_RQ_STATS; j++) | 259 | for (j = 0; j < NUM_RQ_STATS; j++) |
| 259 | sprintf(data + (idx++) * ETH_GSTRING_LEN, "rx%d_%s", i, | 260 | sprintf(data + (idx++) * ETH_GSTRING_LEN, |
| 260 | rq_stats_desc[j].name); | 261 | rq_stats_desc[j].format, i); |
| 261 | 262 | ||
| 262 | for (tc = 0; tc < priv->params.num_tc; tc++) | 263 | for (tc = 0; tc < priv->params.num_tc; tc++) |
| 263 | for (i = 0; i < priv->params.num_channels; i++) | 264 | for (i = 0; i < priv->params.num_channels; i++) |
| 264 | for (j = 0; j < NUM_SQ_STATS; j++) | 265 | for (j = 0; j < NUM_SQ_STATS; j++) |
| 265 | sprintf(data + (idx++) * ETH_GSTRING_LEN, | 266 | sprintf(data + (idx++) * ETH_GSTRING_LEN, |
| 266 | "tx%d_%s", | 267 | sq_stats_desc[j].format, |
| 267 | priv->channeltc_to_txq_map[i][tc], | 268 | priv->channeltc_to_txq_map[i][tc]); |
| 268 | sq_stats_desc[j].name); | ||
| 269 | } | 269 | } |
| 270 | 270 | ||
| 271 | static void mlx5e_get_strings(struct net_device *dev, | 271 | static void mlx5e_get_strings(struct net_device *dev, |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index f5c8d5db25a8..cb6defd71fc1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |||
| @@ -105,11 +105,11 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv) | |||
| 105 | 105 | ||
| 106 | s->rx_packets += rq_stats->packets; | 106 | s->rx_packets += rq_stats->packets; |
| 107 | s->rx_bytes += rq_stats->bytes; | 107 | s->rx_bytes += rq_stats->bytes; |
| 108 | s->lro_packets += rq_stats->lro_packets; | 108 | s->rx_lro_packets += rq_stats->lro_packets; |
| 109 | s->lro_bytes += rq_stats->lro_bytes; | 109 | s->rx_lro_bytes += rq_stats->lro_bytes; |
| 110 | s->rx_csum_none += rq_stats->csum_none; | 110 | s->rx_csum_none += rq_stats->csum_none; |
| 111 | s->rx_csum_sw += rq_stats->csum_sw; | 111 | s->rx_csum_complete += rq_stats->csum_complete; |
| 112 | s->rx_csum_inner += rq_stats->csum_inner; | 112 | s->rx_csum_unnecessary_inner += rq_stats->csum_unnecessary_inner; |
| 113 | s->rx_wqe_err += rq_stats->wqe_err; | 113 | s->rx_wqe_err += rq_stats->wqe_err; |
| 114 | s->rx_mpwqe_filler += rq_stats->mpwqe_filler; | 114 | s->rx_mpwqe_filler += rq_stats->mpwqe_filler; |
| 115 | s->rx_mpwqe_frag += rq_stats->mpwqe_frag; | 115 | s->rx_mpwqe_frag += rq_stats->mpwqe_frag; |
| @@ -122,24 +122,23 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv) | |||
| 122 | 122 | ||
| 123 | s->tx_packets += sq_stats->packets; | 123 | s->tx_packets += sq_stats->packets; |
| 124 | s->tx_bytes += sq_stats->bytes; | 124 | s->tx_bytes += sq_stats->bytes; |
| 125 | s->tso_packets += sq_stats->tso_packets; | 125 | s->tx_tso_packets += sq_stats->tso_packets; |
| 126 | s->tso_bytes += sq_stats->tso_bytes; | 126 | s->tx_tso_bytes += sq_stats->tso_bytes; |
| 127 | s->tso_inner_packets += sq_stats->tso_inner_packets; | 127 | s->tx_tso_inner_packets += sq_stats->tso_inner_packets; |
| 128 | s->tso_inner_bytes += sq_stats->tso_inner_bytes; | 128 | s->tx_tso_inner_bytes += sq_stats->tso_inner_bytes; |
| 129 | s->tx_queue_stopped += sq_stats->stopped; | 129 | s->tx_queue_stopped += sq_stats->stopped; |
| 130 | s->tx_queue_wake += sq_stats->wake; | 130 | s->tx_queue_wake += sq_stats->wake; |
| 131 | s->tx_queue_dropped += sq_stats->dropped; | 131 | s->tx_queue_dropped += sq_stats->dropped; |
| 132 | s->tx_csum_inner += sq_stats->csum_offload_inner; | 132 | s->tx_csum_partial_inner += sq_stats->csum_partial_inner; |
| 133 | tx_offload_none += sq_stats->csum_offload_none; | 133 | tx_offload_none += sq_stats->csum_none; |
| 134 | } | 134 | } |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | /* Update calculated offload counters */ | 137 | /* Update calculated offload counters */ |
| 138 | s->tx_csum_offload = s->tx_packets - tx_offload_none - s->tx_csum_inner; | 138 | s->tx_csum_partial = s->tx_packets - tx_offload_none - s->tx_csum_partial_inner; |
| 139 | s->rx_csum_good = s->rx_packets - s->rx_csum_none - | 139 | s->rx_csum_unnecessary = s->rx_packets - s->rx_csum_none - s->rx_csum_complete; |
| 140 | s->rx_csum_sw; | ||
| 141 | 140 | ||
| 142 | s->link_down_events = MLX5_GET(ppcnt_reg, | 141 | s->link_down_events_phy = MLX5_GET(ppcnt_reg, |
| 143 | priv->stats.pport.phy_counters, | 142 | priv->stats.pport.phy_counters, |
| 144 | counter_set.phys_layer_cntrs.link_down_events); | 143 | counter_set.phys_layer_cntrs.link_down_events); |
| 145 | } | 144 | } |
| @@ -244,7 +243,7 @@ static void mlx5e_async_event(struct mlx5_core_dev *mdev, void *vpriv, | |||
| 244 | { | 243 | { |
| 245 | struct mlx5e_priv *priv = vpriv; | 244 | struct mlx5e_priv *priv = vpriv; |
| 246 | 245 | ||
| 247 | if (!test_bit(MLX5E_STATE_ASYNC_EVENTS_ENABLE, &priv->state)) | 246 | if (!test_bit(MLX5E_STATE_ASYNC_EVENTS_ENABLED, &priv->state)) |
| 248 | return; | 247 | return; |
| 249 | 248 | ||
| 250 | switch (event) { | 249 | switch (event) { |
| @@ -260,12 +259,12 @@ static void mlx5e_async_event(struct mlx5_core_dev *mdev, void *vpriv, | |||
| 260 | 259 | ||
| 261 | static void mlx5e_enable_async_events(struct mlx5e_priv *priv) | 260 | static void mlx5e_enable_async_events(struct mlx5e_priv *priv) |
| 262 | { | 261 | { |
| 263 | set_bit(MLX5E_STATE_ASYNC_EVENTS_ENABLE, &priv->state); | 262 | set_bit(MLX5E_STATE_ASYNC_EVENTS_ENABLED, &priv->state); |
| 264 | } | 263 | } |
| 265 | 264 | ||
| 266 | static void mlx5e_disable_async_events(struct mlx5e_priv *priv) | 265 | static void mlx5e_disable_async_events(struct mlx5e_priv *priv) |
| 267 | { | 266 | { |
| 268 | clear_bit(MLX5E_STATE_ASYNC_EVENTS_ENABLE, &priv->state); | 267 | clear_bit(MLX5E_STATE_ASYNC_EVENTS_ENABLED, &priv->state); |
| 269 | synchronize_irq(mlx5_get_msix_vec(priv->mdev, MLX5_EQ_VEC_ASYNC)); | 268 | synchronize_irq(mlx5_get_msix_vec(priv->mdev, MLX5_EQ_VEC_ASYNC)); |
| 270 | } | 269 | } |
| 271 | 270 | ||
| @@ -580,7 +579,7 @@ static int mlx5e_create_sq(struct mlx5e_channel *c, | |||
| 580 | void *sqc_wq = MLX5_ADDR_OF(sqc, sqc, wq); | 579 | void *sqc_wq = MLX5_ADDR_OF(sqc, sqc, wq); |
| 581 | int err; | 580 | int err; |
| 582 | 581 | ||
| 583 | err = mlx5_alloc_map_uar(mdev, &sq->uar, true); | 582 | err = mlx5_alloc_map_uar(mdev, &sq->uar, !!MLX5_CAP_GEN(mdev, bf)); |
| 584 | if (err) | 583 | if (err) |
| 585 | return err; | 584 | return err; |
| 586 | 585 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index bd947704b59c..022acc2e8922 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | |||
| @@ -689,7 +689,7 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, | |||
| 689 | if (is_first_ethertype_ip(skb)) { | 689 | if (is_first_ethertype_ip(skb)) { |
| 690 | skb->ip_summed = CHECKSUM_COMPLETE; | 690 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 691 | skb->csum = csum_unfold((__force __sum16)cqe->check_sum); | 691 | skb->csum = csum_unfold((__force __sum16)cqe->check_sum); |
| 692 | rq->stats.csum_sw++; | 692 | rq->stats.csum_complete++; |
| 693 | return; | 693 | return; |
| 694 | } | 694 | } |
| 695 | 695 | ||
| @@ -699,7 +699,7 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, | |||
| 699 | if (cqe_is_tunneled(cqe)) { | 699 | if (cqe_is_tunneled(cqe)) { |
| 700 | skb->csum_level = 1; | 700 | skb->csum_level = 1; |
| 701 | skb->encapsulation = 1; | 701 | skb->encapsulation = 1; |
| 702 | rq->stats.csum_inner++; | 702 | rq->stats.csum_unnecessary_inner++; |
| 703 | } | 703 | } |
| 704 | return; | 704 | return; |
| 705 | } | 705 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h index 83bc32b25849..fcd490cc5610 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h | |||
| @@ -42,9 +42,11 @@ | |||
| 42 | be64_to_cpu(*(__be32 *)((char *)ptr + dsc[i].offset)) | 42 | be64_to_cpu(*(__be32 *)((char *)ptr + dsc[i].offset)) |
| 43 | 43 | ||
| 44 | #define MLX5E_DECLARE_STAT(type, fld) #fld, offsetof(type, fld) | 44 | #define MLX5E_DECLARE_STAT(type, fld) #fld, offsetof(type, fld) |
| 45 | #define MLX5E_DECLARE_RX_STAT(type, fld) "rx%d_"#fld, offsetof(type, fld) | ||
| 46 | #define MLX5E_DECLARE_TX_STAT(type, fld) "tx%d_"#fld, offsetof(type, fld) | ||
| 45 | 47 | ||
| 46 | struct counter_desc { | 48 | struct counter_desc { |
| 47 | char name[ETH_GSTRING_LEN]; | 49 | char format[ETH_GSTRING_LEN]; |
| 48 | int offset; /* Byte offset */ | 50 | int offset; /* Byte offset */ |
| 49 | }; | 51 | }; |
| 50 | 52 | ||
| @@ -53,18 +55,18 @@ struct mlx5e_sw_stats { | |||
| 53 | u64 rx_bytes; | 55 | u64 rx_bytes; |
| 54 | u64 tx_packets; | 56 | u64 tx_packets; |
| 55 | u64 tx_bytes; | 57 | u64 tx_bytes; |
| 56 | u64 tso_packets; | 58 | u64 tx_tso_packets; |
| 57 | u64 tso_bytes; | 59 | u64 tx_tso_bytes; |
| 58 | u64 tso_inner_packets; | 60 | u64 tx_tso_inner_packets; |
| 59 | u64 tso_inner_bytes; | 61 | u64 tx_tso_inner_bytes; |
| 60 | u64 lro_packets; | 62 | u64 rx_lro_packets; |
| 61 | u64 lro_bytes; | 63 | u64 rx_lro_bytes; |
| 62 | u64 rx_csum_good; | 64 | u64 rx_csum_unnecessary; |
| 63 | u64 rx_csum_none; | 65 | u64 rx_csum_none; |
| 64 | u64 rx_csum_sw; | 66 | u64 rx_csum_complete; |
| 65 | u64 rx_csum_inner; | 67 | u64 rx_csum_unnecessary_inner; |
| 66 | u64 tx_csum_offload; | 68 | u64 tx_csum_partial; |
| 67 | u64 tx_csum_inner; | 69 | u64 tx_csum_partial_inner; |
| 68 | u64 tx_queue_stopped; | 70 | u64 tx_queue_stopped; |
| 69 | u64 tx_queue_wake; | 71 | u64 tx_queue_wake; |
| 70 | u64 tx_queue_dropped; | 72 | u64 tx_queue_dropped; |
| @@ -76,7 +78,7 @@ struct mlx5e_sw_stats { | |||
| 76 | u64 rx_cqe_compress_pkts; | 78 | u64 rx_cqe_compress_pkts; |
| 77 | 79 | ||
| 78 | /* Special handling counters */ | 80 | /* Special handling counters */ |
| 79 | u64 link_down_events; | 81 | u64 link_down_events_phy; |
| 80 | }; | 82 | }; |
| 81 | 83 | ||
| 82 | static const struct counter_desc sw_stats_desc[] = { | 84 | static const struct counter_desc sw_stats_desc[] = { |
| @@ -84,18 +86,18 @@ static const struct counter_desc sw_stats_desc[] = { | |||
| 84 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_bytes) }, | 86 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_bytes) }, |
| 85 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_packets) }, | 87 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_packets) }, |
| 86 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) }, | 88 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) }, |
| 87 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tso_packets) }, | 89 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_packets) }, |
| 88 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tso_bytes) }, | 90 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_bytes) }, |
| 89 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tso_inner_packets) }, | 91 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_packets) }, |
| 90 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tso_inner_bytes) }, | 92 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_bytes) }, |
| 91 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, lro_packets) }, | 93 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_packets) }, |
| 92 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, lro_bytes) }, | 94 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_bytes) }, |
| 93 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_good) }, | 95 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary) }, |
| 94 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) }, | 96 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) }, |
| 95 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_sw) }, | 97 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete) }, |
| 96 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_inner) }, | 98 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) }, |
| 97 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_offload) }, | 99 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) }, |
| 98 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_inner) }, | 100 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) }, |
| 99 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) }, | 101 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) }, |
| 100 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) }, | 102 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) }, |
| 101 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) }, | 103 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) }, |
| @@ -105,7 +107,7 @@ static const struct counter_desc sw_stats_desc[] = { | |||
| 105 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) }, | 107 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) }, |
| 106 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_blks) }, | 108 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_blks) }, |
| 107 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_pkts) }, | 109 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_pkts) }, |
| 108 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, link_down_events) }, | 110 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, link_down_events_phy) }, |
| 109 | }; | 111 | }; |
| 110 | 112 | ||
| 111 | struct mlx5e_qcounter_stats { | 113 | struct mlx5e_qcounter_stats { |
| @@ -125,12 +127,6 @@ struct mlx5e_vport_stats { | |||
| 125 | }; | 127 | }; |
| 126 | 128 | ||
| 127 | static const struct counter_desc vport_stats_desc[] = { | 129 | static const struct counter_desc vport_stats_desc[] = { |
| 128 | { "rx_vport_error_packets", | ||
| 129 | VPORT_COUNTER_OFF(received_errors.packets) }, | ||
| 130 | { "rx_vport_error_bytes", VPORT_COUNTER_OFF(received_errors.octets) }, | ||
| 131 | { "tx_vport_error_packets", | ||
| 132 | VPORT_COUNTER_OFF(transmit_errors.packets) }, | ||
| 133 | { "tx_vport_error_bytes", VPORT_COUNTER_OFF(transmit_errors.octets) }, | ||
| 134 | { "rx_vport_unicast_packets", | 130 | { "rx_vport_unicast_packets", |
| 135 | VPORT_COUNTER_OFF(received_eth_unicast.packets) }, | 131 | VPORT_COUNTER_OFF(received_eth_unicast.packets) }, |
| 136 | { "rx_vport_unicast_bytes", | 132 | { "rx_vport_unicast_bytes", |
| @@ -192,94 +188,68 @@ struct mlx5e_pport_stats { | |||
| 192 | }; | 188 | }; |
| 193 | 189 | ||
| 194 | static const struct counter_desc pport_802_3_stats_desc[] = { | 190 | static const struct counter_desc pport_802_3_stats_desc[] = { |
| 195 | { "frames_tx", PPORT_802_3_OFF(a_frames_transmitted_ok) }, | 191 | { "tx_packets_phy", PPORT_802_3_OFF(a_frames_transmitted_ok) }, |
| 196 | { "frames_rx", PPORT_802_3_OFF(a_frames_received_ok) }, | 192 | { "rx_packets_phy", PPORT_802_3_OFF(a_frames_received_ok) }, |
| 197 | { "check_seq_err", PPORT_802_3_OFF(a_frame_check_sequence_errors) }, | 193 | { "rx_crc_errors_phy", PPORT_802_3_OFF(a_frame_check_sequence_errors) }, |
| 198 | { "alignment_err", PPORT_802_3_OFF(a_alignment_errors) }, | 194 | { "tx_bytes_phy", PPORT_802_3_OFF(a_octets_transmitted_ok) }, |
| 199 | { "octets_tx", PPORT_802_3_OFF(a_octets_transmitted_ok) }, | 195 | { "rx_bytes_phy", PPORT_802_3_OFF(a_octets_received_ok) }, |
| 200 | { "octets_received", PPORT_802_3_OFF(a_octets_received_ok) }, | 196 | { "tx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_xmitted_ok) }, |
| 201 | { "multicast_xmitted", PPORT_802_3_OFF(a_multicast_frames_xmitted_ok) }, | 197 | { "tx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_xmitted_ok) }, |
| 202 | { "broadcast_xmitted", PPORT_802_3_OFF(a_broadcast_frames_xmitted_ok) }, | 198 | { "rx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_received_ok) }, |
| 203 | { "multicast_rx", PPORT_802_3_OFF(a_multicast_frames_received_ok) }, | 199 | { "rx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_received_ok) }, |
| 204 | { "broadcast_rx", PPORT_802_3_OFF(a_broadcast_frames_received_ok) }, | 200 | { "rx_in_range_len_errors_phy", PPORT_802_3_OFF(a_in_range_length_errors) }, |
| 205 | { "in_range_len_errors", PPORT_802_3_OFF(a_in_range_length_errors) }, | 201 | { "rx_out_of_range_len_phy", PPORT_802_3_OFF(a_out_of_range_length_field) }, |
| 206 | { "out_of_range_len", PPORT_802_3_OFF(a_out_of_range_length_field) }, | 202 | { "rx_oversize_pkts_phy", PPORT_802_3_OFF(a_frame_too_long_errors) }, |
| 207 | { "too_long_errors", PPORT_802_3_OFF(a_frame_too_long_errors) }, | 203 | { "rx_symbol_err_phy", PPORT_802_3_OFF(a_symbol_error_during_carrier) }, |
| 208 | { "symbol_err", PPORT_802_3_OFF(a_symbol_error_during_carrier) }, | 204 | { "tx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_transmitted) }, |
| 209 | { "mac_control_tx", PPORT_802_3_OFF(a_mac_control_frames_transmitted) }, | 205 | { "rx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_received) }, |
| 210 | { "mac_control_rx", PPORT_802_3_OFF(a_mac_control_frames_received) }, | 206 | { "rx_unsupported_op_phy", PPORT_802_3_OFF(a_unsupported_opcodes_received) }, |
| 211 | { "unsupported_op_rx", | 207 | { "rx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_received) }, |
| 212 | PPORT_802_3_OFF(a_unsupported_opcodes_received) }, | 208 | { "tx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_transmitted) }, |
| 213 | { "pause_ctrl_rx", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_received) }, | ||
| 214 | { "pause_ctrl_tx", | ||
| 215 | PPORT_802_3_OFF(a_pause_mac_ctrl_frames_transmitted) }, | ||
| 216 | }; | 209 | }; |
| 217 | 210 | ||
| 218 | static const struct counter_desc pport_2863_stats_desc[] = { | 211 | static const struct counter_desc pport_2863_stats_desc[] = { |
| 219 | { "in_octets", PPORT_2863_OFF(if_in_octets) }, | 212 | { "rx_discards_phy", PPORT_2863_OFF(if_in_discards) }, |
| 220 | { "in_ucast_pkts", PPORT_2863_OFF(if_in_ucast_pkts) }, | 213 | { "tx_discards_phy", PPORT_2863_OFF(if_out_discards) }, |
| 221 | { "in_discards", PPORT_2863_OFF(if_in_discards) }, | 214 | { "tx_errors_phy", PPORT_2863_OFF(if_out_errors) }, |
| 222 | { "in_errors", PPORT_2863_OFF(if_in_errors) }, | ||
| 223 | { "in_unknown_protos", PPORT_2863_OFF(if_in_unknown_protos) }, | ||
| 224 | { "out_octets", PPORT_2863_OFF(if_out_octets) }, | ||
| 225 | { "out_ucast_pkts", PPORT_2863_OFF(if_out_ucast_pkts) }, | ||
| 226 | { "out_discards", PPORT_2863_OFF(if_out_discards) }, | ||
| 227 | { "out_errors", PPORT_2863_OFF(if_out_errors) }, | ||
| 228 | { "in_multicast_pkts", PPORT_2863_OFF(if_in_multicast_pkts) }, | ||
| 229 | { "in_broadcast_pkts", PPORT_2863_OFF(if_in_broadcast_pkts) }, | ||
| 230 | { "out_multicast_pkts", PPORT_2863_OFF(if_out_multicast_pkts) }, | ||
| 231 | { "out_broadcast_pkts", PPORT_2863_OFF(if_out_broadcast_pkts) }, | ||
| 232 | }; | 215 | }; |
| 233 | 216 | ||
| 234 | static const struct counter_desc pport_2819_stats_desc[] = { | 217 | static const struct counter_desc pport_2819_stats_desc[] = { |
| 235 | { "drop_events", PPORT_2819_OFF(ether_stats_drop_events) }, | 218 | { "rx_undersize_pkts_phy", PPORT_2819_OFF(ether_stats_undersize_pkts) }, |
| 236 | { "octets", PPORT_2819_OFF(ether_stats_octets) }, | 219 | { "rx_fragments_phy", PPORT_2819_OFF(ether_stats_fragments) }, |
| 237 | { "pkts", PPORT_2819_OFF(ether_stats_pkts) }, | 220 | { "rx_jabbers_phy", PPORT_2819_OFF(ether_stats_jabbers) }, |
| 238 | { "broadcast_pkts", PPORT_2819_OFF(ether_stats_broadcast_pkts) }, | 221 | { "rx_64_bytes_phy", PPORT_2819_OFF(ether_stats_pkts64octets) }, |
| 239 | { "multicast_pkts", PPORT_2819_OFF(ether_stats_multicast_pkts) }, | 222 | { "rx_65_to_127_bytes_phy", PPORT_2819_OFF(ether_stats_pkts65to127octets) }, |
| 240 | { "crc_align_errors", PPORT_2819_OFF(ether_stats_crc_align_errors) }, | 223 | { "rx_128_to_255_bytes_phy", PPORT_2819_OFF(ether_stats_pkts128to255octets) }, |
| 241 | { "undersize_pkts", PPORT_2819_OFF(ether_stats_undersize_pkts) }, | 224 | { "rx_256_to_511_bytes_phy", PPORT_2819_OFF(ether_stats_pkts256to511octets) }, |
| 242 | { "oversize_pkts", PPORT_2819_OFF(ether_stats_oversize_pkts) }, | 225 | { "rx_512_to_1023_bytes_phy", PPORT_2819_OFF(ether_stats_pkts512to1023octets) }, |
| 243 | { "fragments", PPORT_2819_OFF(ether_stats_fragments) }, | 226 | { "rx_1024_to_1518_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1024to1518octets) }, |
| 244 | { "jabbers", PPORT_2819_OFF(ether_stats_jabbers) }, | 227 | { "rx_1519_to_2047_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1519to2047octets) }, |
| 245 | { "collisions", PPORT_2819_OFF(ether_stats_collisions) }, | 228 | { "rx_2048_to_4095_bytes_phy", PPORT_2819_OFF(ether_stats_pkts2048to4095octets) }, |
| 246 | { "p64octets", PPORT_2819_OFF(ether_stats_pkts64octets) }, | 229 | { "rx_4096_to_8191_bytes_phy", PPORT_2819_OFF(ether_stats_pkts4096to8191octets) }, |
| 247 | { "p65to127octets", PPORT_2819_OFF(ether_stats_pkts65to127octets) }, | 230 | { "rx_8192_to_10239_bytes_phy", PPORT_2819_OFF(ether_stats_pkts8192to10239octets) }, |
| 248 | { "p128to255octets", PPORT_2819_OFF(ether_stats_pkts128to255octets) }, | ||
| 249 | { "p256to511octets", PPORT_2819_OFF(ether_stats_pkts256to511octets) }, | ||
| 250 | { "p512to1023octets", PPORT_2819_OFF(ether_stats_pkts512to1023octets) }, | ||
| 251 | { "p1024to1518octets", | ||
| 252 | PPORT_2819_OFF(ether_stats_pkts1024to1518octets) }, | ||
| 253 | { "p1519to2047octets", | ||
| 254 | PPORT_2819_OFF(ether_stats_pkts1519to2047octets) }, | ||
| 255 | { "p2048to4095octets", | ||
| 256 | PPORT_2819_OFF(ether_stats_pkts2048to4095octets) }, | ||
| 257 | { "p4096to8191octets", | ||
| 258 | PPORT_2819_OFF(ether_stats_pkts4096to8191octets) }, | ||
| 259 | { "p8192to10239octets", | ||
| 260 | PPORT_2819_OFF(ether_stats_pkts8192to10239octets) }, | ||
| 261 | }; | 231 | }; |
| 262 | 232 | ||
| 263 | static const struct counter_desc pport_per_prio_traffic_stats_desc[] = { | 233 | static const struct counter_desc pport_per_prio_traffic_stats_desc[] = { |
| 264 | { "rx_octets", PPORT_PER_PRIO_OFF(rx_octets) }, | 234 | { "rx_prio%d_bytes", PPORT_PER_PRIO_OFF(rx_octets) }, |
| 265 | { "rx_frames", PPORT_PER_PRIO_OFF(rx_frames) }, | 235 | { "rx_prio%d_packets", PPORT_PER_PRIO_OFF(rx_frames) }, |
| 266 | { "tx_octets", PPORT_PER_PRIO_OFF(tx_octets) }, | 236 | { "tx_prio%d_bytes", PPORT_PER_PRIO_OFF(tx_octets) }, |
| 267 | { "tx_frames", PPORT_PER_PRIO_OFF(tx_frames) }, | 237 | { "tx_prio%d_packets", PPORT_PER_PRIO_OFF(tx_frames) }, |
| 268 | }; | 238 | }; |
| 269 | 239 | ||
| 270 | static const struct counter_desc pport_per_prio_pfc_stats_desc[] = { | 240 | static const struct counter_desc pport_per_prio_pfc_stats_desc[] = { |
| 271 | { "rx_pause", PPORT_PER_PRIO_OFF(rx_pause) }, | 241 | { "rx_prio%d_pause", PPORT_PER_PRIO_OFF(rx_pause) }, |
| 272 | { "rx_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) }, | 242 | { "rx_prio%d_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) }, |
| 273 | { "tx_pause", PPORT_PER_PRIO_OFF(tx_pause) }, | 243 | { "tx_prio%d_pause", PPORT_PER_PRIO_OFF(tx_pause) }, |
| 274 | { "tx_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) }, | 244 | { "tx_prio%d_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) }, |
| 275 | { "rx_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) }, | 245 | { "rx_prio%d_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) }, |
| 276 | }; | 246 | }; |
| 277 | 247 | ||
| 278 | struct mlx5e_rq_stats { | 248 | struct mlx5e_rq_stats { |
| 279 | u64 packets; | 249 | u64 packets; |
| 280 | u64 bytes; | 250 | u64 bytes; |
| 281 | u64 csum_sw; | 251 | u64 csum_complete; |
| 282 | u64 csum_inner; | 252 | u64 csum_unnecessary_inner; |
| 283 | u64 csum_none; | 253 | u64 csum_none; |
| 284 | u64 lro_packets; | 254 | u64 lro_packets; |
| 285 | u64 lro_bytes; | 255 | u64 lro_bytes; |
| @@ -292,19 +262,19 @@ struct mlx5e_rq_stats { | |||
| 292 | }; | 262 | }; |
| 293 | 263 | ||
| 294 | static const struct counter_desc rq_stats_desc[] = { | 264 | static const struct counter_desc rq_stats_desc[] = { |
| 295 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, packets) }, | 265 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) }, |
| 296 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, bytes) }, | 266 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) }, |
| 297 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, csum_sw) }, | 267 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) }, |
| 298 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, csum_inner) }, | 268 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) }, |
| 299 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, csum_none) }, | 269 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) }, |
| 300 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, lro_packets) }, | 270 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) }, |
| 301 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, lro_bytes) }, | 271 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) }, |
| 302 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, wqe_err) }, | 272 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, wqe_err) }, |
| 303 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, mpwqe_filler) }, | 273 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler) }, |
| 304 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, mpwqe_frag) }, | 274 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_frag) }, |
| 305 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, buff_alloc_err) }, | 275 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, buff_alloc_err) }, |
| 306 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, cqe_compress_blks) }, | 276 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_blks) }, |
| 307 | { MLX5E_DECLARE_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) }, | 277 | { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) }, |
| 308 | }; | 278 | }; |
| 309 | 279 | ||
| 310 | struct mlx5e_sq_stats { | 280 | struct mlx5e_sq_stats { |
| @@ -315,28 +285,28 @@ struct mlx5e_sq_stats { | |||
| 315 | u64 tso_bytes; | 285 | u64 tso_bytes; |
| 316 | u64 tso_inner_packets; | 286 | u64 tso_inner_packets; |
| 317 | u64 tso_inner_bytes; | 287 | u64 tso_inner_bytes; |
| 318 | u64 csum_offload_inner; | 288 | u64 csum_partial_inner; |
| 319 | u64 nop; | 289 | u64 nop; |
| 320 | /* less likely accessed in data path */ | 290 | /* less likely accessed in data path */ |
| 321 | u64 csum_offload_none; | 291 | u64 csum_none; |
| 322 | u64 stopped; | 292 | u64 stopped; |
| 323 | u64 wake; | 293 | u64 wake; |
| 324 | u64 dropped; | 294 | u64 dropped; |
| 325 | }; | 295 | }; |
| 326 | 296 | ||
| 327 | static const struct counter_desc sq_stats_desc[] = { | 297 | static const struct counter_desc sq_stats_desc[] = { |
| 328 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, packets) }, | 298 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, packets) }, |
| 329 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, bytes) }, | 299 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, bytes) }, |
| 330 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, tso_packets) }, | 300 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_packets) }, |
| 331 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, tso_bytes) }, | 301 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) }, |
| 332 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, tso_inner_packets) }, | 302 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) }, |
| 333 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, tso_inner_bytes) }, | 303 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) }, |
| 334 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, csum_offload_inner) }, | 304 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) }, |
| 335 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, nop) }, | 305 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) }, |
| 336 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, csum_offload_none) }, | 306 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) }, |
| 337 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, stopped) }, | 307 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) }, |
| 338 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, wake) }, | 308 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) }, |
| 339 | { MLX5E_DECLARE_STAT(struct mlx5e_sq_stats, dropped) }, | 309 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) }, |
| 340 | }; | 310 | }; |
| 341 | 311 | ||
| 342 | #define NUM_SW_COUNTERS ARRAY_SIZE(sw_stats_desc) | 312 | #define NUM_SW_COUNTERS ARRAY_SIZE(sw_stats_desc) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index b000ddc29553..5a750b9cd006 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | |||
| @@ -192,12 +192,12 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_sq *sq, struct sk_buff *skb) | |||
| 192 | if (skb->encapsulation) { | 192 | if (skb->encapsulation) { |
| 193 | eseg->cs_flags |= MLX5_ETH_WQE_L3_INNER_CSUM | | 193 | eseg->cs_flags |= MLX5_ETH_WQE_L3_INNER_CSUM | |
| 194 | MLX5_ETH_WQE_L4_INNER_CSUM; | 194 | MLX5_ETH_WQE_L4_INNER_CSUM; |
| 195 | sq->stats.csum_offload_inner++; | 195 | sq->stats.csum_partial_inner++; |
| 196 | } else { | 196 | } else { |
| 197 | eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM; | 197 | eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM; |
| 198 | } | 198 | } |
| 199 | } else | 199 | } else |
| 200 | sq->stats.csum_offload_none++; | 200 | sq->stats.csum_none++; |
| 201 | 201 | ||
| 202 | if (sq->cc != sq->prev_cc) { | 202 | if (sq->cc != sq->prev_cc) { |
| 203 | sq->prev_cc = sq->cc; | 203 | sq->prev_cc = sq->cc; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index a19b59348dd6..c65f4a13e17e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
| @@ -1508,8 +1508,9 @@ static const struct pci_device_id mlx5_core_pci_table[] = { | |||
| 1508 | { PCI_VDEVICE(MELLANOX, 0x1014), MLX5_PCI_DEV_IS_VF}, /* ConnectX-4 VF */ | 1508 | { PCI_VDEVICE(MELLANOX, 0x1014), MLX5_PCI_DEV_IS_VF}, /* ConnectX-4 VF */ |
| 1509 | { PCI_VDEVICE(MELLANOX, 0x1015) }, /* ConnectX-4LX */ | 1509 | { PCI_VDEVICE(MELLANOX, 0x1015) }, /* ConnectX-4LX */ |
| 1510 | { PCI_VDEVICE(MELLANOX, 0x1016), MLX5_PCI_DEV_IS_VF}, /* ConnectX-4LX VF */ | 1510 | { PCI_VDEVICE(MELLANOX, 0x1016), MLX5_PCI_DEV_IS_VF}, /* ConnectX-4LX VF */ |
| 1511 | { PCI_VDEVICE(MELLANOX, 0x1017) }, /* ConnectX-5 */ | 1511 | { PCI_VDEVICE(MELLANOX, 0x1017) }, /* ConnectX-5, PCIe 3.0 */ |
| 1512 | { PCI_VDEVICE(MELLANOX, 0x1018), MLX5_PCI_DEV_IS_VF}, /* ConnectX-5 VF */ | 1512 | { PCI_VDEVICE(MELLANOX, 0x1018), MLX5_PCI_DEV_IS_VF}, /* ConnectX-5 VF */ |
| 1513 | { PCI_VDEVICE(MELLANOX, 0x1019) }, /* ConnectX-5, PCIe 4.0 */ | ||
| 1513 | { 0, } | 1514 | { 0, } |
| 1514 | }; | 1515 | }; |
| 1515 | 1516 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vxlan.c b/drivers/net/ethernet/mellanox/mlx5/core/vxlan.c index f2fd1ef16da7..05de77267d58 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/vxlan.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/vxlan.c | |||
| @@ -105,6 +105,9 @@ static void mlx5e_vxlan_add_port(struct work_struct *work) | |||
| 105 | struct mlx5e_vxlan *vxlan; | 105 | struct mlx5e_vxlan *vxlan; |
| 106 | int err; | 106 | int err; |
| 107 | 107 | ||
| 108 | if (mlx5e_vxlan_lookup_port(priv, port)) | ||
| 109 | goto free_work; | ||
| 110 | |||
| 108 | if (mlx5e_vxlan_core_add_port_cmd(priv->mdev, port)) | 111 | if (mlx5e_vxlan_core_add_port_cmd(priv->mdev, port)) |
| 109 | goto free_work; | 112 | goto free_work; |
| 110 | 113 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.c b/drivers/net/ethernet/mellanox/mlx5/core/wq.c index ce21ee5b2357..821a087c7ae2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/wq.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.c | |||
| @@ -75,14 +75,14 @@ int mlx5_wq_cyc_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, | |||
| 75 | 75 | ||
| 76 | err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); | 76 | err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); |
| 77 | if (err) { | 77 | if (err) { |
| 78 | mlx5_core_warn(mdev, "mlx5_db_alloc() failed, %d\n", err); | 78 | mlx5_core_warn(mdev, "mlx5_db_alloc_node() failed, %d\n", err); |
| 79 | return err; | 79 | return err; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | err = mlx5_buf_alloc_node(mdev, mlx5_wq_cyc_get_byte_size(wq), | 82 | err = mlx5_buf_alloc_node(mdev, mlx5_wq_cyc_get_byte_size(wq), |
| 83 | &wq_ctrl->buf, param->buf_numa_node); | 83 | &wq_ctrl->buf, param->buf_numa_node); |
| 84 | if (err) { | 84 | if (err) { |
| 85 | mlx5_core_warn(mdev, "mlx5_buf_alloc() failed, %d\n", err); | 85 | mlx5_core_warn(mdev, "mlx5_buf_alloc_node() failed, %d\n", err); |
| 86 | goto err_db_free; | 86 | goto err_db_free; |
| 87 | } | 87 | } |
| 88 | 88 | ||
| @@ -111,14 +111,14 @@ int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, | |||
| 111 | 111 | ||
| 112 | err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); | 112 | err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); |
| 113 | if (err) { | 113 | if (err) { |
| 114 | mlx5_core_warn(mdev, "mlx5_db_alloc() failed, %d\n", err); | 114 | mlx5_core_warn(mdev, "mlx5_db_alloc_node() failed, %d\n", err); |
| 115 | return err; | 115 | return err; |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | err = mlx5_buf_alloc_node(mdev, mlx5_cqwq_get_byte_size(wq), | 118 | err = mlx5_buf_alloc_node(mdev, mlx5_cqwq_get_byte_size(wq), |
| 119 | &wq_ctrl->buf, param->buf_numa_node); | 119 | &wq_ctrl->buf, param->buf_numa_node); |
| 120 | if (err) { | 120 | if (err) { |
| 121 | mlx5_core_warn(mdev, "mlx5_buf_alloc() failed, %d\n", err); | 121 | mlx5_core_warn(mdev, "mlx5_buf_alloc_node() failed, %d\n", err); |
| 122 | goto err_db_free; | 122 | goto err_db_free; |
| 123 | } | 123 | } |
| 124 | 124 | ||
| @@ -148,13 +148,14 @@ int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, | |||
| 148 | 148 | ||
| 149 | err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); | 149 | err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); |
| 150 | if (err) { | 150 | if (err) { |
| 151 | mlx5_core_warn(mdev, "mlx5_db_alloc() failed, %d\n", err); | 151 | mlx5_core_warn(mdev, "mlx5_db_alloc_node() failed, %d\n", err); |
| 152 | return err; | 152 | return err; |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | err = mlx5_buf_alloc(mdev, mlx5_wq_ll_get_byte_size(wq), &wq_ctrl->buf); | 155 | err = mlx5_buf_alloc_node(mdev, mlx5_wq_ll_get_byte_size(wq), |
| 156 | &wq_ctrl->buf, param->buf_numa_node); | ||
| 156 | if (err) { | 157 | if (err) { |
| 157 | mlx5_core_warn(mdev, "mlx5_buf_alloc() failed, %d\n", err); | 158 | mlx5_core_warn(mdev, "mlx5_buf_alloc_node() failed, %d\n", err); |
| 158 | goto err_db_free; | 159 | goto err_db_free; |
| 159 | } | 160 | } |
| 160 | 161 | ||
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 6f9e3ddff4a8..660429ebfbe1 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
| @@ -408,7 +408,11 @@ static netdev_tx_t mlxsw_sp_port_xmit(struct sk_buff *skb, | |||
| 408 | } | 408 | } |
| 409 | 409 | ||
| 410 | mlxsw_sp_txhdr_construct(skb, &tx_info); | 410 | mlxsw_sp_txhdr_construct(skb, &tx_info); |
| 411 | len = skb->len; | 411 | /* TX header is consumed by HW on the way so we shouldn't count its |
| 412 | * bytes as being sent. | ||
| 413 | */ | ||
| 414 | len = skb->len - MLXSW_TXHDR_LEN; | ||
| 415 | |||
| 412 | /* Due to a race we might fail here because of a full queue. In that | 416 | /* Due to a race we might fail here because of a full queue. In that |
| 413 | * unlikely case we simply drop the packet. | 417 | * unlikely case we simply drop the packet. |
| 414 | */ | 418 | */ |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c index 3842eab9449a..25f658b3849a 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c +++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c | |||
| @@ -316,7 +316,10 @@ static netdev_tx_t mlxsw_sx_port_xmit(struct sk_buff *skb, | |||
| 316 | } | 316 | } |
| 317 | } | 317 | } |
| 318 | mlxsw_sx_txhdr_construct(skb, &tx_info); | 318 | mlxsw_sx_txhdr_construct(skb, &tx_info); |
| 319 | len = skb->len; | 319 | /* TX header is consumed by HW on the way so we shouldn't count its |
| 320 | * bytes as being sent. | ||
| 321 | */ | ||
| 322 | len = skb->len - MLXSW_TXHDR_LEN; | ||
| 320 | /* Due to a race we might fail here because of a full queue. In that | 323 | /* Due to a race we might fail here because of a full queue. In that |
| 321 | * unlikely case we simply drop the packet. | 324 | * unlikely case we simply drop the packet. |
| 322 | */ | 325 | */ |
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index fa47c14c743a..ba26bb356b8d 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c | |||
| @@ -2015,7 +2015,7 @@ static void nfp_net_open_stack(struct nfp_net *nn) | |||
| 2015 | 2015 | ||
| 2016 | netif_tx_wake_all_queues(nn->netdev); | 2016 | netif_tx_wake_all_queues(nn->netdev); |
| 2017 | 2017 | ||
| 2018 | enable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector); | 2018 | enable_irq(nn->irq_entries[NFP_NET_IRQ_LSC_IDX].vector); |
| 2019 | nfp_net_read_link_status(nn); | 2019 | nfp_net_read_link_status(nn); |
| 2020 | } | 2020 | } |
| 2021 | 2021 | ||
| @@ -2044,7 +2044,7 @@ static int nfp_net_netdev_open(struct net_device *netdev) | |||
| 2044 | NFP_NET_IRQ_LSC_IDX, nn->lsc_handler); | 2044 | NFP_NET_IRQ_LSC_IDX, nn->lsc_handler); |
| 2045 | if (err) | 2045 | if (err) |
| 2046 | goto err_free_exn; | 2046 | goto err_free_exn; |
| 2047 | disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector); | 2047 | disable_irq(nn->irq_entries[NFP_NET_IRQ_LSC_IDX].vector); |
| 2048 | 2048 | ||
| 2049 | nn->rx_rings = kcalloc(nn->num_rx_rings, sizeof(*nn->rx_rings), | 2049 | nn->rx_rings = kcalloc(nn->num_rx_rings, sizeof(*nn->rx_rings), |
| 2050 | GFP_KERNEL); | 2050 | GFP_KERNEL); |
| @@ -2133,7 +2133,7 @@ static void nfp_net_close_stack(struct nfp_net *nn) | |||
| 2133 | { | 2133 | { |
| 2134 | unsigned int r; | 2134 | unsigned int r; |
| 2135 | 2135 | ||
| 2136 | disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector); | 2136 | disable_irq(nn->irq_entries[NFP_NET_IRQ_LSC_IDX].vector); |
| 2137 | netif_carrier_off(nn->netdev); | 2137 | netif_carrier_off(nn->netdev); |
| 2138 | nn->link_up = false; | 2138 | nn->link_up = false; |
| 2139 | 2139 | ||
diff --git a/drivers/net/ethernet/qlogic/qed/qed_hsi.h b/drivers/net/ethernet/qlogic/qed/qed_hsi.h index 9afc15fdbb02..e29ed5a69566 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_hsi.h +++ b/drivers/net/ethernet/qlogic/qed/qed_hsi.h | |||
| @@ -3700,6 +3700,7 @@ struct public_port { | |||
| 3700 | #define MEDIA_DA_TWINAX 0x3 | 3700 | #define MEDIA_DA_TWINAX 0x3 |
| 3701 | #define MEDIA_BASE_T 0x4 | 3701 | #define MEDIA_BASE_T 0x4 |
| 3702 | #define MEDIA_SFP_1G_FIBER 0x5 | 3702 | #define MEDIA_SFP_1G_FIBER 0x5 |
| 3703 | #define MEDIA_MODULE_FIBER 0x6 | ||
| 3703 | #define MEDIA_KR 0xf0 | 3704 | #define MEDIA_KR 0xf0 |
| 3704 | #define MEDIA_NOT_PRESENT 0xff | 3705 | #define MEDIA_NOT_PRESENT 0xff |
| 3705 | 3706 | ||
diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c index 8fba87dd48af..aada4c7e095f 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_l2.c +++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c | |||
| @@ -72,6 +72,7 @@ int qed_sp_eth_vport_start(struct qed_hwfn *p_hwfn, | |||
| 72 | p_ramrod->mtu = cpu_to_le16(p_params->mtu); | 72 | p_ramrod->mtu = cpu_to_le16(p_params->mtu); |
| 73 | p_ramrod->inner_vlan_removal_en = p_params->remove_inner_vlan; | 73 | p_ramrod->inner_vlan_removal_en = p_params->remove_inner_vlan; |
| 74 | p_ramrod->drop_ttl0_en = p_params->drop_ttl0; | 74 | p_ramrod->drop_ttl0_en = p_params->drop_ttl0; |
| 75 | p_ramrod->untagged = p_params->only_untagged; | ||
| 75 | 76 | ||
| 76 | SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_UCAST_DROP_ALL, 1); | 77 | SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_UCAST_DROP_ALL, 1); |
| 77 | SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_MCAST_DROP_ALL, 1); | 78 | SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_MCAST_DROP_ALL, 1); |
| @@ -247,10 +248,6 @@ qed_sp_update_accept_mode(struct qed_hwfn *p_hwfn, | |||
| 247 | SET_FIELD(state, ETH_VPORT_TX_MODE_UCAST_DROP_ALL, | 248 | SET_FIELD(state, ETH_VPORT_TX_MODE_UCAST_DROP_ALL, |
| 248 | !!(accept_filter & QED_ACCEPT_NONE)); | 249 | !!(accept_filter & QED_ACCEPT_NONE)); |
| 249 | 250 | ||
| 250 | SET_FIELD(state, ETH_VPORT_TX_MODE_UCAST_ACCEPT_ALL, | ||
| 251 | (!!(accept_filter & QED_ACCEPT_UCAST_MATCHED) && | ||
| 252 | !!(accept_filter & QED_ACCEPT_UCAST_UNMATCHED))); | ||
| 253 | |||
| 254 | SET_FIELD(state, ETH_VPORT_TX_MODE_MCAST_DROP_ALL, | 251 | SET_FIELD(state, ETH_VPORT_TX_MODE_MCAST_DROP_ALL, |
| 255 | !!(accept_filter & QED_ACCEPT_NONE)); | 252 | !!(accept_filter & QED_ACCEPT_NONE)); |
| 256 | 253 | ||
| @@ -1748,7 +1745,8 @@ static int qed_start_vport(struct qed_dev *cdev, | |||
| 1748 | start.vport_id, start.mtu); | 1745 | start.vport_id, start.mtu); |
| 1749 | } | 1746 | } |
| 1750 | 1747 | ||
| 1751 | qed_reset_vport_stats(cdev); | 1748 | if (params->clear_stats) |
| 1749 | qed_reset_vport_stats(cdev); | ||
| 1752 | 1750 | ||
| 1753 | return 0; | 1751 | return 0; |
| 1754 | } | 1752 | } |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index 61cc6869fa65..c7e01b303540 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c | |||
| @@ -1085,6 +1085,7 @@ static int qed_get_port_type(u32 media_type) | |||
| 1085 | case MEDIA_SFPP_10G_FIBER: | 1085 | case MEDIA_SFPP_10G_FIBER: |
| 1086 | case MEDIA_SFP_1G_FIBER: | 1086 | case MEDIA_SFP_1G_FIBER: |
| 1087 | case MEDIA_XFP_FIBER: | 1087 | case MEDIA_XFP_FIBER: |
| 1088 | case MEDIA_MODULE_FIBER: | ||
| 1088 | case MEDIA_KR: | 1089 | case MEDIA_KR: |
| 1089 | port_type = PORT_FIBRE; | 1090 | port_type = PORT_FIBRE; |
| 1090 | break; | 1091 | break; |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_spq.c b/drivers/net/ethernet/qlogic/qed/qed_spq.c index acac6626a1b2..b122f6013b6c 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_spq.c +++ b/drivers/net/ethernet/qlogic/qed/qed_spq.c | |||
| @@ -213,19 +213,15 @@ static int qed_spq_hw_post(struct qed_hwfn *p_hwfn, | |||
| 213 | SET_FIELD(db.params, CORE_DB_DATA_AGG_VAL_SEL, | 213 | SET_FIELD(db.params, CORE_DB_DATA_AGG_VAL_SEL, |
| 214 | DQ_XCM_CORE_SPQ_PROD_CMD); | 214 | DQ_XCM_CORE_SPQ_PROD_CMD); |
| 215 | db.agg_flags = DQ_XCM_CORE_DQ_CF_CMD; | 215 | db.agg_flags = DQ_XCM_CORE_DQ_CF_CMD; |
| 216 | |||
| 217 | /* validate producer is up to-date */ | ||
| 218 | rmb(); | ||
| 219 | |||
| 220 | db.spq_prod = cpu_to_le16(qed_chain_get_prod_idx(p_chain)); | 216 | db.spq_prod = cpu_to_le16(qed_chain_get_prod_idx(p_chain)); |
| 221 | 217 | ||
| 222 | /* do not reorder */ | 218 | /* make sure the SPQE is updated before the doorbell */ |
| 223 | barrier(); | 219 | wmb(); |
| 224 | 220 | ||
| 225 | DOORBELL(p_hwfn, qed_db_addr(p_spq->cid, DQ_DEMS_LEGACY), *(u32 *)&db); | 221 | DOORBELL(p_hwfn, qed_db_addr(p_spq->cid, DQ_DEMS_LEGACY), *(u32 *)&db); |
| 226 | 222 | ||
| 227 | /* make sure doorbell is rang */ | 223 | /* make sure doorbell is rang */ |
| 228 | mmiowb(); | 224 | wmb(); |
| 229 | 225 | ||
| 230 | DP_VERBOSE(p_hwfn, QED_MSG_SPQ, | 226 | DP_VERBOSE(p_hwfn, QED_MSG_SPQ, |
| 231 | "Doorbelled [0x%08x, CID 0x%08x] with Flags: %02x agg_params: %02x, prod: %04x\n", | 227 | "Doorbelled [0x%08x, CID 0x%08x] with Flags: %02x agg_params: %02x, prod: %04x\n", |
| @@ -614,7 +610,9 @@ qed_spq_add_entry(struct qed_hwfn *p_hwfn, | |||
| 614 | 610 | ||
| 615 | *p_en2 = *p_ent; | 611 | *p_en2 = *p_ent; |
| 616 | 612 | ||
| 617 | kfree(p_ent); | 613 | /* EBLOCK responsible to free the allocated p_ent */ |
| 614 | if (p_ent->comp_mode != QED_SPQ_MODE_EBLOCK) | ||
| 615 | kfree(p_ent); | ||
| 618 | 616 | ||
| 619 | p_ent = p_en2; | 617 | p_ent = p_en2; |
| 620 | } | 618 | } |
| @@ -749,6 +747,15 @@ int qed_spq_post(struct qed_hwfn *p_hwfn, | |||
| 749 | * Thus, after gaining the answer perform the cleanup here. | 747 | * Thus, after gaining the answer perform the cleanup here. |
| 750 | */ | 748 | */ |
| 751 | rc = qed_spq_block(p_hwfn, p_ent, fw_return_code); | 749 | rc = qed_spq_block(p_hwfn, p_ent, fw_return_code); |
| 750 | |||
| 751 | if (p_ent->queue == &p_spq->unlimited_pending) { | ||
| 752 | /* This is an allocated p_ent which does not need to | ||
| 753 | * return to pool. | ||
| 754 | */ | ||
| 755 | kfree(p_ent); | ||
| 756 | return rc; | ||
| 757 | } | ||
| 758 | |||
| 752 | if (rc) | 759 | if (rc) |
| 753 | goto spq_post_fail2; | 760 | goto spq_post_fail2; |
| 754 | 761 | ||
| @@ -844,8 +851,12 @@ int qed_spq_completion(struct qed_hwfn *p_hwfn, | |||
| 844 | found->comp_cb.function(p_hwfn, found->comp_cb.cookie, p_data, | 851 | found->comp_cb.function(p_hwfn, found->comp_cb.cookie, p_data, |
| 845 | fw_return_code); | 852 | fw_return_code); |
| 846 | 853 | ||
| 847 | if (found->comp_mode != QED_SPQ_MODE_EBLOCK) | 854 | if ((found->comp_mode != QED_SPQ_MODE_EBLOCK) || |
| 848 | /* EBLOCK is responsible for freeing its own entry */ | 855 | (found->queue == &p_spq->unlimited_pending)) |
| 856 | /* EBLOCK is responsible for returning its own entry into the | ||
| 857 | * free list, unless it originally added the entry into the | ||
| 858 | * unlimited pending list. | ||
| 859 | */ | ||
| 849 | qed_spq_return_entry(p_hwfn, found); | 860 | qed_spq_return_entry(p_hwfn, found); |
| 850 | 861 | ||
| 851 | /* Attempt to post pending requests */ | 862 | /* Attempt to post pending requests */ |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index 5733d1888223..f8e11f953acb 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c | |||
| @@ -3231,7 +3231,7 @@ static int qede_stop_queues(struct qede_dev *edev) | |||
| 3231 | return rc; | 3231 | return rc; |
| 3232 | } | 3232 | } |
| 3233 | 3233 | ||
| 3234 | static int qede_start_queues(struct qede_dev *edev) | 3234 | static int qede_start_queues(struct qede_dev *edev, bool clear_stats) |
| 3235 | { | 3235 | { |
| 3236 | int rc, tc, i; | 3236 | int rc, tc, i; |
| 3237 | int vlan_removal_en = 1; | 3237 | int vlan_removal_en = 1; |
| @@ -3462,6 +3462,7 @@ out: | |||
| 3462 | 3462 | ||
| 3463 | enum qede_load_mode { | 3463 | enum qede_load_mode { |
| 3464 | QEDE_LOAD_NORMAL, | 3464 | QEDE_LOAD_NORMAL, |
| 3465 | QEDE_LOAD_RELOAD, | ||
| 3465 | }; | 3466 | }; |
| 3466 | 3467 | ||
| 3467 | static int qede_load(struct qede_dev *edev, enum qede_load_mode mode) | 3468 | static int qede_load(struct qede_dev *edev, enum qede_load_mode mode) |
| @@ -3500,7 +3501,7 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode) | |||
| 3500 | goto err3; | 3501 | goto err3; |
| 3501 | DP_INFO(edev, "Setup IRQs succeeded\n"); | 3502 | DP_INFO(edev, "Setup IRQs succeeded\n"); |
| 3502 | 3503 | ||
| 3503 | rc = qede_start_queues(edev); | 3504 | rc = qede_start_queues(edev, mode != QEDE_LOAD_RELOAD); |
| 3504 | if (rc) | 3505 | if (rc) |
| 3505 | goto err4; | 3506 | goto err4; |
| 3506 | DP_INFO(edev, "Start VPORT, RXQ and TXQ succeeded\n"); | 3507 | DP_INFO(edev, "Start VPORT, RXQ and TXQ succeeded\n"); |
| @@ -3555,7 +3556,7 @@ void qede_reload(struct qede_dev *edev, | |||
| 3555 | if (func) | 3556 | if (func) |
| 3556 | func(edev, args); | 3557 | func(edev, args); |
| 3557 | 3558 | ||
| 3558 | qede_load(edev, QEDE_LOAD_NORMAL); | 3559 | qede_load(edev, QEDE_LOAD_RELOAD); |
| 3559 | 3560 | ||
| 3560 | mutex_lock(&edev->qede_lock); | 3561 | mutex_lock(&edev->qede_lock); |
| 3561 | qede_config_rx_mode(edev->ndev); | 3562 | qede_config_rx_mode(edev->ndev); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index 7bd6f25b4625..607bb7d4514d 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
| @@ -2220,7 +2220,7 @@ void qlcnic_83xx_process_rcv_ring_diag(struct qlcnic_host_sds_ring *sds_ring) | |||
| 2220 | if (!opcode) | 2220 | if (!opcode) |
| 2221 | return; | 2221 | return; |
| 2222 | 2222 | ||
| 2223 | ring = QLCNIC_FETCH_RING_ID(qlcnic_83xx_hndl(sts_data[0])); | 2223 | ring = QLCNIC_FETCH_RING_ID(sts_data[0]); |
| 2224 | qlcnic_83xx_process_rcv_diag(adapter, ring, sts_data); | 2224 | qlcnic_83xx_process_rcv_diag(adapter, ring, sts_data); |
| 2225 | desc = &sds_ring->desc_head[consumer]; | 2225 | desc = &sds_ring->desc_head[consumer]; |
| 2226 | desc->status_desc_data[0] = cpu_to_le64(STATUS_OWNER_PHANTOM); | 2226 | desc->status_desc_data[0] = cpu_to_le64(STATUS_OWNER_PHANTOM); |
diff --git a/drivers/net/ethernet/sfc/farch.c b/drivers/net/ethernet/sfc/farch.c index 133e9e35be9e..4c83739d158f 100644 --- a/drivers/net/ethernet/sfc/farch.c +++ b/drivers/net/ethernet/sfc/farch.c | |||
| @@ -104,7 +104,8 @@ int efx_farch_test_registers(struct efx_nic *efx, | |||
| 104 | const struct efx_farch_register_test *regs, | 104 | const struct efx_farch_register_test *regs, |
| 105 | size_t n_regs) | 105 | size_t n_regs) |
| 106 | { | 106 | { |
| 107 | unsigned address = 0, i, j; | 107 | unsigned address = 0; |
| 108 | int i, j; | ||
| 108 | efx_oword_t mask, imask, original, reg, buf; | 109 | efx_oword_t mask, imask, original, reg, buf; |
| 109 | 110 | ||
| 110 | for (i = 0; i < n_regs; ++i) { | 111 | for (i = 0; i < n_regs; ++i) { |
diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c index 8af25563f627..b5ab5e120bca 100644 --- a/drivers/net/ethernet/smsc/smsc911x.c +++ b/drivers/net/ethernet/smsc/smsc911x.c | |||
| @@ -116,7 +116,6 @@ struct smsc911x_data { | |||
| 116 | 116 | ||
| 117 | struct phy_device *phy_dev; | 117 | struct phy_device *phy_dev; |
| 118 | struct mii_bus *mii_bus; | 118 | struct mii_bus *mii_bus; |
| 119 | int phy_irq[PHY_MAX_ADDR]; | ||
| 120 | unsigned int using_extphy; | 119 | unsigned int using_extphy; |
| 121 | int last_duplex; | 120 | int last_duplex; |
| 122 | int last_carrier; | 121 | int last_carrier; |
| @@ -1073,7 +1072,6 @@ static int smsc911x_mii_init(struct platform_device *pdev, | |||
| 1073 | pdata->mii_bus->priv = pdata; | 1072 | pdata->mii_bus->priv = pdata; |
| 1074 | pdata->mii_bus->read = smsc911x_mii_read; | 1073 | pdata->mii_bus->read = smsc911x_mii_read; |
| 1075 | pdata->mii_bus->write = smsc911x_mii_write; | 1074 | pdata->mii_bus->write = smsc911x_mii_write; |
| 1076 | memcpy(pdata->mii_bus->irq, pdata->phy_irq, sizeof(pdata->mii_bus)); | ||
| 1077 | 1075 | ||
| 1078 | pdata->mii_bus->parent = &pdev->dev; | 1076 | pdata->mii_bus->parent = &pdev->dev; |
| 1079 | 1077 | ||
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index e6bb0ecb12c7..53190894f17a 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -2505,8 +2505,6 @@ static int cpsw_probe(struct platform_device *pdev) | |||
| 2505 | clean_ale_ret: | 2505 | clean_ale_ret: |
| 2506 | cpsw_ale_destroy(priv->ale); | 2506 | cpsw_ale_destroy(priv->ale); |
| 2507 | clean_dma_ret: | 2507 | clean_dma_ret: |
| 2508 | cpdma_chan_destroy(priv->txch); | ||
| 2509 | cpdma_chan_destroy(priv->rxch); | ||
| 2510 | cpdma_ctlr_destroy(priv->dma); | 2508 | cpdma_ctlr_destroy(priv->dma); |
| 2511 | clean_runtime_disable_ret: | 2509 | clean_runtime_disable_ret: |
| 2512 | pm_runtime_disable(&pdev->dev); | 2510 | pm_runtime_disable(&pdev->dev); |
| @@ -2534,8 +2532,6 @@ static int cpsw_remove(struct platform_device *pdev) | |||
| 2534 | unregister_netdev(ndev); | 2532 | unregister_netdev(ndev); |
| 2535 | 2533 | ||
| 2536 | cpsw_ale_destroy(priv->ale); | 2534 | cpsw_ale_destroy(priv->ale); |
| 2537 | cpdma_chan_destroy(priv->txch); | ||
| 2538 | cpdma_chan_destroy(priv->rxch); | ||
| 2539 | cpdma_ctlr_destroy(priv->dma); | 2535 | cpdma_ctlr_destroy(priv->dma); |
| 2540 | pm_runtime_disable(&pdev->dev); | 2536 | pm_runtime_disable(&pdev->dev); |
| 2541 | device_for_each_child(&pdev->dev, NULL, cpsw_remove_child_device); | 2537 | device_for_each_child(&pdev->dev, NULL, cpsw_remove_child_device); |
diff --git a/drivers/net/ethernet/tile/tilegx.c b/drivers/net/ethernet/tile/tilegx.c index 0a15acc075b3..11213a38c795 100644 --- a/drivers/net/ethernet/tile/tilegx.c +++ b/drivers/net/ethernet/tile/tilegx.c | |||
| @@ -462,7 +462,7 @@ static void tile_tx_timestamp(struct sk_buff *skb, int instance) | |||
| 462 | if (unlikely((shtx->tx_flags & SKBTX_HW_TSTAMP) != 0)) { | 462 | if (unlikely((shtx->tx_flags & SKBTX_HW_TSTAMP) != 0)) { |
| 463 | struct mpipe_data *md = &mpipe_data[instance]; | 463 | struct mpipe_data *md = &mpipe_data[instance]; |
| 464 | struct skb_shared_hwtstamps shhwtstamps; | 464 | struct skb_shared_hwtstamps shhwtstamps; |
| 465 | struct timespec ts; | 465 | struct timespec64 ts; |
| 466 | 466 | ||
| 467 | shtx->tx_flags |= SKBTX_IN_PROGRESS; | 467 | shtx->tx_flags |= SKBTX_IN_PROGRESS; |
| 468 | gxio_mpipe_get_timestamp(&md->context, &ts); | 468 | gxio_mpipe_get_timestamp(&md->context, &ts); |
| @@ -886,9 +886,9 @@ static struct ptp_clock_info ptp_mpipe_caps = { | |||
| 886 | /* Sync mPIPE's timestamp up with Linux system time and register PTP clock. */ | 886 | /* Sync mPIPE's timestamp up with Linux system time and register PTP clock. */ |
| 887 | static void register_ptp_clock(struct net_device *dev, struct mpipe_data *md) | 887 | static void register_ptp_clock(struct net_device *dev, struct mpipe_data *md) |
| 888 | { | 888 | { |
| 889 | struct timespec ts; | 889 | struct timespec64 ts; |
| 890 | 890 | ||
| 891 | getnstimeofday(&ts); | 891 | ktime_get_ts64(&ts); |
| 892 | gxio_mpipe_set_timestamp(&md->context, &ts); | 892 | gxio_mpipe_set_timestamp(&md->context, &ts); |
| 893 | 893 | ||
| 894 | mutex_init(&md->ptp_lock); | 894 | mutex_init(&md->ptp_lock); |
diff --git a/drivers/net/fddi/skfp/Makefile b/drivers/net/fddi/skfp/Makefile index b0be0234abf6..a957a1c7e5ba 100644 --- a/drivers/net/fddi/skfp/Makefile +++ b/drivers/net/fddi/skfp/Makefile | |||
| @@ -17,4 +17,4 @@ skfp-objs := skfddi.o hwmtm.o fplustm.o smt.o cfm.o \ | |||
| 17 | # projects. To keep the source common for all those drivers (and | 17 | # projects. To keep the source common for all those drivers (and |
| 18 | # thus simplify fixes to it), please do not clean it up! | 18 | # thus simplify fixes to it), please do not clean it up! |
| 19 | 19 | ||
| 20 | ccflags-y := -Idrivers/net/skfp -DPCI -DMEM_MAPPED_IO -Wno-strict-prototypes | 20 | ccflags-y := -DPCI -DMEM_MAPPED_IO -Wno-strict-prototypes |
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index cadefe4fdaa2..cc39cefeae45 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
| @@ -958,8 +958,8 @@ tx_error: | |||
| 958 | dev->stats.collisions++; | 958 | dev->stats.collisions++; |
| 959 | else if (err == -ENETUNREACH) | 959 | else if (err == -ENETUNREACH) |
| 960 | dev->stats.tx_carrier_errors++; | 960 | dev->stats.tx_carrier_errors++; |
| 961 | else | 961 | |
| 962 | dev->stats.tx_errors++; | 962 | dev->stats.tx_errors++; |
| 963 | return NETDEV_TX_OK; | 963 | return NETDEV_TX_OK; |
| 964 | } | 964 | } |
| 965 | 965 | ||
| @@ -1048,8 +1048,8 @@ tx_error: | |||
| 1048 | dev->stats.collisions++; | 1048 | dev->stats.collisions++; |
| 1049 | else if (err == -ENETUNREACH) | 1049 | else if (err == -ENETUNREACH) |
| 1050 | dev->stats.tx_carrier_errors++; | 1050 | dev->stats.tx_carrier_errors++; |
| 1051 | else | 1051 | |
| 1052 | dev->stats.tx_errors++; | 1052 | dev->stats.tx_errors++; |
| 1053 | return NETDEV_TX_OK; | 1053 | return NETDEV_TX_OK; |
| 1054 | } | 1054 | } |
| 1055 | #endif | 1055 | #endif |
| @@ -1508,6 +1508,7 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name, | |||
| 1508 | { | 1508 | { |
| 1509 | struct nlattr *tb[IFLA_MAX + 1]; | 1509 | struct nlattr *tb[IFLA_MAX + 1]; |
| 1510 | struct net_device *dev; | 1510 | struct net_device *dev; |
| 1511 | LIST_HEAD(list_kill); | ||
| 1511 | int err; | 1512 | int err; |
| 1512 | 1513 | ||
| 1513 | memset(tb, 0, sizeof(tb)); | 1514 | memset(tb, 0, sizeof(tb)); |
| @@ -1519,8 +1520,10 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name, | |||
| 1519 | err = geneve_configure(net, dev, &geneve_remote_unspec, | 1520 | err = geneve_configure(net, dev, &geneve_remote_unspec, |
| 1520 | 0, 0, 0, 0, htons(dst_port), true, | 1521 | 0, 0, 0, 0, htons(dst_port), true, |
| 1521 | GENEVE_F_UDP_ZERO_CSUM6_RX); | 1522 | GENEVE_F_UDP_ZERO_CSUM6_RX); |
| 1522 | if (err) | 1523 | if (err) { |
| 1523 | goto err; | 1524 | free_netdev(dev); |
| 1525 | return ERR_PTR(err); | ||
| 1526 | } | ||
| 1524 | 1527 | ||
| 1525 | /* openvswitch users expect packet sizes to be unrestricted, | 1528 | /* openvswitch users expect packet sizes to be unrestricted, |
| 1526 | * so set the largest MTU we can. | 1529 | * so set the largest MTU we can. |
| @@ -1529,10 +1532,15 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name, | |||
| 1529 | if (err) | 1532 | if (err) |
| 1530 | goto err; | 1533 | goto err; |
| 1531 | 1534 | ||
| 1535 | err = rtnl_configure_link(dev, NULL); | ||
| 1536 | if (err < 0) | ||
| 1537 | goto err; | ||
| 1538 | |||
| 1532 | return dev; | 1539 | return dev; |
| 1533 | 1540 | ||
| 1534 | err: | 1541 | err: |
| 1535 | free_netdev(dev); | 1542 | geneve_dellink(dev, &list_kill); |
| 1543 | unregister_netdevice_many(&list_kill); | ||
| 1536 | return ERR_PTR(err); | 1544 | return ERR_PTR(err); |
| 1537 | } | 1545 | } |
| 1538 | EXPORT_SYMBOL_GPL(geneve_dev_create_fb); | 1546 | EXPORT_SYMBOL_GPL(geneve_dev_create_fb); |
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 47ee2c840b55..0e7eff7f1cd2 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c | |||
| @@ -605,12 +605,41 @@ static void macsec_encrypt_done(struct crypto_async_request *base, int err) | |||
| 605 | dev_put(dev); | 605 | dev_put(dev); |
| 606 | } | 606 | } |
| 607 | 607 | ||
| 608 | static struct aead_request *macsec_alloc_req(struct crypto_aead *tfm, | ||
| 609 | unsigned char **iv, | ||
| 610 | struct scatterlist **sg) | ||
| 611 | { | ||
| 612 | size_t size, iv_offset, sg_offset; | ||
| 613 | struct aead_request *req; | ||
| 614 | void *tmp; | ||
| 615 | |||
| 616 | size = sizeof(struct aead_request) + crypto_aead_reqsize(tfm); | ||
| 617 | iv_offset = size; | ||
| 618 | size += GCM_AES_IV_LEN; | ||
| 619 | |||
| 620 | size = ALIGN(size, __alignof__(struct scatterlist)); | ||
| 621 | sg_offset = size; | ||
| 622 | size += sizeof(struct scatterlist) * (MAX_SKB_FRAGS + 1); | ||
| 623 | |||
| 624 | tmp = kmalloc(size, GFP_ATOMIC); | ||
| 625 | if (!tmp) | ||
| 626 | return NULL; | ||
| 627 | |||
| 628 | *iv = (unsigned char *)(tmp + iv_offset); | ||
| 629 | *sg = (struct scatterlist *)(tmp + sg_offset); | ||
| 630 | req = tmp; | ||
| 631 | |||
| 632 | aead_request_set_tfm(req, tfm); | ||
| 633 | |||
| 634 | return req; | ||
| 635 | } | ||
| 636 | |||
| 608 | static struct sk_buff *macsec_encrypt(struct sk_buff *skb, | 637 | static struct sk_buff *macsec_encrypt(struct sk_buff *skb, |
| 609 | struct net_device *dev) | 638 | struct net_device *dev) |
| 610 | { | 639 | { |
| 611 | int ret; | 640 | int ret; |
| 612 | struct scatterlist sg[MAX_SKB_FRAGS + 1]; | 641 | struct scatterlist *sg; |
| 613 | unsigned char iv[GCM_AES_IV_LEN]; | 642 | unsigned char *iv; |
| 614 | struct ethhdr *eth; | 643 | struct ethhdr *eth; |
| 615 | struct macsec_eth_header *hh; | 644 | struct macsec_eth_header *hh; |
| 616 | size_t unprotected_len; | 645 | size_t unprotected_len; |
| @@ -668,8 +697,6 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb, | |||
| 668 | macsec_fill_sectag(hh, secy, pn); | 697 | macsec_fill_sectag(hh, secy, pn); |
| 669 | macsec_set_shortlen(hh, unprotected_len - 2 * ETH_ALEN); | 698 | macsec_set_shortlen(hh, unprotected_len - 2 * ETH_ALEN); |
| 670 | 699 | ||
| 671 | macsec_fill_iv(iv, secy->sci, pn); | ||
| 672 | |||
| 673 | skb_put(skb, secy->icv_len); | 700 | skb_put(skb, secy->icv_len); |
| 674 | 701 | ||
| 675 | if (skb->len - ETH_HLEN > macsec_priv(dev)->real_dev->mtu) { | 702 | if (skb->len - ETH_HLEN > macsec_priv(dev)->real_dev->mtu) { |
| @@ -684,13 +711,15 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb, | |||
| 684 | return ERR_PTR(-EINVAL); | 711 | return ERR_PTR(-EINVAL); |
| 685 | } | 712 | } |
| 686 | 713 | ||
| 687 | req = aead_request_alloc(tx_sa->key.tfm, GFP_ATOMIC); | 714 | req = macsec_alloc_req(tx_sa->key.tfm, &iv, &sg); |
| 688 | if (!req) { | 715 | if (!req) { |
| 689 | macsec_txsa_put(tx_sa); | 716 | macsec_txsa_put(tx_sa); |
| 690 | kfree_skb(skb); | 717 | kfree_skb(skb); |
| 691 | return ERR_PTR(-ENOMEM); | 718 | return ERR_PTR(-ENOMEM); |
| 692 | } | 719 | } |
| 693 | 720 | ||
| 721 | macsec_fill_iv(iv, secy->sci, pn); | ||
| 722 | |||
| 694 | sg_init_table(sg, MAX_SKB_FRAGS + 1); | 723 | sg_init_table(sg, MAX_SKB_FRAGS + 1); |
| 695 | skb_to_sgvec(skb, sg, 0, skb->len); | 724 | skb_to_sgvec(skb, sg, 0, skb->len); |
| 696 | 725 | ||
| @@ -861,7 +890,6 @@ static void macsec_decrypt_done(struct crypto_async_request *base, int err) | |||
| 861 | out: | 890 | out: |
| 862 | macsec_rxsa_put(rx_sa); | 891 | macsec_rxsa_put(rx_sa); |
| 863 | dev_put(dev); | 892 | dev_put(dev); |
| 864 | return; | ||
| 865 | } | 893 | } |
| 866 | 894 | ||
| 867 | static struct sk_buff *macsec_decrypt(struct sk_buff *skb, | 895 | static struct sk_buff *macsec_decrypt(struct sk_buff *skb, |
| @@ -871,8 +899,8 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb, | |||
| 871 | struct macsec_secy *secy) | 899 | struct macsec_secy *secy) |
| 872 | { | 900 | { |
| 873 | int ret; | 901 | int ret; |
| 874 | struct scatterlist sg[MAX_SKB_FRAGS + 1]; | 902 | struct scatterlist *sg; |
| 875 | unsigned char iv[GCM_AES_IV_LEN]; | 903 | unsigned char *iv; |
| 876 | struct aead_request *req; | 904 | struct aead_request *req; |
| 877 | struct macsec_eth_header *hdr; | 905 | struct macsec_eth_header *hdr; |
| 878 | u16 icv_len = secy->icv_len; | 906 | u16 icv_len = secy->icv_len; |
| @@ -882,7 +910,7 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb, | |||
| 882 | if (!skb) | 910 | if (!skb) |
| 883 | return ERR_PTR(-ENOMEM); | 911 | return ERR_PTR(-ENOMEM); |
| 884 | 912 | ||
| 885 | req = aead_request_alloc(rx_sa->key.tfm, GFP_ATOMIC); | 913 | req = macsec_alloc_req(rx_sa->key.tfm, &iv, &sg); |
| 886 | if (!req) { | 914 | if (!req) { |
| 887 | kfree_skb(skb); | 915 | kfree_skb(skb); |
| 888 | return ERR_PTR(-ENOMEM); | 916 | return ERR_PTR(-ENOMEM); |
| @@ -1234,7 +1262,7 @@ static struct crypto_aead *macsec_alloc_tfm(char *key, int key_len, int icv_len) | |||
| 1234 | struct crypto_aead *tfm; | 1262 | struct crypto_aead *tfm; |
| 1235 | int ret; | 1263 | int ret; |
| 1236 | 1264 | ||
| 1237 | tfm = crypto_alloc_aead("gcm(aes)", 0, CRYPTO_ALG_ASYNC); | 1265 | tfm = crypto_alloc_aead("gcm(aes)", 0, 0); |
| 1238 | if (!tfm || IS_ERR(tfm)) | 1266 | if (!tfm || IS_ERR(tfm)) |
| 1239 | return NULL; | 1267 | return NULL; |
| 1240 | 1268 | ||
| @@ -3361,6 +3389,7 @@ static void __exit macsec_exit(void) | |||
| 3361 | genl_unregister_family(&macsec_fam); | 3389 | genl_unregister_family(&macsec_fam); |
| 3362 | rtnl_link_unregister(&macsec_link_ops); | 3390 | rtnl_link_unregister(&macsec_link_ops); |
| 3363 | unregister_netdevice_notifier(&macsec_notifier); | 3391 | unregister_netdevice_notifier(&macsec_notifier); |
| 3392 | rcu_barrier(); | ||
| 3364 | } | 3393 | } |
| 3365 | 3394 | ||
| 3366 | module_init(macsec_init); | 3395 | module_init(macsec_init); |
diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c index 2d2e4339f0df..9ec7f7353434 100644 --- a/drivers/net/phy/fixed_phy.c +++ b/drivers/net/phy/fixed_phy.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
| 24 | #include <linux/of.h> | 24 | #include <linux/of.h> |
| 25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
| 26 | #include <linux/idr.h> | ||
| 26 | 27 | ||
| 27 | #define MII_REGS_NUM 29 | 28 | #define MII_REGS_NUM 29 |
| 28 | 29 | ||
| @@ -286,6 +287,8 @@ err_regs: | |||
| 286 | } | 287 | } |
| 287 | EXPORT_SYMBOL_GPL(fixed_phy_add); | 288 | EXPORT_SYMBOL_GPL(fixed_phy_add); |
| 288 | 289 | ||
| 290 | static DEFINE_IDA(phy_fixed_ida); | ||
| 291 | |||
| 289 | static void fixed_phy_del(int phy_addr) | 292 | static void fixed_phy_del(int phy_addr) |
| 290 | { | 293 | { |
| 291 | struct fixed_mdio_bus *fmb = &platform_fmb; | 294 | struct fixed_mdio_bus *fmb = &platform_fmb; |
| @@ -297,14 +300,12 @@ static void fixed_phy_del(int phy_addr) | |||
| 297 | if (gpio_is_valid(fp->link_gpio)) | 300 | if (gpio_is_valid(fp->link_gpio)) |
| 298 | gpio_free(fp->link_gpio); | 301 | gpio_free(fp->link_gpio); |
| 299 | kfree(fp); | 302 | kfree(fp); |
| 303 | ida_simple_remove(&phy_fixed_ida, phy_addr); | ||
| 300 | return; | 304 | return; |
| 301 | } | 305 | } |
| 302 | } | 306 | } |
| 303 | } | 307 | } |
| 304 | 308 | ||
| 305 | static int phy_fixed_addr; | ||
| 306 | static DEFINE_SPINLOCK(phy_fixed_addr_lock); | ||
| 307 | |||
| 308 | struct phy_device *fixed_phy_register(unsigned int irq, | 309 | struct phy_device *fixed_phy_register(unsigned int irq, |
| 309 | struct fixed_phy_status *status, | 310 | struct fixed_phy_status *status, |
| 310 | int link_gpio, | 311 | int link_gpio, |
| @@ -319,17 +320,15 @@ struct phy_device *fixed_phy_register(unsigned int irq, | |||
| 319 | return ERR_PTR(-EPROBE_DEFER); | 320 | return ERR_PTR(-EPROBE_DEFER); |
| 320 | 321 | ||
| 321 | /* Get the next available PHY address, up to PHY_MAX_ADDR */ | 322 | /* Get the next available PHY address, up to PHY_MAX_ADDR */ |
| 322 | spin_lock(&phy_fixed_addr_lock); | 323 | phy_addr = ida_simple_get(&phy_fixed_ida, 0, PHY_MAX_ADDR, GFP_KERNEL); |
| 323 | if (phy_fixed_addr == PHY_MAX_ADDR) { | 324 | if (phy_addr < 0) |
| 324 | spin_unlock(&phy_fixed_addr_lock); | 325 | return ERR_PTR(phy_addr); |
| 325 | return ERR_PTR(-ENOSPC); | ||
| 326 | } | ||
| 327 | phy_addr = phy_fixed_addr++; | ||
| 328 | spin_unlock(&phy_fixed_addr_lock); | ||
| 329 | 326 | ||
| 330 | ret = fixed_phy_add(irq, phy_addr, status, link_gpio); | 327 | ret = fixed_phy_add(irq, phy_addr, status, link_gpio); |
| 331 | if (ret < 0) | 328 | if (ret < 0) { |
| 329 | ida_simple_remove(&phy_fixed_ida, phy_addr); | ||
| 332 | return ERR_PTR(ret); | 330 | return ERR_PTR(ret); |
| 331 | } | ||
| 333 | 332 | ||
| 334 | phy = get_phy_device(fmb->mii_bus, phy_addr, false); | 333 | phy = get_phy_device(fmb->mii_bus, phy_addr, false); |
| 335 | if (IS_ERR(phy)) { | 334 | if (IS_ERR(phy)) { |
| @@ -434,6 +433,7 @@ static void __exit fixed_mdio_bus_exit(void) | |||
| 434 | list_del(&fp->node); | 433 | list_del(&fp->node); |
| 435 | kfree(fp); | 434 | kfree(fp); |
| 436 | } | 435 | } |
| 436 | ida_destroy(&phy_fixed_ida); | ||
| 437 | } | 437 | } |
| 438 | module_exit(fixed_mdio_bus_exit); | 438 | module_exit(fixed_mdio_bus_exit); |
| 439 | 439 | ||
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index 280e8795b463..ec2c1eee6405 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c | |||
| @@ -285,6 +285,48 @@ static int marvell_config_aneg(struct phy_device *phydev) | |||
| 285 | return 0; | 285 | return 0; |
| 286 | } | 286 | } |
| 287 | 287 | ||
| 288 | static int m88e1111_config_aneg(struct phy_device *phydev) | ||
| 289 | { | ||
| 290 | int err; | ||
| 291 | |||
| 292 | /* The Marvell PHY has an errata which requires | ||
| 293 | * that certain registers get written in order | ||
| 294 | * to restart autonegotiation | ||
| 295 | */ | ||
| 296 | err = phy_write(phydev, MII_BMCR, BMCR_RESET); | ||
| 297 | |||
| 298 | err = marvell_set_polarity(phydev, phydev->mdix); | ||
| 299 | if (err < 0) | ||
| 300 | return err; | ||
| 301 | |||
| 302 | err = phy_write(phydev, MII_M1111_PHY_LED_CONTROL, | ||
| 303 | MII_M1111_PHY_LED_DIRECT); | ||
| 304 | if (err < 0) | ||
| 305 | return err; | ||
| 306 | |||
| 307 | err = genphy_config_aneg(phydev); | ||
| 308 | if (err < 0) | ||
| 309 | return err; | ||
| 310 | |||
| 311 | if (phydev->autoneg != AUTONEG_ENABLE) { | ||
| 312 | int bmcr; | ||
| 313 | |||
| 314 | /* A write to speed/duplex bits (that is performed by | ||
| 315 | * genphy_config_aneg() call above) must be followed by | ||
| 316 | * a software reset. Otherwise, the write has no effect. | ||
| 317 | */ | ||
| 318 | bmcr = phy_read(phydev, MII_BMCR); | ||
| 319 | if (bmcr < 0) | ||
| 320 | return bmcr; | ||
| 321 | |||
| 322 | err = phy_write(phydev, MII_BMCR, bmcr | BMCR_RESET); | ||
| 323 | if (err < 0) | ||
| 324 | return err; | ||
| 325 | } | ||
| 326 | |||
| 327 | return 0; | ||
| 328 | } | ||
| 329 | |||
| 288 | #ifdef CONFIG_OF_MDIO | 330 | #ifdef CONFIG_OF_MDIO |
| 289 | /* | 331 | /* |
| 290 | * Set and/or override some configuration registers based on the | 332 | * Set and/or override some configuration registers based on the |
| @@ -407,15 +449,7 @@ static int m88e1121_config_aneg(struct phy_device *phydev) | |||
| 407 | if (err < 0) | 449 | if (err < 0) |
| 408 | return err; | 450 | return err; |
| 409 | 451 | ||
| 410 | oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); | 452 | return genphy_config_aneg(phydev); |
| 411 | |||
| 412 | phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1121_PHY_LED_PAGE); | ||
| 413 | phy_write(phydev, MII_88E1121_PHY_LED_CTRL, MII_88E1121_PHY_LED_DEF); | ||
| 414 | phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); | ||
| 415 | |||
| 416 | err = genphy_config_aneg(phydev); | ||
| 417 | |||
| 418 | return err; | ||
| 419 | } | 453 | } |
| 420 | 454 | ||
| 421 | static int m88e1318_config_aneg(struct phy_device *phydev) | 455 | static int m88e1318_config_aneg(struct phy_device *phydev) |
| @@ -636,6 +670,28 @@ static int m88e1111_config_init(struct phy_device *phydev) | |||
| 636 | return phy_write(phydev, MII_BMCR, BMCR_RESET); | 670 | return phy_write(phydev, MII_BMCR, BMCR_RESET); |
| 637 | } | 671 | } |
| 638 | 672 | ||
| 673 | static int m88e1121_config_init(struct phy_device *phydev) | ||
| 674 | { | ||
| 675 | int err, oldpage; | ||
| 676 | |||
| 677 | oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); | ||
| 678 | |||
| 679 | err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1121_PHY_LED_PAGE); | ||
| 680 | if (err < 0) | ||
| 681 | return err; | ||
| 682 | |||
| 683 | /* Default PHY LED config: LED[0] .. Link, LED[1] .. Activity */ | ||
| 684 | err = phy_write(phydev, MII_88E1121_PHY_LED_CTRL, | ||
| 685 | MII_88E1121_PHY_LED_DEF); | ||
| 686 | if (err < 0) | ||
| 687 | return err; | ||
| 688 | |||
| 689 | phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); | ||
| 690 | |||
| 691 | /* Set marvell,reg-init configuration from device tree */ | ||
| 692 | return marvell_config_init(phydev); | ||
| 693 | } | ||
| 694 | |||
| 639 | static int m88e1510_config_init(struct phy_device *phydev) | 695 | static int m88e1510_config_init(struct phy_device *phydev) |
| 640 | { | 696 | { |
| 641 | int err; | 697 | int err; |
| @@ -668,7 +724,7 @@ static int m88e1510_config_init(struct phy_device *phydev) | |||
| 668 | return err; | 724 | return err; |
| 669 | } | 725 | } |
| 670 | 726 | ||
| 671 | return marvell_config_init(phydev); | 727 | return m88e1121_config_init(phydev); |
| 672 | } | 728 | } |
| 673 | 729 | ||
| 674 | static int m88e1118_config_aneg(struct phy_device *phydev) | 730 | static int m88e1118_config_aneg(struct phy_device *phydev) |
| @@ -1161,7 +1217,7 @@ static struct phy_driver marvell_drivers[] = { | |||
| 1161 | .flags = PHY_HAS_INTERRUPT, | 1217 | .flags = PHY_HAS_INTERRUPT, |
| 1162 | .probe = marvell_probe, | 1218 | .probe = marvell_probe, |
| 1163 | .config_init = &m88e1111_config_init, | 1219 | .config_init = &m88e1111_config_init, |
| 1164 | .config_aneg = &marvell_config_aneg, | 1220 | .config_aneg = &m88e1111_config_aneg, |
| 1165 | .read_status = &marvell_read_status, | 1221 | .read_status = &marvell_read_status, |
| 1166 | .ack_interrupt = &marvell_ack_interrupt, | 1222 | .ack_interrupt = &marvell_ack_interrupt, |
| 1167 | .config_intr = &marvell_config_intr, | 1223 | .config_intr = &marvell_config_intr, |
| @@ -1196,7 +1252,7 @@ static struct phy_driver marvell_drivers[] = { | |||
| 1196 | .features = PHY_GBIT_FEATURES, | 1252 | .features = PHY_GBIT_FEATURES, |
| 1197 | .flags = PHY_HAS_INTERRUPT, | 1253 | .flags = PHY_HAS_INTERRUPT, |
| 1198 | .probe = marvell_probe, | 1254 | .probe = marvell_probe, |
| 1199 | .config_init = &marvell_config_init, | 1255 | .config_init = &m88e1121_config_init, |
| 1200 | .config_aneg = &m88e1121_config_aneg, | 1256 | .config_aneg = &m88e1121_config_aneg, |
| 1201 | .read_status = &marvell_read_status, | 1257 | .read_status = &marvell_read_status, |
| 1202 | .ack_interrupt = &marvell_ack_interrupt, | 1258 | .ack_interrupt = &marvell_ack_interrupt, |
| @@ -1215,7 +1271,7 @@ static struct phy_driver marvell_drivers[] = { | |||
| 1215 | .features = PHY_GBIT_FEATURES, | 1271 | .features = PHY_GBIT_FEATURES, |
| 1216 | .flags = PHY_HAS_INTERRUPT, | 1272 | .flags = PHY_HAS_INTERRUPT, |
| 1217 | .probe = marvell_probe, | 1273 | .probe = marvell_probe, |
| 1218 | .config_init = &marvell_config_init, | 1274 | .config_init = &m88e1121_config_init, |
| 1219 | .config_aneg = &m88e1318_config_aneg, | 1275 | .config_aneg = &m88e1318_config_aneg, |
| 1220 | .read_status = &marvell_read_status, | 1276 | .read_status = &marvell_read_status, |
| 1221 | .ack_interrupt = &marvell_ack_interrupt, | 1277 | .ack_interrupt = &marvell_ack_interrupt, |
diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c index 2e21e9366f76..b62c4aaee40b 100644 --- a/drivers/net/phy/smsc.c +++ b/drivers/net/phy/smsc.c | |||
| @@ -75,22 +75,13 @@ static int smsc_phy_reset(struct phy_device *phydev) | |||
| 75 | * in all capable mode before using it. | 75 | * in all capable mode before using it. |
| 76 | */ | 76 | */ |
| 77 | if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) { | 77 | if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) { |
| 78 | int timeout = 50000; | 78 | /* set "all capable" mode */ |
| 79 | |||
| 80 | /* set "all capable" mode and reset the phy */ | ||
| 81 | rc |= MII_LAN83C185_MODE_ALL; | 79 | rc |= MII_LAN83C185_MODE_ALL; |
| 82 | phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc); | 80 | phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc); |
| 83 | phy_write(phydev, MII_BMCR, BMCR_RESET); | ||
| 84 | |||
| 85 | /* wait end of reset (max 500 ms) */ | ||
| 86 | do { | ||
| 87 | udelay(10); | ||
| 88 | if (timeout-- == 0) | ||
| 89 | return -1; | ||
| 90 | rc = phy_read(phydev, MII_BMCR); | ||
| 91 | } while (rc & BMCR_RESET); | ||
| 92 | } | 81 | } |
| 93 | return 0; | 82 | |
| 83 | /* reset the phy */ | ||
| 84 | return genphy_soft_reset(phydev); | ||
| 94 | } | 85 | } |
| 95 | 86 | ||
| 96 | static int lan911x_config_init(struct phy_device *phydev) | 87 | static int lan911x_config_init(struct phy_device *phydev) |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 2ace126533cd..fdee77207323 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
| @@ -1203,8 +1203,10 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
| 1203 | goto err_dev_open; | 1203 | goto err_dev_open; |
| 1204 | } | 1204 | } |
| 1205 | 1205 | ||
| 1206 | netif_addr_lock_bh(dev); | ||
| 1206 | dev_uc_sync_multiple(port_dev, dev); | 1207 | dev_uc_sync_multiple(port_dev, dev); |
| 1207 | dev_mc_sync_multiple(port_dev, dev); | 1208 | dev_mc_sync_multiple(port_dev, dev); |
| 1209 | netif_addr_unlock_bh(dev); | ||
| 1208 | 1210 | ||
| 1209 | err = vlan_vids_add_by_dev(port_dev, dev); | 1211 | err = vlan_vids_add_by_dev(port_dev, dev); |
| 1210 | if (err) { | 1212 | if (err) { |
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 3f9f6ed3eec4..4e257b8d8f3e 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #define NETNEXT_VERSION "08" | 31 | #define NETNEXT_VERSION "08" |
| 32 | 32 | ||
| 33 | /* Information for net */ | 33 | /* Information for net */ |
| 34 | #define NET_VERSION "3" | 34 | #define NET_VERSION "4" |
| 35 | 35 | ||
| 36 | #define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION | 36 | #define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION |
| 37 | #define DRIVER_AUTHOR "Realtek linux nic maintainers <nic_swsd@realtek.com>" | 37 | #define DRIVER_AUTHOR "Realtek linux nic maintainers <nic_swsd@realtek.com>" |
| @@ -116,6 +116,7 @@ | |||
| 116 | #define USB_TX_DMA 0xd434 | 116 | #define USB_TX_DMA 0xd434 |
| 117 | #define USB_TOLERANCE 0xd490 | 117 | #define USB_TOLERANCE 0xd490 |
| 118 | #define USB_LPM_CTRL 0xd41a | 118 | #define USB_LPM_CTRL 0xd41a |
| 119 | #define USB_BMU_RESET 0xd4b0 | ||
| 119 | #define USB_UPS_CTRL 0xd800 | 120 | #define USB_UPS_CTRL 0xd800 |
| 120 | #define USB_MISC_0 0xd81a | 121 | #define USB_MISC_0 0xd81a |
| 121 | #define USB_POWER_CUT 0xd80a | 122 | #define USB_POWER_CUT 0xd80a |
| @@ -338,6 +339,10 @@ | |||
| 338 | #define TEST_MODE_DISABLE 0x00000001 | 339 | #define TEST_MODE_DISABLE 0x00000001 |
| 339 | #define TX_SIZE_ADJUST1 0x00000100 | 340 | #define TX_SIZE_ADJUST1 0x00000100 |
| 340 | 341 | ||
| 342 | /* USB_BMU_RESET */ | ||
| 343 | #define BMU_RESET_EP_IN 0x01 | ||
| 344 | #define BMU_RESET_EP_OUT 0x02 | ||
| 345 | |||
| 341 | /* USB_UPS_CTRL */ | 346 | /* USB_UPS_CTRL */ |
| 342 | #define POWER_CUT 0x0100 | 347 | #define POWER_CUT 0x0100 |
| 343 | 348 | ||
| @@ -2169,7 +2174,7 @@ static void r8153_set_rx_early_timeout(struct r8152 *tp) | |||
| 2169 | static void r8153_set_rx_early_size(struct r8152 *tp) | 2174 | static void r8153_set_rx_early_size(struct r8152 *tp) |
| 2170 | { | 2175 | { |
| 2171 | u32 mtu = tp->netdev->mtu; | 2176 | u32 mtu = tp->netdev->mtu; |
| 2172 | u32 ocp_data = (agg_buf_sz - mtu - VLAN_ETH_HLEN - VLAN_HLEN) / 4; | 2177 | u32 ocp_data = (agg_buf_sz - mtu - VLAN_ETH_HLEN - VLAN_HLEN) / 8; |
| 2173 | 2178 | ||
| 2174 | ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data); | 2179 | ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data); |
| 2175 | } | 2180 | } |
| @@ -2456,6 +2461,17 @@ static void r8153_teredo_off(struct r8152 *tp) | |||
| 2456 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TEREDO_TIMER, 0); | 2461 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TEREDO_TIMER, 0); |
| 2457 | } | 2462 | } |
| 2458 | 2463 | ||
| 2464 | static void rtl_reset_bmu(struct r8152 *tp) | ||
| 2465 | { | ||
| 2466 | u32 ocp_data; | ||
| 2467 | |||
| 2468 | ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_BMU_RESET); | ||
| 2469 | ocp_data &= ~(BMU_RESET_EP_IN | BMU_RESET_EP_OUT); | ||
| 2470 | ocp_write_byte(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data); | ||
| 2471 | ocp_data |= BMU_RESET_EP_IN | BMU_RESET_EP_OUT; | ||
| 2472 | ocp_write_byte(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data); | ||
| 2473 | } | ||
| 2474 | |||
| 2459 | static void r8152_aldps_en(struct r8152 *tp, bool enable) | 2475 | static void r8152_aldps_en(struct r8152 *tp, bool enable) |
| 2460 | { | 2476 | { |
| 2461 | if (enable) { | 2477 | if (enable) { |
| @@ -2681,6 +2697,7 @@ static void r8153_first_init(struct r8152 *tp) | |||
| 2681 | r8153_hw_phy_cfg(tp); | 2697 | r8153_hw_phy_cfg(tp); |
| 2682 | 2698 | ||
| 2683 | rtl8152_nic_reset(tp); | 2699 | rtl8152_nic_reset(tp); |
| 2700 | rtl_reset_bmu(tp); | ||
| 2684 | 2701 | ||
| 2685 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); | 2702 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); |
| 2686 | ocp_data &= ~NOW_IS_OOB; | 2703 | ocp_data &= ~NOW_IS_OOB; |
| @@ -2742,6 +2759,7 @@ static void r8153_enter_oob(struct r8152 *tp) | |||
| 2742 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); | 2759 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); |
| 2743 | 2760 | ||
| 2744 | rtl_disable(tp); | 2761 | rtl_disable(tp); |
| 2762 | rtl_reset_bmu(tp); | ||
| 2745 | 2763 | ||
| 2746 | for (i = 0; i < 1000; i++) { | 2764 | for (i = 0; i < 1000; i++) { |
| 2747 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); | 2765 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); |
| @@ -2803,6 +2821,7 @@ static void rtl8153_disable(struct r8152 *tp) | |||
| 2803 | { | 2821 | { |
| 2804 | r8153_aldps_en(tp, false); | 2822 | r8153_aldps_en(tp, false); |
| 2805 | rtl_disable(tp); | 2823 | rtl_disable(tp); |
| 2824 | rtl_reset_bmu(tp); | ||
| 2806 | r8153_aldps_en(tp, true); | 2825 | r8153_aldps_en(tp, true); |
| 2807 | usb_enable_lpm(tp->udev); | 2826 | usb_enable_lpm(tp->udev); |
| 2808 | } | 2827 | } |
| @@ -3382,15 +3401,11 @@ static void r8153_init(struct r8152 *tp) | |||
| 3382 | r8153_power_cut_en(tp, false); | 3401 | r8153_power_cut_en(tp, false); |
| 3383 | r8153_u1u2en(tp, true); | 3402 | r8153_u1u2en(tp, true); |
| 3384 | 3403 | ||
| 3385 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ALDPS_SPDWN_RATIO); | 3404 | /* MAC clock speed down */ |
| 3386 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, EEE_SPDWN_RATIO); | 3405 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, 0); |
| 3387 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, | 3406 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, 0); |
| 3388 | PKT_AVAIL_SPDWN_EN | SUSPEND_SPDWN_EN | | 3407 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, 0); |
| 3389 | U1U2_SPDWN_EN | L1_SPDWN_EN); | 3408 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, 0); |
| 3390 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, | ||
| 3391 | PWRSAVE_SPDWN_EN | RXDV_SPDWN_EN | TX10MIDLE_EN | | ||
| 3392 | TP100_SPDWN_EN | TP500_SPDWN_EN | TP1000_SPDWN_EN | | ||
| 3393 | EEE_SPDWN_EN); | ||
| 3394 | 3409 | ||
| 3395 | r8153_enable_eee(tp); | 3410 | r8153_enable_eee(tp); |
| 3396 | r8153_aldps_en(tp, true); | 3411 | r8153_aldps_en(tp, true); |
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index dff08842f26d..8bd8c7e1ee87 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c | |||
| @@ -304,7 +304,7 @@ static int vrf_rt6_create(struct net_device *dev) | |||
| 304 | dst_hold(&rt6->dst); | 304 | dst_hold(&rt6->dst); |
| 305 | 305 | ||
| 306 | rt6->rt6i_table = rt6i_table; | 306 | rt6->rt6i_table = rt6i_table; |
| 307 | rt6->dst.output = vrf_output6; | 307 | rt6->dst.output = vrf_output6; |
| 308 | rcu_assign_pointer(vrf->rt6, rt6); | 308 | rcu_assign_pointer(vrf->rt6, rt6); |
| 309 | 309 | ||
| 310 | rc = 0; | 310 | rc = 0; |
| @@ -403,7 +403,7 @@ static int vrf_rtable_create(struct net_device *dev) | |||
| 403 | if (!rth) | 403 | if (!rth) |
| 404 | return -ENOMEM; | 404 | return -ENOMEM; |
| 405 | 405 | ||
| 406 | rth->dst.output = vrf_output; | 406 | rth->dst.output = vrf_output; |
| 407 | rth->rt_table_id = vrf->tb_id; | 407 | rth->rt_table_id = vrf->tb_id; |
| 408 | 408 | ||
| 409 | rcu_assign_pointer(vrf->rth, rth); | 409 | rcu_assign_pointer(vrf->rth, rth); |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index f999db2f97b4..b3b9db68f758 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -2952,30 +2952,6 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev, | |||
| 2952 | return 0; | 2952 | return 0; |
| 2953 | } | 2953 | } |
| 2954 | 2954 | ||
| 2955 | struct net_device *vxlan_dev_create(struct net *net, const char *name, | ||
| 2956 | u8 name_assign_type, struct vxlan_config *conf) | ||
| 2957 | { | ||
| 2958 | struct nlattr *tb[IFLA_MAX+1]; | ||
| 2959 | struct net_device *dev; | ||
| 2960 | int err; | ||
| 2961 | |||
| 2962 | memset(&tb, 0, sizeof(tb)); | ||
| 2963 | |||
| 2964 | dev = rtnl_create_link(net, name, name_assign_type, | ||
| 2965 | &vxlan_link_ops, tb); | ||
| 2966 | if (IS_ERR(dev)) | ||
| 2967 | return dev; | ||
| 2968 | |||
| 2969 | err = vxlan_dev_configure(net, dev, conf); | ||
| 2970 | if (err < 0) { | ||
| 2971 | free_netdev(dev); | ||
| 2972 | return ERR_PTR(err); | ||
| 2973 | } | ||
| 2974 | |||
| 2975 | return dev; | ||
| 2976 | } | ||
| 2977 | EXPORT_SYMBOL_GPL(vxlan_dev_create); | ||
| 2978 | |||
| 2979 | static int vxlan_newlink(struct net *src_net, struct net_device *dev, | 2955 | static int vxlan_newlink(struct net *src_net, struct net_device *dev, |
| 2980 | struct nlattr *tb[], struct nlattr *data[]) | 2956 | struct nlattr *tb[], struct nlattr *data[]) |
| 2981 | { | 2957 | { |
| @@ -3268,6 +3244,40 @@ static struct rtnl_link_ops vxlan_link_ops __read_mostly = { | |||
| 3268 | .get_link_net = vxlan_get_link_net, | 3244 | .get_link_net = vxlan_get_link_net, |
| 3269 | }; | 3245 | }; |
| 3270 | 3246 | ||
| 3247 | struct net_device *vxlan_dev_create(struct net *net, const char *name, | ||
| 3248 | u8 name_assign_type, | ||
| 3249 | struct vxlan_config *conf) | ||
| 3250 | { | ||
| 3251 | struct nlattr *tb[IFLA_MAX + 1]; | ||
| 3252 | struct net_device *dev; | ||
| 3253 | int err; | ||
| 3254 | |||
| 3255 | memset(&tb, 0, sizeof(tb)); | ||
| 3256 | |||
| 3257 | dev = rtnl_create_link(net, name, name_assign_type, | ||
| 3258 | &vxlan_link_ops, tb); | ||
| 3259 | if (IS_ERR(dev)) | ||
| 3260 | return dev; | ||
| 3261 | |||
| 3262 | err = vxlan_dev_configure(net, dev, conf); | ||
| 3263 | if (err < 0) { | ||
| 3264 | free_netdev(dev); | ||
| 3265 | return ERR_PTR(err); | ||
| 3266 | } | ||
| 3267 | |||
| 3268 | err = rtnl_configure_link(dev, NULL); | ||
| 3269 | if (err < 0) { | ||
| 3270 | LIST_HEAD(list_kill); | ||
| 3271 | |||
| 3272 | vxlan_dellink(dev, &list_kill); | ||
| 3273 | unregister_netdevice_many(&list_kill); | ||
| 3274 | return ERR_PTR(err); | ||
| 3275 | } | ||
| 3276 | |||
| 3277 | return dev; | ||
| 3278 | } | ||
| 3279 | EXPORT_SYMBOL_GPL(vxlan_dev_create); | ||
| 3280 | |||
| 3271 | static void vxlan_handle_lowerdev_unregister(struct vxlan_net *vn, | 3281 | static void vxlan_handle_lowerdev_unregister(struct vxlan_net *vn, |
| 3272 | struct net_device *dev) | 3282 | struct net_device *dev) |
| 3273 | { | 3283 | { |
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index 49af62428c88..a92a0ba829f5 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c | |||
| @@ -1083,7 +1083,7 @@ int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name, | |||
| 1083 | } | 1083 | } |
| 1084 | 1084 | ||
| 1085 | ath10k_dbg_dump(ar, ATH10K_DBG_BOOT, "features", "", | 1085 | ath10k_dbg_dump(ar, ATH10K_DBG_BOOT, "features", "", |
| 1086 | ar->running_fw->fw_file.fw_features, | 1086 | fw_file->fw_features, |
| 1087 | sizeof(fw_file->fw_features)); | 1087 | sizeof(fw_file->fw_features)); |
| 1088 | break; | 1088 | break; |
| 1089 | case ATH10K_FW_IE_FW_IMAGE: | 1089 | case ATH10K_FW_IE_FW_IMAGE: |
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c index cc979a4faeb0..813cdd2621a1 100644 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c | |||
| @@ -1904,7 +1904,6 @@ static void ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb) | |||
| 1904 | return; | 1904 | return; |
| 1905 | } | 1905 | } |
| 1906 | } | 1906 | } |
| 1907 | ath10k_htt_rx_msdu_buff_replenish(htt); | ||
| 1908 | } | 1907 | } |
| 1909 | 1908 | ||
| 1910 | static void ath10k_htt_rx_tx_fetch_resp_id_confirm(struct ath10k *ar, | 1909 | static void ath10k_htt_rx_tx_fetch_resp_id_confirm(struct ath10k *ar, |
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index 6dd1d26b357f..4040f9413e86 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c | |||
| @@ -679,10 +679,10 @@ static int ath10k_peer_create(struct ath10k *ar, | |||
| 679 | 679 | ||
| 680 | peer = ath10k_peer_find(ar, vdev_id, addr); | 680 | peer = ath10k_peer_find(ar, vdev_id, addr); |
| 681 | if (!peer) { | 681 | if (!peer) { |
| 682 | spin_unlock_bh(&ar->data_lock); | ||
| 682 | ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n", | 683 | ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n", |
| 683 | addr, vdev_id); | 684 | addr, vdev_id); |
| 684 | ath10k_wmi_peer_delete(ar, vdev_id, addr); | 685 | ath10k_wmi_peer_delete(ar, vdev_id, addr); |
| 685 | spin_unlock_bh(&ar->data_lock); | ||
| 686 | return -ENOENT; | 686 | return -ENOENT; |
| 687 | } | 687 | } |
| 688 | 688 | ||
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index 9272ca90632b..80ff69f99229 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h | |||
| @@ -1122,12 +1122,12 @@ enum { | |||
| 1122 | #define AR9300_NUM_GPIO 16 | 1122 | #define AR9300_NUM_GPIO 16 |
| 1123 | #define AR9330_NUM_GPIO 16 | 1123 | #define AR9330_NUM_GPIO 16 |
| 1124 | #define AR9340_NUM_GPIO 23 | 1124 | #define AR9340_NUM_GPIO 23 |
| 1125 | #define AR9462_NUM_GPIO 10 | 1125 | #define AR9462_NUM_GPIO 14 |
| 1126 | #define AR9485_NUM_GPIO 12 | 1126 | #define AR9485_NUM_GPIO 12 |
| 1127 | #define AR9531_NUM_GPIO 18 | 1127 | #define AR9531_NUM_GPIO 18 |
| 1128 | #define AR9550_NUM_GPIO 24 | 1128 | #define AR9550_NUM_GPIO 24 |
| 1129 | #define AR9561_NUM_GPIO 23 | 1129 | #define AR9561_NUM_GPIO 23 |
| 1130 | #define AR9565_NUM_GPIO 12 | 1130 | #define AR9565_NUM_GPIO 14 |
| 1131 | #define AR9580_NUM_GPIO 16 | 1131 | #define AR9580_NUM_GPIO 16 |
| 1132 | #define AR7010_NUM_GPIO 16 | 1132 | #define AR7010_NUM_GPIO 16 |
| 1133 | 1133 | ||
| @@ -1139,12 +1139,12 @@ enum { | |||
| 1139 | #define AR9300_GPIO_MASK 0x0000F4FF | 1139 | #define AR9300_GPIO_MASK 0x0000F4FF |
| 1140 | #define AR9330_GPIO_MASK 0x0000F4FF | 1140 | #define AR9330_GPIO_MASK 0x0000F4FF |
| 1141 | #define AR9340_GPIO_MASK 0x0000000F | 1141 | #define AR9340_GPIO_MASK 0x0000000F |
| 1142 | #define AR9462_GPIO_MASK 0x000003FF | 1142 | #define AR9462_GPIO_MASK 0x00003FFF |
| 1143 | #define AR9485_GPIO_MASK 0x00000FFF | 1143 | #define AR9485_GPIO_MASK 0x00000FFF |
| 1144 | #define AR9531_GPIO_MASK 0x0000000F | 1144 | #define AR9531_GPIO_MASK 0x0000000F |
| 1145 | #define AR9550_GPIO_MASK 0x0000000F | 1145 | #define AR9550_GPIO_MASK 0x0000000F |
| 1146 | #define AR9561_GPIO_MASK 0x0000000F | 1146 | #define AR9561_GPIO_MASK 0x0000000F |
| 1147 | #define AR9565_GPIO_MASK 0x00000FFF | 1147 | #define AR9565_GPIO_MASK 0x00003FFF |
| 1148 | #define AR9580_GPIO_MASK 0x0000F4FF | 1148 | #define AR9580_GPIO_MASK 0x0000F4FF |
| 1149 | #define AR7010_GPIO_MASK 0x0000FFFF | 1149 | #define AR7010_GPIO_MASK 0x0000FFFF |
| 1150 | 1150 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c index e5f267b21316..18a8474b5760 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |||
| @@ -3851,8 +3851,8 @@ static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx, | |||
| 3851 | if (idx != 0) | 3851 | if (idx != 0) |
| 3852 | return -ENOENT; | 3852 | return -ENOENT; |
| 3853 | 3853 | ||
| 3854 | if (fw_has_capa(&mvm->fw->ucode_capa, | 3854 | if (!fw_has_capa(&mvm->fw->ucode_capa, |
| 3855 | IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS)) | 3855 | IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS)) |
| 3856 | return -ENOENT; | 3856 | return -ENOENT; |
| 3857 | 3857 | ||
| 3858 | mutex_lock(&mvm->mutex); | 3858 | mutex_lock(&mvm->mutex); |
| @@ -3898,8 +3898,8 @@ static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw, | |||
| 3898 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | 3898 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); |
| 3899 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | 3899 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); |
| 3900 | 3900 | ||
| 3901 | if (fw_has_capa(&mvm->fw->ucode_capa, | 3901 | if (!fw_has_capa(&mvm->fw->ucode_capa, |
| 3902 | IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS)) | 3902 | IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS)) |
| 3903 | return; | 3903 | return; |
| 3904 | 3904 | ||
| 3905 | /* if beacon filtering isn't on mac80211 does it anyway */ | 3905 | /* if beacon filtering isn't on mac80211 does it anyway */ |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c index ac2c5718e454..2c61516d06ff 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |||
| @@ -581,7 +581,7 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
| 581 | struct iwl_rx_mpdu_desc *desc) | 581 | struct iwl_rx_mpdu_desc *desc) |
| 582 | { | 582 | { |
| 583 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 583 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
| 584 | struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta); | 584 | struct iwl_mvm_sta *mvm_sta; |
| 585 | struct iwl_mvm_baid_data *baid_data; | 585 | struct iwl_mvm_baid_data *baid_data; |
| 586 | struct iwl_mvm_reorder_buffer *buffer; | 586 | struct iwl_mvm_reorder_buffer *buffer; |
| 587 | struct sk_buff *tail; | 587 | struct sk_buff *tail; |
| @@ -604,6 +604,8 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
| 604 | if (WARN_ON(IS_ERR_OR_NULL(sta))) | 604 | if (WARN_ON(IS_ERR_OR_NULL(sta))) |
| 605 | return false; | 605 | return false; |
| 606 | 606 | ||
| 607 | mvm_sta = iwl_mvm_sta_from_mac80211(sta); | ||
| 608 | |||
| 607 | /* not a data packet */ | 609 | /* not a data packet */ |
| 608 | if (!ieee80211_is_data_qos(hdr->frame_control) || | 610 | if (!ieee80211_is_data_qos(hdr->frame_control) || |
| 609 | is_multicast_ether_addr(hdr->addr1)) | 611 | is_multicast_ether_addr(hdr->addr1)) |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c index 6f609dd5c222..e78fc567ff7d 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c | |||
| @@ -1222,7 +1222,7 @@ static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type) | |||
| 1222 | return -EIO; | 1222 | return -EIO; |
| 1223 | } | 1223 | } |
| 1224 | 1224 | ||
| 1225 | #define SCAN_TIMEOUT (16 * HZ) | 1225 | #define SCAN_TIMEOUT (20 * HZ) |
| 1226 | 1226 | ||
| 1227 | void iwl_mvm_scan_timeout(unsigned long data) | 1227 | void iwl_mvm_scan_timeout(unsigned long data) |
| 1228 | { | 1228 | { |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c index fea4d3437e2f..b23ab4a4504f 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | |||
| @@ -1852,12 +1852,18 @@ static struct iwl_mvm_sta *iwl_mvm_get_key_sta(struct iwl_mvm *mvm, | |||
| 1852 | mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) { | 1852 | mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) { |
| 1853 | u8 sta_id = mvmvif->ap_sta_id; | 1853 | u8 sta_id = mvmvif->ap_sta_id; |
| 1854 | 1854 | ||
| 1855 | sta = rcu_dereference_check(mvm->fw_id_to_mac_id[sta_id], | ||
| 1856 | lockdep_is_held(&mvm->mutex)); | ||
| 1857 | |||
| 1855 | /* | 1858 | /* |
| 1856 | * It is possible that the 'sta' parameter is NULL, | 1859 | * It is possible that the 'sta' parameter is NULL, |
| 1857 | * for example when a GTK is removed - the sta_id will then | 1860 | * for example when a GTK is removed - the sta_id will then |
| 1858 | * be the AP ID, and no station was passed by mac80211. | 1861 | * be the AP ID, and no station was passed by mac80211. |
| 1859 | */ | 1862 | */ |
| 1860 | return iwl_mvm_sta_from_staid_protected(mvm, sta_id); | 1863 | if (IS_ERR_OR_NULL(sta)) |
| 1864 | return NULL; | ||
| 1865 | |||
| 1866 | return iwl_mvm_sta_from_mac80211(sta); | ||
| 1861 | } | 1867 | } |
| 1862 | 1868 | ||
| 1863 | return NULL; | 1869 | return NULL; |
| @@ -1955,6 +1961,14 @@ static int iwl_mvm_send_sta_igtk(struct iwl_mvm *mvm, | |||
| 1955 | struct ieee80211_key_seq seq; | 1961 | struct ieee80211_key_seq seq; |
| 1956 | const u8 *pn; | 1962 | const u8 *pn; |
| 1957 | 1963 | ||
| 1964 | switch (keyconf->cipher) { | ||
| 1965 | case WLAN_CIPHER_SUITE_AES_CMAC: | ||
| 1966 | igtk_cmd.ctrl_flags |= cpu_to_le32(STA_KEY_FLG_CCM); | ||
| 1967 | break; | ||
| 1968 | default: | ||
| 1969 | return -EINVAL; | ||
| 1970 | } | ||
| 1971 | |||
| 1958 | memcpy(igtk_cmd.IGTK, keyconf->key, keyconf->keylen); | 1972 | memcpy(igtk_cmd.IGTK, keyconf->key, keyconf->keylen); |
| 1959 | ieee80211_get_key_rx_seq(keyconf, 0, &seq); | 1973 | ieee80211_get_key_rx_seq(keyconf, 0, &seq); |
| 1960 | pn = seq.aes_cmac.pn; | 1974 | pn = seq.aes_cmac.pn; |
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c index fe19ace0d6a0..b04cf30f3959 100644 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c | |||
| @@ -1149,7 +1149,7 @@ static void rtl8192eu_phy_iqcalibrate(struct rtl8xxxu_priv *priv, | |||
| 1149 | 1149 | ||
| 1150 | for (i = 0; i < retry; i++) { | 1150 | for (i = 0; i < retry; i++) { |
| 1151 | path_b_ok = rtl8192eu_rx_iqk_path_b(priv); | 1151 | path_b_ok = rtl8192eu_rx_iqk_path_b(priv); |
| 1152 | if (path_a_ok == 0x03) { | 1152 | if (path_b_ok == 0x03) { |
| 1153 | val32 = rtl8xxxu_read32(priv, | 1153 | val32 = rtl8xxxu_read32(priv, |
| 1154 | REG_RX_POWER_BEFORE_IQK_B_2); | 1154 | REG_RX_POWER_BEFORE_IQK_B_2); |
| 1155 | result[t][6] = (val32 >> 16) & 0x3ff; | 1155 | result[t][6] = (val32 >> 16) & 0x3ff; |
diff --git a/drivers/pci/vc.c b/drivers/pci/vc.c index dfbab61a1b47..1fa3a3219c45 100644 --- a/drivers/pci/vc.c +++ b/drivers/pci/vc.c | |||
| @@ -221,9 +221,9 @@ static int pci_vc_do_save_buffer(struct pci_dev *dev, int pos, | |||
| 221 | else | 221 | else |
| 222 | pci_write_config_word(dev, pos + PCI_VC_PORT_CTRL, | 222 | pci_write_config_word(dev, pos + PCI_VC_PORT_CTRL, |
| 223 | *(u16 *)buf); | 223 | *(u16 *)buf); |
| 224 | buf += 2; | 224 | buf += 4; |
| 225 | } | 225 | } |
| 226 | len += 2; | 226 | len += 4; |
| 227 | 227 | ||
| 228 | /* | 228 | /* |
| 229 | * If we have any Low Priority VCs and a VC Arbitration Table Offset | 229 | * If we have any Low Priority VCs and a VC Arbitration Table Offset |
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index e4bc1151e04f..42a5c1dddfef 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile | |||
| @@ -23,7 +23,7 @@ obj-$(CONFIG_PINCTRL_PISTACHIO) += pinctrl-pistachio.o | |||
| 23 | obj-$(CONFIG_PINCTRL_ROCKCHIP) += pinctrl-rockchip.o | 23 | obj-$(CONFIG_PINCTRL_ROCKCHIP) += pinctrl-rockchip.o |
| 24 | obj-$(CONFIG_PINCTRL_SINGLE) += pinctrl-single.o | 24 | obj-$(CONFIG_PINCTRL_SINGLE) += pinctrl-single.o |
| 25 | obj-$(CONFIG_PINCTRL_SIRF) += sirf/ | 25 | obj-$(CONFIG_PINCTRL_SIRF) += sirf/ |
| 26 | obj-$(CONFIG_PINCTRL_TEGRA) += tegra/ | 26 | obj-$(CONFIG_ARCH_TEGRA) += tegra/ |
| 27 | obj-$(CONFIG_PINCTRL_TZ1090) += pinctrl-tz1090.o | 27 | obj-$(CONFIG_PINCTRL_TZ1090) += pinctrl-tz1090.o |
| 28 | obj-$(CONFIG_PINCTRL_TZ1090_PDC) += pinctrl-tz1090-pdc.o | 28 | obj-$(CONFIG_PINCTRL_TZ1090_PDC) += pinctrl-tz1090-pdc.o |
| 29 | obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o | 29 | obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o |
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index 47ccfcc8a647..eccb47480e1d 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c | |||
| @@ -209,9 +209,9 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 209 | pin_reg = &info->pin_regs[pin_id]; | 209 | pin_reg = &info->pin_regs[pin_id]; |
| 210 | 210 | ||
| 211 | if (pin_reg->mux_reg == -1) { | 211 | if (pin_reg->mux_reg == -1) { |
| 212 | dev_err(ipctl->dev, "Pin(%s) does not support mux function\n", | 212 | dev_dbg(ipctl->dev, "Pin(%s) does not support mux function\n", |
| 213 | info->pins[pin_id].name); | 213 | info->pins[pin_id].name); |
| 214 | return -EINVAL; | 214 | continue; |
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | if (info->flags & SHARE_MUX_CONF_REG) { | 217 | if (info->flags & SHARE_MUX_CONF_REG) { |
diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c index 677a811b3a6f..7abfd42e8ffd 100644 --- a/drivers/pinctrl/intel/pinctrl-baytrail.c +++ b/drivers/pinctrl/intel/pinctrl-baytrail.c | |||
| @@ -401,9 +401,9 @@ static const struct byt_simple_func_mux byt_score_sata_mux[] = { | |||
| 401 | static const unsigned int byt_score_plt_clk0_pins[] = { 96 }; | 401 | static const unsigned int byt_score_plt_clk0_pins[] = { 96 }; |
| 402 | static const unsigned int byt_score_plt_clk1_pins[] = { 97 }; | 402 | static const unsigned int byt_score_plt_clk1_pins[] = { 97 }; |
| 403 | static const unsigned int byt_score_plt_clk2_pins[] = { 98 }; | 403 | static const unsigned int byt_score_plt_clk2_pins[] = { 98 }; |
| 404 | static const unsigned int byt_score_plt_clk4_pins[] = { 99 }; | 404 | static const unsigned int byt_score_plt_clk3_pins[] = { 99 }; |
| 405 | static const unsigned int byt_score_plt_clk5_pins[] = { 100 }; | 405 | static const unsigned int byt_score_plt_clk4_pins[] = { 100 }; |
| 406 | static const unsigned int byt_score_plt_clk3_pins[] = { 101 }; | 406 | static const unsigned int byt_score_plt_clk5_pins[] = { 101 }; |
| 407 | static const struct byt_simple_func_mux byt_score_plt_clk_mux[] = { | 407 | static const struct byt_simple_func_mux byt_score_plt_clk_mux[] = { |
| 408 | SIMPLE_FUNC("plt_clk", 1), | 408 | SIMPLE_FUNC("plt_clk", 1), |
| 409 | }; | 409 | }; |
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index cf9bafa10acf..bfdf720db270 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c | |||
| @@ -1580,6 +1580,9 @@ static inline void pcs_irq_set(struct pcs_soc_data *pcs_soc, | |||
| 1580 | else | 1580 | else |
| 1581 | mask &= ~soc_mask; | 1581 | mask &= ~soc_mask; |
| 1582 | pcs->write(mask, pcswi->reg); | 1582 | pcs->write(mask, pcswi->reg); |
| 1583 | |||
| 1584 | /* flush posted write */ | ||
| 1585 | mask = pcs->read(pcswi->reg); | ||
| 1583 | raw_spin_unlock(&pcs->lock); | 1586 | raw_spin_unlock(&pcs->lock); |
| 1584 | } | 1587 | } |
| 1585 | 1588 | ||
diff --git a/drivers/pinctrl/tegra/Makefile b/drivers/pinctrl/tegra/Makefile index a927379b6794..d9ea2be69cc4 100644 --- a/drivers/pinctrl/tegra/Makefile +++ b/drivers/pinctrl/tegra/Makefile | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | obj-y += pinctrl-tegra.o | 1 | obj-$(CONFIG_PINCTRL_TEGRA) += pinctrl-tegra.o |
| 2 | obj-$(CONFIG_PINCTRL_TEGRA20) += pinctrl-tegra20.o | 2 | obj-$(CONFIG_PINCTRL_TEGRA20) += pinctrl-tegra20.o |
| 3 | obj-$(CONFIG_PINCTRL_TEGRA30) += pinctrl-tegra30.o | 3 | obj-$(CONFIG_PINCTRL_TEGRA30) += pinctrl-tegra30.o |
| 4 | obj-$(CONFIG_PINCTRL_TEGRA114) += pinctrl-tegra114.o | 4 | obj-$(CONFIG_PINCTRL_TEGRA114) += pinctrl-tegra114.o |
diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index 456987c88baa..b13cd074c52a 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c | |||
| @@ -565,11 +565,12 @@ static int power_supply_read_temp(struct thermal_zone_device *tzd, | |||
| 565 | 565 | ||
| 566 | WARN_ON(tzd == NULL); | 566 | WARN_ON(tzd == NULL); |
| 567 | psy = tzd->devdata; | 567 | psy = tzd->devdata; |
| 568 | ret = psy->desc->get_property(psy, POWER_SUPPLY_PROP_TEMP, &val); | 568 | ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_TEMP, &val); |
| 569 | if (ret) | ||
| 570 | return ret; | ||
| 569 | 571 | ||
| 570 | /* Convert tenths of degree Celsius to milli degree Celsius. */ | 572 | /* Convert tenths of degree Celsius to milli degree Celsius. */ |
| 571 | if (!ret) | 573 | *temp = val.intval * 100; |
| 572 | *temp = val.intval * 100; | ||
| 573 | 574 | ||
| 574 | return ret; | 575 | return ret; |
| 575 | } | 576 | } |
| @@ -612,10 +613,12 @@ static int ps_get_max_charge_cntl_limit(struct thermal_cooling_device *tcd, | |||
| 612 | int ret; | 613 | int ret; |
| 613 | 614 | ||
| 614 | psy = tcd->devdata; | 615 | psy = tcd->devdata; |
| 615 | ret = psy->desc->get_property(psy, | 616 | ret = power_supply_get_property(psy, |
| 616 | POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, &val); | 617 | POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, &val); |
| 617 | if (!ret) | 618 | if (ret) |
| 618 | *state = val.intval; | 619 | return ret; |
| 620 | |||
| 621 | *state = val.intval; | ||
| 619 | 622 | ||
| 620 | return ret; | 623 | return ret; |
| 621 | } | 624 | } |
| @@ -628,10 +631,12 @@ static int ps_get_cur_chrage_cntl_limit(struct thermal_cooling_device *tcd, | |||
| 628 | int ret; | 631 | int ret; |
| 629 | 632 | ||
| 630 | psy = tcd->devdata; | 633 | psy = tcd->devdata; |
| 631 | ret = psy->desc->get_property(psy, | 634 | ret = power_supply_get_property(psy, |
| 632 | POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, &val); | 635 | POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, &val); |
| 633 | if (!ret) | 636 | if (ret) |
| 634 | *state = val.intval; | 637 | return ret; |
| 638 | |||
| 639 | *state = val.intval; | ||
| 635 | 640 | ||
| 636 | return ret; | 641 | return ret; |
| 637 | } | 642 | } |
diff --git a/drivers/power/tps65217_charger.c b/drivers/power/tps65217_charger.c index d9f56730c735..73dfae41def8 100644 --- a/drivers/power/tps65217_charger.c +++ b/drivers/power/tps65217_charger.c | |||
| @@ -197,6 +197,7 @@ static int tps65217_charger_probe(struct platform_device *pdev) | |||
| 197 | { | 197 | { |
| 198 | struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent); | 198 | struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent); |
| 199 | struct tps65217_charger *charger; | 199 | struct tps65217_charger *charger; |
| 200 | struct power_supply_config cfg = {}; | ||
| 200 | int ret; | 201 | int ret; |
| 201 | 202 | ||
| 202 | dev_dbg(&pdev->dev, "%s\n", __func__); | 203 | dev_dbg(&pdev->dev, "%s\n", __func__); |
| @@ -208,9 +209,12 @@ static int tps65217_charger_probe(struct platform_device *pdev) | |||
| 208 | charger->tps = tps; | 209 | charger->tps = tps; |
| 209 | charger->dev = &pdev->dev; | 210 | charger->dev = &pdev->dev; |
| 210 | 211 | ||
| 212 | cfg.of_node = pdev->dev.of_node; | ||
| 213 | cfg.drv_data = charger; | ||
| 214 | |||
| 211 | charger->ac = devm_power_supply_register(&pdev->dev, | 215 | charger->ac = devm_power_supply_register(&pdev->dev, |
| 212 | &tps65217_charger_desc, | 216 | &tps65217_charger_desc, |
| 213 | NULL); | 217 | &cfg); |
| 214 | if (IS_ERR(charger->ac)) { | 218 | if (IS_ERR(charger->ac)) { |
| 215 | dev_err(&pdev->dev, "failed: power supply register\n"); | 219 | dev_err(&pdev->dev, "failed: power supply register\n"); |
| 216 | return PTR_ERR(charger->ac); | 220 | return PTR_ERR(charger->ac); |
diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c index d4c285688ce9..3ddc85e6efd6 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c | |||
| @@ -1122,7 +1122,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, | |||
| 1122 | } else { | 1122 | } else { |
| 1123 | struct scsi_cmnd *SCp; | 1123 | struct scsi_cmnd *SCp; |
| 1124 | 1124 | ||
| 1125 | SCp = scsi_host_find_tag(SDp->host, SCSI_NO_TAG); | 1125 | SCp = SDp->current_cmnd; |
| 1126 | if(unlikely(SCp == NULL)) { | 1126 | if(unlikely(SCp == NULL)) { |
| 1127 | sdev_printk(KERN_ERR, SDp, | 1127 | sdev_printk(KERN_ERR, SDp, |
| 1128 | "no saved request for untagged cmd\n"); | 1128 | "no saved request for untagged cmd\n"); |
| @@ -1826,7 +1826,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *) | |||
| 1826 | slot->tag, slot); | 1826 | slot->tag, slot); |
| 1827 | } else { | 1827 | } else { |
| 1828 | slot->tag = SCSI_NO_TAG; | 1828 | slot->tag = SCSI_NO_TAG; |
| 1829 | /* must populate current_cmnd for scsi_host_find_tag to work */ | 1829 | /* save current command for reselection */ |
| 1830 | SCp->device->current_cmnd = SCp; | 1830 | SCp->device->current_cmnd = SCp; |
| 1831 | } | 1831 | } |
| 1832 | /* sanity check: some of the commands generated by the mid-layer | 1832 | /* sanity check: some of the commands generated by the mid-layer |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index a8b610eaa0ca..106a6adbd6f1 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
| @@ -1128,7 +1128,6 @@ static int scsi_eh_action(struct scsi_cmnd *scmd, int rtn) | |||
| 1128 | */ | 1128 | */ |
| 1129 | void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q) | 1129 | void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q) |
| 1130 | { | 1130 | { |
| 1131 | scmd->device->host->host_failed--; | ||
| 1132 | scmd->eh_eflags = 0; | 1131 | scmd->eh_eflags = 0; |
| 1133 | list_move_tail(&scmd->eh_entry, done_q); | 1132 | list_move_tail(&scmd->eh_entry, done_q); |
| 1134 | } | 1133 | } |
| @@ -2227,6 +2226,9 @@ int scsi_error_handler(void *data) | |||
| 2227 | else | 2226 | else |
| 2228 | scsi_unjam_host(shost); | 2227 | scsi_unjam_host(shost); |
| 2229 | 2228 | ||
| 2229 | /* All scmds have been handled */ | ||
| 2230 | shost->host_failed = 0; | ||
| 2231 | |||
| 2230 | /* | 2232 | /* |
| 2231 | * Note - if the above fails completely, the action is to take | 2233 | * Note - if the above fails completely, the action is to take |
| 2232 | * individual devices offline and flush the queue of any | 2234 | * individual devices offline and flush the queue of any |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index d46839f51e73..e4db19e88ab1 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
| @@ -151,8 +151,6 @@ static DECLARE_WAIT_QUEUE_HEAD(balloon_wq); | |||
| 151 | static void balloon_process(struct work_struct *work); | 151 | static void balloon_process(struct work_struct *work); |
| 152 | static DECLARE_DELAYED_WORK(balloon_worker, balloon_process); | 152 | static DECLARE_DELAYED_WORK(balloon_worker, balloon_process); |
| 153 | 153 | ||
| 154 | static void release_memory_resource(struct resource *resource); | ||
| 155 | |||
| 156 | /* When ballooning out (allocating memory to return to Xen) we don't really | 154 | /* When ballooning out (allocating memory to return to Xen) we don't really |
| 157 | want the kernel to try too hard since that can trigger the oom killer. */ | 155 | want the kernel to try too hard since that can trigger the oom killer. */ |
| 158 | #define GFP_BALLOON \ | 156 | #define GFP_BALLOON \ |
| @@ -248,6 +246,19 @@ static enum bp_state update_schedule(enum bp_state state) | |||
| 248 | } | 246 | } |
| 249 | 247 | ||
| 250 | #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG | 248 | #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG |
| 249 | static void release_memory_resource(struct resource *resource) | ||
| 250 | { | ||
| 251 | if (!resource) | ||
| 252 | return; | ||
| 253 | |||
| 254 | /* | ||
| 255 | * No need to reset region to identity mapped since we now | ||
| 256 | * know that no I/O can be in this region | ||
| 257 | */ | ||
| 258 | release_resource(resource); | ||
| 259 | kfree(resource); | ||
| 260 | } | ||
| 261 | |||
| 251 | static struct resource *additional_memory_resource(phys_addr_t size) | 262 | static struct resource *additional_memory_resource(phys_addr_t size) |
| 252 | { | 263 | { |
| 253 | struct resource *res; | 264 | struct resource *res; |
| @@ -286,19 +297,6 @@ static struct resource *additional_memory_resource(phys_addr_t size) | |||
| 286 | return res; | 297 | return res; |
| 287 | } | 298 | } |
| 288 | 299 | ||
| 289 | static void release_memory_resource(struct resource *resource) | ||
| 290 | { | ||
| 291 | if (!resource) | ||
| 292 | return; | ||
| 293 | |||
| 294 | /* | ||
| 295 | * No need to reset region to identity mapped since we now | ||
| 296 | * know that no I/O can be in this region | ||
| 297 | */ | ||
| 298 | release_resource(resource); | ||
| 299 | kfree(resource); | ||
| 300 | } | ||
| 301 | |||
| 302 | static enum bp_state reserve_additional_memory(void) | 300 | static enum bp_state reserve_additional_memory(void) |
| 303 | { | 301 | { |
| 304 | long credit; | 302 | long credit; |
diff --git a/drivers/xen/xen-pciback/conf_space.c b/drivers/xen/xen-pciback/conf_space.c index 8e67336f8ddd..6a25533da237 100644 --- a/drivers/xen/xen-pciback/conf_space.c +++ b/drivers/xen/xen-pciback/conf_space.c | |||
| @@ -183,8 +183,7 @@ int xen_pcibk_config_read(struct pci_dev *dev, int offset, int size, | |||
| 183 | field_start = OFFSET(cfg_entry); | 183 | field_start = OFFSET(cfg_entry); |
| 184 | field_end = OFFSET(cfg_entry) + field->size; | 184 | field_end = OFFSET(cfg_entry) + field->size; |
| 185 | 185 | ||
| 186 | if ((req_start >= field_start && req_start < field_end) | 186 | if (req_end > field_start && field_end > req_start) { |
| 187 | || (req_end > field_start && req_end <= field_end)) { | ||
| 188 | err = conf_space_read(dev, cfg_entry, field_start, | 187 | err = conf_space_read(dev, cfg_entry, field_start, |
| 189 | &tmp_val); | 188 | &tmp_val); |
| 190 | if (err) | 189 | if (err) |
| @@ -230,8 +229,7 @@ int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value) | |||
| 230 | field_start = OFFSET(cfg_entry); | 229 | field_start = OFFSET(cfg_entry); |
| 231 | field_end = OFFSET(cfg_entry) + field->size; | 230 | field_end = OFFSET(cfg_entry) + field->size; |
| 232 | 231 | ||
| 233 | if ((req_start >= field_start && req_start < field_end) | 232 | if (req_end > field_start && field_end > req_start) { |
| 234 | || (req_end > field_start && req_end <= field_end)) { | ||
| 235 | tmp_val = 0; | 233 | tmp_val = 0; |
| 236 | 234 | ||
| 237 | err = xen_pcibk_config_read(dev, field_start, | 235 | err = xen_pcibk_config_read(dev, field_start, |
diff --git a/drivers/xen/xen-pciback/conf_space_header.c b/drivers/xen/xen-pciback/conf_space_header.c index ad3d17d29c81..9ead1c2ff1dd 100644 --- a/drivers/xen/xen-pciback/conf_space_header.c +++ b/drivers/xen/xen-pciback/conf_space_header.c | |||
| @@ -145,7 +145,7 @@ static int rom_write(struct pci_dev *dev, int offset, u32 value, void *data) | |||
| 145 | /* A write to obtain the length must happen as a 32-bit write. | 145 | /* A write to obtain the length must happen as a 32-bit write. |
| 146 | * This does not (yet) support writing individual bytes | 146 | * This does not (yet) support writing individual bytes |
| 147 | */ | 147 | */ |
| 148 | if (value == ~PCI_ROM_ADDRESS_ENABLE) | 148 | if ((value | ~PCI_ROM_ADDRESS_MASK) == ~0U) |
| 149 | bar->which = 1; | 149 | bar->which = 1; |
| 150 | else { | 150 | else { |
| 151 | u32 tmpval; | 151 | u32 tmpval; |
| @@ -225,38 +225,42 @@ static inline void read_dev_bar(struct pci_dev *dev, | |||
| 225 | (PCI_BASE_ADDRESS_SPACE_MEMORY | | 225 | (PCI_BASE_ADDRESS_SPACE_MEMORY | |
| 226 | PCI_BASE_ADDRESS_MEM_TYPE_64))) { | 226 | PCI_BASE_ADDRESS_MEM_TYPE_64))) { |
| 227 | bar_info->val = res[pos - 1].start >> 32; | 227 | bar_info->val = res[pos - 1].start >> 32; |
| 228 | bar_info->len_val = res[pos - 1].end >> 32; | 228 | bar_info->len_val = -resource_size(&res[pos - 1]) >> 32; |
| 229 | return; | 229 | return; |
| 230 | } | 230 | } |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | if (!res[pos].flags || | ||
| 234 | (res[pos].flags & (IORESOURCE_DISABLED | IORESOURCE_UNSET | | ||
| 235 | IORESOURCE_BUSY))) | ||
| 236 | return; | ||
| 237 | |||
| 233 | bar_info->val = res[pos].start | | 238 | bar_info->val = res[pos].start | |
| 234 | (res[pos].flags & PCI_REGION_FLAG_MASK); | 239 | (res[pos].flags & PCI_REGION_FLAG_MASK); |
| 235 | bar_info->len_val = resource_size(&res[pos]); | 240 | bar_info->len_val = -resource_size(&res[pos]) | |
| 241 | (res[pos].flags & PCI_REGION_FLAG_MASK); | ||
| 236 | } | 242 | } |
| 237 | 243 | ||
| 238 | static void *bar_init(struct pci_dev *dev, int offset) | 244 | static void *bar_init(struct pci_dev *dev, int offset) |
| 239 | { | 245 | { |
| 240 | struct pci_bar_info *bar = kmalloc(sizeof(*bar), GFP_KERNEL); | 246 | struct pci_bar_info *bar = kzalloc(sizeof(*bar), GFP_KERNEL); |
| 241 | 247 | ||
| 242 | if (!bar) | 248 | if (!bar) |
| 243 | return ERR_PTR(-ENOMEM); | 249 | return ERR_PTR(-ENOMEM); |
| 244 | 250 | ||
| 245 | read_dev_bar(dev, bar, offset, ~0); | 251 | read_dev_bar(dev, bar, offset, ~0); |
| 246 | bar->which = 0; | ||
| 247 | 252 | ||
| 248 | return bar; | 253 | return bar; |
| 249 | } | 254 | } |
| 250 | 255 | ||
| 251 | static void *rom_init(struct pci_dev *dev, int offset) | 256 | static void *rom_init(struct pci_dev *dev, int offset) |
| 252 | { | 257 | { |
| 253 | struct pci_bar_info *bar = kmalloc(sizeof(*bar), GFP_KERNEL); | 258 | struct pci_bar_info *bar = kzalloc(sizeof(*bar), GFP_KERNEL); |
| 254 | 259 | ||
| 255 | if (!bar) | 260 | if (!bar) |
| 256 | return ERR_PTR(-ENOMEM); | 261 | return ERR_PTR(-ENOMEM); |
| 257 | 262 | ||
| 258 | read_dev_bar(dev, bar, offset, ~PCI_ROM_ADDRESS_ENABLE); | 263 | read_dev_bar(dev, bar, offset, ~PCI_ROM_ADDRESS_ENABLE); |
| 259 | bar->which = 0; | ||
| 260 | 264 | ||
| 261 | return bar; | 265 | return bar; |
| 262 | } | 266 | } |
