Annotation of /trunk/kernel26-alx/patches-2.6.37-r1/0103-2.6.37.4-all-fixes.patch
Parent Directory | Revision Log
Revision 1311 -
(hide annotations)
(download)
Tue Apr 12 14:29:09 2011 UTC (13 years, 5 months ago) by niro
File size: 27766 byte(s)
Tue Apr 12 14:29:09 2011 UTC (13 years, 5 months ago) by niro
File size: 27766 byte(s)
kernel 2.6.37-alx-r1
1 | niro | 1311 | diff --git a/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c |
2 | index 4f6f679..4a5a42b 100644 | ||
3 | --- a/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c | ||
4 | +++ b/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c | ||
5 | @@ -195,7 +195,7 @@ static unsigned int pcc_get_freq(unsigned int cpu) | ||
6 | cmd_incomplete: | ||
7 | iowrite16(0, &pcch_hdr->status); | ||
8 | spin_unlock(&pcc_lock); | ||
9 | - return -EINVAL; | ||
10 | + return 0; | ||
11 | } | ||
12 | |||
13 | static int pcc_cpufreq_target(struct cpufreq_policy *policy, | ||
14 | diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c | ||
15 | index ad2520b..e0d9473 100644 | ||
16 | --- a/drivers/char/virtio_console.c | ||
17 | +++ b/drivers/char/virtio_console.c | ||
18 | @@ -387,6 +387,10 @@ static void discard_port_data(struct port *port) | ||
19 | unsigned int len; | ||
20 | int ret; | ||
21 | |||
22 | + if (!port->portdev) { | ||
23 | + /* Device has been unplugged. vqs are already gone. */ | ||
24 | + return; | ||
25 | + } | ||
26 | vq = port->in_vq; | ||
27 | if (port->inbuf) | ||
28 | buf = port->inbuf; | ||
29 | @@ -469,6 +473,10 @@ static void reclaim_consumed_buffers(struct port *port) | ||
30 | void *buf; | ||
31 | unsigned int len; | ||
32 | |||
33 | + if (!port->portdev) { | ||
34 | + /* Device has been unplugged. vqs are already gone. */ | ||
35 | + return; | ||
36 | + } | ||
37 | while ((buf = virtqueue_get_buf(port->out_vq, &len))) { | ||
38 | kfree(buf); | ||
39 | port->outvq_full = false; | ||
40 | diff --git a/drivers/hid/hid-mosart.c b/drivers/hid/hid-mosart.c | ||
41 | index 251eaa4..eec4c4a 100644 | ||
42 | --- a/drivers/hid/hid-mosart.c | ||
43 | +++ b/drivers/hid/hid-mosart.c | ||
44 | @@ -90,6 +90,10 @@ static int mosart_input_mapping(struct hid_device *hdev, struct hid_input *hi, | ||
45 | case 0xff000000: | ||
46 | /* ignore HID features */ | ||
47 | return -1; | ||
48 | + | ||
49 | + case HID_UP_BUTTON: | ||
50 | + /* ignore buttons */ | ||
51 | + return -1; | ||
52 | } | ||
53 | |||
54 | return 0; | ||
55 | diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c | ||
56 | index e06acd1..535cc69 100644 | ||
57 | --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c | ||
58 | +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | ||
59 | @@ -870,6 +870,23 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap) | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | +static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index, | ||
64 | + u16 pid, int onoff) | ||
65 | +{ | ||
66 | + struct dib0700_state *st = adapter->dev->priv; | ||
67 | + if (st->is_dib7000pc) | ||
68 | + return dib7000p_pid_filter(adapter->fe, index, pid, onoff); | ||
69 | + return dib7000m_pid_filter(adapter->fe, index, pid, onoff); | ||
70 | +} | ||
71 | + | ||
72 | +static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) | ||
73 | +{ | ||
74 | + struct dib0700_state *st = adapter->dev->priv; | ||
75 | + if (st->is_dib7000pc) | ||
76 | + return dib7000p_pid_filter_ctrl(adapter->fe, onoff); | ||
77 | + return dib7000m_pid_filter_ctrl(adapter->fe, onoff); | ||
78 | +} | ||
79 | + | ||
80 | static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) | ||
81 | { | ||
82 | return dib7000p_pid_filter(adapter->fe, index, pid, onoff); | ||
83 | @@ -1875,8 +1892,8 @@ struct dvb_usb_device_properties dib0700_devices[] = { | ||
84 | { | ||
85 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, | ||
86 | .pid_filter_count = 32, | ||
87 | - .pid_filter = stk70x0p_pid_filter, | ||
88 | - .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, | ||
89 | + .pid_filter = stk7700p_pid_filter, | ||
90 | + .pid_filter_ctrl = stk7700p_pid_filter_ctrl, | ||
91 | .frontend_attach = stk7700p_frontend_attach, | ||
92 | .tuner_attach = stk7700p_tuner_attach, | ||
93 | |||
94 | diff --git a/drivers/media/dvb/frontends/dib7000m.c b/drivers/media/dvb/frontends/dib7000m.c | ||
95 | index 0f09fd3..f01279f 100644 | ||
96 | --- a/drivers/media/dvb/frontends/dib7000m.c | ||
97 | +++ b/drivers/media/dvb/frontends/dib7000m.c | ||
98 | @@ -1285,6 +1285,25 @@ struct i2c_adapter * dib7000m_get_i2c_master(struct dvb_frontend *demod, enum di | ||
99 | } | ||
100 | EXPORT_SYMBOL(dib7000m_get_i2c_master); | ||
101 | |||
102 | +int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff) | ||
103 | +{ | ||
104 | + struct dib7000m_state *state = fe->demodulator_priv; | ||
105 | + u16 val = dib7000m_read_word(state, 294 + state->reg_offs) & 0xffef; | ||
106 | + val |= (onoff & 0x1) << 4; | ||
107 | + dprintk("PID filter enabled %d", onoff); | ||
108 | + return dib7000m_write_word(state, 294 + state->reg_offs, val); | ||
109 | +} | ||
110 | +EXPORT_SYMBOL(dib7000m_pid_filter_ctrl); | ||
111 | + | ||
112 | +int dib7000m_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff) | ||
113 | +{ | ||
114 | + struct dib7000m_state *state = fe->demodulator_priv; | ||
115 | + dprintk("PID filter: index %x, PID %d, OnOff %d", id, pid, onoff); | ||
116 | + return dib7000m_write_word(state, 300 + state->reg_offs + id, | ||
117 | + onoff ? (1 << 13) | pid : 0); | ||
118 | +} | ||
119 | +EXPORT_SYMBOL(dib7000m_pid_filter); | ||
120 | + | ||
121 | #if 0 | ||
122 | /* used with some prototype boards */ | ||
123 | int dib7000m_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, | ||
124 | diff --git a/drivers/media/dvb/frontends/dib7000m.h b/drivers/media/dvb/frontends/dib7000m.h | ||
125 | index 113819c..81fcf22 100644 | ||
126 | --- a/drivers/media/dvb/frontends/dib7000m.h | ||
127 | +++ b/drivers/media/dvb/frontends/dib7000m.h | ||
128 | @@ -46,6 +46,8 @@ extern struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap, | ||
129 | extern struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *, | ||
130 | enum dibx000_i2c_interface, | ||
131 | int); | ||
132 | +extern int dib7000m_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff); | ||
133 | +extern int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff); | ||
134 | #else | ||
135 | static inline | ||
136 | struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap, | ||
137 | @@ -63,6 +65,19 @@ struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *demod, | ||
138 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
139 | return NULL; | ||
140 | } | ||
141 | +static inline int dib7000m_pid_filter(struct dvb_frontend *fe, u8 id, | ||
142 | + u16 pid, u8 onoff) | ||
143 | +{ | ||
144 | + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
145 | + return -ENODEV; | ||
146 | +} | ||
147 | + | ||
148 | +static inline int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, | ||
149 | + uint8_t onoff) | ||
150 | +{ | ||
151 | + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
152 | + return -ENODEV; | ||
153 | +} | ||
154 | #endif | ||
155 | |||
156 | /* TODO | ||
157 | diff --git a/drivers/media/video/cx23885/cx23885-i2c.c b/drivers/media/video/cx23885/cx23885-i2c.c | ||
158 | index ed3d8f5..1007f80 100644 | ||
159 | --- a/drivers/media/video/cx23885/cx23885-i2c.c | ||
160 | +++ b/drivers/media/video/cx23885/cx23885-i2c.c | ||
161 | @@ -122,10 +122,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, | ||
162 | |||
163 | if (!i2c_wait_done(i2c_adap)) | ||
164 | goto eio; | ||
165 | - if (!i2c_slave_did_ack(i2c_adap)) { | ||
166 | - retval = -ENXIO; | ||
167 | - goto err; | ||
168 | - } | ||
169 | if (i2c_debug) { | ||
170 | printk(" <W %02x %02x", msg->addr << 1, msg->buf[0]); | ||
171 | if (!(ctrl & I2C_NOSTOP)) | ||
172 | @@ -209,10 +205,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, | ||
173 | |||
174 | if (!i2c_wait_done(i2c_adap)) | ||
175 | goto eio; | ||
176 | - if (cnt == 0 && !i2c_slave_did_ack(i2c_adap)) { | ||
177 | - retval = -ENXIO; | ||
178 | - goto err; | ||
179 | - } | ||
180 | msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff; | ||
181 | if (i2c_debug) { | ||
182 | dprintk(1, " %02x", msg->buf[cnt]); | ||
183 | diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c | ||
184 | index f164618..a201d9c 100644 | ||
185 | --- a/drivers/media/video/cx25840/cx25840-core.c | ||
186 | +++ b/drivers/media/video/cx25840/cx25840-core.c | ||
187 | @@ -2031,7 +2031,8 @@ static int cx25840_probe(struct i2c_client *client, | ||
188 | kfree(state); | ||
189 | return err; | ||
190 | } | ||
191 | - v4l2_ctrl_cluster(2, &state->volume); | ||
192 | + if (!is_cx2583x(state)) | ||
193 | + v4l2_ctrl_cluster(2, &state->volume); | ||
194 | v4l2_ctrl_handler_setup(&state->hdl); | ||
195 | |||
196 | cx25840_ir_probe(sd); | ||
197 | diff --git a/drivers/media/video/ivtv/ivtv-irq.c b/drivers/media/video/ivtv/ivtv-irq.c | ||
198 | index 9b4faf0..9c29e96 100644 | ||
199 | --- a/drivers/media/video/ivtv/ivtv-irq.c | ||
200 | +++ b/drivers/media/video/ivtv/ivtv-irq.c | ||
201 | @@ -628,22 +628,66 @@ static void ivtv_irq_enc_pio_complete(struct ivtv *itv) | ||
202 | static void ivtv_irq_dma_err(struct ivtv *itv) | ||
203 | { | ||
204 | u32 data[CX2341X_MBOX_MAX_DATA]; | ||
205 | + u32 status; | ||
206 | |||
207 | del_timer(&itv->dma_timer); | ||
208 | + | ||
209 | ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data); | ||
210 | + status = read_reg(IVTV_REG_DMASTATUS); | ||
211 | IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1], | ||
212 | - read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream); | ||
213 | - write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS); | ||
214 | + status, itv->cur_dma_stream); | ||
215 | + /* | ||
216 | + * We do *not* write back to the IVTV_REG_DMASTATUS register to | ||
217 | + * clear the error status, if either the encoder write (0x02) or | ||
218 | + * decoder read (0x01) bus master DMA operation do not indicate | ||
219 | + * completed. We can race with the DMA engine, which may have | ||
220 | + * transitioned to completed status *after* we read the register. | ||
221 | + * Setting a IVTV_REG_DMASTATUS flag back to "busy" status, after the | ||
222 | + * DMA engine has completed, will cause the DMA engine to stop working. | ||
223 | + */ | ||
224 | + status &= 0x3; | ||
225 | + if (status == 0x3) | ||
226 | + write_reg(status, IVTV_REG_DMASTATUS); | ||
227 | + | ||
228 | if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && | ||
229 | itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) { | ||
230 | struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream]; | ||
231 | |||
232 | - /* retry */ | ||
233 | - if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) | ||
234 | + if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) { | ||
235 | + /* retry */ | ||
236 | + /* | ||
237 | + * FIXME - handle cases of DMA error similar to | ||
238 | + * encoder below, except conditioned on status & 0x1 | ||
239 | + */ | ||
240 | ivtv_dma_dec_start(s); | ||
241 | - else | ||
242 | - ivtv_dma_enc_start(s); | ||
243 | - return; | ||
244 | + return; | ||
245 | + } else { | ||
246 | + if ((status & 0x2) == 0) { | ||
247 | + /* | ||
248 | + * CX2341x Bus Master DMA write is ongoing. | ||
249 | + * Reset the timer and let it complete. | ||
250 | + */ | ||
251 | + itv->dma_timer.expires = | ||
252 | + jiffies + msecs_to_jiffies(600); | ||
253 | + add_timer(&itv->dma_timer); | ||
254 | + return; | ||
255 | + } | ||
256 | + | ||
257 | + if (itv->dma_retries < 3) { | ||
258 | + /* | ||
259 | + * CX2341x Bus Master DMA write has ended. | ||
260 | + * Retry the write, starting with the first | ||
261 | + * xfer segment. Just retrying the current | ||
262 | + * segment is not sufficient. | ||
263 | + */ | ||
264 | + s->sg_processed = 0; | ||
265 | + itv->dma_retries++; | ||
266 | + ivtv_dma_enc_start_xfer(s); | ||
267 | + return; | ||
268 | + } | ||
269 | + /* Too many retries, give up on this one */ | ||
270 | + } | ||
271 | + | ||
272 | } | ||
273 | if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) { | ||
274 | ivtv_udma_start(itv); | ||
275 | diff --git a/drivers/misc/bmp085.c b/drivers/misc/bmp085.c | ||
276 | index 63ee4c1..b6e1c9a 100644 | ||
277 | --- a/drivers/misc/bmp085.c | ||
278 | +++ b/drivers/misc/bmp085.c | ||
279 | @@ -449,6 +449,7 @@ static const struct i2c_device_id bmp085_id[] = { | ||
280 | { "bmp085", 0 }, | ||
281 | { } | ||
282 | }; | ||
283 | +MODULE_DEVICE_TABLE(i2c, bmp085_id); | ||
284 | |||
285 | static struct i2c_driver bmp085_driver = { | ||
286 | .driver = { | ||
287 | diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c | ||
288 | index 0fa1776..4a0762b 100644 | ||
289 | --- a/drivers/net/forcedeth.c | ||
290 | +++ b/drivers/net/forcedeth.c | ||
291 | @@ -5816,6 +5816,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | ||
292 | goto out_error; | ||
293 | } | ||
294 | |||
295 | + netif_carrier_off(dev); | ||
296 | + | ||
297 | dev_printk(KERN_INFO, &pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, " | ||
298 | "addr %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", | ||
299 | dev->name, | ||
300 | diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c | ||
301 | index 57d747a..1722bcb 100644 | ||
302 | --- a/drivers/net/ixgbe/ixgbe_main.c | ||
303 | +++ b/drivers/net/ixgbe/ixgbe_main.c | ||
304 | @@ -2923,6 +2923,10 @@ static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter) | ||
305 | if (hw->mac.type == ixgbe_mac_82599EB) | ||
306 | adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED; | ||
307 | |||
308 | + /* Disable packet split due to 82599 erratum #45 */ | ||
309 | + if (hw->mac.type == ixgbe_mac_82599EB) | ||
310 | + adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED; | ||
311 | + | ||
312 | /* Set the RX buffer length according to the mode */ | ||
313 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { | ||
314 | rx_buf_len = IXGBE_RX_HDR_SIZE; | ||
315 | diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c | ||
316 | index 3f70a2f..b17e356 100644 | ||
317 | --- a/drivers/net/r8169.c | ||
318 | +++ b/drivers/net/r8169.c | ||
319 | @@ -758,7 +758,8 @@ static void __rtl8169_check_link_status(struct net_device *dev, | ||
320 | if (pm) | ||
321 | pm_request_resume(&tp->pci_dev->dev); | ||
322 | netif_carrier_on(dev); | ||
323 | - netif_info(tp, ifup, dev, "link up\n"); | ||
324 | + if (net_ratelimit()) | ||
325 | + netif_info(tp, ifup, dev, "link up\n"); | ||
326 | } else { | ||
327 | netif_carrier_off(dev); | ||
328 | netif_info(tp, ifdown, dev, "link down\n"); | ||
329 | @@ -3235,6 +3236,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
330 | if (pci_dev_run_wake(pdev)) | ||
331 | pm_runtime_put_noidle(&pdev->dev); | ||
332 | |||
333 | + netif_carrier_off(dev); | ||
334 | + | ||
335 | out: | ||
336 | return rc; | ||
337 | |||
338 | @@ -3725,7 +3728,8 @@ static void rtl_hw_start_8168(struct net_device *dev) | ||
339 | RTL_W16(IntrMitigate, 0x5151); | ||
340 | |||
341 | /* Work around for RxFIFO overflow. */ | ||
342 | - if (tp->mac_version == RTL_GIGA_MAC_VER_11) { | ||
343 | + if (tp->mac_version == RTL_GIGA_MAC_VER_11 || | ||
344 | + tp->mac_version == RTL_GIGA_MAC_VER_22) { | ||
345 | tp->intr_event |= RxFIFOOver | PCSTimeout; | ||
346 | tp->intr_event &= ~RxOverflow; | ||
347 | } | ||
348 | @@ -4602,12 +4606,32 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) | ||
349 | break; | ||
350 | } | ||
351 | |||
352 | - /* Work around for rx fifo overflow */ | ||
353 | - if (unlikely(status & RxFIFOOver) && | ||
354 | - (tp->mac_version == RTL_GIGA_MAC_VER_11)) { | ||
355 | - netif_stop_queue(dev); | ||
356 | - rtl8169_tx_timeout(dev); | ||
357 | - break; | ||
358 | + if (unlikely(status & RxFIFOOver)) { | ||
359 | + switch (tp->mac_version) { | ||
360 | + /* Work around for rx fifo overflow */ | ||
361 | + case RTL_GIGA_MAC_VER_11: | ||
362 | + case RTL_GIGA_MAC_VER_22: | ||
363 | + case RTL_GIGA_MAC_VER_26: | ||
364 | + netif_stop_queue(dev); | ||
365 | + rtl8169_tx_timeout(dev); | ||
366 | + goto done; | ||
367 | + /* Testers needed. */ | ||
368 | + case RTL_GIGA_MAC_VER_17: | ||
369 | + case RTL_GIGA_MAC_VER_19: | ||
370 | + case RTL_GIGA_MAC_VER_20: | ||
371 | + case RTL_GIGA_MAC_VER_21: | ||
372 | + case RTL_GIGA_MAC_VER_23: | ||
373 | + case RTL_GIGA_MAC_VER_24: | ||
374 | + case RTL_GIGA_MAC_VER_27: | ||
375 | + /* Experimental science. Pktgen proof. */ | ||
376 | + case RTL_GIGA_MAC_VER_12: | ||
377 | + case RTL_GIGA_MAC_VER_25: | ||
378 | + if (status == RxFIFOOver) | ||
379 | + goto done; | ||
380 | + break; | ||
381 | + default: | ||
382 | + break; | ||
383 | + } | ||
384 | } | ||
385 | |||
386 | if (unlikely(status & SYSErr)) { | ||
387 | @@ -4643,7 +4667,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) | ||
388 | (status & RxFIFOOver) ? (status | RxOverflow) : status); | ||
389 | status = RTL_R16(IntrStatus); | ||
390 | } | ||
391 | - | ||
392 | +done: | ||
393 | return IRQ_RETVAL(handled); | ||
394 | } | ||
395 | |||
396 | diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h | ||
397 | index c0b60ce..94bd9bc 100644 | ||
398 | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||
399 | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||
400 | @@ -21,7 +21,6 @@ | ||
401 | #include <linux/device.h> | ||
402 | #include <linux/leds.h> | ||
403 | #include <linux/completion.h> | ||
404 | -#include <linux/pm_qos_params.h> | ||
405 | |||
406 | #include "debug.h" | ||
407 | #include "common.h" | ||
408 | @@ -647,8 +646,6 @@ struct ath_softc { | ||
409 | struct ath_descdma txsdma; | ||
410 | |||
411 | struct ath_ant_comb ant_comb; | ||
412 | - | ||
413 | - struct pm_qos_request_list pm_qos_req; | ||
414 | }; | ||
415 | |||
416 | struct ath_wiphy { | ||
417 | diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c | ||
418 | index 14b8ab3..91d9b2a 100644 | ||
419 | --- a/drivers/net/wireless/ath/ath9k/init.c | ||
420 | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||
421 | @@ -758,9 +758,6 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid, | ||
422 | ath_init_leds(sc); | ||
423 | ath_start_rfkill_poll(sc); | ||
424 | |||
425 | - pm_qos_add_request(&sc->pm_qos_req, PM_QOS_CPU_DMA_LATENCY, | ||
426 | - PM_QOS_DEFAULT_VALUE); | ||
427 | - | ||
428 | return 0; | ||
429 | |||
430 | error_world: | ||
431 | @@ -829,7 +826,6 @@ void ath9k_deinit_device(struct ath_softc *sc) | ||
432 | } | ||
433 | |||
434 | ieee80211_unregister_hw(hw); | ||
435 | - pm_qos_remove_request(&sc->pm_qos_req); | ||
436 | ath_rx_cleanup(sc); | ||
437 | ath_tx_cleanup(sc); | ||
438 | ath9k_deinit_softc(sc); | ||
439 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c | ||
440 | index d1b0db4..cb0b2b9 100644 | ||
441 | --- a/drivers/net/wireless/ath/ath9k/main.c | ||
442 | +++ b/drivers/net/wireless/ath/ath9k/main.c | ||
443 | @@ -1245,8 +1245,6 @@ static int ath9k_start(struct ieee80211_hw *hw) | ||
444 | ath9k_btcoex_timer_resume(sc); | ||
445 | } | ||
446 | |||
447 | - pm_qos_update_request(&sc->pm_qos_req, 55); | ||
448 | - | ||
449 | mutex_unlock: | ||
450 | mutex_unlock(&sc->mutex); | ||
451 | |||
452 | @@ -1425,8 +1423,6 @@ static void ath9k_stop(struct ieee80211_hw *hw) | ||
453 | |||
454 | sc->sc_flags |= SC_OP_INVALID; | ||
455 | |||
456 | - pm_qos_update_request(&sc->pm_qos_req, PM_QOS_DEFAULT_VALUE); | ||
457 | - | ||
458 | mutex_unlock(&sc->mutex); | ||
459 | |||
460 | ath_print(common, ATH_DBG_CONFIG, "Driver halt\n"); | ||
461 | diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c | ||
462 | index 8cd58e4..5ad44da 100644 | ||
463 | --- a/drivers/s390/char/keyboard.c | ||
464 | +++ b/drivers/s390/char/keyboard.c | ||
465 | @@ -460,7 +460,8 @@ kbd_ioctl(struct kbd_data *kbd, struct file *file, | ||
466 | unsigned int cmd, unsigned long arg) | ||
467 | { | ||
468 | void __user *argp; | ||
469 | - int ct, perm; | ||
470 | + unsigned int ct; | ||
471 | + int perm; | ||
472 | |||
473 | argp = (void __user *)arg; | ||
474 | |||
475 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
476 | index 4435e5e..c2c7a6b 100644 | ||
477 | --- a/fs/nfs/nfs4proc.c | ||
478 | +++ b/fs/nfs/nfs4proc.c | ||
479 | @@ -49,6 +49,7 @@ | ||
480 | #include <linux/mount.h> | ||
481 | #include <linux/module.h> | ||
482 | #include <linux/sunrpc/bc_xprt.h> | ||
483 | +#include <linux/mm.h> | ||
484 | |||
485 | #include "nfs4_fs.h" | ||
486 | #include "delegation.h" | ||
487 | @@ -3216,6 +3217,35 @@ static void buf_to_pages(const void *buf, size_t buflen, | ||
488 | } | ||
489 | } | ||
490 | |||
491 | +static int buf_to_pages_noslab(const void *buf, size_t buflen, | ||
492 | + struct page **pages, unsigned int *pgbase) | ||
493 | +{ | ||
494 | + struct page *newpage, **spages; | ||
495 | + int rc = 0; | ||
496 | + size_t len; | ||
497 | + spages = pages; | ||
498 | + | ||
499 | + do { | ||
500 | + len = min(PAGE_CACHE_SIZE, buflen); | ||
501 | + newpage = alloc_page(GFP_KERNEL); | ||
502 | + | ||
503 | + if (newpage == NULL) | ||
504 | + goto unwind; | ||
505 | + memcpy(page_address(newpage), buf, len); | ||
506 | + buf += len; | ||
507 | + buflen -= len; | ||
508 | + *pages++ = newpage; | ||
509 | + rc++; | ||
510 | + } while (buflen != 0); | ||
511 | + | ||
512 | + return rc; | ||
513 | + | ||
514 | +unwind: | ||
515 | + for(; rc > 0; rc--) | ||
516 | + __free_page(spages[rc-1]); | ||
517 | + return -ENOMEM; | ||
518 | +} | ||
519 | + | ||
520 | struct nfs4_cached_acl { | ||
521 | int cached; | ||
522 | size_t len; | ||
523 | @@ -3384,13 +3414,23 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl | ||
524 | .rpc_argp = &arg, | ||
525 | .rpc_resp = &res, | ||
526 | }; | ||
527 | - int ret; | ||
528 | + int ret, i; | ||
529 | |||
530 | if (!nfs4_server_supports_acls(server)) | ||
531 | return -EOPNOTSUPP; | ||
532 | + i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
533 | + if (i < 0) | ||
534 | + return i; | ||
535 | nfs_inode_return_delegation(inode); | ||
536 | - buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
537 | ret = nfs4_call_sync(server, &msg, &arg, &res, 1); | ||
538 | + | ||
539 | + /* | ||
540 | + * Free each page after tx, so the only ref left is | ||
541 | + * held by the network stack | ||
542 | + */ | ||
543 | + for (; i > 0; i--) | ||
544 | + put_page(pages[i-1]); | ||
545 | + | ||
546 | /* | ||
547 | * Acl update can result in inode attribute update. | ||
548 | * so mark the attribute cache invalid. | ||
549 | diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c | ||
550 | index 0662a98..635f663 100644 | ||
551 | --- a/fs/nfs/nfs4xdr.c | ||
552 | +++ b/fs/nfs/nfs4xdr.c | ||
553 | @@ -6212,9 +6212,6 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, | ||
554 | if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE) | ||
555 | entry->d_type = nfs_umode_to_dtype(entry->fattr->mode); | ||
556 | |||
557 | - if (verify_attr_len(xdr, p, len) < 0) | ||
558 | - goto out_overflow; | ||
559 | - | ||
560 | return p; | ||
561 | |||
562 | out_overflow: | ||
563 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
564 | index 67080e4..5cf8fa3 100644 | ||
565 | --- a/fs/nfsd/nfs4xdr.c | ||
566 | +++ b/fs/nfsd/nfs4xdr.c | ||
567 | @@ -1107,7 +1107,7 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp, | ||
568 | |||
569 | u32 dummy; | ||
570 | char *machine_name; | ||
571 | - int i; | ||
572 | + int i, j; | ||
573 | int nr_secflavs; | ||
574 | |||
575 | READ_BUF(16); | ||
576 | @@ -1180,7 +1180,7 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp, | ||
577 | READ_BUF(4); | ||
578 | READ32(dummy); | ||
579 | READ_BUF(dummy * 4); | ||
580 | - for (i = 0; i < dummy; ++i) | ||
581 | + for (j = 0; j < dummy; ++j) | ||
582 | READ32(dummy); | ||
583 | break; | ||
584 | case RPC_AUTH_GSS: | ||
585 | diff --git a/include/keys/rxrpc-type.h b/include/keys/rxrpc-type.h | ||
586 | index 5cb86c3..fc48754 100644 | ||
587 | --- a/include/keys/rxrpc-type.h | ||
588 | +++ b/include/keys/rxrpc-type.h | ||
589 | @@ -99,7 +99,6 @@ struct rxrpc_key_token { | ||
590 | * structure of raw payloads passed to add_key() or instantiate key | ||
591 | */ | ||
592 | struct rxrpc_key_data_v1 { | ||
593 | - u32 kif_version; /* 1 */ | ||
594 | u16 security_index; | ||
595 | u16 ticket_length; | ||
596 | u32 expiry; /* time_t */ | ||
597 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
598 | index d8fd2c2..e63d08b 100644 | ||
599 | --- a/include/linux/netdevice.h | ||
600 | +++ b/include/linux/netdevice.h | ||
601 | @@ -2336,6 +2336,9 @@ extern int netdev_notice(const struct net_device *dev, const char *format, ...) | ||
602 | extern int netdev_info(const struct net_device *dev, const char *format, ...) | ||
603 | __attribute__ ((format (printf, 2, 3))); | ||
604 | |||
605 | +#define MODULE_ALIAS_NETDEV(device) \ | ||
606 | + MODULE_ALIAS("netdev-" device) | ||
607 | + | ||
608 | #if defined(DEBUG) | ||
609 | #define netdev_dbg(__dev, format, args...) \ | ||
610 | netdev_printk(KERN_DEBUG, __dev, format, ##args) | ||
611 | diff --git a/kernel/cpuset.c b/kernel/cpuset.c | ||
612 | index 4349935..e92e981 100644 | ||
613 | --- a/kernel/cpuset.c | ||
614 | +++ b/kernel/cpuset.c | ||
615 | @@ -1575,8 +1575,10 @@ static int cpuset_write_resmask(struct cgroup *cgrp, struct cftype *cft, | ||
616 | return -ENODEV; | ||
617 | |||
618 | trialcs = alloc_trial_cpuset(cs); | ||
619 | - if (!trialcs) | ||
620 | - return -ENOMEM; | ||
621 | + if (!trialcs) { | ||
622 | + retval = -ENOMEM; | ||
623 | + goto out; | ||
624 | + } | ||
625 | |||
626 | switch (cft->private) { | ||
627 | case FILE_CPULIST: | ||
628 | @@ -1591,6 +1593,7 @@ static int cpuset_write_resmask(struct cgroup *cgrp, struct cftype *cft, | ||
629 | } | ||
630 | |||
631 | free_trial_cpuset(trialcs); | ||
632 | +out: | ||
633 | cgroup_unlock(); | ||
634 | return retval; | ||
635 | } | ||
636 | diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c | ||
637 | index c5f1d23..acc5b8b 100644 | ||
638 | --- a/kernel/sched_rt.c | ||
639 | +++ b/kernel/sched_rt.c | ||
640 | @@ -199,11 +199,12 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se); | ||
641 | |||
642 | static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) | ||
643 | { | ||
644 | - int this_cpu = smp_processor_id(); | ||
645 | struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr; | ||
646 | struct sched_rt_entity *rt_se; | ||
647 | |||
648 | - rt_se = rt_rq->tg->rt_se[this_cpu]; | ||
649 | + int cpu = cpu_of(rq_of_rt_rq(rt_rq)); | ||
650 | + | ||
651 | + rt_se = rt_rq->tg->rt_se[cpu]; | ||
652 | |||
653 | if (rt_rq->rt_nr_running) { | ||
654 | if (rt_se && !on_rt_rq(rt_se)) | ||
655 | @@ -215,10 +216,10 @@ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) | ||
656 | |||
657 | static void sched_rt_rq_dequeue(struct rt_rq *rt_rq) | ||
658 | { | ||
659 | - int this_cpu = smp_processor_id(); | ||
660 | struct sched_rt_entity *rt_se; | ||
661 | + int cpu = cpu_of(rq_of_rt_rq(rt_rq)); | ||
662 | |||
663 | - rt_se = rt_rq->tg->rt_se[this_cpu]; | ||
664 | + rt_se = rt_rq->tg->rt_se[cpu]; | ||
665 | |||
666 | if (rt_se && on_rt_rq(rt_se)) | ||
667 | dequeue_rt_entity(rt_se); | ||
668 | @@ -546,8 +547,11 @@ static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun) | ||
669 | if (rt_rq->rt_time || rt_rq->rt_nr_running) | ||
670 | idle = 0; | ||
671 | raw_spin_unlock(&rt_rq->rt_runtime_lock); | ||
672 | - } else if (rt_rq->rt_nr_running) | ||
673 | + } else if (rt_rq->rt_nr_running) { | ||
674 | idle = 0; | ||
675 | + if (!rt_rq_throttled(rt_rq)) | ||
676 | + enqueue = 1; | ||
677 | + } | ||
678 | |||
679 | if (enqueue) | ||
680 | sched_rt_rq_enqueue(rt_rq); | ||
681 | diff --git a/mm/mremap.c b/mm/mremap.c | ||
682 | index 563fbdd..e54d2b8 100644 | ||
683 | --- a/mm/mremap.c | ||
684 | +++ b/mm/mremap.c | ||
685 | @@ -91,9 +91,7 @@ static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd, | ||
686 | */ | ||
687 | mapping = vma->vm_file->f_mapping; | ||
688 | spin_lock(&mapping->i_mmap_lock); | ||
689 | - if (new_vma->vm_truncate_count && | ||
690 | - new_vma->vm_truncate_count != vma->vm_truncate_count) | ||
691 | - new_vma->vm_truncate_count = 0; | ||
692 | + new_vma->vm_truncate_count = 0; | ||
693 | } | ||
694 | |||
695 | /* | ||
696 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
697 | index c0d3b5f..1f03c4f 100644 | ||
698 | --- a/net/core/dev.c | ||
699 | +++ b/net/core/dev.c | ||
700 | @@ -1116,13 +1116,21 @@ EXPORT_SYMBOL(netdev_bonding_change); | ||
701 | void dev_load(struct net *net, const char *name) | ||
702 | { | ||
703 | struct net_device *dev; | ||
704 | + int no_module; | ||
705 | |||
706 | rcu_read_lock(); | ||
707 | dev = dev_get_by_name_rcu(net, name); | ||
708 | rcu_read_unlock(); | ||
709 | |||
710 | - if (!dev && capable(CAP_NET_ADMIN)) | ||
711 | - request_module("%s", name); | ||
712 | + no_module = !dev; | ||
713 | + if (no_module && capable(CAP_NET_ADMIN)) | ||
714 | + no_module = request_module("netdev-%s", name); | ||
715 | + if (no_module && capable(CAP_SYS_MODULE)) { | ||
716 | + if (!request_module("%s", name)) | ||
717 | + pr_err("Loading kernel module for a network device " | ||
718 | +"with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-%s " | ||
719 | +"instead\n", name); | ||
720 | + } | ||
721 | } | ||
722 | EXPORT_SYMBOL(dev_load); | ||
723 | |||
724 | diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c | ||
725 | index 70ff77f..c0bbbc8 100644 | ||
726 | --- a/net/ipv4/ip_gre.c | ||
727 | +++ b/net/ipv4/ip_gre.c | ||
728 | @@ -1775,3 +1775,4 @@ module_exit(ipgre_fini); | ||
729 | MODULE_LICENSE("GPL"); | ||
730 | MODULE_ALIAS_RTNL_LINK("gre"); | ||
731 | MODULE_ALIAS_RTNL_LINK("gretap"); | ||
732 | +MODULE_ALIAS_NETDEV("gre0"); | ||
733 | diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c | ||
734 | index cd300aa..b472da9 100644 | ||
735 | --- a/net/ipv4/ipip.c | ||
736 | +++ b/net/ipv4/ipip.c | ||
737 | @@ -921,3 +921,4 @@ static void __exit ipip_fini(void) | ||
738 | module_init(ipip_init); | ||
739 | module_exit(ipip_fini); | ||
740 | MODULE_LICENSE("GPL"); | ||
741 | +MODULE_ALIAS_NETDEV("tunl0"); | ||
742 | diff --git a/net/ipv4/netfilter/arpt_mangle.c b/net/ipv4/netfilter/arpt_mangle.c | ||
743 | index b8ddcc4..a5e52a9 100644 | ||
744 | --- a/net/ipv4/netfilter/arpt_mangle.c | ||
745 | +++ b/net/ipv4/netfilter/arpt_mangle.c | ||
746 | @@ -60,12 +60,12 @@ static int checkentry(const struct xt_tgchk_param *par) | ||
747 | |||
748 | if (mangle->flags & ~ARPT_MANGLE_MASK || | ||
749 | !(mangle->flags & ARPT_MANGLE_MASK)) | ||
750 | - return false; | ||
751 | + return -EINVAL; | ||
752 | |||
753 | if (mangle->target != NF_DROP && mangle->target != NF_ACCEPT && | ||
754 | mangle->target != XT_CONTINUE) | ||
755 | - return false; | ||
756 | - return true; | ||
757 | + return -EINVAL; | ||
758 | + return 0; | ||
759 | } | ||
760 | |||
761 | static struct xt_target arpt_mangle_reg __read_mostly = { | ||
762 | diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c | ||
763 | index 70e891a..fa6f032 100644 | ||
764 | --- a/net/ipv6/ip6_tunnel.c | ||
765 | +++ b/net/ipv6/ip6_tunnel.c | ||
766 | @@ -57,6 +57,7 @@ | ||
767 | MODULE_AUTHOR("Ville Nuorvala"); | ||
768 | MODULE_DESCRIPTION("IPv6 tunneling device"); | ||
769 | MODULE_LICENSE("GPL"); | ||
770 | +MODULE_ALIAS_NETDEV("ip6tnl0"); | ||
771 | |||
772 | #define IPV6_TLV_TEL_DST_SIZE 8 | ||
773 | |||
774 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
775 | index 8c4d00c..b770061 100644 | ||
776 | --- a/net/ipv6/sit.c | ||
777 | +++ b/net/ipv6/sit.c | ||
778 | @@ -1292,4 +1292,4 @@ static int __init sit_init(void) | ||
779 | module_init(sit_init); | ||
780 | module_exit(sit_cleanup); | ||
781 | MODULE_LICENSE("GPL"); | ||
782 | -MODULE_ALIAS("sit0"); | ||
783 | +MODULE_ALIAS_NETDEV("sit0"); | ||
784 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c | ||
785 | index 5f5daa3..2a398b0 100644 | ||
786 | --- a/net/netfilter/ipvs/ip_vs_ctl.c | ||
787 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c | ||
788 | @@ -810,9 +810,9 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest, | ||
789 | dest->u_threshold = udest->u_threshold; | ||
790 | dest->l_threshold = udest->l_threshold; | ||
791 | |||
792 | - spin_lock(&dest->dst_lock); | ||
793 | + spin_lock_bh(&dest->dst_lock); | ||
794 | ip_vs_dst_reset(dest); | ||
795 | - spin_unlock(&dest->dst_lock); | ||
796 | + spin_unlock_bh(&dest->dst_lock); | ||
797 | |||
798 | if (add) | ||
799 | ip_vs_new_estimator(&dest->stats); | ||
800 | diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c | ||
801 | index b07393e..9181699 100644 | ||
802 | --- a/net/netfilter/nf_log.c | ||
803 | +++ b/net/netfilter/nf_log.c | ||
804 | @@ -85,6 +85,8 @@ EXPORT_SYMBOL(nf_log_unregister); | ||
805 | |||
806 | int nf_log_bind_pf(u_int8_t pf, const struct nf_logger *logger) | ||
807 | { | ||
808 | + if (pf >= ARRAY_SIZE(nf_loggers)) | ||
809 | + return -EINVAL; | ||
810 | mutex_lock(&nf_log_mutex); | ||
811 | if (__find_logger(pf, logger->name) == NULL) { | ||
812 | mutex_unlock(&nf_log_mutex); | ||
813 | @@ -98,6 +100,8 @@ EXPORT_SYMBOL(nf_log_bind_pf); | ||
814 | |||
815 | void nf_log_unbind_pf(u_int8_t pf) | ||
816 | { | ||
817 | + if (pf >= ARRAY_SIZE(nf_loggers)) | ||
818 | + return; | ||
819 | mutex_lock(&nf_log_mutex); | ||
820 | rcu_assign_pointer(nf_loggers[pf], NULL); | ||
821 | mutex_unlock(&nf_log_mutex); | ||
822 | diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c | ||
823 | index 18af38e..954b89a 100644 | ||
824 | --- a/sound/pci/hda/patch_cirrus.c | ||
825 | +++ b/sound/pci/hda/patch_cirrus.c | ||
826 | @@ -1039,9 +1039,11 @@ static struct hda_verb cs_errata_init_verbs[] = { | ||
827 | {0x11, AC_VERB_SET_PROC_COEF, 0x0008}, | ||
828 | {0x11, AC_VERB_SET_PROC_STATE, 0x00}, | ||
829 | |||
830 | +#if 0 /* Don't to set to D3 as we are in power-up sequence */ | ||
831 | {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */ | ||
832 | {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */ | ||
833 | /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */ | ||
834 | +#endif | ||
835 | |||
836 | {} /* terminator */ | ||
837 | }; | ||
838 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
839 | index 0bc6e4e..e61c87c 100644 | ||
840 | --- a/sound/pci/hda/patch_realtek.c | ||
841 | +++ b/sound/pci/hda/patch_realtek.c | ||
842 | @@ -1127,11 +1127,8 @@ static void alc_automute_speaker(struct hda_codec *codec, int pinctl) | ||
843 | nid = spec->autocfg.hp_pins[i]; | ||
844 | if (!nid) | ||
845 | break; | ||
846 | - if (snd_hda_jack_detect(codec, nid)) { | ||
847 | - spec->jack_present = 1; | ||
848 | - break; | ||
849 | - } | ||
850 | - alc_report_jack(codec, spec->autocfg.hp_pins[i]); | ||
851 | + alc_report_jack(codec, nid); | ||
852 | + spec->jack_present |= snd_hda_jack_detect(codec, nid); | ||
853 | } | ||
854 | |||
855 | mute = spec->jack_present ? HDA_AMP_MUTE : 0; | ||
856 | diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c | ||
857 | index a486670..1dce6d1 100644 | ||
858 | --- a/sound/soc/codecs/wm9081.c | ||
859 | +++ b/sound/soc/codecs/wm9081.c | ||
860 | @@ -15,6 +15,7 @@ | ||
861 | #include <linux/moduleparam.h> | ||
862 | #include <linux/init.h> | ||
863 | #include <linux/delay.h> | ||
864 | +#include <linux/device.h> | ||
865 | #include <linux/pm.h> | ||
866 | #include <linux/i2c.h> | ||
867 | #include <linux/platform_device.h> | ||
868 | @@ -1338,6 +1339,10 @@ static __devinit int wm9081_i2c_probe(struct i2c_client *i2c, | ||
869 | wm9081->control_type = SND_SOC_I2C; | ||
870 | wm9081->control_data = i2c; | ||
871 | |||
872 | + if (dev_get_platdata(&i2c->dev)) | ||
873 | + memcpy(&wm9081->retune, dev_get_platdata(&i2c->dev), | ||
874 | + sizeof(wm9081->retune)); | ||
875 | + | ||
876 | ret = snd_soc_register_codec(&i2c->dev, | ||
877 | &soc_codec_dev_wm9081, &wm9081_dai, 1); | ||
878 | if (ret < 0) |