Contents of /trunk/kernel-alx/patches-3.4/0129-3.4.30-all-fixes.patch
Parent Directory | Revision Log
Revision 2110 -
(show annotations)
(download)
Tue Mar 12 12:15:23 2013 UTC (11 years, 6 months ago) by niro
File size: 35863 byte(s)
Tue Mar 12 12:15:23 2013 UTC (11 years, 6 months ago) by niro
File size: 35863 byte(s)
-sync with upstream
1 | diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S |
2 | index e3e7340..66c4cae 100644 |
3 | --- a/arch/x86/ia32/ia32entry.S |
4 | +++ b/arch/x86/ia32/ia32entry.S |
5 | @@ -205,7 +205,7 @@ sysexit_from_sys_call: |
6 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
7 | jnz ia32_ret_from_sys_call |
8 | TRACE_IRQS_ON |
9 | - sti |
10 | + ENABLE_INTERRUPTS(CLBR_NONE) |
11 | movl %eax,%esi /* second arg, syscall return value */ |
12 | cmpl $-MAX_ERRNO,%eax /* is it an error ? */ |
13 | jbe 1f |
14 | @@ -215,7 +215,7 @@ sysexit_from_sys_call: |
15 | call __audit_syscall_exit |
16 | movq RAX-ARGOFFSET(%rsp),%rax /* reload syscall return value */ |
17 | movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi |
18 | - cli |
19 | + DISABLE_INTERRUPTS(CLBR_NONE) |
20 | TRACE_IRQS_OFF |
21 | testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
22 | jz \exit |
23 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c |
24 | index 4a1d8f3..c62132c 100644 |
25 | --- a/drivers/gpu/drm/radeon/evergreen.c |
26 | +++ b/drivers/gpu/drm/radeon/evergreen.c |
27 | @@ -1147,14 +1147,18 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav |
28 | if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) { |
29 | radeon_wait_for_vblank(rdev, i); |
30 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; |
31 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); |
32 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
33 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); |
34 | } |
35 | } else { |
36 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); |
37 | if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) { |
38 | radeon_wait_for_vblank(rdev, i); |
39 | tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; |
40 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); |
41 | WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); |
42 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); |
43 | } |
44 | } |
45 | /* wait for the next frame */ |
46 | @@ -1179,6 +1183,8 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav |
47 | blackout &= ~BLACKOUT_MODE_MASK; |
48 | WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1); |
49 | } |
50 | + /* wait for the MC to settle */ |
51 | + udelay(100); |
52 | } |
53 | |
54 | void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save) |
55 | @@ -1212,11 +1218,15 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s |
56 | if (ASIC_IS_DCE6(rdev)) { |
57 | tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); |
58 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; |
59 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); |
60 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
61 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); |
62 | } else { |
63 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); |
64 | tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; |
65 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); |
66 | WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); |
67 | + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); |
68 | } |
69 | /* wait for the next frame */ |
70 | frame_count = radeon_get_vblank_counter(rdev, i); |
71 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c |
72 | index 2cad9fd..a2470d9 100644 |
73 | --- a/drivers/gpu/drm/radeon/radeon_combios.c |
74 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c |
75 | @@ -2338,6 +2338,14 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) |
76 | 1), |
77 | ATOM_DEVICE_CRT1_SUPPORT); |
78 | } |
79 | + /* RV100 board with external TDMS bit mis-set. |
80 | + * Actually uses internal TMDS, clear the bit. |
81 | + */ |
82 | + if (dev->pdev->device == 0x5159 && |
83 | + dev->pdev->subsystem_vendor == 0x1014 && |
84 | + dev->pdev->subsystem_device == 0x029A) { |
85 | + tmp &= ~(1 << 4); |
86 | + } |
87 | if ((tmp >> 4) & 0x1) { |
88 | devices |= ATOM_DEVICE_DFP2_SUPPORT; |
89 | radeon_add_legacy_encoder(dev, |
90 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c |
91 | index 1f50727..00d9cac 100644 |
92 | --- a/drivers/gpu/drm/radeon/radeon_display.c |
93 | +++ b/drivers/gpu/drm/radeon/radeon_display.c |
94 | @@ -1129,8 +1129,10 @@ radeon_user_framebuffer_create(struct drm_device *dev, |
95 | } |
96 | |
97 | radeon_fb = kzalloc(sizeof(*radeon_fb), GFP_KERNEL); |
98 | - if (radeon_fb == NULL) |
99 | + if (radeon_fb == NULL) { |
100 | + drm_gem_object_unreference_unlocked(obj); |
101 | return ERR_PTR(-ENOMEM); |
102 | + } |
103 | |
104 | ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); |
105 | if (ret) { |
106 | diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c |
107 | index cc33b3d..33eff8b 100644 |
108 | --- a/drivers/gpu/drm/radeon/radeon_ring.c |
109 | +++ b/drivers/gpu/drm/radeon/radeon_ring.c |
110 | @@ -311,6 +311,9 @@ int radeon_ring_alloc(struct radeon_device *rdev, struct radeon_ring *ring, unsi |
111 | { |
112 | int r; |
113 | |
114 | + /* make sure we aren't trying to allocate more space than there is on the ring */ |
115 | + if (ndw > (ring->ring_size / 4)) |
116 | + return -ENOMEM; |
117 | /* Align requested size with padding so unlock_commit can |
118 | * pad safely */ |
119 | ndw = (ndw + ring->align_mask) & ~ring->align_mask; |
120 | diff --git a/drivers/gpu/drm/radeon/reg_srcs/cayman b/drivers/gpu/drm/radeon/reg_srcs/cayman |
121 | index 0f656b1..a072fa8 100644 |
122 | --- a/drivers/gpu/drm/radeon/reg_srcs/cayman |
123 | +++ b/drivers/gpu/drm/radeon/reg_srcs/cayman |
124 | @@ -1,5 +1,6 @@ |
125 | cayman 0x9400 |
126 | 0x0000802C GRBM_GFX_INDEX |
127 | +0x00008040 WAIT_UNTIL |
128 | 0x000084FC CP_STRMOUT_CNTL |
129 | 0x000085F0 CP_COHER_CNTL |
130 | 0x000085F4 CP_COHER_SIZE |
131 | diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c |
132 | index dd2aeee..8f8c8ae 100644 |
133 | --- a/drivers/rtc/rtc-isl1208.c |
134 | +++ b/drivers/rtc/rtc-isl1208.c |
135 | @@ -494,6 +494,7 @@ isl1208_rtc_interrupt(int irq, void *data) |
136 | { |
137 | unsigned long timeout = jiffies + msecs_to_jiffies(1000); |
138 | struct i2c_client *client = data; |
139 | + struct rtc_device *rtc = i2c_get_clientdata(client); |
140 | int handled = 0, sr, err; |
141 | |
142 | /* |
143 | @@ -516,6 +517,8 @@ isl1208_rtc_interrupt(int irq, void *data) |
144 | if (sr & ISL1208_REG_SR_ALM) { |
145 | dev_dbg(&client->dev, "alarm!\n"); |
146 | |
147 | + rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF); |
148 | + |
149 | /* Clear the alarm */ |
150 | sr &= ~ISL1208_REG_SR_ALM; |
151 | sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, sr); |
152 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
153 | index ef8f790..67dda0d 100644 |
154 | --- a/drivers/usb/core/hub.c |
155 | +++ b/drivers/usb/core/hub.c |
156 | @@ -2463,6 +2463,23 @@ static int check_port_resume_type(struct usb_device *udev, |
157 | } |
158 | |
159 | #ifdef CONFIG_USB_SUSPEND |
160 | +/* |
161 | + * usb_disable_function_remotewakeup - disable usb3.0 |
162 | + * device's function remote wakeup |
163 | + * @udev: target device |
164 | + * |
165 | + * Assume there's only one function on the USB 3.0 |
166 | + * device and disable remote wake for the first |
167 | + * interface. FIXME if the interface association |
168 | + * descriptor shows there's more than one function. |
169 | + */ |
170 | +static int usb_disable_function_remotewakeup(struct usb_device *udev) |
171 | +{ |
172 | + return usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
173 | + USB_REQ_CLEAR_FEATURE, USB_RECIP_INTERFACE, |
174 | + USB_INTRF_FUNC_SUSPEND, 0, NULL, 0, |
175 | + USB_CTRL_SET_TIMEOUT); |
176 | +} |
177 | |
178 | /* |
179 | * usb_port_suspend - suspend a usb device's upstream port |
180 | @@ -2569,12 +2586,19 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
181 | dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", |
182 | port1, status); |
183 | /* paranoia: "should not happen" */ |
184 | - if (udev->do_remote_wakeup) |
185 | - (void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
186 | - USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE, |
187 | - USB_DEVICE_REMOTE_WAKEUP, 0, |
188 | - NULL, 0, |
189 | - USB_CTRL_SET_TIMEOUT); |
190 | + if (udev->do_remote_wakeup) { |
191 | + if (!hub_is_superspeed(hub->hdev)) { |
192 | + (void) usb_control_msg(udev, |
193 | + usb_sndctrlpipe(udev, 0), |
194 | + USB_REQ_CLEAR_FEATURE, |
195 | + USB_RECIP_DEVICE, |
196 | + USB_DEVICE_REMOTE_WAKEUP, 0, |
197 | + NULL, 0, |
198 | + USB_CTRL_SET_TIMEOUT); |
199 | + } else |
200 | + (void) usb_disable_function_remotewakeup(udev); |
201 | + |
202 | + } |
203 | |
204 | /* Try to enable USB2 hardware LPM again */ |
205 | if (udev->usb2_hw_lpm_capable == 1) |
206 | @@ -2661,20 +2685,30 @@ static int finish_port_resume(struct usb_device *udev) |
207 | * udev->reset_resume |
208 | */ |
209 | } else if (udev->actconfig && !udev->reset_resume) { |
210 | - le16_to_cpus(&devstatus); |
211 | - if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { |
212 | - status = usb_control_msg(udev, |
213 | - usb_sndctrlpipe(udev, 0), |
214 | - USB_REQ_CLEAR_FEATURE, |
215 | + if (!hub_is_superspeed(udev->parent)) { |
216 | + le16_to_cpus(&devstatus); |
217 | + if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) |
218 | + status = usb_control_msg(udev, |
219 | + usb_sndctrlpipe(udev, 0), |
220 | + USB_REQ_CLEAR_FEATURE, |
221 | USB_RECIP_DEVICE, |
222 | - USB_DEVICE_REMOTE_WAKEUP, 0, |
223 | - NULL, 0, |
224 | - USB_CTRL_SET_TIMEOUT); |
225 | - if (status) |
226 | - dev_dbg(&udev->dev, |
227 | - "disable remote wakeup, status %d\n", |
228 | - status); |
229 | + USB_DEVICE_REMOTE_WAKEUP, 0, |
230 | + NULL, 0, |
231 | + USB_CTRL_SET_TIMEOUT); |
232 | + } else { |
233 | + status = usb_get_status(udev, USB_RECIP_INTERFACE, 0, |
234 | + &devstatus); |
235 | + le16_to_cpus(&devstatus); |
236 | + if (!status && devstatus & (USB_INTRF_STAT_FUNC_RW_CAP |
237 | + | USB_INTRF_STAT_FUNC_RW)) |
238 | + status = |
239 | + usb_disable_function_remotewakeup(udev); |
240 | } |
241 | + |
242 | + if (status) |
243 | + dev_dbg(&udev->dev, |
244 | + "disable remote wakeup, status %d\n", |
245 | + status); |
246 | status = 0; |
247 | } |
248 | return status; |
249 | diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c |
250 | index 38fe076..3cb52a9 100644 |
251 | --- a/drivers/usb/host/ehci-hub.c |
252 | +++ b/drivers/usb/host/ehci-hub.c |
253 | @@ -612,7 +612,11 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) |
254 | status = STS_PCD; |
255 | } |
256 | } |
257 | - /* FIXME autosuspend idle root hubs */ |
258 | + |
259 | + /* If a resume is in progress, make sure it can finish */ |
260 | + if (ehci->resuming_ports) |
261 | + mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(25)); |
262 | + |
263 | spin_unlock_irqrestore (&ehci->lock, flags); |
264 | return status ? retval : 0; |
265 | } |
266 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c |
267 | index a60679c..14d2d71 100644 |
268 | --- a/drivers/usb/host/ehci-sched.c |
269 | +++ b/drivers/usb/host/ehci-sched.c |
270 | @@ -236,7 +236,7 @@ static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __hc32 mask) |
271 | } |
272 | |
273 | static const unsigned char |
274 | -max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 }; |
275 | +max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 }; |
276 | |
277 | /* carryover low/fullspeed bandwidth that crosses uframe boundries */ |
278 | static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8]) |
279 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c |
280 | index eb5563a..7893351 100644 |
281 | --- a/drivers/usb/host/pci-quirks.c |
282 | +++ b/drivers/usb/host/pci-quirks.c |
283 | @@ -780,6 +780,7 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) |
284 | "defaulting to EHCI.\n"); |
285 | dev_warn(&xhci_pdev->dev, |
286 | "USB 3.0 devices will work at USB 2.0 speeds.\n"); |
287 | + usb_disable_xhci_ports(xhci_pdev); |
288 | return; |
289 | } |
290 | |
291 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
292 | index 01361f9..87ee86d 100644 |
293 | --- a/drivers/usb/host/xhci-ring.c |
294 | +++ b/drivers/usb/host/xhci-ring.c |
295 | @@ -1698,7 +1698,7 @@ static void handle_port_status(struct xhci_hcd *xhci, |
296 | faked_port_index + 1); |
297 | if (slot_id && xhci->devs[slot_id]) |
298 | xhci_ring_device(xhci, slot_id); |
299 | - if (bus_state->port_remote_wakeup && (1 << faked_port_index)) { |
300 | + if (bus_state->port_remote_wakeup & (1 << faked_port_index)) { |
301 | bus_state->port_remote_wakeup &= |
302 | ~(1 << faked_port_index); |
303 | xhci_test_and_clear_bit(xhci, port_array, |
304 | @@ -2587,6 +2587,8 @@ cleanup: |
305 | (trb_comp_code != COMP_STALL && |
306 | trb_comp_code != COMP_BABBLE)) |
307 | xhci_urb_free_priv(xhci, urb_priv); |
308 | + else |
309 | + kfree(urb_priv); |
310 | |
311 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); |
312 | if ((urb->actual_length != urb->transfer_buffer_length && |
313 | @@ -3106,7 +3108,7 @@ static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, |
314 | * running_total. |
315 | */ |
316 | packets_transferred = (running_total + trb_buff_len) / |
317 | - usb_endpoint_maxp(&urb->ep->desc); |
318 | + GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc)); |
319 | |
320 | if ((total_packet_count - packets_transferred) > 31) |
321 | return 31 << 17; |
322 | @@ -3640,7 +3642,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
323 | td_len = urb->iso_frame_desc[i].length; |
324 | td_remain_len = td_len; |
325 | total_packet_count = DIV_ROUND_UP(td_len, |
326 | - usb_endpoint_maxp(&urb->ep->desc)); |
327 | + GET_MAX_PACKET( |
328 | + usb_endpoint_maxp(&urb->ep->desc))); |
329 | /* A zero-length transfer still involves at least one packet. */ |
330 | if (total_packet_count == 0) |
331 | total_packet_count++; |
332 | @@ -3662,9 +3665,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
333 | td = urb_priv->td[i]; |
334 | for (j = 0; j < trbs_per_td; j++) { |
335 | u32 remainder = 0; |
336 | - field = TRB_TBC(burst_count) | TRB_TLBPC(residue); |
337 | + field = 0; |
338 | |
339 | if (first_trb) { |
340 | + field = TRB_TBC(burst_count) | |
341 | + TRB_TLBPC(residue); |
342 | /* Queue the isoc TRB */ |
343 | field |= TRB_TYPE(TRB_ISOC); |
344 | /* Assume URB_ISO_ASAP is set */ |
345 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
346 | index 3fbf39d..7746944 100644 |
347 | --- a/drivers/usb/serial/ftdi_sio.c |
348 | +++ b/drivers/usb/serial/ftdi_sio.c |
349 | @@ -590,6 +590,7 @@ static struct usb_device_id id_table_combined [] = { |
350 | /* |
351 | * ELV devices: |
352 | */ |
353 | + { USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) }, |
354 | { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) }, |
355 | { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) }, |
356 | { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) }, |
357 | @@ -676,6 +677,7 @@ static struct usb_device_id id_table_combined [] = { |
358 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, |
359 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, |
360 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, |
361 | + { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, |
362 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, |
363 | { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, |
364 | { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) }, |
365 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
366 | index fa5d560..9d359e1 100644 |
367 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
368 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
369 | @@ -147,6 +147,11 @@ |
370 | #define XSENS_CONVERTER_6_PID 0xD38E |
371 | #define XSENS_CONVERTER_7_PID 0xD38F |
372 | |
373 | +/** |
374 | + * Zolix (www.zolix.com.cb) product ids |
375 | + */ |
376 | +#define FTDI_OMNI1509 0xD491 /* Omni1509 embedded USB-serial */ |
377 | + |
378 | /* |
379 | * NDI (www.ndigital.com) product ids |
380 | */ |
381 | @@ -204,7 +209,7 @@ |
382 | |
383 | /* |
384 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). |
385 | - * All of these devices use FTDI's vendor ID (0x0403). |
386 | + * Almost all of these devices use FTDI's vendor ID (0x0403). |
387 | * Further IDs taken from ELV Windows .inf file. |
388 | * |
389 | * The previously included PID for the UO 100 module was incorrect. |
390 | @@ -212,6 +217,8 @@ |
391 | * |
392 | * Armin Laeuger originally sent the PID for the UM 100 module. |
393 | */ |
394 | +#define FTDI_ELV_VID 0x1B1F /* ELV AG */ |
395 | +#define FTDI_ELV_WS300_PID 0xC006 /* eQ3 WS 300 PC II */ |
396 | #define FTDI_ELV_USR_PID 0xE000 /* ELV Universal-Sound-Recorder */ |
397 | #define FTDI_ELV_MSM1_PID 0xE001 /* ELV Mini-Sound-Modul */ |
398 | #define FTDI_ELV_KL100_PID 0xE002 /* ELV Kfz-Leistungsmesser KL 100 */ |
399 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
400 | index 0778cd0..6c077a1 100644 |
401 | --- a/drivers/usb/serial/option.c |
402 | +++ b/drivers/usb/serial/option.c |
403 | @@ -242,6 +242,7 @@ static void option_instat_callback(struct urb *urb); |
404 | #define TELIT_PRODUCT_CC864_DUAL 0x1005 |
405 | #define TELIT_PRODUCT_CC864_SINGLE 0x1006 |
406 | #define TELIT_PRODUCT_DE910_DUAL 0x1010 |
407 | +#define TELIT_PRODUCT_LE920 0x1200 |
408 | |
409 | /* ZTE PRODUCTS */ |
410 | #define ZTE_VENDOR_ID 0x19d2 |
411 | @@ -453,6 +454,10 @@ static void option_instat_callback(struct urb *urb); |
412 | #define TPLINK_VENDOR_ID 0x2357 |
413 | #define TPLINK_PRODUCT_MA180 0x0201 |
414 | |
415 | +/* Changhong products */ |
416 | +#define CHANGHONG_VENDOR_ID 0x2077 |
417 | +#define CHANGHONG_PRODUCT_CH690 0x7001 |
418 | + |
419 | /* some devices interfaces need special handling due to a number of reasons */ |
420 | enum option_blacklist_reason { |
421 | OPTION_BLACKLIST_NONE = 0, |
422 | @@ -534,6 +539,11 @@ static const struct option_blacklist_info zte_1255_blacklist = { |
423 | .reserved = BIT(3) | BIT(4), |
424 | }; |
425 | |
426 | +static const struct option_blacklist_info telit_le920_blacklist = { |
427 | + .sendsetup = BIT(0), |
428 | + .reserved = BIT(1) | BIT(5), |
429 | +}; |
430 | + |
431 | static const struct usb_device_id option_ids[] = { |
432 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
433 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
434 | @@ -784,6 +794,8 @@ static const struct usb_device_id option_ids[] = { |
435 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, |
436 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, |
437 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, |
438 | + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), |
439 | + .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, |
440 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
441 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), |
442 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
443 | @@ -1318,6 +1330,7 @@ static const struct usb_device_id option_ids[] = { |
444 | { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) }, |
445 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), |
446 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
447 | + { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, |
448 | { } /* Terminating entry */ |
449 | }; |
450 | MODULE_DEVICE_TABLE(usb, option_ids); |
451 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c |
452 | index 50b5371..d46277d 100644 |
453 | --- a/drivers/usb/serial/qcserial.c |
454 | +++ b/drivers/usb/serial/qcserial.c |
455 | @@ -55,6 +55,7 @@ static const struct usb_device_id id_table[] = { |
456 | {DEVICE_G1K(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ |
457 | {DEVICE_G1K(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ |
458 | {DEVICE_G1K(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ |
459 | + {DEVICE_G1K(0x1bc7, 0x900e)}, /* Telit Gobi QDL device */ |
460 | |
461 | /* Gobi 2000 devices */ |
462 | {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi 2000 QDL device */ |
463 | diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c |
464 | index 105d900..16b0bf0 100644 |
465 | --- a/drivers/usb/storage/initializers.c |
466 | +++ b/drivers/usb/storage/initializers.c |
467 | @@ -92,8 +92,8 @@ int usb_stor_ucr61s2b_init(struct us_data *us) |
468 | return 0; |
469 | } |
470 | |
471 | -/* This places the HUAWEI E220 devices in multi-port mode */ |
472 | -int usb_stor_huawei_e220_init(struct us_data *us) |
473 | +/* This places the HUAWEI usb dongles in multi-port mode */ |
474 | +static int usb_stor_huawei_feature_init(struct us_data *us) |
475 | { |
476 | int result; |
477 | |
478 | @@ -104,3 +104,75 @@ int usb_stor_huawei_e220_init(struct us_data *us) |
479 | US_DEBUGP("Huawei mode set result is %d\n", result); |
480 | return 0; |
481 | } |
482 | + |
483 | +/* |
484 | + * It will send a scsi switch command called rewind' to huawei dongle. |
485 | + * When the dongle receives this command at the first time, |
486 | + * it will reboot immediately. After rebooted, it will ignore this command. |
487 | + * So it is unnecessary to read its response. |
488 | + */ |
489 | +static int usb_stor_huawei_scsi_init(struct us_data *us) |
490 | +{ |
491 | + int result = 0; |
492 | + int act_len = 0; |
493 | + struct bulk_cb_wrap *bcbw = (struct bulk_cb_wrap *) us->iobuf; |
494 | + char rewind_cmd[] = {0x11, 0x06, 0x20, 0x00, 0x00, 0x01, 0x01, 0x00, |
495 | + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
496 | + |
497 | + bcbw->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
498 | + bcbw->Tag = 0; |
499 | + bcbw->DataTransferLength = 0; |
500 | + bcbw->Flags = bcbw->Lun = 0; |
501 | + bcbw->Length = sizeof(rewind_cmd); |
502 | + memset(bcbw->CDB, 0, sizeof(bcbw->CDB)); |
503 | + memcpy(bcbw->CDB, rewind_cmd, sizeof(rewind_cmd)); |
504 | + |
505 | + result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, bcbw, |
506 | + US_BULK_CB_WRAP_LEN, &act_len); |
507 | + US_DEBUGP("transfer actual length=%d, result=%d\n", act_len, result); |
508 | + return result; |
509 | +} |
510 | + |
511 | +/* |
512 | + * It tries to find the supported Huawei USB dongles. |
513 | + * In Huawei, they assign the following product IDs |
514 | + * for all of their mobile broadband dongles, |
515 | + * including the new dongles in the future. |
516 | + * So if the product ID is not included in this list, |
517 | + * it means it is not Huawei's mobile broadband dongles. |
518 | + */ |
519 | +static int usb_stor_huawei_dongles_pid(struct us_data *us) |
520 | +{ |
521 | + struct usb_interface_descriptor *idesc; |
522 | + int idProduct; |
523 | + |
524 | + idesc = &us->pusb_intf->cur_altsetting->desc; |
525 | + idProduct = us->pusb_dev->descriptor.idProduct; |
526 | + /* The first port is CDROM, |
527 | + * means the dongle in the single port mode, |
528 | + * and a switch command is required to be sent. */ |
529 | + if (idesc && idesc->bInterfaceNumber == 0) { |
530 | + if ((idProduct == 0x1001) |
531 | + || (idProduct == 0x1003) |
532 | + || (idProduct == 0x1004) |
533 | + || (idProduct >= 0x1401 && idProduct <= 0x1500) |
534 | + || (idProduct >= 0x1505 && idProduct <= 0x1600) |
535 | + || (idProduct >= 0x1c02 && idProduct <= 0x2202)) { |
536 | + return 1; |
537 | + } |
538 | + } |
539 | + return 0; |
540 | +} |
541 | + |
542 | +int usb_stor_huawei_init(struct us_data *us) |
543 | +{ |
544 | + int result = 0; |
545 | + |
546 | + if (usb_stor_huawei_dongles_pid(us)) { |
547 | + if (us->pusb_dev->descriptor.idProduct >= 0x1446) |
548 | + result = usb_stor_huawei_scsi_init(us); |
549 | + else |
550 | + result = usb_stor_huawei_feature_init(us); |
551 | + } |
552 | + return result; |
553 | +} |
554 | diff --git a/drivers/usb/storage/initializers.h b/drivers/usb/storage/initializers.h |
555 | index 529327f..5376d4f 100644 |
556 | --- a/drivers/usb/storage/initializers.h |
557 | +++ b/drivers/usb/storage/initializers.h |
558 | @@ -46,5 +46,5 @@ int usb_stor_euscsi_init(struct us_data *us); |
559 | * flash reader */ |
560 | int usb_stor_ucr61s2b_init(struct us_data *us); |
561 | |
562 | -/* This places the HUAWEI E220 devices in multi-port mode */ |
563 | -int usb_stor_huawei_e220_init(struct us_data *us); |
564 | +/* This places the HUAWEI usb dongles in multi-port mode */ |
565 | +int usb_stor_huawei_init(struct us_data *us); |
566 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
567 | index 5ffa116..27858f9 100644 |
568 | --- a/drivers/usb/storage/unusual_devs.h |
569 | +++ b/drivers/usb/storage/unusual_devs.h |
570 | @@ -1515,335 +1515,10 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100, |
571 | /* Reported by fangxiaozhi <huananhu@huawei.com> |
572 | * This brings the HUAWEI data card devices into multi-port mode |
573 | */ |
574 | -UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000, |
575 | +UNUSUAL_VENDOR_INTF(0x12d1, 0x08, 0x06, 0x50, |
576 | "HUAWEI MOBILE", |
577 | "Mass Storage", |
578 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
579 | - 0), |
580 | -UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000, |
581 | - "HUAWEI MOBILE", |
582 | - "Mass Storage", |
583 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
584 | - 0), |
585 | -UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000, |
586 | - "HUAWEI MOBILE", |
587 | - "Mass Storage", |
588 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
589 | - 0), |
590 | -UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000, |
591 | - "HUAWEI MOBILE", |
592 | - "Mass Storage", |
593 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
594 | - 0), |
595 | -UNUSUAL_DEV( 0x12d1, 0x1402, 0x0000, 0x0000, |
596 | - "HUAWEI MOBILE", |
597 | - "Mass Storage", |
598 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
599 | - 0), |
600 | -UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000, |
601 | - "HUAWEI MOBILE", |
602 | - "Mass Storage", |
603 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
604 | - 0), |
605 | -UNUSUAL_DEV( 0x12d1, 0x1404, 0x0000, 0x0000, |
606 | - "HUAWEI MOBILE", |
607 | - "Mass Storage", |
608 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
609 | - 0), |
610 | -UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000, |
611 | - "HUAWEI MOBILE", |
612 | - "Mass Storage", |
613 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
614 | - 0), |
615 | -UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000, |
616 | - "HUAWEI MOBILE", |
617 | - "Mass Storage", |
618 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
619 | - 0), |
620 | -UNUSUAL_DEV( 0x12d1, 0x1407, 0x0000, 0x0000, |
621 | - "HUAWEI MOBILE", |
622 | - "Mass Storage", |
623 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
624 | - 0), |
625 | -UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000, |
626 | - "HUAWEI MOBILE", |
627 | - "Mass Storage", |
628 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
629 | - 0), |
630 | -UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000, |
631 | - "HUAWEI MOBILE", |
632 | - "Mass Storage", |
633 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
634 | - 0), |
635 | -UNUSUAL_DEV( 0x12d1, 0x140A, 0x0000, 0x0000, |
636 | - "HUAWEI MOBILE", |
637 | - "Mass Storage", |
638 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
639 | - 0), |
640 | -UNUSUAL_DEV( 0x12d1, 0x140B, 0x0000, 0x0000, |
641 | - "HUAWEI MOBILE", |
642 | - "Mass Storage", |
643 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
644 | - 0), |
645 | -UNUSUAL_DEV( 0x12d1, 0x140C, 0x0000, 0x0000, |
646 | - "HUAWEI MOBILE", |
647 | - "Mass Storage", |
648 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
649 | - 0), |
650 | -UNUSUAL_DEV( 0x12d1, 0x140D, 0x0000, 0x0000, |
651 | - "HUAWEI MOBILE", |
652 | - "Mass Storage", |
653 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
654 | - 0), |
655 | -UNUSUAL_DEV( 0x12d1, 0x140E, 0x0000, 0x0000, |
656 | - "HUAWEI MOBILE", |
657 | - "Mass Storage", |
658 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
659 | - 0), |
660 | -UNUSUAL_DEV( 0x12d1, 0x140F, 0x0000, 0x0000, |
661 | - "HUAWEI MOBILE", |
662 | - "Mass Storage", |
663 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
664 | - 0), |
665 | -UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000, |
666 | - "HUAWEI MOBILE", |
667 | - "Mass Storage", |
668 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
669 | - 0), |
670 | -UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000, |
671 | - "HUAWEI MOBILE", |
672 | - "Mass Storage", |
673 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
674 | - 0), |
675 | -UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000, |
676 | - "HUAWEI MOBILE", |
677 | - "Mass Storage", |
678 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
679 | - 0), |
680 | -UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000, |
681 | - "HUAWEI MOBILE", |
682 | - "Mass Storage", |
683 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
684 | - 0), |
685 | -UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000, |
686 | - "HUAWEI MOBILE", |
687 | - "Mass Storage", |
688 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
689 | - 0), |
690 | -UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000, |
691 | - "HUAWEI MOBILE", |
692 | - "Mass Storage", |
693 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
694 | - 0), |
695 | -UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000, |
696 | - "HUAWEI MOBILE", |
697 | - "Mass Storage", |
698 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
699 | - 0), |
700 | -UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000, |
701 | - "HUAWEI MOBILE", |
702 | - "Mass Storage", |
703 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
704 | - 0), |
705 | -UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000, |
706 | - "HUAWEI MOBILE", |
707 | - "Mass Storage", |
708 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
709 | - 0), |
710 | -UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000, |
711 | - "HUAWEI MOBILE", |
712 | - "Mass Storage", |
713 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
714 | - 0), |
715 | -UNUSUAL_DEV( 0x12d1, 0x141A, 0x0000, 0x0000, |
716 | - "HUAWEI MOBILE", |
717 | - "Mass Storage", |
718 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
719 | - 0), |
720 | -UNUSUAL_DEV( 0x12d1, 0x141B, 0x0000, 0x0000, |
721 | - "HUAWEI MOBILE", |
722 | - "Mass Storage", |
723 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
724 | - 0), |
725 | -UNUSUAL_DEV( 0x12d1, 0x141C, 0x0000, 0x0000, |
726 | - "HUAWEI MOBILE", |
727 | - "Mass Storage", |
728 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
729 | - 0), |
730 | -UNUSUAL_DEV( 0x12d1, 0x141D, 0x0000, 0x0000, |
731 | - "HUAWEI MOBILE", |
732 | - "Mass Storage", |
733 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
734 | - 0), |
735 | -UNUSUAL_DEV( 0x12d1, 0x141E, 0x0000, 0x0000, |
736 | - "HUAWEI MOBILE", |
737 | - "Mass Storage", |
738 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
739 | - 0), |
740 | -UNUSUAL_DEV( 0x12d1, 0x141F, 0x0000, 0x0000, |
741 | - "HUAWEI MOBILE", |
742 | - "Mass Storage", |
743 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
744 | - 0), |
745 | -UNUSUAL_DEV( 0x12d1, 0x1420, 0x0000, 0x0000, |
746 | - "HUAWEI MOBILE", |
747 | - "Mass Storage", |
748 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
749 | - 0), |
750 | -UNUSUAL_DEV( 0x12d1, 0x1421, 0x0000, 0x0000, |
751 | - "HUAWEI MOBILE", |
752 | - "Mass Storage", |
753 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
754 | - 0), |
755 | -UNUSUAL_DEV( 0x12d1, 0x1422, 0x0000, 0x0000, |
756 | - "HUAWEI MOBILE", |
757 | - "Mass Storage", |
758 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
759 | - 0), |
760 | -UNUSUAL_DEV( 0x12d1, 0x1423, 0x0000, 0x0000, |
761 | - "HUAWEI MOBILE", |
762 | - "Mass Storage", |
763 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
764 | - 0), |
765 | -UNUSUAL_DEV( 0x12d1, 0x1424, 0x0000, 0x0000, |
766 | - "HUAWEI MOBILE", |
767 | - "Mass Storage", |
768 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
769 | - 0), |
770 | -UNUSUAL_DEV( 0x12d1, 0x1425, 0x0000, 0x0000, |
771 | - "HUAWEI MOBILE", |
772 | - "Mass Storage", |
773 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
774 | - 0), |
775 | -UNUSUAL_DEV( 0x12d1, 0x1426, 0x0000, 0x0000, |
776 | - "HUAWEI MOBILE", |
777 | - "Mass Storage", |
778 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
779 | - 0), |
780 | -UNUSUAL_DEV( 0x12d1, 0x1427, 0x0000, 0x0000, |
781 | - "HUAWEI MOBILE", |
782 | - "Mass Storage", |
783 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
784 | - 0), |
785 | -UNUSUAL_DEV( 0x12d1, 0x1428, 0x0000, 0x0000, |
786 | - "HUAWEI MOBILE", |
787 | - "Mass Storage", |
788 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
789 | - 0), |
790 | -UNUSUAL_DEV( 0x12d1, 0x1429, 0x0000, 0x0000, |
791 | - "HUAWEI MOBILE", |
792 | - "Mass Storage", |
793 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
794 | - 0), |
795 | -UNUSUAL_DEV( 0x12d1, 0x142A, 0x0000, 0x0000, |
796 | - "HUAWEI MOBILE", |
797 | - "Mass Storage", |
798 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
799 | - 0), |
800 | -UNUSUAL_DEV( 0x12d1, 0x142B, 0x0000, 0x0000, |
801 | - "HUAWEI MOBILE", |
802 | - "Mass Storage", |
803 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
804 | - 0), |
805 | -UNUSUAL_DEV( 0x12d1, 0x142C, 0x0000, 0x0000, |
806 | - "HUAWEI MOBILE", |
807 | - "Mass Storage", |
808 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
809 | - 0), |
810 | -UNUSUAL_DEV( 0x12d1, 0x142D, 0x0000, 0x0000, |
811 | - "HUAWEI MOBILE", |
812 | - "Mass Storage", |
813 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
814 | - 0), |
815 | -UNUSUAL_DEV( 0x12d1, 0x142E, 0x0000, 0x0000, |
816 | - "HUAWEI MOBILE", |
817 | - "Mass Storage", |
818 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
819 | - 0), |
820 | -UNUSUAL_DEV( 0x12d1, 0x142F, 0x0000, 0x0000, |
821 | - "HUAWEI MOBILE", |
822 | - "Mass Storage", |
823 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
824 | - 0), |
825 | -UNUSUAL_DEV( 0x12d1, 0x1430, 0x0000, 0x0000, |
826 | - "HUAWEI MOBILE", |
827 | - "Mass Storage", |
828 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
829 | - 0), |
830 | -UNUSUAL_DEV( 0x12d1, 0x1431, 0x0000, 0x0000, |
831 | - "HUAWEI MOBILE", |
832 | - "Mass Storage", |
833 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
834 | - 0), |
835 | -UNUSUAL_DEV( 0x12d1, 0x1432, 0x0000, 0x0000, |
836 | - "HUAWEI MOBILE", |
837 | - "Mass Storage", |
838 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
839 | - 0), |
840 | -UNUSUAL_DEV( 0x12d1, 0x1433, 0x0000, 0x0000, |
841 | - "HUAWEI MOBILE", |
842 | - "Mass Storage", |
843 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
844 | - 0), |
845 | -UNUSUAL_DEV( 0x12d1, 0x1434, 0x0000, 0x0000, |
846 | - "HUAWEI MOBILE", |
847 | - "Mass Storage", |
848 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
849 | - 0), |
850 | -UNUSUAL_DEV( 0x12d1, 0x1435, 0x0000, 0x0000, |
851 | - "HUAWEI MOBILE", |
852 | - "Mass Storage", |
853 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
854 | - 0), |
855 | -UNUSUAL_DEV( 0x12d1, 0x1436, 0x0000, 0x0000, |
856 | - "HUAWEI MOBILE", |
857 | - "Mass Storage", |
858 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
859 | - 0), |
860 | -UNUSUAL_DEV( 0x12d1, 0x1437, 0x0000, 0x0000, |
861 | - "HUAWEI MOBILE", |
862 | - "Mass Storage", |
863 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
864 | - 0), |
865 | -UNUSUAL_DEV( 0x12d1, 0x1438, 0x0000, 0x0000, |
866 | - "HUAWEI MOBILE", |
867 | - "Mass Storage", |
868 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
869 | - 0), |
870 | -UNUSUAL_DEV( 0x12d1, 0x1439, 0x0000, 0x0000, |
871 | - "HUAWEI MOBILE", |
872 | - "Mass Storage", |
873 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
874 | - 0), |
875 | -UNUSUAL_DEV( 0x12d1, 0x143A, 0x0000, 0x0000, |
876 | - "HUAWEI MOBILE", |
877 | - "Mass Storage", |
878 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
879 | - 0), |
880 | -UNUSUAL_DEV( 0x12d1, 0x143B, 0x0000, 0x0000, |
881 | - "HUAWEI MOBILE", |
882 | - "Mass Storage", |
883 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
884 | - 0), |
885 | -UNUSUAL_DEV( 0x12d1, 0x143C, 0x0000, 0x0000, |
886 | - "HUAWEI MOBILE", |
887 | - "Mass Storage", |
888 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
889 | - 0), |
890 | -UNUSUAL_DEV( 0x12d1, 0x143D, 0x0000, 0x0000, |
891 | - "HUAWEI MOBILE", |
892 | - "Mass Storage", |
893 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
894 | - 0), |
895 | -UNUSUAL_DEV( 0x12d1, 0x143E, 0x0000, 0x0000, |
896 | - "HUAWEI MOBILE", |
897 | - "Mass Storage", |
898 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
899 | - 0), |
900 | -UNUSUAL_DEV( 0x12d1, 0x143F, 0x0000, 0x0000, |
901 | - "HUAWEI MOBILE", |
902 | - "Mass Storage", |
903 | - USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
904 | + USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_init, |
905 | 0), |
906 | |
907 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ |
908 | diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c |
909 | index 2653e73..e73cf56 100644 |
910 | --- a/drivers/usb/storage/usb.c |
911 | +++ b/drivers/usb/storage/usb.c |
912 | @@ -120,6 +120,17 @@ MODULE_PARM_DESC(quirks, "supplemental list of device IDs and their quirks"); |
913 | .useTransport = use_transport, \ |
914 | } |
915 | |
916 | +#define UNUSUAL_VENDOR_INTF(idVendor, cl, sc, pr, \ |
917 | + vendor_name, product_name, use_protocol, use_transport, \ |
918 | + init_function, Flags) \ |
919 | +{ \ |
920 | + .vendorName = vendor_name, \ |
921 | + .productName = product_name, \ |
922 | + .useProtocol = use_protocol, \ |
923 | + .useTransport = use_transport, \ |
924 | + .initFunction = init_function, \ |
925 | +} |
926 | + |
927 | static struct us_unusual_dev us_unusual_dev_list[] = { |
928 | # include "unusual_devs.h" |
929 | { } /* Terminating entry */ |
930 | @@ -131,6 +142,7 @@ static struct us_unusual_dev for_dynamic_ids = |
931 | #undef UNUSUAL_DEV |
932 | #undef COMPLIANT_DEV |
933 | #undef USUAL_DEV |
934 | +#undef UNUSUAL_VENDOR_INTF |
935 | |
936 | #ifdef CONFIG_LOCKDEP |
937 | |
938 | diff --git a/drivers/usb/storage/usual-tables.c b/drivers/usb/storage/usual-tables.c |
939 | index b969279..a9b5f2e 100644 |
940 | --- a/drivers/usb/storage/usual-tables.c |
941 | +++ b/drivers/usb/storage/usual-tables.c |
942 | @@ -46,6 +46,20 @@ |
943 | { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \ |
944 | .driver_info = ((useType)<<24) } |
945 | |
946 | +/* Define the device is matched with Vendor ID and interface descriptors */ |
947 | +#define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \ |
948 | + vendorName, productName, useProtocol, useTransport, \ |
949 | + initFunction, flags) \ |
950 | +{ \ |
951 | + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ |
952 | + | USB_DEVICE_ID_MATCH_VENDOR, \ |
953 | + .idVendor = (id_vendor), \ |
954 | + .bInterfaceClass = (cl), \ |
955 | + .bInterfaceSubClass = (sc), \ |
956 | + .bInterfaceProtocol = (pr), \ |
957 | + .driver_info = (flags) \ |
958 | +} |
959 | + |
960 | struct usb_device_id usb_storage_usb_ids[] = { |
961 | # include "unusual_devs.h" |
962 | { } /* Terminating entry */ |
963 | @@ -57,6 +71,7 @@ MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids); |
964 | #undef UNUSUAL_DEV |
965 | #undef COMPLIANT_DEV |
966 | #undef USUAL_DEV |
967 | +#undef UNUSUAL_VENDOR_INTF |
968 | |
969 | |
970 | /* |
971 | diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c |
972 | index 6fe98ed..3729493 100644 |
973 | --- a/fs/nilfs2/ioctl.c |
974 | +++ b/fs/nilfs2/ioctl.c |
975 | @@ -666,8 +666,11 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, |
976 | if (ret < 0) |
977 | printk(KERN_ERR "NILFS: GC failed during preparation: " |
978 | "cannot read source blocks: err=%d\n", ret); |
979 | - else |
980 | + else { |
981 | + if (nilfs_sb_need_update(nilfs)) |
982 | + set_nilfs_discontinued(nilfs); |
983 | ret = nilfs_clean_segments(inode->i_sb, argv, kbufs); |
984 | + } |
985 | |
986 | nilfs_remove_all_gcinodes(nilfs); |
987 | clear_nilfs_gc_running(nilfs); |
988 | diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h |
989 | index af21f31..091fdb7 100644 |
990 | --- a/include/linux/usb/ch9.h |
991 | +++ b/include/linux/usb/ch9.h |
992 | @@ -150,6 +150,12 @@ |
993 | #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0)) |
994 | #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1)) |
995 | |
996 | +/* |
997 | + * Interface status, Figure 9-5 USB 3.0 spec |
998 | + */ |
999 | +#define USB_INTRF_STAT_FUNC_RW_CAP 1 |
1000 | +#define USB_INTRF_STAT_FUNC_RW 2 |
1001 | + |
1002 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ |
1003 | |
1004 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ |
1005 | diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c |
1006 | index 44af55e..ead0336 100644 |
1007 | --- a/kernel/sched/rt.c |
1008 | +++ b/kernel/sched/rt.c |
1009 | @@ -560,7 +560,7 @@ static inline struct rt_bandwidth *sched_rt_bandwidth(struct rt_rq *rt_rq) |
1010 | static int do_balance_runtime(struct rt_rq *rt_rq) |
1011 | { |
1012 | struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); |
1013 | - struct root_domain *rd = cpu_rq(smp_processor_id())->rd; |
1014 | + struct root_domain *rd = rq_of_rt_rq(rt_rq)->rd; |
1015 | int i, weight, more = 0; |
1016 | u64 rt_period; |
1017 | |
1018 | diff --git a/lib/digsig.c b/lib/digsig.c |
1019 | index 8c0e629..dc2be7e 100644 |
1020 | --- a/lib/digsig.c |
1021 | +++ b/lib/digsig.c |
1022 | @@ -162,6 +162,8 @@ static int digsig_verify_rsa(struct key *key, |
1023 | memset(out1, 0, head); |
1024 | memcpy(out1 + head, p, l); |
1025 | |
1026 | + kfree(p); |
1027 | + |
1028 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); |
1029 | if (err) |
1030 | goto err; |