Annotation of /trunk/kernel-alx/patches-3.4/0125-3.4.26-all-fixes.patch
Parent Directory | Revision Log
Revision 2110 -
(hide annotations)
(download)
Tue Mar 12 12:15:23 2013 UTC (11 years, 6 months ago) by niro
File size: 228079 byte(s)
Tue Mar 12 12:15:23 2013 UTC (11 years, 6 months ago) by niro
File size: 228079 byte(s)
-sync with upstream
1 | niro | 2110 | diff --git a/Documentation/ABI/testing/sysfs-bus-rbd b/Documentation/ABI/testing/sysfs-bus-rbd |
2 | index dbedafb..eb781c6 100644 | ||
3 | --- a/Documentation/ABI/testing/sysfs-bus-rbd | ||
4 | +++ b/Documentation/ABI/testing/sysfs-bus-rbd | ||
5 | @@ -51,12 +51,6 @@ current_snap | ||
6 | |||
7 | The current snapshot for which the device is mapped. | ||
8 | |||
9 | -create_snap | ||
10 | - | ||
11 | - Create a snapshot: | ||
12 | - | ||
13 | - $ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_create | ||
14 | - | ||
15 | snap_* | ||
16 | |||
17 | A directory per each snapshot | ||
18 | diff --git a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | ||
19 | index a658672..b4eb3da 100644 | ||
20 | --- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | ||
21 | +++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | ||
22 | @@ -462,6 +462,9 @@ | ||
23 | GPIO76_LCD_PCLK, \ | ||
24 | GPIO77_LCD_BIAS | ||
25 | |||
26 | +/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */ | ||
27 | +#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT) | ||
28 | +#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT) | ||
29 | |||
30 | extern int keypad_set_wake(unsigned int on); | ||
31 | #endif /* __ASM_ARCH_MFP_PXA27X_H */ | ||
32 | diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c | ||
33 | index 4726c24..a2fe795 100644 | ||
34 | --- a/arch/arm/mach-pxa/pxa27x.c | ||
35 | +++ b/arch/arm/mach-pxa/pxa27x.c | ||
36 | @@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void) | ||
37 | EXPORT_SYMBOL(pxa27x_clear_otgph); | ||
38 | |||
39 | static unsigned long ac97_reset_config[] = { | ||
40 | - GPIO113_GPIO, | ||
41 | + GPIO113_AC97_nRESET_GPIO_HIGH, | ||
42 | GPIO113_AC97_nRESET, | ||
43 | - GPIO95_GPIO, | ||
44 | + GPIO95_AC97_nRESET_GPIO_HIGH, | ||
45 | GPIO95_AC97_nRESET, | ||
46 | }; | ||
47 | |||
48 | diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c | ||
49 | index e9a5fd7..69b17a9 100644 | ||
50 | --- a/arch/mips/kernel/process.c | ||
51 | +++ b/arch/mips/kernel/process.c | ||
52 | @@ -72,9 +72,7 @@ void __noreturn cpu_idle(void) | ||
53 | } | ||
54 | } | ||
55 | #ifdef CONFIG_HOTPLUG_CPU | ||
56 | - if (!cpu_online(cpu) && !cpu_isset(cpu, cpu_callin_map) && | ||
57 | - (system_state == SYSTEM_RUNNING || | ||
58 | - system_state == SYSTEM_BOOTING)) | ||
59 | + if (!cpu_online(cpu) && !cpu_isset(cpu, cpu_callin_map)) | ||
60 | play_dead(); | ||
61 | #endif | ||
62 | rcu_idle_exit(); | ||
63 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S | ||
64 | index 58bddee..9e07bd0 100644 | ||
65 | --- a/arch/powerpc/kernel/head_64.S | ||
66 | +++ b/arch/powerpc/kernel/head_64.S | ||
67 | @@ -422,7 +422,7 @@ _STATIC(__after_prom_start) | ||
68 | tovirt(r6,r6) /* on booke, we already run at PAGE_OFFSET */ | ||
69 | #endif | ||
70 | |||
71 | -#ifdef CONFIG_CRASH_DUMP | ||
72 | +#ifdef CONFIG_RELOCATABLE | ||
73 | /* | ||
74 | * Check if the kernel has to be running as relocatable kernel based on the | ||
75 | * variable __run_at_load, if it is set the kernel is treated as relocatable | ||
76 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c | ||
77 | index 730e69c..e7dba0b 100644 | ||
78 | --- a/arch/powerpc/kernel/time.c | ||
79 | +++ b/arch/powerpc/kernel/time.c | ||
80 | @@ -749,13 +749,8 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm, | ||
81 | |||
82 | void update_vsyscall_tz(void) | ||
83 | { | ||
84 | - /* Make userspace gettimeofday spin until we're done. */ | ||
85 | - ++vdso_data->tb_update_count; | ||
86 | - smp_mb(); | ||
87 | vdso_data->tz_minuteswest = sys_tz.tz_minuteswest; | ||
88 | vdso_data->tz_dsttime = sys_tz.tz_dsttime; | ||
89 | - smp_mb(); | ||
90 | - ++vdso_data->tb_update_count; | ||
91 | } | ||
92 | |||
93 | static void __init clocksource_init(void) | ||
94 | diff --git a/arch/powerpc/kvm/44x_emulate.c b/arch/powerpc/kvm/44x_emulate.c | ||
95 | index 549bb2c..ded8a1a 100644 | ||
96 | --- a/arch/powerpc/kvm/44x_emulate.c | ||
97 | +++ b/arch/powerpc/kvm/44x_emulate.c | ||
98 | @@ -79,6 +79,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
99 | run->dcr.dcrn = dcrn; | ||
100 | run->dcr.data = 0; | ||
101 | run->dcr.is_write = 0; | ||
102 | + vcpu->arch.dcr_is_write = 0; | ||
103 | vcpu->arch.io_gpr = rt; | ||
104 | vcpu->arch.dcr_needed = 1; | ||
105 | kvmppc_account_exit(vcpu, DCR_EXITS); | ||
106 | @@ -100,6 +101,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
107 | run->dcr.dcrn = dcrn; | ||
108 | run->dcr.data = kvmppc_get_gpr(vcpu, rs); | ||
109 | run->dcr.is_write = 1; | ||
110 | + vcpu->arch.dcr_is_write = 1; | ||
111 | vcpu->arch.dcr_needed = 1; | ||
112 | kvmppc_account_exit(vcpu, DCR_EXITS); | ||
113 | emulated = EMULATE_DO_DCR; | ||
114 | diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c | ||
115 | index 9761206..f0eee75 100644 | ||
116 | --- a/arch/powerpc/platforms/40x/ppc40x_simple.c | ||
117 | +++ b/arch/powerpc/platforms/40x/ppc40x_simple.c | ||
118 | @@ -57,7 +57,8 @@ static const char *board[] __initdata = { | ||
119 | "amcc,makalu", | ||
120 | "apm,klondike", | ||
121 | "est,hotfoot", | ||
122 | - "plathome,obs600" | ||
123 | + "plathome,obs600", | ||
124 | + NULL | ||
125 | }; | ||
126 | |||
127 | static int __init ppc40x_probe(void) | ||
128 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c | ||
129 | index 6b4976b..a9c8a46 100644 | ||
130 | --- a/arch/x86/kernel/cpu/amd.c | ||
131 | +++ b/arch/x86/kernel/cpu/amd.c | ||
132 | @@ -612,6 +612,20 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | ||
133 | } | ||
134 | } | ||
135 | |||
136 | + /* | ||
137 | + * The way access filter has a performance penalty on some workloads. | ||
138 | + * Disable it on the affected CPUs. | ||
139 | + */ | ||
140 | + if ((c->x86 == 0x15) && | ||
141 | + (c->x86_model >= 0x02) && (c->x86_model < 0x20)) { | ||
142 | + u64 val; | ||
143 | + | ||
144 | + if (!rdmsrl_safe(0xc0011021, &val) && !(val & 0x1E)) { | ||
145 | + val |= 0x1E; | ||
146 | + checking_wrmsrl(0xc0011021, val); | ||
147 | + } | ||
148 | + } | ||
149 | + | ||
150 | cpu_detect_cache_sizes(c); | ||
151 | |||
152 | /* Multi core CPU? */ | ||
153 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c | ||
154 | index bd3199c..619a2e4 100644 | ||
155 | --- a/drivers/acpi/scan.c | ||
156 | +++ b/drivers/acpi/scan.c | ||
157 | @@ -789,8 +789,8 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, | ||
158 | static void acpi_bus_set_run_wake_flags(struct acpi_device *device) | ||
159 | { | ||
160 | struct acpi_device_id button_device_ids[] = { | ||
161 | - {"PNP0C0D", 0}, | ||
162 | {"PNP0C0C", 0}, | ||
163 | + {"PNP0C0D", 0}, | ||
164 | {"PNP0C0E", 0}, | ||
165 | {"", 0}, | ||
166 | }; | ||
167 | @@ -802,6 +802,11 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device) | ||
168 | /* Power button, Lid switch always enable wakeup */ | ||
169 | if (!acpi_match_device_ids(device, button_device_ids)) { | ||
170 | device->wakeup.flags.run_wake = 1; | ||
171 | + if (!acpi_match_device_ids(device, &button_device_ids[1])) { | ||
172 | + /* Do not use Lid/sleep button for S5 wakeup */ | ||
173 | + if (device->wakeup.sleep_state == ACPI_STATE_S5) | ||
174 | + device->wakeup.sleep_state = ACPI_STATE_S4; | ||
175 | + } | ||
176 | device_set_wakeup_capable(&device->dev, true); | ||
177 | return; | ||
178 | } | ||
179 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
180 | index cf4837f..4b4caa3 100644 | ||
181 | --- a/drivers/ata/libata-core.c | ||
182 | +++ b/drivers/ata/libata-core.c | ||
183 | @@ -2536,6 +2536,7 @@ int ata_bus_probe(struct ata_port *ap) | ||
184 | * bus as we may be talking too fast. | ||
185 | */ | ||
186 | dev->pio_mode = XFER_PIO_0; | ||
187 | + dev->dma_mode = 0xff; | ||
188 | |||
189 | /* If the controller has a pio mode setup function | ||
190 | * then use it to set the chipset to rights. Don't | ||
191 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c | ||
192 | index d1fbd59..e47c224 100644 | ||
193 | --- a/drivers/ata/libata-eh.c | ||
194 | +++ b/drivers/ata/libata-eh.c | ||
195 | @@ -2600,6 +2600,7 @@ int ata_eh_reset(struct ata_link *link, int classify, | ||
196 | * bus as we may be talking too fast. | ||
197 | */ | ||
198 | dev->pio_mode = XFER_PIO_0; | ||
199 | + dev->dma_mode = 0xff; | ||
200 | |||
201 | /* If the controller has a pio mode setup function | ||
202 | * then use it to set the chipset to rights. Don't | ||
203 | diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c | ||
204 | index 2222635..15863a4 100644 | ||
205 | --- a/drivers/ata/libata-scsi.c | ||
206 | +++ b/drivers/ata/libata-scsi.c | ||
207 | @@ -309,7 +309,8 @@ ata_scsi_activity_show(struct device *dev, struct device_attribute *attr, | ||
208 | struct ata_port *ap = ata_shost_to_port(sdev->host); | ||
209 | struct ata_device *atadev = ata_scsi_find_dev(ap, sdev); | ||
210 | |||
211 | - if (ap->ops->sw_activity_show && (ap->flags & ATA_FLAG_SW_ACTIVITY)) | ||
212 | + if (atadev && ap->ops->sw_activity_show && | ||
213 | + (ap->flags & ATA_FLAG_SW_ACTIVITY)) | ||
214 | return ap->ops->sw_activity_show(atadev, buf); | ||
215 | return -EINVAL; | ||
216 | } | ||
217 | @@ -324,7 +325,8 @@ ata_scsi_activity_store(struct device *dev, struct device_attribute *attr, | ||
218 | enum sw_activity val; | ||
219 | int rc; | ||
220 | |||
221 | - if (ap->ops->sw_activity_store && (ap->flags & ATA_FLAG_SW_ACTIVITY)) { | ||
222 | + if (atadev && ap->ops->sw_activity_store && | ||
223 | + (ap->flags & ATA_FLAG_SW_ACTIVITY)) { | ||
224 | val = simple_strtoul(buf, NULL, 0); | ||
225 | switch (val) { | ||
226 | case OFF: case BLINK_ON: case BLINK_OFF: | ||
227 | diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c | ||
228 | index 000fcc9..ef6e328 100644 | ||
229 | --- a/drivers/ata/sata_promise.c | ||
230 | +++ b/drivers/ata/sata_promise.c | ||
231 | @@ -147,6 +147,10 @@ struct pdc_port_priv { | ||
232 | dma_addr_t pkt_dma; | ||
233 | }; | ||
234 | |||
235 | +struct pdc_host_priv { | ||
236 | + spinlock_t hard_reset_lock; | ||
237 | +}; | ||
238 | + | ||
239 | static int pdc_sata_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | ||
240 | static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | ||
241 | static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | ||
242 | @@ -801,9 +805,10 @@ static void pdc_hard_reset_port(struct ata_port *ap) | ||
243 | void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR]; | ||
244 | void __iomem *pcictl_b1_mmio = host_mmio + PDC_PCI_CTL + 1; | ||
245 | unsigned int ata_no = pdc_ata_port_to_ata_no(ap); | ||
246 | + struct pdc_host_priv *hpriv = ap->host->private_data; | ||
247 | u8 tmp; | ||
248 | |||
249 | - spin_lock(&ap->host->lock); | ||
250 | + spin_lock(&hpriv->hard_reset_lock); | ||
251 | |||
252 | tmp = readb(pcictl_b1_mmio); | ||
253 | tmp &= ~(0x10 << ata_no); | ||
254 | @@ -814,7 +819,7 @@ static void pdc_hard_reset_port(struct ata_port *ap) | ||
255 | writeb(tmp, pcictl_b1_mmio); | ||
256 | readb(pcictl_b1_mmio); /* flush */ | ||
257 | |||
258 | - spin_unlock(&ap->host->lock); | ||
259 | + spin_unlock(&hpriv->hard_reset_lock); | ||
260 | } | ||
261 | |||
262 | static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class, | ||
263 | @@ -1182,6 +1187,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev, | ||
264 | const struct ata_port_info *pi = &pdc_port_info[ent->driver_data]; | ||
265 | const struct ata_port_info *ppi[PDC_MAX_PORTS]; | ||
266 | struct ata_host *host; | ||
267 | + struct pdc_host_priv *hpriv; | ||
268 | void __iomem *host_mmio; | ||
269 | int n_ports, i, rc; | ||
270 | int is_sataii_tx4; | ||
271 | @@ -1218,6 +1224,11 @@ static int pdc_ata_init_one(struct pci_dev *pdev, | ||
272 | dev_err(&pdev->dev, "failed to allocate host\n"); | ||
273 | return -ENOMEM; | ||
274 | } | ||
275 | + hpriv = devm_kzalloc(&pdev->dev, sizeof *hpriv, GFP_KERNEL); | ||
276 | + if (!hpriv) | ||
277 | + return -ENOMEM; | ||
278 | + spin_lock_init(&hpriv->hard_reset_lock); | ||
279 | + host->private_data = hpriv; | ||
280 | host->iomap = pcim_iomap_table(pdev); | ||
281 | |||
282 | is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags); | ||
283 | diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c | ||
284 | index 251eb70..8ab1eab 100644 | ||
285 | --- a/drivers/base/regmap/regmap-debugfs.c | ||
286 | +++ b/drivers/base/regmap/regmap-debugfs.c | ||
287 | @@ -90,7 +90,7 @@ static ssize_t regmap_map_read_file(struct file *file, char __user *user_buf, | ||
288 | /* If we're in the region the user is trying to read */ | ||
289 | if (p >= *ppos) { | ||
290 | /* ...but not beyond it */ | ||
291 | - if (buf_pos >= count - 1 - tot_len) | ||
292 | + if (buf_pos + 1 + tot_len >= count) | ||
293 | break; | ||
294 | |||
295 | /* Format the register */ | ||
296 | diff --git a/drivers/bcma/driver_mips.c b/drivers/bcma/driver_mips.c | ||
297 | index c3e9dff..041fddf 100644 | ||
298 | --- a/drivers/bcma/driver_mips.c | ||
299 | +++ b/drivers/bcma/driver_mips.c | ||
300 | @@ -115,7 +115,7 @@ static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq) | ||
301 | bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) & | ||
302 | ~(1 << irqflag)); | ||
303 | else | ||
304 | - bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 0); | ||
305 | + bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(oldirq), 0); | ||
306 | |||
307 | /* assign the new one */ | ||
308 | if (irq == 0) { | ||
309 | diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h | ||
310 | index db195ab..e49ddd0 100644 | ||
311 | --- a/drivers/block/aoe/aoe.h | ||
312 | +++ b/drivers/block/aoe/aoe.h | ||
313 | @@ -1,5 +1,5 @@ | ||
314 | /* Copyright (c) 2007 Coraid, Inc. See COPYING for GPL terms. */ | ||
315 | -#define VERSION "47" | ||
316 | +#define VERSION "47q" | ||
317 | #define AOE_MAJOR 152 | ||
318 | #define DEVICE_NAME "aoe" | ||
319 | |||
320 | diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c | ||
321 | index 321de7b..7eca463 100644 | ||
322 | --- a/drivers/block/aoe/aoeblk.c | ||
323 | +++ b/drivers/block/aoe/aoeblk.c | ||
324 | @@ -276,8 +276,6 @@ aoeblk_gdalloc(void *vp) | ||
325 | goto err_mempool; | ||
326 | blk_queue_make_request(d->blkq, aoeblk_make_request); | ||
327 | d->blkq->backing_dev_info.name = "aoe"; | ||
328 | - if (bdi_init(&d->blkq->backing_dev_info)) | ||
329 | - goto err_blkq; | ||
330 | spin_lock_irqsave(&d->lock, flags); | ||
331 | gd->major = AOE_MAJOR; | ||
332 | gd->first_minor = d->sysminor * AOE_PARTITIONS; | ||
333 | @@ -298,9 +296,6 @@ aoeblk_gdalloc(void *vp) | ||
334 | aoedisk_add_sysfs(d); | ||
335 | return; | ||
336 | |||
337 | -err_blkq: | ||
338 | - blk_cleanup_queue(d->blkq); | ||
339 | - d->blkq = NULL; | ||
340 | err_mempool: | ||
341 | mempool_destroy(d->bufpool); | ||
342 | err_disk: | ||
343 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c | ||
344 | index 7b33136..cba3d02 100644 | ||
345 | --- a/drivers/block/rbd.c | ||
346 | +++ b/drivers/block/rbd.c | ||
347 | @@ -71,7 +71,7 @@ | ||
348 | #define DEV_NAME_LEN 32 | ||
349 | #define MAX_INT_FORMAT_WIDTH ((5 * sizeof (int)) / 2 + 1) | ||
350 | |||
351 | -#define RBD_NOTIFY_TIMEOUT_DEFAULT 10 | ||
352 | +#define RBD_READ_ONLY_DEFAULT false | ||
353 | |||
354 | /* | ||
355 | * block device image metadata (in-memory version) | ||
356 | @@ -94,7 +94,7 @@ struct rbd_image_header { | ||
357 | }; | ||
358 | |||
359 | struct rbd_options { | ||
360 | - int notify_timeout; | ||
361 | + bool read_only; | ||
362 | }; | ||
363 | |||
364 | /* | ||
365 | @@ -174,9 +174,13 @@ struct rbd_device { | ||
366 | |||
367 | /* protects updating the header */ | ||
368 | struct rw_semaphore header_rwsem; | ||
369 | + /* name of the snapshot this device reads from */ | ||
370 | char snap_name[RBD_MAX_SNAP_NAME_LEN]; | ||
371 | + /* id of the snapshot this device reads from */ | ||
372 | u64 snap_id; /* current snapshot id */ | ||
373 | - int read_only; | ||
374 | + /* whether the snap_id this device reads from still exists */ | ||
375 | + bool snap_exists; | ||
376 | + bool read_only; | ||
377 | |||
378 | struct list_head node; | ||
379 | |||
380 | @@ -185,6 +189,7 @@ struct rbd_device { | ||
381 | |||
382 | /* sysfs related */ | ||
383 | struct device dev; | ||
384 | + unsigned long open_count; | ||
385 | }; | ||
386 | |||
387 | static DEFINE_MUTEX(ctl_mutex); /* Serialize open/close/setup/teardown */ | ||
388 | @@ -197,10 +202,6 @@ static DEFINE_SPINLOCK(rbd_client_list_lock); | ||
389 | |||
390 | static int __rbd_init_snaps_header(struct rbd_device *rbd_dev); | ||
391 | static void rbd_dev_release(struct device *dev); | ||
392 | -static ssize_t rbd_snap_add(struct device *dev, | ||
393 | - struct device_attribute *attr, | ||
394 | - const char *buf, | ||
395 | - size_t count); | ||
396 | static void __rbd_remove_snap_dev(struct rbd_device *rbd_dev, | ||
397 | struct rbd_snap *snap); | ||
398 | |||
399 | @@ -246,13 +247,15 @@ static int rbd_open(struct block_device *bdev, fmode_t mode) | ||
400 | { | ||
401 | struct rbd_device *rbd_dev = bdev->bd_disk->private_data; | ||
402 | |||
403 | - rbd_get_dev(rbd_dev); | ||
404 | - | ||
405 | - set_device_ro(bdev, rbd_dev->read_only); | ||
406 | - | ||
407 | if ((mode & FMODE_WRITE) && rbd_dev->read_only) | ||
408 | return -EROFS; | ||
409 | |||
410 | + mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); | ||
411 | + rbd_get_dev(rbd_dev); | ||
412 | + set_device_ro(bdev, rbd_dev->read_only); | ||
413 | + rbd_dev->open_count++; | ||
414 | + mutex_unlock(&ctl_mutex); | ||
415 | + | ||
416 | return 0; | ||
417 | } | ||
418 | |||
419 | @@ -260,7 +263,11 @@ static int rbd_release(struct gendisk *disk, fmode_t mode) | ||
420 | { | ||
421 | struct rbd_device *rbd_dev = disk->private_data; | ||
422 | |||
423 | + mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); | ||
424 | + BUG_ON(!rbd_dev->open_count); | ||
425 | + rbd_dev->open_count--; | ||
426 | rbd_put_dev(rbd_dev); | ||
427 | + mutex_unlock(&ctl_mutex); | ||
428 | |||
429 | return 0; | ||
430 | } | ||
431 | @@ -342,17 +349,24 @@ static struct rbd_client *__rbd_client_find(struct ceph_options *opt) | ||
432 | * mount options | ||
433 | */ | ||
434 | enum { | ||
435 | - Opt_notify_timeout, | ||
436 | Opt_last_int, | ||
437 | /* int args above */ | ||
438 | Opt_last_string, | ||
439 | /* string args above */ | ||
440 | + Opt_read_only, | ||
441 | + Opt_read_write, | ||
442 | + /* Boolean args above */ | ||
443 | + Opt_last_bool, | ||
444 | }; | ||
445 | |||
446 | static match_table_t rbdopt_tokens = { | ||
447 | - {Opt_notify_timeout, "notify_timeout=%d"}, | ||
448 | /* int args above */ | ||
449 | /* string args above */ | ||
450 | + {Opt_read_only, "read_only"}, | ||
451 | + {Opt_read_only, "ro"}, /* Alternate spelling */ | ||
452 | + {Opt_read_write, "read_write"}, | ||
453 | + {Opt_read_write, "rw"}, /* Alternate spelling */ | ||
454 | + /* Boolean args above */ | ||
455 | {-1, NULL} | ||
456 | }; | ||
457 | |||
458 | @@ -377,13 +391,18 @@ static int parse_rbd_opts_token(char *c, void *private) | ||
459 | } else if (token > Opt_last_int && token < Opt_last_string) { | ||
460 | dout("got string token %d val %s\n", token, | ||
461 | argstr[0].from); | ||
462 | + } else if (token > Opt_last_string && token < Opt_last_bool) { | ||
463 | + dout("got Boolean token %d\n", token); | ||
464 | } else { | ||
465 | dout("got token %d\n", token); | ||
466 | } | ||
467 | |||
468 | switch (token) { | ||
469 | - case Opt_notify_timeout: | ||
470 | - rbdopt->notify_timeout = intval; | ||
471 | + case Opt_read_only: | ||
472 | + rbdopt->read_only = true; | ||
473 | + break; | ||
474 | + case Opt_read_write: | ||
475 | + rbdopt->read_only = false; | ||
476 | break; | ||
477 | default: | ||
478 | BUG_ON(token); | ||
479 | @@ -407,7 +426,7 @@ static struct rbd_client *rbd_get_client(const char *mon_addr, | ||
480 | if (!rbd_opts) | ||
481 | return ERR_PTR(-ENOMEM); | ||
482 | |||
483 | - rbd_opts->notify_timeout = RBD_NOTIFY_TIMEOUT_DEFAULT; | ||
484 | + rbd_opts->read_only = RBD_READ_ONLY_DEFAULT; | ||
485 | |||
486 | opt = ceph_parse_options(options, mon_addr, | ||
487 | mon_addr + mon_addr_len, | ||
488 | @@ -590,7 +609,8 @@ static int rbd_header_set_snap(struct rbd_device *dev, u64 *size) | ||
489 | else | ||
490 | snapc->seq = 0; | ||
491 | dev->snap_id = CEPH_NOSNAP; | ||
492 | - dev->read_only = 0; | ||
493 | + dev->snap_exists = false; | ||
494 | + dev->read_only = dev->rbd_client->rbd_opts->read_only; | ||
495 | if (size) | ||
496 | *size = header->image_size; | ||
497 | } else { | ||
498 | @@ -598,7 +618,8 @@ static int rbd_header_set_snap(struct rbd_device *dev, u64 *size) | ||
499 | if (ret < 0) | ||
500 | goto done; | ||
501 | dev->snap_id = snapc->seq; | ||
502 | - dev->read_only = 1; | ||
503 | + dev->snap_exists = true; | ||
504 | + dev->read_only = true; /* No choice for snapshots */ | ||
505 | } | ||
506 | |||
507 | ret = 0; | ||
508 | @@ -609,7 +630,7 @@ done: | ||
509 | |||
510 | static void rbd_header_free(struct rbd_image_header *header) | ||
511 | { | ||
512 | - kfree(header->snapc); | ||
513 | + ceph_put_snap_context(header->snapc); | ||
514 | kfree(header->snap_names); | ||
515 | kfree(header->snap_sizes); | ||
516 | } | ||
517 | @@ -887,13 +908,10 @@ static int rbd_do_request(struct request *rq, | ||
518 | |||
519 | dout("rbd_do_request obj=%s ofs=%lld len=%lld\n", obj, len, ofs); | ||
520 | |||
521 | - down_read(&dev->header_rwsem); | ||
522 | - | ||
523 | osdc = &dev->rbd_client->client->osdc; | ||
524 | req = ceph_osdc_alloc_request(osdc, flags, snapc, ops, | ||
525 | false, GFP_NOIO, pages, bio); | ||
526 | if (!req) { | ||
527 | - up_read(&dev->header_rwsem); | ||
528 | ret = -ENOMEM; | ||
529 | goto done_pages; | ||
530 | } | ||
531 | @@ -920,15 +938,15 @@ static int rbd_do_request(struct request *rq, | ||
532 | layout->fl_object_size = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER); | ||
533 | layout->fl_pg_preferred = cpu_to_le32(-1); | ||
534 | layout->fl_pg_pool = cpu_to_le32(dev->poolid); | ||
535 | - ceph_calc_raw_layout(osdc, layout, snapid, ofs, &len, &bno, | ||
536 | - req, ops); | ||
537 | + ret = ceph_calc_raw_layout(osdc, layout, snapid, ofs, &len, &bno, | ||
538 | + req, ops); | ||
539 | + BUG_ON(ret != 0); | ||
540 | |||
541 | ceph_osdc_build_request(req, ofs, &len, | ||
542 | ops, | ||
543 | snapc, | ||
544 | &mtime, | ||
545 | req->r_oid, req->r_oid_len); | ||
546 | - up_read(&dev->header_rwsem); | ||
547 | |||
548 | if (linger_req) { | ||
549 | ceph_osdc_set_request_linger(osdc, req); | ||
550 | @@ -1193,7 +1211,7 @@ static int rbd_req_sync_notify_ack(struct rbd_device *dev, | ||
551 | if (ret < 0) | ||
552 | return ret; | ||
553 | |||
554 | - ops[0].watch.ver = cpu_to_le64(dev->header.obj_version); | ||
555 | + ops[0].watch.ver = cpu_to_le64(ver); | ||
556 | ops[0].watch.cookie = notify_id; | ||
557 | ops[0].watch.flag = 0; | ||
558 | |||
559 | @@ -1213,6 +1231,7 @@ static int rbd_req_sync_notify_ack(struct rbd_device *dev, | ||
560 | static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data) | ||
561 | { | ||
562 | struct rbd_device *dev = (struct rbd_device *)data; | ||
563 | + u64 hver; | ||
564 | int rc; | ||
565 | |||
566 | if (!dev) | ||
567 | @@ -1222,12 +1241,13 @@ static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data) | ||
568 | notify_id, (int)opcode); | ||
569 | mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); | ||
570 | rc = __rbd_update_snaps(dev); | ||
571 | + hver = dev->header.obj_version; | ||
572 | mutex_unlock(&ctl_mutex); | ||
573 | if (rc) | ||
574 | pr_warning(RBD_DRV_NAME "%d got notification but failed to " | ||
575 | " update snaps: %d\n", dev->major, rc); | ||
576 | |||
577 | - rbd_req_sync_notify_ack(dev, ver, notify_id, dev->obj_md_name); | ||
578 | + rbd_req_sync_notify_ack(dev, hver, notify_id, dev->obj_md_name); | ||
579 | } | ||
580 | |||
581 | /* | ||
582 | @@ -1304,71 +1324,7 @@ static int rbd_req_sync_unwatch(struct rbd_device *dev, | ||
583 | return ret; | ||
584 | } | ||
585 | |||
586 | -struct rbd_notify_info { | ||
587 | - struct rbd_device *dev; | ||
588 | -}; | ||
589 | - | ||
590 | -static void rbd_notify_cb(u64 ver, u64 notify_id, u8 opcode, void *data) | ||
591 | -{ | ||
592 | - struct rbd_device *dev = (struct rbd_device *)data; | ||
593 | - if (!dev) | ||
594 | - return; | ||
595 | - | ||
596 | - dout("rbd_notify_cb %s notify_id=%lld opcode=%d\n", dev->obj_md_name, | ||
597 | - notify_id, (int)opcode); | ||
598 | -} | ||
599 | - | ||
600 | -/* | ||
601 | - * Request sync osd notify | ||
602 | - */ | ||
603 | -static int rbd_req_sync_notify(struct rbd_device *dev, | ||
604 | - const char *obj) | ||
605 | -{ | ||
606 | - struct ceph_osd_req_op *ops; | ||
607 | - struct ceph_osd_client *osdc = &dev->rbd_client->client->osdc; | ||
608 | - struct ceph_osd_event *event; | ||
609 | - struct rbd_notify_info info; | ||
610 | - int payload_len = sizeof(u32) + sizeof(u32); | ||
611 | - int ret; | ||
612 | - | ||
613 | - ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_NOTIFY, payload_len); | ||
614 | - if (ret < 0) | ||
615 | - return ret; | ||
616 | - | ||
617 | - info.dev = dev; | ||
618 | - | ||
619 | - ret = ceph_osdc_create_event(osdc, rbd_notify_cb, 1, | ||
620 | - (void *)&info, &event); | ||
621 | - if (ret < 0) | ||
622 | - goto fail; | ||
623 | - | ||
624 | - ops[0].watch.ver = 1; | ||
625 | - ops[0].watch.flag = 1; | ||
626 | - ops[0].watch.cookie = event->cookie; | ||
627 | - ops[0].watch.prot_ver = RADOS_NOTIFY_VER; | ||
628 | - ops[0].watch.timeout = 12; | ||
629 | - | ||
630 | - ret = rbd_req_sync_op(dev, NULL, | ||
631 | - CEPH_NOSNAP, | ||
632 | - 0, | ||
633 | - CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK, | ||
634 | - ops, | ||
635 | - 1, obj, 0, 0, NULL, NULL, NULL); | ||
636 | - if (ret < 0) | ||
637 | - goto fail_event; | ||
638 | - | ||
639 | - ret = ceph_osdc_wait_event(event, CEPH_OSD_TIMEOUT_DEFAULT); | ||
640 | - dout("ceph_osdc_wait_event returned %d\n", ret); | ||
641 | - rbd_destroy_ops(ops); | ||
642 | - return 0; | ||
643 | - | ||
644 | -fail_event: | ||
645 | - ceph_osdc_cancel_event(event); | ||
646 | -fail: | ||
647 | - rbd_destroy_ops(ops); | ||
648 | - return ret; | ||
649 | -} | ||
650 | - | ||
651 | +#if 0 | ||
652 | /* | ||
653 | * Request sync osd read | ||
654 | */ | ||
655 | @@ -1408,6 +1364,7 @@ static int rbd_req_sync_exec(struct rbd_device *dev, | ||
656 | dout("cls_exec returned %d\n", ret); | ||
657 | return ret; | ||
658 | } | ||
659 | +#endif | ||
660 | |||
661 | static struct rbd_req_coll *rbd_alloc_coll(int num_reqs) | ||
662 | { | ||
663 | @@ -1440,6 +1397,7 @@ static void rbd_rq_fn(struct request_queue *q) | ||
664 | u64 ofs; | ||
665 | int num_segs, cur_seg = 0; | ||
666 | struct rbd_req_coll *coll; | ||
667 | + struct ceph_snap_context *snapc; | ||
668 | |||
669 | /* peek at request from block layer */ | ||
670 | if (!rq) | ||
671 | @@ -1466,6 +1424,20 @@ static void rbd_rq_fn(struct request_queue *q) | ||
672 | |||
673 | spin_unlock_irq(q->queue_lock); | ||
674 | |||
675 | + down_read(&rbd_dev->header_rwsem); | ||
676 | + | ||
677 | + if (rbd_dev->snap_id != CEPH_NOSNAP && !rbd_dev->snap_exists) { | ||
678 | + up_read(&rbd_dev->header_rwsem); | ||
679 | + dout("request for non-existent snapshot"); | ||
680 | + spin_lock_irq(q->queue_lock); | ||
681 | + __blk_end_request_all(rq, -ENXIO); | ||
682 | + continue; | ||
683 | + } | ||
684 | + | ||
685 | + snapc = ceph_get_snap_context(rbd_dev->header.snapc); | ||
686 | + | ||
687 | + up_read(&rbd_dev->header_rwsem); | ||
688 | + | ||
689 | dout("%s 0x%x bytes at 0x%llx\n", | ||
690 | do_write ? "write" : "read", | ||
691 | size, blk_rq_pos(rq) * SECTOR_SIZE); | ||
692 | @@ -1475,6 +1447,7 @@ static void rbd_rq_fn(struct request_queue *q) | ||
693 | if (!coll) { | ||
694 | spin_lock_irq(q->queue_lock); | ||
695 | __blk_end_request_all(rq, -ENOMEM); | ||
696 | + ceph_put_snap_context(snapc); | ||
697 | continue; | ||
698 | } | ||
699 | |||
700 | @@ -1498,7 +1471,7 @@ static void rbd_rq_fn(struct request_queue *q) | ||
701 | /* init OSD command: write or read */ | ||
702 | if (do_write) | ||
703 | rbd_req_write(rq, rbd_dev, | ||
704 | - rbd_dev->header.snapc, | ||
705 | + snapc, | ||
706 | ofs, | ||
707 | op_size, bio, | ||
708 | coll, cur_seg); | ||
709 | @@ -1521,6 +1494,8 @@ next_seg: | ||
710 | if (bp) | ||
711 | bio_pair_release(bp); | ||
712 | spin_lock_irq(q->queue_lock); | ||
713 | + | ||
714 | + ceph_put_snap_context(snapc); | ||
715 | } | ||
716 | } | ||
717 | |||
718 | @@ -1624,57 +1599,6 @@ out_dh: | ||
719 | return rc; | ||
720 | } | ||
721 | |||
722 | -/* | ||
723 | - * create a snapshot | ||
724 | - */ | ||
725 | -static int rbd_header_add_snap(struct rbd_device *dev, | ||
726 | - const char *snap_name, | ||
727 | - gfp_t gfp_flags) | ||
728 | -{ | ||
729 | - int name_len = strlen(snap_name); | ||
730 | - u64 new_snapid; | ||
731 | - int ret; | ||
732 | - void *data, *p, *e; | ||
733 | - u64 ver; | ||
734 | - struct ceph_mon_client *monc; | ||
735 | - | ||
736 | - /* we should create a snapshot only if we're pointing at the head */ | ||
737 | - if (dev->snap_id != CEPH_NOSNAP) | ||
738 | - return -EINVAL; | ||
739 | - | ||
740 | - monc = &dev->rbd_client->client->monc; | ||
741 | - ret = ceph_monc_create_snapid(monc, dev->poolid, &new_snapid); | ||
742 | - dout("created snapid=%lld\n", new_snapid); | ||
743 | - if (ret < 0) | ||
744 | - return ret; | ||
745 | - | ||
746 | - data = kmalloc(name_len + 16, gfp_flags); | ||
747 | - if (!data) | ||
748 | - return -ENOMEM; | ||
749 | - | ||
750 | - p = data; | ||
751 | - e = data + name_len + 16; | ||
752 | - | ||
753 | - ceph_encode_string_safe(&p, e, snap_name, name_len, bad); | ||
754 | - ceph_encode_64_safe(&p, e, new_snapid, bad); | ||
755 | - | ||
756 | - ret = rbd_req_sync_exec(dev, dev->obj_md_name, "rbd", "snap_add", | ||
757 | - data, p - data, &ver); | ||
758 | - | ||
759 | - kfree(data); | ||
760 | - | ||
761 | - if (ret < 0) | ||
762 | - return ret; | ||
763 | - | ||
764 | - down_write(&dev->header_rwsem); | ||
765 | - dev->header.snapc->seq = new_snapid; | ||
766 | - up_write(&dev->header_rwsem); | ||
767 | - | ||
768 | - return 0; | ||
769 | -bad: | ||
770 | - return -ERANGE; | ||
771 | -} | ||
772 | - | ||
773 | static void __rbd_remove_all_snaps(struct rbd_device *rbd_dev) | ||
774 | { | ||
775 | struct rbd_snap *snap; | ||
776 | @@ -1699,10 +1623,15 @@ static int __rbd_update_snaps(struct rbd_device *rbd_dev) | ||
777 | if (ret < 0) | ||
778 | return ret; | ||
779 | |||
780 | + down_write(&rbd_dev->header_rwsem); | ||
781 | + | ||
782 | /* resized? */ | ||
783 | - set_capacity(rbd_dev->disk, h.image_size / SECTOR_SIZE); | ||
784 | + if (rbd_dev->snap_id == CEPH_NOSNAP) { | ||
785 | + sector_t size = (sector_t) h.image_size / SECTOR_SIZE; | ||
786 | |||
787 | - down_write(&rbd_dev->header_rwsem); | ||
788 | + dout("setting size to %llu sectors", (unsigned long long) size); | ||
789 | + set_capacity(rbd_dev->disk, size); | ||
790 | + } | ||
791 | |||
792 | snap_seq = rbd_dev->header.snapc->seq; | ||
793 | if (rbd_dev->header.total_snaps && | ||
794 | @@ -1711,10 +1640,12 @@ static int __rbd_update_snaps(struct rbd_device *rbd_dev) | ||
795 | if head moves */ | ||
796 | follow_seq = 1; | ||
797 | |||
798 | - kfree(rbd_dev->header.snapc); | ||
799 | + ceph_put_snap_context(rbd_dev->header.snapc); | ||
800 | kfree(rbd_dev->header.snap_names); | ||
801 | kfree(rbd_dev->header.snap_sizes); | ||
802 | |||
803 | + rbd_dev->header.obj_version = h.obj_version; | ||
804 | + rbd_dev->header.image_size = h.image_size; | ||
805 | rbd_dev->header.total_snaps = h.total_snaps; | ||
806 | rbd_dev->header.snapc = h.snapc; | ||
807 | rbd_dev->header.snap_names = h.snap_names; | ||
808 | @@ -1818,8 +1749,13 @@ static ssize_t rbd_size_show(struct device *dev, | ||
809 | struct device_attribute *attr, char *buf) | ||
810 | { | ||
811 | struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); | ||
812 | + sector_t size; | ||
813 | + | ||
814 | + down_read(&rbd_dev->header_rwsem); | ||
815 | + size = get_capacity(rbd_dev->disk); | ||
816 | + up_read(&rbd_dev->header_rwsem); | ||
817 | |||
818 | - return sprintf(buf, "%llu\n", (unsigned long long)rbd_dev->header.image_size); | ||
819 | + return sprintf(buf, "%llu\n", (unsigned long long) size * SECTOR_SIZE); | ||
820 | } | ||
821 | |||
822 | static ssize_t rbd_major_show(struct device *dev, | ||
823 | @@ -1890,7 +1826,6 @@ static DEVICE_ATTR(pool, S_IRUGO, rbd_pool_show, NULL); | ||
824 | static DEVICE_ATTR(name, S_IRUGO, rbd_name_show, NULL); | ||
825 | static DEVICE_ATTR(refresh, S_IWUSR, NULL, rbd_image_refresh); | ||
826 | static DEVICE_ATTR(current_snap, S_IRUGO, rbd_snap_show, NULL); | ||
827 | -static DEVICE_ATTR(create_snap, S_IWUSR, NULL, rbd_snap_add); | ||
828 | |||
829 | static struct attribute *rbd_attrs[] = { | ||
830 | &dev_attr_size.attr, | ||
831 | @@ -1900,7 +1835,6 @@ static struct attribute *rbd_attrs[] = { | ||
832 | &dev_attr_name.attr, | ||
833 | &dev_attr_current_snap.attr, | ||
834 | &dev_attr_refresh.attr, | ||
835 | - &dev_attr_create_snap.attr, | ||
836 | NULL | ||
837 | }; | ||
838 | |||
839 | @@ -2069,7 +2003,14 @@ static int __rbd_init_snaps_header(struct rbd_device *rbd_dev) | ||
840 | cur_id = rbd_dev->header.snapc->snaps[i - 1]; | ||
841 | |||
842 | if (!i || old_snap->id < cur_id) { | ||
843 | - /* old_snap->id was skipped, thus was removed */ | ||
844 | + /* | ||
845 | + * old_snap->id was skipped, thus was | ||
846 | + * removed. If this rbd_dev is mapped to | ||
847 | + * the removed snapshot, record that it no | ||
848 | + * longer exists, to prevent further I/O. | ||
849 | + */ | ||
850 | + if (rbd_dev->snap_id == old_snap->id) | ||
851 | + rbd_dev->snap_exists = false; | ||
852 | __rbd_remove_snap_dev(rbd_dev, old_snap); | ||
853 | continue; | ||
854 | } | ||
855 | @@ -2217,8 +2158,8 @@ static void rbd_id_put(struct rbd_device *rbd_dev) | ||
856 | struct rbd_device *rbd_dev; | ||
857 | |||
858 | rbd_dev = list_entry(tmp, struct rbd_device, node); | ||
859 | - if (rbd_id > max_id) | ||
860 | - max_id = rbd_id; | ||
861 | + if (rbd_dev->id > max_id) | ||
862 | + max_id = rbd_dev->id; | ||
863 | } | ||
864 | spin_unlock(&rbd_dev_list_lock); | ||
865 | |||
866 | @@ -2515,6 +2456,11 @@ static ssize_t rbd_remove(struct bus_type *bus, | ||
867 | goto done; | ||
868 | } | ||
869 | |||
870 | + if (rbd_dev->open_count) { | ||
871 | + ret = -EBUSY; | ||
872 | + goto done; | ||
873 | + } | ||
874 | + | ||
875 | __rbd_remove_all_snaps(rbd_dev); | ||
876 | rbd_bus_del_dev(rbd_dev); | ||
877 | |||
878 | @@ -2523,47 +2469,6 @@ done: | ||
879 | return ret; | ||
880 | } | ||
881 | |||
882 | -static ssize_t rbd_snap_add(struct device *dev, | ||
883 | - struct device_attribute *attr, | ||
884 | - const char *buf, | ||
885 | - size_t count) | ||
886 | -{ | ||
887 | - struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); | ||
888 | - int ret; | ||
889 | - char *name = kmalloc(count + 1, GFP_KERNEL); | ||
890 | - if (!name) | ||
891 | - return -ENOMEM; | ||
892 | - | ||
893 | - snprintf(name, count, "%s", buf); | ||
894 | - | ||
895 | - mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); | ||
896 | - | ||
897 | - ret = rbd_header_add_snap(rbd_dev, | ||
898 | - name, GFP_KERNEL); | ||
899 | - if (ret < 0) | ||
900 | - goto err_unlock; | ||
901 | - | ||
902 | - ret = __rbd_update_snaps(rbd_dev); | ||
903 | - if (ret < 0) | ||
904 | - goto err_unlock; | ||
905 | - | ||
906 | - /* shouldn't hold ctl_mutex when notifying.. notify might | ||
907 | - trigger a watch callback that would need to get that mutex */ | ||
908 | - mutex_unlock(&ctl_mutex); | ||
909 | - | ||
910 | - /* make a best effort, don't error if failed */ | ||
911 | - rbd_req_sync_notify(rbd_dev, rbd_dev->obj_md_name); | ||
912 | - | ||
913 | - ret = count; | ||
914 | - kfree(name); | ||
915 | - return ret; | ||
916 | - | ||
917 | -err_unlock: | ||
918 | - mutex_unlock(&ctl_mutex); | ||
919 | - kfree(name); | ||
920 | - return ret; | ||
921 | -} | ||
922 | - | ||
923 | /* | ||
924 | * create control files in sysfs | ||
925 | * /sys/bus/rbd/... | ||
926 | diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c | ||
927 | index 08c6749..638e1f7 100644 | ||
928 | --- a/drivers/firewire/net.c | ||
929 | +++ b/drivers/firewire/net.c | ||
930 | @@ -861,8 +861,8 @@ static void fwnet_receive_broadcast(struct fw_iso_context *context, | ||
931 | if (specifier_id == IANA_SPECIFIER_ID && ver == RFC2734_SW_VERSION) { | ||
932 | buf_ptr += 2; | ||
933 | length -= IEEE1394_GASP_HDR_SIZE; | ||
934 | - fwnet_incoming_packet(dev, buf_ptr, length, | ||
935 | - source_node_id, -1, true); | ||
936 | + fwnet_incoming_packet(dev, buf_ptr, length, source_node_id, | ||
937 | + context->card->generation, true); | ||
938 | } | ||
939 | |||
940 | packet.payload_length = dev->rcv_buffer_size; | ||
941 | @@ -958,7 +958,12 @@ static void fwnet_transmit_packet_done(struct fwnet_packet_task *ptask) | ||
942 | break; | ||
943 | } | ||
944 | |||
945 | - skb_pull(skb, ptask->max_payload); | ||
946 | + if (ptask->dest_node == IEEE1394_ALL_NODES) { | ||
947 | + skb_pull(skb, | ||
948 | + ptask->max_payload + IEEE1394_GASP_HDR_SIZE); | ||
949 | + } else { | ||
950 | + skb_pull(skb, ptask->max_payload); | ||
951 | + } | ||
952 | if (ptask->outstanding_pkts > 1) { | ||
953 | fwnet_make_sf_hdr(&ptask->hdr, RFC2374_HDR_INTFRAG, | ||
954 | dg_size, fg_off, datagram_label); | ||
955 | @@ -1062,7 +1067,7 @@ static int fwnet_send_packet(struct fwnet_packet_task *ptask) | ||
956 | smp_rmb(); | ||
957 | node_id = dev->card->node_id; | ||
958 | |||
959 | - p = skb_push(ptask->skb, 8); | ||
960 | + p = skb_push(ptask->skb, IEEE1394_GASP_HDR_SIZE); | ||
961 | put_unaligned_be32(node_id << 16 | IANA_SPECIFIER_ID >> 8, p); | ||
962 | put_unaligned_be32((IANA_SPECIFIER_ID & 0xff) << 24 | ||
963 | | RFC2734_SW_VERSION, &p[4]); | ||
964 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c | ||
965 | index 6e38325..9d9835a 100644 | ||
966 | --- a/drivers/gpu/drm/drm_edid.c | ||
967 | +++ b/drivers/gpu/drm/drm_edid.c | ||
968 | @@ -66,6 +66,8 @@ | ||
969 | #define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) | ||
970 | /* use +hsync +vsync for detailed mode */ | ||
971 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) | ||
972 | +/* Force reduced-blanking timings for detailed modes */ | ||
973 | +#define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) | ||
974 | |||
975 | struct detailed_mode_closure { | ||
976 | struct drm_connector *connector; | ||
977 | @@ -120,6 +122,9 @@ static struct edid_quirk { | ||
978 | /* Samsung SyncMaster 22[5-6]BW */ | ||
979 | { "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 }, | ||
980 | { "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 }, | ||
981 | + | ||
982 | + /* ViewSonic VA2026w */ | ||
983 | + { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING }, | ||
984 | }; | ||
985 | |||
986 | /*** DDC fetch and block validation ***/ | ||
987 | @@ -852,12 +857,19 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | ||
988 | "Wrong Hsync/Vsync pulse width\n"); | ||
989 | return NULL; | ||
990 | } | ||
991 | + | ||
992 | + if (quirks & EDID_QUIRK_FORCE_REDUCED_BLANKING) { | ||
993 | + mode = drm_cvt_mode(dev, hactive, vactive, 60, true, false, false); | ||
994 | + if (!mode) | ||
995 | + return NULL; | ||
996 | + | ||
997 | + goto set_size; | ||
998 | + } | ||
999 | + | ||
1000 | mode = drm_mode_create(dev); | ||
1001 | if (!mode) | ||
1002 | return NULL; | ||
1003 | |||
1004 | - mode->type = DRM_MODE_TYPE_DRIVER; | ||
1005 | - | ||
1006 | if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH) | ||
1007 | timing->pixel_clock = cpu_to_le16(1088); | ||
1008 | |||
1009 | @@ -881,8 +893,6 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | ||
1010 | |||
1011 | drm_mode_do_interlace_quirk(mode, pt); | ||
1012 | |||
1013 | - drm_mode_set_name(mode); | ||
1014 | - | ||
1015 | if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) { | ||
1016 | pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE; | ||
1017 | } | ||
1018 | @@ -892,6 +902,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | ||
1019 | mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ? | ||
1020 | DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; | ||
1021 | |||
1022 | +set_size: | ||
1023 | mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4; | ||
1024 | mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; | ||
1025 | |||
1026 | @@ -905,6 +916,9 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | ||
1027 | mode->height_mm = edid->height_cm * 10; | ||
1028 | } | ||
1029 | |||
1030 | + mode->type = DRM_MODE_TYPE_DRIVER; | ||
1031 | + drm_mode_set_name(mode); | ||
1032 | + | ||
1033 | return mode; | ||
1034 | } | ||
1035 | |||
1036 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
1037 | index ae8a64f..89f3d4a 100644 | ||
1038 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
1039 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
1040 | @@ -224,6 +224,7 @@ static const struct intel_device_info intel_sandybridge_d_info = { | ||
1041 | .has_bsd_ring = 1, | ||
1042 | .has_blt_ring = 1, | ||
1043 | .has_llc = 1, | ||
1044 | + .has_force_wake = 1, | ||
1045 | }; | ||
1046 | |||
1047 | static const struct intel_device_info intel_sandybridge_m_info = { | ||
1048 | @@ -233,6 +234,7 @@ static const struct intel_device_info intel_sandybridge_m_info = { | ||
1049 | .has_bsd_ring = 1, | ||
1050 | .has_blt_ring = 1, | ||
1051 | .has_llc = 1, | ||
1052 | + .has_force_wake = 1, | ||
1053 | }; | ||
1054 | |||
1055 | static const struct intel_device_info intel_ivybridge_d_info = { | ||
1056 | @@ -241,6 +243,7 @@ static const struct intel_device_info intel_ivybridge_d_info = { | ||
1057 | .has_bsd_ring = 1, | ||
1058 | .has_blt_ring = 1, | ||
1059 | .has_llc = 1, | ||
1060 | + .has_force_wake = 1, | ||
1061 | }; | ||
1062 | |||
1063 | static const struct intel_device_info intel_ivybridge_m_info = { | ||
1064 | @@ -250,6 +253,7 @@ static const struct intel_device_info intel_ivybridge_m_info = { | ||
1065 | .has_bsd_ring = 1, | ||
1066 | .has_blt_ring = 1, | ||
1067 | .has_llc = 1, | ||
1068 | + .has_force_wake = 1, | ||
1069 | }; | ||
1070 | |||
1071 | static const struct pci_device_id pciidlist[] = { /* aka */ | ||
1072 | @@ -993,6 +997,12 @@ MODULE_AUTHOR(DRIVER_AUTHOR); | ||
1073 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
1074 | MODULE_LICENSE("GPL and additional rights"); | ||
1075 | |||
1076 | +/* We give fast paths for the really cool registers */ | ||
1077 | +#define NEEDS_FORCE_WAKE(dev_priv, reg) \ | ||
1078 | + ((HAS_FORCE_WAKE((dev_priv)->dev)) && \ | ||
1079 | + ((reg) < 0x40000) && \ | ||
1080 | + ((reg) != FORCEWAKE)) | ||
1081 | + | ||
1082 | #define __i915_read(x, y) \ | ||
1083 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ | ||
1084 | u##x val = 0; \ | ||
1085 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h | ||
1086 | index 5fabc6c..45c5cf8 100644 | ||
1087 | --- a/drivers/gpu/drm/i915/i915_drv.h | ||
1088 | +++ b/drivers/gpu/drm/i915/i915_drv.h | ||
1089 | @@ -255,6 +255,7 @@ struct intel_device_info { | ||
1090 | u8 is_broadwater:1; | ||
1091 | u8 is_crestline:1; | ||
1092 | u8 is_ivybridge:1; | ||
1093 | + u8 has_force_wake:1; | ||
1094 | u8 has_fbc:1; | ||
1095 | u8 has_pipe_cxsr:1; | ||
1096 | u8 has_hotplug:1; | ||
1097 | @@ -405,6 +406,8 @@ typedef struct drm_i915_private { | ||
1098 | unsigned int lvds_use_ssc:1; | ||
1099 | unsigned int display_clock_mode:1; | ||
1100 | int lvds_ssc_freq; | ||
1101 | + unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */ | ||
1102 | + unsigned int lvds_val; /* used for checking LVDS channel mode */ | ||
1103 | struct { | ||
1104 | int rate; | ||
1105 | int lanes; | ||
1106 | @@ -1051,6 +1054,8 @@ struct drm_i915_file_private { | ||
1107 | #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) | ||
1108 | #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) | ||
1109 | |||
1110 | +#define HAS_FORCE_WAKE(dev) (INTEL_INFO(dev)->has_force_wake) | ||
1111 | + | ||
1112 | #include "i915_trace.h" | ||
1113 | |||
1114 | /** | ||
1115 | @@ -1450,12 +1455,6 @@ void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); | ||
1116 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); | ||
1117 | int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); | ||
1118 | |||
1119 | -/* We give fast paths for the really cool registers */ | ||
1120 | -#define NEEDS_FORCE_WAKE(dev_priv, reg) \ | ||
1121 | - (((dev_priv)->info->gen >= 6) && \ | ||
1122 | - ((reg) < 0x40000) && \ | ||
1123 | - ((reg) != FORCEWAKE)) | ||
1124 | - | ||
1125 | #define __i915_read(x, y) \ | ||
1126 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg); | ||
1127 | |||
1128 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
1129 | index 0d1e4b7..a230a93 100644 | ||
1130 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
1131 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
1132 | @@ -928,6 +928,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, | ||
1133 | } | ||
1134 | |||
1135 | if (obj->gtt_space && | ||
1136 | + obj->tiling_mode == I915_TILING_NONE && | ||
1137 | obj->base.write_domain != I915_GEM_DOMAIN_CPU) { | ||
1138 | ret = i915_gem_object_pin(obj, 0, true); | ||
1139 | if (ret) | ||
1140 | @@ -3317,7 +3318,8 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj, | ||
1141 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1142 | int ret; | ||
1143 | |||
1144 | - BUG_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT); | ||
1145 | + if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT)) | ||
1146 | + return -EBUSY; | ||
1147 | WARN_ON(i915_verify_lists(dev)); | ||
1148 | |||
1149 | if (obj->gtt_space != NULL) { | ||
1150 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
1151 | index 26c67a7..8bca2d2 100644 | ||
1152 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
1153 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
1154 | @@ -530,6 +530,12 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | ||
1155 | if (de_iir & DE_GSE_IVB) | ||
1156 | intel_opregion_gse_intr(dev); | ||
1157 | |||
1158 | + if (de_iir & DE_PIPEA_VBLANK_IVB) | ||
1159 | + drm_handle_vblank(dev, 0); | ||
1160 | + | ||
1161 | + if (de_iir & DE_PIPEB_VBLANK_IVB) | ||
1162 | + drm_handle_vblank(dev, 1); | ||
1163 | + | ||
1164 | if (de_iir & DE_PLANEA_FLIP_DONE_IVB) { | ||
1165 | intel_prepare_page_flip(dev, 0); | ||
1166 | intel_finish_page_flip_plane(dev, 0); | ||
1167 | @@ -540,12 +546,6 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | ||
1168 | intel_finish_page_flip_plane(dev, 1); | ||
1169 | } | ||
1170 | |||
1171 | - if (de_iir & DE_PIPEA_VBLANK_IVB) | ||
1172 | - drm_handle_vblank(dev, 0); | ||
1173 | - | ||
1174 | - if (de_iir & DE_PIPEB_VBLANK_IVB) | ||
1175 | - drm_handle_vblank(dev, 1); | ||
1176 | - | ||
1177 | /* check event from PCH */ | ||
1178 | if (de_iir & DE_PCH_EVENT_IVB) { | ||
1179 | if (pch_iir & SDE_HOTPLUG_MASK_CPT) | ||
1180 | @@ -622,6 +622,12 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | ||
1181 | if (de_iir & DE_GSE) | ||
1182 | intel_opregion_gse_intr(dev); | ||
1183 | |||
1184 | + if (de_iir & DE_PIPEA_VBLANK) | ||
1185 | + drm_handle_vblank(dev, 0); | ||
1186 | + | ||
1187 | + if (de_iir & DE_PIPEB_VBLANK) | ||
1188 | + drm_handle_vblank(dev, 1); | ||
1189 | + | ||
1190 | if (de_iir & DE_PLANEA_FLIP_DONE) { | ||
1191 | intel_prepare_page_flip(dev, 0); | ||
1192 | intel_finish_page_flip_plane(dev, 0); | ||
1193 | @@ -632,12 +638,6 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | ||
1194 | intel_finish_page_flip_plane(dev, 1); | ||
1195 | } | ||
1196 | |||
1197 | - if (de_iir & DE_PIPEA_VBLANK) | ||
1198 | - drm_handle_vblank(dev, 0); | ||
1199 | - | ||
1200 | - if (de_iir & DE_PIPEB_VBLANK) | ||
1201 | - drm_handle_vblank(dev, 1); | ||
1202 | - | ||
1203 | /* check event from PCH */ | ||
1204 | if (de_iir & DE_PCH_EVENT) { | ||
1205 | if (pch_iir & hotplug_mask) | ||
1206 | @@ -2051,10 +2051,22 @@ static int i915_driver_irq_postinstall(struct drm_device *dev) | ||
1207 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; | ||
1208 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) | ||
1209 | hotplug_en |= HDMID_HOTPLUG_INT_EN; | ||
1210 | - if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS) | ||
1211 | - hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
1212 | - if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS) | ||
1213 | - hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
1214 | + if (IS_G4X(dev)) { | ||
1215 | + if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_G4X) | ||
1216 | + hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
1217 | + if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_G4X) | ||
1218 | + hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
1219 | + } else if (IS_GEN4(dev)) { | ||
1220 | + if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_I965) | ||
1221 | + hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
1222 | + if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_I965) | ||
1223 | + hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
1224 | + } else { | ||
1225 | + if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_I915) | ||
1226 | + hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
1227 | + if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_I915) | ||
1228 | + hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
1229 | + } | ||
1230 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) { | ||
1231 | hotplug_en |= CRT_HOTPLUG_INT_EN; | ||
1232 | |||
1233 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
1234 | index 29bfd89..27a296a 100644 | ||
1235 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
1236 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
1237 | @@ -197,6 +197,14 @@ | ||
1238 | #define MI_DISPLAY_FLIP MI_INSTR(0x14, 2) | ||
1239 | #define MI_DISPLAY_FLIP_I915 MI_INSTR(0x14, 1) | ||
1240 | #define MI_DISPLAY_FLIP_PLANE(n) ((n) << 20) | ||
1241 | +/* IVB has funny definitions for which plane to flip. */ | ||
1242 | +#define MI_DISPLAY_FLIP_IVB_PLANE_A (0 << 19) | ||
1243 | +#define MI_DISPLAY_FLIP_IVB_PLANE_B (1 << 19) | ||
1244 | +#define MI_DISPLAY_FLIP_IVB_SPRITE_A (2 << 19) | ||
1245 | +#define MI_DISPLAY_FLIP_IVB_SPRITE_B (3 << 19) | ||
1246 | +#define MI_DISPLAY_FLIP_IVB_PLANE_C (4 << 19) | ||
1247 | +#define MI_DISPLAY_FLIP_IVB_SPRITE_C (5 << 19) | ||
1248 | + | ||
1249 | #define MI_SET_CONTEXT MI_INSTR(0x18, 0) | ||
1250 | #define MI_MM_SPACE_GTT (1<<8) | ||
1251 | #define MI_MM_SPACE_PHYSICAL (0<<8) | ||
1252 | @@ -437,6 +445,9 @@ | ||
1253 | # define VS_TIMER_DISPATCH (1 << 6) | ||
1254 | # define MI_FLUSH_ENABLE (1 << 12) | ||
1255 | |||
1256 | +#define GEN6_GT_MODE 0x20d0 | ||
1257 | +#define GEN6_GT_MODE_HI (1 << 9) | ||
1258 | + | ||
1259 | #define GFX_MODE 0x02520 | ||
1260 | #define GFX_MODE_GEN7 0x0229c | ||
1261 | #define RING_MODE_GEN7(ring) ((ring)->mmio_base+0x29c) | ||
1262 | @@ -1483,14 +1494,20 @@ | ||
1263 | #define DPC_HOTPLUG_INT_STATUS (1 << 28) | ||
1264 | #define HDMID_HOTPLUG_INT_STATUS (1 << 27) | ||
1265 | #define DPD_HOTPLUG_INT_STATUS (1 << 27) | ||
1266 | +/* CRT/TV common between gen3+ */ | ||
1267 | #define CRT_HOTPLUG_INT_STATUS (1 << 11) | ||
1268 | #define TV_HOTPLUG_INT_STATUS (1 << 10) | ||
1269 | #define CRT_HOTPLUG_MONITOR_MASK (3 << 8) | ||
1270 | #define CRT_HOTPLUG_MONITOR_COLOR (3 << 8) | ||
1271 | #define CRT_HOTPLUG_MONITOR_MONO (2 << 8) | ||
1272 | #define CRT_HOTPLUG_MONITOR_NONE (0 << 8) | ||
1273 | -#define SDVOC_HOTPLUG_INT_STATUS (1 << 7) | ||
1274 | -#define SDVOB_HOTPLUG_INT_STATUS (1 << 6) | ||
1275 | +/* SDVO is different across gen3/4 */ | ||
1276 | +#define SDVOC_HOTPLUG_INT_STATUS_G4X (1 << 3) | ||
1277 | +#define SDVOB_HOTPLUG_INT_STATUS_G4X (1 << 2) | ||
1278 | +#define SDVOC_HOTPLUG_INT_STATUS_I965 (3 << 4) | ||
1279 | +#define SDVOB_HOTPLUG_INT_STATUS_I965 (3 << 2) | ||
1280 | +#define SDVOC_HOTPLUG_INT_STATUS_I915 (1 << 7) | ||
1281 | +#define SDVOB_HOTPLUG_INT_STATUS_I915 (1 << 6) | ||
1282 | |||
1283 | /* SDVO port control */ | ||
1284 | #define SDVOB 0x61140 | ||
1285 | @@ -3015,6 +3032,8 @@ | ||
1286 | #define _PFA_CTL_1 0x68080 | ||
1287 | #define _PFB_CTL_1 0x68880 | ||
1288 | #define PF_ENABLE (1<<31) | ||
1289 | +#define PF_PIPE_SEL_MASK_IVB (3<<29) | ||
1290 | +#define PF_PIPE_SEL_IVB(pipe) ((pipe)<<29) | ||
1291 | #define PF_FILTER_MASK (3<<23) | ||
1292 | #define PF_FILTER_PROGRAMMED (0<<23) | ||
1293 | #define PF_FILTER_MED_3x3 (1<<23) | ||
1294 | diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c | ||
1295 | index 3fe0524..a2c9e56 100644 | ||
1296 | --- a/drivers/gpu/drm/i915/intel_bios.c | ||
1297 | +++ b/drivers/gpu/drm/i915/intel_bios.c | ||
1298 | @@ -174,6 +174,28 @@ get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *lvds_lfp_data, | ||
1299 | return (struct lvds_dvo_timing *)(entry + dvo_timing_offset); | ||
1300 | } | ||
1301 | |||
1302 | +/* get lvds_fp_timing entry | ||
1303 | + * this function may return NULL if the corresponding entry is invalid | ||
1304 | + */ | ||
1305 | +static const struct lvds_fp_timing * | ||
1306 | +get_lvds_fp_timing(const struct bdb_header *bdb, | ||
1307 | + const struct bdb_lvds_lfp_data *data, | ||
1308 | + const struct bdb_lvds_lfp_data_ptrs *ptrs, | ||
1309 | + int index) | ||
1310 | +{ | ||
1311 | + size_t data_ofs = (const u8 *)data - (const u8 *)bdb; | ||
1312 | + u16 data_size = ((const u16 *)data)[-1]; /* stored in header */ | ||
1313 | + size_t ofs; | ||
1314 | + | ||
1315 | + if (index >= ARRAY_SIZE(ptrs->ptr)) | ||
1316 | + return NULL; | ||
1317 | + ofs = ptrs->ptr[index].fp_timing_offset; | ||
1318 | + if (ofs < data_ofs || | ||
1319 | + ofs + sizeof(struct lvds_fp_timing) > data_ofs + data_size) | ||
1320 | + return NULL; | ||
1321 | + return (const struct lvds_fp_timing *)((const u8 *)bdb + ofs); | ||
1322 | +} | ||
1323 | + | ||
1324 | /* Try to find integrated panel data */ | ||
1325 | static void | ||
1326 | parse_lfp_panel_data(struct drm_i915_private *dev_priv, | ||
1327 | @@ -183,6 +205,7 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv, | ||
1328 | const struct bdb_lvds_lfp_data *lvds_lfp_data; | ||
1329 | const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; | ||
1330 | const struct lvds_dvo_timing *panel_dvo_timing; | ||
1331 | + const struct lvds_fp_timing *fp_timing; | ||
1332 | struct drm_display_mode *panel_fixed_mode; | ||
1333 | int i, downclock; | ||
1334 | |||
1335 | @@ -244,6 +267,19 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv, | ||
1336 | "Normal Clock %dKHz, downclock %dKHz\n", | ||
1337 | panel_fixed_mode->clock, 10*downclock); | ||
1338 | } | ||
1339 | + | ||
1340 | + fp_timing = get_lvds_fp_timing(bdb, lvds_lfp_data, | ||
1341 | + lvds_lfp_data_ptrs, | ||
1342 | + lvds_options->panel_type); | ||
1343 | + if (fp_timing) { | ||
1344 | + /* check the resolution, just to be sure */ | ||
1345 | + if (fp_timing->x_res == panel_fixed_mode->hdisplay && | ||
1346 | + fp_timing->y_res == panel_fixed_mode->vdisplay) { | ||
1347 | + dev_priv->bios_lvds_val = fp_timing->lvds_reg_val; | ||
1348 | + DRM_DEBUG_KMS("VBT initial LVDS value %x\n", | ||
1349 | + dev_priv->bios_lvds_val); | ||
1350 | + } | ||
1351 | + } | ||
1352 | } | ||
1353 | |||
1354 | /* Try to find sdvo panel data */ | ||
1355 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
1356 | index dd3e7e4..8e95c94 100644 | ||
1357 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
1358 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
1359 | @@ -360,6 +360,27 @@ static const intel_limit_t intel_limits_ironlake_display_port = { | ||
1360 | .find_pll = intel_find_pll_ironlake_dp, | ||
1361 | }; | ||
1362 | |||
1363 | +static bool is_dual_link_lvds(struct drm_i915_private *dev_priv, | ||
1364 | + unsigned int reg) | ||
1365 | +{ | ||
1366 | + unsigned int val; | ||
1367 | + | ||
1368 | + if (dev_priv->lvds_val) | ||
1369 | + val = dev_priv->lvds_val; | ||
1370 | + else { | ||
1371 | + /* BIOS should set the proper LVDS register value at boot, but | ||
1372 | + * in reality, it doesn't set the value when the lid is closed; | ||
1373 | + * we need to check "the value to be set" in VBT when LVDS | ||
1374 | + * register is uninitialized. | ||
1375 | + */ | ||
1376 | + val = I915_READ(reg); | ||
1377 | + if (!(val & ~LVDS_DETECTED)) | ||
1378 | + val = dev_priv->bios_lvds_val; | ||
1379 | + dev_priv->lvds_val = val; | ||
1380 | + } | ||
1381 | + return (val & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP; | ||
1382 | +} | ||
1383 | + | ||
1384 | static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc, | ||
1385 | int refclk) | ||
1386 | { | ||
1387 | @@ -368,8 +389,7 @@ static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc, | ||
1388 | const intel_limit_t *limit; | ||
1389 | |||
1390 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | ||
1391 | - if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == | ||
1392 | - LVDS_CLKB_POWER_UP) { | ||
1393 | + if (is_dual_link_lvds(dev_priv, PCH_LVDS)) { | ||
1394 | /* LVDS dual channel */ | ||
1395 | if (refclk == 100000) | ||
1396 | limit = &intel_limits_ironlake_dual_lvds_100m; | ||
1397 | @@ -397,8 +417,7 @@ static const intel_limit_t *intel_g4x_limit(struct drm_crtc *crtc) | ||
1398 | const intel_limit_t *limit; | ||
1399 | |||
1400 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | ||
1401 | - if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == | ||
1402 | - LVDS_CLKB_POWER_UP) | ||
1403 | + if (is_dual_link_lvds(dev_priv, LVDS)) | ||
1404 | /* LVDS with dual channel */ | ||
1405 | limit = &intel_limits_g4x_dual_channel_lvds; | ||
1406 | else | ||
1407 | @@ -536,8 +555,7 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | ||
1408 | * reliably set up different single/dual channel state, if we | ||
1409 | * even can. | ||
1410 | */ | ||
1411 | - if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == | ||
1412 | - LVDS_CLKB_POWER_UP) | ||
1413 | + if (is_dual_link_lvds(dev_priv, LVDS)) | ||
1414 | clock.p2 = limit->p2.p2_fast; | ||
1415 | else | ||
1416 | clock.p2 = limit->p2.p2_slow; | ||
1417 | @@ -2424,18 +2442,6 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) | ||
1418 | FDI_FE_ERRC_ENABLE); | ||
1419 | } | ||
1420 | |||
1421 | -static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe) | ||
1422 | -{ | ||
1423 | - struct drm_i915_private *dev_priv = dev->dev_private; | ||
1424 | - u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
1425 | - | ||
1426 | - flags |= FDI_PHASE_SYNC_OVR(pipe); | ||
1427 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* once to unlock... */ | ||
1428 | - flags |= FDI_PHASE_SYNC_EN(pipe); | ||
1429 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to enable */ | ||
1430 | - POSTING_READ(SOUTH_CHICKEN1); | ||
1431 | -} | ||
1432 | - | ||
1433 | /* The FDI link training functions for ILK/Ibexpeak. */ | ||
1434 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) | ||
1435 | { | ||
1436 | @@ -2586,9 +2592,6 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc) | ||
1437 | POSTING_READ(reg); | ||
1438 | udelay(150); | ||
1439 | |||
1440 | - if (HAS_PCH_CPT(dev)) | ||
1441 | - cpt_phase_pointer_enable(dev, pipe); | ||
1442 | - | ||
1443 | for (i = 0; i < 4; i++) { | ||
1444 | reg = FDI_TX_CTL(pipe); | ||
1445 | temp = I915_READ(reg); | ||
1446 | @@ -2707,9 +2710,6 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc) | ||
1447 | POSTING_READ(reg); | ||
1448 | udelay(150); | ||
1449 | |||
1450 | - if (HAS_PCH_CPT(dev)) | ||
1451 | - cpt_phase_pointer_enable(dev, pipe); | ||
1452 | - | ||
1453 | for (i = 0; i < 4; i++) { | ||
1454 | reg = FDI_TX_CTL(pipe); | ||
1455 | temp = I915_READ(reg); | ||
1456 | @@ -2819,17 +2819,6 @@ static void ironlake_fdi_pll_enable(struct drm_crtc *crtc) | ||
1457 | } | ||
1458 | } | ||
1459 | |||
1460 | -static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe) | ||
1461 | -{ | ||
1462 | - struct drm_i915_private *dev_priv = dev->dev_private; | ||
1463 | - u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
1464 | - | ||
1465 | - flags &= ~(FDI_PHASE_SYNC_EN(pipe)); | ||
1466 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* once to disable... */ | ||
1467 | - flags &= ~(FDI_PHASE_SYNC_OVR(pipe)); | ||
1468 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to lock */ | ||
1469 | - POSTING_READ(SOUTH_CHICKEN1); | ||
1470 | -} | ||
1471 | static void ironlake_fdi_disable(struct drm_crtc *crtc) | ||
1472 | { | ||
1473 | struct drm_device *dev = crtc->dev; | ||
1474 | @@ -2859,8 +2848,6 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc) | ||
1475 | I915_WRITE(FDI_RX_CHICKEN(pipe), | ||
1476 | I915_READ(FDI_RX_CHICKEN(pipe) & | ||
1477 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); | ||
1478 | - } else if (HAS_PCH_CPT(dev)) { | ||
1479 | - cpt_phase_pointer_disable(dev, pipe); | ||
1480 | } | ||
1481 | |||
1482 | /* still set train pattern 1 */ | ||
1483 | @@ -2908,18 +2895,37 @@ static void intel_clear_scanline_wait(struct drm_device *dev) | ||
1484 | I915_WRITE_CTL(ring, tmp); | ||
1485 | } | ||
1486 | |||
1487 | +static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc) | ||
1488 | +{ | ||
1489 | + struct drm_device *dev = crtc->dev; | ||
1490 | + struct drm_i915_private *dev_priv = dev->dev_private; | ||
1491 | + unsigned long flags; | ||
1492 | + bool pending; | ||
1493 | + | ||
1494 | + if (atomic_read(&dev_priv->mm.wedged)) | ||
1495 | + return false; | ||
1496 | + | ||
1497 | + spin_lock_irqsave(&dev->event_lock, flags); | ||
1498 | + pending = to_intel_crtc(crtc)->unpin_work != NULL; | ||
1499 | + spin_unlock_irqrestore(&dev->event_lock, flags); | ||
1500 | + | ||
1501 | + return pending; | ||
1502 | +} | ||
1503 | + | ||
1504 | static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) | ||
1505 | { | ||
1506 | - struct drm_i915_gem_object *obj; | ||
1507 | - struct drm_i915_private *dev_priv; | ||
1508 | + struct drm_device *dev = crtc->dev; | ||
1509 | + struct drm_i915_private *dev_priv = dev->dev_private; | ||
1510 | |||
1511 | if (crtc->fb == NULL) | ||
1512 | return; | ||
1513 | |||
1514 | - obj = to_intel_framebuffer(crtc->fb)->obj; | ||
1515 | - dev_priv = crtc->dev->dev_private; | ||
1516 | wait_event(dev_priv->pending_flip_queue, | ||
1517 | - atomic_read(&obj->pending_flip) == 0); | ||
1518 | + !intel_crtc_has_pending_flip(crtc)); | ||
1519 | + | ||
1520 | + mutex_lock(&dev->struct_mutex); | ||
1521 | + intel_finish_fb(crtc->fb); | ||
1522 | + mutex_unlock(&dev->struct_mutex); | ||
1523 | } | ||
1524 | |||
1525 | static bool intel_crtc_driving_pch(struct drm_crtc *crtc) | ||
1526 | @@ -3095,7 +3101,11 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc) | ||
1527 | * as some pre-programmed values are broken, | ||
1528 | * e.g. x201. | ||
1529 | */ | ||
1530 | - I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3); | ||
1531 | + if (IS_IVYBRIDGE(dev)) | ||
1532 | + I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3 | | ||
1533 | + PF_PIPE_SEL_IVB(pipe)); | ||
1534 | + else | ||
1535 | + I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3); | ||
1536 | I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos); | ||
1537 | I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size); | ||
1538 | } | ||
1539 | @@ -3381,23 +3391,6 @@ static void intel_crtc_disable(struct drm_crtc *crtc) | ||
1540 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
1541 | struct drm_device *dev = crtc->dev; | ||
1542 | |||
1543 | - /* Flush any pending WAITs before we disable the pipe. Note that | ||
1544 | - * we need to drop the struct_mutex in order to acquire it again | ||
1545 | - * during the lowlevel dpms routines around a couple of the | ||
1546 | - * operations. It does not look trivial nor desirable to move | ||
1547 | - * that locking higher. So instead we leave a window for the | ||
1548 | - * submission of further commands on the fb before we can actually | ||
1549 | - * disable it. This race with userspace exists anyway, and we can | ||
1550 | - * only rely on the pipe being disabled by userspace after it | ||
1551 | - * receives the hotplug notification and has flushed any pending | ||
1552 | - * batches. | ||
1553 | - */ | ||
1554 | - if (crtc->fb) { | ||
1555 | - mutex_lock(&dev->struct_mutex); | ||
1556 | - intel_finish_fb(crtc->fb); | ||
1557 | - mutex_unlock(&dev->struct_mutex); | ||
1558 | - } | ||
1559 | - | ||
1560 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | ||
1561 | assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane); | ||
1562 | assert_pipe_disabled(dev->dev_private, to_intel_crtc(crtc)->pipe); | ||
1563 | @@ -7286,9 +7279,8 @@ static void do_intel_finish_page_flip(struct drm_device *dev, | ||
1564 | |||
1565 | atomic_clear_mask(1 << intel_crtc->plane, | ||
1566 | &obj->pending_flip.counter); | ||
1567 | - if (atomic_read(&obj->pending_flip) == 0) | ||
1568 | - wake_up(&dev_priv->pending_flip_queue); | ||
1569 | |||
1570 | + wake_up(&dev_priv->pending_flip_queue); | ||
1571 | schedule_work(&work->work); | ||
1572 | |||
1573 | trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); | ||
1574 | @@ -7340,14 +7332,14 @@ static int intel_gen2_queue_flip(struct drm_device *dev, | ||
1575 | |||
1576 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
1577 | if (ret) | ||
1578 | - goto out; | ||
1579 | + goto err; | ||
1580 | |||
1581 | /* Offset into the new buffer for cases of shared fbs between CRTCs */ | ||
1582 | offset = crtc->y * fb->pitches[0] + crtc->x * fb->bits_per_pixel/8; | ||
1583 | |||
1584 | ret = BEGIN_LP_RING(6); | ||
1585 | if (ret) | ||
1586 | - goto out; | ||
1587 | + goto err_unpin; | ||
1588 | |||
1589 | /* Can't queue multiple flips, so wait for the previous | ||
1590 | * one to finish before executing the next. | ||
1591 | @@ -7364,7 +7356,11 @@ static int intel_gen2_queue_flip(struct drm_device *dev, | ||
1592 | OUT_RING(obj->gtt_offset + offset); | ||
1593 | OUT_RING(0); /* aux display base address, unused */ | ||
1594 | ADVANCE_LP_RING(); | ||
1595 | -out: | ||
1596 | + return 0; | ||
1597 | + | ||
1598 | +err_unpin: | ||
1599 | + intel_unpin_fb_obj(obj); | ||
1600 | +err: | ||
1601 | return ret; | ||
1602 | } | ||
1603 | |||
1604 | @@ -7381,14 +7377,14 @@ static int intel_gen3_queue_flip(struct drm_device *dev, | ||
1605 | |||
1606 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
1607 | if (ret) | ||
1608 | - goto out; | ||
1609 | + goto err; | ||
1610 | |||
1611 | /* Offset into the new buffer for cases of shared fbs between CRTCs */ | ||
1612 | offset = crtc->y * fb->pitches[0] + crtc->x * fb->bits_per_pixel/8; | ||
1613 | |||
1614 | ret = BEGIN_LP_RING(6); | ||
1615 | if (ret) | ||
1616 | - goto out; | ||
1617 | + goto err_unpin; | ||
1618 | |||
1619 | if (intel_crtc->plane) | ||
1620 | flip_mask = MI_WAIT_FOR_PLANE_B_FLIP; | ||
1621 | @@ -7403,7 +7399,11 @@ static int intel_gen3_queue_flip(struct drm_device *dev, | ||
1622 | OUT_RING(MI_NOOP); | ||
1623 | |||
1624 | ADVANCE_LP_RING(); | ||
1625 | -out: | ||
1626 | + return 0; | ||
1627 | + | ||
1628 | +err_unpin: | ||
1629 | + intel_unpin_fb_obj(obj); | ||
1630 | +err: | ||
1631 | return ret; | ||
1632 | } | ||
1633 | |||
1634 | @@ -7419,11 +7419,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev, | ||
1635 | |||
1636 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
1637 | if (ret) | ||
1638 | - goto out; | ||
1639 | + goto err; | ||
1640 | |||
1641 | ret = BEGIN_LP_RING(4); | ||
1642 | if (ret) | ||
1643 | - goto out; | ||
1644 | + goto err_unpin; | ||
1645 | |||
1646 | /* i965+ uses the linear or tiled offsets from the | ||
1647 | * Display Registers (which do not change across a page-flip) | ||
1648 | @@ -7442,7 +7442,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev, | ||
1649 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; | ||
1650 | OUT_RING(pf | pipesrc); | ||
1651 | ADVANCE_LP_RING(); | ||
1652 | -out: | ||
1653 | + return 0; | ||
1654 | + | ||
1655 | +err_unpin: | ||
1656 | + intel_unpin_fb_obj(obj); | ||
1657 | +err: | ||
1658 | return ret; | ||
1659 | } | ||
1660 | |||
1661 | @@ -7458,11 +7462,11 @@ static int intel_gen6_queue_flip(struct drm_device *dev, | ||
1662 | |||
1663 | ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); | ||
1664 | if (ret) | ||
1665 | - goto out; | ||
1666 | + goto err; | ||
1667 | |||
1668 | ret = BEGIN_LP_RING(4); | ||
1669 | if (ret) | ||
1670 | - goto out; | ||
1671 | + goto err_unpin; | ||
1672 | |||
1673 | OUT_RING(MI_DISPLAY_FLIP | | ||
1674 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
1675 | @@ -7479,7 +7483,11 @@ static int intel_gen6_queue_flip(struct drm_device *dev, | ||
1676 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; | ||
1677 | OUT_RING(pf | pipesrc); | ||
1678 | ADVANCE_LP_RING(); | ||
1679 | -out: | ||
1680 | + return 0; | ||
1681 | + | ||
1682 | +err_unpin: | ||
1683 | + intel_unpin_fb_obj(obj); | ||
1684 | +err: | ||
1685 | return ret; | ||
1686 | } | ||
1687 | |||
1688 | @@ -7497,22 +7505,43 @@ static int intel_gen7_queue_flip(struct drm_device *dev, | ||
1689 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1690 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
1691 | struct intel_ring_buffer *ring = &dev_priv->ring[BCS]; | ||
1692 | + uint32_t plane_bit = 0; | ||
1693 | int ret; | ||
1694 | |||
1695 | ret = intel_pin_and_fence_fb_obj(dev, obj, ring); | ||
1696 | if (ret) | ||
1697 | - goto out; | ||
1698 | + goto err; | ||
1699 | + | ||
1700 | + switch(intel_crtc->plane) { | ||
1701 | + case PLANE_A: | ||
1702 | + plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_A; | ||
1703 | + break; | ||
1704 | + case PLANE_B: | ||
1705 | + plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_B; | ||
1706 | + break; | ||
1707 | + case PLANE_C: | ||
1708 | + plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_C; | ||
1709 | + break; | ||
1710 | + default: | ||
1711 | + WARN_ONCE(1, "unknown plane in flip command\n"); | ||
1712 | + ret = -ENODEV; | ||
1713 | + goto err_unpin; | ||
1714 | + } | ||
1715 | |||
1716 | ret = intel_ring_begin(ring, 4); | ||
1717 | if (ret) | ||
1718 | - goto out; | ||
1719 | + goto err_unpin; | ||
1720 | |||
1721 | - intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | (intel_crtc->plane << 19)); | ||
1722 | + intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit); | ||
1723 | intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); | ||
1724 | intel_ring_emit(ring, (obj->gtt_offset)); | ||
1725 | intel_ring_emit(ring, (MI_NOOP)); | ||
1726 | intel_ring_advance(ring); | ||
1727 | -out: | ||
1728 | + return 0; | ||
1729 | + | ||
1730 | +err_unpin: | ||
1731 | + intel_unpin_fb_obj(obj); | ||
1732 | +err: | ||
1733 | return ret; | ||
1734 | } | ||
1735 | |||
1736 | @@ -8611,6 +8640,11 @@ static void gen6_init_clock_gating(struct drm_device *dev) | ||
1737 | DISPPLANE_TRICKLE_FEED_DISABLE); | ||
1738 | intel_flush_display_plane(dev_priv, pipe); | ||
1739 | } | ||
1740 | + | ||
1741 | + /* The default value should be 0x200 according to docs, but the two | ||
1742 | + * platforms I checked have a 0 for this. (Maybe BIOS overrides?) */ | ||
1743 | + I915_WRITE(GEN6_GT_MODE, 0xffff << 16); | ||
1744 | + I915_WRITE(GEN6_GT_MODE, GEN6_GT_MODE_HI << 16 | GEN6_GT_MODE_HI); | ||
1745 | } | ||
1746 | |||
1747 | static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv) | ||
1748 | diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c | ||
1749 | index fb44e9d..c60100d 100644 | ||
1750 | --- a/drivers/gpu/drm/i915/intel_hdmi.c | ||
1751 | +++ b/drivers/gpu/drm/i915/intel_hdmi.c | ||
1752 | @@ -138,14 +138,17 @@ static void i9xx_write_infoframe(struct drm_encoder *encoder, | ||
1753 | |||
1754 | I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags); | ||
1755 | |||
1756 | + mmiowb(); | ||
1757 | for (i = 0; i < len; i += 4) { | ||
1758 | I915_WRITE(VIDEO_DIP_DATA, *data); | ||
1759 | data++; | ||
1760 | } | ||
1761 | + mmiowb(); | ||
1762 | |||
1763 | flags |= intel_infoframe_flags(frame); | ||
1764 | |||
1765 | I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags); | ||
1766 | + POSTING_READ(VIDEO_DIP_CTL); | ||
1767 | } | ||
1768 | |||
1769 | static void ironlake_write_infoframe(struct drm_encoder *encoder, | ||
1770 | @@ -168,14 +171,17 @@ static void ironlake_write_infoframe(struct drm_encoder *encoder, | ||
1771 | |||
1772 | I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags); | ||
1773 | |||
1774 | + mmiowb(); | ||
1775 | for (i = 0; i < len; i += 4) { | ||
1776 | I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data); | ||
1777 | data++; | ||
1778 | } | ||
1779 | + mmiowb(); | ||
1780 | |||
1781 | flags |= intel_infoframe_flags(frame); | ||
1782 | |||
1783 | I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags); | ||
1784 | + POSTING_READ(reg); | ||
1785 | } | ||
1786 | static void intel_set_infoframe(struct drm_encoder *encoder, | ||
1787 | struct dip_infoframe *frame) | ||
1788 | @@ -549,10 +555,13 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) | ||
1789 | if (!HAS_PCH_SPLIT(dev)) { | ||
1790 | intel_hdmi->write_infoframe = i9xx_write_infoframe; | ||
1791 | I915_WRITE(VIDEO_DIP_CTL, 0); | ||
1792 | + POSTING_READ(VIDEO_DIP_CTL); | ||
1793 | } else { | ||
1794 | intel_hdmi->write_infoframe = ironlake_write_infoframe; | ||
1795 | - for_each_pipe(i) | ||
1796 | + for_each_pipe(i) { | ||
1797 | I915_WRITE(TVIDEO_DIP_CTL(i), 0); | ||
1798 | + POSTING_READ(TVIDEO_DIP_CTL(i)); | ||
1799 | + } | ||
1800 | } | ||
1801 | |||
1802 | drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs); | ||
1803 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c | ||
1804 | index 802fec2..a8b28c4 100644 | ||
1805 | --- a/drivers/gpu/drm/i915/intel_lvds.c | ||
1806 | +++ b/drivers/gpu/drm/i915/intel_lvds.c | ||
1807 | @@ -779,14 +779,6 @@ static const struct dmi_system_id intel_no_lvds[] = { | ||
1808 | }, | ||
1809 | { | ||
1810 | .callback = intel_no_lvds_dmi_callback, | ||
1811 | - .ident = "ZOTAC ZBOXSD-ID12/ID13", | ||
1812 | - .matches = { | ||
1813 | - DMI_MATCH(DMI_BOARD_VENDOR, "ZOTAC"), | ||
1814 | - DMI_MATCH(DMI_BOARD_NAME, "ZBOXSD-ID12/ID13"), | ||
1815 | - }, | ||
1816 | - }, | ||
1817 | - { | ||
1818 | - .callback = intel_no_lvds_dmi_callback, | ||
1819 | .ident = "Gigabyte GA-D525TUD", | ||
1820 | .matches = { | ||
1821 | DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."), | ||
1822 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
1823 | index 302d3d5..c17325c 100644 | ||
1824 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
1825 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
1826 | @@ -249,10 +249,15 @@ u32 intel_ring_get_active_head(struct intel_ring_buffer *ring) | ||
1827 | |||
1828 | static int init_ring_common(struct intel_ring_buffer *ring) | ||
1829 | { | ||
1830 | - drm_i915_private_t *dev_priv = ring->dev->dev_private; | ||
1831 | + struct drm_device *dev = ring->dev; | ||
1832 | + drm_i915_private_t *dev_priv = dev->dev_private; | ||
1833 | struct drm_i915_gem_object *obj = ring->obj; | ||
1834 | + int ret = 0; | ||
1835 | u32 head; | ||
1836 | |||
1837 | + if (HAS_FORCE_WAKE(dev)) | ||
1838 | + gen6_gt_force_wake_get(dev_priv); | ||
1839 | + | ||
1840 | /* Stop the ring if it's running. */ | ||
1841 | I915_WRITE_CTL(ring, 0); | ||
1842 | I915_WRITE_HEAD(ring, 0); | ||
1843 | @@ -290,9 +295,9 @@ static int init_ring_common(struct intel_ring_buffer *ring) | ||
1844 | | RING_VALID); | ||
1845 | |||
1846 | /* If the head is still not zero, the ring is dead */ | ||
1847 | - if ((I915_READ_CTL(ring) & RING_VALID) == 0 || | ||
1848 | - I915_READ_START(ring) != obj->gtt_offset || | ||
1849 | - (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) { | ||
1850 | + if (wait_for((I915_READ_CTL(ring) & RING_VALID) != 0 && | ||
1851 | + I915_READ_START(ring) == obj->gtt_offset && | ||
1852 | + (I915_READ_HEAD(ring) & HEAD_ADDR) == 0, 50)) { | ||
1853 | DRM_ERROR("%s initialization failed " | ||
1854 | "ctl %08x head %08x tail %08x start %08x\n", | ||
1855 | ring->name, | ||
1856 | @@ -300,7 +305,8 @@ static int init_ring_common(struct intel_ring_buffer *ring) | ||
1857 | I915_READ_HEAD(ring), | ||
1858 | I915_READ_TAIL(ring), | ||
1859 | I915_READ_START(ring)); | ||
1860 | - return -EIO; | ||
1861 | + ret = -EIO; | ||
1862 | + goto out; | ||
1863 | } | ||
1864 | |||
1865 | if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) | ||
1866 | @@ -312,7 +318,11 @@ static int init_ring_common(struct intel_ring_buffer *ring) | ||
1867 | ring->last_retired_head = -1; | ||
1868 | } | ||
1869 | |||
1870 | - return 0; | ||
1871 | +out: | ||
1872 | + if (HAS_FORCE_WAKE(dev)) | ||
1873 | + gen6_gt_force_wake_put(dev_priv); | ||
1874 | + | ||
1875 | + return ret; | ||
1876 | } | ||
1877 | |||
1878 | static int | ||
1879 | diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c | ||
1880 | index b96e8c8..1b6b157 100644 | ||
1881 | --- a/drivers/gpu/drm/i915/intel_sdvo.c | ||
1882 | +++ b/drivers/gpu/drm/i915/intel_sdvo.c | ||
1883 | @@ -2528,6 +2528,7 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) | ||
1884 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1885 | struct intel_encoder *intel_encoder; | ||
1886 | struct intel_sdvo *intel_sdvo; | ||
1887 | + u32 hotplug_mask; | ||
1888 | int i; | ||
1889 | |||
1890 | intel_sdvo = kzalloc(sizeof(struct intel_sdvo), GFP_KERNEL); | ||
1891 | @@ -2558,10 +2559,17 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) | ||
1892 | } | ||
1893 | } | ||
1894 | |||
1895 | - if (IS_SDVOB(sdvo_reg)) | ||
1896 | - dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS; | ||
1897 | - else | ||
1898 | - dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS; | ||
1899 | + hotplug_mask = 0; | ||
1900 | + if (IS_G4X(dev)) { | ||
1901 | + hotplug_mask = IS_SDVOB(sdvo_reg) ? | ||
1902 | + SDVOB_HOTPLUG_INT_STATUS_G4X : SDVOC_HOTPLUG_INT_STATUS_G4X; | ||
1903 | + } else if (IS_GEN4(dev)) { | ||
1904 | + hotplug_mask = IS_SDVOB(sdvo_reg) ? | ||
1905 | + SDVOB_HOTPLUG_INT_STATUS_I965 : SDVOC_HOTPLUG_INT_STATUS_I965; | ||
1906 | + } else { | ||
1907 | + hotplug_mask = IS_SDVOB(sdvo_reg) ? | ||
1908 | + SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; | ||
1909 | + } | ||
1910 | |||
1911 | drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); | ||
1912 | |||
1913 | @@ -2569,14 +2577,6 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) | ||
1914 | if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) | ||
1915 | goto err; | ||
1916 | |||
1917 | - /* Set up hotplug command - note paranoia about contents of reply. | ||
1918 | - * We assume that the hardware is in a sane state, and only touch | ||
1919 | - * the bits we think we understand. | ||
1920 | - */ | ||
1921 | - intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ACTIVE_HOT_PLUG, | ||
1922 | - &intel_sdvo->hotplug_active, 2); | ||
1923 | - intel_sdvo->hotplug_active[0] &= ~0x3; | ||
1924 | - | ||
1925 | if (intel_sdvo_output_setup(intel_sdvo, | ||
1926 | intel_sdvo->caps.output_flags) != true) { | ||
1927 | DRM_DEBUG_KMS("SDVO output failed to setup on SDVO%c\n", | ||
1928 | @@ -2584,6 +2584,12 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) | ||
1929 | goto err; | ||
1930 | } | ||
1931 | |||
1932 | + /* Only enable the hotplug irq if we need it, to work around noisy | ||
1933 | + * hotplug lines. | ||
1934 | + */ | ||
1935 | + if (intel_sdvo->hotplug_active[0]) | ||
1936 | + dev_priv->hotplug_supported_mask |= hotplug_mask; | ||
1937 | + | ||
1938 | intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); | ||
1939 | |||
1940 | /* Set the input timing to the screen. Assume always input 0. */ | ||
1941 | diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c | ||
1942 | index 473f30a..71b6235 100644 | ||
1943 | --- a/drivers/gpu/drm/nouveau/nv04_dfp.c | ||
1944 | +++ b/drivers/gpu/drm/nouveau/nv04_dfp.c | ||
1945 | @@ -504,7 +504,7 @@ static void nv04_dfp_update_backlight(struct drm_encoder *encoder, int mode) | ||
1946 | |||
1947 | static inline bool is_powersaving_dpms(int mode) | ||
1948 | { | ||
1949 | - return (mode != DRM_MODE_DPMS_ON); | ||
1950 | + return mode != DRM_MODE_DPMS_ON && mode != NV_DPMS_CLEARED; | ||
1951 | } | ||
1952 | |||
1953 | static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode) | ||
1954 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1955 | index 19f4082..15594a3 100644 | ||
1956 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1957 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1958 | @@ -1533,8 +1533,12 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | ||
1959 | * crtc virtual pixel clock. | ||
1960 | */ | ||
1961 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_encoder))) { | ||
1962 | - if (ASIC_IS_DCE5(rdev) || rdev->clock.dp_extclk) | ||
1963 | + if (rdev->clock.dp_extclk) | ||
1964 | return ATOM_PPLL_INVALID; | ||
1965 | + else if (ASIC_IS_DCE6(rdev)) | ||
1966 | + return ATOM_PPLL0; | ||
1967 | + else if (ASIC_IS_DCE5(rdev)) | ||
1968 | + return ATOM_DCPLL; | ||
1969 | } | ||
1970 | } | ||
1971 | } | ||
1972 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1973 | index f6176bc..23e3ea6 100644 | ||
1974 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1975 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1976 | @@ -95,7 +95,7 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, | ||
1977 | ((radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) || | ||
1978 | (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE))) { | ||
1979 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
1980 | - radeon_dp_set_link_config(connector, mode); | ||
1981 | + radeon_dp_set_link_config(connector, adjusted_mode); | ||
1982 | } | ||
1983 | |||
1984 | return true; | ||
1985 | diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c | ||
1986 | index 22c84bc..2cbd369 100644 | ||
1987 | --- a/drivers/gpu/drm/radeon/evergreen_cs.c | ||
1988 | +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | ||
1989 | @@ -2670,6 +2670,7 @@ static bool evergreen_vm_reg_valid(u32 reg) | ||
1990 | |||
1991 | /* check config regs */ | ||
1992 | switch (reg) { | ||
1993 | + case WAIT_UNTIL: | ||
1994 | case GRBM_GFX_INDEX: | ||
1995 | case CP_STRMOUT_CNTL: | ||
1996 | case CP_COHER_CNTL: | ||
1997 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1998 | index 3fb7ca9..ab63bcd 100644 | ||
1999 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
2000 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
2001 | @@ -689,7 +689,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | ||
2002 | ret = connector_status_disconnected; | ||
2003 | |||
2004 | if (radeon_connector->ddc_bus) | ||
2005 | - dret = radeon_ddc_probe(radeon_connector); | ||
2006 | + dret = radeon_ddc_probe(radeon_connector, false); | ||
2007 | if (dret) { | ||
2008 | radeon_connector->detected_by_load = false; | ||
2009 | if (radeon_connector->edid) { | ||
2010 | @@ -895,7 +895,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
2011 | return connector->status; | ||
2012 | |||
2013 | if (radeon_connector->ddc_bus) | ||
2014 | - dret = radeon_ddc_probe(radeon_connector); | ||
2015 | + dret = radeon_ddc_probe(radeon_connector, false); | ||
2016 | if (dret) { | ||
2017 | radeon_connector->detected_by_load = false; | ||
2018 | if (radeon_connector->edid) { | ||
2019 | @@ -1335,7 +1335,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | ||
2020 | if (encoder) { | ||
2021 | /* setup ddc on the bridge */ | ||
2022 | radeon_atom_ext_encoder_setup_ddc(encoder); | ||
2023 | - if (radeon_ddc_probe(radeon_connector)) /* try DDC */ | ||
2024 | + /* bridge chips are always aux */ | ||
2025 | + if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */ | ||
2026 | ret = connector_status_connected; | ||
2027 | else if (radeon_connector->dac_load_detect) { /* try load detection */ | ||
2028 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; | ||
2029 | @@ -1353,7 +1354,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | ||
2030 | if (radeon_dp_getdpcd(radeon_connector)) | ||
2031 | ret = connector_status_connected; | ||
2032 | } else { | ||
2033 | - if (radeon_ddc_probe(radeon_connector)) | ||
2034 | + /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */ | ||
2035 | + if (radeon_ddc_probe(radeon_connector, false)) | ||
2036 | ret = connector_status_connected; | ||
2037 | } | ||
2038 | } | ||
2039 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c | ||
2040 | index 0a1d4bd..173b97b 100644 | ||
2041 | --- a/drivers/gpu/drm/radeon/radeon_display.c | ||
2042 | +++ b/drivers/gpu/drm/radeon/radeon_display.c | ||
2043 | @@ -713,10 +713,15 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | ||
2044 | if (radeon_connector->router.ddc_valid) | ||
2045 | radeon_router_select_ddc_port(radeon_connector); | ||
2046 | |||
2047 | - if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | ||
2048 | - (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) || | ||
2049 | - (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != | ||
2050 | - ENCODER_OBJECT_ID_NONE)) { | ||
2051 | + if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != | ||
2052 | + ENCODER_OBJECT_ID_NONE) { | ||
2053 | + struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
2054 | + | ||
2055 | + if (dig->dp_i2c_bus) | ||
2056 | + radeon_connector->edid = drm_get_edid(&radeon_connector->base, | ||
2057 | + &dig->dp_i2c_bus->adapter); | ||
2058 | + } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | ||
2059 | + (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { | ||
2060 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
2061 | |||
2062 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || | ||
2063 | diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c | ||
2064 | index 3edec1c..6076e85 100644 | ||
2065 | --- a/drivers/gpu/drm/radeon/radeon_i2c.c | ||
2066 | +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | ||
2067 | @@ -39,7 +39,7 @@ extern u32 radeon_atom_hw_i2c_func(struct i2c_adapter *adap); | ||
2068 | * radeon_ddc_probe | ||
2069 | * | ||
2070 | */ | ||
2071 | -bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | ||
2072 | +bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux) | ||
2073 | { | ||
2074 | u8 out = 0x0; | ||
2075 | u8 buf[8]; | ||
2076 | @@ -63,7 +63,13 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | ||
2077 | if (radeon_connector->router.ddc_valid) | ||
2078 | radeon_router_select_ddc_port(radeon_connector); | ||
2079 | |||
2080 | - ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | ||
2081 | + if (use_aux) { | ||
2082 | + struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
2083 | + ret = i2c_transfer(&dig->dp_i2c_bus->adapter, msgs, 2); | ||
2084 | + } else { | ||
2085 | + ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | ||
2086 | + } | ||
2087 | + | ||
2088 | if (ret != 2) | ||
2089 | /* Couldn't find an accessible DDC on this connector */ | ||
2090 | return false; | ||
2091 | diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
2092 | index d92f483..53b07a3 100644 | ||
2093 | --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
2094 | +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
2095 | @@ -617,6 +617,14 @@ static enum drm_connector_status radeon_legacy_primary_dac_detect(struct drm_enc | ||
2096 | enum drm_connector_status found = connector_status_disconnected; | ||
2097 | bool color = true; | ||
2098 | |||
2099 | + /* just don't bother on RN50 those chip are often connected to remoting | ||
2100 | + * console hw and often we get failure to load detect those. So to make | ||
2101 | + * everyone happy report the encoder as always connected. | ||
2102 | + */ | ||
2103 | + if (ASIC_IS_RN50(rdev)) { | ||
2104 | + return connector_status_connected; | ||
2105 | + } | ||
2106 | + | ||
2107 | /* save the regs we need */ | ||
2108 | vclk_ecp_cntl = RREG32_PLL(RADEON_VCLK_ECP_CNTL); | ||
2109 | crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); | ||
2110 | diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h | ||
2111 | index 778c1f0..dabfefd 100644 | ||
2112 | --- a/drivers/gpu/drm/radeon/radeon_mode.h | ||
2113 | +++ b/drivers/gpu/drm/radeon/radeon_mode.h | ||
2114 | @@ -527,7 +527,7 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c, | ||
2115 | u8 val); | ||
2116 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); | ||
2117 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); | ||
2118 | -extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector); | ||
2119 | +extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux); | ||
2120 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); | ||
2121 | |||
2122 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); | ||
2123 | diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c | ||
2124 | index 8d9dc44..3234224 100644 | ||
2125 | --- a/drivers/gpu/drm/udl/udl_connector.c | ||
2126 | +++ b/drivers/gpu/drm/udl/udl_connector.c | ||
2127 | @@ -22,13 +22,17 @@ | ||
2128 | static u8 *udl_get_edid(struct udl_device *udl) | ||
2129 | { | ||
2130 | u8 *block; | ||
2131 | - char rbuf[3]; | ||
2132 | + char *rbuf; | ||
2133 | int ret, i; | ||
2134 | |||
2135 | block = kmalloc(EDID_LENGTH, GFP_KERNEL); | ||
2136 | if (block == NULL) | ||
2137 | return NULL; | ||
2138 | |||
2139 | + rbuf = kmalloc(2, GFP_KERNEL); | ||
2140 | + if (rbuf == NULL) | ||
2141 | + goto error; | ||
2142 | + | ||
2143 | for (i = 0; i < EDID_LENGTH; i++) { | ||
2144 | ret = usb_control_msg(udl->ddev->usbdev, | ||
2145 | usb_rcvctrlpipe(udl->ddev->usbdev, 0), (0x02), | ||
2146 | @@ -36,16 +40,17 @@ static u8 *udl_get_edid(struct udl_device *udl) | ||
2147 | HZ); | ||
2148 | if (ret < 1) { | ||
2149 | DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret); | ||
2150 | - i--; | ||
2151 | goto error; | ||
2152 | } | ||
2153 | block[i] = rbuf[1]; | ||
2154 | } | ||
2155 | |||
2156 | + kfree(rbuf); | ||
2157 | return block; | ||
2158 | |||
2159 | error: | ||
2160 | kfree(block); | ||
2161 | + kfree(rbuf); | ||
2162 | return NULL; | ||
2163 | } | ||
2164 | |||
2165 | @@ -59,6 +64,14 @@ static int udl_get_modes(struct drm_connector *connector) | ||
2166 | |||
2167 | connector->display_info.raw_edid = (char *)edid; | ||
2168 | |||
2169 | + /* | ||
2170 | + * We only read the main block, but if the monitor reports extension | ||
2171 | + * blocks then the drm edid code expects them to be present, so patch | ||
2172 | + * the extension count to 0. | ||
2173 | + */ | ||
2174 | + edid->checksum += edid->extensions; | ||
2175 | + edid->extensions = 0; | ||
2176 | + | ||
2177 | drm_mode_connector_update_edid_property(connector, edid); | ||
2178 | ret = drm_add_edid_modes(connector, edid); | ||
2179 | connector->display_info.raw_edid = NULL; | ||
2180 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
2181 | index 41ad6ff..5583899 100644 | ||
2182 | --- a/drivers/hid/hid-ids.h | ||
2183 | +++ b/drivers/hid/hid-ids.h | ||
2184 | @@ -664,6 +664,9 @@ | ||
2185 | #define USB_VENDOR_ID_SIGMA_MICRO 0x1c4f | ||
2186 | #define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD 0x0002 | ||
2187 | |||
2188 | +#define USB_VENDOR_ID_SIGMATEL 0x066F | ||
2189 | +#define USB_DEVICE_ID_SIGMATEL_STMP3780 0x3780 | ||
2190 | + | ||
2191 | #define USB_VENDOR_ID_SKYCABLE 0x1223 | ||
2192 | #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 | ||
2193 | |||
2194 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c | ||
2195 | index dc9697c..9fea98f 100644 | ||
2196 | --- a/drivers/hid/usbhid/hid-quirks.c | ||
2197 | +++ b/drivers/hid/usbhid/hid-quirks.c | ||
2198 | @@ -78,6 +78,7 @@ static const struct hid_blacklist { | ||
2199 | { USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NOGET }, | ||
2200 | { USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008, HID_QUIRK_NOGET }, | ||
2201 | { USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB, HID_QUIRK_NOGET }, | ||
2202 | + { USB_VENDOR_ID_SIGMATEL, USB_DEVICE_ID_SIGMATEL_STMP3780, HID_QUIRK_NOGET }, | ||
2203 | { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, | ||
2204 | { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET }, | ||
2205 | { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET }, | ||
2206 | diff --git a/drivers/hwmon/lm73.c b/drivers/hwmon/lm73.c | ||
2207 | index 8fa2632..7272176 100644 | ||
2208 | --- a/drivers/hwmon/lm73.c | ||
2209 | +++ b/drivers/hwmon/lm73.c | ||
2210 | @@ -49,6 +49,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, | ||
2211 | struct i2c_client *client = to_i2c_client(dev); | ||
2212 | long temp; | ||
2213 | short value; | ||
2214 | + s32 err; | ||
2215 | |||
2216 | int status = kstrtol(buf, 10, &temp); | ||
2217 | if (status < 0) | ||
2218 | @@ -57,8 +58,8 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, | ||
2219 | /* Write value */ | ||
2220 | value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4), | ||
2221 | (LM73_TEMP_MAX*4)) << 5; | ||
2222 | - i2c_smbus_write_word_swapped(client, attr->index, value); | ||
2223 | - return count; | ||
2224 | + err = i2c_smbus_write_word_swapped(client, attr->index, value); | ||
2225 | + return (err < 0) ? err : count; | ||
2226 | } | ||
2227 | |||
2228 | static ssize_t show_temp(struct device *dev, struct device_attribute *da, | ||
2229 | @@ -66,11 +67,16 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da, | ||
2230 | { | ||
2231 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); | ||
2232 | struct i2c_client *client = to_i2c_client(dev); | ||
2233 | + int temp; | ||
2234 | + | ||
2235 | + s32 err = i2c_smbus_read_word_swapped(client, attr->index); | ||
2236 | + if (err < 0) | ||
2237 | + return err; | ||
2238 | + | ||
2239 | /* use integer division instead of equivalent right shift to | ||
2240 | guarantee arithmetic shift and preserve the sign */ | ||
2241 | - int temp = ((s16) (i2c_smbus_read_word_swapped(client, | ||
2242 | - attr->index))*250) / 32; | ||
2243 | - return sprintf(buf, "%d\n", temp); | ||
2244 | + temp = (((s16) err) * 250) / 32; | ||
2245 | + return scnprintf(buf, PAGE_SIZE, "%d\n", temp); | ||
2246 | } | ||
2247 | |||
2248 | |||
2249 | diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h | ||
2250 | index c438e46..3f41d9f 100644 | ||
2251 | --- a/drivers/infiniband/hw/nes/nes.h | ||
2252 | +++ b/drivers/infiniband/hw/nes/nes.h | ||
2253 | @@ -524,6 +524,7 @@ void nes_iwarp_ce_handler(struct nes_device *, struct nes_hw_cq *); | ||
2254 | int nes_destroy_cqp(struct nes_device *); | ||
2255 | int nes_nic_cm_xmit(struct sk_buff *, struct net_device *); | ||
2256 | void nes_recheck_link_status(struct work_struct *work); | ||
2257 | +void nes_terminate_timeout(unsigned long context); | ||
2258 | |||
2259 | /* nes_nic.c */ | ||
2260 | struct net_device *nes_netdev_init(struct nes_device *, void __iomem *); | ||
2261 | diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c | ||
2262 | index d42c9f4..96801c3 100644 | ||
2263 | --- a/drivers/infiniband/hw/nes/nes_hw.c | ||
2264 | +++ b/drivers/infiniband/hw/nes/nes_hw.c | ||
2265 | @@ -75,7 +75,6 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev, | ||
2266 | static void process_critical_error(struct nes_device *nesdev); | ||
2267 | static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number); | ||
2268 | static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode); | ||
2269 | -static void nes_terminate_timeout(unsigned long context); | ||
2270 | static void nes_terminate_start_timer(struct nes_qp *nesqp); | ||
2271 | |||
2272 | #ifdef CONFIG_INFINIBAND_NES_DEBUG | ||
2273 | @@ -3522,7 +3521,7 @@ static void nes_terminate_received(struct nes_device *nesdev, | ||
2274 | } | ||
2275 | |||
2276 | /* Timeout routine in case terminate fails to complete */ | ||
2277 | -static void nes_terminate_timeout(unsigned long context) | ||
2278 | +void nes_terminate_timeout(unsigned long context) | ||
2279 | { | ||
2280 | struct nes_qp *nesqp = (struct nes_qp *)(unsigned long)context; | ||
2281 | |||
2282 | @@ -3532,11 +3531,7 @@ static void nes_terminate_timeout(unsigned long context) | ||
2283 | /* Set a timer in case hw cannot complete the terminate sequence */ | ||
2284 | static void nes_terminate_start_timer(struct nes_qp *nesqp) | ||
2285 | { | ||
2286 | - init_timer(&nesqp->terminate_timer); | ||
2287 | - nesqp->terminate_timer.function = nes_terminate_timeout; | ||
2288 | - nesqp->terminate_timer.expires = jiffies + HZ; | ||
2289 | - nesqp->terminate_timer.data = (unsigned long)nesqp; | ||
2290 | - add_timer(&nesqp->terminate_timer); | ||
2291 | + mod_timer(&nesqp->terminate_timer, (jiffies + HZ)); | ||
2292 | } | ||
2293 | |||
2294 | /** | ||
2295 | diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c | ||
2296 | index 8b8812d..da84ea3 100644 | ||
2297 | --- a/drivers/infiniband/hw/nes/nes_verbs.c | ||
2298 | +++ b/drivers/infiniband/hw/nes/nes_verbs.c | ||
2299 | @@ -1404,6 +1404,9 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, | ||
2300 | } | ||
2301 | |||
2302 | nesqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR); | ||
2303 | + init_timer(&nesqp->terminate_timer); | ||
2304 | + nesqp->terminate_timer.function = nes_terminate_timeout; | ||
2305 | + nesqp->terminate_timer.data = (unsigned long)nesqp; | ||
2306 | |||
2307 | /* update the QP table */ | ||
2308 | nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp; | ||
2309 | @@ -1413,7 +1416,6 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, | ||
2310 | return &nesqp->ibqp; | ||
2311 | } | ||
2312 | |||
2313 | - | ||
2314 | /** | ||
2315 | * nes_clean_cq | ||
2316 | */ | ||
2317 | @@ -2559,6 +2561,11 @@ static struct ib_mr *nes_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | ||
2318 | return ibmr; | ||
2319 | case IWNES_MEMREG_TYPE_QP: | ||
2320 | case IWNES_MEMREG_TYPE_CQ: | ||
2321 | + if (!region->length) { | ||
2322 | + nes_debug(NES_DBG_MR, "Unable to register zero length region for CQ\n"); | ||
2323 | + ib_umem_release(region); | ||
2324 | + return ERR_PTR(-EINVAL); | ||
2325 | + } | ||
2326 | nespbl = kzalloc(sizeof(*nespbl), GFP_KERNEL); | ||
2327 | if (!nespbl) { | ||
2328 | nes_debug(NES_DBG_MR, "Unable to allocate PBL\n"); | ||
2329 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
2330 | index 0d251d3..9c34db8 100644 | ||
2331 | --- a/drivers/iommu/intel-iommu.c | ||
2332 | +++ b/drivers/iommu/intel-iommu.c | ||
2333 | @@ -1826,10 +1826,17 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn, | ||
2334 | if (!pte) | ||
2335 | return -ENOMEM; | ||
2336 | /* It is large page*/ | ||
2337 | - if (largepage_lvl > 1) | ||
2338 | + if (largepage_lvl > 1) { | ||
2339 | pteval |= DMA_PTE_LARGE_PAGE; | ||
2340 | - else | ||
2341 | + /* Ensure that old small page tables are removed to make room | ||
2342 | + for superpage, if they exist. */ | ||
2343 | + dma_pte_clear_range(domain, iov_pfn, | ||
2344 | + iov_pfn + lvl_to_nr_pages(largepage_lvl) - 1); | ||
2345 | + dma_pte_free_pagetable(domain, iov_pfn, | ||
2346 | + iov_pfn + lvl_to_nr_pages(largepage_lvl) - 1); | ||
2347 | + } else { | ||
2348 | pteval &= ~(uint64_t)DMA_PTE_LARGE_PAGE; | ||
2349 | + } | ||
2350 | |||
2351 | } | ||
2352 | /* We don't need lock here, nobody else | ||
2353 | diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c | ||
2354 | index a1a3e6d..f011d4b 100644 | ||
2355 | --- a/drivers/md/dm-ioctl.c | ||
2356 | +++ b/drivers/md/dm-ioctl.c | ||
2357 | @@ -1563,6 +1563,14 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl **param) | ||
2358 | if (copy_from_user(dmi, user, tmp.data_size)) | ||
2359 | goto bad; | ||
2360 | |||
2361 | + /* | ||
2362 | + * Abort if something changed the ioctl data while it was being copied. | ||
2363 | + */ | ||
2364 | + if (dmi->data_size != tmp.data_size) { | ||
2365 | + DMERR("rejecting ioctl: data size modified while processing parameters"); | ||
2366 | + goto bad; | ||
2367 | + } | ||
2368 | + | ||
2369 | /* Wipe the user buffer so we do not return it to userspace */ | ||
2370 | if (secure_data && clear_user(user, tmp.data_size)) | ||
2371 | goto bad; | ||
2372 | diff --git a/drivers/md/persistent-data/dm-btree-internal.h b/drivers/md/persistent-data/dm-btree-internal.h | ||
2373 | index 5709bfe..accbb05 100644 | ||
2374 | --- a/drivers/md/persistent-data/dm-btree-internal.h | ||
2375 | +++ b/drivers/md/persistent-data/dm-btree-internal.h | ||
2376 | @@ -36,13 +36,13 @@ struct node_header { | ||
2377 | __le32 padding; | ||
2378 | } __packed; | ||
2379 | |||
2380 | -struct node { | ||
2381 | +struct btree_node { | ||
2382 | struct node_header header; | ||
2383 | __le64 keys[0]; | ||
2384 | } __packed; | ||
2385 | |||
2386 | |||
2387 | -void inc_children(struct dm_transaction_manager *tm, struct node *n, | ||
2388 | +void inc_children(struct dm_transaction_manager *tm, struct btree_node *n, | ||
2389 | struct dm_btree_value_type *vt); | ||
2390 | |||
2391 | int new_block(struct dm_btree_info *info, struct dm_block **result); | ||
2392 | @@ -64,7 +64,7 @@ struct ro_spine { | ||
2393 | void init_ro_spine(struct ro_spine *s, struct dm_btree_info *info); | ||
2394 | int exit_ro_spine(struct ro_spine *s); | ||
2395 | int ro_step(struct ro_spine *s, dm_block_t new_child); | ||
2396 | -struct node *ro_node(struct ro_spine *s); | ||
2397 | +struct btree_node *ro_node(struct ro_spine *s); | ||
2398 | |||
2399 | struct shadow_spine { | ||
2400 | struct dm_btree_info *info; | ||
2401 | @@ -98,17 +98,17 @@ int shadow_root(struct shadow_spine *s); | ||
2402 | /* | ||
2403 | * Some inlines. | ||
2404 | */ | ||
2405 | -static inline __le64 *key_ptr(struct node *n, uint32_t index) | ||
2406 | +static inline __le64 *key_ptr(struct btree_node *n, uint32_t index) | ||
2407 | { | ||
2408 | return n->keys + index; | ||
2409 | } | ||
2410 | |||
2411 | -static inline void *value_base(struct node *n) | ||
2412 | +static inline void *value_base(struct btree_node *n) | ||
2413 | { | ||
2414 | return &n->keys[le32_to_cpu(n->header.max_entries)]; | ||
2415 | } | ||
2416 | |||
2417 | -static inline void *value_ptr(struct node *n, uint32_t index) | ||
2418 | +static inline void *value_ptr(struct btree_node *n, uint32_t index) | ||
2419 | { | ||
2420 | uint32_t value_size = le32_to_cpu(n->header.value_size); | ||
2421 | return value_base(n) + (value_size * index); | ||
2422 | @@ -117,7 +117,7 @@ static inline void *value_ptr(struct node *n, uint32_t index) | ||
2423 | /* | ||
2424 | * Assumes the values are suitably-aligned and converts to core format. | ||
2425 | */ | ||
2426 | -static inline uint64_t value64(struct node *n, uint32_t index) | ||
2427 | +static inline uint64_t value64(struct btree_node *n, uint32_t index) | ||
2428 | { | ||
2429 | __le64 *values_le = value_base(n); | ||
2430 | |||
2431 | @@ -127,7 +127,7 @@ static inline uint64_t value64(struct node *n, uint32_t index) | ||
2432 | /* | ||
2433 | * Searching for a key within a single node. | ||
2434 | */ | ||
2435 | -int lower_bound(struct node *n, uint64_t key); | ||
2436 | +int lower_bound(struct btree_node *n, uint64_t key); | ||
2437 | |||
2438 | extern struct dm_block_validator btree_node_validator; | ||
2439 | |||
2440 | diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c | ||
2441 | index aa71e23..c4f2813 100644 | ||
2442 | --- a/drivers/md/persistent-data/dm-btree-remove.c | ||
2443 | +++ b/drivers/md/persistent-data/dm-btree-remove.c | ||
2444 | @@ -53,7 +53,7 @@ | ||
2445 | /* | ||
2446 | * Some little utilities for moving node data around. | ||
2447 | */ | ||
2448 | -static void node_shift(struct node *n, int shift) | ||
2449 | +static void node_shift(struct btree_node *n, int shift) | ||
2450 | { | ||
2451 | uint32_t nr_entries = le32_to_cpu(n->header.nr_entries); | ||
2452 | uint32_t value_size = le32_to_cpu(n->header.value_size); | ||
2453 | @@ -79,7 +79,7 @@ static void node_shift(struct node *n, int shift) | ||
2454 | } | ||
2455 | } | ||
2456 | |||
2457 | -static void node_copy(struct node *left, struct node *right, int shift) | ||
2458 | +static void node_copy(struct btree_node *left, struct btree_node *right, int shift) | ||
2459 | { | ||
2460 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
2461 | uint32_t value_size = le32_to_cpu(left->header.value_size); | ||
2462 | @@ -108,7 +108,7 @@ static void node_copy(struct node *left, struct node *right, int shift) | ||
2463 | /* | ||
2464 | * Delete a specific entry from a leaf node. | ||
2465 | */ | ||
2466 | -static void delete_at(struct node *n, unsigned index) | ||
2467 | +static void delete_at(struct btree_node *n, unsigned index) | ||
2468 | { | ||
2469 | unsigned nr_entries = le32_to_cpu(n->header.nr_entries); | ||
2470 | unsigned nr_to_copy = nr_entries - (index + 1); | ||
2471 | @@ -128,7 +128,7 @@ static void delete_at(struct node *n, unsigned index) | ||
2472 | n->header.nr_entries = cpu_to_le32(nr_entries - 1); | ||
2473 | } | ||
2474 | |||
2475 | -static unsigned merge_threshold(struct node *n) | ||
2476 | +static unsigned merge_threshold(struct btree_node *n) | ||
2477 | { | ||
2478 | return le32_to_cpu(n->header.max_entries) / 3; | ||
2479 | } | ||
2480 | @@ -136,7 +136,7 @@ static unsigned merge_threshold(struct node *n) | ||
2481 | struct child { | ||
2482 | unsigned index; | ||
2483 | struct dm_block *block; | ||
2484 | - struct node *n; | ||
2485 | + struct btree_node *n; | ||
2486 | }; | ||
2487 | |||
2488 | static struct dm_btree_value_type le64_type = { | ||
2489 | @@ -147,7 +147,7 @@ static struct dm_btree_value_type le64_type = { | ||
2490 | .equal = NULL | ||
2491 | }; | ||
2492 | |||
2493 | -static int init_child(struct dm_btree_info *info, struct node *parent, | ||
2494 | +static int init_child(struct dm_btree_info *info, struct btree_node *parent, | ||
2495 | unsigned index, struct child *result) | ||
2496 | { | ||
2497 | int r, inc; | ||
2498 | @@ -177,7 +177,7 @@ static int exit_child(struct dm_btree_info *info, struct child *c) | ||
2499 | return dm_tm_unlock(info->tm, c->block); | ||
2500 | } | ||
2501 | |||
2502 | -static void shift(struct node *left, struct node *right, int count) | ||
2503 | +static void shift(struct btree_node *left, struct btree_node *right, int count) | ||
2504 | { | ||
2505 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
2506 | uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
2507 | @@ -203,11 +203,11 @@ static void shift(struct node *left, struct node *right, int count) | ||
2508 | right->header.nr_entries = cpu_to_le32(nr_right + count); | ||
2509 | } | ||
2510 | |||
2511 | -static void __rebalance2(struct dm_btree_info *info, struct node *parent, | ||
2512 | +static void __rebalance2(struct dm_btree_info *info, struct btree_node *parent, | ||
2513 | struct child *l, struct child *r) | ||
2514 | { | ||
2515 | - struct node *left = l->n; | ||
2516 | - struct node *right = r->n; | ||
2517 | + struct btree_node *left = l->n; | ||
2518 | + struct btree_node *right = r->n; | ||
2519 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
2520 | uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
2521 | unsigned threshold = 2 * merge_threshold(left) + 1; | ||
2522 | @@ -239,7 +239,7 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, | ||
2523 | unsigned left_index) | ||
2524 | { | ||
2525 | int r; | ||
2526 | - struct node *parent; | ||
2527 | + struct btree_node *parent; | ||
2528 | struct child left, right; | ||
2529 | |||
2530 | parent = dm_block_data(shadow_current(s)); | ||
2531 | @@ -270,9 +270,9 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, | ||
2532 | * in right, then rebalance2. This wastes some cpu, but I want something | ||
2533 | * simple atm. | ||
2534 | */ | ||
2535 | -static void delete_center_node(struct dm_btree_info *info, struct node *parent, | ||
2536 | +static void delete_center_node(struct dm_btree_info *info, struct btree_node *parent, | ||
2537 | struct child *l, struct child *c, struct child *r, | ||
2538 | - struct node *left, struct node *center, struct node *right, | ||
2539 | + struct btree_node *left, struct btree_node *center, struct btree_node *right, | ||
2540 | uint32_t nr_left, uint32_t nr_center, uint32_t nr_right) | ||
2541 | { | ||
2542 | uint32_t max_entries = le32_to_cpu(left->header.max_entries); | ||
2543 | @@ -301,9 +301,9 @@ static void delete_center_node(struct dm_btree_info *info, struct node *parent, | ||
2544 | /* | ||
2545 | * Redistributes entries among 3 sibling nodes. | ||
2546 | */ | ||
2547 | -static void redistribute3(struct dm_btree_info *info, struct node *parent, | ||
2548 | +static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, | ||
2549 | struct child *l, struct child *c, struct child *r, | ||
2550 | - struct node *left, struct node *center, struct node *right, | ||
2551 | + struct btree_node *left, struct btree_node *center, struct btree_node *right, | ||
2552 | uint32_t nr_left, uint32_t nr_center, uint32_t nr_right) | ||
2553 | { | ||
2554 | int s; | ||
2555 | @@ -343,12 +343,12 @@ static void redistribute3(struct dm_btree_info *info, struct node *parent, | ||
2556 | *key_ptr(parent, r->index) = right->keys[0]; | ||
2557 | } | ||
2558 | |||
2559 | -static void __rebalance3(struct dm_btree_info *info, struct node *parent, | ||
2560 | +static void __rebalance3(struct dm_btree_info *info, struct btree_node *parent, | ||
2561 | struct child *l, struct child *c, struct child *r) | ||
2562 | { | ||
2563 | - struct node *left = l->n; | ||
2564 | - struct node *center = c->n; | ||
2565 | - struct node *right = r->n; | ||
2566 | + struct btree_node *left = l->n; | ||
2567 | + struct btree_node *center = c->n; | ||
2568 | + struct btree_node *right = r->n; | ||
2569 | |||
2570 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
2571 | uint32_t nr_center = le32_to_cpu(center->header.nr_entries); | ||
2572 | @@ -371,7 +371,7 @@ static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, | ||
2573 | unsigned left_index) | ||
2574 | { | ||
2575 | int r; | ||
2576 | - struct node *parent = dm_block_data(shadow_current(s)); | ||
2577 | + struct btree_node *parent = dm_block_data(shadow_current(s)); | ||
2578 | struct child left, center, right; | ||
2579 | |||
2580 | /* | ||
2581 | @@ -421,7 +421,7 @@ static int get_nr_entries(struct dm_transaction_manager *tm, | ||
2582 | { | ||
2583 | int r; | ||
2584 | struct dm_block *block; | ||
2585 | - struct node *n; | ||
2586 | + struct btree_node *n; | ||
2587 | |||
2588 | r = dm_tm_read_lock(tm, b, &btree_node_validator, &block); | ||
2589 | if (r) | ||
2590 | @@ -438,7 +438,7 @@ static int rebalance_children(struct shadow_spine *s, | ||
2591 | { | ||
2592 | int i, r, has_left_sibling, has_right_sibling; | ||
2593 | uint32_t child_entries; | ||
2594 | - struct node *n; | ||
2595 | + struct btree_node *n; | ||
2596 | |||
2597 | n = dm_block_data(shadow_current(s)); | ||
2598 | |||
2599 | @@ -483,7 +483,7 @@ static int rebalance_children(struct shadow_spine *s, | ||
2600 | return r; | ||
2601 | } | ||
2602 | |||
2603 | -static int do_leaf(struct node *n, uint64_t key, unsigned *index) | ||
2604 | +static int do_leaf(struct btree_node *n, uint64_t key, unsigned *index) | ||
2605 | { | ||
2606 | int i = lower_bound(n, key); | ||
2607 | |||
2608 | @@ -506,7 +506,7 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info, | ||
2609 | uint64_t key, unsigned *index) | ||
2610 | { | ||
2611 | int i = *index, r; | ||
2612 | - struct node *n; | ||
2613 | + struct btree_node *n; | ||
2614 | |||
2615 | for (;;) { | ||
2616 | r = shadow_step(s, root, vt); | ||
2617 | @@ -556,7 +556,7 @@ int dm_btree_remove(struct dm_btree_info *info, dm_block_t root, | ||
2618 | unsigned level, last_level = info->levels - 1; | ||
2619 | int index = 0, r = 0; | ||
2620 | struct shadow_spine spine; | ||
2621 | - struct node *n; | ||
2622 | + struct btree_node *n; | ||
2623 | |||
2624 | init_shadow_spine(&spine, info); | ||
2625 | for (level = 0; level < info->levels; level++) { | ||
2626 | diff --git a/drivers/md/persistent-data/dm-btree-spine.c b/drivers/md/persistent-data/dm-btree-spine.c | ||
2627 | index d9a7912..2f0805c 100644 | ||
2628 | --- a/drivers/md/persistent-data/dm-btree-spine.c | ||
2629 | +++ b/drivers/md/persistent-data/dm-btree-spine.c | ||
2630 | @@ -23,7 +23,7 @@ static void node_prepare_for_write(struct dm_block_validator *v, | ||
2631 | struct dm_block *b, | ||
2632 | size_t block_size) | ||
2633 | { | ||
2634 | - struct node *n = dm_block_data(b); | ||
2635 | + struct btree_node *n = dm_block_data(b); | ||
2636 | struct node_header *h = &n->header; | ||
2637 | |||
2638 | h->blocknr = cpu_to_le64(dm_block_location(b)); | ||
2639 | @@ -38,7 +38,7 @@ static int node_check(struct dm_block_validator *v, | ||
2640 | struct dm_block *b, | ||
2641 | size_t block_size) | ||
2642 | { | ||
2643 | - struct node *n = dm_block_data(b); | ||
2644 | + struct btree_node *n = dm_block_data(b); | ||
2645 | struct node_header *h = &n->header; | ||
2646 | size_t value_size; | ||
2647 | __le32 csum_disk; | ||
2648 | @@ -164,7 +164,7 @@ int ro_step(struct ro_spine *s, dm_block_t new_child) | ||
2649 | return r; | ||
2650 | } | ||
2651 | |||
2652 | -struct node *ro_node(struct ro_spine *s) | ||
2653 | +struct btree_node *ro_node(struct ro_spine *s) | ||
2654 | { | ||
2655 | struct dm_block *block; | ||
2656 | |||
2657 | diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c | ||
2658 | index d12b2cc..371f3d4 100644 | ||
2659 | --- a/drivers/md/persistent-data/dm-btree.c | ||
2660 | +++ b/drivers/md/persistent-data/dm-btree.c | ||
2661 | @@ -38,7 +38,7 @@ static void array_insert(void *base, size_t elt_size, unsigned nr_elts, | ||
2662 | /*----------------------------------------------------------------*/ | ||
2663 | |||
2664 | /* makes the assumption that no two keys are the same. */ | ||
2665 | -static int bsearch(struct node *n, uint64_t key, int want_hi) | ||
2666 | +static int bsearch(struct btree_node *n, uint64_t key, int want_hi) | ||
2667 | { | ||
2668 | int lo = -1, hi = le32_to_cpu(n->header.nr_entries); | ||
2669 | |||
2670 | @@ -58,12 +58,12 @@ static int bsearch(struct node *n, uint64_t key, int want_hi) | ||
2671 | return want_hi ? hi : lo; | ||
2672 | } | ||
2673 | |||
2674 | -int lower_bound(struct node *n, uint64_t key) | ||
2675 | +int lower_bound(struct btree_node *n, uint64_t key) | ||
2676 | { | ||
2677 | return bsearch(n, key, 0); | ||
2678 | } | ||
2679 | |||
2680 | -void inc_children(struct dm_transaction_manager *tm, struct node *n, | ||
2681 | +void inc_children(struct dm_transaction_manager *tm, struct btree_node *n, | ||
2682 | struct dm_btree_value_type *vt) | ||
2683 | { | ||
2684 | unsigned i; | ||
2685 | @@ -77,7 +77,7 @@ void inc_children(struct dm_transaction_manager *tm, struct node *n, | ||
2686 | vt->inc(vt->context, value_ptr(n, i)); | ||
2687 | } | ||
2688 | |||
2689 | -static int insert_at(size_t value_size, struct node *node, unsigned index, | ||
2690 | +static int insert_at(size_t value_size, struct btree_node *node, unsigned index, | ||
2691 | uint64_t key, void *value) | ||
2692 | __dm_written_to_disk(value) | ||
2693 | { | ||
2694 | @@ -122,7 +122,7 @@ int dm_btree_empty(struct dm_btree_info *info, dm_block_t *root) | ||
2695 | { | ||
2696 | int r; | ||
2697 | struct dm_block *b; | ||
2698 | - struct node *n; | ||
2699 | + struct btree_node *n; | ||
2700 | size_t block_size; | ||
2701 | uint32_t max_entries; | ||
2702 | |||
2703 | @@ -154,7 +154,7 @@ EXPORT_SYMBOL_GPL(dm_btree_empty); | ||
2704 | #define MAX_SPINE_DEPTH 64 | ||
2705 | struct frame { | ||
2706 | struct dm_block *b; | ||
2707 | - struct node *n; | ||
2708 | + struct btree_node *n; | ||
2709 | unsigned level; | ||
2710 | unsigned nr_children; | ||
2711 | unsigned current_child; | ||
2712 | @@ -295,7 +295,7 @@ EXPORT_SYMBOL_GPL(dm_btree_del); | ||
2713 | /*----------------------------------------------------------------*/ | ||
2714 | |||
2715 | static int btree_lookup_raw(struct ro_spine *s, dm_block_t block, uint64_t key, | ||
2716 | - int (*search_fn)(struct node *, uint64_t), | ||
2717 | + int (*search_fn)(struct btree_node *, uint64_t), | ||
2718 | uint64_t *result_key, void *v, size_t value_size) | ||
2719 | { | ||
2720 | int i, r; | ||
2721 | @@ -406,7 +406,7 @@ static int btree_split_sibling(struct shadow_spine *s, dm_block_t root, | ||
2722 | size_t size; | ||
2723 | unsigned nr_left, nr_right; | ||
2724 | struct dm_block *left, *right, *parent; | ||
2725 | - struct node *ln, *rn, *pn; | ||
2726 | + struct btree_node *ln, *rn, *pn; | ||
2727 | __le64 location; | ||
2728 | |||
2729 | left = shadow_current(s); | ||
2730 | @@ -491,7 +491,7 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key) | ||
2731 | size_t size; | ||
2732 | unsigned nr_left, nr_right; | ||
2733 | struct dm_block *left, *right, *new_parent; | ||
2734 | - struct node *pn, *ln, *rn; | ||
2735 | + struct btree_node *pn, *ln, *rn; | ||
2736 | __le64 val; | ||
2737 | |||
2738 | new_parent = shadow_current(s); | ||
2739 | @@ -576,7 +576,7 @@ static int btree_insert_raw(struct shadow_spine *s, dm_block_t root, | ||
2740 | uint64_t key, unsigned *index) | ||
2741 | { | ||
2742 | int r, i = *index, top = 1; | ||
2743 | - struct node *node; | ||
2744 | + struct btree_node *node; | ||
2745 | |||
2746 | for (;;) { | ||
2747 | r = shadow_step(s, root, vt); | ||
2748 | @@ -643,7 +643,7 @@ static int insert(struct dm_btree_info *info, dm_block_t root, | ||
2749 | unsigned level, index = -1, last_level = info->levels - 1; | ||
2750 | dm_block_t block = root; | ||
2751 | struct shadow_spine spine; | ||
2752 | - struct node *n; | ||
2753 | + struct btree_node *n; | ||
2754 | struct dm_btree_value_type le64_type; | ||
2755 | |||
2756 | le64_type.context = NULL; | ||
2757 | diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c | ||
2758 | index ffc3d48..ef80da6 100644 | ||
2759 | --- a/drivers/mfd/mfd-core.c | ||
2760 | +++ b/drivers/mfd/mfd-core.c | ||
2761 | @@ -19,6 +19,10 @@ | ||
2762 | #include <linux/slab.h> | ||
2763 | #include <linux/module.h> | ||
2764 | |||
2765 | +static struct device_type mfd_dev_type = { | ||
2766 | + .name = "mfd_device", | ||
2767 | +}; | ||
2768 | + | ||
2769 | int mfd_cell_enable(struct platform_device *pdev) | ||
2770 | { | ||
2771 | const struct mfd_cell *cell = mfd_get_cell(pdev); | ||
2772 | @@ -88,6 +92,7 @@ static int mfd_add_device(struct device *parent, int id, | ||
2773 | goto fail_device; | ||
2774 | |||
2775 | pdev->dev.parent = parent; | ||
2776 | + pdev->dev.type = &mfd_dev_type; | ||
2777 | |||
2778 | if (cell->pdata_size) { | ||
2779 | ret = platform_device_add_data(pdev, | ||
2780 | @@ -183,10 +188,16 @@ EXPORT_SYMBOL(mfd_add_devices); | ||
2781 | |||
2782 | static int mfd_remove_devices_fn(struct device *dev, void *c) | ||
2783 | { | ||
2784 | - struct platform_device *pdev = to_platform_device(dev); | ||
2785 | - const struct mfd_cell *cell = mfd_get_cell(pdev); | ||
2786 | + struct platform_device *pdev; | ||
2787 | + const struct mfd_cell *cell; | ||
2788 | atomic_t **usage_count = c; | ||
2789 | |||
2790 | + if (dev->type != &mfd_dev_type) | ||
2791 | + return 0; | ||
2792 | + | ||
2793 | + pdev = to_platform_device(dev); | ||
2794 | + cell = mfd_get_cell(pdev); | ||
2795 | + | ||
2796 | /* find the base address of usage_count pointers (for freeing) */ | ||
2797 | if (!*usage_count || (cell->usage_count < *usage_count)) | ||
2798 | *usage_count = cell->usage_count; | ||
2799 | diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c | ||
2800 | index 9d7ca1e..8d46e68 100644 | ||
2801 | --- a/drivers/mfd/wm8994-core.c | ||
2802 | +++ b/drivers/mfd/wm8994-core.c | ||
2803 | @@ -541,6 +541,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) | ||
2804 | case 1: | ||
2805 | case 2: | ||
2806 | case 3: | ||
2807 | + case 4: | ||
2808 | regmap_patch = wm1811_reva_patch; | ||
2809 | patch_regs = ARRAY_SIZE(wm1811_reva_patch); | ||
2810 | break; | ||
2811 | diff --git a/drivers/mtd/nand/cs553x_nand.c b/drivers/mtd/nand/cs553x_nand.c | ||
2812 | index 821c34c..0b9b472 100644 | ||
2813 | --- a/drivers/mtd/nand/cs553x_nand.c | ||
2814 | +++ b/drivers/mtd/nand/cs553x_nand.c | ||
2815 | @@ -237,6 +237,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) | ||
2816 | this->ecc.hwctl = cs_enable_hwecc; | ||
2817 | this->ecc.calculate = cs_calculate_ecc; | ||
2818 | this->ecc.correct = nand_correct_data; | ||
2819 | + this->ecc.strength = 1; | ||
2820 | |||
2821 | /* Enable the following for a flash based bad block table */ | ||
2822 | this->bbt_options = NAND_BBT_USE_FLASH; | ||
2823 | @@ -248,8 +249,6 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) | ||
2824 | goto out_ior; | ||
2825 | } | ||
2826 | |||
2827 | - this->ecc.strength = 1; | ||
2828 | - | ||
2829 | new_mtd->name = kasprintf(GFP_KERNEL, "cs553x_nand_cs%d", cs); | ||
2830 | |||
2831 | cs553x_mtd[cs] = new_mtd; | ||
2832 | diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c | ||
2833 | index e8ea710..022feb4 100644 | ||
2834 | --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c | ||
2835 | +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c | ||
2836 | @@ -135,6 +135,15 @@ int gpmi_init(struct gpmi_nand_data *this) | ||
2837 | if (ret) | ||
2838 | goto err_out; | ||
2839 | |||
2840 | + /* | ||
2841 | + * Reset BCH here, too. We got failures otherwise :( | ||
2842 | + * See later BCH reset for explanation of MX23 handling | ||
2843 | + */ | ||
2844 | + ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this)); | ||
2845 | + if (ret) | ||
2846 | + goto err_out; | ||
2847 | + | ||
2848 | + | ||
2849 | /* Choose NAND mode. */ | ||
2850 | writel(BM_GPMI_CTRL1_GPMI_MODE, r->gpmi_regs + HW_GPMI_CTRL1_CLR); | ||
2851 | |||
2852 | diff --git a/drivers/net/wimax/i2400m/i2400m-usb.h b/drivers/net/wimax/i2400m/i2400m-usb.h | ||
2853 | index 6650fde..9f1e947 100644 | ||
2854 | --- a/drivers/net/wimax/i2400m/i2400m-usb.h | ||
2855 | +++ b/drivers/net/wimax/i2400m/i2400m-usb.h | ||
2856 | @@ -152,6 +152,9 @@ enum { | ||
2857 | /* Device IDs */ | ||
2858 | USB_DEVICE_ID_I6050 = 0x0186, | ||
2859 | USB_DEVICE_ID_I6050_2 = 0x0188, | ||
2860 | + USB_DEVICE_ID_I6150 = 0x07d6, | ||
2861 | + USB_DEVICE_ID_I6150_2 = 0x07d7, | ||
2862 | + USB_DEVICE_ID_I6150_3 = 0x07d9, | ||
2863 | USB_DEVICE_ID_I6250 = 0x0187, | ||
2864 | }; | ||
2865 | |||
2866 | diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c | ||
2867 | index 29b1e03..f0f16e0 100644 | ||
2868 | --- a/drivers/net/wimax/i2400m/usb.c | ||
2869 | +++ b/drivers/net/wimax/i2400m/usb.c | ||
2870 | @@ -510,6 +510,9 @@ int i2400mu_probe(struct usb_interface *iface, | ||
2871 | switch (id->idProduct) { | ||
2872 | case USB_DEVICE_ID_I6050: | ||
2873 | case USB_DEVICE_ID_I6050_2: | ||
2874 | + case USB_DEVICE_ID_I6150: | ||
2875 | + case USB_DEVICE_ID_I6150_2: | ||
2876 | + case USB_DEVICE_ID_I6150_3: | ||
2877 | case USB_DEVICE_ID_I6250: | ||
2878 | i2400mu->i6050 = 1; | ||
2879 | break; | ||
2880 | @@ -759,6 +762,9 @@ static | ||
2881 | struct usb_device_id i2400mu_id_table[] = { | ||
2882 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050) }, | ||
2883 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050_2) }, | ||
2884 | + { USB_DEVICE(0x8087, USB_DEVICE_ID_I6150) }, | ||
2885 | + { USB_DEVICE(0x8087, USB_DEVICE_ID_I6150_2) }, | ||
2886 | + { USB_DEVICE(0x8087, USB_DEVICE_ID_I6150_3) }, | ||
2887 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6250) }, | ||
2888 | { USB_DEVICE(0x8086, 0x0181) }, | ||
2889 | { USB_DEVICE(0x8086, 0x1403) }, | ||
2890 | diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c | ||
2891 | index 0e643b0..c7d1437 100644 | ||
2892 | --- a/drivers/net/wireless/ath/ath5k/base.c | ||
2893 | +++ b/drivers/net/wireless/ath/ath5k/base.c | ||
2894 | @@ -843,7 +843,7 @@ ath5k_txbuf_free_skb(struct ath5k_hw *ah, struct ath5k_buf *bf) | ||
2895 | return; | ||
2896 | dma_unmap_single(ah->dev, bf->skbaddr, bf->skb->len, | ||
2897 | DMA_TO_DEVICE); | ||
2898 | - dev_kfree_skb_any(bf->skb); | ||
2899 | + ieee80211_free_txskb(ah->hw, bf->skb); | ||
2900 | bf->skb = NULL; | ||
2901 | bf->skbaddr = 0; | ||
2902 | bf->desc->ds_data = 0; | ||
2903 | @@ -1570,7 +1570,7 @@ ath5k_tx_queue(struct ieee80211_hw *hw, struct sk_buff *skb, | ||
2904 | return; | ||
2905 | |||
2906 | drop_packet: | ||
2907 | - dev_kfree_skb_any(skb); | ||
2908 | + ieee80211_free_txskb(hw, skb); | ||
2909 | } | ||
2910 | |||
2911 | static void | ||
2912 | diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c | ||
2913 | index 5c53299..5d1be4d 100644 | ||
2914 | --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c | ||
2915 | +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c | ||
2916 | @@ -59,7 +59,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
2917 | u16 qnum = skb_get_queue_mapping(skb); | ||
2918 | |||
2919 | if (WARN_ON(qnum >= ah->ah_capabilities.cap_queues.q_tx_num)) { | ||
2920 | - dev_kfree_skb_any(skb); | ||
2921 | + ieee80211_free_txskb(hw, skb); | ||
2922 | return; | ||
2923 | } | ||
2924 | |||
2925 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | ||
2926 | index 2b4b633..4e2a52c 100644 | ||
2927 | --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | ||
2928 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | ||
2929 | @@ -533,98 +533,98 @@ static const u32 ar9300_2p2_baseband_core[][2] = { | ||
2930 | |||
2931 | static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = { | ||
2932 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
2933 | - {0x0000a2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, | ||
2934 | - {0x0000a2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, | ||
2935 | - {0x0000a2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, | ||
2936 | + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, | ||
2937 | + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, | ||
2938 | + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, | ||
2939 | {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | ||
2940 | - {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, | ||
2941 | - {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
2942 | - {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, | ||
2943 | - {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, | ||
2944 | - {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, | ||
2945 | - {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, | ||
2946 | - {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, | ||
2947 | - {0x0000a518, 0x21002220, 0x21002220, 0x16000402, 0x16000402}, | ||
2948 | - {0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404}, | ||
2949 | - {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603}, | ||
2950 | - {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02}, | ||
2951 | - {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, | ||
2952 | - {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20}, | ||
2953 | - {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20}, | ||
2954 | - {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22}, | ||
2955 | - {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24}, | ||
2956 | - {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640}, | ||
2957 | - {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660}, | ||
2958 | - {0x0000a544, 0x52022470, 0x52022470, 0x3f001861, 0x3f001861}, | ||
2959 | - {0x0000a548, 0x55022490, 0x55022490, 0x43001a81, 0x43001a81}, | ||
2960 | - {0x0000a54c, 0x59022492, 0x59022492, 0x47001a83, 0x47001a83}, | ||
2961 | - {0x0000a550, 0x5d022692, 0x5d022692, 0x4a001c84, 0x4a001c84}, | ||
2962 | - {0x0000a554, 0x61022892, 0x61022892, 0x4e001ce3, 0x4e001ce3}, | ||
2963 | - {0x0000a558, 0x65024890, 0x65024890, 0x52001ce5, 0x52001ce5}, | ||
2964 | - {0x0000a55c, 0x69024892, 0x69024892, 0x56001ce9, 0x56001ce9}, | ||
2965 | - {0x0000a560, 0x6e024c92, 0x6e024c92, 0x5a001ceb, 0x5a001ceb}, | ||
2966 | - {0x0000a564, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
2967 | - {0x0000a568, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
2968 | - {0x0000a56c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
2969 | - {0x0000a570, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
2970 | - {0x0000a574, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
2971 | - {0x0000a578, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
2972 | - {0x0000a57c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
2973 | - {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | ||
2974 | - {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, | ||
2975 | - {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, | ||
2976 | - {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, | ||
2977 | - {0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, | ||
2978 | - {0x0000a594, 0x1c800223, 0x1c800223, 0x12800400, 0x12800400}, | ||
2979 | - {0x0000a598, 0x21802220, 0x21802220, 0x16800402, 0x16800402}, | ||
2980 | - {0x0000a59c, 0x27802223, 0x27802223, 0x19800404, 0x19800404}, | ||
2981 | - {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1c800603, 0x1c800603}, | ||
2982 | - {0x0000a5a4, 0x2f822222, 0x2f822222, 0x21800a02, 0x21800a02}, | ||
2983 | - {0x0000a5a8, 0x34822225, 0x34822225, 0x25800a04, 0x25800a04}, | ||
2984 | - {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x28800a20, 0x28800a20}, | ||
2985 | - {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2c800e20, 0x2c800e20}, | ||
2986 | - {0x0000a5b4, 0x4282242a, 0x4282242a, 0x30800e22, 0x30800e22}, | ||
2987 | - {0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24}, | ||
2988 | - {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640}, | ||
2989 | - {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660}, | ||
2990 | - {0x0000a5c4, 0x52822470, 0x52822470, 0x3f801861, 0x3f801861}, | ||
2991 | - {0x0000a5c8, 0x55822490, 0x55822490, 0x43801a81, 0x43801a81}, | ||
2992 | - {0x0000a5cc, 0x59822492, 0x59822492, 0x47801a83, 0x47801a83}, | ||
2993 | - {0x0000a5d0, 0x5d822692, 0x5d822692, 0x4a801c84, 0x4a801c84}, | ||
2994 | - {0x0000a5d4, 0x61822892, 0x61822892, 0x4e801ce3, 0x4e801ce3}, | ||
2995 | - {0x0000a5d8, 0x65824890, 0x65824890, 0x52801ce5, 0x52801ce5}, | ||
2996 | - {0x0000a5dc, 0x69824892, 0x69824892, 0x56801ce9, 0x56801ce9}, | ||
2997 | - {0x0000a5e0, 0x6e824c92, 0x6e824c92, 0x5a801ceb, 0x5a801ceb}, | ||
2998 | - {0x0000a5e4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
2999 | - {0x0000a5e8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3000 | - {0x0000a5ec, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3001 | - {0x0000a5f0, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3002 | - {0x0000a5f4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3003 | - {0x0000a5f8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3004 | - {0x0000a5fc, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3005 | + {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9}, | ||
3006 | + {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000}, | ||
3007 | + {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002}, | ||
3008 | + {0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004}, | ||
3009 | + {0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200}, | ||
3010 | + {0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202}, | ||
3011 | + {0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400}, | ||
3012 | + {0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402}, | ||
3013 | + {0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404}, | ||
3014 | + {0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603}, | ||
3015 | + {0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02}, | ||
3016 | + {0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04}, | ||
3017 | + {0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20}, | ||
3018 | + {0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20}, | ||
3019 | + {0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22}, | ||
3020 | + {0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24}, | ||
3021 | + {0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640}, | ||
3022 | + {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660}, | ||
3023 | + {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861}, | ||
3024 | + {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81}, | ||
3025 | + {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83}, | ||
3026 | + {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84}, | ||
3027 | + {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3}, | ||
3028 | + {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5}, | ||
3029 | + {0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9}, | ||
3030 | + {0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb}, | ||
3031 | + {0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3032 | + {0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3033 | + {0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3034 | + {0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3035 | + {0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3036 | + {0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3037 | + {0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3038 | + {0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000}, | ||
3039 | + {0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002}, | ||
3040 | + {0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004}, | ||
3041 | + {0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200}, | ||
3042 | + {0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202}, | ||
3043 | + {0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400}, | ||
3044 | + {0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402}, | ||
3045 | + {0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404}, | ||
3046 | + {0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603}, | ||
3047 | + {0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02}, | ||
3048 | + {0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04}, | ||
3049 | + {0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20}, | ||
3050 | + {0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20}, | ||
3051 | + {0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22}, | ||
3052 | + {0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24}, | ||
3053 | + {0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640}, | ||
3054 | + {0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660}, | ||
3055 | + {0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861}, | ||
3056 | + {0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81}, | ||
3057 | + {0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83}, | ||
3058 | + {0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84}, | ||
3059 | + {0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3}, | ||
3060 | + {0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5}, | ||
3061 | + {0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9}, | ||
3062 | + {0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb}, | ||
3063 | + {0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3064 | + {0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3065 | + {0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3066 | + {0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3067 | + {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3068 | + {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3069 | + {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3070 | {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3071 | {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3072 | {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3073 | {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3074 | - {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3075 | - {0x0000a614, 0x02004000, 0x02004000, 0x01404000, 0x01404000}, | ||
3076 | - {0x0000a618, 0x02004801, 0x02004801, 0x01404501, 0x01404501}, | ||
3077 | - {0x0000a61c, 0x02808a02, 0x02808a02, 0x02008501, 0x02008501}, | ||
3078 | - {0x0000a620, 0x0380ce03, 0x0380ce03, 0x0280ca03, 0x0280ca03}, | ||
3079 | - {0x0000a624, 0x04411104, 0x04411104, 0x03010c04, 0x03010c04}, | ||
3080 | - {0x0000a628, 0x04411104, 0x04411104, 0x04014c04, 0x04014c04}, | ||
3081 | - {0x0000a62c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3082 | - {0x0000a630, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3083 | - {0x0000a634, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3084 | - {0x0000a638, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3085 | - {0x0000a63c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3086 | - {0x0000b2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, | ||
3087 | - {0x0000b2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, | ||
3088 | - {0x0000b2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, | ||
3089 | + {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000}, | ||
3090 | + {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000}, | ||
3091 | + {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501}, | ||
3092 | + {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501}, | ||
3093 | + {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03}, | ||
3094 | + {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04}, | ||
3095 | + {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04}, | ||
3096 | + {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3097 | + {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3098 | + {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3099 | + {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3100 | + {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3101 | + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, | ||
3102 | + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, | ||
3103 | + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, | ||
3104 | {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | ||
3105 | - {0x0000c2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, | ||
3106 | - {0x0000c2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, | ||
3107 | - {0x0000c2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, | ||
3108 | + {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, | ||
3109 | + {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, | ||
3110 | + {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, | ||
3111 | {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | ||
3112 | {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
3113 | {0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, | ||
3114 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | ||
3115 | index bb223fe..582ebc4 100644 | ||
3116 | --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | ||
3117 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | ||
3118 | @@ -69,13 +69,13 @@ | ||
3119 | #define AR9300_BASE_ADDR 0x3ff | ||
3120 | #define AR9300_BASE_ADDR_512 0x1ff | ||
3121 | |||
3122 | -#define AR9300_OTP_BASE 0x14000 | ||
3123 | -#define AR9300_OTP_STATUS 0x15f18 | ||
3124 | +#define AR9300_OTP_BASE (AR_SREV_9340(ah) ? 0x30000 : 0x14000) | ||
3125 | +#define AR9300_OTP_STATUS (AR_SREV_9340(ah) ? 0x30018 : 0x15f18) | ||
3126 | #define AR9300_OTP_STATUS_TYPE 0x7 | ||
3127 | #define AR9300_OTP_STATUS_VALID 0x4 | ||
3128 | #define AR9300_OTP_STATUS_ACCESS_BUSY 0x2 | ||
3129 | #define AR9300_OTP_STATUS_SM_BUSY 0x1 | ||
3130 | -#define AR9300_OTP_READ_DATA 0x15f1c | ||
3131 | +#define AR9300_OTP_READ_DATA (AR_SREV_9340(ah) ? 0x3001c : 0x15f1c) | ||
3132 | |||
3133 | enum targetPowerHTRates { | ||
3134 | HT_TARGET_RATE_0_8_16, | ||
3135 | diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c | ||
3136 | index e5cceb0..bbd249d 100644 | ||
3137 | --- a/drivers/net/wireless/ath/ath9k/calib.c | ||
3138 | +++ b/drivers/net/wireless/ath/ath9k/calib.c | ||
3139 | @@ -69,6 +69,7 @@ s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan) | ||
3140 | |||
3141 | if (chan && chan->noisefloor) { | ||
3142 | s8 delta = chan->noisefloor - | ||
3143 | + ATH9K_NF_CAL_NOISE_THRESH - | ||
3144 | ath9k_hw_get_default_nf(ah, chan); | ||
3145 | if (delta > 0) | ||
3146 | noise += delta; | ||
3147 | diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h | ||
3148 | index 3b33996d..1f2e01a 100644 | ||
3149 | --- a/drivers/net/wireless/ath/ath9k/calib.h | ||
3150 | +++ b/drivers/net/wireless/ath/ath9k/calib.h | ||
3151 | @@ -21,6 +21,9 @@ | ||
3152 | |||
3153 | #define AR_PHY_CCA_FILTERWINDOW_LENGTH 5 | ||
3154 | |||
3155 | +/* Internal noise floor can vary by about 6db depending on the frequency */ | ||
3156 | +#define ATH9K_NF_CAL_NOISE_THRESH 6 | ||
3157 | + | ||
3158 | #define NUM_NF_READINGS 6 | ||
3159 | #define ATH9K_NF_CAL_HIST_MAX 5 | ||
3160 | |||
3161 | diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h | ||
3162 | index 67c13af..05cb5f6 100644 | ||
3163 | --- a/drivers/net/wireless/b43/b43.h | ||
3164 | +++ b/drivers/net/wireless/b43/b43.h | ||
3165 | @@ -7,6 +7,7 @@ | ||
3166 | #include <linux/hw_random.h> | ||
3167 | #include <linux/bcma/bcma.h> | ||
3168 | #include <linux/ssb/ssb.h> | ||
3169 | +#include <linux/completion.h> | ||
3170 | #include <net/mac80211.h> | ||
3171 | |||
3172 | #include "debugfs.h" | ||
3173 | @@ -718,6 +719,10 @@ enum b43_firmware_file_type { | ||
3174 | struct b43_request_fw_context { | ||
3175 | /* The device we are requesting the fw for. */ | ||
3176 | struct b43_wldev *dev; | ||
3177 | + /* a completion event structure needed if this call is asynchronous */ | ||
3178 | + struct completion fw_load_complete; | ||
3179 | + /* a pointer to the firmware object */ | ||
3180 | + const struct firmware *blob; | ||
3181 | /* The type of firmware to request. */ | ||
3182 | enum b43_firmware_file_type req_type; | ||
3183 | /* Error messages for each firmware type. */ | ||
3184 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c | ||
3185 | index 4e465c5..14fd2ca 100644 | ||
3186 | --- a/drivers/net/wireless/b43/main.c | ||
3187 | +++ b/drivers/net/wireless/b43/main.c | ||
3188 | @@ -2088,11 +2088,18 @@ static void b43_print_fw_helptext(struct b43_wl *wl, bool error) | ||
3189 | b43warn(wl, text); | ||
3190 | } | ||
3191 | |||
3192 | +static void b43_fw_cb(const struct firmware *firmware, void *context) | ||
3193 | +{ | ||
3194 | + struct b43_request_fw_context *ctx = context; | ||
3195 | + | ||
3196 | + ctx->blob = firmware; | ||
3197 | + complete(&ctx->fw_load_complete); | ||
3198 | +} | ||
3199 | + | ||
3200 | int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
3201 | const char *name, | ||
3202 | - struct b43_firmware_file *fw) | ||
3203 | + struct b43_firmware_file *fw, bool async) | ||
3204 | { | ||
3205 | - const struct firmware *blob; | ||
3206 | struct b43_fw_header *hdr; | ||
3207 | u32 size; | ||
3208 | int err; | ||
3209 | @@ -2131,11 +2138,31 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
3210 | B43_WARN_ON(1); | ||
3211 | return -ENOSYS; | ||
3212 | } | ||
3213 | - err = request_firmware(&blob, ctx->fwname, ctx->dev->dev->dev); | ||
3214 | + if (async) { | ||
3215 | + /* do this part asynchronously */ | ||
3216 | + init_completion(&ctx->fw_load_complete); | ||
3217 | + err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname, | ||
3218 | + ctx->dev->dev->dev, GFP_KERNEL, | ||
3219 | + ctx, b43_fw_cb); | ||
3220 | + if (err < 0) { | ||
3221 | + pr_err("Unable to load firmware\n"); | ||
3222 | + return err; | ||
3223 | + } | ||
3224 | + /* stall here until fw ready */ | ||
3225 | + wait_for_completion(&ctx->fw_load_complete); | ||
3226 | + if (ctx->blob) | ||
3227 | + goto fw_ready; | ||
3228 | + /* On some ARM systems, the async request will fail, but the next sync | ||
3229 | + * request works. For this reason, we dall through here | ||
3230 | + */ | ||
3231 | + } | ||
3232 | + err = request_firmware(&ctx->blob, ctx->fwname, | ||
3233 | + ctx->dev->dev->dev); | ||
3234 | if (err == -ENOENT) { | ||
3235 | snprintf(ctx->errors[ctx->req_type], | ||
3236 | sizeof(ctx->errors[ctx->req_type]), | ||
3237 | - "Firmware file \"%s\" not found\n", ctx->fwname); | ||
3238 | + "Firmware file \"%s\" not found\n", | ||
3239 | + ctx->fwname); | ||
3240 | return err; | ||
3241 | } else if (err) { | ||
3242 | snprintf(ctx->errors[ctx->req_type], | ||
3243 | @@ -2144,14 +2171,15 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
3244 | ctx->fwname, err); | ||
3245 | return err; | ||
3246 | } | ||
3247 | - if (blob->size < sizeof(struct b43_fw_header)) | ||
3248 | +fw_ready: | ||
3249 | + if (ctx->blob->size < sizeof(struct b43_fw_header)) | ||
3250 | goto err_format; | ||
3251 | - hdr = (struct b43_fw_header *)(blob->data); | ||
3252 | + hdr = (struct b43_fw_header *)(ctx->blob->data); | ||
3253 | switch (hdr->type) { | ||
3254 | case B43_FW_TYPE_UCODE: | ||
3255 | case B43_FW_TYPE_PCM: | ||
3256 | size = be32_to_cpu(hdr->size); | ||
3257 | - if (size != blob->size - sizeof(struct b43_fw_header)) | ||
3258 | + if (size != ctx->blob->size - sizeof(struct b43_fw_header)) | ||
3259 | goto err_format; | ||
3260 | /* fallthrough */ | ||
3261 | case B43_FW_TYPE_IV: | ||
3262 | @@ -2162,7 +2190,7 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
3263 | goto err_format; | ||
3264 | } | ||
3265 | |||
3266 | - fw->data = blob; | ||
3267 | + fw->data = ctx->blob; | ||
3268 | fw->filename = name; | ||
3269 | fw->type = ctx->req_type; | ||
3270 | |||
3271 | @@ -2172,7 +2200,7 @@ err_format: | ||
3272 | snprintf(ctx->errors[ctx->req_type], | ||
3273 | sizeof(ctx->errors[ctx->req_type]), | ||
3274 | "Firmware file \"%s\" format error.\n", ctx->fwname); | ||
3275 | - release_firmware(blob); | ||
3276 | + release_firmware(ctx->blob); | ||
3277 | |||
3278 | return -EPROTO; | ||
3279 | } | ||
3280 | @@ -2223,7 +2251,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
3281 | goto err_no_ucode; | ||
3282 | } | ||
3283 | } | ||
3284 | - err = b43_do_request_fw(ctx, filename, &fw->ucode); | ||
3285 | + err = b43_do_request_fw(ctx, filename, &fw->ucode, true); | ||
3286 | if (err) | ||
3287 | goto err_load; | ||
3288 | |||
3289 | @@ -2235,7 +2263,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
3290 | else | ||
3291 | goto err_no_pcm; | ||
3292 | fw->pcm_request_failed = false; | ||
3293 | - err = b43_do_request_fw(ctx, filename, &fw->pcm); | ||
3294 | + err = b43_do_request_fw(ctx, filename, &fw->pcm, false); | ||
3295 | if (err == -ENOENT) { | ||
3296 | /* We did not find a PCM file? Not fatal, but | ||
3297 | * core rev <= 10 must do without hwcrypto then. */ | ||
3298 | @@ -2296,7 +2324,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
3299 | default: | ||
3300 | goto err_no_initvals; | ||
3301 | } | ||
3302 | - err = b43_do_request_fw(ctx, filename, &fw->initvals); | ||
3303 | + err = b43_do_request_fw(ctx, filename, &fw->initvals, false); | ||
3304 | if (err) | ||
3305 | goto err_load; | ||
3306 | |||
3307 | @@ -2355,7 +2383,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
3308 | default: | ||
3309 | goto err_no_initvals; | ||
3310 | } | ||
3311 | - err = b43_do_request_fw(ctx, filename, &fw->initvals_band); | ||
3312 | + err = b43_do_request_fw(ctx, filename, &fw->initvals_band, false); | ||
3313 | if (err) | ||
3314 | goto err_load; | ||
3315 | |||
3316 | diff --git a/drivers/net/wireless/b43/main.h b/drivers/net/wireless/b43/main.h | ||
3317 | index 8c684cd..abac25e 100644 | ||
3318 | --- a/drivers/net/wireless/b43/main.h | ||
3319 | +++ b/drivers/net/wireless/b43/main.h | ||
3320 | @@ -137,9 +137,8 @@ void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on); | ||
3321 | |||
3322 | |||
3323 | struct b43_request_fw_context; | ||
3324 | -int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
3325 | - const char *name, | ||
3326 | - struct b43_firmware_file *fw); | ||
3327 | +int b43_do_request_fw(struct b43_request_fw_context *ctx, const char *name, | ||
3328 | + struct b43_firmware_file *fw, bool async); | ||
3329 | void b43_do_release_fw(struct b43_firmware_file *fw); | ||
3330 | |||
3331 | #endif /* B43_MAIN_H_ */ | ||
3332 | diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
3333 | index d7b11de..4fb146a 100644 | ||
3334 | --- a/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
3335 | +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
3336 | @@ -53,7 +53,6 @@ int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist, | ||
3337 | */ | ||
3338 | int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter) | ||
3339 | { | ||
3340 | - bool cancel_flag = false; | ||
3341 | int status; | ||
3342 | struct cmd_ctrl_node *cmd_queued; | ||
3343 | |||
3344 | @@ -70,14 +69,11 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter) | ||
3345 | queue_work(adapter->workqueue, &adapter->main_work); | ||
3346 | |||
3347 | /* Wait for completion */ | ||
3348 | - wait_event_interruptible(adapter->cmd_wait_q.wait, | ||
3349 | - *(cmd_queued->condition)); | ||
3350 | - if (!*(cmd_queued->condition)) | ||
3351 | - cancel_flag = true; | ||
3352 | - | ||
3353 | - if (cancel_flag) { | ||
3354 | - mwifiex_cancel_pending_ioctl(adapter); | ||
3355 | - dev_dbg(adapter->dev, "cmd cancel\n"); | ||
3356 | + status = wait_event_interruptible(adapter->cmd_wait_q.wait, | ||
3357 | + *(cmd_queued->condition)); | ||
3358 | + if (status) { | ||
3359 | + dev_err(adapter->dev, "cmd_wait_q terminated: %d\n", status); | ||
3360 | + return status; | ||
3361 | } | ||
3362 | |||
3363 | status = adapter->cmd_wait_q.status; | ||
3364 | @@ -436,8 +432,11 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter) | ||
3365 | return false; | ||
3366 | } | ||
3367 | |||
3368 | - wait_event_interruptible(adapter->hs_activate_wait_q, | ||
3369 | - adapter->hs_activate_wait_q_woken); | ||
3370 | + if (wait_event_interruptible(adapter->hs_activate_wait_q, | ||
3371 | + adapter->hs_activate_wait_q_woken)) { | ||
3372 | + dev_err(adapter->dev, "hs_activate_wait_q terminated\n"); | ||
3373 | + return false; | ||
3374 | + } | ||
3375 | |||
3376 | return true; | ||
3377 | } | ||
3378 | diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c | ||
3379 | index e2a34b4..1afbe5e 100644 | ||
3380 | --- a/drivers/platform/x86/samsung-laptop.c | ||
3381 | +++ b/drivers/platform/x86/samsung-laptop.c | ||
3382 | @@ -1506,6 +1506,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | ||
3383 | }, | ||
3384 | .driver_data = &samsung_broken_acpi_video, | ||
3385 | }, | ||
3386 | + { | ||
3387 | + .callback = samsung_dmi_matched, | ||
3388 | + .ident = "N250P", | ||
3389 | + .matches = { | ||
3390 | + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
3391 | + DMI_MATCH(DMI_PRODUCT_NAME, "N250P"), | ||
3392 | + DMI_MATCH(DMI_BOARD_NAME, "N250P"), | ||
3393 | + }, | ||
3394 | + .driver_data = &samsung_broken_acpi_video, | ||
3395 | + }, | ||
3396 | { }, | ||
3397 | }; | ||
3398 | MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); | ||
3399 | diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c | ||
3400 | index ff810e7..97bb31d 100644 | ||
3401 | --- a/drivers/regulator/wm831x-dcdc.c | ||
3402 | +++ b/drivers/regulator/wm831x-dcdc.c | ||
3403 | @@ -330,7 +330,7 @@ static int wm831x_buckv_set_voltage(struct regulator_dev *rdev, | ||
3404 | if (vsel > dcdc->dvs_vsel) { | ||
3405 | ret = wm831x_set_bits(wm831x, dvs_reg, | ||
3406 | WM831X_DC1_DVS_VSEL_MASK, | ||
3407 | - dcdc->dvs_vsel); | ||
3408 | + vsel); | ||
3409 | if (ret == 0) | ||
3410 | dcdc->dvs_vsel = vsel; | ||
3411 | else | ||
3412 | diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c | ||
3413 | index 07a4fd2..daa6b90 100644 | ||
3414 | --- a/drivers/s390/cio/device_pgid.c | ||
3415 | +++ b/drivers/s390/cio/device_pgid.c | ||
3416 | @@ -234,7 +234,7 @@ static int pgid_cmp(struct pgid *p1, struct pgid *p2) | ||
3417 | * Determine pathgroup state from PGID data. | ||
3418 | */ | ||
3419 | static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, | ||
3420 | - int *mismatch, int *reserved, u8 *reset) | ||
3421 | + int *mismatch, u8 *reserved, u8 *reset) | ||
3422 | { | ||
3423 | struct pgid *pgid = &cdev->private->pgid[0]; | ||
3424 | struct pgid *first = NULL; | ||
3425 | @@ -248,7 +248,7 @@ static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, | ||
3426 | if ((cdev->private->pgid_valid_mask & lpm) == 0) | ||
3427 | continue; | ||
3428 | if (pgid->inf.ps.state2 == SNID_STATE2_RESVD_ELSE) | ||
3429 | - *reserved = 1; | ||
3430 | + *reserved |= lpm; | ||
3431 | if (pgid_is_reset(pgid)) { | ||
3432 | *reset |= lpm; | ||
3433 | continue; | ||
3434 | @@ -316,14 +316,14 @@ static void snid_done(struct ccw_device *cdev, int rc) | ||
3435 | struct subchannel *sch = to_subchannel(cdev->dev.parent); | ||
3436 | struct pgid *pgid; | ||
3437 | int mismatch = 0; | ||
3438 | - int reserved = 0; | ||
3439 | + u8 reserved = 0; | ||
3440 | u8 reset = 0; | ||
3441 | u8 donepm; | ||
3442 | |||
3443 | if (rc) | ||
3444 | goto out; | ||
3445 | pgid_analyze(cdev, &pgid, &mismatch, &reserved, &reset); | ||
3446 | - if (reserved) | ||
3447 | + if (reserved == cdev->private->pgid_valid_mask) | ||
3448 | rc = -EUSERS; | ||
3449 | else if (mismatch) | ||
3450 | rc = -EOPNOTSUPP; | ||
3451 | @@ -336,7 +336,7 @@ static void snid_done(struct ccw_device *cdev, int rc) | ||
3452 | } | ||
3453 | out: | ||
3454 | CIO_MSG_EVENT(2, "snid: device 0.%x.%04x: rc=%d pvm=%02x vpm=%02x " | ||
3455 | - "todo=%02x mism=%d rsvd=%d reset=%02x\n", id->ssid, | ||
3456 | + "todo=%02x mism=%d rsvd=%02x reset=%02x\n", id->ssid, | ||
3457 | id->devno, rc, cdev->private->pgid_valid_mask, sch->vpm, | ||
3458 | cdev->private->pgid_todo_mask, mismatch, reserved, reset); | ||
3459 | switch (rc) { | ||
3460 | diff --git a/drivers/scsi/mvsas/mv_94xx.h b/drivers/scsi/mvsas/mv_94xx.h | ||
3461 | index 8f7eb4f..487aa6f 100644 | ||
3462 | --- a/drivers/scsi/mvsas/mv_94xx.h | ||
3463 | +++ b/drivers/scsi/mvsas/mv_94xx.h | ||
3464 | @@ -258,21 +258,11 @@ enum sas_sata_phy_regs { | ||
3465 | #define SPI_ADDR_VLD_94XX (1U << 1) | ||
3466 | #define SPI_CTRL_SpiStart_94XX (1U << 0) | ||
3467 | |||
3468 | -#define mv_ffc(x) ffz(x) | ||
3469 | - | ||
3470 | static inline int | ||
3471 | mv_ffc64(u64 v) | ||
3472 | { | ||
3473 | - int i; | ||
3474 | - i = mv_ffc((u32)v); | ||
3475 | - if (i >= 0) | ||
3476 | - return i; | ||
3477 | - i = mv_ffc((u32)(v>>32)); | ||
3478 | - | ||
3479 | - if (i != 0) | ||
3480 | - return 32 + i; | ||
3481 | - | ||
3482 | - return -1; | ||
3483 | + u64 x = ~v; | ||
3484 | + return x ? __ffs64(x) : -1; | ||
3485 | } | ||
3486 | |||
3487 | #define r_reg_set_enable(i) \ | ||
3488 | diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c | ||
3489 | index 3006ec9..dbb8edf 100644 | ||
3490 | --- a/drivers/scsi/mvsas/mv_sas.c | ||
3491 | +++ b/drivers/scsi/mvsas/mv_sas.c | ||
3492 | @@ -1629,7 +1629,7 @@ int mvs_abort_task(struct sas_task *task) | ||
3493 | mv_dprintk("mvs_abort_task() mvi=%p task=%p " | ||
3494 | "slot=%p slot_idx=x%x\n", | ||
3495 | mvi, task, slot, slot_idx); | ||
3496 | - mvs_tmf_timedout((unsigned long)task); | ||
3497 | + task->task_state_flags |= SAS_TASK_STATE_ABORTED; | ||
3498 | mvs_slot_task_free(mvi, task, slot, slot_idx); | ||
3499 | rc = TMF_RESP_FUNC_COMPLETE; | ||
3500 | goto out; | ||
3501 | diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h | ||
3502 | index c04a4f5..da24955 100644 | ||
3503 | --- a/drivers/scsi/mvsas/mv_sas.h | ||
3504 | +++ b/drivers/scsi/mvsas/mv_sas.h | ||
3505 | @@ -69,7 +69,7 @@ extern struct kmem_cache *mvs_task_list_cache; | ||
3506 | #define DEV_IS_EXPANDER(type) \ | ||
3507 | ((type == EDGE_DEV) || (type == FANOUT_DEV)) | ||
3508 | |||
3509 | -#define bit(n) ((u32)1 << n) | ||
3510 | +#define bit(n) ((u64)1 << n) | ||
3511 | |||
3512 | #define for_each_phy(__lseq_mask, __mc, __lseq) \ | ||
3513 | for ((__mc) = (__lseq_mask), (__lseq) = 0; \ | ||
3514 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c | ||
3515 | index 7db8033..da1315e 100644 | ||
3516 | --- a/drivers/scsi/qla2xxx/qla_os.c | ||
3517 | +++ b/drivers/scsi/qla2xxx/qla_os.c | ||
3518 | @@ -3735,9 +3735,9 @@ qla2x00_do_dpc(void *data) | ||
3519 | "ISP abort end.\n"); | ||
3520 | } | ||
3521 | |||
3522 | - if (test_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags)) { | ||
3523 | + if (test_and_clear_bit(FCPORT_UPDATE_NEEDED, | ||
3524 | + &base_vha->dpc_flags)) { | ||
3525 | qla2x00_update_fcports(base_vha); | ||
3526 | - clear_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags); | ||
3527 | } | ||
3528 | |||
3529 | if (test_bit(ISP_QUIESCE_NEEDED, &base_vha->dpc_flags)) { | ||
3530 | diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c | ||
3531 | index 08d48a3..72ca515 100644 | ||
3532 | --- a/drivers/scsi/scsi_sysfs.c | ||
3533 | +++ b/drivers/scsi/scsi_sysfs.c | ||
3534 | @@ -246,11 +246,11 @@ show_shost_active_mode(struct device *dev, | ||
3535 | |||
3536 | static DEVICE_ATTR(active_mode, S_IRUGO | S_IWUSR, show_shost_active_mode, NULL); | ||
3537 | |||
3538 | -static int check_reset_type(char *str) | ||
3539 | +static int check_reset_type(const char *str) | ||
3540 | { | ||
3541 | - if (strncmp(str, "adapter", 10) == 0) | ||
3542 | + if (sysfs_streq(str, "adapter")) | ||
3543 | return SCSI_ADAPTER_RESET; | ||
3544 | - else if (strncmp(str, "firmware", 10) == 0) | ||
3545 | + else if (sysfs_streq(str, "firmware")) | ||
3546 | return SCSI_FIRMWARE_RESET; | ||
3547 | else | ||
3548 | return 0; | ||
3549 | @@ -263,12 +263,9 @@ store_host_reset(struct device *dev, struct device_attribute *attr, | ||
3550 | struct Scsi_Host *shost = class_to_shost(dev); | ||
3551 | struct scsi_host_template *sht = shost->hostt; | ||
3552 | int ret = -EINVAL; | ||
3553 | - char str[10]; | ||
3554 | int type; | ||
3555 | |||
3556 | - sscanf(buf, "%s", str); | ||
3557 | - type = check_reset_type(str); | ||
3558 | - | ||
3559 | + type = check_reset_type(buf); | ||
3560 | if (!type) | ||
3561 | goto exit_store_host_reset; | ||
3562 | |||
3563 | diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig | ||
3564 | index 12c691d..f11cfc8 100644 | ||
3565 | --- a/drivers/staging/comedi/Kconfig | ||
3566 | +++ b/drivers/staging/comedi/Kconfig | ||
3567 | @@ -424,6 +424,7 @@ config COMEDI_ADQ12B | ||
3568 | |||
3569 | config COMEDI_NI_AT_A2150 | ||
3570 | tristate "NI AT-A2150 ISA card support" | ||
3571 | + select COMEDI_FC | ||
3572 | depends on COMEDI_NI_COMMON | ||
3573 | depends on VIRT_TO_BUS | ||
3574 | default N | ||
3575 | diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c | ||
3576 | index b719460..b67c107 100644 | ||
3577 | --- a/drivers/staging/comedi/comedi_fops.c | ||
3578 | +++ b/drivers/staging/comedi/comedi_fops.c | ||
3579 | @@ -138,6 +138,9 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd, | ||
3580 | if (cmd == COMEDI_DEVCONFIG) { | ||
3581 | rc = do_devconfig_ioctl(dev, | ||
3582 | (struct comedi_devconfig __user *)arg); | ||
3583 | + if (rc == 0) | ||
3584 | + /* Evade comedi_auto_unconfig(). */ | ||
3585 | + dev_file_info->hardware_device = NULL; | ||
3586 | goto done; | ||
3587 | } | ||
3588 | |||
3589 | @@ -2207,6 +2210,7 @@ int comedi_alloc_board_minor(struct device *hardware_device) | ||
3590 | kfree(info); | ||
3591 | return -ENOMEM; | ||
3592 | } | ||
3593 | + info->hardware_device = hardware_device; | ||
3594 | comedi_device_init(info->device); | ||
3595 | spin_lock_irqsave(&comedi_file_info_table_lock, flags); | ||
3596 | for (i = 0; i < COMEDI_NUM_BOARD_MINORS; ++i) { | ||
3597 | @@ -2295,6 +2299,23 @@ void comedi_free_board_minor(unsigned minor) | ||
3598 | } | ||
3599 | } | ||
3600 | |||
3601 | +int comedi_find_board_minor(struct device *hardware_device) | ||
3602 | +{ | ||
3603 | + int minor; | ||
3604 | + struct comedi_device_file_info *info; | ||
3605 | + | ||
3606 | + for (minor = 0; minor < COMEDI_NUM_BOARD_MINORS; minor++) { | ||
3607 | + spin_lock(&comedi_file_info_table_lock); | ||
3608 | + info = comedi_file_info_table[minor]; | ||
3609 | + if (info && info->hardware_device == hardware_device) { | ||
3610 | + spin_unlock(&comedi_file_info_table_lock); | ||
3611 | + return minor; | ||
3612 | + } | ||
3613 | + spin_unlock(&comedi_file_info_table_lock); | ||
3614 | + } | ||
3615 | + return -ENODEV; | ||
3616 | +} | ||
3617 | + | ||
3618 | int comedi_alloc_subdevice_minor(struct comedi_device *dev, | ||
3619 | struct comedi_subdevice *s) | ||
3620 | { | ||
3621 | diff --git a/drivers/staging/comedi/comedidev.h b/drivers/staging/comedi/comedidev.h | ||
3622 | index 7a0d4bc..00d3c65 100644 | ||
3623 | --- a/drivers/staging/comedi/comedidev.h | ||
3624 | +++ b/drivers/staging/comedi/comedidev.h | ||
3625 | @@ -234,6 +234,7 @@ struct comedi_device_file_info { | ||
3626 | struct comedi_device *device; | ||
3627 | struct comedi_subdevice *read_subdevice; | ||
3628 | struct comedi_subdevice *write_subdevice; | ||
3629 | + struct device *hardware_device; | ||
3630 | }; | ||
3631 | |||
3632 | #ifdef CONFIG_COMEDI_DEBUG | ||
3633 | diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c | ||
3634 | index bf185e2..0fc1b99 100644 | ||
3635 | --- a/drivers/staging/comedi/drivers.c | ||
3636 | +++ b/drivers/staging/comedi/drivers.c | ||
3637 | @@ -822,25 +822,14 @@ static int comedi_auto_config(struct device *hardware_device, | ||
3638 | int minor; | ||
3639 | struct comedi_device_file_info *dev_file_info; | ||
3640 | int retval; | ||
3641 | - unsigned *private_data = NULL; | ||
3642 | |||
3643 | - if (!comedi_autoconfig) { | ||
3644 | - dev_set_drvdata(hardware_device, NULL); | ||
3645 | + if (!comedi_autoconfig) | ||
3646 | return 0; | ||
3647 | - } | ||
3648 | |||
3649 | minor = comedi_alloc_board_minor(hardware_device); | ||
3650 | if (minor < 0) | ||
3651 | return minor; | ||
3652 | |||
3653 | - private_data = kmalloc(sizeof(unsigned), GFP_KERNEL); | ||
3654 | - if (private_data == NULL) { | ||
3655 | - retval = -ENOMEM; | ||
3656 | - goto cleanup; | ||
3657 | - } | ||
3658 | - *private_data = minor; | ||
3659 | - dev_set_drvdata(hardware_device, private_data); | ||
3660 | - | ||
3661 | dev_file_info = comedi_get_device_file_info(minor); | ||
3662 | |||
3663 | memset(&it, 0, sizeof(it)); | ||
3664 | @@ -853,25 +842,22 @@ static int comedi_auto_config(struct device *hardware_device, | ||
3665 | retval = comedi_device_attach(dev_file_info->device, &it); | ||
3666 | mutex_unlock(&dev_file_info->device->mutex); | ||
3667 | |||
3668 | -cleanup: | ||
3669 | - if (retval < 0) { | ||
3670 | - kfree(private_data); | ||
3671 | + if (retval < 0) | ||
3672 | comedi_free_board_minor(minor); | ||
3673 | - } | ||
3674 | return retval; | ||
3675 | } | ||
3676 | |||
3677 | static void comedi_auto_unconfig(struct device *hardware_device) | ||
3678 | { | ||
3679 | - unsigned *minor = (unsigned *)dev_get_drvdata(hardware_device); | ||
3680 | - if (minor == NULL) | ||
3681 | - return; | ||
3682 | - | ||
3683 | - BUG_ON(*minor >= COMEDI_NUM_BOARD_MINORS); | ||
3684 | + int minor; | ||
3685 | |||
3686 | - comedi_free_board_minor(*minor); | ||
3687 | - dev_set_drvdata(hardware_device, NULL); | ||
3688 | - kfree(minor); | ||
3689 | + if (hardware_device == NULL) | ||
3690 | + return; | ||
3691 | + minor = comedi_find_board_minor(hardware_device); | ||
3692 | + if (minor < 0) | ||
3693 | + return; | ||
3694 | + BUG_ON(minor >= COMEDI_NUM_BOARD_MINORS); | ||
3695 | + comedi_free_board_minor(minor); | ||
3696 | } | ||
3697 | |||
3698 | int comedi_pci_auto_config(struct pci_dev *pcidev, const char *board_name) | ||
3699 | diff --git a/drivers/staging/comedi/drivers/comedi_test.c b/drivers/staging/comedi/drivers/comedi_test.c | ||
3700 | index a804742..2567f9a 100644 | ||
3701 | --- a/drivers/staging/comedi/drivers/comedi_test.c | ||
3702 | +++ b/drivers/staging/comedi/drivers/comedi_test.c | ||
3703 | @@ -461,7 +461,7 @@ static int waveform_ai_cancel(struct comedi_device *dev, | ||
3704 | struct comedi_subdevice *s) | ||
3705 | { | ||
3706 | devpriv->timer_running = 0; | ||
3707 | - del_timer(&devpriv->timer); | ||
3708 | + del_timer_sync(&devpriv->timer); | ||
3709 | return 0; | ||
3710 | } | ||
3711 | |||
3712 | diff --git a/drivers/staging/comedi/drivers/ni_pcimio.c b/drivers/staging/comedi/drivers/ni_pcimio.c | ||
3713 | index 27baefa..59c1f88 100644 | ||
3714 | --- a/drivers/staging/comedi/drivers/ni_pcimio.c | ||
3715 | +++ b/drivers/staging/comedi/drivers/ni_pcimio.c | ||
3716 | @@ -1023,7 +1023,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3717 | .ao_range_table = &range_ni_M_625x_ao, | ||
3718 | .reg_type = ni_reg_625x, | ||
3719 | .ao_unipolar = 0, | ||
3720 | - .ao_speed = 357, | ||
3721 | + .ao_speed = 350, | ||
3722 | .num_p0_dio_channels = 8, | ||
3723 | .caldac = {caldac_none}, | ||
3724 | .has_8255 = 0, | ||
3725 | @@ -1042,7 +1042,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3726 | .ao_range_table = &range_ni_M_625x_ao, | ||
3727 | .reg_type = ni_reg_625x, | ||
3728 | .ao_unipolar = 0, | ||
3729 | - .ao_speed = 357, | ||
3730 | + .ao_speed = 350, | ||
3731 | .num_p0_dio_channels = 8, | ||
3732 | .caldac = {caldac_none}, | ||
3733 | .has_8255 = 0, | ||
3734 | @@ -1061,7 +1061,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3735 | .ao_range_table = &range_ni_M_625x_ao, | ||
3736 | .reg_type = ni_reg_625x, | ||
3737 | .ao_unipolar = 0, | ||
3738 | - .ao_speed = 357, | ||
3739 | + .ao_speed = 350, | ||
3740 | .num_p0_dio_channels = 8, | ||
3741 | .caldac = {caldac_none}, | ||
3742 | .has_8255 = 0, | ||
3743 | @@ -1097,7 +1097,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3744 | .ao_range_table = &range_ni_M_625x_ao, | ||
3745 | .reg_type = ni_reg_625x, | ||
3746 | .ao_unipolar = 0, | ||
3747 | - .ao_speed = 357, | ||
3748 | + .ao_speed = 350, | ||
3749 | .num_p0_dio_channels = 32, | ||
3750 | .caldac = {caldac_none}, | ||
3751 | .has_8255 = 0, | ||
3752 | @@ -1116,7 +1116,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3753 | .ao_range_table = &range_ni_M_625x_ao, | ||
3754 | .reg_type = ni_reg_625x, | ||
3755 | .ao_unipolar = 0, | ||
3756 | - .ao_speed = 357, | ||
3757 | + .ao_speed = 350, | ||
3758 | .num_p0_dio_channels = 32, | ||
3759 | .caldac = {caldac_none}, | ||
3760 | .has_8255 = 0, | ||
3761 | @@ -1152,7 +1152,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3762 | .ao_range_table = &range_ni_M_628x_ao, | ||
3763 | .reg_type = ni_reg_628x, | ||
3764 | .ao_unipolar = 1, | ||
3765 | - .ao_speed = 357, | ||
3766 | + .ao_speed = 350, | ||
3767 | .num_p0_dio_channels = 8, | ||
3768 | .caldac = {caldac_none}, | ||
3769 | .has_8255 = 0, | ||
3770 | @@ -1171,7 +1171,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3771 | .ao_range_table = &range_ni_M_628x_ao, | ||
3772 | .reg_type = ni_reg_628x, | ||
3773 | .ao_unipolar = 1, | ||
3774 | - .ao_speed = 357, | ||
3775 | + .ao_speed = 350, | ||
3776 | .num_p0_dio_channels = 8, | ||
3777 | .caldac = {caldac_none}, | ||
3778 | .has_8255 = 0, | ||
3779 | @@ -1207,7 +1207,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
3780 | .ao_range_table = &range_ni_M_628x_ao, | ||
3781 | .reg_type = ni_reg_628x, | ||
3782 | .ao_unipolar = 1, | ||
3783 | - .ao_speed = 357, | ||
3784 | + .ao_speed = 350, | ||
3785 | .num_p0_dio_channels = 32, | ||
3786 | .caldac = {caldac_none}, | ||
3787 | .has_8255 = 0, | ||
3788 | diff --git a/drivers/staging/comedi/internal.h b/drivers/staging/comedi/internal.h | ||
3789 | index 434ce34..4208fb4 100644 | ||
3790 | --- a/drivers/staging/comedi/internal.h | ||
3791 | +++ b/drivers/staging/comedi/internal.h | ||
3792 | @@ -7,6 +7,7 @@ int insn_inval(struct comedi_device *dev, struct comedi_subdevice *s, | ||
3793 | struct comedi_insn *insn, unsigned int *data); | ||
3794 | int comedi_alloc_board_minor(struct device *hardware_device); | ||
3795 | void comedi_free_board_minor(unsigned minor); | ||
3796 | +int comedi_find_board_minor(struct device *hardware_device); | ||
3797 | void comedi_reset_async_buf(struct comedi_async *async); | ||
3798 | int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s, | ||
3799 | unsigned long new_size); | ||
3800 | diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c | ||
3801 | index 2c80745..7b3ae00 100644 | ||
3802 | --- a/drivers/staging/rtl8712/usb_intf.c | ||
3803 | +++ b/drivers/staging/rtl8712/usb_intf.c | ||
3804 | @@ -66,6 +66,8 @@ static struct usb_device_id rtl871x_usb_id_tbl[] = { | ||
3805 | {USB_DEVICE(0x0B05, 0x1791)}, /* 11n mode disable */ | ||
3806 | /* Belkin */ | ||
3807 | {USB_DEVICE(0x050D, 0x945A)}, | ||
3808 | + /* ISY IWL - Belkin clone */ | ||
3809 | + {USB_DEVICE(0x050D, 0x11F1)}, | ||
3810 | /* Corega */ | ||
3811 | {USB_DEVICE(0x07AA, 0x0047)}, | ||
3812 | /* D-Link */ | ||
3813 | diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c | ||
3814 | index 331eae7..5710fc5 100644 | ||
3815 | --- a/drivers/staging/speakup/synth.c | ||
3816 | +++ b/drivers/staging/speakup/synth.c | ||
3817 | @@ -342,7 +342,7 @@ int synth_init(char *synth_name) | ||
3818 | |||
3819 | mutex_lock(&spk_mutex); | ||
3820 | /* First, check if we already have it loaded. */ | ||
3821 | - for (i = 0; synths[i] != NULL && i < MAXSYNTHS; i++) | ||
3822 | + for (i = 0; i < MAXSYNTHS && synths[i] != NULL; i++) | ||
3823 | if (strcmp(synths[i]->name, synth_name) == 0) | ||
3824 | synth = synths[i]; | ||
3825 | |||
3826 | @@ -423,7 +423,7 @@ int synth_add(struct spk_synth *in_synth) | ||
3827 | int i; | ||
3828 | int status = 0; | ||
3829 | mutex_lock(&spk_mutex); | ||
3830 | - for (i = 0; synths[i] != NULL && i < MAXSYNTHS; i++) | ||
3831 | + for (i = 0; i < MAXSYNTHS && synths[i] != NULL; i++) | ||
3832 | /* synth_remove() is responsible for rotating the array down */ | ||
3833 | if (in_synth == synths[i]) { | ||
3834 | mutex_unlock(&spk_mutex); | ||
3835 | diff --git a/drivers/staging/vt6656/dpc.c b/drivers/staging/vt6656/dpc.c | ||
3836 | index 08021f4..4664e9d 100644 | ||
3837 | --- a/drivers/staging/vt6656/dpc.c | ||
3838 | +++ b/drivers/staging/vt6656/dpc.c | ||
3839 | @@ -1238,7 +1238,7 @@ static BOOL s_bHandleRxEncryption ( | ||
3840 | |||
3841 | PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc | ||
3842 | *pdwRxTSC47_16 = cpu_to_le32(*(PDWORD)(pbyIV + 4)); | ||
3843 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %lx\n",*pdwRxTSC47_16); | ||
3844 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %x\n", *pdwRxTSC47_16); | ||
3845 | if (byDecMode == KEY_CTL_TKIP) { | ||
3846 | *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV)); | ||
3847 | } else { | ||
3848 | @@ -1349,7 +1349,7 @@ static BOOL s_bHostWepRxEncryption ( | ||
3849 | |||
3850 | PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc | ||
3851 | *pdwRxTSC47_16 = cpu_to_le32(*(PDWORD)(pbyIV + 4)); | ||
3852 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %lx\n",*pdwRxTSC47_16); | ||
3853 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %x\n", *pdwRxTSC47_16); | ||
3854 | |||
3855 | if (byDecMode == KEY_CTL_TKIP) { | ||
3856 | *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV)); | ||
3857 | diff --git a/drivers/staging/vt6656/key.c b/drivers/staging/vt6656/key.c | ||
3858 | index ee62a06..ba3a561 100644 | ||
3859 | --- a/drivers/staging/vt6656/key.c | ||
3860 | +++ b/drivers/staging/vt6656/key.c | ||
3861 | @@ -223,7 +223,7 @@ BOOL KeybSetKey( | ||
3862 | PSKeyManagement pTable, | ||
3863 | PBYTE pbyBSSID, | ||
3864 | DWORD dwKeyIndex, | ||
3865 | - unsigned long uKeyLength, | ||
3866 | + u32 uKeyLength, | ||
3867 | PQWORD pKeyRSC, | ||
3868 | PBYTE pbyKey, | ||
3869 | BYTE byKeyDecMode | ||
3870 | @@ -235,7 +235,8 @@ BOOL KeybSetKey( | ||
3871 | PSKeyItem pKey; | ||
3872 | unsigned int uKeyIdx; | ||
3873 | |||
3874 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetKey: %lX\n", dwKeyIndex); | ||
3875 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
3876 | + "Enter KeybSetKey: %X\n", dwKeyIndex); | ||
3877 | |||
3878 | j = (MAX_KEY_TABLE-1); | ||
3879 | for (i=0;i<(MAX_KEY_TABLE-1);i++) { | ||
3880 | @@ -261,7 +262,9 @@ BOOL KeybSetKey( | ||
3881 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
3882 | // Group transmit key | ||
3883 | pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex; | ||
3884 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[i].dwGTKeyIndex, i); | ||
3885 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
3886 | + "Group transmit key(R)[%X]: %d\n", | ||
3887 | + pTable->KeyTable[i].dwGTKeyIndex, i); | ||
3888 | } | ||
3889 | pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed | ||
3890 | pTable->KeyTable[i].wKeyCtl |= (byKeyDecMode << 4); | ||
3891 | @@ -302,9 +305,12 @@ BOOL KeybSetKey( | ||
3892 | } | ||
3893 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
3894 | |||
3895 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16); | ||
3896 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0); | ||
3897 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex); | ||
3898 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n ", | ||
3899 | + pKey->dwTSC47_16); | ||
3900 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", | ||
3901 | + pKey->wTSC15_0); | ||
3902 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n ", | ||
3903 | + pKey->dwKeyIndex); | ||
3904 | |||
3905 | return (TRUE); | ||
3906 | } | ||
3907 | @@ -326,7 +332,9 @@ BOOL KeybSetKey( | ||
3908 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
3909 | // Group transmit key | ||
3910 | pTable->KeyTable[j].dwGTKeyIndex = dwKeyIndex; | ||
3911 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(N)[%lX]: %d\n", pTable->KeyTable[j].dwGTKeyIndex, j); | ||
3912 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
3913 | + "Group transmit key(N)[%X]: %d\n", | ||
3914 | + pTable->KeyTable[j].dwGTKeyIndex, j); | ||
3915 | } | ||
3916 | pTable->KeyTable[j].wKeyCtl &= 0xFF0F; // clear group key control filed | ||
3917 | pTable->KeyTable[j].wKeyCtl |= (byKeyDecMode << 4); | ||
3918 | @@ -367,9 +375,11 @@ BOOL KeybSetKey( | ||
3919 | } | ||
3920 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
3921 | |||
3922 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16); | ||
3923 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n ", | ||
3924 | + pKey->dwTSC47_16); | ||
3925 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0); | ||
3926 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex); | ||
3927 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n ", | ||
3928 | + pKey->dwKeyIndex); | ||
3929 | |||
3930 | return (TRUE); | ||
3931 | } | ||
3932 | @@ -597,7 +607,8 @@ BOOL KeybGetTransmitKey(PSKeyManagement pTable, PBYTE pbyBSSID, DWORD dwKeyType, | ||
3933 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x ", pTable->KeyTable[i].abyBSSID[ii]); | ||
3934 | } | ||
3935 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
3936 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"dwGTKeyIndex: %lX\n", pTable->KeyTable[i].dwGTKeyIndex); | ||
3937 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"dwGTKeyIndex: %X\n", | ||
3938 | + pTable->KeyTable[i].dwGTKeyIndex); | ||
3939 | |||
3940 | return (TRUE); | ||
3941 | } | ||
3942 | @@ -664,7 +675,7 @@ BOOL KeybSetDefaultKey( | ||
3943 | void *pDeviceHandler, | ||
3944 | PSKeyManagement pTable, | ||
3945 | DWORD dwKeyIndex, | ||
3946 | - unsigned long uKeyLength, | ||
3947 | + u32 uKeyLength, | ||
3948 | PQWORD pKeyRSC, | ||
3949 | PBYTE pbyKey, | ||
3950 | BYTE byKeyDecMode | ||
3951 | @@ -696,7 +707,10 @@ BOOL KeybSetDefaultKey( | ||
3952 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
3953 | // Group transmit key | ||
3954 | pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex = dwKeyIndex; | ||
3955 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex, MAX_KEY_TABLE-1); | ||
3956 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
3957 | + "Group transmit key(R)[%X]: %d\n", | ||
3958 | + pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex, | ||
3959 | + MAX_KEY_TABLE-1); | ||
3960 | |||
3961 | } | ||
3962 | pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl &= 0x7F00; // clear all key control filed | ||
3963 | @@ -747,9 +761,11 @@ BOOL KeybSetDefaultKey( | ||
3964 | } | ||
3965 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
3966 | |||
3967 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n", pKey->dwTSC47_16); | ||
3968 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n", | ||
3969 | + pKey->dwTSC47_16); | ||
3970 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n", pKey->wTSC15_0); | ||
3971 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n", pKey->dwKeyIndex); | ||
3972 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n", | ||
3973 | + pKey->dwKeyIndex); | ||
3974 | |||
3975 | return (TRUE); | ||
3976 | } | ||
3977 | @@ -775,7 +791,7 @@ BOOL KeybSetAllGroupKey( | ||
3978 | void *pDeviceHandler, | ||
3979 | PSKeyManagement pTable, | ||
3980 | DWORD dwKeyIndex, | ||
3981 | - unsigned long uKeyLength, | ||
3982 | + u32 uKeyLength, | ||
3983 | PQWORD pKeyRSC, | ||
3984 | PBYTE pbyKey, | ||
3985 | BYTE byKeyDecMode | ||
3986 | @@ -787,7 +803,8 @@ BOOL KeybSetAllGroupKey( | ||
3987 | PSKeyItem pKey; | ||
3988 | unsigned int uKeyIdx; | ||
3989 | |||
3990 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetAllGroupKey: %lX\n", dwKeyIndex); | ||
3991 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetAllGroupKey: %X\n", | ||
3992 | + dwKeyIndex); | ||
3993 | |||
3994 | |||
3995 | if ((dwKeyIndex & PAIRWISE_KEY) != 0) { // Pairwise key | ||
3996 | @@ -804,7 +821,9 @@ BOOL KeybSetAllGroupKey( | ||
3997 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
3998 | // Group transmit key | ||
3999 | pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex; | ||
4000 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[i].dwGTKeyIndex, i); | ||
4001 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
4002 | + "Group transmit key(R)[%X]: %d\n", | ||
4003 | + pTable->KeyTable[i].dwGTKeyIndex, i); | ||
4004 | |||
4005 | } | ||
4006 | pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed | ||
4007 | diff --git a/drivers/staging/vt6656/key.h b/drivers/staging/vt6656/key.h | ||
4008 | index f749c7a..bd35d39 100644 | ||
4009 | --- a/drivers/staging/vt6656/key.h | ||
4010 | +++ b/drivers/staging/vt6656/key.h | ||
4011 | @@ -58,7 +58,7 @@ | ||
4012 | typedef struct tagSKeyItem | ||
4013 | { | ||
4014 | BOOL bKeyValid; | ||
4015 | - unsigned long uKeyLength; | ||
4016 | + u32 uKeyLength; | ||
4017 | BYTE abyKey[MAX_KEY_LEN]; | ||
4018 | QWORD KeyRSC; | ||
4019 | DWORD dwTSC47_16; | ||
4020 | @@ -107,7 +107,7 @@ BOOL KeybSetKey( | ||
4021 | PSKeyManagement pTable, | ||
4022 | PBYTE pbyBSSID, | ||
4023 | DWORD dwKeyIndex, | ||
4024 | - unsigned long uKeyLength, | ||
4025 | + u32 uKeyLength, | ||
4026 | PQWORD pKeyRSC, | ||
4027 | PBYTE pbyKey, | ||
4028 | BYTE byKeyDecMode | ||
4029 | @@ -146,7 +146,7 @@ BOOL KeybSetDefaultKey( | ||
4030 | void *pDeviceHandler, | ||
4031 | PSKeyManagement pTable, | ||
4032 | DWORD dwKeyIndex, | ||
4033 | - unsigned long uKeyLength, | ||
4034 | + u32 uKeyLength, | ||
4035 | PQWORD pKeyRSC, | ||
4036 | PBYTE pbyKey, | ||
4037 | BYTE byKeyDecMode | ||
4038 | @@ -156,7 +156,7 @@ BOOL KeybSetAllGroupKey( | ||
4039 | void *pDeviceHandler, | ||
4040 | PSKeyManagement pTable, | ||
4041 | DWORD dwKeyIndex, | ||
4042 | - unsigned long uKeyLength, | ||
4043 | + u32 uKeyLength, | ||
4044 | PQWORD pKeyRSC, | ||
4045 | PBYTE pbyKey, | ||
4046 | BYTE byKeyDecMode | ||
4047 | diff --git a/drivers/staging/vt6656/mac.c b/drivers/staging/vt6656/mac.c | ||
4048 | index af4a29d..8fddc7b 100644 | ||
4049 | --- a/drivers/staging/vt6656/mac.c | ||
4050 | +++ b/drivers/staging/vt6656/mac.c | ||
4051 | @@ -260,7 +260,8 @@ BYTE pbyData[24]; | ||
4052 | dwData1 <<= 16; | ||
4053 | dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5)); | ||
4054 | |||
4055 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl); | ||
4056 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %X,"\ | ||
4057 | + " KeyCtl:%X\n", wOffset, dwData1, wKeyCtl); | ||
4058 | |||
4059 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); | ||
4060 | //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); | ||
4061 | @@ -277,7 +278,8 @@ BYTE pbyData[24]; | ||
4062 | dwData2 <<= 8; | ||
4063 | dwData2 |= *(pbyAddr+0); | ||
4064 | |||
4065 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2); | ||
4066 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %X\n", | ||
4067 | + wOffset, dwData2); | ||
4068 | |||
4069 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); | ||
4070 | //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); | ||
4071 | diff --git a/drivers/staging/vt6656/rf.c b/drivers/staging/vt6656/rf.c | ||
4072 | index 3fd0478..8cf0881 100644 | ||
4073 | --- a/drivers/staging/vt6656/rf.c | ||
4074 | +++ b/drivers/staging/vt6656/rf.c | ||
4075 | @@ -769,6 +769,9 @@ BYTE byPwr = pDevice->byCCKPwr; | ||
4076 | return TRUE; | ||
4077 | } | ||
4078 | |||
4079 | + if (uCH == 0) | ||
4080 | + return -EINVAL; | ||
4081 | + | ||
4082 | switch (uRATE) { | ||
4083 | case RATE_1M: | ||
4084 | case RATE_2M: | ||
4085 | diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c | ||
4086 | index fe21868..3beb126 100644 | ||
4087 | --- a/drivers/staging/vt6656/rxtx.c | ||
4088 | +++ b/drivers/staging/vt6656/rxtx.c | ||
4089 | @@ -377,7 +377,8 @@ s_vFillTxKey ( | ||
4090 | *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV | ||
4091 | // Append IV&ExtIV after Mac Header | ||
4092 | *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16); | ||
4093 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV); | ||
4094 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %x\n", | ||
4095 | + *pdwExtIV); | ||
4096 | |||
4097 | } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { | ||
4098 | pTransmitKey->wTSC15_0++; | ||
4099 | @@ -1753,7 +1754,8 @@ s_bPacketToWirelessUsb( | ||
4100 | MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12); | ||
4101 | dwMIC_Priority = 0; | ||
4102 | MIC_vAppend((PBYTE)&dwMIC_Priority, 4); | ||
4103 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1); | ||
4104 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %X, %X\n", | ||
4105 | + dwMICKey0, dwMICKey1); | ||
4106 | |||
4107 | /////////////////////////////////////////////////////////////////// | ||
4108 | |||
4109 | @@ -2635,7 +2637,8 @@ vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) { | ||
4110 | MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12); | ||
4111 | dwMIC_Priority = 0; | ||
4112 | MIC_vAppend((PBYTE)&dwMIC_Priority, 4); | ||
4113 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1); | ||
4114 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY:"\ | ||
4115 | + " %X, %X\n", dwMICKey0, dwMICKey1); | ||
4116 | |||
4117 | uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen; | ||
4118 | |||
4119 | @@ -2655,7 +2658,8 @@ vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) { | ||
4120 | |||
4121 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize); | ||
4122 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen); | ||
4123 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R); | ||
4124 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%x, %x\n", | ||
4125 | + *pdwMIC_L, *pdwMIC_R); | ||
4126 | |||
4127 | } | ||
4128 | |||
4129 | @@ -3029,7 +3033,8 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) | ||
4130 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n"); | ||
4131 | } | ||
4132 | else { | ||
4133 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex); | ||
4134 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n", | ||
4135 | + pTransmitKey->dwKeyIndex); | ||
4136 | bNeedEncryption = TRUE; | ||
4137 | } | ||
4138 | } | ||
4139 | @@ -3043,7 +3048,8 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) | ||
4140 | if (pDevice->bEnableHostWEP) { | ||
4141 | if ((uNodeIndex != 0) && | ||
4142 | (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) { | ||
4143 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex); | ||
4144 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n", | ||
4145 | + pTransmitKey->dwKeyIndex); | ||
4146 | bNeedEncryption = TRUE; | ||
4147 | } | ||
4148 | } | ||
4149 | diff --git a/drivers/staging/vt6656/ttype.h b/drivers/staging/vt6656/ttype.h | ||
4150 | index 8e9450e..dfbf747 100644 | ||
4151 | --- a/drivers/staging/vt6656/ttype.h | ||
4152 | +++ b/drivers/staging/vt6656/ttype.h | ||
4153 | @@ -29,6 +29,8 @@ | ||
4154 | #ifndef __TTYPE_H__ | ||
4155 | #define __TTYPE_H__ | ||
4156 | |||
4157 | +#include <linux/types.h> | ||
4158 | + | ||
4159 | /******* Common definitions and typedefs ***********************************/ | ||
4160 | |||
4161 | typedef int BOOL; | ||
4162 | @@ -42,17 +44,17 @@ typedef int BOOL; | ||
4163 | |||
4164 | /****** Simple typedefs ***************************************************/ | ||
4165 | |||
4166 | -typedef unsigned char BYTE; // 8-bit | ||
4167 | -typedef unsigned short WORD; // 16-bit | ||
4168 | -typedef unsigned long DWORD; // 32-bit | ||
4169 | +typedef u8 BYTE; | ||
4170 | +typedef u16 WORD; | ||
4171 | +typedef u32 DWORD; | ||
4172 | |||
4173 | // QWORD is for those situation that we want | ||
4174 | // an 8-byte-aligned 8 byte long structure | ||
4175 | // which is NOT really a floating point number. | ||
4176 | typedef union tagUQuadWord { | ||
4177 | struct { | ||
4178 | - DWORD dwLowDword; | ||
4179 | - DWORD dwHighDword; | ||
4180 | + u32 dwLowDword; | ||
4181 | + u32 dwHighDword; | ||
4182 | } u; | ||
4183 | double DoNotUseThisField; | ||
4184 | } UQuadWord; | ||
4185 | @@ -60,8 +62,8 @@ typedef UQuadWord QWORD; // 64-bit | ||
4186 | |||
4187 | /****** Common pointer types ***********************************************/ | ||
4188 | |||
4189 | -typedef unsigned long ULONG_PTR; // 32-bit | ||
4190 | -typedef unsigned long DWORD_PTR; // 32-bit | ||
4191 | +typedef u32 ULONG_PTR; | ||
4192 | +typedef u32 DWORD_PTR; | ||
4193 | |||
4194 | // boolean pointer | ||
4195 | |||
4196 | diff --git a/drivers/staging/vt6656/wcmd.c b/drivers/staging/vt6656/wcmd.c | ||
4197 | index 78ea121..31fb96a 100644 | ||
4198 | --- a/drivers/staging/vt6656/wcmd.c | ||
4199 | +++ b/drivers/staging/vt6656/wcmd.c | ||
4200 | @@ -316,17 +316,19 @@ s_MgrMakeProbeRequest( | ||
4201 | return pTxPacket; | ||
4202 | } | ||
4203 | |||
4204 | -void vCommandTimerWait(void *hDeviceContext, unsigned int MSecond) | ||
4205 | +void vCommandTimerWait(void *hDeviceContext, unsigned long MSecond) | ||
4206 | { | ||
4207 | - PSDevice pDevice = (PSDevice)hDeviceContext; | ||
4208 | + PSDevice pDevice = (PSDevice)hDeviceContext; | ||
4209 | |||
4210 | - init_timer(&pDevice->sTimerCommand); | ||
4211 | - pDevice->sTimerCommand.data = (unsigned long)pDevice; | ||
4212 | - pDevice->sTimerCommand.function = (TimerFunction)vRunCommand; | ||
4213 | - // RUN_AT :1 msec ~= (HZ/1024) | ||
4214 | - pDevice->sTimerCommand.expires = (unsigned int)RUN_AT((MSecond * HZ) >> 10); | ||
4215 | - add_timer(&pDevice->sTimerCommand); | ||
4216 | - return; | ||
4217 | + init_timer(&pDevice->sTimerCommand); | ||
4218 | + | ||
4219 | + pDevice->sTimerCommand.data = (unsigned long)pDevice; | ||
4220 | + pDevice->sTimerCommand.function = (TimerFunction)vRunCommand; | ||
4221 | + pDevice->sTimerCommand.expires = RUN_AT((MSecond * HZ) / 1000); | ||
4222 | + | ||
4223 | + add_timer(&pDevice->sTimerCommand); | ||
4224 | + | ||
4225 | + return; | ||
4226 | } | ||
4227 | |||
4228 | void vRunCommand(void *hDeviceContext) | ||
4229 | diff --git a/drivers/staging/vt6656/wpa2.h b/drivers/staging/vt6656/wpa2.h | ||
4230 | index 46c2959..c359252 100644 | ||
4231 | --- a/drivers/staging/vt6656/wpa2.h | ||
4232 | +++ b/drivers/staging/vt6656/wpa2.h | ||
4233 | @@ -45,8 +45,8 @@ typedef struct tagsPMKIDInfo { | ||
4234 | } PMKIDInfo, *PPMKIDInfo; | ||
4235 | |||
4236 | typedef struct tagSPMKIDCache { | ||
4237 | - unsigned long BSSIDInfoCount; | ||
4238 | - PMKIDInfo BSSIDInfo[MAX_PMKID_CACHE]; | ||
4239 | + u32 BSSIDInfoCount; | ||
4240 | + PMKIDInfo BSSIDInfo[MAX_PMKID_CACHE]; | ||
4241 | } SPMKIDCache, *PSPMKIDCache; | ||
4242 | |||
4243 | |||
4244 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
4245 | index ad202b3..486c5dd 100644 | ||
4246 | --- a/drivers/target/iscsi/iscsi_target.c | ||
4247 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
4248 | @@ -2359,7 +2359,7 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) | ||
4249 | if (!conn_p) | ||
4250 | return; | ||
4251 | |||
4252 | - cmd = iscsit_allocate_cmd(conn_p, GFP_KERNEL); | ||
4253 | + cmd = iscsit_allocate_cmd(conn_p, GFP_ATOMIC); | ||
4254 | if (!cmd) { | ||
4255 | iscsit_dec_conn_usage_count(conn_p); | ||
4256 | return; | ||
4257 | diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c | ||
4258 | index 87901fa..a426c40 100644 | ||
4259 | --- a/drivers/target/tcm_fc/tfc_sess.c | ||
4260 | +++ b/drivers/target/tcm_fc/tfc_sess.c | ||
4261 | @@ -431,7 +431,6 @@ static void ft_sess_rcu_free(struct rcu_head *rcu) | ||
4262 | { | ||
4263 | struct ft_sess *sess = container_of(rcu, struct ft_sess, rcu); | ||
4264 | |||
4265 | - transport_deregister_session(sess->se_sess); | ||
4266 | kfree(sess); | ||
4267 | } | ||
4268 | |||
4269 | @@ -439,6 +438,7 @@ static void ft_sess_free(struct kref *kref) | ||
4270 | { | ||
4271 | struct ft_sess *sess = container_of(kref, struct ft_sess, kref); | ||
4272 | |||
4273 | + transport_deregister_session(sess->se_sess); | ||
4274 | call_rcu(&sess->rcu, ft_sess_rcu_free); | ||
4275 | } | ||
4276 | |||
4277 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
4278 | index b4e87cf..3a7a950 100644 | ||
4279 | --- a/drivers/usb/class/cdc-acm.c | ||
4280 | +++ b/drivers/usb/class/cdc-acm.c | ||
4281 | @@ -1602,6 +1602,9 @@ static const struct usb_device_id acm_ids[] = { | ||
4282 | { USB_DEVICE(0x0572, 0x1340), /* Conexant CX93010-2x UCMxx */ | ||
4283 | .driver_info = NO_UNION_NORMAL, | ||
4284 | }, | ||
4285 | + { USB_DEVICE(0x05f9, 0x4002), /* PSC Scanning, Magellan 800i */ | ||
4286 | + .driver_info = NO_UNION_NORMAL, | ||
4287 | + }, | ||
4288 | { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */ | ||
4289 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ | ||
4290 | }, | ||
4291 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
4292 | index 11344bc..ef8f790 100644 | ||
4293 | --- a/drivers/usb/core/hub.c | ||
4294 | +++ b/drivers/usb/core/hub.c | ||
4295 | @@ -644,6 +644,60 @@ static int hub_hub_status(struct usb_hub *hub, | ||
4296 | return ret; | ||
4297 | } | ||
4298 | |||
4299 | +static int hub_set_port_link_state(struct usb_hub *hub, int port1, | ||
4300 | + unsigned int link_status) | ||
4301 | +{ | ||
4302 | + return set_port_feature(hub->hdev, | ||
4303 | + port1 | (link_status << 3), | ||
4304 | + USB_PORT_FEAT_LINK_STATE); | ||
4305 | +} | ||
4306 | + | ||
4307 | +/* | ||
4308 | + * If USB 3.0 ports are placed into the Disabled state, they will no longer | ||
4309 | + * detect any device connects or disconnects. This is generally not what the | ||
4310 | + * USB core wants, since it expects a disabled port to produce a port status | ||
4311 | + * change event when a new device connects. | ||
4312 | + * | ||
4313 | + * Instead, set the link state to Disabled, wait for the link to settle into | ||
4314 | + * that state, clear any change bits, and then put the port into the RxDetect | ||
4315 | + * state. | ||
4316 | + */ | ||
4317 | +static int hub_usb3_port_disable(struct usb_hub *hub, int port1) | ||
4318 | +{ | ||
4319 | + int ret; | ||
4320 | + int total_time; | ||
4321 | + u16 portchange, portstatus; | ||
4322 | + | ||
4323 | + if (!hub_is_superspeed(hub->hdev)) | ||
4324 | + return -EINVAL; | ||
4325 | + | ||
4326 | + ret = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_SS_DISABLED); | ||
4327 | + if (ret) { | ||
4328 | + dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
4329 | + port1, ret); | ||
4330 | + return ret; | ||
4331 | + } | ||
4332 | + | ||
4333 | + /* Wait for the link to enter the disabled state. */ | ||
4334 | + for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) { | ||
4335 | + ret = hub_port_status(hub, port1, &portstatus, &portchange); | ||
4336 | + if (ret < 0) | ||
4337 | + return ret; | ||
4338 | + | ||
4339 | + if ((portstatus & USB_PORT_STAT_LINK_STATE) == | ||
4340 | + USB_SS_PORT_LS_SS_DISABLED) | ||
4341 | + break; | ||
4342 | + if (total_time >= HUB_DEBOUNCE_TIMEOUT) | ||
4343 | + break; | ||
4344 | + msleep(HUB_DEBOUNCE_STEP); | ||
4345 | + } | ||
4346 | + if (total_time >= HUB_DEBOUNCE_TIMEOUT) | ||
4347 | + dev_warn(hub->intfdev, "Could not disable port %d after %d ms\n", | ||
4348 | + port1, total_time); | ||
4349 | + | ||
4350 | + return hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_RX_DETECT); | ||
4351 | +} | ||
4352 | + | ||
4353 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
4354 | { | ||
4355 | struct usb_device *hdev = hub->hdev; | ||
4356 | @@ -652,8 +706,13 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
4357 | if (hdev->children[port1-1] && set_state) | ||
4358 | usb_set_device_state(hdev->children[port1-1], | ||
4359 | USB_STATE_NOTATTACHED); | ||
4360 | - if (!hub->error && !hub_is_superspeed(hub->hdev)) | ||
4361 | - ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | ||
4362 | + if (!hub->error) { | ||
4363 | + if (hub_is_superspeed(hub->hdev)) | ||
4364 | + ret = hub_usb3_port_disable(hub, port1); | ||
4365 | + else | ||
4366 | + ret = clear_port_feature(hdev, port1, | ||
4367 | + USB_PORT_FEAT_ENABLE); | ||
4368 | + } | ||
4369 | if (ret) | ||
4370 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
4371 | port1, ret); | ||
4372 | @@ -2109,7 +2168,7 @@ static unsigned hub_is_wusb(struct usb_hub *hub) | ||
4373 | #define HUB_SHORT_RESET_TIME 10 | ||
4374 | #define HUB_BH_RESET_TIME 50 | ||
4375 | #define HUB_LONG_RESET_TIME 200 | ||
4376 | -#define HUB_RESET_TIMEOUT 500 | ||
4377 | +#define HUB_RESET_TIMEOUT 800 | ||
4378 | |||
4379 | static int hub_port_reset(struct usb_hub *hub, int port1, | ||
4380 | struct usb_device *udev, unsigned int delay, bool warm); | ||
4381 | @@ -2144,6 +2203,10 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | ||
4382 | if (ret < 0) | ||
4383 | return ret; | ||
4384 | |||
4385 | + /* The port state is unknown until the reset completes. */ | ||
4386 | + if ((portstatus & USB_PORT_STAT_RESET)) | ||
4387 | + goto delay; | ||
4388 | + | ||
4389 | /* | ||
4390 | * Some buggy devices require a warm reset to be issued even | ||
4391 | * when the port appears not to be connected. | ||
4392 | @@ -2189,11 +2252,7 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | ||
4393 | if ((portchange & USB_PORT_STAT_C_CONNECTION)) | ||
4394 | return -ENOTCONN; | ||
4395 | |||
4396 | - /* if we`ve finished resetting, then break out of | ||
4397 | - * the loop | ||
4398 | - */ | ||
4399 | - if (!(portstatus & USB_PORT_STAT_RESET) && | ||
4400 | - (portstatus & USB_PORT_STAT_ENABLE)) { | ||
4401 | + if ((portstatus & USB_PORT_STAT_ENABLE)) { | ||
4402 | if (hub_is_wusb(hub)) | ||
4403 | udev->speed = USB_SPEED_WIRELESS; | ||
4404 | else if (hub_is_superspeed(hub->hdev)) | ||
4405 | @@ -2207,10 +2266,15 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | ||
4406 | return 0; | ||
4407 | } | ||
4408 | } else { | ||
4409 | - if (portchange & USB_PORT_STAT_C_BH_RESET) | ||
4410 | - return 0; | ||
4411 | + if (!(portstatus & USB_PORT_STAT_CONNECTION) || | ||
4412 | + hub_port_warm_reset_required(hub, | ||
4413 | + portstatus)) | ||
4414 | + return -ENOTCONN; | ||
4415 | + | ||
4416 | + return 0; | ||
4417 | } | ||
4418 | |||
4419 | +delay: | ||
4420 | /* switch to the long delay after two short delay failures */ | ||
4421 | if (delay_time >= 2 * HUB_SHORT_RESET_TIME) | ||
4422 | delay = HUB_LONG_RESET_TIME; | ||
4423 | @@ -2234,14 +2298,11 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1, | ||
4424 | msleep(10 + 40); | ||
4425 | update_devnum(udev, 0); | ||
4426 | hcd = bus_to_hcd(udev->bus); | ||
4427 | - if (hcd->driver->reset_device) { | ||
4428 | - *status = hcd->driver->reset_device(hcd, udev); | ||
4429 | - if (*status < 0) { | ||
4430 | - dev_err(&udev->dev, "Cannot reset " | ||
4431 | - "HCD device state\n"); | ||
4432 | - break; | ||
4433 | - } | ||
4434 | - } | ||
4435 | + /* The xHC may think the device is already reset, | ||
4436 | + * so ignore the status. | ||
4437 | + */ | ||
4438 | + if (hcd->driver->reset_device) | ||
4439 | + hcd->driver->reset_device(hcd, udev); | ||
4440 | } | ||
4441 | /* FALL THROUGH */ | ||
4442 | case -ENOTCONN: | ||
4443 | @@ -2249,16 +2310,16 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1, | ||
4444 | clear_port_feature(hub->hdev, | ||
4445 | port1, USB_PORT_FEAT_C_RESET); | ||
4446 | /* FIXME need disconnect() for NOTATTACHED device */ | ||
4447 | - if (warm) { | ||
4448 | + if (hub_is_superspeed(hub->hdev)) { | ||
4449 | clear_port_feature(hub->hdev, port1, | ||
4450 | USB_PORT_FEAT_C_BH_PORT_RESET); | ||
4451 | clear_port_feature(hub->hdev, port1, | ||
4452 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
4453 | - } else { | ||
4454 | + } | ||
4455 | + if (!warm) | ||
4456 | usb_set_device_state(udev, *status | ||
4457 | ? USB_STATE_NOTATTACHED | ||
4458 | : USB_STATE_DEFAULT); | ||
4459 | - } | ||
4460 | break; | ||
4461 | } | ||
4462 | } | ||
4463 | @@ -2548,7 +2609,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | ||
4464 | static int finish_port_resume(struct usb_device *udev) | ||
4465 | { | ||
4466 | int status = 0; | ||
4467 | - u16 devstatus; | ||
4468 | + u16 devstatus = 0; | ||
4469 | |||
4470 | /* caller owns the udev device lock */ | ||
4471 | dev_dbg(&udev->dev, "%s\n", | ||
4472 | @@ -2593,7 +2654,13 @@ static int finish_port_resume(struct usb_device *udev) | ||
4473 | if (status) { | ||
4474 | dev_dbg(&udev->dev, "gone after usb resume? status %d\n", | ||
4475 | status); | ||
4476 | - } else if (udev->actconfig) { | ||
4477 | + /* | ||
4478 | + * There are a few quirky devices which violate the standard | ||
4479 | + * by claiming to have remote wakeup enabled after a reset, | ||
4480 | + * which crash if the feature is cleared, hence check for | ||
4481 | + * udev->reset_resume | ||
4482 | + */ | ||
4483 | + } else if (udev->actconfig && !udev->reset_resume) { | ||
4484 | le16_to_cpus(&devstatus); | ||
4485 | if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { | ||
4486 | status = usb_control_msg(udev, | ||
4487 | @@ -3774,9 +3841,14 @@ static void hub_events(void) | ||
4488 | * SS.Inactive state. | ||
4489 | */ | ||
4490 | if (hub_port_warm_reset_required(hub, portstatus)) { | ||
4491 | + int status; | ||
4492 | + | ||
4493 | dev_dbg(hub_dev, "warm reset port %d\n", i); | ||
4494 | - hub_port_reset(hub, i, NULL, | ||
4495 | + status = hub_port_reset(hub, i, NULL, | ||
4496 | HUB_BH_RESET_TIME, true); | ||
4497 | + if (status < 0) | ||
4498 | + hub_port_disable(hub, i, 1); | ||
4499 | + connect_change = 0; | ||
4500 | } | ||
4501 | |||
4502 | if (connect_change) | ||
4503 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c | ||
4504 | index ef116a5..ab11ca3c 100644 | ||
4505 | --- a/drivers/usb/core/message.c | ||
4506 | +++ b/drivers/usb/core/message.c | ||
4507 | @@ -1770,28 +1770,8 @@ free_interfaces: | ||
4508 | goto free_interfaces; | ||
4509 | } | ||
4510 | |||
4511 | - ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
4512 | - USB_REQ_SET_CONFIGURATION, 0, configuration, 0, | ||
4513 | - NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
4514 | - if (ret < 0) { | ||
4515 | - /* All the old state is gone, so what else can we do? | ||
4516 | - * The device is probably useless now anyway. | ||
4517 | - */ | ||
4518 | - cp = NULL; | ||
4519 | - } | ||
4520 | - | ||
4521 | - dev->actconfig = cp; | ||
4522 | - if (!cp) { | ||
4523 | - usb_set_device_state(dev, USB_STATE_ADDRESS); | ||
4524 | - usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); | ||
4525 | - mutex_unlock(hcd->bandwidth_mutex); | ||
4526 | - usb_autosuspend_device(dev); | ||
4527 | - goto free_interfaces; | ||
4528 | - } | ||
4529 | - mutex_unlock(hcd->bandwidth_mutex); | ||
4530 | - usb_set_device_state(dev, USB_STATE_CONFIGURED); | ||
4531 | - | ||
4532 | - /* Initialize the new interface structures and the | ||
4533 | + /* | ||
4534 | + * Initialize the new interface structures and the | ||
4535 | * hc/hcd/usbcore interface/endpoint state. | ||
4536 | */ | ||
4537 | for (i = 0; i < nintf; ++i) { | ||
4538 | @@ -1835,6 +1815,35 @@ free_interfaces: | ||
4539 | } | ||
4540 | kfree(new_interfaces); | ||
4541 | |||
4542 | + ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
4543 | + USB_REQ_SET_CONFIGURATION, 0, configuration, 0, | ||
4544 | + NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
4545 | + if (ret < 0 && cp) { | ||
4546 | + /* | ||
4547 | + * All the old state is gone, so what else can we do? | ||
4548 | + * The device is probably useless now anyway. | ||
4549 | + */ | ||
4550 | + usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); | ||
4551 | + for (i = 0; i < nintf; ++i) { | ||
4552 | + usb_disable_interface(dev, cp->interface[i], true); | ||
4553 | + put_device(&cp->interface[i]->dev); | ||
4554 | + cp->interface[i] = NULL; | ||
4555 | + } | ||
4556 | + cp = NULL; | ||
4557 | + } | ||
4558 | + | ||
4559 | + dev->actconfig = cp; | ||
4560 | + mutex_unlock(hcd->bandwidth_mutex); | ||
4561 | + | ||
4562 | + if (!cp) { | ||
4563 | + usb_set_device_state(dev, USB_STATE_ADDRESS); | ||
4564 | + | ||
4565 | + /* Leave LPM disabled while the device is unconfigured. */ | ||
4566 | + usb_autosuspend_device(dev); | ||
4567 | + return ret; | ||
4568 | + } | ||
4569 | + usb_set_device_state(dev, USB_STATE_CONFIGURED); | ||
4570 | + | ||
4571 | if (cp->string == NULL && | ||
4572 | !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) | ||
4573 | cp->string = usb_cache_string(dev, cp->desc.iConfiguration); | ||
4574 | diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c | ||
4575 | index 2d277a2..9a7b436 100644 | ||
4576 | --- a/drivers/usb/gadget/dummy_hcd.c | ||
4577 | +++ b/drivers/usb/gadget/dummy_hcd.c | ||
4578 | @@ -126,10 +126,7 @@ static const char ep0name[] = "ep0"; | ||
4579 | static const char *const ep_name[] = { | ||
4580 | ep0name, /* everyone has ep0 */ | ||
4581 | |||
4582 | - /* act like a net2280: high speed, six configurable endpoints */ | ||
4583 | - "ep-a", "ep-b", "ep-c", "ep-d", "ep-e", "ep-f", | ||
4584 | - | ||
4585 | - /* or like pxa250: fifteen fixed function endpoints */ | ||
4586 | + /* act like a pxa250: fifteen fixed function endpoints */ | ||
4587 | "ep1in-bulk", "ep2out-bulk", "ep3in-iso", "ep4out-iso", "ep5in-int", | ||
4588 | "ep6in-bulk", "ep7out-bulk", "ep8in-iso", "ep9out-iso", "ep10in-int", | ||
4589 | "ep11in-bulk", "ep12out-bulk", "ep13in-iso", "ep14out-iso", | ||
4590 | @@ -137,6 +134,10 @@ static const char *const ep_name[] = { | ||
4591 | |||
4592 | /* or like sa1100: two fixed function endpoints */ | ||
4593 | "ep1out-bulk", "ep2in-bulk", | ||
4594 | + | ||
4595 | + /* and now some generic EPs so we have enough in multi config */ | ||
4596 | + "ep3out", "ep4in", "ep5out", "ep6out", "ep7in", "ep8out", "ep9in", | ||
4597 | + "ep10out", "ep11out", "ep12in", "ep13out", "ep14in", "ep15out", | ||
4598 | }; | ||
4599 | #define DUMMY_ENDPOINTS ARRAY_SIZE(ep_name) | ||
4600 | |||
4601 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c | ||
4602 | index de07b75..8331893 100644 | ||
4603 | --- a/drivers/usb/host/xhci-hub.c | ||
4604 | +++ b/drivers/usb/host/xhci-hub.c | ||
4605 | @@ -753,12 +753,39 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | ||
4606 | break; | ||
4607 | case USB_PORT_FEAT_LINK_STATE: | ||
4608 | temp = xhci_readl(xhci, port_array[wIndex]); | ||
4609 | + | ||
4610 | + /* Disable port */ | ||
4611 | + if (link_state == USB_SS_PORT_LS_SS_DISABLED) { | ||
4612 | + xhci_dbg(xhci, "Disable port %d\n", wIndex); | ||
4613 | + temp = xhci_port_state_to_neutral(temp); | ||
4614 | + /* | ||
4615 | + * Clear all change bits, so that we get a new | ||
4616 | + * connection event. | ||
4617 | + */ | ||
4618 | + temp |= PORT_CSC | PORT_PEC | PORT_WRC | | ||
4619 | + PORT_OCC | PORT_RC | PORT_PLC | | ||
4620 | + PORT_CEC; | ||
4621 | + xhci_writel(xhci, temp | PORT_PE, | ||
4622 | + port_array[wIndex]); | ||
4623 | + temp = xhci_readl(xhci, port_array[wIndex]); | ||
4624 | + break; | ||
4625 | + } | ||
4626 | + | ||
4627 | + /* Put link in RxDetect (enable port) */ | ||
4628 | + if (link_state == USB_SS_PORT_LS_RX_DETECT) { | ||
4629 | + xhci_dbg(xhci, "Enable port %d\n", wIndex); | ||
4630 | + xhci_set_link_state(xhci, port_array, wIndex, | ||
4631 | + link_state); | ||
4632 | + temp = xhci_readl(xhci, port_array[wIndex]); | ||
4633 | + break; | ||
4634 | + } | ||
4635 | + | ||
4636 | /* Software should not attempt to set | ||
4637 | - * port link state above '5' (Rx.Detect) and the port | ||
4638 | + * port link state above '3' (U3) and the port | ||
4639 | * must be enabled. | ||
4640 | */ | ||
4641 | if ((temp & PORT_PE) == 0 || | ||
4642 | - (link_state > USB_SS_PORT_LS_RX_DETECT)) { | ||
4643 | + (link_state > USB_SS_PORT_LS_U3)) { | ||
4644 | xhci_warn(xhci, "Cannot set link state.\n"); | ||
4645 | goto error; | ||
4646 | } | ||
4647 | @@ -913,6 +940,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) | ||
4648 | int max_ports; | ||
4649 | __le32 __iomem **port_array; | ||
4650 | struct xhci_bus_state *bus_state; | ||
4651 | + bool reset_change = false; | ||
4652 | |||
4653 | max_ports = xhci_get_ports(hcd, &port_array); | ||
4654 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | ||
4655 | @@ -944,6 +972,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) | ||
4656 | buf[(i + 1) / 8] |= 1 << (i + 1) % 8; | ||
4657 | status = 1; | ||
4658 | } | ||
4659 | + if ((temp & PORT_RC)) | ||
4660 | + reset_change = true; | ||
4661 | + } | ||
4662 | + if (!status && !reset_change) { | ||
4663 | + xhci_dbg(xhci, "%s: stopping port polling.\n", __func__); | ||
4664 | + clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
4665 | } | ||
4666 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
4667 | return status ? retval : 0; | ||
4668 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
4669 | index 3e16f1c..b42a6fb 100644 | ||
4670 | --- a/drivers/usb/host/xhci-mem.c | ||
4671 | +++ b/drivers/usb/host/xhci-mem.c | ||
4672 | @@ -1250,6 +1250,8 @@ static unsigned int xhci_microframes_to_exponent(struct usb_device *udev, | ||
4673 | static unsigned int xhci_parse_microframe_interval(struct usb_device *udev, | ||
4674 | struct usb_host_endpoint *ep) | ||
4675 | { | ||
4676 | + if (ep->desc.bInterval == 0) | ||
4677 | + return 0; | ||
4678 | return xhci_microframes_to_exponent(udev, ep, | ||
4679 | ep->desc.bInterval, 0, 15); | ||
4680 | } | ||
4681 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
4682 | index bf8bcc4..01361f9 100644 | ||
4683 | --- a/drivers/usb/host/xhci-ring.c | ||
4684 | +++ b/drivers/usb/host/xhci-ring.c | ||
4685 | @@ -1725,6 +1725,15 @@ cleanup: | ||
4686 | if (bogus_port_status) | ||
4687 | return; | ||
4688 | |||
4689 | + /* | ||
4690 | + * xHCI port-status-change events occur when the "or" of all the | ||
4691 | + * status-change bits in the portsc register changes from 0 to 1. | ||
4692 | + * New status changes won't cause an event if any other change | ||
4693 | + * bits are still set. When an event occurs, switch over to | ||
4694 | + * polling to avoid losing status changes. | ||
4695 | + */ | ||
4696 | + xhci_dbg(xhci, "%s: starting port polling.\n", __func__); | ||
4697 | + set_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
4698 | spin_unlock(&xhci->lock); | ||
4699 | /* Pass this up to the core */ | ||
4700 | usb_hcd_poll_rh_status(hcd); | ||
4701 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
4702 | index b4063fc..b04134a 100644 | ||
4703 | --- a/drivers/usb/host/xhci.c | ||
4704 | +++ b/drivers/usb/host/xhci.c | ||
4705 | @@ -880,6 +880,11 @@ int xhci_suspend(struct xhci_hcd *xhci) | ||
4706 | struct usb_hcd *hcd = xhci_to_hcd(xhci); | ||
4707 | u32 command; | ||
4708 | |||
4709 | + /* Don't poll the roothubs on bus suspend. */ | ||
4710 | + xhci_dbg(xhci, "%s: stopping port polling.\n", __func__); | ||
4711 | + clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
4712 | + del_timer_sync(&hcd->rh_timer); | ||
4713 | + | ||
4714 | spin_lock_irq(&xhci->lock); | ||
4715 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
4716 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags); | ||
4717 | @@ -1064,6 +1069,11 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
4718 | if (xhci->quirks & XHCI_COMP_MODE_QUIRK) | ||
4719 | compliance_mode_recovery_timer_init(xhci); | ||
4720 | |||
4721 | + /* Re-enable port polling. */ | ||
4722 | + xhci_dbg(xhci, "%s: starting port polling.\n", __func__); | ||
4723 | + set_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
4724 | + usb_hcd_poll_rh_status(hcd); | ||
4725 | + | ||
4726 | return retval; | ||
4727 | } | ||
4728 | #endif /* CONFIG_PM */ | ||
4729 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c | ||
4730 | index 66aaccf..a2b4008 100644 | ||
4731 | --- a/drivers/usb/musb/musb_core.c | ||
4732 | +++ b/drivers/usb/musb/musb_core.c | ||
4733 | @@ -2400,10 +2400,7 @@ static int __init musb_init(void) | ||
4734 | if (usb_disabled()) | ||
4735 | return 0; | ||
4736 | |||
4737 | - pr_info("%s: version " MUSB_VERSION ", " | ||
4738 | - "?dma?" | ||
4739 | - ", " | ||
4740 | - "otg (peripheral+host)", | ||
4741 | + pr_info("%s: version " MUSB_VERSION ", ?dma?, otg (peripheral+host)\n", | ||
4742 | musb_driver_name); | ||
4743 | return platform_driver_register(&musb_driver); | ||
4744 | } | ||
4745 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
4746 | index 25903f5..3fbf39d 100644 | ||
4747 | --- a/drivers/usb/serial/ftdi_sio.c | ||
4748 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
4749 | @@ -881,6 +881,8 @@ static struct usb_device_id id_table_combined [] = { | ||
4750 | { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), | ||
4751 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
4752 | { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) }, | ||
4753 | + /* Crucible Devices */ | ||
4754 | + { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, | ||
4755 | { }, /* Optional parameter entry */ | ||
4756 | { } /* Terminating entry */ | ||
4757 | }; | ||
4758 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
4759 | index 049b6e7..fa5d560 100644 | ||
4760 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
4761 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
4762 | @@ -1259,3 +1259,9 @@ | ||
4763 | * ATI command output: Cinterion MC55i | ||
4764 | */ | ||
4765 | #define FTDI_CINTERION_MC55I_PID 0xA951 | ||
4766 | + | ||
4767 | +/* | ||
4768 | + * Product: Comet Caller ID decoder | ||
4769 | + * Manufacturer: Crucible Technologies | ||
4770 | + */ | ||
4771 | +#define FTDI_CT_COMET_PID 0x8e08 | ||
4772 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
4773 | index 0c3d290..ba23ad5 100644 | ||
4774 | --- a/drivers/usb/serial/option.c | ||
4775 | +++ b/drivers/usb/serial/option.c | ||
4776 | @@ -288,6 +288,7 @@ static void option_instat_callback(struct urb *urb); | ||
4777 | #define ALCATEL_VENDOR_ID 0x1bbb | ||
4778 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 | ||
4779 | #define ALCATEL_PRODUCT_X220_X500D 0x0017 | ||
4780 | +#define ALCATEL_PRODUCT_L100V 0x011e | ||
4781 | |||
4782 | #define PIRELLI_VENDOR_ID 0x1266 | ||
4783 | #define PIRELLI_PRODUCT_C100_1 0x1002 | ||
4784 | @@ -429,9 +430,12 @@ static void option_instat_callback(struct urb *urb); | ||
4785 | #define MEDIATEK_VENDOR_ID 0x0e8d | ||
4786 | #define MEDIATEK_PRODUCT_DC_1COM 0x00a0 | ||
4787 | #define MEDIATEK_PRODUCT_DC_4COM 0x00a5 | ||
4788 | +#define MEDIATEK_PRODUCT_DC_4COM2 0x00a7 | ||
4789 | #define MEDIATEK_PRODUCT_DC_5COM 0x00a4 | ||
4790 | #define MEDIATEK_PRODUCT_7208_1COM 0x7101 | ||
4791 | #define MEDIATEK_PRODUCT_7208_2COM 0x7102 | ||
4792 | +#define MEDIATEK_PRODUCT_7103_2COM 0x7103 | ||
4793 | +#define MEDIATEK_PRODUCT_7106_2COM 0x7106 | ||
4794 | #define MEDIATEK_PRODUCT_FP_1COM 0x0003 | ||
4795 | #define MEDIATEK_PRODUCT_FP_2COM 0x0023 | ||
4796 | #define MEDIATEK_PRODUCT_FPDC_1COM 0x0043 | ||
4797 | @@ -441,6 +445,10 @@ static void option_instat_callback(struct urb *urb); | ||
4798 | #define CELLIENT_VENDOR_ID 0x2692 | ||
4799 | #define CELLIENT_PRODUCT_MEN200 0x9005 | ||
4800 | |||
4801 | +/* Hyundai Petatel Inc. products */ | ||
4802 | +#define PETATEL_VENDOR_ID 0x1ff4 | ||
4803 | +#define PETATEL_PRODUCT_NP10T 0x600e | ||
4804 | + | ||
4805 | /* some devices interfaces need special handling due to a number of reasons */ | ||
4806 | enum option_blacklist_reason { | ||
4807 | OPTION_BLACKLIST_NONE = 0, | ||
4808 | @@ -923,7 +931,8 @@ static const struct usb_device_id option_ids[] = { | ||
4809 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ | ||
4810 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
4811 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) }, | ||
4812 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff) }, | ||
4813 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff), /* ZTE MF880 */ | ||
4814 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
4815 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) }, | ||
4816 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), | ||
4817 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
4818 | @@ -1190,6 +1199,8 @@ static const struct usb_device_id option_ids[] = { | ||
4819 | .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist | ||
4820 | }, | ||
4821 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D) }, | ||
4822 | + { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), | ||
4823 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
4824 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | ||
4825 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | ||
4826 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), | ||
4827 | @@ -1294,7 +1305,12 @@ static const struct usb_device_id option_ids[] = { | ||
4828 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FP_2COM, 0x0a, 0x00, 0x00) }, | ||
4829 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FPDC_1COM, 0x0a, 0x00, 0x00) }, | ||
4830 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FPDC_2COM, 0x0a, 0x00, 0x00) }, | ||
4831 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_7103_2COM, 0xff, 0x00, 0x00) }, | ||
4832 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_7106_2COM, 0x02, 0x02, 0x01) }, | ||
4833 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x02, 0x01) }, | ||
4834 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) }, | ||
4835 | { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, | ||
4836 | + { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) }, | ||
4837 | { } /* Terminating entry */ | ||
4838 | }; | ||
4839 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
4840 | diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c | ||
4841 | index 4a89f88..9f89992 100644 | ||
4842 | --- a/drivers/video/mxsfb.c | ||
4843 | +++ b/drivers/video/mxsfb.c | ||
4844 | @@ -366,7 +366,8 @@ static void mxsfb_disable_controller(struct fb_info *fb_info) | ||
4845 | loop--; | ||
4846 | } | ||
4847 | |||
4848 | - writel(VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4 + REG_CLR); | ||
4849 | + reg = readl(host->base + LCDC_VDCTRL4); | ||
4850 | + writel(reg & ~VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4); | ||
4851 | |||
4852 | clk_disable_unprepare(host->clk); | ||
4853 | |||
4854 | diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c | ||
4855 | index 32ee086..bb01881 100644 | ||
4856 | --- a/fs/ceph/addr.c | ||
4857 | +++ b/fs/ceph/addr.c | ||
4858 | @@ -267,6 +267,14 @@ static void finish_read(struct ceph_osd_request *req, struct ceph_msg *msg) | ||
4859 | kfree(req->r_pages); | ||
4860 | } | ||
4861 | |||
4862 | +static void ceph_unlock_page_vector(struct page **pages, int num_pages) | ||
4863 | +{ | ||
4864 | + int i; | ||
4865 | + | ||
4866 | + for (i = 0; i < num_pages; i++) | ||
4867 | + unlock_page(pages[i]); | ||
4868 | +} | ||
4869 | + | ||
4870 | /* | ||
4871 | * start an async read(ahead) operation. return nr_pages we submitted | ||
4872 | * a read for on success, or negative error code. | ||
4873 | @@ -308,8 +316,8 @@ static int start_read(struct inode *inode, struct list_head *page_list, int max) | ||
4874 | NULL, 0, | ||
4875 | ci->i_truncate_seq, ci->i_truncate_size, | ||
4876 | NULL, false, 1, 0); | ||
4877 | - if (!req) | ||
4878 | - return -ENOMEM; | ||
4879 | + if (IS_ERR(req)) | ||
4880 | + return PTR_ERR(req); | ||
4881 | |||
4882 | /* build page vector */ | ||
4883 | nr_pages = len >> PAGE_CACHE_SHIFT; | ||
4884 | @@ -347,6 +355,7 @@ static int start_read(struct inode *inode, struct list_head *page_list, int max) | ||
4885 | return nr_pages; | ||
4886 | |||
4887 | out_pages: | ||
4888 | + ceph_unlock_page_vector(pages, nr_pages); | ||
4889 | ceph_release_page_vector(pages, nr_pages); | ||
4890 | out: | ||
4891 | ceph_osdc_put_request(req); | ||
4892 | @@ -831,8 +840,8 @@ get_more_pages: | ||
4893 | ci->i_truncate_size, | ||
4894 | &inode->i_mtime, true, 1, 0); | ||
4895 | |||
4896 | - if (!req) { | ||
4897 | - rc = -ENOMEM; | ||
4898 | + if (IS_ERR(req)) { | ||
4899 | + rc = PTR_ERR(req); | ||
4900 | unlock_page(page); | ||
4901 | break; | ||
4902 | } | ||
4903 | diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c | ||
4904 | index 620daad..e7d4077 100644 | ||
4905 | --- a/fs/ceph/caps.c | ||
4906 | +++ b/fs/ceph/caps.c | ||
4907 | @@ -1349,11 +1349,15 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | ||
4908 | if (!ci->i_head_snapc) | ||
4909 | ci->i_head_snapc = ceph_get_snap_context( | ||
4910 | ci->i_snap_realm->cached_context); | ||
4911 | - dout(" inode %p now dirty snapc %p\n", &ci->vfs_inode, | ||
4912 | - ci->i_head_snapc); | ||
4913 | + dout(" inode %p now dirty snapc %p auth cap %p\n", | ||
4914 | + &ci->vfs_inode, ci->i_head_snapc, ci->i_auth_cap); | ||
4915 | BUG_ON(!list_empty(&ci->i_dirty_item)); | ||
4916 | spin_lock(&mdsc->cap_dirty_lock); | ||
4917 | - list_add(&ci->i_dirty_item, &mdsc->cap_dirty); | ||
4918 | + if (ci->i_auth_cap) | ||
4919 | + list_add(&ci->i_dirty_item, &mdsc->cap_dirty); | ||
4920 | + else | ||
4921 | + list_add(&ci->i_dirty_item, | ||
4922 | + &mdsc->cap_dirty_migrating); | ||
4923 | spin_unlock(&mdsc->cap_dirty_lock); | ||
4924 | if (ci->i_flushing_caps == 0) { | ||
4925 | ihold(inode); | ||
4926 | @@ -2388,7 +2392,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant, | ||
4927 | &atime); | ||
4928 | |||
4929 | /* max size increase? */ | ||
4930 | - if (max_size != ci->i_max_size) { | ||
4931 | + if (ci->i_auth_cap == cap && max_size != ci->i_max_size) { | ||
4932 | dout("max_size %lld -> %llu\n", ci->i_max_size, max_size); | ||
4933 | ci->i_max_size = max_size; | ||
4934 | if (max_size >= ci->i_wanted_max_size) { | ||
4935 | @@ -2745,6 +2749,7 @@ static void handle_cap_import(struct ceph_mds_client *mdsc, | ||
4936 | |||
4937 | /* make sure we re-request max_size, if necessary */ | ||
4938 | spin_lock(&ci->i_ceph_lock); | ||
4939 | + ci->i_wanted_max_size = 0; /* reset */ | ||
4940 | ci->i_requested_max_size = 0; | ||
4941 | spin_unlock(&ci->i_ceph_lock); | ||
4942 | } | ||
4943 | @@ -2840,8 +2845,6 @@ void ceph_handle_caps(struct ceph_mds_session *session, | ||
4944 | case CEPH_CAP_OP_IMPORT: | ||
4945 | handle_cap_import(mdsc, inode, h, session, | ||
4946 | snaptrace, snaptrace_len); | ||
4947 | - ceph_check_caps(ceph_inode(inode), 0, session); | ||
4948 | - goto done_unlocked; | ||
4949 | } | ||
4950 | |||
4951 | /* the rest require a cap */ | ||
4952 | @@ -2858,6 +2861,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | ||
4953 | switch (op) { | ||
4954 | case CEPH_CAP_OP_REVOKE: | ||
4955 | case CEPH_CAP_OP_GRANT: | ||
4956 | + case CEPH_CAP_OP_IMPORT: | ||
4957 | handle_cap_grant(inode, h, session, cap, msg->middle); | ||
4958 | goto done_unlocked; | ||
4959 | |||
4960 | diff --git a/fs/ceph/file.c b/fs/ceph/file.c | ||
4961 | index ed72428..9ce3a4b 100644 | ||
4962 | --- a/fs/ceph/file.c | ||
4963 | +++ b/fs/ceph/file.c | ||
4964 | @@ -529,8 +529,8 @@ more: | ||
4965 | do_sync, | ||
4966 | ci->i_truncate_seq, ci->i_truncate_size, | ||
4967 | &mtime, false, 2, page_align); | ||
4968 | - if (!req) | ||
4969 | - return -ENOMEM; | ||
4970 | + if (IS_ERR(req)) | ||
4971 | + return PTR_ERR(req); | ||
4972 | |||
4973 | if (file->f_flags & O_DIRECT) { | ||
4974 | pages = ceph_get_direct_page_vector(data, num_pages, false); | ||
4975 | diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c | ||
4976 | index 9fff9f3..81613bc 100644 | ||
4977 | --- a/fs/ceph/inode.c | ||
4978 | +++ b/fs/ceph/inode.c | ||
4979 | @@ -992,11 +992,15 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, | ||
4980 | if (rinfo->head->is_dentry) { | ||
4981 | struct inode *dir = req->r_locked_dir; | ||
4982 | |||
4983 | - err = fill_inode(dir, &rinfo->diri, rinfo->dirfrag, | ||
4984 | - session, req->r_request_started, -1, | ||
4985 | - &req->r_caps_reservation); | ||
4986 | - if (err < 0) | ||
4987 | - return err; | ||
4988 | + if (dir) { | ||
4989 | + err = fill_inode(dir, &rinfo->diri, rinfo->dirfrag, | ||
4990 | + session, req->r_request_started, -1, | ||
4991 | + &req->r_caps_reservation); | ||
4992 | + if (err < 0) | ||
4993 | + return err; | ||
4994 | + } else { | ||
4995 | + WARN_ON_ONCE(1); | ||
4996 | + } | ||
4997 | } | ||
4998 | |||
4999 | /* | ||
5000 | @@ -1004,6 +1008,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, | ||
5001 | * will have trouble splicing in the virtual snapdir later | ||
5002 | */ | ||
5003 | if (rinfo->head->is_dentry && !req->r_aborted && | ||
5004 | + req->r_locked_dir && | ||
5005 | (rinfo->head->is_target || strncmp(req->r_dentry->d_name.name, | ||
5006 | fsc->mount_options->snapdir_name, | ||
5007 | req->r_dentry->d_name.len))) { | ||
5008 | @@ -1461,7 +1466,7 @@ void __ceph_do_pending_vmtruncate(struct inode *inode) | ||
5009 | { | ||
5010 | struct ceph_inode_info *ci = ceph_inode(inode); | ||
5011 | u64 to; | ||
5012 | - int wrbuffer_refs, wake = 0; | ||
5013 | + int wrbuffer_refs, finish = 0; | ||
5014 | |||
5015 | retry: | ||
5016 | spin_lock(&ci->i_ceph_lock); | ||
5017 | @@ -1493,15 +1498,18 @@ retry: | ||
5018 | truncate_inode_pages(inode->i_mapping, to); | ||
5019 | |||
5020 | spin_lock(&ci->i_ceph_lock); | ||
5021 | - ci->i_truncate_pending--; | ||
5022 | - if (ci->i_truncate_pending == 0) | ||
5023 | - wake = 1; | ||
5024 | + if (to == ci->i_truncate_size) { | ||
5025 | + ci->i_truncate_pending = 0; | ||
5026 | + finish = 1; | ||
5027 | + } | ||
5028 | spin_unlock(&ci->i_ceph_lock); | ||
5029 | + if (!finish) | ||
5030 | + goto retry; | ||
5031 | |||
5032 | if (wrbuffer_refs == 0) | ||
5033 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); | ||
5034 | - if (wake) | ||
5035 | - wake_up_all(&ci->i_cap_wq); | ||
5036 | + | ||
5037 | + wake_up_all(&ci->i_cap_wq); | ||
5038 | } | ||
5039 | |||
5040 | |||
5041 | diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c | ||
5042 | index 7f1682d..3fd08ad 100644 | ||
5043 | --- a/fs/ceph/mds_client.c | ||
5044 | +++ b/fs/ceph/mds_client.c | ||
5045 | @@ -1886,9 +1886,14 @@ finish: | ||
5046 | static void __wake_requests(struct ceph_mds_client *mdsc, | ||
5047 | struct list_head *head) | ||
5048 | { | ||
5049 | - struct ceph_mds_request *req, *nreq; | ||
5050 | + struct ceph_mds_request *req; | ||
5051 | + LIST_HEAD(tmp_list); | ||
5052 | + | ||
5053 | + list_splice_init(head, &tmp_list); | ||
5054 | |||
5055 | - list_for_each_entry_safe(req, nreq, head, r_wait) { | ||
5056 | + while (!list_empty(&tmp_list)) { | ||
5057 | + req = list_entry(tmp_list.next, | ||
5058 | + struct ceph_mds_request, r_wait); | ||
5059 | list_del_init(&req->r_wait); | ||
5060 | __do_request(mdsc, req); | ||
5061 | } | ||
5062 | @@ -2528,6 +2533,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc, | ||
5063 | session->s_state = CEPH_MDS_SESSION_RECONNECTING; | ||
5064 | session->s_seq = 0; | ||
5065 | |||
5066 | + ceph_con_close(&session->s_con); | ||
5067 | ceph_con_open(&session->s_con, | ||
5068 | CEPH_ENTITY_TYPE_MDS, mds, | ||
5069 | ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); | ||
5070 | diff --git a/fs/ceph/super.c b/fs/ceph/super.c | ||
5071 | index 1e67dd7..f363918 100644 | ||
5072 | --- a/fs/ceph/super.c | ||
5073 | +++ b/fs/ceph/super.c | ||
5074 | @@ -387,8 +387,6 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) | ||
5075 | seq_printf(m, ",mount_timeout=%d", opt->mount_timeout); | ||
5076 | if (opt->osd_idle_ttl != CEPH_OSD_IDLE_TTL_DEFAULT) | ||
5077 | seq_printf(m, ",osd_idle_ttl=%d", opt->osd_idle_ttl); | ||
5078 | - if (opt->osd_timeout != CEPH_OSD_TIMEOUT_DEFAULT) | ||
5079 | - seq_printf(m, ",osdtimeout=%d", opt->osd_timeout); | ||
5080 | if (opt->osd_keepalive_timeout != CEPH_OSD_KEEPALIVE_DEFAULT) | ||
5081 | seq_printf(m, ",osdkeepalivetimeout=%d", | ||
5082 | opt->osd_keepalive_timeout); | ||
5083 | diff --git a/fs/eventpoll.c b/fs/eventpoll.c | ||
5084 | index c0b3c70..33c9599 100644 | ||
5085 | --- a/fs/eventpoll.c | ||
5086 | +++ b/fs/eventpoll.c | ||
5087 | @@ -1226,11 +1226,31 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even | ||
5088 | * otherwise we might miss an event that happens between the | ||
5089 | * f_op->poll() call and the new event set registering. | ||
5090 | */ | ||
5091 | - epi->event.events = event->events; | ||
5092 | + epi->event.events = event->events; /* need barrier below */ | ||
5093 | pt._key = event->events; | ||
5094 | epi->event.data = event->data; /* protected by mtx */ | ||
5095 | |||
5096 | /* | ||
5097 | + * The following barrier has two effects: | ||
5098 | + * | ||
5099 | + * 1) Flush epi changes above to other CPUs. This ensures | ||
5100 | + * we do not miss events from ep_poll_callback if an | ||
5101 | + * event occurs immediately after we call f_op->poll(). | ||
5102 | + * We need this because we did not take ep->lock while | ||
5103 | + * changing epi above (but ep_poll_callback does take | ||
5104 | + * ep->lock). | ||
5105 | + * | ||
5106 | + * 2) We also need to ensure we do not miss _past_ events | ||
5107 | + * when calling f_op->poll(). This barrier also | ||
5108 | + * pairs with the barrier in wq_has_sleeper (see | ||
5109 | + * comments for wq_has_sleeper). | ||
5110 | + * | ||
5111 | + * This barrier will now guarantee ep_poll_callback or f_op->poll | ||
5112 | + * (or both) will notice the readiness of an item. | ||
5113 | + */ | ||
5114 | + smp_mb(); | ||
5115 | + | ||
5116 | + /* | ||
5117 | * Get current event bits. We can safely use the file* here because | ||
5118 | * its usage count has been increased by the caller of this function. | ||
5119 | */ | ||
5120 | diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c | ||
5121 | index a5c29bb..8535c45 100644 | ||
5122 | --- a/fs/ext4/acl.c | ||
5123 | +++ b/fs/ext4/acl.c | ||
5124 | @@ -410,8 +410,10 @@ ext4_xattr_set_acl(struct dentry *dentry, const char *name, const void *value, | ||
5125 | |||
5126 | retry: | ||
5127 | handle = ext4_journal_start(inode, EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); | ||
5128 | - if (IS_ERR(handle)) | ||
5129 | - return PTR_ERR(handle); | ||
5130 | + if (IS_ERR(handle)) { | ||
5131 | + error = PTR_ERR(handle); | ||
5132 | + goto release_and_out; | ||
5133 | + } | ||
5134 | error = ext4_set_acl(handle, inode, type, acl); | ||
5135 | ext4_journal_stop(handle); | ||
5136 | if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | ||
5137 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
5138 | index c215985..852d4c2 100644 | ||
5139 | --- a/fs/ext4/extents.c | ||
5140 | +++ b/fs/ext4/extents.c | ||
5141 | @@ -2110,13 +2110,14 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block, | ||
5142 | * removes index from the index block. | ||
5143 | */ | ||
5144 | static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, | ||
5145 | - struct ext4_ext_path *path) | ||
5146 | + struct ext4_ext_path *path, int depth) | ||
5147 | { | ||
5148 | int err; | ||
5149 | ext4_fsblk_t leaf; | ||
5150 | |||
5151 | /* free index block */ | ||
5152 | - path--; | ||
5153 | + depth--; | ||
5154 | + path = path + depth; | ||
5155 | leaf = ext4_idx_pblock(path->p_idx); | ||
5156 | if (unlikely(path->p_hdr->eh_entries == 0)) { | ||
5157 | EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0"); | ||
5158 | @@ -2141,6 +2142,19 @@ static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, | ||
5159 | |||
5160 | ext4_free_blocks(handle, inode, NULL, leaf, 1, | ||
5161 | EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET); | ||
5162 | + | ||
5163 | + while (--depth >= 0) { | ||
5164 | + if (path->p_idx != EXT_FIRST_INDEX(path->p_hdr)) | ||
5165 | + break; | ||
5166 | + path--; | ||
5167 | + err = ext4_ext_get_access(handle, inode, path); | ||
5168 | + if (err) | ||
5169 | + break; | ||
5170 | + path->p_idx->ei_block = (path+1)->p_idx->ei_block; | ||
5171 | + err = ext4_ext_dirty(handle, inode, path); | ||
5172 | + if (err) | ||
5173 | + break; | ||
5174 | + } | ||
5175 | return err; | ||
5176 | } | ||
5177 | |||
5178 | @@ -2474,7 +2488,7 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, | ||
5179 | /* if this leaf is free, then we should | ||
5180 | * remove it from index block above */ | ||
5181 | if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL) | ||
5182 | - err = ext4_ext_rm_idx(handle, inode, path + depth); | ||
5183 | + err = ext4_ext_rm_idx(handle, inode, path, depth); | ||
5184 | |||
5185 | out: | ||
5186 | return err; | ||
5187 | @@ -2675,7 +2689,7 @@ cont: | ||
5188 | /* index is empty, remove it; | ||
5189 | * handle must be already prepared by the | ||
5190 | * truncatei_leaf() */ | ||
5191 | - err = ext4_ext_rm_idx(handle, inode, path + i); | ||
5192 | + err = ext4_ext_rm_idx(handle, inode, path, i); | ||
5193 | } | ||
5194 | /* root level has p_bh == NULL, brelse() eats this */ | ||
5195 | brelse(path[i].p_bh); | ||
5196 | diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c | ||
5197 | index 556cc82..902544e 100644 | ||
5198 | --- a/fs/ext4/ialloc.c | ||
5199 | +++ b/fs/ext4/ialloc.c | ||
5200 | @@ -734,7 +734,6 @@ got: | ||
5201 | |||
5202 | BUFFER_TRACE(block_bitmap_bh, "dirty block bitmap"); | ||
5203 | err = ext4_handle_dirty_metadata(handle, NULL, block_bitmap_bh); | ||
5204 | - brelse(block_bitmap_bh); | ||
5205 | |||
5206 | /* recheck and clear flag under lock if we still need to */ | ||
5207 | ext4_lock_group(sb, group); | ||
5208 | @@ -746,6 +745,7 @@ got: | ||
5209 | gdp); | ||
5210 | } | ||
5211 | ext4_unlock_group(sb, group); | ||
5212 | + brelse(block_bitmap_bh); | ||
5213 | |||
5214 | if (err) | ||
5215 | goto fail; | ||
5216 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
5217 | index b1c28f1..288f4c6 100644 | ||
5218 | --- a/fs/ext4/super.c | ||
5219 | +++ b/fs/ext4/super.c | ||
5220 | @@ -1599,9 +1599,7 @@ static int parse_options(char *options, struct super_block *sb, | ||
5221 | unsigned int *journal_ioprio, | ||
5222 | int is_remount) | ||
5223 | { | ||
5224 | -#ifdef CONFIG_QUOTA | ||
5225 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
5226 | -#endif | ||
5227 | char *p; | ||
5228 | substring_t args[MAX_OPT_ARGS]; | ||
5229 | int token; | ||
5230 | @@ -1650,6 +1648,16 @@ static int parse_options(char *options, struct super_block *sb, | ||
5231 | } | ||
5232 | } | ||
5233 | #endif | ||
5234 | + if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
5235 | + int blocksize = | ||
5236 | + BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size); | ||
5237 | + | ||
5238 | + if (blocksize < PAGE_CACHE_SIZE) { | ||
5239 | + ext4_msg(sb, KERN_ERR, "can't mount with " | ||
5240 | + "dioread_nolock if block size != PAGE_SIZE"); | ||
5241 | + return 0; | ||
5242 | + } | ||
5243 | + } | ||
5244 | return 1; | ||
5245 | } | ||
5246 | |||
5247 | @@ -2112,7 +2120,9 @@ static void ext4_orphan_cleanup(struct super_block *sb, | ||
5248 | __func__, inode->i_ino, inode->i_size); | ||
5249 | jbd_debug(2, "truncating inode %lu to %lld bytes\n", | ||
5250 | inode->i_ino, inode->i_size); | ||
5251 | + mutex_lock(&inode->i_mutex); | ||
5252 | ext4_truncate(inode); | ||
5253 | + mutex_unlock(&inode->i_mutex); | ||
5254 | nr_truncates++; | ||
5255 | } else { | ||
5256 | ext4_msg(sb, KERN_DEBUG, | ||
5257 | @@ -3226,15 +3236,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
5258 | clear_opt(sb, DELALLOC); | ||
5259 | } | ||
5260 | |||
5261 | - blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); | ||
5262 | - if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
5263 | - if (blocksize < PAGE_SIZE) { | ||
5264 | - ext4_msg(sb, KERN_ERR, "can't mount with " | ||
5265 | - "dioread_nolock if block size != PAGE_SIZE"); | ||
5266 | - goto failed_mount; | ||
5267 | - } | ||
5268 | - } | ||
5269 | - | ||
5270 | sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | | ||
5271 | (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); | ||
5272 | |||
5273 | @@ -3276,6 +3277,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
5274 | if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY))) | ||
5275 | goto failed_mount; | ||
5276 | |||
5277 | + blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); | ||
5278 | if (blocksize < EXT4_MIN_BLOCK_SIZE || | ||
5279 | blocksize > EXT4_MAX_BLOCK_SIZE) { | ||
5280 | ext4_msg(sb, KERN_ERR, | ||
5281 | @@ -4506,7 +4508,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | ||
5282 | } | ||
5283 | |||
5284 | ext4_setup_system_zone(sb); | ||
5285 | - if (sbi->s_journal == NULL) | ||
5286 | + if (sbi->s_journal == NULL && !(old_sb_flags & MS_RDONLY)) | ||
5287 | ext4_commit_super(sb, 1); | ||
5288 | |||
5289 | #ifdef CONFIG_QUOTA | ||
5290 | diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c | ||
5291 | index 6b1efb5..a392e32 100644 | ||
5292 | --- a/fs/gfs2/lops.c | ||
5293 | +++ b/fs/gfs2/lops.c | ||
5294 | @@ -258,16 +258,14 @@ static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) | ||
5295 | struct gfs2_meta_header *mh; | ||
5296 | struct gfs2_trans *tr; | ||
5297 | |||
5298 | - lock_buffer(bd->bd_bh); | ||
5299 | - gfs2_log_lock(sdp); | ||
5300 | if (!list_empty(&bd->bd_list_tr)) | ||
5301 | - goto out; | ||
5302 | + return; | ||
5303 | tr = current->journal_info; | ||
5304 | tr->tr_touched = 1; | ||
5305 | tr->tr_num_buf++; | ||
5306 | list_add(&bd->bd_list_tr, &tr->tr_list_buf); | ||
5307 | if (!list_empty(&le->le_list)) | ||
5308 | - goto out; | ||
5309 | + return; | ||
5310 | set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); | ||
5311 | set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); | ||
5312 | gfs2_meta_check(sdp, bd->bd_bh); | ||
5313 | @@ -278,9 +276,6 @@ static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) | ||
5314 | sdp->sd_log_num_buf++; | ||
5315 | list_add(&le->le_list, &sdp->sd_log_le_buf); | ||
5316 | tr->tr_num_buf_new++; | ||
5317 | -out: | ||
5318 | - gfs2_log_unlock(sdp); | ||
5319 | - unlock_buffer(bd->bd_bh); | ||
5320 | } | ||
5321 | |||
5322 | static void buf_lo_before_commit(struct gfs2_sbd *sdp) | ||
5323 | @@ -611,11 +606,9 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) | ||
5324 | struct address_space *mapping = bd->bd_bh->b_page->mapping; | ||
5325 | struct gfs2_inode *ip = GFS2_I(mapping->host); | ||
5326 | |||
5327 | - lock_buffer(bd->bd_bh); | ||
5328 | - gfs2_log_lock(sdp); | ||
5329 | if (tr) { | ||
5330 | if (!list_empty(&bd->bd_list_tr)) | ||
5331 | - goto out; | ||
5332 | + return; | ||
5333 | tr->tr_touched = 1; | ||
5334 | if (gfs2_is_jdata(ip)) { | ||
5335 | tr->tr_num_buf++; | ||
5336 | @@ -623,7 +616,7 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) | ||
5337 | } | ||
5338 | } | ||
5339 | if (!list_empty(&le->le_list)) | ||
5340 | - goto out; | ||
5341 | + return; | ||
5342 | |||
5343 | set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); | ||
5344 | set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); | ||
5345 | @@ -635,9 +628,6 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) | ||
5346 | } else { | ||
5347 | list_add_tail(&le->le_list, &sdp->sd_log_le_ordered); | ||
5348 | } | ||
5349 | -out: | ||
5350 | - gfs2_log_unlock(sdp); | ||
5351 | - unlock_buffer(bd->bd_bh); | ||
5352 | } | ||
5353 | |||
5354 | static void gfs2_check_magic(struct buffer_head *bh) | ||
5355 | diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c | ||
5356 | index 86ac75d..6ab2a77 100644 | ||
5357 | --- a/fs/gfs2/trans.c | ||
5358 | +++ b/fs/gfs2/trans.c | ||
5359 | @@ -145,14 +145,22 @@ void gfs2_trans_add_bh(struct gfs2_glock *gl, struct buffer_head *bh, int meta) | ||
5360 | struct gfs2_sbd *sdp = gl->gl_sbd; | ||
5361 | struct gfs2_bufdata *bd; | ||
5362 | |||
5363 | + lock_buffer(bh); | ||
5364 | + gfs2_log_lock(sdp); | ||
5365 | bd = bh->b_private; | ||
5366 | if (bd) | ||
5367 | gfs2_assert(sdp, bd->bd_gl == gl); | ||
5368 | else { | ||
5369 | + gfs2_log_unlock(sdp); | ||
5370 | + unlock_buffer(bh); | ||
5371 | gfs2_attach_bufdata(gl, bh, meta); | ||
5372 | bd = bh->b_private; | ||
5373 | + lock_buffer(bh); | ||
5374 | + gfs2_log_lock(sdp); | ||
5375 | } | ||
5376 | lops_add(sdp, &bd->bd_le); | ||
5377 | + gfs2_log_unlock(sdp); | ||
5378 | + unlock_buffer(bh); | ||
5379 | } | ||
5380 | |||
5381 | void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd) | ||
5382 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c | ||
5383 | index ddcd354..de8b4cb 100644 | ||
5384 | --- a/fs/jbd2/transaction.c | ||
5385 | +++ b/fs/jbd2/transaction.c | ||
5386 | @@ -209,7 +209,8 @@ repeat: | ||
5387 | if (!new_transaction) | ||
5388 | goto alloc_transaction; | ||
5389 | write_lock(&journal->j_state_lock); | ||
5390 | - if (!journal->j_running_transaction) { | ||
5391 | + if (!journal->j_running_transaction && | ||
5392 | + !journal->j_barrier_count) { | ||
5393 | jbd2_get_transaction(journal, new_transaction); | ||
5394 | new_transaction = NULL; | ||
5395 | } | ||
5396 | diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c | ||
5397 | index 6784d1e..ffa8f12 100644 | ||
5398 | --- a/fs/jffs2/nodemgmt.c | ||
5399 | +++ b/fs/jffs2/nodemgmt.c | ||
5400 | @@ -375,14 +375,16 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, | ||
5401 | spin_unlock(&c->erase_completion_lock); | ||
5402 | |||
5403 | ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); | ||
5404 | - if (ret) | ||
5405 | - return ret; | ||
5406 | + | ||
5407 | /* Just lock it again and continue. Nothing much can change because | ||
5408 | we hold c->alloc_sem anyway. In fact, it's not entirely clear why | ||
5409 | we hold c->erase_completion_lock in the majority of this function... | ||
5410 | but that's a question for another (more caffeine-rich) day. */ | ||
5411 | spin_lock(&c->erase_completion_lock); | ||
5412 | |||
5413 | + if (ret) | ||
5414 | + return ret; | ||
5415 | + | ||
5416 | waste = jeb->free_size; | ||
5417 | jffs2_link_node_ref(c, jeb, | ||
5418 | (jeb->offset + c->sector_size - waste) | REF_OBSOLETE, | ||
5419 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c | ||
5420 | index 7d75280..aa70035 100644 | ||
5421 | --- a/fs/udf/inode.c | ||
5422 | +++ b/fs/udf/inode.c | ||
5423 | @@ -574,6 +574,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
5424 | struct udf_inode_info *iinfo = UDF_I(inode); | ||
5425 | int goal = 0, pgoal = iinfo->i_location.logicalBlockNum; | ||
5426 | int lastblock = 0; | ||
5427 | + bool isBeyondEOF; | ||
5428 | |||
5429 | *err = 0; | ||
5430 | *new = 0; | ||
5431 | @@ -653,7 +654,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
5432 | /* Are we beyond EOF? */ | ||
5433 | if (etype == -1) { | ||
5434 | int ret; | ||
5435 | - | ||
5436 | + isBeyondEOF = 1; | ||
5437 | if (count) { | ||
5438 | if (c) | ||
5439 | laarr[0] = laarr[1]; | ||
5440 | @@ -696,6 +697,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
5441 | endnum = c + 1; | ||
5442 | lastblock = 1; | ||
5443 | } else { | ||
5444 | + isBeyondEOF = 0; | ||
5445 | endnum = startnum = ((count > 2) ? 2 : count); | ||
5446 | |||
5447 | /* if the current extent is in position 0, | ||
5448 | @@ -738,10 +740,13 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
5449 | goal, err); | ||
5450 | if (!newblocknum) { | ||
5451 | brelse(prev_epos.bh); | ||
5452 | + brelse(cur_epos.bh); | ||
5453 | + brelse(next_epos.bh); | ||
5454 | *err = -ENOSPC; | ||
5455 | return 0; | ||
5456 | } | ||
5457 | - iinfo->i_lenExtents += inode->i_sb->s_blocksize; | ||
5458 | + if (isBeyondEOF) | ||
5459 | + iinfo->i_lenExtents += inode->i_sb->s_blocksize; | ||
5460 | } | ||
5461 | |||
5462 | /* if the extent the requsted block is located in contains multiple | ||
5463 | @@ -768,6 +773,8 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
5464 | udf_update_extents(inode, laarr, startnum, endnum, &prev_epos); | ||
5465 | |||
5466 | brelse(prev_epos.bh); | ||
5467 | + brelse(cur_epos.bh); | ||
5468 | + brelse(next_epos.bh); | ||
5469 | |||
5470 | newblock = udf_get_pblock(inode->i_sb, newblocknum, | ||
5471 | iinfo->i_location.partitionReferenceNum, 0); | ||
5472 | diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h | ||
5473 | index 98ec36a..893420b 100644 | ||
5474 | --- a/include/linux/ceph/libceph.h | ||
5475 | +++ b/include/linux/ceph/libceph.h | ||
5476 | @@ -49,7 +49,6 @@ struct ceph_options { | ||
5477 | struct ceph_entity_addr my_addr; | ||
5478 | int mount_timeout; | ||
5479 | int osd_idle_ttl; | ||
5480 | - int osd_timeout; | ||
5481 | int osd_keepalive_timeout; | ||
5482 | |||
5483 | /* | ||
5484 | @@ -69,7 +68,6 @@ struct ceph_options { | ||
5485 | * defaults | ||
5486 | */ | ||
5487 | #define CEPH_MOUNT_TIMEOUT_DEFAULT 60 | ||
5488 | -#define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */ | ||
5489 | #define CEPH_OSD_KEEPALIVE_DEFAULT 5 | ||
5490 | #define CEPH_OSD_IDLE_TTL_DEFAULT 60 | ||
5491 | |||
5492 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c | ||
5493 | index cf8d11e..2866783 100644 | ||
5494 | --- a/kernel/trace/ring_buffer.c | ||
5495 | +++ b/kernel/trace/ring_buffer.c | ||
5496 | @@ -2708,7 +2708,7 @@ unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu) | ||
5497 | unsigned long flags; | ||
5498 | struct ring_buffer_per_cpu *cpu_buffer; | ||
5499 | struct buffer_page *bpage; | ||
5500 | - unsigned long ret; | ||
5501 | + unsigned long ret = 0; | ||
5502 | |||
5503 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) | ||
5504 | return 0; | ||
5505 | @@ -2723,7 +2723,8 @@ unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu) | ||
5506 | bpage = cpu_buffer->reader_page; | ||
5507 | else | ||
5508 | bpage = rb_set_head_page(cpu_buffer); | ||
5509 | - ret = bpage->page->time_stamp; | ||
5510 | + if (bpage) | ||
5511 | + ret = bpage->page->time_stamp; | ||
5512 | raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); | ||
5513 | |||
5514 | return ret; | ||
5515 | @@ -3030,6 +3031,8 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | ||
5516 | * Splice the empty reader page into the list around the head. | ||
5517 | */ | ||
5518 | reader = rb_set_head_page(cpu_buffer); | ||
5519 | + if (!reader) | ||
5520 | + goto out; | ||
5521 | cpu_buffer->reader_page->list.next = rb_list_head(reader->list.next); | ||
5522 | cpu_buffer->reader_page->list.prev = reader->list.prev; | ||
5523 | |||
5524 | diff --git a/mm/compaction.c b/mm/compaction.c | ||
5525 | index 459b0ab..3c8d7fe 100644 | ||
5526 | --- a/mm/compaction.c | ||
5527 | +++ b/mm/compaction.c | ||
5528 | @@ -736,7 +736,7 @@ static int compact_node(int nid) | ||
5529 | } | ||
5530 | |||
5531 | /* Compact all nodes in the system */ | ||
5532 | -static int compact_nodes(void) | ||
5533 | +static void compact_nodes(void) | ||
5534 | { | ||
5535 | int nid; | ||
5536 | |||
5537 | @@ -745,8 +745,6 @@ static int compact_nodes(void) | ||
5538 | |||
5539 | for_each_online_node(nid) | ||
5540 | compact_node(nid); | ||
5541 | - | ||
5542 | - return COMPACT_COMPLETE; | ||
5543 | } | ||
5544 | |||
5545 | /* The written value is actually unused, all memory is compacted */ | ||
5546 | @@ -757,7 +755,7 @@ int sysctl_compaction_handler(struct ctl_table *table, int write, | ||
5547 | void __user *buffer, size_t *length, loff_t *ppos) | ||
5548 | { | ||
5549 | if (write) | ||
5550 | - return compact_nodes(); | ||
5551 | + compact_nodes(); | ||
5552 | |||
5553 | return 0; | ||
5554 | } | ||
5555 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c | ||
5556 | index f0e5306..caf15b6 100644 | ||
5557 | --- a/mm/huge_memory.c | ||
5558 | +++ b/mm/huge_memory.c | ||
5559 | @@ -950,6 +950,8 @@ int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
5560 | count_vm_event(THP_FAULT_FALLBACK); | ||
5561 | ret = do_huge_pmd_wp_page_fallback(mm, vma, address, | ||
5562 | pmd, orig_pmd, page, haddr); | ||
5563 | + if (ret & VM_FAULT_OOM) | ||
5564 | + split_huge_page(page); | ||
5565 | put_page(page); | ||
5566 | goto out; | ||
5567 | } | ||
5568 | @@ -957,6 +959,7 @@ int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
5569 | |||
5570 | if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) { | ||
5571 | put_page(new_page); | ||
5572 | + split_huge_page(page); | ||
5573 | put_page(page); | ||
5574 | ret |= VM_FAULT_OOM; | ||
5575 | goto out; | ||
5576 | diff --git a/mm/memory.c b/mm/memory.c | ||
5577 | index 024b4af..2f42aab 100644 | ||
5578 | --- a/mm/memory.c | ||
5579 | +++ b/mm/memory.c | ||
5580 | @@ -3494,6 +3494,7 @@ int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, | ||
5581 | if (unlikely(is_vm_hugetlb_page(vma))) | ||
5582 | return hugetlb_fault(mm, vma, address, flags); | ||
5583 | |||
5584 | +retry: | ||
5585 | pgd = pgd_offset(mm, address); | ||
5586 | pud = pud_alloc(mm, pgd, address); | ||
5587 | if (!pud) | ||
5588 | @@ -3507,13 +3508,24 @@ int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, | ||
5589 | pmd, flags); | ||
5590 | } else { | ||
5591 | pmd_t orig_pmd = *pmd; | ||
5592 | + int ret; | ||
5593 | + | ||
5594 | barrier(); | ||
5595 | if (pmd_trans_huge(orig_pmd)) { | ||
5596 | if (flags & FAULT_FLAG_WRITE && | ||
5597 | !pmd_write(orig_pmd) && | ||
5598 | - !pmd_trans_splitting(orig_pmd)) | ||
5599 | - return do_huge_pmd_wp_page(mm, vma, address, | ||
5600 | - pmd, orig_pmd); | ||
5601 | + !pmd_trans_splitting(orig_pmd)) { | ||
5602 | + ret = do_huge_pmd_wp_page(mm, vma, address, pmd, | ||
5603 | + orig_pmd); | ||
5604 | + /* | ||
5605 | + * If COW results in an oom, the huge pmd will | ||
5606 | + * have been split, so retry the fault on the | ||
5607 | + * pte for a smaller charge. | ||
5608 | + */ | ||
5609 | + if (unlikely(ret & VM_FAULT_OOM)) | ||
5610 | + goto retry; | ||
5611 | + return ret; | ||
5612 | + } | ||
5613 | return 0; | ||
5614 | } | ||
5615 | } | ||
5616 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
5617 | index 88a6d87..691b8ec 100644 | ||
5618 | --- a/mm/page_alloc.c | ||
5619 | +++ b/mm/page_alloc.c | ||
5620 | @@ -5340,7 +5340,7 @@ static inline int pfn_to_bitidx(struct zone *zone, unsigned long pfn) | ||
5621 | pfn &= (PAGES_PER_SECTION-1); | ||
5622 | return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS; | ||
5623 | #else | ||
5624 | - pfn = pfn - zone->zone_start_pfn; | ||
5625 | + pfn = pfn - round_down(zone->zone_start_pfn, pageblock_nr_pages); | ||
5626 | return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS; | ||
5627 | #endif /* CONFIG_SPARSEMEM */ | ||
5628 | } | ||
5629 | diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c | ||
5630 | index 8e74e8c..b11448f 100644 | ||
5631 | --- a/net/ceph/ceph_common.c | ||
5632 | +++ b/net/ceph/ceph_common.c | ||
5633 | @@ -304,7 +304,6 @@ ceph_parse_options(char *options, const char *dev_name, | ||
5634 | |||
5635 | /* start with defaults */ | ||
5636 | opt->flags = CEPH_OPT_DEFAULT; | ||
5637 | - opt->osd_timeout = CEPH_OSD_TIMEOUT_DEFAULT; | ||
5638 | opt->osd_keepalive_timeout = CEPH_OSD_KEEPALIVE_DEFAULT; | ||
5639 | opt->mount_timeout = CEPH_MOUNT_TIMEOUT_DEFAULT; /* seconds */ | ||
5640 | opt->osd_idle_ttl = CEPH_OSD_IDLE_TTL_DEFAULT; /* seconds */ | ||
5641 | @@ -390,7 +389,7 @@ ceph_parse_options(char *options, const char *dev_name, | ||
5642 | |||
5643 | /* misc */ | ||
5644 | case Opt_osdtimeout: | ||
5645 | - opt->osd_timeout = intval; | ||
5646 | + pr_warning("ignoring deprecated osdtimeout option\n"); | ||
5647 | break; | ||
5648 | case Opt_osdkeepalivetimeout: | ||
5649 | opt->osd_keepalive_timeout = intval; | ||
5650 | diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c | ||
5651 | index aa71a67..ba1037c 100644 | ||
5652 | --- a/net/ceph/messenger.c | ||
5653 | +++ b/net/ceph/messenger.c | ||
5654 | @@ -506,6 +506,7 @@ static void reset_connection(struct ceph_connection *con) | ||
5655 | { | ||
5656 | /* reset connection, out_queue, msg_ and connect_seq */ | ||
5657 | /* discard existing out_queue and msg_seq */ | ||
5658 | + dout("reset_connection %p\n", con); | ||
5659 | ceph_msg_remove_list(&con->out_queue); | ||
5660 | ceph_msg_remove_list(&con->out_sent); | ||
5661 | |||
5662 | @@ -561,7 +562,7 @@ void ceph_con_open(struct ceph_connection *con, | ||
5663 | mutex_lock(&con->mutex); | ||
5664 | dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr)); | ||
5665 | |||
5666 | - BUG_ON(con->state != CON_STATE_CLOSED); | ||
5667 | + WARN_ON(con->state != CON_STATE_CLOSED); | ||
5668 | con->state = CON_STATE_PREOPEN; | ||
5669 | |||
5670 | con->peer_name.type = (__u8) entity_type; | ||
5671 | @@ -1502,13 +1503,6 @@ static int process_banner(struct ceph_connection *con) | ||
5672 | return 0; | ||
5673 | } | ||
5674 | |||
5675 | -static void fail_protocol(struct ceph_connection *con) | ||
5676 | -{ | ||
5677 | - reset_connection(con); | ||
5678 | - BUG_ON(con->state != CON_STATE_NEGOTIATING); | ||
5679 | - con->state = CON_STATE_CLOSED; | ||
5680 | -} | ||
5681 | - | ||
5682 | static int process_connect(struct ceph_connection *con) | ||
5683 | { | ||
5684 | u64 sup_feat = con->msgr->supported_features; | ||
5685 | @@ -1526,7 +1520,7 @@ static int process_connect(struct ceph_connection *con) | ||
5686 | ceph_pr_addr(&con->peer_addr.in_addr), | ||
5687 | sup_feat, server_feat, server_feat & ~sup_feat); | ||
5688 | con->error_msg = "missing required protocol features"; | ||
5689 | - fail_protocol(con); | ||
5690 | + reset_connection(con); | ||
5691 | return -1; | ||
5692 | |||
5693 | case CEPH_MSGR_TAG_BADPROTOVER: | ||
5694 | @@ -1537,7 +1531,7 @@ static int process_connect(struct ceph_connection *con) | ||
5695 | le32_to_cpu(con->out_connect.protocol_version), | ||
5696 | le32_to_cpu(con->in_reply.protocol_version)); | ||
5697 | con->error_msg = "protocol version mismatch"; | ||
5698 | - fail_protocol(con); | ||
5699 | + reset_connection(con); | ||
5700 | return -1; | ||
5701 | |||
5702 | case CEPH_MSGR_TAG_BADAUTHORIZER: | ||
5703 | @@ -1627,11 +1621,11 @@ static int process_connect(struct ceph_connection *con) | ||
5704 | ceph_pr_addr(&con->peer_addr.in_addr), | ||
5705 | req_feat, server_feat, req_feat & ~server_feat); | ||
5706 | con->error_msg = "missing required protocol features"; | ||
5707 | - fail_protocol(con); | ||
5708 | + reset_connection(con); | ||
5709 | return -1; | ||
5710 | } | ||
5711 | |||
5712 | - BUG_ON(con->state != CON_STATE_NEGOTIATING); | ||
5713 | + WARN_ON(con->state != CON_STATE_NEGOTIATING); | ||
5714 | con->state = CON_STATE_OPEN; | ||
5715 | |||
5716 | con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq); | ||
5717 | @@ -2128,7 +2122,6 @@ more: | ||
5718 | if (ret < 0) | ||
5719 | goto out; | ||
5720 | |||
5721 | - BUG_ON(con->state != CON_STATE_CONNECTING); | ||
5722 | con->state = CON_STATE_NEGOTIATING; | ||
5723 | |||
5724 | /* | ||
5725 | @@ -2156,7 +2149,7 @@ more: | ||
5726 | goto more; | ||
5727 | } | ||
5728 | |||
5729 | - BUG_ON(con->state != CON_STATE_OPEN); | ||
5730 | + WARN_ON(con->state != CON_STATE_OPEN); | ||
5731 | |||
5732 | if (con->in_base_pos < 0) { | ||
5733 | /* | ||
5734 | @@ -2258,6 +2251,35 @@ static void queue_con(struct ceph_connection *con) | ||
5735 | } | ||
5736 | } | ||
5737 | |||
5738 | +static bool con_sock_closed(struct ceph_connection *con) | ||
5739 | +{ | ||
5740 | + if (!test_and_clear_bit(CON_FLAG_SOCK_CLOSED, &con->flags)) | ||
5741 | + return false; | ||
5742 | + | ||
5743 | +#define CASE(x) \ | ||
5744 | + case CON_STATE_ ## x: \ | ||
5745 | + con->error_msg = "socket closed (con state " #x ")"; \ | ||
5746 | + break; | ||
5747 | + | ||
5748 | + switch (con->state) { | ||
5749 | + CASE(CLOSED); | ||
5750 | + CASE(PREOPEN); | ||
5751 | + CASE(CONNECTING); | ||
5752 | + CASE(NEGOTIATING); | ||
5753 | + CASE(OPEN); | ||
5754 | + CASE(STANDBY); | ||
5755 | + default: | ||
5756 | + pr_warning("%s con %p unrecognized state %lu\n", | ||
5757 | + __func__, con, con->state); | ||
5758 | + con->error_msg = "unrecognized con state"; | ||
5759 | + BUG(); | ||
5760 | + break; | ||
5761 | + } | ||
5762 | +#undef CASE | ||
5763 | + | ||
5764 | + return true; | ||
5765 | +} | ||
5766 | + | ||
5767 | /* | ||
5768 | * Do some work on a connection. Drop a connection ref when we're done. | ||
5769 | */ | ||
5770 | @@ -2269,24 +2291,8 @@ static void con_work(struct work_struct *work) | ||
5771 | |||
5772 | mutex_lock(&con->mutex); | ||
5773 | restart: | ||
5774 | - if (test_and_clear_bit(CON_FLAG_SOCK_CLOSED, &con->flags)) { | ||
5775 | - switch (con->state) { | ||
5776 | - case CON_STATE_CONNECTING: | ||
5777 | - con->error_msg = "connection failed"; | ||
5778 | - break; | ||
5779 | - case CON_STATE_NEGOTIATING: | ||
5780 | - con->error_msg = "negotiation failed"; | ||
5781 | - break; | ||
5782 | - case CON_STATE_OPEN: | ||
5783 | - con->error_msg = "socket closed"; | ||
5784 | - break; | ||
5785 | - default: | ||
5786 | - dout("unrecognized con state %d\n", (int)con->state); | ||
5787 | - con->error_msg = "unrecognized con state"; | ||
5788 | - BUG(); | ||
5789 | - } | ||
5790 | + if (con_sock_closed(con)) | ||
5791 | goto fault; | ||
5792 | - } | ||
5793 | |||
5794 | if (test_and_clear_bit(CON_FLAG_BACKOFF, &con->flags)) { | ||
5795 | dout("con_work %p backing off\n", con); | ||
5796 | @@ -2352,12 +2358,12 @@ fault: | ||
5797 | static void ceph_fault(struct ceph_connection *con) | ||
5798 | __releases(con->mutex) | ||
5799 | { | ||
5800 | - pr_err("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), | ||
5801 | + pr_warning("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), | ||
5802 | ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg); | ||
5803 | dout("fault %p state %lu to peer %s\n", | ||
5804 | con, con->state, ceph_pr_addr(&con->peer_addr.in_addr)); | ||
5805 | |||
5806 | - BUG_ON(con->state != CON_STATE_CONNECTING && | ||
5807 | + WARN_ON(con->state != CON_STATE_CONNECTING && | ||
5808 | con->state != CON_STATE_NEGOTIATING && | ||
5809 | con->state != CON_STATE_OPEN); | ||
5810 | |||
5811 | diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c | ||
5812 | index a79dbae..b16dfa2 100644 | ||
5813 | --- a/net/ceph/osd_client.c | ||
5814 | +++ b/net/ceph/osd_client.c | ||
5815 | @@ -221,6 +221,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, | ||
5816 | kref_init(&req->r_kref); | ||
5817 | init_completion(&req->r_completion); | ||
5818 | init_completion(&req->r_safe_completion); | ||
5819 | + RB_CLEAR_NODE(&req->r_node); | ||
5820 | INIT_LIST_HEAD(&req->r_unsafe_item); | ||
5821 | INIT_LIST_HEAD(&req->r_linger_item); | ||
5822 | INIT_LIST_HEAD(&req->r_linger_osd); | ||
5823 | @@ -461,6 +462,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, | ||
5824 | { | ||
5825 | struct ceph_osd_req_op ops[3]; | ||
5826 | struct ceph_osd_request *req; | ||
5827 | + int r; | ||
5828 | |||
5829 | ops[0].op = opcode; | ||
5830 | ops[0].extent.truncate_seq = truncate_seq; | ||
5831 | @@ -479,10 +481,12 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, | ||
5832 | use_mempool, | ||
5833 | GFP_NOFS, NULL, NULL); | ||
5834 | if (!req) | ||
5835 | - return NULL; | ||
5836 | + return ERR_PTR(-ENOMEM); | ||
5837 | |||
5838 | /* calculate max write size */ | ||
5839 | - calc_layout(osdc, vino, layout, off, plen, req, ops); | ||
5840 | + r = calc_layout(osdc, vino, layout, off, plen, req, ops); | ||
5841 | + if (r < 0) | ||
5842 | + return ERR_PTR(r); | ||
5843 | req->r_file_layout = *layout; /* keep a copy */ | ||
5844 | |||
5845 | /* in case it differs from natural (file) alignment that | ||
5846 | @@ -575,7 +579,7 @@ static void __kick_osd_requests(struct ceph_osd_client *osdc, | ||
5847 | |||
5848 | dout("__kick_osd_requests osd%d\n", osd->o_osd); | ||
5849 | err = __reset_osd(osdc, osd); | ||
5850 | - if (err == -EAGAIN) | ||
5851 | + if (err) | ||
5852 | return; | ||
5853 | |||
5854 | list_for_each_entry(req, &osd->o_requests, r_osd_item) { | ||
5855 | @@ -602,14 +606,6 @@ static void __kick_osd_requests(struct ceph_osd_client *osdc, | ||
5856 | } | ||
5857 | } | ||
5858 | |||
5859 | -static void kick_osd_requests(struct ceph_osd_client *osdc, | ||
5860 | - struct ceph_osd *kickosd) | ||
5861 | -{ | ||
5862 | - mutex_lock(&osdc->request_mutex); | ||
5863 | - __kick_osd_requests(osdc, kickosd); | ||
5864 | - mutex_unlock(&osdc->request_mutex); | ||
5865 | -} | ||
5866 | - | ||
5867 | /* | ||
5868 | * If the osd connection drops, we need to resubmit all requests. | ||
5869 | */ | ||
5870 | @@ -623,7 +619,9 @@ static void osd_reset(struct ceph_connection *con) | ||
5871 | dout("osd_reset osd%d\n", osd->o_osd); | ||
5872 | osdc = osd->o_osdc; | ||
5873 | down_read(&osdc->map_sem); | ||
5874 | - kick_osd_requests(osdc, osd); | ||
5875 | + mutex_lock(&osdc->request_mutex); | ||
5876 | + __kick_osd_requests(osdc, osd); | ||
5877 | + mutex_unlock(&osdc->request_mutex); | ||
5878 | send_queued(osdc); | ||
5879 | up_read(&osdc->map_sem); | ||
5880 | } | ||
5881 | @@ -642,6 +640,7 @@ static struct ceph_osd *create_osd(struct ceph_osd_client *osdc, int onum) | ||
5882 | atomic_set(&osd->o_ref, 1); | ||
5883 | osd->o_osdc = osdc; | ||
5884 | osd->o_osd = onum; | ||
5885 | + RB_CLEAR_NODE(&osd->o_node); | ||
5886 | INIT_LIST_HEAD(&osd->o_requests); | ||
5887 | INIT_LIST_HEAD(&osd->o_linger_requests); | ||
5888 | INIT_LIST_HEAD(&osd->o_osd_lru); | ||
5889 | @@ -745,6 +744,7 @@ static int __reset_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd) | ||
5890 | if (list_empty(&osd->o_requests) && | ||
5891 | list_empty(&osd->o_linger_requests)) { | ||
5892 | __remove_osd(osdc, osd); | ||
5893 | + ret = -ENODEV; | ||
5894 | } else if (memcmp(&osdc->osdmap->osd_addr[osd->o_osd], | ||
5895 | &osd->o_con.peer_addr, | ||
5896 | sizeof(osd->o_con.peer_addr)) == 0 && | ||
5897 | @@ -871,9 +871,9 @@ static void __unregister_request(struct ceph_osd_client *osdc, | ||
5898 | req->r_osd = NULL; | ||
5899 | } | ||
5900 | |||
5901 | + list_del_init(&req->r_req_lru_item); | ||
5902 | ceph_osdc_put_request(req); | ||
5903 | |||
5904 | - list_del_init(&req->r_req_lru_item); | ||
5905 | if (osdc->num_requests == 0) { | ||
5906 | dout(" no requests, canceling timeout\n"); | ||
5907 | __cancel_osd_timeout(osdc); | ||
5908 | @@ -905,8 +905,8 @@ static void __unregister_linger_request(struct ceph_osd_client *osdc, | ||
5909 | struct ceph_osd_request *req) | ||
5910 | { | ||
5911 | dout("__unregister_linger_request %p\n", req); | ||
5912 | + list_del_init(&req->r_linger_item); | ||
5913 | if (req->r_osd) { | ||
5914 | - list_del_init(&req->r_linger_item); | ||
5915 | list_del_init(&req->r_linger_osd); | ||
5916 | |||
5917 | if (list_empty(&req->r_osd->o_requests) && | ||
5918 | @@ -1085,12 +1085,10 @@ static void handle_timeout(struct work_struct *work) | ||
5919 | { | ||
5920 | struct ceph_osd_client *osdc = | ||
5921 | container_of(work, struct ceph_osd_client, timeout_work.work); | ||
5922 | - struct ceph_osd_request *req, *last_req = NULL; | ||
5923 | + struct ceph_osd_request *req; | ||
5924 | struct ceph_osd *osd; | ||
5925 | - unsigned long timeout = osdc->client->options->osd_timeout * HZ; | ||
5926 | unsigned long keepalive = | ||
5927 | osdc->client->options->osd_keepalive_timeout * HZ; | ||
5928 | - unsigned long last_stamp = 0; | ||
5929 | struct list_head slow_osds; | ||
5930 | dout("timeout\n"); | ||
5931 | down_read(&osdc->map_sem); | ||
5932 | @@ -1100,37 +1098,6 @@ static void handle_timeout(struct work_struct *work) | ||
5933 | mutex_lock(&osdc->request_mutex); | ||
5934 | |||
5935 | /* | ||
5936 | - * reset osds that appear to be _really_ unresponsive. this | ||
5937 | - * is a failsafe measure.. we really shouldn't be getting to | ||
5938 | - * this point if the system is working properly. the monitors | ||
5939 | - * should mark the osd as failed and we should find out about | ||
5940 | - * it from an updated osd map. | ||
5941 | - */ | ||
5942 | - while (timeout && !list_empty(&osdc->req_lru)) { | ||
5943 | - req = list_entry(osdc->req_lru.next, struct ceph_osd_request, | ||
5944 | - r_req_lru_item); | ||
5945 | - | ||
5946 | - /* hasn't been long enough since we sent it? */ | ||
5947 | - if (time_before(jiffies, req->r_stamp + timeout)) | ||
5948 | - break; | ||
5949 | - | ||
5950 | - /* hasn't been long enough since it was acked? */ | ||
5951 | - if (req->r_request->ack_stamp == 0 || | ||
5952 | - time_before(jiffies, req->r_request->ack_stamp + timeout)) | ||
5953 | - break; | ||
5954 | - | ||
5955 | - BUG_ON(req == last_req && req->r_stamp == last_stamp); | ||
5956 | - last_req = req; | ||
5957 | - last_stamp = req->r_stamp; | ||
5958 | - | ||
5959 | - osd = req->r_osd; | ||
5960 | - BUG_ON(!osd); | ||
5961 | - pr_warning(" tid %llu timed out on osd%d, will reset osd\n", | ||
5962 | - req->r_tid, osd->o_osd); | ||
5963 | - __kick_osd_requests(osdc, osd); | ||
5964 | - } | ||
5965 | - | ||
5966 | - /* | ||
5967 | * ping osds that are a bit slow. this ensures that if there | ||
5968 | * is a break in the TCP connection we will notice, and reopen | ||
5969 | * a connection with that osd (from the fault callback). | ||
5970 | @@ -1301,7 +1268,7 @@ static void reset_changed_osds(struct ceph_osd_client *osdc) | ||
5971 | * Requeue requests whose mapping to an OSD has changed. If requests map to | ||
5972 | * no osd, request a new map. | ||
5973 | * | ||
5974 | - * Caller should hold map_sem for read and request_mutex. | ||
5975 | + * Caller should hold map_sem for read. | ||
5976 | */ | ||
5977 | static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
5978 | { | ||
5979 | @@ -1315,6 +1282,24 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
5980 | for (p = rb_first(&osdc->requests); p; ) { | ||
5981 | req = rb_entry(p, struct ceph_osd_request, r_node); | ||
5982 | p = rb_next(p); | ||
5983 | + | ||
5984 | + /* | ||
5985 | + * For linger requests that have not yet been | ||
5986 | + * registered, move them to the linger list; they'll | ||
5987 | + * be sent to the osd in the loop below. Unregister | ||
5988 | + * the request before re-registering it as a linger | ||
5989 | + * request to ensure the __map_request() below | ||
5990 | + * will decide it needs to be sent. | ||
5991 | + */ | ||
5992 | + if (req->r_linger && list_empty(&req->r_linger_item)) { | ||
5993 | + dout("%p tid %llu restart on osd%d\n", | ||
5994 | + req, req->r_tid, | ||
5995 | + req->r_osd ? req->r_osd->o_osd : -1); | ||
5996 | + __unregister_request(osdc, req); | ||
5997 | + __register_linger_request(osdc, req); | ||
5998 | + continue; | ||
5999 | + } | ||
6000 | + | ||
6001 | err = __map_request(osdc, req, force_resend); | ||
6002 | if (err < 0) | ||
6003 | continue; /* error */ | ||
6004 | @@ -1329,17 +1314,6 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
6005 | req->r_flags |= CEPH_OSD_FLAG_RETRY; | ||
6006 | } | ||
6007 | } | ||
6008 | - if (req->r_linger && list_empty(&req->r_linger_item)) { | ||
6009 | - /* | ||
6010 | - * register as a linger so that we will | ||
6011 | - * re-submit below and get a new tid | ||
6012 | - */ | ||
6013 | - dout("%p tid %llu restart on osd%d\n", | ||
6014 | - req, req->r_tid, | ||
6015 | - req->r_osd ? req->r_osd->o_osd : -1); | ||
6016 | - __register_linger_request(osdc, req); | ||
6017 | - __unregister_request(osdc, req); | ||
6018 | - } | ||
6019 | } | ||
6020 | |||
6021 | list_for_each_entry_safe(req, nreq, &osdc->req_linger, | ||
6022 | @@ -1347,6 +1321,7 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
6023 | dout("linger req=%p req->r_osd=%p\n", req, req->r_osd); | ||
6024 | |||
6025 | err = __map_request(osdc, req, force_resend); | ||
6026 | + dout("__map_request returned %d\n", err); | ||
6027 | if (err == 0) | ||
6028 | continue; /* no change and no osd was specified */ | ||
6029 | if (err < 0) | ||
6030 | @@ -1359,8 +1334,8 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
6031 | |||
6032 | dout("kicking lingering %p tid %llu osd%d\n", req, req->r_tid, | ||
6033 | req->r_osd ? req->r_osd->o_osd : -1); | ||
6034 | - __unregister_linger_request(osdc, req); | ||
6035 | __register_request(osdc, req); | ||
6036 | + __unregister_linger_request(osdc, req); | ||
6037 | } | ||
6038 | mutex_unlock(&osdc->request_mutex); | ||
6039 | |||
6040 | @@ -1368,6 +1343,7 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
6041 | dout("%d requests for down osds, need new map\n", needmap); | ||
6042 | ceph_monc_request_next_osdmap(&osdc->client->monc); | ||
6043 | } | ||
6044 | + reset_changed_osds(osdc); | ||
6045 | } | ||
6046 | |||
6047 | |||
6048 | @@ -1424,7 +1400,6 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | ||
6049 | osdc->osdmap = newmap; | ||
6050 | } | ||
6051 | kick_requests(osdc, 0); | ||
6052 | - reset_changed_osds(osdc); | ||
6053 | } else { | ||
6054 | dout("ignoring incremental map %u len %d\n", | ||
6055 | epoch, maplen); | ||
6056 | @@ -1594,6 +1569,7 @@ int ceph_osdc_create_event(struct ceph_osd_client *osdc, | ||
6057 | event->data = data; | ||
6058 | event->osdc = osdc; | ||
6059 | INIT_LIST_HEAD(&event->osd_node); | ||
6060 | + RB_CLEAR_NODE(&event->node); | ||
6061 | kref_init(&event->kref); /* one ref for us */ | ||
6062 | kref_get(&event->kref); /* one ref for the caller */ | ||
6063 | init_completion(&event->completion); | ||
6064 | @@ -1925,8 +1901,8 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc, | ||
6065 | CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ, | ||
6066 | NULL, 0, truncate_seq, truncate_size, NULL, | ||
6067 | false, 1, page_align); | ||
6068 | - if (!req) | ||
6069 | - return -ENOMEM; | ||
6070 | + if (IS_ERR(req)) | ||
6071 | + return PTR_ERR(req); | ||
6072 | |||
6073 | /* it may be a short read due to an object boundary */ | ||
6074 | req->r_pages = pages; | ||
6075 | @@ -1968,8 +1944,8 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino, | ||
6076 | snapc, do_sync, | ||
6077 | truncate_seq, truncate_size, mtime, | ||
6078 | nofail, 1, page_align); | ||
6079 | - if (!req) | ||
6080 | - return -ENOMEM; | ||
6081 | + if (IS_ERR(req)) | ||
6082 | + return PTR_ERR(req); | ||
6083 | |||
6084 | /* it may be a short write due to an object boundary */ | ||
6085 | req->r_pages = pages; | ||
6086 | diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c | ||
6087 | index 430076e..7fbe210 100644 | ||
6088 | --- a/net/ceph/osdmap.c | ||
6089 | +++ b/net/ceph/osdmap.c | ||
6090 | @@ -613,10 +613,12 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | ||
6091 | ceph_decode_32_safe(p, end, max, bad); | ||
6092 | while (max--) { | ||
6093 | ceph_decode_need(p, end, 4 + 1 + sizeof(pi->v), bad); | ||
6094 | + err = -ENOMEM; | ||
6095 | pi = kzalloc(sizeof(*pi), GFP_NOFS); | ||
6096 | if (!pi) | ||
6097 | goto bad; | ||
6098 | pi->id = ceph_decode_32(p); | ||
6099 | + err = -EINVAL; | ||
6100 | ev = ceph_decode_8(p); /* encoding version */ | ||
6101 | if (ev > CEPH_PG_POOL_VERSION) { | ||
6102 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", | ||
6103 | @@ -632,8 +634,13 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | ||
6104 | __insert_pg_pool(&map->pg_pools, pi); | ||
6105 | } | ||
6106 | |||
6107 | - if (version >= 5 && __decode_pool_names(p, end, map) < 0) | ||
6108 | - goto bad; | ||
6109 | + if (version >= 5) { | ||
6110 | + err = __decode_pool_names(p, end, map); | ||
6111 | + if (err < 0) { | ||
6112 | + dout("fail to decode pool names"); | ||
6113 | + goto bad; | ||
6114 | + } | ||
6115 | + } | ||
6116 | |||
6117 | ceph_decode_32_safe(p, end, map->pool_max, bad); | ||
6118 | |||
6119 | @@ -713,7 +720,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | ||
6120 | return map; | ||
6121 | |||
6122 | bad: | ||
6123 | - dout("osdmap_decode fail\n"); | ||
6124 | + dout("osdmap_decode fail err %d\n", err); | ||
6125 | ceph_osdmap_destroy(map); | ||
6126 | return ERR_PTR(err); | ||
6127 | } | ||
6128 | @@ -807,6 +814,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
6129 | if (ev > CEPH_PG_POOL_VERSION) { | ||
6130 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", | ||
6131 | ev, CEPH_PG_POOL_VERSION); | ||
6132 | + err = -EINVAL; | ||
6133 | goto bad; | ||
6134 | } | ||
6135 | pi = __lookup_pg_pool(&map->pg_pools, pool); | ||
6136 | @@ -823,8 +831,11 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
6137 | if (err < 0) | ||
6138 | goto bad; | ||
6139 | } | ||
6140 | - if (version >= 5 && __decode_pool_names(p, end, map) < 0) | ||
6141 | - goto bad; | ||
6142 | + if (version >= 5) { | ||
6143 | + err = __decode_pool_names(p, end, map); | ||
6144 | + if (err < 0) | ||
6145 | + goto bad; | ||
6146 | + } | ||
6147 | |||
6148 | /* old_pool */ | ||
6149 | ceph_decode_32_safe(p, end, len, bad); | ||
6150 | @@ -900,15 +911,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
6151 | (void) __remove_pg_mapping(&map->pg_temp, pgid); | ||
6152 | |||
6153 | /* insert */ | ||
6154 | - if (pglen > (UINT_MAX - sizeof(*pg)) / sizeof(u32)) { | ||
6155 | - err = -EINVAL; | ||
6156 | + err = -EINVAL; | ||
6157 | + if (pglen > (UINT_MAX - sizeof(*pg)) / sizeof(u32)) | ||
6158 | goto bad; | ||
6159 | - } | ||
6160 | + err = -ENOMEM; | ||
6161 | pg = kmalloc(sizeof(*pg) + sizeof(u32)*pglen, GFP_NOFS); | ||
6162 | - if (!pg) { | ||
6163 | - err = -ENOMEM; | ||
6164 | + if (!pg) | ||
6165 | goto bad; | ||
6166 | - } | ||
6167 | pg->pgid = pgid; | ||
6168 | pg->len = pglen; | ||
6169 | for (j = 0; j < pglen; j++) | ||
6170 | diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c | ||
6171 | index 7c51bae..50191a3 100644 | ||
6172 | --- a/net/mac80211/ibss.c | ||
6173 | +++ b/net/mac80211/ibss.c | ||
6174 | @@ -664,8 +664,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata) | ||
6175 | printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other " | ||
6176 | "IBSS networks with same SSID (merge)\n", sdata->name); | ||
6177 | |||
6178 | - ieee80211_request_internal_scan(sdata, | ||
6179 | - ifibss->ssid, ifibss->ssid_len, NULL); | ||
6180 | + ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len, | ||
6181 | + NULL); | ||
6182 | } | ||
6183 | |||
6184 | static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata) | ||
6185 | @@ -772,9 +772,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata) | ||
6186 | printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to " | ||
6187 | "join\n", sdata->name); | ||
6188 | |||
6189 | - ieee80211_request_internal_scan(sdata, | ||
6190 | - ifibss->ssid, ifibss->ssid_len, | ||
6191 | - ifibss->fixed_channel ? ifibss->channel : NULL); | ||
6192 | + ieee80211_request_ibss_scan(sdata, ifibss->ssid, | ||
6193 | + ifibss->ssid_len, chan); | ||
6194 | } else { | ||
6195 | int interval = IEEE80211_SCAN_INTERVAL; | ||
6196 | |||
6197 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
6198 | index 498e87b..f8b5e75 100644 | ||
6199 | --- a/net/mac80211/ieee80211_i.h | ||
6200 | +++ b/net/mac80211/ieee80211_i.h | ||
6201 | @@ -1233,9 +1233,9 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, | ||
6202 | |||
6203 | /* scan/BSS handling */ | ||
6204 | void ieee80211_scan_work(struct work_struct *work); | ||
6205 | -int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | ||
6206 | - const u8 *ssid, u8 ssid_len, | ||
6207 | - struct ieee80211_channel *chan); | ||
6208 | +int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, | ||
6209 | + const u8 *ssid, u8 ssid_len, | ||
6210 | + struct ieee80211_channel *chan); | ||
6211 | int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, | ||
6212 | struct cfg80211_scan_request *req); | ||
6213 | void ieee80211_scan_cancel(struct ieee80211_local *local); | ||
6214 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c | ||
6215 | index c70e176..e95d494 100644 | ||
6216 | --- a/net/mac80211/scan.c | ||
6217 | +++ b/net/mac80211/scan.c | ||
6218 | @@ -761,9 +761,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, | ||
6219 | return res; | ||
6220 | } | ||
6221 | |||
6222 | -int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | ||
6223 | - const u8 *ssid, u8 ssid_len, | ||
6224 | - struct ieee80211_channel *chan) | ||
6225 | +int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, | ||
6226 | + const u8 *ssid, u8 ssid_len, | ||
6227 | + struct ieee80211_channel *chan) | ||
6228 | { | ||
6229 | struct ieee80211_local *local = sdata->local; | ||
6230 | int ret = -EBUSY; | ||
6231 | @@ -777,22 +777,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | ||
6232 | |||
6233 | /* fill internal scan request */ | ||
6234 | if (!chan) { | ||
6235 | - int i, nchan = 0; | ||
6236 | + int i, max_n; | ||
6237 | + int n_ch = 0; | ||
6238 | |||
6239 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | ||
6240 | if (!local->hw.wiphy->bands[band]) | ||
6241 | continue; | ||
6242 | - for (i = 0; | ||
6243 | - i < local->hw.wiphy->bands[band]->n_channels; | ||
6244 | - i++) { | ||
6245 | - local->int_scan_req->channels[nchan] = | ||
6246 | + | ||
6247 | + max_n = local->hw.wiphy->bands[band]->n_channels; | ||
6248 | + for (i = 0; i < max_n; i++) { | ||
6249 | + struct ieee80211_channel *tmp_ch = | ||
6250 | &local->hw.wiphy->bands[band]->channels[i]; | ||
6251 | - nchan++; | ||
6252 | + | ||
6253 | + if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS | | ||
6254 | + IEEE80211_CHAN_DISABLED)) | ||
6255 | + continue; | ||
6256 | + | ||
6257 | + local->int_scan_req->channels[n_ch] = tmp_ch; | ||
6258 | + n_ch++; | ||
6259 | } | ||
6260 | } | ||
6261 | |||
6262 | - local->int_scan_req->n_channels = nchan; | ||
6263 | + if (WARN_ON_ONCE(n_ch == 0)) | ||
6264 | + goto unlock; | ||
6265 | + | ||
6266 | + local->int_scan_req->n_channels = n_ch; | ||
6267 | } else { | ||
6268 | + if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS | | ||
6269 | + IEEE80211_CHAN_DISABLED))) | ||
6270 | + goto unlock; | ||
6271 | + | ||
6272 | local->int_scan_req->channels[0] = chan; | ||
6273 | local->int_scan_req->n_channels = 1; | ||
6274 | } | ||
6275 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c | ||
6276 | index 6d25d77..e2e0e0b 100644 | ||
6277 | --- a/net/mac80211/sta_info.c | ||
6278 | +++ b/net/mac80211/sta_info.c | ||
6279 | @@ -844,7 +844,7 @@ void sta_info_init(struct ieee80211_local *local) | ||
6280 | |||
6281 | void sta_info_stop(struct ieee80211_local *local) | ||
6282 | { | ||
6283 | - del_timer(&local->sta_cleanup); | ||
6284 | + del_timer_sync(&local->sta_cleanup); | ||
6285 | sta_info_flush(local, NULL); | ||
6286 | } | ||
6287 | |||
6288 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c | ||
6289 | index 57f2731..a28a211 100644 | ||
6290 | --- a/net/sunrpc/clnt.c | ||
6291 | +++ b/net/sunrpc/clnt.c | ||
6292 | @@ -236,7 +236,7 @@ static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event) | ||
6293 | spin_lock(&sn->rpc_client_lock); | ||
6294 | list_for_each_entry(clnt, &sn->all_clients, cl_clients) { | ||
6295 | if (clnt->cl_program->pipe_dir_name == NULL) | ||
6296 | - break; | ||
6297 | + continue; | ||
6298 | if (rpc_clnt_skip_event(clnt, event)) | ||
6299 | continue; | ||
6300 | if (atomic_inc_not_zero(&clnt->cl_count) == 0) | ||
6301 | diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c | ||
6302 | index faa078f..b8bda44 100644 | ||
6303 | --- a/net/sunrpc/rpc_pipe.c | ||
6304 | +++ b/net/sunrpc/rpc_pipe.c | ||
6305 | @@ -1157,14 +1157,19 @@ static void rpc_kill_sb(struct super_block *sb) | ||
6306 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); | ||
6307 | |||
6308 | mutex_lock(&sn->pipefs_sb_lock); | ||
6309 | + if (sn->pipefs_sb != sb) { | ||
6310 | + mutex_unlock(&sn->pipefs_sb_lock); | ||
6311 | + goto out; | ||
6312 | + } | ||
6313 | sn->pipefs_sb = NULL; | ||
6314 | mutex_unlock(&sn->pipefs_sb_lock); | ||
6315 | - put_net(net); | ||
6316 | dprintk("RPC: sending pipefs UMOUNT notification for net %p%s\n", net, | ||
6317 | NET_NAME(net)); | ||
6318 | blocking_notifier_call_chain(&rpc_pipefs_notifier_list, | ||
6319 | RPC_PIPEFS_UMOUNT, | ||
6320 | sb); | ||
6321 | + put_net(net); | ||
6322 | +out: | ||
6323 | kill_litter_super(sb); | ||
6324 | } | ||
6325 | |||
6326 | diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c | ||
6327 | index eda32ae..85b9235 100644 | ||
6328 | --- a/net/sunrpc/sched.c | ||
6329 | +++ b/net/sunrpc/sched.c | ||
6330 | @@ -915,16 +915,35 @@ struct rpc_task *rpc_new_task(const struct rpc_task_setup *setup_data) | ||
6331 | return task; | ||
6332 | } | ||
6333 | |||
6334 | +/* | ||
6335 | + * rpc_free_task - release rpc task and perform cleanups | ||
6336 | + * | ||
6337 | + * Note that we free up the rpc_task _after_ rpc_release_calldata() | ||
6338 | + * in order to work around a workqueue dependency issue. | ||
6339 | + * | ||
6340 | + * Tejun Heo states: | ||
6341 | + * "Workqueue currently considers two work items to be the same if they're | ||
6342 | + * on the same address and won't execute them concurrently - ie. it | ||
6343 | + * makes a work item which is queued again while being executed wait | ||
6344 | + * for the previous execution to complete. | ||
6345 | + * | ||
6346 | + * If a work function frees the work item, and then waits for an event | ||
6347 | + * which should be performed by another work item and *that* work item | ||
6348 | + * recycles the freed work item, it can create a false dependency loop. | ||
6349 | + * There really is no reliable way to detect this short of verifying | ||
6350 | + * every memory free." | ||
6351 | + * | ||
6352 | + */ | ||
6353 | static void rpc_free_task(struct rpc_task *task) | ||
6354 | { | ||
6355 | - const struct rpc_call_ops *tk_ops = task->tk_ops; | ||
6356 | - void *calldata = task->tk_calldata; | ||
6357 | + unsigned short tk_flags = task->tk_flags; | ||
6358 | + | ||
6359 | + rpc_release_calldata(task->tk_ops, task->tk_calldata); | ||
6360 | |||
6361 | - if (task->tk_flags & RPC_TASK_DYNAMIC) { | ||
6362 | + if (tk_flags & RPC_TASK_DYNAMIC) { | ||
6363 | dprintk("RPC: %5u freeing task\n", task->tk_pid); | ||
6364 | mempool_free(task, rpc_task_mempool); | ||
6365 | } | ||
6366 | - rpc_release_calldata(tk_ops, calldata); | ||
6367 | } | ||
6368 | |||
6369 | static void rpc_async_release(struct work_struct *work) | ||
6370 | @@ -934,8 +953,7 @@ static void rpc_async_release(struct work_struct *work) | ||
6371 | |||
6372 | static void rpc_release_resources_task(struct rpc_task *task) | ||
6373 | { | ||
6374 | - if (task->tk_rqstp) | ||
6375 | - xprt_release(task); | ||
6376 | + xprt_release(task); | ||
6377 | if (task->tk_msg.rpc_cred) { | ||
6378 | put_rpccred(task->tk_msg.rpc_cred); | ||
6379 | task->tk_msg.rpc_cred = NULL; | ||
6380 | diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c | ||
6381 | index 176a24f..feea474 100644 | ||
6382 | --- a/net/sunrpc/xprt.c | ||
6383 | +++ b/net/sunrpc/xprt.c | ||
6384 | @@ -1139,10 +1139,18 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) | ||
6385 | void xprt_release(struct rpc_task *task) | ||
6386 | { | ||
6387 | struct rpc_xprt *xprt; | ||
6388 | - struct rpc_rqst *req; | ||
6389 | + struct rpc_rqst *req = task->tk_rqstp; | ||
6390 | |||
6391 | - if (!(req = task->tk_rqstp)) | ||
6392 | + if (req == NULL) { | ||
6393 | + if (task->tk_client) { | ||
6394 | + rcu_read_lock(); | ||
6395 | + xprt = rcu_dereference(task->tk_client->cl_xprt); | ||
6396 | + if (xprt->snd_task == task) | ||
6397 | + xprt_release_write(xprt, task); | ||
6398 | + rcu_read_unlock(); | ||
6399 | + } | ||
6400 | return; | ||
6401 | + } | ||
6402 | |||
6403 | xprt = req->rq_xprt; | ||
6404 | if (task->tk_ops->rpc_count_stats != NULL) | ||
6405 | diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c | ||
6406 | index 48d7c0a..bd3ba88 100644 | ||
6407 | --- a/sound/arm/pxa2xx-ac97-lib.c | ||
6408 | +++ b/sound/arm/pxa2xx-ac97-lib.c | ||
6409 | @@ -18,6 +18,7 @@ | ||
6410 | #include <linux/delay.h> | ||
6411 | #include <linux/module.h> | ||
6412 | #include <linux/io.h> | ||
6413 | +#include <linux/gpio.h> | ||
6414 | |||
6415 | #include <sound/ac97_codec.h> | ||
6416 | #include <sound/pxa2xx-lib.h> | ||
6417 | @@ -148,6 +149,8 @@ static inline void pxa_ac97_warm_pxa27x(void) | ||
6418 | |||
6419 | static inline void pxa_ac97_cold_pxa27x(void) | ||
6420 | { | ||
6421 | + unsigned int timeout; | ||
6422 | + | ||
6423 | GCR &= GCR_COLD_RST; /* clear everything but nCRST */ | ||
6424 | GCR &= ~GCR_COLD_RST; /* then assert nCRST */ | ||
6425 | |||
6426 | @@ -157,8 +160,10 @@ static inline void pxa_ac97_cold_pxa27x(void) | ||
6427 | clk_enable(ac97conf_clk); | ||
6428 | udelay(5); | ||
6429 | clk_disable(ac97conf_clk); | ||
6430 | - GCR = GCR_COLD_RST; | ||
6431 | - udelay(50); | ||
6432 | + GCR = GCR_COLD_RST | GCR_WARM_RST; | ||
6433 | + timeout = 100; /* wait for the codec-ready bit to be set */ | ||
6434 | + while (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)) && timeout--) | ||
6435 | + mdelay(1); | ||
6436 | } | ||
6437 | #endif | ||
6438 | |||
6439 | @@ -340,8 +345,21 @@ int __devinit pxa2xx_ac97_hw_probe(struct platform_device *dev) | ||
6440 | } | ||
6441 | |||
6442 | if (cpu_is_pxa27x()) { | ||
6443 | - /* Use GPIO 113 as AC97 Reset on Bulverde */ | ||
6444 | + /* | ||
6445 | + * This gpio is needed for a work-around to a bug in the ac97 | ||
6446 | + * controller during warm reset. The direction and level is set | ||
6447 | + * here so that it is an output driven high when switching from | ||
6448 | + * AC97_nRESET alt function to generic gpio. | ||
6449 | + */ | ||
6450 | + ret = gpio_request_one(reset_gpio, GPIOF_OUT_INIT_HIGH, | ||
6451 | + "pxa27x ac97 reset"); | ||
6452 | + if (ret < 0) { | ||
6453 | + pr_err("%s: gpio_request_one() failed: %d\n", | ||
6454 | + __func__, ret); | ||
6455 | + goto err_conf; | ||
6456 | + } | ||
6457 | pxa27x_assert_ac97reset(reset_gpio, 0); | ||
6458 | + | ||
6459 | ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK"); | ||
6460 | if (IS_ERR(ac97conf_clk)) { | ||
6461 | ret = PTR_ERR(ac97conf_clk); | ||
6462 | @@ -384,6 +402,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_probe); | ||
6463 | |||
6464 | void pxa2xx_ac97_hw_remove(struct platform_device *dev) | ||
6465 | { | ||
6466 | + if (cpu_is_pxa27x()) | ||
6467 | + gpio_free(reset_gpio); | ||
6468 | GCR |= GCR_ACLINK_OFF; | ||
6469 | free_irq(IRQ_AC97, NULL); | ||
6470 | if (ac97conf_clk) { | ||
6471 | diff --git a/sound/soc/codecs/sigmadsp.c b/sound/soc/codecs/sigmadsp.c | ||
6472 | index 5be42bf..4068f24 100644 | ||
6473 | --- a/sound/soc/codecs/sigmadsp.c | ||
6474 | +++ b/sound/soc/codecs/sigmadsp.c | ||
6475 | @@ -225,7 +225,7 @@ EXPORT_SYMBOL(process_sigma_firmware); | ||
6476 | static int sigma_action_write_regmap(void *control_data, | ||
6477 | const struct sigma_action *sa, size_t len) | ||
6478 | { | ||
6479 | - return regmap_raw_write(control_data, le16_to_cpu(sa->addr), | ||
6480 | + return regmap_raw_write(control_data, be16_to_cpu(sa->addr), | ||
6481 | sa->payload, len - 2); | ||
6482 | } | ||
6483 | |||
6484 | diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c | ||
6485 | index ae6f26f..bb9f070 100644 | ||
6486 | --- a/sound/soc/codecs/wm2000.c | ||
6487 | +++ b/sound/soc/codecs/wm2000.c | ||
6488 | @@ -190,9 +190,9 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue) | ||
6489 | |||
6490 | ret = wm2000_read(i2c, WM2000_REG_SPEECH_CLARITY); | ||
6491 | if (wm2000->speech_clarity) | ||
6492 | - ret &= ~WM2000_SPEECH_CLARITY; | ||
6493 | - else | ||
6494 | ret |= WM2000_SPEECH_CLARITY; | ||
6495 | + else | ||
6496 | + ret &= ~WM2000_SPEECH_CLARITY; | ||
6497 | wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, ret); | ||
6498 | |||
6499 | wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33); | ||
6500 | diff --git a/sound/soc/codecs/wm2200.c b/sound/soc/codecs/wm2200.c | ||
6501 | index c8bff6d..86b84a1 100644 | ||
6502 | --- a/sound/soc/codecs/wm2200.c | ||
6503 | +++ b/sound/soc/codecs/wm2200.c | ||
6504 | @@ -1380,15 +1380,9 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
6505 | case SND_SOC_DAIFMT_DSP_A: | ||
6506 | fmt_val = 0; | ||
6507 | break; | ||
6508 | - case SND_SOC_DAIFMT_DSP_B: | ||
6509 | - fmt_val = 1; | ||
6510 | - break; | ||
6511 | case SND_SOC_DAIFMT_I2S: | ||
6512 | fmt_val = 2; | ||
6513 | break; | ||
6514 | - case SND_SOC_DAIFMT_LEFT_J: | ||
6515 | - fmt_val = 3; | ||
6516 | - break; | ||
6517 | default: | ||
6518 | dev_err(codec->dev, "Unsupported DAI format %d\n", | ||
6519 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); | ||
6520 | @@ -1440,7 +1434,7 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
6521 | WM2200_AIF1TX_LRCLK_MSTR | WM2200_AIF1TX_LRCLK_INV, | ||
6522 | lrclk); | ||
6523 | snd_soc_update_bits(codec, WM2200_AUDIO_IF_1_5, | ||
6524 | - WM2200_AIF1_FMT_MASK << 1, fmt_val << 1); | ||
6525 | + WM2200_AIF1_FMT_MASK, fmt_val); | ||
6526 | |||
6527 | return 0; | ||
6528 | } | ||
6529 | diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c | ||
6530 | index b9c185c..a8d03ab 100644 | ||
6531 | --- a/sound/soc/codecs/wm5100.c | ||
6532 | +++ b/sound/soc/codecs/wm5100.c | ||
6533 | @@ -1296,15 +1296,9 @@ static int wm5100_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
6534 | case SND_SOC_DAIFMT_DSP_A: | ||
6535 | mask = 0; | ||
6536 | break; | ||
6537 | - case SND_SOC_DAIFMT_DSP_B: | ||
6538 | - mask = 1; | ||
6539 | - break; | ||
6540 | case SND_SOC_DAIFMT_I2S: | ||
6541 | mask = 2; | ||
6542 | break; | ||
6543 | - case SND_SOC_DAIFMT_LEFT_J: | ||
6544 | - mask = 3; | ||
6545 | - break; | ||
6546 | default: | ||
6547 | dev_err(codec->dev, "Unsupported DAI format %d\n", | ||
6548 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); | ||
6549 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
6550 | index 9739b53..71b9036 100644 | ||
6551 | --- a/virt/kvm/kvm_main.c | ||
6552 | +++ b/virt/kvm/kvm_main.c | ||
6553 | @@ -693,8 +693,7 @@ int __kvm_set_memory_region(struct kvm *kvm, | ||
6554 | int r; | ||
6555 | gfn_t base_gfn; | ||
6556 | unsigned long npages; | ||
6557 | - unsigned long i; | ||
6558 | - struct kvm_memory_slot *memslot; | ||
6559 | + struct kvm_memory_slot *memslot, *slot; | ||
6560 | struct kvm_memory_slot old, new; | ||
6561 | struct kvm_memslots *slots, *old_memslots; | ||
6562 | |||
6563 | @@ -741,13 +740,11 @@ int __kvm_set_memory_region(struct kvm *kvm, | ||
6564 | |||
6565 | /* Check for overlaps */ | ||
6566 | r = -EEXIST; | ||
6567 | - for (i = 0; i < KVM_MEMORY_SLOTS; ++i) { | ||
6568 | - struct kvm_memory_slot *s = &kvm->memslots->memslots[i]; | ||
6569 | - | ||
6570 | - if (s == memslot || !s->npages) | ||
6571 | + kvm_for_each_memslot(slot, kvm->memslots) { | ||
6572 | + if (slot->id >= KVM_MEMORY_SLOTS || slot == memslot) | ||
6573 | continue; | ||
6574 | - if (!((base_gfn + npages <= s->base_gfn) || | ||
6575 | - (base_gfn >= s->base_gfn + s->npages))) | ||
6576 | + if (!((base_gfn + npages <= slot->base_gfn) || | ||
6577 | + (base_gfn >= slot->base_gfn + slot->npages))) | ||
6578 | goto out_free; | ||
6579 | } | ||
6580 |