Annotation of /trunk/kernel-lts/patches-3.4/0129-3.4.30-all-fixes.patch
Parent Directory | Revision Log
Revision 2083 -
(hide annotations)
(download)
Wed Feb 20 10:54:38 2013 UTC (11 years, 7 months ago) by niro
File size: 35863 byte(s)
Wed Feb 20 10:54:38 2013 UTC (11 years, 7 months ago) by niro
File size: 35863 byte(s)
-linux-3.4.30
1 | niro | 2083 | 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; |