Magellan Linux

Annotation of /trunk/kernel26-alx/patches-2.6.23-r1/0105-2.6.23.6-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 658 - (hide annotations) (download)
Mon Jun 23 21:39:39 2008 UTC (15 years, 11 months ago) by niro
File size: 55568 byte(s)
2.6.23-alx-r1: new default as we fix the via epia clocksource=tsc quircks
-linux-2.6.23.17
-fbcondecor-0.9.4
-squashfs-3.3
-unionfs-2.3.3
-ipw3945-1.2.2
-mptbase-vmware fix

1 niro 658 diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
2     index 2cbb9aa..37b651e 100644
3     --- a/drivers/acpi/sleep/main.c
4     +++ b/drivers/acpi/sleep/main.c
5     @@ -170,8 +170,8 @@ static int acpi_pm_finish(suspend_state_t pm_state)
6     {
7     u32 acpi_state = acpi_target_sleep_state;
8    
9     - acpi_leave_sleep_state(acpi_state);
10     acpi_disable_wakeup_device(acpi_state);
11     + acpi_leave_sleep_state(acpi_state);
12    
13     /* reset firmware waking vector */
14     acpi_set_firmware_waking_vector((acpi_physical_address) 0);
15     @@ -256,8 +256,8 @@ static int acpi_hibernation_enter(void)
16    
17     static void acpi_hibernation_finish(void)
18     {
19     - acpi_leave_sleep_state(ACPI_STATE_S4);
20     acpi_disable_wakeup_device(ACPI_STATE_S4);
21     + acpi_leave_sleep_state(ACPI_STATE_S4);
22    
23     /* reset firmware waking vector */
24     acpi_set_firmware_waking_vector((acpi_physical_address) 0);
25     @@ -389,6 +389,7 @@ static void acpi_power_off(void)
26     /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
27     printk("%s called\n", __FUNCTION__);
28     local_irq_disable();
29     + acpi_enable_wakeup_device(ACPI_STATE_S5);
30     acpi_enter_sleep_state(ACPI_STATE_S5);
31     }
32    
33     diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
34     index c168203..d684208 100644
35     --- a/drivers/ata/ahci.c
36     +++ b/drivers/ata/ahci.c
37     @@ -41,6 +41,7 @@
38     #include <linux/interrupt.h>
39     #include <linux/dma-mapping.h>
40     #include <linux/device.h>
41     +#include <linux/dmi.h>
42     #include <scsi/scsi_host.h>
43     #include <scsi/scsi_cmnd.h>
44     #include <linux/libata.h>
45     @@ -231,6 +232,7 @@ static void ahci_freeze(struct ata_port *ap);
46     static void ahci_thaw(struct ata_port *ap);
47     static void ahci_error_handler(struct ata_port *ap);
48     static void ahci_vt8251_error_handler(struct ata_port *ap);
49     +static void ahci_p5wdh_error_handler(struct ata_port *ap);
50     static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
51     static int ahci_port_resume(struct ata_port *ap);
52     static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl);
53     @@ -329,6 +331,40 @@ static const struct ata_port_operations ahci_vt8251_ops = {
54     .port_stop = ahci_port_stop,
55     };
56    
57     +static const struct ata_port_operations ahci_p5wdh_ops = {
58     + .port_disable = ata_port_disable,
59     +
60     + .check_status = ahci_check_status,
61     + .check_altstatus = ahci_check_status,
62     + .dev_select = ata_noop_dev_select,
63     +
64     + .tf_read = ahci_tf_read,
65     +
66     + .qc_prep = ahci_qc_prep,
67     + .qc_issue = ahci_qc_issue,
68     +
69     + .irq_clear = ahci_irq_clear,
70     + .irq_on = ata_dummy_irq_on,
71     + .irq_ack = ata_dummy_irq_ack,
72     +
73     + .scr_read = ahci_scr_read,
74     + .scr_write = ahci_scr_write,
75     +
76     + .freeze = ahci_freeze,
77     + .thaw = ahci_thaw,
78     +
79     + .error_handler = ahci_p5wdh_error_handler,
80     + .post_internal_cmd = ahci_post_internal_cmd,
81     +
82     +#ifdef CONFIG_PM
83     + .port_suspend = ahci_port_suspend,
84     + .port_resume = ahci_port_resume,
85     +#endif
86     +
87     + .port_start = ahci_port_start,
88     + .port_stop = ahci_port_stop,
89     +};
90     +
91     static const struct ata_port_info ahci_port_info[] = {
92     /* board_ahci */
93     {
94     @@ -1176,6 +1212,52 @@ static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class,
95     return rc ?: -EAGAIN;
96     }
97    
98     +static int ahci_p5wdh_hardreset(struct ata_port *ap, unsigned int *class,
99     + unsigned long deadline)
100     +{
101     + struct ahci_port_priv *pp = ap->private_data;
102     + u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
103     + struct ata_taskfile tf;
104     + int rc;
105     +
106     + ahci_stop_engine(ap);
107     +
108     + /* clear D2H reception area to properly wait for D2H FIS */
109     + ata_tf_init(ap->device, &tf);
110     + tf.command = 0x80;
111     + ata_tf_to_fis(&tf, 0, 0, d2h_fis);
112     +
113     + rc = sata_port_hardreset(ap, sata_ehc_deb_timing(&ap->eh_context),
114     + deadline);
115     +
116     + ahci_start_engine(ap);
117     +
118     + if (rc || ata_port_offline(ap))
119     + return rc;
120     +
121     + /* spec mandates ">= 2ms" before checking status */
122     + msleep(150);
123     +
124     + /* The pseudo configuration device on SIMG4726 attached to
125     + * ASUS P5W-DH Deluxe doesn't send signature FIS after
126     + * hardreset if no device is attached to the first downstream
127     + * port && the pseudo device locks up on SRST w/ PMP==0. To
128     + * work around this, wait for !BSY only briefly. If BSY isn't
129     + * cleared, perform CLO and proceed to IDENTIFY (achieved by
130     + * ATA_LFLAG_NO_SRST and ATA_LFLAG_ASSUME_ATA).
131     + *
132     + * Wait for two seconds. Devices attached to downstream port
133     + * which can't process the following IDENTIFY after this will
134     + * have to be reset again. For most cases, this should
135     + * suffice while making probing snappish enough.
136     + */
137     + rc = ata_wait_ready(ap, jiffies + 2 * HZ);
138     + if (rc)
139     + ahci_kick_engine(ap, 0);
140     +
141     + return 0;
142     +}
143     +
144     static void ahci_postreset(struct ata_port *ap, unsigned int *class)
145     {
146     void __iomem *port_mmio = ahci_port_base(ap);
147     @@ -1556,6 +1638,19 @@ static void ahci_vt8251_error_handler(struct ata_port *ap)
148     ahci_postreset);
149     }
150    
151     +static void ahci_p5wdh_error_handler(struct ata_port *ap)
152     +{
153     + if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
154     + /* restart engine */
155     + ahci_stop_engine(ap);
156     + ahci_start_engine(ap);
157     + }
158     +
159     + /* perform recovery */
160     + ata_do_eh(ap, ata_std_prereset, ahci_softreset, ahci_p5wdh_hardreset,
161     + ahci_postreset);
162     +}
163     +
164     static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)
165     {
166     struct ata_port *ap = qc->ap;
167     @@ -1802,6 +1897,51 @@ static void ahci_print_info(struct ata_host *host)
168     );
169     }
170    
171     +/* On ASUS P5W DH Deluxe, the second port of PCI device 00:1f.2 is
172     + * hardwired to on-board SIMG 4726. The chipset is ICH8 and doesn't
173     + * support PMP and the 4726 either directly exports the device
174     + * attached to the first downstream port or acts as a hardware storage
175     + * controller and emulate a single ATA device (can be RAID 0/1 or some
176     + * other configuration).
177     + *
178     + * When there's no device attached to the first downstream port of the
179     + * 4726, "Config Disk" appears, which is a pseudo ATA device to
180     + * configure the 4726. However, ATA emulation of the device is very
181     + * lame. It doesn't send signature D2H Reg FIS after the initial
182     + * hardreset, pukes on SRST w/ PMP==0 and has bunch of other issues.
183     + *
184     + * The following function works around the problem by always using
185     + * hardreset on the port and not depending on receiving signature FIS
186     + * afterward. If signature FIS isn't received soon, ATA class is
187     + * assumed without follow-up softreset.
188     + */
189     +static void ahci_p5wdh_workaround(struct ata_host *host)
190     +{
191     + static struct dmi_system_id sysids[] = {
192     + {
193     + .ident = "P5W DH Deluxe",
194     + .matches = {
195     + DMI_MATCH(DMI_SYS_VENDOR,
196     + "ASUSTEK COMPUTER INC"),
197     + DMI_MATCH(DMI_PRODUCT_NAME, "P5W DH Deluxe"),
198     + },
199     + },
200     + { }
201     + };
202     + struct pci_dev *pdev = to_pci_dev(host->dev);
203     +
204     + if (pdev->bus->number == 0 && pdev->devfn == PCI_DEVFN(0x1f, 2) &&
205     + dmi_check_system(sysids)) {
206     + struct ata_port *ap = host->ports[1];
207     +
208     + dev_printk(KERN_INFO, &pdev->dev, "enabling ASUS P5W DH "
209     + "Deluxe on-board SIMG4726 workaround\n");
210     +
211     + ap->ops = &ahci_p5wdh_ops;
212     + ap->flags |= ATA_FLAG_NO_SRST | ATA_FLAG_ASSUME_ATA;
213     + }
214     +}
215     +
216     static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
217     {
218     static int printed_version;
219     @@ -1863,6 +2003,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
220     ap->ops = &ata_dummy_port_ops;
221     }
222    
223     + /* apply workaround for ASUS P5W DH Deluxe mainboard */
224     + ahci_p5wdh_workaround(host);
225     +
226     /* initialize adapter */
227     rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64);
228     if (rc)
229     diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
230     index 772be09..78b670d 100644
231     --- a/drivers/ata/libata-core.c
232     +++ b/drivers/ata/libata-core.c
233     @@ -3793,11 +3793,18 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
234     /* Drives which do spurious command completion */
235     { "HTS541680J9SA00", "SB2IC7EP", ATA_HORKAGE_NONCQ, },
236     { "HTS541612J9SA00", "SBDIC7JP", ATA_HORKAGE_NONCQ, },
237     + { "HDT722516DLA380", "V43OA96A", ATA_HORKAGE_NONCQ, },
238     { "Hitachi HTS541616J9SA00", "SB4OC70P", ATA_HORKAGE_NONCQ, },
239     + { "Hitachi HTS542525K9SA00", "BBFOC31P", ATA_HORKAGE_NONCQ, },
240     { "WDC WD740ADFD-00NLR1", NULL, ATA_HORKAGE_NONCQ, },
241     + { "WDC WD3200AAJS-00RYA0", "12.01B01", ATA_HORKAGE_NONCQ, },
242     { "FUJITSU MHV2080BH", "00840028", ATA_HORKAGE_NONCQ, },
243     + { "ST9120822AS", "3.CLF", ATA_HORKAGE_NONCQ, },
244     { "ST9160821AS", "3.CLF", ATA_HORKAGE_NONCQ, },
245     - { "ST3160812AS", "3.AD", ATA_HORKAGE_NONCQ, },
246     + { "ST9160821AS", "3.ALD", ATA_HORKAGE_NONCQ, },
247     + { "ST9160821AS", "3.CCD", ATA_HORKAGE_NONCQ, },
248     + { "ST3160812AS", "3.ADJ", ATA_HORKAGE_NONCQ, },
249     + { "ST980813AS", "3.ADB", ATA_HORKAGE_NONCQ, },
250     { "SAMSUNG HD401LJ", "ZZ100-15", ATA_HORKAGE_NONCQ, },
251    
252     /* devices which puke on READ_NATIVE_MAX */
253     diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
254     index ac6ceed..6ebdbd8 100644
255     --- a/drivers/ata/libata-eh.c
256     +++ b/drivers/ata/libata-eh.c
257     @@ -1759,9 +1759,11 @@ static int ata_do_reset(struct ata_port *ap, ata_reset_fn_t reset,
258     return 0;
259     }
260    
261     -static int ata_eh_followup_srst_needed(int rc, int classify,
262     - const unsigned int *classes)
263     +static int ata_eh_followup_srst_needed(struct ata_port *ap, int rc,
264     + int classify, const unsigned int *classes)
265     {
266     + if (ap->flags & ATA_FLAG_NO_SRST)
267     + return 0;
268     if (rc == -EAGAIN)
269     return 1;
270     if (rc != 0)
271     @@ -1792,7 +1794,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
272     */
273     action = ehc->i.action;
274     ehc->i.action &= ~ATA_EH_RESET_MASK;
275     - if (softreset && (!hardreset || (!sata_set_spd_needed(ap) &&
276     + if (softreset && (!hardreset || (!(ap->flags & ATA_FLAG_NO_SRST) &&
277     + !sata_set_spd_needed(ap) &&
278     !(action & ATA_EH_HARDRESET))))
279     ehc->i.action |= ATA_EH_SOFTRESET;
280     else
281     @@ -1855,7 +1858,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
282     rc = ata_do_reset(ap, reset, classes, deadline);
283    
284     if (reset == hardreset &&
285     - ata_eh_followup_srst_needed(rc, classify, classes)) {
286     + ata_eh_followup_srst_needed(ap, rc, classify, classes)) {
287     /* okay, let's do follow-up softreset */
288     reset = softreset;
289    
290     @@ -1870,8 +1873,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
291     ata_eh_about_to_do(ap, NULL, ATA_EH_RESET_MASK);
292     rc = ata_do_reset(ap, reset, classes, deadline);
293    
294     - if (rc == 0 && classify &&
295     - classes[0] == ATA_DEV_UNKNOWN) {
296     + if (rc == 0 && classify && classes[0] == ATA_DEV_UNKNOWN &&
297     + !(ap->flags & ATA_FLAG_ASSUME_ATA)) {
298     ata_port_printk(ap, KERN_ERR,
299     "classification failed\n");
300     rc = -EINVAL;
301     @@ -1879,6 +1882,10 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
302     }
303     }
304    
305     + /* if we skipped follow-up srst, clear rc */
306     + if (rc == -EAGAIN)
307     + rc = 0;
308     +
309     if (rc && try < ARRAY_SIZE(ata_eh_reset_timeouts)) {
310     unsigned long now = jiffies;
311    
312     @@ -1906,8 +1913,17 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
313     /* After the reset, the device state is PIO 0 and the
314     * controller state is undefined. Record the mode.
315     */
316     - for (i = 0; i < ATA_MAX_DEVICES; i++)
317     - ap->device[i].pio_mode = XFER_PIO_0;
318     + for (i = 0; i < ata_port_max_devices(ap); i++) {
319     + struct ata_device *dev = &ap->device[i];
320     +
321     + dev->pio_mode = XFER_PIO_0;
322     +
323     + if (ata_port_offline(ap))
324     + continue;
325     +
326     + if (ap->flags & ATA_FLAG_ASSUME_ATA)
327     + classes[dev->devno] = ATA_DEV_ATA;
328     + }
329    
330     /* record current link speed */
331     if (sata_scr_read(ap, SCR_STATUS, &sstatus) == 0)
332     diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c
333     index bb8e9e9..94d638e 100644
334     --- a/drivers/char/drm/i915_irq.c
335     +++ b/drivers/char/drm/i915_irq.c
336     @@ -553,7 +553,7 @@ int i915_vblank_swap(DRM_IOCTL_ARGS)
337     return DRM_ERR(EBUSY);
338     }
339    
340     - vbl_swap = drm_calloc(1, sizeof(vbl_swap), DRM_MEM_DRIVER);
341     + vbl_swap = drm_calloc(1, sizeof(*vbl_swap), DRM_MEM_DRIVER);
342    
343     if (!vbl_swap) {
344     DRM_ERROR("Failed to allocate memory to queue swap\n");
345     diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
346     index af5790f..2e9fdb9 100644
347     --- a/drivers/char/drm/radeon_cp.c
348     +++ b/drivers/char/drm/radeon_cp.c
349     @@ -1679,7 +1679,7 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
350     dev_priv->gart_info.bus_addr =
351     dev_priv->pcigart_offset + dev_priv->fb_location;
352     dev_priv->gart_info.mapping.offset =
353     - dev_priv->gart_info.bus_addr;
354     + dev_priv->pcigart_offset + dev_priv->fb_aper_offset;
355     dev_priv->gart_info.mapping.size =
356     dev_priv->gart_info.table_size;
357    
358     @@ -2291,7 +2291,8 @@ int radeon_driver_firstopen(struct drm_device *dev)
359     if (ret != 0)
360     return ret;
361    
362     - ret = drm_addmap(dev, drm_get_resource_start(dev, 0),
363     + dev_priv->fb_aper_offset = drm_get_resource_start(dev, 0);
364     + ret = drm_addmap(dev, dev_priv->fb_aper_offset,
365     drm_get_resource_len(dev, 0), _DRM_FRAME_BUFFER,
366     _DRM_WRITE_COMBINING, &map);
367     if (ret != 0)
368     diff --git a/drivers/char/drm/radeon_drv.h b/drivers/char/drm/radeon_drv.h
369     index 3b3d935..41e91ea 100644
370     --- a/drivers/char/drm/radeon_drv.h
371     +++ b/drivers/char/drm/radeon_drv.h
372     @@ -293,6 +293,7 @@ typedef struct drm_radeon_private {
373    
374     /* starting from here on, data is preserved accross an open */
375     uint32_t flags; /* see radeon_chip_flags */
376     + unsigned long fb_aper_offset;
377     } drm_radeon_private_t;
378    
379     typedef struct drm_radeon_buf_priv {
380     diff --git a/drivers/char/moxa.c b/drivers/char/moxa.c
381     index ed76f0a..5000b3b 100644
382     --- a/drivers/char/moxa.c
383     +++ b/drivers/char/moxa.c
384     @@ -1040,14 +1040,14 @@ static void check_xmit_empty(unsigned long data)
385     struct moxa_port *ch;
386    
387     ch = (struct moxa_port *) data;
388     - del_timer_sync(&moxa_ports[ch->port].emptyTimer);
389     if (ch->tty && (ch->statusflags & EMPTYWAIT)) {
390     if (MoxaPortTxQueue(ch->port) == 0) {
391     ch->statusflags &= ~EMPTYWAIT;
392     tty_wakeup(ch->tty);
393     return;
394     }
395     - mod_timer(&moxa_ports[ch->port].emptyTimer, jiffies + HZ);
396     + mod_timer(&moxa_ports[ch->port].emptyTimer,
397     + round_jiffies(jiffies + HZ));
398     } else
399     ch->statusflags &= ~EMPTYWAIT;
400     }
401     diff --git a/drivers/char/rocket.c b/drivers/char/rocket.c
402     index 56cbba7..94bb3d0 100644
403     --- a/drivers/char/rocket.c
404     +++ b/drivers/char/rocket.c
405     @@ -699,8 +699,8 @@ static void init_r_port(int board, int aiop, int chan, struct pci_dev *pci_dev)
406     spin_lock_init(&info->slock);
407     mutex_init(&info->write_mtx);
408     rp_table[line] = info;
409     - if (pci_dev)
410     - tty_register_device(rocket_driver, line, &pci_dev->dev);
411     + tty_register_device(rocket_driver, line, pci_dev ? &pci_dev->dev :
412     + NULL);
413     }
414    
415     /*
416     @@ -2434,7 +2434,7 @@ static int __init rp_init(void)
417     rocket_driver->init_termios.c_ispeed = 9600;
418     rocket_driver->init_termios.c_ospeed = 9600;
419     #ifdef ROCKET_SOFT_FLOW
420     - rocket_driver->flags |= TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
421     + rocket_driver->flags |= TTY_DRIVER_REAL_RAW;
422     #endif
423     tty_set_operations(rocket_driver, &rocket_ops);
424    
425     @@ -2491,10 +2491,14 @@ static void rp_cleanup_module(void)
426     if (retval)
427     printk(KERN_INFO "Error %d while trying to unregister "
428     "rocketport driver\n", -retval);
429     - put_tty_driver(rocket_driver);
430    
431     for (i = 0; i < MAX_RP_PORTS; i++)
432     - kfree(rp_table[i]);
433     + if (rp_table[i]) {
434     + tty_unregister_device(rocket_driver, i);
435     + kfree(rp_table[i]);
436     + }
437     +
438     + put_tty_driver(rocket_driver);
439    
440     for (i = 0; i < NUM_BOARDS; i++) {
441     if (rcktpt_io_addr[i] <= 0 || is_PCI[i])
442     diff --git a/drivers/hwmon/lm87.c b/drivers/hwmon/lm87.c
443     index 988ae1c..1128153 100644
444     --- a/drivers/hwmon/lm87.c
445     +++ b/drivers/hwmon/lm87.c
446     @@ -129,7 +129,7 @@ static u8 LM87_REG_TEMP_LOW[3] = { 0x3A, 0x38, 0x2C };
447     (((val) < 0 ? (val)-500 : (val)+500) / 1000))
448    
449     #define FAN_FROM_REG(reg,div) ((reg) == 255 || (reg) == 0 ? 0 : \
450     - 1350000 + (reg)*(div) / 2) / ((reg)*(div))
451     + (1350000 + (reg)*(div) / 2) / ((reg)*(div)))
452     #define FAN_TO_REG(val,div) ((val)*(div) * 255 <= 1350000 ? 255 : \
453     (1350000 + (val)*(div) / 2) / ((val)*(div)))
454    
455     @@ -145,7 +145,7 @@ static u8 LM87_REG_TEMP_LOW[3] = { 0x3A, 0x38, 0x2C };
456     #define CHAN_NO_FAN(nr) (1 << (nr))
457     #define CHAN_TEMP3 (1 << 2)
458     #define CHAN_VCC_5V (1 << 3)
459     -#define CHAN_NO_VID (1 << 8)
460     +#define CHAN_NO_VID (1 << 7)
461    
462     /*
463     * Functions declaration
464     diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c
465     index 7a4a15f..329b599 100644
466     --- a/drivers/hwmon/w83627hf.c
467     +++ b/drivers/hwmon/w83627hf.c
468     @@ -391,6 +391,7 @@ static int __devexit w83627hf_remove(struct platform_device *pdev);
469    
470     static int w83627hf_read_value(struct w83627hf_data *data, u16 reg);
471     static int w83627hf_write_value(struct w83627hf_data *data, u16 reg, u16 value);
472     +static void w83627hf_update_fan_div(struct w83627hf_data *data);
473     static struct w83627hf_data *w83627hf_update_device(struct device *dev);
474     static void w83627hf_init_device(struct platform_device *pdev);
475    
476     @@ -1244,6 +1245,7 @@ static int __devinit w83627hf_probe(struct platform_device *pdev)
477     data->fan_min[0] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(1));
478     data->fan_min[1] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(2));
479     data->fan_min[2] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(3));
480     + w83627hf_update_fan_div(data);
481    
482     /* Register common device attributes */
483     if ((err = sysfs_create_group(&dev->kobj, &w83627hf_group)))
484     @@ -1333,6 +1335,24 @@ static int __devexit w83627hf_remove(struct platform_device *pdev)
485     }
486    
487    
488     +/* Registers 0x50-0x5f are banked */
489     +static inline void w83627hf_set_bank(struct w83627hf_data *data, u16 reg)
490     +{
491     + if ((reg & 0x00f0) == 0x50) {
492     + outb_p(W83781D_REG_BANK, data->addr + W83781D_ADDR_REG_OFFSET);
493     + outb_p(reg >> 8, data->addr + W83781D_DATA_REG_OFFSET);
494     + }
495     +}
496     +
497     +/* Not strictly necessary, but play it safe for now */
498     +static inline void w83627hf_reset_bank(struct w83627hf_data *data, u16 reg)
499     +{
500     + if (reg & 0xff00) {
501     + outb_p(W83781D_REG_BANK, data->addr + W83781D_ADDR_REG_OFFSET);
502     + outb_p(0, data->addr + W83781D_DATA_REG_OFFSET);
503     + }
504     +}
505     +
506     static int w83627hf_read_value(struct w83627hf_data *data, u16 reg)
507     {
508     int res, word_sized;
509     @@ -1343,12 +1363,7 @@ static int w83627hf_read_value(struct w83627hf_data *data, u16 reg)
510     && (((reg & 0x00ff) == 0x50)
511     || ((reg & 0x00ff) == 0x53)
512     || ((reg & 0x00ff) == 0x55));
513     - if (reg & 0xff00) {
514     - outb_p(W83781D_REG_BANK,
515     - data->addr + W83781D_ADDR_REG_OFFSET);
516     - outb_p(reg >> 8,
517     - data->addr + W83781D_DATA_REG_OFFSET);
518     - }
519     + w83627hf_set_bank(data, reg);
520     outb_p(reg & 0xff, data->addr + W83781D_ADDR_REG_OFFSET);
521     res = inb_p(data->addr + W83781D_DATA_REG_OFFSET);
522     if (word_sized) {
523     @@ -1358,11 +1373,7 @@ static int w83627hf_read_value(struct w83627hf_data *data, u16 reg)
524     (res << 8) + inb_p(data->addr +
525     W83781D_DATA_REG_OFFSET);
526     }
527     - if (reg & 0xff00) {
528     - outb_p(W83781D_REG_BANK,
529     - data->addr + W83781D_ADDR_REG_OFFSET);
530     - outb_p(0, data->addr + W83781D_DATA_REG_OFFSET);
531     - }
532     + w83627hf_reset_bank(data, reg);
533     mutex_unlock(&data->lock);
534     return res;
535     }
536     @@ -1433,12 +1444,7 @@ static int w83627hf_write_value(struct w83627hf_data *data, u16 reg, u16 value)
537     || ((reg & 0xff00) == 0x200))
538     && (((reg & 0x00ff) == 0x53)
539     || ((reg & 0x00ff) == 0x55));
540     - if (reg & 0xff00) {
541     - outb_p(W83781D_REG_BANK,
542     - data->addr + W83781D_ADDR_REG_OFFSET);
543     - outb_p(reg >> 8,
544     - data->addr + W83781D_DATA_REG_OFFSET);
545     - }
546     + w83627hf_set_bank(data, reg);
547     outb_p(reg & 0xff, data->addr + W83781D_ADDR_REG_OFFSET);
548     if (word_sized) {
549     outb_p(value >> 8,
550     @@ -1448,11 +1454,7 @@ static int w83627hf_write_value(struct w83627hf_data *data, u16 reg, u16 value)
551     }
552     outb_p(value & 0xff,
553     data->addr + W83781D_DATA_REG_OFFSET);
554     - if (reg & 0xff00) {
555     - outb_p(W83781D_REG_BANK,
556     - data->addr + W83781D_ADDR_REG_OFFSET);
557     - outb_p(0, data->addr + W83781D_DATA_REG_OFFSET);
558     - }
559     + w83627hf_reset_bank(data, reg);
560     mutex_unlock(&data->lock);
561     return 0;
562     }
563     @@ -1556,6 +1558,24 @@ static void __devinit w83627hf_init_device(struct platform_device *pdev)
564     | 0x01);
565     }
566    
567     +static void w83627hf_update_fan_div(struct w83627hf_data *data)
568     +{
569     + int reg;
570     +
571     + reg = w83627hf_read_value(data, W83781D_REG_VID_FANDIV);
572     + data->fan_div[0] = (reg >> 4) & 0x03;
573     + data->fan_div[1] = (reg >> 6) & 0x03;
574     + if (data->type != w83697hf) {
575     + data->fan_div[2] = (w83627hf_read_value(data,
576     + W83781D_REG_PIN) >> 6) & 0x03;
577     + }
578     + reg = w83627hf_read_value(data, W83781D_REG_VBAT);
579     + data->fan_div[0] |= (reg >> 3) & 0x04;
580     + data->fan_div[1] |= (reg >> 4) & 0x04;
581     + if (data->type != w83697hf)
582     + data->fan_div[2] |= (reg >> 5) & 0x04;
583     +}
584     +
585     static struct w83627hf_data *w83627hf_update_device(struct device *dev)
586     {
587     struct w83627hf_data *data = dev_get_drvdata(dev);
588     @@ -1633,18 +1653,8 @@ static struct w83627hf_data *w83627hf_update_device(struct device *dev)
589     w83627hf_read_value(data, W83781D_REG_TEMP_HYST(3));
590     }
591    
592     - i = w83627hf_read_value(data, W83781D_REG_VID_FANDIV);
593     - data->fan_div[0] = (i >> 4) & 0x03;
594     - data->fan_div[1] = (i >> 6) & 0x03;
595     - if (data->type != w83697hf) {
596     - data->fan_div[2] = (w83627hf_read_value(data,
597     - W83781D_REG_PIN) >> 6) & 0x03;
598     - }
599     - i = w83627hf_read_value(data, W83781D_REG_VBAT);
600     - data->fan_div[0] |= (i >> 3) & 0x04;
601     - data->fan_div[1] |= (i >> 4) & 0x04;
602     - if (data->type != w83697hf)
603     - data->fan_div[2] |= (i >> 5) & 0x04;
604     + w83627hf_update_fan_div(data);
605     +
606     data->alarms =
607     w83627hf_read_value(data, W83781D_REG_ALARM1) |
608     (w83627hf_read_value(data, W83781D_REG_ALARM2) << 8) |
609     diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c
610     index 082ca7d..6102aa9 100644
611     --- a/drivers/ide/pci/cs5535.c
612     +++ b/drivers/ide/pci/cs5535.c
613     @@ -84,7 +84,7 @@ static void cs5535_set_speed(ide_drive_t *drive, u8 speed)
614    
615     /* Set the PIO timings */
616     if ((speed & XFER_MODE) == XFER_PIO) {
617     - ide_drive_t *pair = &drive->hwif->drives[drive->dn ^ 1];
618     + ide_drive_t *pair = ide_get_paired_drive(drive);
619     u8 cmd, pioa;
620    
621     cmd = pioa = speed - XFER_PIO_0;
622     diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c
623     index 9fead2e..e887058 100644
624     --- a/drivers/ide/pci/serverworks.c
625     +++ b/drivers/ide/pci/serverworks.c
626     @@ -97,6 +97,7 @@ static u8 svwks_udma_filter(ide_drive_t *drive)
627     mode = 2;
628    
629     switch(mode) {
630     + case 3: mask = 0x3f; break;
631     case 2: mask = 0x1f; break;
632     case 1: mask = 0x07; break;
633     default: mask = 0x00; break;
634     diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c
635     index 50f6d17..713064d 100644
636     --- a/drivers/ide/pci/siimage.c
637     +++ b/drivers/ide/pci/siimage.c
638     @@ -180,7 +180,7 @@ static void sil_tune_pio(ide_drive_t *drive, u8 pio)
639     const u16 data_speed[] = { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1 };
640    
641     ide_hwif_t *hwif = HWIF(drive);
642     - ide_drive_t *pair = &hwif->drives[drive->dn ^ 1];
643     + ide_drive_t *pair = ide_get_paired_drive(drive);
644     u32 speedt = 0;
645     u16 speedp = 0;
646     unsigned long addr = siimage_seldev(drive, 0x04);
647     diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
648     index 01d7008..495c803 100644
649     --- a/drivers/infiniband/core/uverbs_cmd.c
650     +++ b/drivers/infiniband/core/uverbs_cmd.c
651     @@ -147,8 +147,12 @@ static struct ib_uobject *__idr_get_uobj(struct idr *idr, int id,
652    
653     spin_lock(&ib_uverbs_idr_lock);
654     uobj = idr_find(idr, id);
655     - if (uobj)
656     - kref_get(&uobj->ref);
657     + if (uobj) {
658     + if (uobj->context == context)
659     + kref_get(&uobj->ref);
660     + else
661     + uobj = NULL;
662     + }
663     spin_unlock(&ib_uverbs_idr_lock);
664    
665     return uobj;
666     diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c
667     index acc9589..6966f94 100644
668     --- a/drivers/infiniband/hw/mthca/mthca_cmd.c
669     +++ b/drivers/infiniband/hw/mthca/mthca_cmd.c
670     @@ -290,6 +290,12 @@ static int mthca_cmd_post(struct mthca_dev *dev,
671     err = mthca_cmd_post_hcr(dev, in_param, out_param, in_modifier,
672     op_modifier, op, token, event);
673    
674     + /*
675     + * Make sure that our HCR writes don't get mixed in with
676     + * writes from another CPU starting a FW command.
677     + */
678     + mmiowb();
679     +
680     mutex_unlock(&dev->cmd.hcr_mutex);
681     return err;
682     }
683     diff --git a/drivers/isdn/hardware/avm/b1.c b/drivers/isdn/hardware/avm/b1.c
684     index 7a69a18..4484a64 100644
685     --- a/drivers/isdn/hardware/avm/b1.c
686     +++ b/drivers/isdn/hardware/avm/b1.c
687     @@ -321,12 +321,15 @@ void b1_reset_ctr(struct capi_ctr *ctrl)
688     avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
689     avmcard *card = cinfo->card;
690     unsigned int port = card->port;
691     + unsigned long flags;
692    
693     b1_reset(port);
694     b1_reset(port);
695    
696     memset(cinfo->version, 0, sizeof(cinfo->version));
697     + spin_lock_irqsave(&card->lock, flags);
698     capilib_release(&cinfo->ncci_head);
699     + spin_unlock_irqrestore(&card->lock, flags);
700     capi_ctr_reseted(ctrl);
701     }
702    
703     @@ -361,9 +364,8 @@ void b1_release_appl(struct capi_ctr *ctrl, u16 appl)
704     unsigned int port = card->port;
705     unsigned long flags;
706    
707     - capilib_release_appl(&cinfo->ncci_head, appl);
708     -
709     spin_lock_irqsave(&card->lock, flags);
710     + capilib_release_appl(&cinfo->ncci_head, appl);
711     b1_put_byte(port, SEND_RELEASE);
712     b1_put_word(port, appl);
713     spin_unlock_irqrestore(&card->lock, flags);
714     @@ -380,27 +382,27 @@ u16 b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
715     u8 subcmd = CAPIMSG_SUBCOMMAND(skb->data);
716     u16 dlen, retval;
717    
718     + spin_lock_irqsave(&card->lock, flags);
719     if (CAPICMD(cmd, subcmd) == CAPI_DATA_B3_REQ) {
720     retval = capilib_data_b3_req(&cinfo->ncci_head,
721     CAPIMSG_APPID(skb->data),
722     CAPIMSG_NCCI(skb->data),
723     CAPIMSG_MSGID(skb->data));
724     - if (retval != CAPI_NOERROR)
725     + if (retval != CAPI_NOERROR) {
726     + spin_unlock_irqrestore(&card->lock, flags);
727     return retval;
728     + }
729    
730     dlen = CAPIMSG_DATALEN(skb->data);
731    
732     - spin_lock_irqsave(&card->lock, flags);
733     b1_put_byte(port, SEND_DATA_B3_REQ);
734     b1_put_slice(port, skb->data, len);
735     b1_put_slice(port, skb->data + len, dlen);
736     - spin_unlock_irqrestore(&card->lock, flags);
737     } else {
738     - spin_lock_irqsave(&card->lock, flags);
739     b1_put_byte(port, SEND_MESSAGE);
740     b1_put_slice(port, skb->data, len);
741     - spin_unlock_irqrestore(&card->lock, flags);
742     }
743     + spin_unlock_irqrestore(&card->lock, flags);
744    
745     dev_kfree_skb_any(skb);
746     return CAPI_NOERROR;
747     @@ -534,17 +536,17 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
748    
749     ApplId = (unsigned) b1_get_word(card->port);
750     MsgLen = b1_get_slice(card->port, card->msgbuf);
751     - spin_unlock_irqrestore(&card->lock, flags);
752     if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
753     printk(KERN_ERR "%s: incoming packet dropped\n",
754     card->name);
755     + spin_unlock_irqrestore(&card->lock, flags);
756     } else {
757     memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
758     if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_CONF)
759     capilib_data_b3_conf(&cinfo->ncci_head, ApplId,
760     CAPIMSG_NCCI(skb->data),
761     CAPIMSG_MSGID(skb->data));
762     -
763     + spin_unlock_irqrestore(&card->lock, flags);
764     capi_ctr_handle_message(ctrl, ApplId, skb);
765     }
766     break;
767     @@ -554,21 +556,17 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
768     ApplId = b1_get_word(card->port);
769     NCCI = b1_get_word(card->port);
770     WindowSize = b1_get_word(card->port);
771     - spin_unlock_irqrestore(&card->lock, flags);
772     -
773     capilib_new_ncci(&cinfo->ncci_head, ApplId, NCCI, WindowSize);
774     -
775     + spin_unlock_irqrestore(&card->lock, flags);
776     break;
777    
778     case RECEIVE_FREE_NCCI:
779    
780     ApplId = b1_get_word(card->port);
781     NCCI = b1_get_word(card->port);
782     - spin_unlock_irqrestore(&card->lock, flags);
783     -
784     if (NCCI != 0xffffffff)
785     capilib_free_ncci(&cinfo->ncci_head, ApplId, NCCI);
786     -
787     + spin_unlock_irqrestore(&card->lock, flags);
788     break;
789    
790     case RECEIVE_START:
791     diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c
792     index d58f927..8710cf6 100644
793     --- a/drivers/isdn/hardware/avm/c4.c
794     +++ b/drivers/isdn/hardware/avm/c4.c
795     @@ -727,6 +727,7 @@ static void c4_send_init(avmcard *card)
796     {
797     struct sk_buff *skb;
798     void *p;
799     + unsigned long flags;
800    
801     skb = alloc_skb(15, GFP_ATOMIC);
802     if (!skb) {
803     @@ -744,12 +745,15 @@ static void c4_send_init(avmcard *card)
804     skb_put(skb, (u8 *)p - (u8 *)skb->data);
805    
806     skb_queue_tail(&card->dma->send_queue, skb);
807     + spin_lock_irqsave(&card->lock, flags);
808     c4_dispatch_tx(card);
809     + spin_unlock_irqrestore(&card->lock, flags);
810     }
811    
812     static int queue_sendconfigword(avmcard *card, u32 val)
813     {
814     struct sk_buff *skb;
815     + unsigned long flags;
816     void *p;
817    
818     skb = alloc_skb(3+4, GFP_ATOMIC);
819     @@ -766,7 +770,9 @@ static int queue_sendconfigword(avmcard *card, u32 val)
820     skb_put(skb, (u8 *)p - (u8 *)skb->data);
821    
822     skb_queue_tail(&card->dma->send_queue, skb);
823     + spin_lock_irqsave(&card->lock, flags);
824     c4_dispatch_tx(card);
825     + spin_unlock_irqrestore(&card->lock, flags);
826     return 0;
827     }
828    
829     @@ -986,7 +992,9 @@ static void c4_release_appl(struct capi_ctr *ctrl, u16 appl)
830     struct sk_buff *skb;
831     void *p;
832    
833     + spin_lock_irqsave(&card->lock, flags);
834     capilib_release_appl(&cinfo->ncci_head, appl);
835     + spin_unlock_irqrestore(&card->lock, flags);
836    
837     if (ctrl->cnr == card->cardnr) {
838     skb = alloc_skb(7, GFP_ATOMIC);
839     @@ -1019,7 +1027,8 @@ static u16 c4_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
840     u16 retval = CAPI_NOERROR;
841     unsigned long flags;
842    
843     - if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
844     + spin_lock_irqsave(&card->lock, flags);
845     + if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
846     retval = capilib_data_b3_req(&cinfo->ncci_head,
847     CAPIMSG_APPID(skb->data),
848     CAPIMSG_NCCI(skb->data),
849     @@ -1027,10 +1036,9 @@ static u16 c4_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
850     }
851     if (retval == CAPI_NOERROR) {
852     skb_queue_tail(&card->dma->send_queue, skb);
853     - spin_lock_irqsave(&card->lock, flags);
854     c4_dispatch_tx(card);
855     - spin_unlock_irqrestore(&card->lock, flags);
856     }
857     + spin_unlock_irqrestore(&card->lock, flags);
858     return retval;
859     }
860    
861     diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
862     index 927cb34..7c426d0 100644
863     --- a/drivers/md/bitmap.c
864     +++ b/drivers/md/bitmap.c
865     @@ -274,7 +274,7 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
866     if (bitmap->offset < 0) {
867     /* DATA BITMAP METADATA */
868     if (bitmap->offset
869     - + page->index * (PAGE_SIZE/512)
870     + + (long)(page->index * (PAGE_SIZE/512))
871     + size/512 > 0)
872     /* bitmap runs in to metadata */
873     return -EINVAL;
874     diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c
875     index 6928c13..9538331 100644
876     --- a/drivers/md/dm-delay.c
877     +++ b/drivers/md/dm-delay.c
878     @@ -305,7 +305,7 @@ static int delay_status(struct dm_target *ti, status_type_t type,
879     (unsigned long long) dc->start_read,
880     dc->read_delay);
881     if (dc->dev_write)
882     - DMEMIT("%s %llu %u", dc->dev_write->name,
883     + DMEMIT(" %s %llu %u", dc->dev_write->name,
884     (unsigned long long) dc->start_write,
885     dc->write_delay);
886     break;
887     diff --git a/drivers/md/dm.c b/drivers/md/dm.c
888     index 2120155..998d450 100644
889     --- a/drivers/md/dm.c
890     +++ b/drivers/md/dm.c
891     @@ -1064,12 +1064,14 @@ static struct mapped_device *alloc_dev(int minor)
892     return NULL;
893     }
894    
895     +static void unlock_fs(struct mapped_device *md);
896     +
897     static void free_dev(struct mapped_device *md)
898     {
899     int minor = md->disk->first_minor;
900    
901     if (md->suspended_bdev) {
902     - thaw_bdev(md->suspended_bdev, NULL);
903     + unlock_fs(md);
904     bdput(md->suspended_bdev);
905     }
906     mempool_destroy(md->tio_pool);
907     diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
908     index f96dea9..3808f52 100644
909     --- a/drivers/md/raid5.c
910     +++ b/drivers/md/raid5.c
911     @@ -377,7 +377,12 @@ static unsigned long get_stripe_work(struct stripe_head *sh)
912     ack++;
913    
914     sh->ops.count -= ack;
915     - BUG_ON(sh->ops.count < 0);
916     + if (unlikely(sh->ops.count < 0)) {
917     + printk(KERN_ERR "pending: %#lx ops.pending: %#lx ops.ack: %#lx "
918     + "ops.complete: %#lx\n", pending, sh->ops.pending,
919     + sh->ops.ack, sh->ops.complete);
920     + BUG();
921     + }
922    
923     return pending;
924     }
925     @@ -551,8 +556,7 @@ static void ops_complete_biofill(void *stripe_head_ref)
926     }
927     }
928     }
929     - clear_bit(STRIPE_OP_BIOFILL, &sh->ops.ack);
930     - clear_bit(STRIPE_OP_BIOFILL, &sh->ops.pending);
931     + set_bit(STRIPE_OP_BIOFILL, &sh->ops.complete);
932    
933     return_io(return_bi);
934    
935     @@ -2630,6 +2634,13 @@ static void handle_stripe5(struct stripe_head *sh)
936     s.expanded = test_bit(STRIPE_EXPAND_READY, &sh->state);
937     /* Now to look around and see what can be done */
938    
939     + /* clean-up completed biofill operations */
940     + if (test_bit(STRIPE_OP_BIOFILL, &sh->ops.complete)) {
941     + clear_bit(STRIPE_OP_BIOFILL, &sh->ops.pending);
942     + clear_bit(STRIPE_OP_BIOFILL, &sh->ops.ack);
943     + clear_bit(STRIPE_OP_BIOFILL, &sh->ops.complete);
944     + }
945     +
946     rcu_read_lock();
947     for (i=disks; i--; ) {
948     mdk_rdev_t *rdev;
949     diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
950     index be1df85..87e0161 100644
951     --- a/drivers/pci/msi.c
952     +++ b/drivers/pci/msi.c
953     @@ -132,7 +132,7 @@ void read_msi_msg(unsigned int irq, struct msi_msg *msg)
954     pci_read_config_word(dev, msi_data_reg(pos, 1), &data);
955     } else {
956     msg->address_hi = 0;
957     - pci_read_config_word(dev, msi_data_reg(pos, 1), &data);
958     + pci_read_config_word(dev, msi_data_reg(pos, 0), &data);
959     }
960     msg->data = data;
961     break;
962     diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c
963     index 0e579ca..ffdd0da 100644
964     --- a/drivers/scsi/hptiop.c
965     +++ b/drivers/scsi/hptiop.c
966     @@ -365,8 +365,9 @@ static void hptiop_host_request_callback(struct hptiop_hba *hba, u32 tag)
967     scp->result = SAM_STAT_CHECK_CONDITION;
968     memset(&scp->sense_buffer,
969     0, sizeof(scp->sense_buffer));
970     - memcpy(&scp->sense_buffer,
971     - &req->sg_list, le32_to_cpu(req->dataxfer_length));
972     + memcpy(&scp->sense_buffer, &req->sg_list,
973     + min(sizeof(scp->sense_buffer),
974     + le32_to_cpu(req->dataxfer_length)));
975     break;
976    
977     default:
978     diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
979     index b5ebb73..6e2382e 100644
980     --- a/drivers/usb/core/hcd.h
981     +++ b/drivers/usb/core/hcd.h
982     @@ -19,6 +19,8 @@
983    
984     #ifdef __KERNEL__
985    
986     +#include <linux/rwsem.h>
987     +
988     /* This file contains declarations of usbcore internals that are mostly
989     * used or exposed by Host Controller Drivers.
990     */
991     @@ -454,5 +456,9 @@ static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb) {}
992     : (in_interrupt () ? "in_interrupt" : "can sleep"))
993    
994    
995     -#endif /* __KERNEL__ */
996     +/* This rwsem is for use only by the hub driver and ehci-hcd.
997     + * Nobody else should touch it.
998     + */
999     +extern struct rw_semaphore ehci_cf_port_reset_rwsem;
1000    
1001     +#endif /* __KERNEL__ */
1002     diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
1003     index f7b337f..c3adffa 100644
1004     --- a/drivers/usb/core/hub.c
1005     +++ b/drivers/usb/core/hub.c
1006     @@ -125,6 +125,12 @@ MODULE_PARM_DESC(use_both_schemes,
1007     "try the other device initialization scheme if the "
1008     "first one fails");
1009    
1010     +/* Mutual exclusion for EHCI CF initialization. This interferes with
1011     + * port reset on some companion controllers.
1012     + */
1013     +DECLARE_RWSEM(ehci_cf_port_reset_rwsem);
1014     +EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
1015     +
1016    
1017     static inline char *portspeed(int portstatus)
1018     {
1019     @@ -1460,6 +1466,11 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
1020     {
1021     int i, status;
1022    
1023     + /* Block EHCI CF initialization during the port reset.
1024     + * Some companion controllers don't like it when they mix.
1025     + */
1026     + down_read(&ehci_cf_port_reset_rwsem);
1027     +
1028     /* Reset the port */
1029     for (i = 0; i < PORT_RESET_TRIES; i++) {
1030     status = set_port_feature(hub->hdev,
1031     @@ -1490,7 +1501,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
1032     usb_set_device_state(udev, status
1033     ? USB_STATE_NOTATTACHED
1034     : USB_STATE_DEFAULT);
1035     - return status;
1036     + goto done;
1037     }
1038    
1039     dev_dbg (hub->intfdev,
1040     @@ -1503,6 +1514,8 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
1041     "Cannot enable port %i. Maybe the USB cable is bad?\n",
1042     port1);
1043    
1044     + done:
1045     + up_read(&ehci_cf_port_reset_rwsem);
1046     return status;
1047     }
1048    
1049     diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
1050     index ebf3dc2..d42c561 100644
1051     --- a/drivers/usb/core/quirks.c
1052     +++ b/drivers/usb/core/quirks.c
1053     @@ -32,52 +32,6 @@ static const struct usb_device_id usb_quirk_list[] = {
1054     { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME },
1055     /* HP 5300/5370C scanner */
1056     { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 },
1057     - /* Hewlett-Packard PhotoSmart 720 / PhotoSmart 935 (storage) */
1058     - { USB_DEVICE(0x03f0, 0x4002), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1059     -
1060     - /* SGS Thomson Microelectronics 4in1 card reader */
1061     - { USB_DEVICE(0x0483, 0x0321), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1062     -
1063     - /* Acer Peripherals Inc. (now BenQ Corp.) Prisa 640BU */
1064     - { USB_DEVICE(0x04a5, 0x207e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1065     - /* Benq S2W 3300U */
1066     - { USB_DEVICE(0x04a5, 0x20b0), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1067     - /* Canon, Inc. CanoScan N1240U/LiDE30 */
1068     - { USB_DEVICE(0x04a9, 0x220e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1069     - /* Canon, Inc. CanoScan N650U/N656U */
1070     - { USB_DEVICE(0x04a9, 0x2206), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1071     - /* Canon, Inc. CanoScan 1220U */
1072     - { USB_DEVICE(0x04a9, 0x2207), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1073     - /* Canon, Inc. CanoScan N670U/N676U/LiDE 20 */
1074     - { USB_DEVICE(0x04a9, 0x220d), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1075     - /* old Cannon scanner */
1076     - { USB_DEVICE(0x04a9, 0x2220), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1077     - /* Seiko Epson Corp. Perfection 1200 */
1078     - { USB_DEVICE(0x04b8, 0x0104), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1079     - /* Seiko Epson Corp. Perfection 660 */
1080     - { USB_DEVICE(0x04b8, 0x0114), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1081     - /* Epson Perfection 1260 Photo */
1082     - { USB_DEVICE(0x04b8, 0x011d), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1083     - /* Seiko Epson Corp - Perfection 1670 */
1084     - { USB_DEVICE(0x04b8, 0x011f), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1085     - /* EPSON Perfection 2480 */
1086     - { USB_DEVICE(0x04b8, 0x0121), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1087     - /* Seiko Epson Corp.*/
1088     - { USB_DEVICE(0x04b8, 0x0122), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1089     - /* Samsung ML-2010 printer */
1090     - { USB_DEVICE(0x04e8, 0x326c), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1091     - /* Samsung ML-2510 Series printer */
1092     - { USB_DEVICE(0x04e8, 0x327e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1093     - /* Elsa MicroLink 56k (V.250) */
1094     - { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1095     - /* Ultima Electronics Corp.*/
1096     - { USB_DEVICE(0x05d8, 0x4005), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1097     -
1098     - /* Genesys USB-to-IDE */
1099     - { USB_DEVICE(0x0503, 0x0702), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1100     -
1101     - /* USB Graphical LCD - EEH Datalink GmbH */
1102     - { USB_DEVICE(0x060c, 0x04eb), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1103    
1104     /* INTEL VALUE SSD */
1105     { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
1106     @@ -85,44 +39,15 @@ static const struct usb_device_id usb_quirk_list[] = {
1107     /* M-Systems Flash Disk Pioneers */
1108     { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
1109    
1110     - /* Agfa Snapscan1212u */
1111     - { USB_DEVICE(0x06bd, 0x2061), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1112     - /* Seagate RSS LLC */
1113     - { USB_DEVICE(0x0bc2, 0x3000), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1114     - /* Umax [hex] Astra 3400U */
1115     - { USB_DEVICE(0x1606, 0x0060), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1116     -
1117     /* Philips PSC805 audio device */
1118     { USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME },
1119    
1120     - /* Alcor multi-card reader */
1121     - { USB_DEVICE(0x058f, 0x6366), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1122     -
1123     - /* Canon EOS 5D in PC Connection mode */
1124     - { USB_DEVICE(0x04a9, 0x3101), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1125     -
1126     - /* RIM Blackberry */
1127     - { USB_DEVICE(0x0fca, 0x0001), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1128     - { USB_DEVICE(0x0fca, 0x0004), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1129     - { USB_DEVICE(0x0fca, 0x0006), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1130     -
1131     - /* Apple iPhone */
1132     - { USB_DEVICE(0x05ac, 0x1290), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
1133     -
1134     /* SKYMEDI USB_DRIVE */
1135     { USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME },
1136    
1137     { } /* terminating entry must be last */
1138     };
1139    
1140     -static void usb_autosuspend_quirk(struct usb_device *udev)
1141     -{
1142     -#ifdef CONFIG_USB_SUSPEND
1143     - /* disable autosuspend, but allow the user to re-enable it via sysfs */
1144     - udev->autosuspend_disabled = 1;
1145     -#endif
1146     -}
1147     -
1148     static const struct usb_device_id *find_id(struct usb_device *udev)
1149     {
1150     const struct usb_device_id *id = usb_quirk_list;
1151     @@ -149,13 +74,9 @@ void usb_detect_quirks(struct usb_device *udev)
1152     dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
1153     udev->quirks);
1154    
1155     - /* do any special quirk handling here if needed */
1156     - if (udev->quirks & USB_QUIRK_NO_AUTOSUSPEND)
1157     - usb_autosuspend_quirk(udev);
1158     -
1159     /* By default, disable autosuspend for all non-hubs */
1160     #ifdef CONFIG_USB_SUSPEND
1161     if (udev->descriptor.bDeviceClass != USB_CLASS_HUB)
1162     - udev->autosuspend_delay = -1;
1163     + udev->autosuspend_disabled = 1;
1164     #endif
1165     }
1166     diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
1167     index be63022..3da7979 100644
1168     --- a/drivers/usb/core/urb.c
1169     +++ b/drivers/usb/core/urb.c
1170     @@ -358,7 +358,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
1171    
1172     /* enforce simple/standard policy */
1173     allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP |
1174     - URB_NO_INTERRUPT);
1175     + URB_NO_INTERRUPT | URB_FREE_BUFFER);
1176     switch (temp) {
1177     case PIPE_BULK:
1178     if (is_out)
1179     diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
1180     index 593e235..d57de87 100644
1181     --- a/drivers/usb/gadget/ether.c
1182     +++ b/drivers/usb/gadget/ether.c
1183     @@ -1989,8 +1989,20 @@ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net)
1184     }
1185    
1186     spin_lock_irqsave(&dev->req_lock, flags);
1187     + /*
1188     + * this freelist can be empty if an interrupt triggered disconnect()
1189     + * and reconfigured the gadget (shutting down this queue) after the
1190     + * network stack decided to xmit but before we got the spinlock.
1191     + */
1192     + if (list_empty(&dev->tx_reqs)) {
1193     + spin_unlock_irqrestore(&dev->req_lock, flags);
1194     + return 1;
1195     + }
1196     +
1197     req = container_of (dev->tx_reqs.next, struct usb_request, list);
1198     list_del (&req->list);
1199     +
1200     + /* temporarily stop TX queue when the freelist empties */
1201     if (list_empty (&dev->tx_reqs))
1202     netif_stop_queue (net);
1203     spin_unlock_irqrestore(&dev->req_lock, flags);
1204     diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
1205     index 35cdba1..31310ca 100644
1206     --- a/drivers/usb/host/ehci-hcd.c
1207     +++ b/drivers/usb/host/ehci-hcd.c
1208     @@ -570,10 +570,18 @@ static int ehci_run (struct usb_hcd *hcd)
1209     * are explicitly handed to companion controller(s), so no TT is
1210     * involved with the root hub. (Except where one is integrated,
1211     * and there's no companion controller unless maybe for USB OTG.)
1212     + *
1213     + * Turning on the CF flag will transfer ownership of all ports
1214     + * from the companions to the EHCI controller. If any of the
1215     + * companions are in the middle of a port reset at the time, it
1216     + * could cause trouble. Write-locking ehci_cf_port_reset_rwsem
1217     + * guarantees that no resets are in progress.
1218     */
1219     + down_write(&ehci_cf_port_reset_rwsem);
1220     hcd->state = HC_STATE_RUNNING;
1221     ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
1222     ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
1223     + up_write(&ehci_cf_port_reset_rwsem);
1224    
1225     temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase));
1226     ehci_info (ehci,
1227     diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
1228     index 88a2c7d..9eb4a65 100644
1229     --- a/drivers/usb/serial/generic.c
1230     +++ b/drivers/usb/serial/generic.c
1231     @@ -208,14 +208,15 @@ int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char *
1232    
1233     /* only do something if we have a bulk out endpoint */
1234     if (serial->num_bulk_out) {
1235     - spin_lock_bh(&port->lock);
1236     + unsigned long flags;
1237     + spin_lock_irqsave(&port->lock, flags);
1238     if (port->write_urb_busy) {
1239     - spin_unlock_bh(&port->lock);
1240     + spin_unlock_irqrestore(&port->lock, flags);
1241     dbg("%s - already writing", __FUNCTION__);
1242     return 0;
1243     }
1244     port->write_urb_busy = 1;
1245     - spin_unlock_bh(&port->lock);
1246     + spin_unlock_irqrestore(&port->lock, flags);
1247    
1248     count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
1249    
1250     diff --git a/drivers/video/platinumfb.c b/drivers/video/platinumfb.c
1251     index 8503e73..cbe71a5 100644
1252     --- a/drivers/video/platinumfb.c
1253     +++ b/drivers/video/platinumfb.c
1254     @@ -17,6 +17,8 @@
1255     * more details.
1256     */
1257    
1258     +#undef DEBUG
1259     +
1260     #include <linux/module.h>
1261     #include <linux/kernel.h>
1262     #include <linux/errno.h>
1263     @@ -535,33 +537,35 @@ static int __devinit platinumfb_probe(struct of_device* odev,
1264     volatile __u8 *fbuffer;
1265     int bank0, bank1, bank2, bank3, rc;
1266    
1267     - printk(KERN_INFO "platinumfb: Found Apple Platinum video hardware\n");
1268     + dev_info(&odev->dev, "Found Apple Platinum video hardware\n");
1269    
1270     info = framebuffer_alloc(sizeof(*pinfo), &odev->dev);
1271     - if (info == NULL)
1272     + if (info == NULL) {
1273     + dev_err(&odev->dev, "Failed to allocate fbdev !\n");
1274     return -ENOMEM;
1275     + }
1276     pinfo = info->par;
1277    
1278     if (of_address_to_resource(dp, 0, &pinfo->rsrc_reg) ||
1279     of_address_to_resource(dp, 1, &pinfo->rsrc_fb)) {
1280     - printk(KERN_ERR "platinumfb: Can't get resources\n");
1281     - framebuffer_release(info);
1282     - return -ENXIO;
1283     - }
1284     - if (!request_mem_region(pinfo->rsrc_reg.start,
1285     - pinfo->rsrc_reg.start -
1286     - pinfo->rsrc_reg.end + 1,
1287     - "platinumfb registers")) {
1288     + dev_err(&odev->dev, "Can't get resources\n");
1289     framebuffer_release(info);
1290     return -ENXIO;
1291     }
1292     + dev_dbg(&odev->dev, " registers : 0x%llx...0x%llx\n",
1293     + (unsigned long long)pinfo->rsrc_reg.start,
1294     + (unsigned long long)pinfo->rsrc_reg.end);
1295     + dev_dbg(&odev->dev, " framebuffer: 0x%llx...0x%llx\n",
1296     + (unsigned long long)pinfo->rsrc_fb.start,
1297     + (unsigned long long)pinfo->rsrc_fb.end);
1298     +
1299     + /* Do not try to request register space, they overlap with the
1300     + * northbridge and that can fail. Only request framebuffer
1301     + */
1302     if (!request_mem_region(pinfo->rsrc_fb.start,
1303     - pinfo->rsrc_fb.start
1304     - - pinfo->rsrc_fb.end + 1,
1305     + pinfo->rsrc_fb.end - pinfo->rsrc_fb.start + 1,
1306     "platinumfb framebuffer")) {
1307     - release_mem_region(pinfo->rsrc_reg.start,
1308     - pinfo->rsrc_reg.end -
1309     - pinfo->rsrc_reg.start + 1);
1310     + printk(KERN_ERR "platinumfb: Can't request framebuffer !\n");
1311     framebuffer_release(info);
1312     return -ENXIO;
1313     }
1314     @@ -600,7 +604,8 @@ static int __devinit platinumfb_probe(struct of_device* odev,
1315     bank2 = fbuffer[0x200000] == 0x56;
1316     bank3 = fbuffer[0x300000] == 0x78;
1317     pinfo->total_vram = (bank0 + bank1 + bank2 + bank3) * 0x100000;
1318     - printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n", (int) (pinfo->total_vram / 1024 / 1024),
1319     + printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n",
1320     + (unsigned int) (pinfo->total_vram / 1024 / 1024),
1321     bank3, bank2, bank1, bank0);
1322    
1323     /*
1324     @@ -644,16 +649,15 @@ static int __devexit platinumfb_remove(struct of_device* odev)
1325     unregister_framebuffer (info);
1326    
1327     /* Unmap frame buffer and registers */
1328     + iounmap(pinfo->frame_buffer);
1329     + iounmap(pinfo->platinum_regs);
1330     + iounmap(pinfo->cmap_regs);
1331     +
1332     release_mem_region(pinfo->rsrc_fb.start,
1333     pinfo->rsrc_fb.end -
1334     pinfo->rsrc_fb.start + 1);
1335     - release_mem_region(pinfo->rsrc_reg.start,
1336     - pinfo->rsrc_reg.end -
1337     - pinfo->rsrc_reg.start + 1);
1338     - iounmap(pinfo->frame_buffer);
1339     - iounmap(pinfo->platinum_regs);
1340     +
1341     release_mem_region(pinfo->cmap_regs_phys, 0x1000);
1342     - iounmap(pinfo->cmap_regs);
1343    
1344     framebuffer_release(info);
1345    
1346     diff --git a/include/linux/ide.h b/include/linux/ide.h
1347     index b9f66c1..20528c0 100644
1348     --- a/include/linux/ide.h
1349     +++ b/include/linux/ide.h
1350     @@ -1437,4 +1437,11 @@ static inline int hwif_to_node(ide_hwif_t *hwif)
1351     return dev ? pcibus_to_node(dev->bus) : -1;
1352     }
1353    
1354     +static inline ide_drive_t *ide_get_paired_drive(ide_drive_t *drive)
1355     +{
1356     + ide_hwif_t *hwif = HWIF(drive);
1357     +
1358     + return &hwif->drives[(drive->dn ^ 1) & 1];
1359     +}
1360     +
1361     #endif /* _IDE_H */
1362     diff --git a/include/linux/libata.h b/include/linux/libata.h
1363     index a67bb90..9ccca8f 100644
1364     --- a/include/linux/libata.h
1365     +++ b/include/linux/libata.h
1366     @@ -177,6 +177,8 @@ enum {
1367     ATA_FLAG_IGN_SIMPLEX = (1 << 15), /* ignore SIMPLEX */
1368     ATA_FLAG_NO_IORDY = (1 << 16), /* controller lacks iordy */
1369     ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */
1370     + ATA_FLAG_NO_SRST = (1 << 18),
1371     + ATA_FLAG_ASSUME_ATA = (1 << 19),
1372    
1373     /* The following flag belongs to ap->pflags but is kept in
1374     * ap->flags because it's referenced in many LLDs and will be
1375     diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
1376     index 8da374c..2692ec9 100644
1377     --- a/include/linux/usb/quirks.h
1378     +++ b/include/linux/usb/quirks.h
1379     @@ -4,11 +4,8 @@
1380     * belong here.
1381     */
1382    
1383     -/* device must not be autosuspended */
1384     -#define USB_QUIRK_NO_AUTOSUSPEND 0x00000001
1385     -
1386     /* string descriptors must not be fetched using a 255-byte read */
1387     -#define USB_QUIRK_STRING_FETCH_255 0x00000002
1388     +#define USB_QUIRK_STRING_FETCH_255 0x00000001
1389    
1390     /* device can't resume correctly so reset it instead */
1391     -#define USB_QUIRK_RESET_RESUME 0x00000004
1392     +#define USB_QUIRK_RESET_RESUME 0x00000002
1393     diff --git a/sound/core/Makefile b/sound/core/Makefile
1394     index 5a01c76..05f5cdc 100644
1395     --- a/sound/core/Makefile
1396     +++ b/sound/core/Makefile
1397     @@ -14,7 +14,8 @@ endif
1398     snd-pcm-objs := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \
1399     pcm_memory.o
1400    
1401     -snd-page-alloc-objs := memalloc.o sgbuf.o
1402     +snd-page-alloc-y := memalloc.o
1403     +snd-page-alloc-$(CONFIG_HAS_DMA) += sgbuf.o
1404    
1405     snd-rawmidi-objs := rawmidi.o
1406     snd-timer-objs := timer.o
1407     diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c
1408     index 9b5656d..6f99b6f 100644
1409     --- a/sound/core/memalloc.c
1410     +++ b/sound/core/memalloc.c
1411     @@ -206,6 +206,7 @@ void snd_free_pages(void *ptr, size_t size)
1412     *
1413     */
1414    
1415     +#ifdef CONFIG_HAS_DMA
1416     /* allocate the coherent DMA pages */
1417     static void *snd_malloc_dev_pages(struct device *dev, size_t size, dma_addr_t *dma)
1418     {
1419     @@ -239,6 +240,7 @@ static void snd_free_dev_pages(struct device *dev, size_t size, void *ptr,
1420     dec_snd_pages(pg);
1421     dma_free_coherent(dev, PAGE_SIZE << pg, ptr, dma);
1422     }
1423     +#endif /* CONFIG_HAS_DMA */
1424    
1425     #ifdef CONFIG_SBUS
1426    
1427     @@ -312,12 +314,14 @@ int snd_dma_alloc_pages(int type, struct device *device, size_t size,
1428     dmab->area = snd_malloc_sbus_pages(device, size, &dmab->addr);
1429     break;
1430     #endif
1431     +#ifdef CONFIG_HAS_DMA
1432     case SNDRV_DMA_TYPE_DEV:
1433     dmab->area = snd_malloc_dev_pages(device, size, &dmab->addr);
1434     break;
1435     case SNDRV_DMA_TYPE_DEV_SG:
1436     snd_malloc_sgbuf_pages(device, size, dmab, NULL);
1437     break;
1438     +#endif
1439     default:
1440     printk(KERN_ERR "snd-malloc: invalid device type %d\n", type);
1441     dmab->area = NULL;
1442     @@ -383,12 +387,14 @@ void snd_dma_free_pages(struct snd_dma_buffer *dmab)
1443     snd_free_sbus_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
1444     break;
1445     #endif
1446     +#ifdef CONFIG_HAS_DMA
1447     case SNDRV_DMA_TYPE_DEV:
1448     snd_free_dev_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
1449     break;
1450     case SNDRV_DMA_TYPE_DEV_SG:
1451     snd_free_sgbuf_pages(dmab);
1452     break;
1453     +#endif
1454     default:
1455     printk(KERN_ERR "snd-malloc: invalid device type %d\n", dmab->dev.type);
1456     }
1457     diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
1458     index 7b2c1dc..5bff700 100644
1459     --- a/sound/pci/emu10k1/emumixer.c
1460     +++ b/sound/pci/emu10k1/emumixer.c
1461     @@ -871,7 +871,7 @@ static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
1462     .access = SNDRV_CTL_ELEM_ACCESS_READ,
1463     .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1464     .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1465     - .count = 4,
1466     + .count = 3,
1467     .info = snd_emu10k1_spdif_info,
1468     .get = snd_emu10k1_spdif_get_mask
1469     };
1470     @@ -880,7 +880,7 @@ static struct snd_kcontrol_new snd_emu10k1_spdif_control =
1471     {
1472     .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1473     .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1474     - .count = 4,
1475     + .count = 3,
1476     .info = snd_emu10k1_spdif_info,
1477     .get = snd_emu10k1_spdif_get,
1478     .put = snd_emu10k1_spdif_put
1479     diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
1480     index 3f25de7..d46e7e4 100644
1481     --- a/sound/pci/hda/patch_sigmatel.c
1482     +++ b/sound/pci/hda/patch_sigmatel.c
1483     @@ -162,8 +162,9 @@ static hda_nid_t stac925x_dac_nids[1] = {
1484     0x02,
1485     };
1486    
1487     -static hda_nid_t stac925x_dmic_nids[1] = {
1488     - 0x15,
1489     +#define STAC925X_NUM_DMICS 1
1490     +static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
1491     + 0x15, 0
1492     };
1493    
1494     static hda_nid_t stac922x_adc_nids[2] = {
1495     @@ -190,8 +191,9 @@ static hda_nid_t stac9205_mux_nids[2] = {
1496     0x19, 0x1a
1497     };
1498    
1499     -static hda_nid_t stac9205_dmic_nids[2] = {
1500     - 0x17, 0x18,
1501     +#define STAC9205_NUM_DMICS 2
1502     +static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
1503     + 0x17, 0x18, 0
1504     };
1505    
1506     static hda_nid_t stac9200_pin_nids[8] = {
1507     @@ -1182,7 +1184,8 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf
1508     case 3:
1509     /* add line-in as side */
1510     if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 3) {
1511     - cfg->line_out_pins[3] = cfg->input_pins[AUTO_PIN_LINE];
1512     + cfg->line_out_pins[cfg->line_outs] =
1513     + cfg->input_pins[AUTO_PIN_LINE];
1514     spec->line_switch = 1;
1515     cfg->line_outs++;
1516     }
1517     @@ -1190,12 +1193,14 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf
1518     case 2:
1519     /* add line-in as clfe and mic as side */
1520     if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 2) {
1521     - cfg->line_out_pins[2] = cfg->input_pins[AUTO_PIN_LINE];
1522     + cfg->line_out_pins[cfg->line_outs] =
1523     + cfg->input_pins[AUTO_PIN_LINE];
1524     spec->line_switch = 1;
1525     cfg->line_outs++;
1526     }
1527     if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 3) {
1528     - cfg->line_out_pins[3] = cfg->input_pins[AUTO_PIN_MIC];
1529     + cfg->line_out_pins[cfg->line_outs] =
1530     + cfg->input_pins[AUTO_PIN_MIC];
1531     spec->mic_switch = 1;
1532     cfg->line_outs++;
1533     }
1534     @@ -1203,12 +1208,14 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf
1535     case 1:
1536     /* add line-in as surr and mic as clfe */
1537     if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 1) {
1538     - cfg->line_out_pins[1] = cfg->input_pins[AUTO_PIN_LINE];
1539     + cfg->line_out_pins[cfg->line_outs] =
1540     + cfg->input_pins[AUTO_PIN_LINE];
1541     spec->line_switch = 1;
1542     cfg->line_outs++;
1543     }
1544     if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 2) {
1545     - cfg->line_out_pins[2] = cfg->input_pins[AUTO_PIN_MIC];
1546     + cfg->line_out_pins[cfg->line_outs] =
1547     + cfg->input_pins[AUTO_PIN_MIC];
1548     spec->mic_switch = 1;
1549     cfg->line_outs++;
1550     }
1551     @@ -2058,7 +2065,7 @@ static int patch_stac925x(struct hda_codec *codec)
1552     case 0x83847633: /* STAC9202D */
1553     case 0x83847636: /* STAC9251 */
1554     case 0x83847637: /* STAC9251D */
1555     - spec->num_dmics = 1;
1556     + spec->num_dmics = STAC925X_NUM_DMICS;
1557     spec->dmic_nids = stac925x_dmic_nids;
1558     break;
1559     default:
1560     @@ -2302,7 +2309,7 @@ static int patch_stac9205(struct hda_codec *codec)
1561     spec->mux_nids = stac9205_mux_nids;
1562     spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
1563     spec->dmic_nids = stac9205_dmic_nids;
1564     - spec->num_dmics = ARRAY_SIZE(stac9205_dmic_nids);
1565     + spec->num_dmics = STAC9205_NUM_DMICS;
1566     spec->dmux_nid = 0x1d;
1567    
1568     spec->init = stac9205_core_init;
1569     diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
1570     index 3b3ef65..75dcb9a 100644
1571     --- a/sound/pci/rme9652/hdsp.c
1572     +++ b/sound/pci/rme9652/hdsp.c
1573     @@ -3108,6 +3108,9 @@ static int hdsp_dds_offset(struct hdsp *hdsp)
1574     unsigned int dds_value = hdsp->dds_value;
1575     int system_sample_rate = hdsp->system_sample_rate;
1576    
1577     + if (!dds_value)
1578     + return 0;
1579     +
1580     n = DDS_NUMERATOR;
1581     /*
1582     * dds_value = n / rate
1583     diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c
1584     index 325d4b6..19776e7 100644
1585     --- a/sound/usb/usbmixer.c
1586     +++ b/sound/usb/usbmixer.c
1587     @@ -1483,7 +1483,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi
1588     struct snd_kcontrol *kctl;
1589     char **namelist;
1590    
1591     - if (! num_ins || desc[0] < 6 + num_ins) {
1592     + if (! num_ins || desc[0] < 5 + num_ins) {
1593     snd_printk(KERN_ERR "invalid SELECTOR UNIT descriptor %d\n", unitid);
1594     return -EINVAL;
1595     }